작성
·
2.1K
0
안녕하세요
Optional 소개 강의 13분쯤에 "Map의 가장 큰 특징이 key는 null이 아닙니다"라고 하셨는데 HashMap은 key값으로 null이 가능한 것으로 알고 있는데, (Hashtable은 key로 null이 불가능하고요) 혹시 제가 뭔가 잘못 알고 있는걸까요?
답변 2
4
저도 같은 내용이 궁금하여 HashMap 코드를 확인해 보았습니다.
우리가 hashMap.put(key, value) 을 통해 put() 메서드를 호출합니다.
// HashMap 의 put() 메서드
public V put(K key, V value) {
return putVal(hash(key), key, value, false, true);
}
put() 메서드를 보면 hash() 메소드에 key 를 전달하여 나온 값을 putVal() 메소드 호출 시에 사용합니다.
이 값은 hash 로 putVal() 메서드에서 Node 를 생성하는데 사용되고, hashMap 에서 고유키 역할을 합니다.
즉, 우리는 key 를 전달하였지만 HashMap 에서는 이 key 를 hash 로 바꾸어 고유키로 사용하는 것입니다.
다음으로 hash() 메소드를 보았습니다.
// hash() 메서드
static final int hash(Object key) {
int h;
return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}
key 를 받아서 처리하여 int 타입의 hash 를 리턴하고 있습니다.
key 가 null 인 경우는 0 을 반환합니다.
따라서 우리가 key 로 null 을 전달하면 haspMap 은 실제 사용할 고유키(= hash) 로 0 를 사용하게 됩니다.
0 이 고유키로 사용되지 못할 이유는 없습니다.
이것이 HashMap 에서 key 로 null 이 사용가능한 이유로 보입니다.
0
잘 알고 계신게 맞습니다. 저는 "Map 인터페이스가 가지고 있는 규약"을 설명했는데요. 해당 인터페이스의 put 메서드 문서를 읽어보시면 null 키나 값을 허용하지 않는 다는 것을 알 수 있을 겁니다.
https://docs.oracle.com/javase/8/docs/api/java/util/Map.html#put-K-V-
다만, 의아하게도 모든 Map 구현체가 그런 규약을 따르진 않으며, 그 중에서도 HashMap은 null을 허용합니다. 여기서 보다 재밌고 가치있는 질문은 아마도 "왜" HashMap은 null을 허용하느냐 일 겁니다. 관심있으시다면 그 질문에 대한 답을 직접 조사해서 남겨주시면 좋겠습니다. 감사합니다. :)