본문 바로가기
Back-End/Java

컬렉션 프레임웍

by 달의 조각 2021. 12. 30.
이 글은 남궁성 님의 Java의 정석 책을 바탕으로 정리한 글입니다.

 

인터페이스 인터페이스 특징
Collection List 순서 유지 O, 중복 O
구현 클래스: ArrayList, LinkedList, Stack, Vector
Set 순서 유지 X, 중복 X
HashSet, TreeSet
  Map 키와 값의 쌍으로 이루어진 데이터 집합
순서 유지 X, 키: 중복 X, 값: 중복 O
HashMap, TreeMap, Hagtabel, Poperties

※ Collection: 인터페이스, Collections: 클래스

 


 

ArrayList

 

  • Object 배열을 이용해서 데이터를 순차적 저장
  • 공간이 없으면 새로운 배열을 생성해서 복사한 후 저장
  • 객체를 인덱스로 관리
  • 반복문을 통해 요소 삭제 시, 빈 공간을 채우기 위해 자리 이동이 발생하므로 뒤에서부터 삭제해야 올바른 결과를 얻을 수 있다
  • 객체 삭제와 삽입이 빈번할 경우, LinkedList를 사용하기!
메서드 설명
ArrayList() 크기가 10인 리스트 생성
ArrayList(Colloection c) 주어진 컬렉션이 저장된 리스트 생성
boolean add(Object o) 마지막 위치에 객체 추가
void add(int index, Object element) 지정 위치에 객체 저장
Object set(int index, Object element) 주어진 위치에 객체 저장
Object get(int index) 주어진 위치에 저장된 객체 반환
Object remove(int index) 지정 위치의 객체 제거
void clear()  
int indexOf(Object o)
int lastIndexOf(Object o)
순방향 / 역방향으로 객체 위치 탐색
List subList(int fromIndex, int toIndex) from ~ to

 

 

LinkedList

 

배열의 단점(크기 변경 불가, 추가와 삭제 비효율적)을 보완, 참조의 연결로 구성되어서 속도가 빠르다

더블 링크드 리스트: 링크드 리스트의 단점(이전 요소의 접근 어려움)을 보완
더블 써큘러 링크드 리스트: 첫 번째 요소 - 마지막 요소 연결

 

 


 

 

ArrayList vs. LinkedList

 

ArrayList

· 데이터를 순차적 추가, 삭제할 때

순차적 삭제: 0번 인덱스부터
순차적 삭제: 마지막 인덱스부터 (내부적으로 단순히 null로 바꿈)

· 데이터를 검색하는(읽는) 경우

인덱스 n인 요소의 주소값(배열의 주소 + n * 데이터 타입의 크기)으로 접근하므로 빠르다

 

LinkedList

· 중간에 데이터 추가, 삭제 시

 

 

Stack과 Queue

 

Stack: LIFO, ArrayList
Queue: FIFO, LinkedList, 인터페이스라 객체 생성 불가

Stack st = new Stack();
Queue q = new LinkedList();

//push, pop
//offer, poll
메서드 설명
Object peek() Stack이나 Queue에서 맨 위의 객체 반환
Object push(Object item) Stack에 객체 저장
Object pop() Stack에서 객체 꺼냄, 비어 있으면 예외 발생
boolean ofter(Object o) Queue에 객체 저장
Object poll() Queue에서 객체 꺼냄, 비어 있으면 null

 

 


 

 

Iterator

 

 

Collection 인터페이스의 iterator()를 호출하면 Iterator 타입 인스턴스가 반환

컬렉션에 저장된 요소 읽기, 이와 같이 표준화하면 재사용성 극대화
1회성이므로 사용 후 다시 얻어 와야 한다

List 인터페이스 기반에서 이전 요소를 불러 올 일이 있다면 양방향인 ListIterator를 사용하자

메서드 특징
boolean hasNext() 읽을 요소가 있는지 확인
Object next() 다음 요소 읽기
remove()  
Collection c = new ArrayList();
Iterator it = c.iterator();

while (it.hasNext()) {
	System.out.println(it.next());
}

 


 

Comparator와 Comparable

 

Comparator: 기본 정렬 기준 구현
Comparable: 다른 기준으로 정렬하고 싶을 때

 

 


 

HashSet

 

 

순서 유지 X, 중복 허용 X
순서 유지 O, 중복 허용 X : LinkedHashSet

String인스턴스와 Integer인스턴스는 서로 다른 객체이므로 중복으로 간주하지 않는다

add 메서드는 저장할 객체의 equals()와 hashCode()를 호출한다(extends Object)
객체 중복을 정확히 검색하려면 equals()와 hashCode()가 오버라이딩 되어 있어야 한다

메서드 설명
boolean add(Object o) 새로운 객체 저장
void clear() 모든 객체 삭제
boolean remove(Object o) 지정 객체 삭제
boolean retainAll(Collection c) 조건부 삭제

 


 

TreeSet

 

이진 검색 트리: 범위 탐색과 정렬에 유리
왼쪽: 부모보다 작은 값, 오른쪽: 부모보다 큰 값

1. 데이터가 많아질수록 데이터 추가, 삭제에 시간이 더 걸린다 (root부터 비교해야 하므로)
2. 모든 노드가 최대 2개의 하위 노드를 가짐 - LinkedList의 변형
3. 사전순 정렬

 

메서드 설명
boolean add(Object o) 새로운 객체 저장
Object first() 정렬된 순서에서 첫 번째 객체 반환
Object last()  
Object higher(Object o) 지정 객체보다 큰 값을 가진 객체 중
가까운 값의 객체
SortedSet headSet(Object toElement) 지정 객체보다 작은 값의 객체 반환
SortedSet subSet(Object from, Object to) 범위 검색의 결과 반환 (to는 포함 X)
package Collection;

import java.util.TreeSet;

public class TreeSetExample {
    public static void main(String[] args) {

        TreeSet<String> workers = new TreeSet<>();

        workers.add("Lee Java");
        workers.add("Park Hacker");
        workers.add("Kim Coding");

        System.out.println(workers); //[Kim Coding, Lee Java, Park Hacker]
        System.out.println(workers.first()); //Kim Coding
        System.out.println(workers.last()); //Park Hacker
        System.out.println(workers.higher("Lee")); //Lee Java
        System.out.println(workers.subSet("Kim", "Park")); //[Kim Coding, Lee Java]
    }
}

 


 

HashMap

 

순서 유지 X, 중복(키 X, 값 O)
순서 유지 O : LinkedHashMap

해싱 기법으로 데이터를 저장, 데이터가 많아도 검색이 빠르다

직접 iterator()를 호출할 수 없으므로 keySet()이나 entrySet()을 이용한다

 

메서드 설명
Object put(Object key, Object value) 저장
boolean ContainKet(Object key)  
Object remove(Object key)  
Object get(Object key)  
Set entrySet() 키, 값의 형태를 Set에 저장
Set ketSet()  
Collection values()  

 

 

 

HashTable

 

HashMap과는 스레드 차이

'Back-End > Java' 카테고리의 다른 글

조건문과 반복문 문제 풀이  (0) 2022.07.05
지네릭스, 열거형, 애너테이션  (0) 2022.02.21
예외 처리(exception handling)  (0) 2021.12.26
객체지향 프로그래밍 Ⅱ  (0) 2021.12.16
객체지향 프로그래밍 Ⅰ  (0) 2021.12.02

댓글