데이터의 저장 순서가 유지되고 중복을 허용한다.
기존의 Vector을 구현한 것이다.
내부적으로 Object 배열을 이용해서 데이터를 순차적으로 저장한다.
생성자를 통해 배열의 크기를 설정할 수 있다.
장점
배열의 크기가 충분할때, 순차적으로 저장하거나 맨 뒤에서부터 순차적으로 삭제할때 빠르다.
임의의 요소에 접근할때 가장 빠르다.
단점
크기를 변경할 수 없기 때문에 메모리 낭비가 발생 할 수 있다.
비순차적인 데이터의 추가 또는 삭제에 시간이 많이 걸린다.
만약 배열의 중간에 데이터를 추가하려면, 빈자리를 만들기 위해 다른 데이터들을 복사해서 이동해야한다.
Java 의 LinkedList 는 더블 링크드 리스트형태로 구현돼있다.
불연속적으로 존재하는 데이터를 서로 연결한 형태로 구성돼있다.
각 node들은 자신과 연결된 이전 요소와 다음 요소에 대한 참조와 데이터로 구성돼있다.
class Node{
Node next;
Node previous;
Object obj;
}
장점
단점
순차적으로 추가/삭제하는 경우에는 상대적으로 느리다.
요소에 접근하는 속도는 느리다. 왜냐하면 각 요소들이 불연속적으로 위치하기 때문에, 요소의 처음부터 n까지 차례대로 따라가야 한다.
스택은 후입선출이다. LIFO (Last In First Out) 구조다.
자바의 Stack 클래스는 컬렉션 프레임웍 이전부터 존재했다.
그래서 ArrayList 가 아닌 Vector로부터 상속받아 구현했다.
큐는 선입선출이다. FIFO (First In First Out) 구조다.
구현체
Iterator, ListIterator, Enumeration 은 모두 컬렉션에 저장된 요소를 접근하는데 사용되는 인터페이스이다.
Enumeration은 Iterator 의 구버전이고,
ListIterator 는 Iterator 의 기능을 향상시킨 것이다.
Collection 인터페이스에 정의된 메서드이므로 Collection 인터페이스의 자손인 List와 Set에도 포함되어 있다.
단방향으로만 이동할 수 있다. ( iterator.next() )
next() 를 호출하고 remove()를 호출해야 한다.
Iterator는 단방향으로만 이동할 수 있는 데 반해 ListIterator는 양방향으로의 이동이 가능하다.
다만 List를 구현한 컬렉션에서만 사용할 수 있다.
next() 를 호출하고 remove()를 호출해야 한다.
배열을 다루는데 유용한 메서드가 정의되어 있다.
Arrays 클래스의 메서드
copyOf(), copyOfRange()
copyOf()는 배열 전체를,
copyOfRange()는 배열의 일부를 복사해 새로운 배열을 만들어 반환한다.
fill(), setAll()
fill()은 배열의 모든 요소를 지정된 값으로 채운다.
setAll()은 배열을 채우는데 사용할 함수형 인터페이스를 매개변수로 받는다.
sort(), binarySearch()
sort() 는 배열을 정렬할때,
binarySearch() 는 정렬된 배열의 요소를 검색하는데 사용한다.
equals(), toString()
equals() 는 요소를 비교한다.
toString()은 배열을 문자열로 바꿔준다.
asList(Objet.. a)
배열을 List에 담아서 반환한다.
asList()가 반환한 List의 크기를 변경할 수 없다.
(UnsupportedOperationException 발생함)
parallelXXX(), spliterator(), stream()
parallel로 시작하는 메서드들은 보다 빠른 결과를 얻기 위해 여러 쓰레드가 작업을 나누어 처리한다.
spliterator()는 여러 쓰레드가 처리할 수 있게 하나의 작업을 여러 작업으로 나누는 Spliterator를 반환한다.
stream()은 컬렉션을 스트림으로 변환한다.
이 둘은 모두 인터페이스로 컬렉션을 정렬하는데 필요한 메서드를 정의하고 있다.
Comparable을 구현하고 있는 클래스들은 같은 타입의 인스턴스끼리 서로 비교할 수 있는 클래스들, 주로 Integer 와 같은 wrapper클래스와 String, Date, File과 같은 것들이다.
기본적으로 오름차순으로 정렬되도록 구현되어있다.
기본 정렬기준외에 다른 기준으로 정렬하고자 할때 사용한다.
중복을 허용하지 않는다.
저장 순서를 유지하지 않는다.
저장 순서를 유지하고자 한다면 LinkedHashSet을 사용해야 한다.
이진 검색 트리라는 자료구조의 형태로 데이터를 저장한다.
이진 검색 트리의 성능을 향상시킨 Red-Black tree로 구현되어있다.
저장 순서를 유지하지 않는다.
항상 오름차순으로 정렬된다.
이진 검색 트리
모든 노드는 최대 두개의 자식 노드만 갖는다.
왼쪽 자식노드의 값은 부모노드의 값보다 작고 오른쪽 자식 노드의 값은 부모노드의 값보다 커야한다.
노드의 추가와 삭제에 시간이 걸린다.
검색 ( 범위검색 ) 과 정렬에 유리하다.
중복된 값을 저장하지 못한다.
키와 값을 쌍으로 갖는 자료구조다.
해싱을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어 뛰어난 성능을 보인다.
Entry라는 내부 클래스를 정의하고, 다시 Entry 타입의 배열을 선언한다.
Entry[] table;
class Entry{
Object key;
Object value;
}
키는 유일해야하지만 값을 중복을 허용한다.
장점
단점
Hashing
배열과 링크드리스트의 조합으로 된 자료구조를 사용한다.
저장할 데이터의 키를 해시함수에 넣으면 배열의 한 요소를 얻고, 다시 그곳에 연결되어있는 링크드 리스트에 저장하게 된다.
이진 검색 트리의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장한다.
검색과 정렬에 적합한 컬렉션 클래스이다.
대부분의 경우 HashMap이 TreeMap보다 검색 성능이 뛰어나다.
장점
단점
컬렉션과 관련된 메서드를 제공한다.
fill(), copy(), sort(), binarySearch()를 포함한다.
Vector 와 Hashtable과 같은 구버전(JDK1.2 이전) 의 클래스들은 자체적으로 동기화 처리가 되어 있다.
하지만 불필요한 경우도 있어서 새로 추가된 ArrayList와 HashMap과 같은 컬렉션은 동기화를 자체적으로 처리하지 않고 필요한 경우에만 java.util.Collections 클래스의 동기화 메서드를 이용해서 동기화 처리가 가능하도록 변경하였다.
동기화 메서드들은 synchronized 가 메서드 이름 앞에 붙는다.
컬렉션을 읽기전용으로 만들 수 있는 메서드들을 제공한다.
메서드 이름 앞에 unmodifiable 이 붙는다.
단 하나의 객체만을 저장하는 싱글톤 컬렉션을 만들 수 있는 메서드들을 제공한다.
메서드 이름 앞에 singleton 이 붙는다.