블로그를 이전하였습니다. 2023년 11월부터 https://bluemiv.github.io/에서 블로그를 운영하려고 합니다. 앞으로 해당 블로그의 댓글은 읽지 못할 수 도 있으니 양해바랍니다.
반응형
HashMap
과 Hashtable
모두 map
자료구조다.
- 사용 방법도 거의 동일하지만, 차이점이 있음
// HashMap
Map<Integer, String> map = new HashMap<>();
map.put(1, "one");
map.put(2, "two");
System.out.println(map.get(1)); // one
System.out.println(map.get(2)); // two
// Hashtable
Map<Integer, String> table = new Hashtable<>();
table.put(1, "one");
table.put(2, "two");
System.out.println(table.get(1)); // one
System.out.println(table.get(2)); // two
HashMap
HashMap
은 동기화를 지원하지 않는다.
- 단일스레드 환경에서 사용하기 좋은 자료구조
IDE의 구현부를 보면, 아래 Hashtable
과는 다르게 synchronized
키워드가 없음
// get method
public V get(Object key) {
Node<K,V> e;
return (e = getNode(hash(key), key)) == null ? null : e.value;
}
// put method
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
또, HashMap
은 key
값이나 value
값에 null
이 들어갈 수 있음
Map<Integer, String> map = new HashMap<>();
map.put(null, "null");
System.out.println(map.get(null)); // null
Hashtable
Hashtable
은 동기화를 지원하여, thread-safe
하다.
- 멀티스레드 환경에서 사용하기 좋은 자료구조
- 하지만, HashMap에 비해 느리다. (다른 스레드가 block되고 unblock 되는 대기 시간을 기다리기 때문)
IDE를 이용해 구현부를 보면 synchronized
키워드가 붙어있다.
// get method
public synchronized V get(Object key) {
// ... 중략 ...
}
// put method
public synchronized V put(K key, V value) {
// ... 중략 ...
}
또, Hashtable은 key값이나 value값에 null
이 들어갈 수없다.
Map<Integer, String> table = new Hashtable<>();
table.put(null, "null");
// Exception in thread "main" java.lang.NullPointerException
// at java.util.Hashtable.put(Hashtable.java:465)
// at Main.main(Main.java:10)
반응형
'Language > JAVA' 카테고리의 다른 글
Java - Collection과 Map의 종류(List, Set, Map) (4) | 2021.03.09 |
---|---|
Java - equals()와 hashCode()의 관계 (0) | 2021.03.07 |
Java - String Pool에 대해서 (0) | 2021.03.07 |
Java의 String과 StringBuilder, StringBuffer 비교 (0) | 2021.03.07 |
JVM GC 동작 순서와 GC 종류(Serial / Parallel / CMS / G1 GC ) (0) | 2021.03.07 |