본문 바로가기

JAVA

[JAVA] Hashtable, HashMap이란?

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을 사용하세요

HashMap 이나 Hashtable 이나 둘다 Map 인터페이스를 implements 하고있지만 프로그래밍 환경에 따라서 적절한 놈으로 골라써야 합니다.

java API 문서에 보면

The HashMap class is roughly equivalent to Hashtable, except that it is unsynchronized and permits nulls.

"간략히 말해서 HashMap 은 Hashtable과 같다, 다만 HashMap 이 unsynchronized 하고 null 값을 허용할 뿐이다."

그러면 Hashtable 에는 null 값이 들어갈 수 없다는건가? 이건 잘 모르겠지만 Hashtable 만들어놓고 null 키값과 null value 를 함 넣어보시면 확인하실 수 있을 듯합니다...

중요한 건 HashMap은 멀티쓰레드 환경에서 사용하면 안된다는 겁니다.

여러개의 쓰레드가 동시에 HashMap 을 건드려서 key, value 를 써넣게 되면 문제가 발생할 수 있다, 뭐 이런것 같습니다. 멀티쓰레드 프로그래밍 환경에서는 HashMap 을 쓰면 안되고 Hashtable 을 써야 한다는 거죠...

단일 쓰레드 환경에서 Hashtable 을 쓰더라도 별 문제는 없는데, HashMap보다는 성능이 저하될 수 있습니다.

HashMap : http://sunny.sarang.net/api/java/util/HashMap.html

실예)

import java.util.*;

public class HashMapTest {
public static void main(String arg[]) {
HashMap hm = new HashMap();
hm.put("1", "one");
hm.put("2", "two");
hm.put("3", "three");
hm.put("4", "four");

//TreeMap code = new TreeMap(hm);//sorting이 필요하시면 추가하세요.변수명 바꾸시구요

Iterator ir = hm.keySet().iterator();//HashMap의 모든 key 값을 Iterator 객체에 담는다.
while(ir.hasNext()){
String key = (String)ir.next();//하나씩 key값을 가져온다 여기서 특정 key 값과 비교하실려면
//if(key.equals("특정key값"){}//이렇게 비교하셔서 매칭 되는것만 출력하시든지 처리하시면 될것 같습니다.
String value = (String) hm.get(key);//그키값으로 HashMap의 값을 가져온다.
System.out.println("key = "+key+", value = "+value);
//System.out.println("");
//System.out.println(ir);
} /// while
} /// main
} /// class

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));

}

HashTable은 Map 인테페이스로부터 확장한 클래스이다.

Vector와의 차이점은 특정 킷값을 갖고 데이터를 검색할 수 있다는 것이다.

HashTable를 생성할 때 load factor를 정할 수 있는데 이는 메모리를 절약할것인가, 처리속도를 높일것인가를 결정하는 float형태의 값이다.

load factor 의 범위 : 0.0 ~ 1.0
0.0 : 처리속도가 가장 빠름. 메모리 소모 가장 많음.
1.0 : 처리속도 느림. 메모리 절약

주요 생성자

HashTable() 기본 저장공간을 11개와 load factor는 0.75를 갖는다.
HashTable(int Capacity)
초기공간을 지정하여 생성. load factor는 0.75
HashTable(int Capacity, float loadFactor)
초기 공간과 load factor를 지정하여 테이블 생성

HashTable()기본 저장공간을 11개와 load factor는 0.75를 갖는다.

HashTable(intCapacity)

초기공간을 지정하여 생성. load factor는 0.75

HashTable(intCapacity, float loadFactor)

초기 공간과 load factor를 지정하여 테이블 생성

주요 메소드

boolean containsKey(Object key)
해당 key값이 있는지 검색한다.
boolean containsValue(Obejct value) 해당 value 값이 있는지 검색한다.
void put(Object key, Object value) 해시테이블에 값을 넣는다. 만약 킷값이 동일하면 기본의 데이터가 대치된다.
int size() 해시 테이블에 있는 실제 요소의 갯수를 반환한다.
Object get(Object key) 킷값에 해당하는 값을 가져온다.
void clear() 모든 킷값과 value를 지운다.

boolean containsKey(Object key)

해당 key값이 있는지 검색한다.
boolean containsValue(Obejct value)해당 value 값이 있는지 검색한다.
void put(Object key, Object value)해시테이블에 값을 넣는다. 만약 킷값이 동일하면 기본의 데이터가 대치된다.
int size()해시 테이블에 있는 실제 요소의 갯수를 반환한다.
Object get(Object key)킷값에 해당하는 값을 가져온다.
void clear()모든 킷값과 value를 지운다.


[실예]

import java.util.*;

class HashtableEx
{
Hashtable ht = new Hashtable(10);

public HashtableEx()
{
ht.put("1", "one");
ht.put("2", "two");
ht.put("3", "thee");
ht.put("4", "four");
ht.put("5", "five");
}

public String get(String s)
{
String result = (String)ht.get(s);
return result;
}

public int size()
{
return ht.size();
}

public static void main(String[] args)
{
HashtableEx h = new HashtableEx();

System.out.println(h.get("1"));
System.out.println(h.size());
}
}