JAVA 껄렉션

자바에는 컬렉션 프레임워크란게 있다. 이것이 자바다를 공부하며 요약했다.

특징

인터페이스분류특징구현 클래스
CollectionList순서를 유지, 중복저장 가능ArrayList, Vector, LinkedList
Set순서를 유지하지않음, 중복저장 불가HashSet, TreeSet
  • 객체를 일렬로 늘어놓은 구조
  • 객체를 인덱스로 관리
  • 인덱스로 객체를 검색, 삭제

1. List

기능메소드설명
객체 추가boolean add(E e)주어진 객체를 맨 끝에 추가
void add(index, E element)주어진 인덱스에 객체를 추가
E set(int index, E element)주어진 인덱스에 저장된 객체를 주어진 객체로 교체
객체 검색boolean contains(Object o)주어진 객체가 저장되어 있는지 여부
E get(int index)주어진 인덱스에 저장된 객체를 리턴
boolean isEmpty()컬렉션이 비어있는지 조사
int size()저장되어 있는 전체 객체 수를 리턴
객체 삭제void clear()저장된 모든 객체를 삭제
E remove(int index)주어진 인덱스에 저장된 객체를 삭제
boolean remove(Object o)주어진 객체를 삭제

ArrayList

Lits<T> list = new ArrayList<T>();

List 인터페이스의 구현 클래스, 객체를 인덱스로 관리한다. 배열과 달리 저장 용량을 초과한 객체들이 들어오면 자동으로 저장용량이 늘어난다.

모든 종류의 객체를 저장 할 수 있다는 장점을 가지고 있다. 그러나 실행 성능에 좋지 않은 영향을 끼치므로 일반적으로 컬렉션에는 단일 종류의 객체들만 저장한다. (지네릭)

빈번한 객체 삭제와 삽입이 일어나는 곳에서는 ArrayList를 사용하는 것은 바람직 하지 않다. 이런 경우라면 LinkedList를 사용하는 것이 좋다. 그러나 인덱스 검색 혹은 마지막에 객체를 추가하는 경우는 ArrayList가 더 성능이 좋다.

List<T> list = Arrays.asList(T... a);

한편, 고정된 객체들로 구성된 List를 생성할 때는 Arrays.asList(T... a) 메소드를 사용한다.

Vector

List<T> list = new Vector<T>();

ArrayList와 동일한 구조이나 동기화(Synchronized)된 메소드로 구성되어있기 때문에 멀티스레득가 동시에 이 메소드를 실행 할 수 없고 하나의 스레드가 실행을 완료해야만 다른 스레드를 실행 할 수 있다.

LinkedList

List<T> list = new LinkedList<T>();

인접 참조를 링크해서 체인처럼 관리한다. LinkedList에서는 특정 인덱스의 객체를 제거하면 앞 뒤 링크만 변경되고 나머지 링크는 변경 되지 않는다. 그래서 빈번한 객체 삭제와 삽입이 일어나는 곳에서는 LinkedList가 성능이 더 좋은 것이다.

2. Set

기능메소드설명
객체 추가boolean add(E e)주어진 객체를 저장, 객체가 성공적으로 저장되면 true를 리턴하고 중복 객체면 false를 리턴
객체 검색boolean contains(Object o)주어진 객체가 저장되어 있는지 여부
Iterator iterator()저장된 객체를 한 번씩 가져오는 반복자 리턴
boolean isEmpty()컬렉션이 비어있는지 조사
int size()저장되어 있는 전체 객체 수를 리턴
객체 삭제void clear()저장된 모든 객체를 삭제
boolean remove(Object o)주어진 객체를 삭제

Set 컬렉션은 저장 순서가 유지 되지 않는다. 또한 객체를 중복 저장하지 않고 하나의 null만 저장 할 수 있다.

Iterator

리턴 타입메소드설명
booleanhasNext()가져올 객체가 있으면 true를 리턴하고 없으면 false를 리턴한다.
Enext()컬렉션에서 하나의 객체를 가져온다.
voidremove()Set 컬렉션에서 객체를 제거한다.

전체 객체를 대상으로 한번씩 반복하는 반복자 인터페이스이다.

Set<T> s = ...;

Iterator<T> i = s.iterator();

while(i.hasNext()) {
    // 객체를 하나씩 가져옴
    T t = i.next();
}

다음과 같이 사용하면 된다.

HashSet

Set 인터페이스의 구현 클래스이다. HashSet은 객체를 저장하기 전에 먼저 객체의 hashCode() 메소드를 호출해서 해시코드를 얻어낸다.

           같음                true
hashCode()  -->  equal() 리턴값 --> 동등 객체 --> 저장안함
     |                  |
   다름               false
     |                  |
      ------------> 다른객체 -------> 저장