Hashtable, HashMap, concurrenthashmap

위에 나열된 클래스들은 Map 인터페이스를 구현한 콜렉션입니다. 기본적으로 map 인터페이스를 구축한다면 <key,value> 구조를 가지게 됩니다

hashtable

hashtable 은 put,get 과 같은 주요 메소드에 synchronized 키워드가 선언되어 있습니다. 또한, key, value 에 null을 허용하지 않습니다.

hashmap

hashmap은 주요 메소드에 synchronized 키워드가 없습니다. 또한, hashtable과 다르게 key, value에 null을 입력할 수 있습니다.

ConncurrentHashMap

hashmap을 thread-safe 하도록 만든 클래스가 concurrenthashmap입니다. 하지만 hashmap과는 다르게 key value에 null을 허용하지않습니다. 또한 putIfAbsent라는 메소드를 가지고 있습니다.

package Post197;

import java.util.concurrent.ConcurrentHashMap;

public class ConcurrentHashMapBasic {

	public static void main(String[] args) {

		ConcurrentHashMap<String, Integer> chm = new ConcurrentHashMap<>();

		// 값 입력
		chm.put("key", 0);

		/*
		 * ConcurrentHashMap은 값에 null을 허용하지 않는다.
		 */
		try{
			chm.put("key1", null); // error!
		} catch( Exception e ){
			e.printStackTrace();
		}

		/*
		 * ConcurrentHashMap은 키값에 null을 허용하지 않는다.
		 */
		try{
			chm.put(null, 0); // error!
		} catch( Exception e ){
			e.printStackTrace();
		}

		/*
		 * putIfAbsent 메소드는 키값이 존재하면 기존의 값을 반환하고
		 * 없다면 입력한 값을 저장한 뒤 반환한다.
		 * 따라서 아래의 코드는 이미 key라는 값에 0이라는 값이 있으므로
		 * key 값은 0을 반환한다.
		 */
		chm.putIfAbsent("key", 1);

		/*
		 * 아래 코드는 key2의 값이 없기 때문에 -1을 저장하고 반환한다.
		 */
		chm.putIfAbsent("key2", -1);

		for( String s : chm.keySet() ){
			System.out.println(chm.get(s)); // print -1, 0
		}
	}
}

Common Methods

위의 세종류의 클래스들은 put, get 메소드 외에도 기본적인 메소드들을 구현하고 있습니다. 대표적인 몇가지의 메소들만 알아봅시다

  • clear()
    • 해당 콜렉션의 데이터를 초기화합니다
  • containsKey(key)
    • 해당 콜렉션에 입력받은 key를 가지고 있는지 체크합니다
  • containsValue(value)
    • 해당 콜렉션에 입력 받은 value 를 가지고 있는지 체크
  • remove(key)
    • 해당 콜렉션에 입력받은 key의 데이터(key도 포함)를 제거합니다
  • isEmpty()
    • 해당 콜렉션이 비어있는지 체크
  • size()
    • 해당 콜렉션의 엔트리 또는 세그먼트 사이즈를 반환합니다.