순서를 보장하지 않는다는 말은 즉, 정렬되지 않는다는 것을 의미합니다. 그 이유는 HashMap의 경우 기본적으로 key값이 객체의 hashCode() 메소드의 리턴 값을 기반으로 관리하기 때문에 HashMap으로 관리되는 데이터 전체를 출력했을 때는 순서가 뒤섞여서 출력됨을 볼 수 있습니다.
따라서, 해시 함수를 사용하기 때문에 HashMap의 탐색 시간복잡도는 O(1) 입니다.
Map<String,String>map=newHashMap<>();map.put("apple","red");map.put("banana","yellow");map.put("melon","green");for(Map.Entry<String,String>data:map.entrySet()){System.out.println(data.getKey()+""+data.getValue());}/*Result
banana yellow
apple red
melon green
*/
HashTable
HashTable은 동기화(Synchronization) 지원합니다(동기).
Multi Thread 환경에서 사용
Hashtable은 동기화 처리라는 비용때문에 HashMap에 비해 속도가 느립니다.
key와 value에 null이 허용되지 않습니다.
HashTable은 객체를 저장하거나 불러올때 key가 hashCode 메소드와 equals 메소드를 사용하기 때문에 null을 불허합니다.
TreeMap
RedBlack Tree(이진검색트리)의 형태로 키와 값의 쌍으로 이루어진 데이터를 저장합니다.
정렬된 순서로 키, 값 쌍을 저장하므로 빠른 검색이 가능합니다.
저장시 key값을 정렬(사전순, 오름차순)을 하기 때문에 저장시간이 다소 오래걸립니다.
정렬 기준: 숫자 > 알파벳 대문자 > 알파벳 소문자 > 한글
key값에 대한 Compartor 구현으로 정렬 순서를 바꿀수 있습니다.
Map<String,String>map=newTreeMap<>();map.put("apple","red");map.put("banana","yellow");map.put("melon","green");for(Map.Entry<String,String>data:map.entrySet()){System.out.println(data.getKey()+""+data.getValue());}/*Result
apple red
banana yellow
melon green
*/
LinkedHashMap
LinkedHashMap에 저장되는 각 항목은 Map.Entry 클래스를 구현한 Node 클래스로 내부에 before, after 멤버를 갖는 연결 리스트 구조를 가지고 있습니다.
LinkedHashMap으로 구현된 Map은 데이터의 ‘입력된 순서’ 를 기억합니다.
기본적으로 HashMap을 상속받아 HashMap과 매우 흡사합니다.
데이터 추가/제거: O(1)
데이터 조회: O(1)
Map에 있는 엔트리들의 연결 리스트가 유지되므로 입력한 순서대로 반복 가능합니다.
Map<String,String>map=newLinkedHashMap<>();map.put("c","1");map.put("a","2");map.put("b","3");map.put("m","4");for(Map.Entry<String,String>data:map.entrySet()){System.out.println(data.getKey()+""+data.getValue());}/*Result
c 1
a 2
b 3
m 4
*/