본문 바로가기

Computer/JAVA

HashTable vs HashMap

# 이 글은 싸이월드 블로그에 내가 작성했던 글을 옮겨온 글이다. #

 

 

기본적인 동작은 HashTable이나 HashMap은 같습니다.

즉 Key object - Value object 를 쌍으로 저장하여 seek타임을 줄이기 위해 hash값을 이용합니다.

 

Hashtable

Hashtable 은 키나 값에 Null을 허용하지 않습니다. 또한 Object에 정의된 hashCode()와 equals()메소드를 재정의하는 객체들만 저장할 수 있습니다.

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

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

 

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

다음 두가지 방식으로 HashTable 내용을 출력합니다.

 

Hashtable hashtable = new Hashtable();

hashtable.put("jakarta", "project");

hashtable.put("apache", "tomcat");

Enumertaion keys = hashtable.keys();

while(keys.hasMoreElements()) {

key = (String)keys.nextElement();

System.out.println(hashtable.get(key));

}

 

혹은

Set set = hashtable.keySet();

Iterator keys = set.interator();

while(keys.hasNext()) {

key = (String)keys.next();

System.out.println(hashtable.get(key));

}

 

HashMap

HashMap은 키나 값에 Null을 허용 합니다.

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

 

HashMap hashmap = new HashMap();

hashmap.put("jakarta", "project");

hashmap.put("apache", "tomcat");

Set set = hashmap.entrySet();

Iterator keys = set.iterator();

while (keys.hasNext()) {

key = (String)keys.next();

System.out.println(hashmap.get(key));

}

 

또한 Hashtable은 thread safe 한 객체이지만 HashMap은 그렇지 못해 unsynchronized 합니다. 이말은 즉 멀티 쓰레드 환경이 아니면 HashMap을 쓰면 속도가 빠르다는 말입니다.

굳이 동기화 하자면 다음과 같이 사용해야 겠지요

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

 

간단히 정리하자면

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

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