면접 질문중 list, map, set의 차이점을 묻는 질문에 어버버한 경험을 상기하며 정리한다.
'리스트는 순서가 있고 중복이 허용되며 가변적인 크기를 가진 자료구조이다'
'내부적으로 데이터를 배열에서 관리하며 추가, 삭제를 위해 임시 배열을 생성해 데이터를 복사한다'
Array의 경우 길이가 고정되어 변경이 불가하다. ArrayList의 경우 Array를 이용해 만든 List형 자료구조이며 Array와 다르게 길이를 할당하지 않지만 데이터 추가시 배열의 최대 크기가 넘으면 2배 크기의 배열을 만들고 원본을 복사하여 재생성 한다.
Default 길이는 10이다.
ArrayList는 배열을 이용하여 리스트를 구현한 것이다.
다만 배열을 가변적으로 사용하며 리스트가 가지는 특성인 저장순서 유지와 중복 허용의 특징을 가지고 있다.
ArrayList는 클래스이기 때문에 배열을 추가, 삭제 할 수 있는 기능을 함께 포함하고 있다.
'데이터를 저장하는 각 노드가 이전 노드와 다음 노드의 상태를 가지고 있다'
' Key와 Value의 한쌍으로 이루어진 데이터의 집합'
HashMap은 내부적으로 배열을 만들어 관리하며 key 값으로 넘겨준 객체의 해시 코드를 계산하여 배열의 접근 인덱스로 사용한다.
TreeMap은 Key-Value 쌍을 내부적으로 RedBlack Tree로 저장하여 관리한다. TreeMap의 시간 복잡도는 O(lon n)이다. 대신 정렬된 순서를 얻을 수 있다.
LinkedHashMap으로 구현된 Map은 데이터의 입력 순서를 기억한다. LinkedHashMap의 경우 O(1)의 시간 복잡도를 갖지만 Linked-List를 유지하기 위한 비용이 생길 수 있다.
' 순서가 보장되지 않는 데이터의 집합으로 중복된 데이터가 들어갈 수 없다'
HashSet은 객체들을 순서없이 저장하고 동일한 객체는 중복 저장하지 않는다. 객체를 저장하기 전에 객체의 hashcode()메소드를 호출해 해시값을 얻고, 이미 저장되어 있는 객체들의 해시코드와 비교한다.
HashSet과 마찬가지로 중복 저장하지 않지만 오름차순으로 데이터를 저장하고 관리한다. (Red-Black Tree를 사용한다.)
LinkedHashSet의 경우 HashSet과 동일하지만 입력된 순서를 저장하고 관리한다.