Thursday, July 02, 2009

HashMap vs Hashtable

본적인 동작은 HashTable이나 HashMap은 같으나 아래와 같은 차이점이 존재한다.

 

Hashtable

 

Hashtable 은 키나 값에 Null을 허용.

 

Object에 정의된 hashCode()와 equals()메소드를 재정의하는 객체들만 저장.

 

다행히도 자바 내장 클래스들은 대부분 hashCode()구현되어 있다는 것을 아실겁니다.

 

특히 String 타입이 hashCode(), equals()메소드 두개 모두 구현되어 있지요.

 

Hashtable은 Map 클래스와 마찬가지로 반복자(interator)를 직접제공 하지 않습니다

 

아래와 같은 방식으로 Hashtable 내용을 출력.

 

Hashtable hashtable = new Hashtable();

hashtable.put("sample1", "sample value");

hashtable.put("sample2", "sample2 value");

 

Enumertaion keys = hashtable.keys();

while(keys.hasMoreElements()) {

   key = (String)keys.nextElement();

   System.out.println("value = " + hashtable.get(key));

}

 

또는

 

Set set = hashtable.keySet();

Iterator keys = set.interator();

while(keys.hasNext()) {

   key = (String)keys.next();

   System.out.println("value = " + hashtable.get(key));

}

 

HashMap

 

HashMap은 키나 값에 Null을 허용.

HashMap 출력방법은 다음 한가지 (Enumeration 지원 안함)

 

HashMap hashmap = new HashMap();

hashmap.put("sample1", "sample value");

hashmap.put("sample2", "sample2 value");

 

Set set = hashmap.entrySet();

Iterator keys = set.iterator();

while (keys.hasNext()) {

   key = (String)keys.next();

   System.out.println("value = " + hashmap.get(key));

}

 

또한 Hashtable은 thread safe 한 객체이지만 HashMap은 그렇지 못해 unsynchronized 하기

 

때문에 즉 멀티 쓰레드 환경이 아니면 HashMap을 쓰면 속도가 빠르다.

 

동기화 하자면 다음과 같이 동기화해서 사용해야 한다.

 

Map m = Collections.synchronizedMap(new HashMap(...));

 

리하면

 

HashMap이 HashTable에 비해 좀더 실용적으로 변한 형태라고 보면 되겠네요 ^^

 

일반적으로 쓴다면 HashMap을 사용하세요

 

동기화가 필요한경우(멀티스레드) Hashtable을 사용하세요

 

이건 참고 ^^

 

HashMap객체는 약 120바이트 정도의 메모리 용량을 사용하고,

 

Hashtable객체는 약 100바이트 정도의 메모리 용량을 사용합니다.

No comments: