크기가 고정된 배열과 달리,
ArrayList
는 저장 용량을 초과한 객체들이 들어오면 자동으로 저장용량이 늘어나게 된다.
검색작업은 ArrayList가 더 빠르지만, ArrayList의 경우 요소 추가/삭제 시 요소 뒤의 인덱스들이 모두 이동하기 때문에, 빈번한 객체 삭제와 삽입이 일어날 수 있는 상황에서는 ArrayList보다는 LinkedList를 사용하는 것이 좋다.
따라서 데이터의 잦은 변경이 예상된다면
LinkedList
를, 데이터의 개수가 변하지 않는다면ArrayList
를 사용하는 것이 좋다.
Set 인터페이스를 구현한 대표적인 클래스로는 HashSet
, TreeSet
이 있다.
TreeSet
은 이진 탐색 트리 형태로 데이터를 저장한다.
이진 탐색 트리
는 하나의 부모 노드가 최대 두 개의 자식 노드와 연결되는 이진 트리(Binary Tree)의 일종으로, 정렬과 검색에 특화된 자료 구조이고, 기본 정렬은 오름차순이다.
Comparator와 Comparable은 컬렉션을 정렬하기 위해 자바에서 제공하는 인터페이스이다.
Comparable
: 비교 대상(매개 변수)과 자기 자신을 비교하며, compareTo() 메서드를 사용해 객체를 정렬한다.
CompareTo()
는 두 객체가 같으면 0, 비교할 객체가 주어진 객체보다 작으면 음수, 크면 양수를 반환한다.
Comparator
: 매개 변수인 두 객체를 비교한다.
Comparator 인터페이스는 주로 기본 정렬 기준이 아닌 다른 기준으로 정렬하고 싶을 때 사용하며, 이때는 compare() 메소드를 오버라이딩한다.
Map 인터페이스를 구현한 클래스에는 HashMap, Hashtable, TreeMap, SortedMap 등이 있다.
HashMap
은 해시 함수를 통해 '키'와 '값'이 저장되는 위치를 결정하므로, 사용자는 그 위치를 알 수 없고, 삽입되는 순서와 위치 또한 관계가 없다.
키
로 사용할 객체는 hashCode()와 equals() 메서드를 재정의해서 동등 객체가 될 조건을 정해야 하는데, 동등 객체, 즉 동일한 키가 될 조건은 HashSet과 동일하다.hashCode()의 리턴값이 같아야 하고, equals() 메서드가 true를 리턴해야 한다.
주로 키 타입은 String을 많이 사용하는데, String은 hashcode()와 equals() 메서드가 재정의 되어 있다.
HashMap은 이름 그대로 해싱(Hashing)
을 사용하기 때문에 많은 양의 데이터를 검색하는 데 있어서 뛰어난 성능을 보인다.
키와 값의 타입은 기본 타입(byte, short, int, float, double, boolean, char)을 사용할 수 없고 클래스 및 인터페이스 타입만 가능하다.
또한, HashMap
은 키(key)와 값(value)에 null 값을 허용하지만, Hashtable
은 null 값을 허용하지 않는다.