2020-8-21 Java Map

HashTable HashMap ConcurrentHashMap

  • 기본적으로 Map<K, V>를 구현한 구현체들이다.

HashTable

public synchronized V get(Object key) {
  Entry<?,?> tab[] = table;
  int hash = key.hashCode();
  int index = (hash & 0x7FFFFFFF) % tab.length;
  for (Entry<?,?> e = tab[index] ; e != null ; e = e.next) {
    if ((e.hash == hash) && e.key.equals(key)) {
      return (V)e.value;
    }
  }
  return null;
}
  • 메서드에 기본적으로 synchronized가 붙어있어서 멀티쓰레드 환경에서 동기화를 안해도된다.
  • key, value에 null허용하지 않는다.

HashMap

  • Key, value에 null값이 허용된다. 하지만 thread-safe하지 않다.
  • 메서드에 synchronized를 붙여도 되지만 Collectinons.synchronizedMap을 이용해서 동기화 처리후 사용해라.

Concurrent HashMap

  • key, value에 null허용 안된다.
  • putIfAbsent라는 메서드로 absent에 대한 부분을 체크한다.
  • put메서드를 호출하면 내부적으로 putVal을 호출한다. putVal은 HashMap에서도 똑같다. 메서드레벨에서 synchronized가 붙어있진 않지만 내부적으로 Node를 추가할때 synchronized가 붙어있다.
Written on August 21, 2020