Hashtable과 HashMap의 관계는 Vector와 ArrayList의 관계처럼 구 / 신버전의 차이라고 보면 되기에 필요한 경우가 아니라면 HashMap을 사용하면 된다.
Hashtable은 키나 값으로 null이 허용되지 않지만, HashMap은 허용한다. 그래서 'map.put(null, null);'이나 'map.get(null);'과 같이 할 수 있다.
HashMap은 Map인터페이스를 구현한 클래스이기에 키(key)와 값(value)를 한 쌍으로 묶어서 하나의 데이터(entry)로 저장한다는 특징을 갖는다. 그리고 해싱(hahsing)을 사용하기 때문에 많은 양의 데이터를 검색하는데 있어서 뛰어난 성능을 보인다.
public class HaspMap extends AbstractMap Imlements Map, Cloneable,, Serializable
{
transient Entry[] table;
...
satic class Entry implements Map.Entry {
final Object key;
Object values;
...
}
}
HashMap은 Entry라는 내부 클래스를 정의하고, 다시 Entry타입의 배열을 선언하고 있다. 키(key)와 값(value)은 서로 별개의 값이 아니라 서로 관련된 값이기에 각각의 배열로 선언하기 보다는 하나의 클래스로 정의해서 하나의 배열로 다루는 것이 데이터의 무결성(integrity)적인 측면에서 더 바람직하기 때문이다
// 비 객체지향적 코드
Object[] keys;
Object[] values;
// 객체지향적 코드
Entry[] table;
class Entry {
Object key;
Object value;
}
참고로Map.Entry는 Map인터페이스에 정의된 'static inner interface'이다.
HashMap은 키와 값을 주로 String을 대문자 또는 소문자로 통일해서 저장하지만, (Object, Object)의 형태이기 때문에 어떠한 자료형이 들어와도 상관없다.
키(key)
컬렉션 내의 키 중에서 유일해야 한다.
값(value)
키와는 달리 데이터의 중복을 허용한다.
public class HashMapExample {
public static void main(String[] args) {
HashMap map = new HashMap();
map.put("myId", "1234");
map.put("asdf", "1111");
map.put("asdf", "1234"); //위에 저장됐던 1111이란 값을 대체하게 됨.
Scanner sc = new Scanner(System.in);
while(true) {
System.out.println("id와 password를 입력해주십시오.");
System.out.print("id : ");
String id = sc.nextLine().trim();
System.out.print("password : ");
String password = sc.nextLine().trim();
System.out.println();
if(!map.containsKey(id)) {
System.out.println("입력하신 id는 존재하지 않습니다. 다시 입력해주세요.");
continue;
}
if(!(map.get(id)).equals(password)) {
System.out.println("비밀번호가 일치하지 않습니다. 다시 입력해주세요.");
} else {
System.out.println("id와 비밀번호가 일치합니다.");
break;
}
}
}
}