안녕하세요.
java collection framework를 자주 사용하는데 어느순간 ??? 하고 갑자기 안떠오를때가 있습니다.
개발하다 특별한일이 없으면 ArrayList만으로도 충분히 처리가 가능한 경우가 많다보니 그런것 같습니다.
기본적이면서 필수, 그런데 깜빡깜빡하는 자바의 콜렉션 클래스집합들에 대해 간략히 정리해보았습니다.
arraylist는 사이즈 변경이 가능한 배열 구현체입니다. 특정 순서 접근이 필요없고 많은 수의 데이터를 저장해야할 때 선택할 수 있습니다.
예를 들어 판매자의 상품목록을 모두 가져와 순차 처리를 할때 사용할 수 있습니다.
LinkedList는 노드가 데이터를 갖고 이전 노드와 다음노드 주소 값 2개를 갖고 있는 doubly-linked list입니다. 각 node는 데이터와 포인터를 갖고 한 줄로 연결되어 LinkedList라고 부릅니다.
ArrayList 처럼 인덱스로 요소에 접근하지만 배열이 아니기 때문에 특정 요소에 대해 접근시 성능이 좋지 않습니다.
대신 데이터의 중간 삽입, 삭제가 빈번할 경우 빠른 성능을 보장하며 큐 (offer, poll)를 구현할때 사용합니다.
확장 가능한 배열 구현체입니다. ArrayList와 비슷하지만 항상 동기화가 되므로 (thread-safe) 이기 때문에 여러 스레드에서 동시에 접근하는 경우 선택할 수 있지만 항상 동기화가 되기 때문에 ArrayList보다는 성능이 느립니다.
LIFO (후입선출) 자료구조입니다. 목록중 가장 최근에 추가된 아이템에 접근하고자 할때 사용 합니다.
FIFO (선입선출) 데이터구조입니다. 아이템이 생성되고 순서대로 처리를 하고자 할때 사용 합니다.
(Key/Value)로 데이터를 저장하는 자료구조입니다.
Key값에 해시함수를 사용해 배열에 고유 index를 생성하며 이것으로 값을 저장하거나 검색합니다.
HashMap은 thread-safe하지 않으며 null을 허용합니다. 보조해시함수를 사용하기 때문에 hash collision 발생 확률이 낮습니다.
hashtable은 collection framework이 생기기 이전에 만들어졌고 이후에 hashMap 클래스가 구현되었습니다. 주어진 키 값을 이용해 빠르게 탐색을 해야하는 경우 hashMap을 사용 합니다.
SortedMap 구현체입니다. 숫자는 값, 문자는 유니코드로 오름차순 정렬이 일어납니다. 정렬된 상태로 데이터를 조회하는 경우 사용합니다.
Set은 중복 아이템을 허용하지 않는 컬렉션입니다. 고유한 아이템만 보관/처리하는 경우에 사용합니다.
SortedSet은 Set과 같지만 아이템을 정렬된 순서로(Comparable/Comparator interface) 유지 관리할 수 있습니다.
HashMap에 아이템을 저장하는 Set 인터페이스의 구현체입니다. 중복X, nullable의 특성을 갖고 있습니다. 순서와 상관없이 접근하고 고유한 아이템을 처리하고자 할 때 사용합니다.
SortedSet 인터페이스 구현체. 오름차순으로 순서가 보장됩니다. (creation time으로도 가능)
(add, remove, contains) operation에 대해 시간복잡도 log(n)을 보장 합니다.
TreeSet은 정렬된 순서로 저장하고 고유한 아이템을 찾아 처리하는 경우에 적합합니다.
아이템들을 doubly-linked list에 저장하는 Set 인터페이스의 구현체입니다. HashSet에서 순서를 보장하며 처리해야 할 때 사용합니다.
좋은 글이네요. 공유해주셔서 감사합니다.