Java Hashtable ํด๋์ค๋ Java Collection Framework์ ๊ฐ์ฅ ์ค๋๋ ๋ฉค๋ฒ ์ค ํ๋์
๋๋ค. ์ํ์ ํด์ ํ
์ด๋ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๊ตฌํ์
๋๋ค. Java ํด์ ํ
์ด๋ธ์๋ ๋ด๋ถ์ ์ผ๋ก ํค/๊ฐ ์์ด ์ ์ฅ๋๋ ๋ฒํท์ด ํฌํจ๋์ด ์์ต๋๋ค. Hashtable์ HashMap ๊ณผ ๋งค์ฐ ์ ์ฌํฉ๋๋ค . ๊ทธ๋ค ์ฌ์ด์ ๊ฐ์ฅ ์ค์ํ ์ฐจ์ด์ ์ Hashtable์ด ๋๊ธฐํ๋๋ ๋ฐ๋ฉด HashMap์ ๋๊ธฐํ๋์ง ์๋๋ค๋ ๊ฒ์
๋๋ค.
๋ฐ์ดํฐ ๊ตฌ์กฐ๋ก์์ ํด์ ํ ์ด๋ธ
Hashtable์ ๋ฐ์ดํฐ๊ฐ ๋ฐฐ์ด ํ์์ผ๋ก ์ ์ฅ๋๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๋๋ค. ๋ชจ๋ ๋ฐ์ดํฐ ๊ฐ์๋ ๊ณ ์ ํ ํค ๊ฐ์ด ์์ต๋๋ค. ํค๊ฐ ์๋ ค์ง ๊ฒฝ์ฐ ํ์ํ ๋ฐ์ดํฐ์ ๋ํ ์ก์ธ์ค๊ฐ ๋งค์ฐ ๋น ๋ฆ ๋๋ค. ๋ฐ๋ผ์ ์ฝ์ ๋ฐ ๊ฒ์ ์์ ์ ๋ฐ์ดํฐ ํฌ๊ธฐ์ ๊ด๊ณ์์ด ๋น ๋ฆ ๋๋ค. Hash Table์ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ดํ๊ธฐ ์ํ ๋ฐฐ์ด๊ณผ ์์๊ฐ ์์นํด์ผ ํ ์ธ๋ฑ์ค ์์ฑ์ ์ํ ํด์ฑ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ํด์ฑ์ด๋ ๋ฌด์์ ๋๊น? ๊ฐ์ฒด๋ฅผ ์ผ๋ จ์ ๋ฌธ์(์ฝ๋)๋ก ๋งคํํ๋ ๊ท์น์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ์ข ๋ฅ์ ํจ์๋ ํฐ ๋ฐ์ดํฐ ์กฐ๊ฐ์ ์์ ์ ์ ๊ฐ์ผ๋ก ๋ณํํฉ๋๋ค. ํด์ ํจ์๋ ๋ค๋ฅผ ์ ์์ง๋ง ๋ชจ๋ ํน์ ์์ฑ์ ์ ์ถํฉ๋๋ค.- ํน์ ๊ฐ์ฒด์๋ ํน์ ํด์ ์ฝ๋๊ฐ ์์ต๋๋ค.
- ๋ ๊ฐ์ ๋์ผํ ๊ฐ์ฒด์๋ ๋์ผํ ํด์ ์ฝ๋๊ฐ ์์ต๋๋ค. ๊ทธ ๋ฐ๋๋ ์ฌ์ค์ด ์๋๋๋ค.
- ๋ ๊ฐ์ ํด์ ์ฝ๋๊ฐ ๋ค๋ฅด๋ฉด ๊ฐ์ฒด๊ฐ ํ์คํ ๊ฐ์ง ์์ต๋๋ค.
- ๋ค๋ฅธ ๊ฐ์ฒด๋ ๋์ผํ ํด์ ์ฝ๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด ๋งค์ฐ ๋๋ฌธ ์ด๋ฒคํธ๋ ์ถฉ๋์ ํธ์ถํฉ๋๋ค. ์ข์ ํด์ ํจ์๋ ์ถฉ๋ ๊ฐ๋ฅ์ฑ์ ์ต์ํํฉ๋๋ค.
Java์ ํด์ ํ ์ด๋ธ
Hashtable ํด๋์ค๋ ํด์ ํ ์ด๋ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ๊ตฌํ์ ๋๋ค. ์ด ์ปฌ๋ ์ ์ Java Collection Framework๋ณด๋ค ๋จผ์ ์์ฑ๋์์ง๋ง ๋์ค์ ํฌํจ๋์์ต๋๋ค. ๋ชจ๋ "์ด๊ธฐ" ์ปฌ๋ ์ (Java 1.0๋ถํฐ)๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ํด์ ํ ์ด๋ธ์ ๋๊ธฐํ๋ฉ๋๋ค(๊ฑฐ์ ๋ชจ๋ ๋ฉ์๋๊ฐ ๋๊ธฐํ๋จ์ผ๋ก ํ์๋จ). ์ด ์์ ๋๋ฌธ์ ํด์ ํ ์ด๋ธ์๋ ์ฌ๊ฐํ ์ฑ๋ฅ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ๋ฐ๋ผ์ Java 1.2๋ถํฐ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ๋๊ธฐํ ๋ถ์กฑ์ผ๋ก ์ธํด Map ์ธํฐํ์ด์ค ์ ๋ค๋ฅธ ๊ตฌํ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข์ต๋๋ค . ์ผ๋ฐ์ ์ผ๋ก HashMap์ด ๊ฐ์ฅ ์ ์ ํ ๋์ฒดํ์ ๋๋ค. ๊ทธ๋์ ํด๋์ค Hashtable<K,V>ํค์ ๊ฐ์ผ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ํด์ฑ ์์น์ ๋ฐ๋ผ ํค๋ฅผ ์ ์ฅํฉ๋๋ค. ํค-๊ฐ ์์ "๋ฒํท"์ ์ ์ฅ๋ฉ๋๋ค. ๋ฒํท์ ์ผ์ข ์ ๋ด๋ถ ๋ฐฐ์ด์ธ "ํ ์ด๋ธ"์ ๊ตฌ์ฑํฉ๋๋ค. Hashtable์ ํค์ ํด์ ์ฝ๋๋ฅผ ์ฌ์ฉํ์ฌ ํค/๊ฐ ์์ด ๋งคํ๋์ด์ผ ํ๋ ๋ฒํท์ ๊ฒฐ์ ํฉ๋๋ค. ํด์ ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด ํค์ ํด์์ฝ๋์์ ๋ฒํท ์์น๋ฅผ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ด ํจ์๋ ๊ฐ์ฒด์ ๋ํ ์ ์๋ฅผ ๋ฐํํฉ๋๋ค. ์์์ ๋งํ๋ฏ์ด ๋ ๊ฐ์ ๋์ผํ ๊ฐ์ฒด๋ ๋์ผํ ํด์ ์ฝ๋๋ฅผ ๊ฐ๋ ๋ฐ๋ฉด ๋ ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ ํญ์ ๋ค๋ฅธ ํด์ ์ฝ๋๋ฅผ ๊ฐ์ง ์์ ์ ์์ต๋๋ค. ํด์ ํ ์ด๋ธ์ ๋ฃ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ ๋์ผํ ํด์ ์ฝ๋๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค. ์ด ๋ฌธ์ (์ถฉ๋)๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ชฉ๋ก ๋ฐฐ์ด์ด ํด์ ํ ์ด๋ธ์ ์ฌ์ฉ๋ฉ๋๋ค. ๋จ์ผ ๋ฒํท์ ๋งคํ๋ ์์ ๋ชฉ๋ก์ ์ ์ฅ๋๊ณ ์ด ๋ชฉ๋ก ์ฐธ์กฐ๋ ๋ฐฐ์ด ์ธ๋ฑ์ค์ ์ ์ฅ๋ฉ๋๋ค.ํด์ ํ ์ด๋ธ Java ์์ฑ์
- Hashtable() , ๊ธฐ๋ณธ ์์ฑ์. ๋น ํด์ ํ ์ด๋ธ์ ์์ฑํฉ๋๋ค. (๊ธฐ๋ณธ ์ด๊ธฐ ์ฉ๋ = 11, ๋ถํ์จ = 0.75).
- Hashtable(int size)์ ์ง์ ๋ ํฌ๊ธฐ์ ํด์ ํ ์ด๋ธ์ ๊ตฌ์ฑํฉ๋๋ค.
- Hashtable(int size, float fillRatio)์ ์ง์ ๋ ํฌ๊ธฐ์ ์ฑ์ฐ๊ธฐ ๋น์จ์ ํด์ ํ ์ด๋ธ์ ์์ฑํฉ๋๋ค.
- Hashtable(Map m)์ ์ฃผ์ด์ง Map๊ณผ ๋์ผํ ๋งคํ์ผ๋ก ํด์ ํ ์ด๋ธ์ ์์ฑํฉ๋๋ค.
ํด์ ํ ์ด๋ธ ์ ์ธ
Hashtable Java ํด๋์ค๋ Map , Cloneable ๋ฐ Serializable ์ธํฐํ์ด์ค ๋ฅผ ๊ตฌํํฉ๋๋ค . ๊ทธ๊ฒ์ Dictionary ํด๋์ค๋ฅผ ํ์ฅํฉ๋๋ค.
Hashtable.java
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, java.io.Serializable
K ๋ ๋งต์์ ์ ์ง ๊ด๋ฆฌํ๋ ํค ์ ํ์
๋๋ค. V ๋ ๋งคํ๋ ๊ฐ์ ์ ํ์
๋๋ค. ์:
Hashtable<Student, Integer> myHTable = new Hashtable<>();
ํด์ ํ ์ด๋ธ ์๋ฐ๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐฉ๋ฒ
Java Hashtable์ java.util ํจํค์ง ์์ ์์ต๋๋ค . ๋ฐ๋ผ์ import java.util.Hashtable์ ์ฌ์ฉํ์ญ์์ค. ๊ทํ์ ์ฝ๋์์. ์ผ๋ฐ์ ์ผ๋ก ์ด์ ๋ํ ํํธ๋ IDE์์ ์ป์ ์ ์์ต๋๋ค.ํด์ ํ ์ด๋ธ ์ฃผ์ ์์
Hashtable์ ์ฃผ์ ์์ ์ ๊ฐ์ ธ์ค๊ธฐ, ์ปฌ๋ ์ ์ ์ฝ์ ๋ฐ ์ ๊ฑฐ์ ๋๋ค. ์ด ์ธ ๊ฐ์ง ์์ ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.- ๊ฐ์ฒด get(๊ฐ์ฒด ํค)์ ํค๋ฅผ ์ง์ ํ ๊ฐ์ฒด์ ๊ฐ์ ๋ฐํํฉ๋๋ค. ํด๋น ํค๊ฐ ์์ผ๋ฉด null์ ๋ฐํํฉ๋๋ค.
- Object put(๊ฐ์ฒด ํค, ๊ฐ์ฒด ๊ฐ)์ ์ง์ ๋ ํค๋ฅผ ์ง์ ๋ ๊ฐ์ ๋งคํํฉ๋๋ค. ํค๋ ๊ฐ๋ null์ผ ์ ์์ต๋๋ค.
- int size()๋ ํด์ ํ ์ด๋ธ์ ํญ๋ชฉ ์๋์ ๋ฐํํฉ๋๋ค.
- boolean contains(Object value) ์ง์ ๋ ๊ฐ์ด ํด์ ํ ์ด๋ธ์ ์๋์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ฉ์๋๋ true๋ฅผ ๋ฐํํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด false๋ฅผ ๋ฐํํฉ๋๋ค.
- boolean containsValue(Object value)๋ ์ง์ ๋ ๊ฐ์ด ํด์ ํ ์ด๋ธ์ ์๋์ง ํ์ธํฉ๋๋ค. ๊ทธ๋ ๋ค๋ฉด ๋ฉ์๋๋ true๋ฅผ ๋ฐํํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด false๋ฅผ ๋ฐํํฉ๋๋ค.
- void clear()๋ ํด์ ํ ์ด๋ธ์์ ๋ชจ๋ ํญ๋ชฉ์ ์ ๊ฑฐํฉ๋๋ค.
- boolean containsKey(๊ฐ์ฒด ํค)๋ ์ง์ ๋ ํค๊ฐ ํด์ ํ ์ด๋ธ์ ์์ผ๋ฉด true๋ฅผ ๋ฐํํ๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด false๋ฅผ ๋ฐํํฉ๋๋ค.
- ๋ถ์ธ isEmpty()๋ ํด์ ํ ์ด๋ธ์ด ๋น์ด ์์ผ๋ฉด true๋ฅผ ๋ฐํํ๊ณ ํ๋ ์ด์์ ํค๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด false๋ฅผ ๋ฐํํฉ๋๋ค.
- void rehash()๋ ํด์ ํ ์ด๋ธ์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๊ณ ๋ชจ๋ ํค๋ฅผ ๋ค์ ํด์ํฉ๋๋ค.
ํด์ ํ ์ด๋ธ ๊ตฌํ, Java ์ฝ๋:
ํ์ ํด๋์ค๋ฅผ ๋ง๋ค์ด ๋ด ์๋ค :
import java.util.Date;
public class Student {
String surname;
String name;
String secondName;
Long birthday; // Long instead of long is used by Gson/Jackson json parsers and various orm databases
public Student(String surname, String name, String secondName, Date birthday ){
this.surname = surname;
this.name = name;
this.secondName = secondName;
this.birthday = birthday == null ? 0 : birthday.getTime();
}
@Override
public int hashCode(){
//TODO: check for nulls
return (surname + name + secondName + birthday).hashCode();
}
@Override
public boolean equals(Object other_) {
Student other = (Student)other_;
return (surname == null || surname.equals(other.surname) )
&& (name == null || name.equals(other.name))
&& (secondName == null || secondName.equals(other.secondName))
&& (birthday == null || birthday.equals(other.birthday));
}
}
๋ค์์ Java Hashtable ์์ ์
๋๋ค. Student ํด๋์ค ์ ๋ ๊ฐ์ฒด๋ฅผ ํด์ ํ
์ด๋ธ์ ๋ฃ์ ๋ค์ ์ผ๋ถ๋ฅผ ์ ๊ฑฐํ๊ณ ์ผ๋ถ ๋งค๊ฐ ๋ณ์๋ฅผ ํ์ธํ๊ฒ ์ต๋๋ค.
public class HashTableExample {
public static void main(String[] args) {
Hashtable<Student, Integer> myHTable = new Hashtable<>();
Student sarah1 = new Student("Sarah","Connor", "Jane", null);
Student john = new Student("John","Connor", "Kyle", new Date(1985, 02-1, 28)); // date not exists
myHTable.put(john,1);
myHTable.put(sarah1,0);
System.out.println(myHTable.get(john));
System.out.println(myHTable.isEmpty());
System.out.println(myHTable.size());
System.out.println(myHTable.contains(1));
myHTable.remove(john);
System.out.println(myHTable.contains(0));
System.out.println(myHTable.contains(1));
System.out.println(myHTable.containsKey(sarah1));
}
}
ํ๋ก๊ทธ๋จ ์คํ ๊ฒฐ๊ณผ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
1
false
2
true
true
false
true
HashMap ๋ Hashtable
- Hashtable์ Java์ HashMap๊ณผ ์ ์ฌํฉ๋๋ค. ๊ฐ์ฅ ์ค์ํ ์ฐจ์ด์ ์ Hashtable์ ๋๊ธฐํ๋์ง๋ง HashMap์ ๋๊ธฐํ๋์ง ์๋๋ค๋ ๊ฒ์ ๋๋ค. ๋ฐ๋ผ์ Hashtable์ ๋๊ธฐํ ๋๋ฌธ์ HashMap๋ณด๋ค ๋๋ฆฝ๋๋ค.
- ๋๊ธฐํ ๋ฌธ์ ๋ฅผ ์ ์ธํ๊ณ Hashtable์ null์ ๊ฐ์ด๋ ํค๋ก ์ฌ์ฉํ๋ ๊ฒ์ ํ์ฉํ์ง ์์ต๋๋ค. HashMap์ ํ๋์ null ํค์ ์ฌ๋ฌ ๊ฐ์ null ๊ฐ์ ํ์ฉํฉ๋๋ค.
- Hashtable์ Dictionary ํด๋์ค๋ฅผ ์์ํ๊ณ HashMap์ AbstractMap ํด๋์ค๋ฅผ ์์ํฉ๋๋ค.
- HashMap์ Iterator์ ์ํด ์ํ๋ฉ๋๋ค. Hashtable์ Iterator๋ฟ ์๋๋ผ Enumerator๋ก๋ ํ์ํ ์ ์์ต๋๋ค.
Java ํด์ ํ ์ด๋ธ ์์ (Hashtable ๋ HashMap null ํค)
๋ค์์ HashMap ๋ฐ Hashtable ์์ ํค์ ๊ฐ์ผ๋ก ์ฌ์ฉ๋๋ null์ ๋ณด์ฌ์ฃผ๋ ์กฐ๊ฐ ์ฝ๋์ ๋๋ค.
// Null key Java hashtable example and hashmap example
try{
System.out.println("Hashtable");
Hashtable hashTable = new Hashtable();
hashTable.put(null, new Object());
}catch(Exception ex){
ex.printStackTrace();
}
System.out.println("HashMap");
HashMap hashMap = new HashMap();
hashMap.put(null, new Object());
System.out.println("as you see no exceptions with null key in HashMap");
}
์ด ์กฐ๊ฐ์ ํฌํจํ๋ ํ๋ก๊ทธ๋จ์ ์คํํ ๊ฒฐ๊ณผ:
java.lang.NullPointerException
at java.base/java.util.Hashtable.put(Hashtable.java:480)
at Character.main(Character.java:58)
HashMap
as you see no exceptions with null key in HashMap
GO TO FULL VERSION