HashMap
Hashtable의 새로운버전. 따라서 HashMap이 권장된다.
Map을 구현하기 때문에 Map의 특성을 갖는다. (저장순서 유지 X).
Hashing 하기때문에 검색에 있어 뛰어난 성능을 보인다.
HashMap 내부에 Entry(Key, Value로 이루어진 internal class)를 구현하고, 이 Entry를 HashMap의 배열로 갖는다.
map.entrySet()
로 K-V 쌍을 가져오거나,map.keySet()
,map,values()
를 통해 K-V를 각각 읽어 올 수 있다.한 key에 대응하는 value는 하나이다.
- 한 key에 복수에 데이터를 저장하는법: HashMap의 value로 HashMap을 다시 저장하면 된다. 꺼낼때도 반대로 꺼내오면 된다.
1 2 3 4 5 6 7 8 9 10 11 12 13
// 그룹에 전화번호 추가 static void addPhoneNo(String groupName, String name, String tel) { addGroup(groupName); HashMap group = (HashMap)phoneBook.get(groupName); group.put(tel, name); } // 그룹을 추가하기(초기에) static void addGroup(String name, String tel) { if(!phoneBook.containsKey(groupName)) { phoneBook.put(groupName, new HashMap()); } }
해싱
- 배열과 링크드리스트의 조합. 배열 하나에 하나의 bucket. 하나의 bucket은 링크드리스트
- 실제로 HashMap에서는 Object 클래스에 정의된
hashCode()
를 해시함수로 사용한다.- String의 경우 Object로부터 상속받은
hashCode()
를 사용하기때문에 같은 글자에 대해서는 같은 해시코드를 얻는다. 따라서,equals()
를 통해 같은 객체인지도 비교해 같은 객체인 것을 판별한다. -> hash 제약조건이 있는 이유
- String의 경우 Object로부터 상속받은
TreeMap
: Map에서 순차적으로 값을 저장하기 위해 쓰인다. 범위검색이나 정렬이 필요한 경우 사용한다.
- 일반적인 검색의 경우 HashMap이 TreeMap보다 뛰어나기 때문에 보통은 HashMap을 사용한다.
Reference)
자바의 정석 3판