문제

Javadoc 동의어 이렇게 말합니다.

처럼 Hashtable 그러나와는 달리 HashMap,이 수업은합니다 ~ 아니다 허용하다 null 키 또는 값으로 사용됩니다.

내 질문 : 왜?

두 번째 질문 : 왜 Hashtable이 NULL을 허용하지 않습니까?

데이터 저장에 많은 해시 맵을 사용했습니다. 그러나 ConcurrEthashMap으로 바뀌면 NullPointerExceptions로 인해 여러 번 문제가 발생했습니다.

도움이 되었습니까?

해결책

저자로부터 ConcurrentHashMap 자신 (Doug Lea):

널이 동시에 허용되지 않는 주된 이유 (ConcurrenThashmaps, ConcurrentsKiplistMaps)는 비 콘유트 맵에서 거의 허용되지 않는 모호성을 수용 할 수 없기 때문입니다. 주요 것은 그게 IF입니다 map.get(key) 보고 null, 당신은 키가 명시 적으로지도하는지 여부를 감지 할 수 없습니다. null 대 키는 매핑되지 않았습니다. 비 콘유트 맵에서는이를 통해 확인할 수 있습니다. map.contains(key), 그러나 동시에 맵이 통화 사이에 변경되었을 수 있습니다.

다른 팁

적어도 부분적으로 당신이 결합 할 수 있다고 생각합니다. containsKey 그리고 get 한 번의 전화로. 지도가 널을 고정 할 수 있다면 get 그 값에 대한 열쇠가 없거나 값이 무효 였기 때문에 널을 반환합니다.

왜 문제가 있습니까? 스스로 할 수있는 안전한 방법이 없기 때문입니다. 다음 코드를 선택하십시오.

if (m.containsKey(k)) {
   return m.get(k);
} else {
   throw new KeyNotPresentException();
}

부터 m 동시지도이며, 키 k는 containsKey 그리고 get 전화,이 스 니펫이 원하는 것보다는 테이블에 없었던 널을 반환합니다. KeyNotPresentException.

일반적으로 동기화하여이를 해결하지만 동시지도는 물론 작동하지 않습니다. 따라서 서명 get 변경해야했고, 뒤로 호환 가능한 방식으로이를 수행하는 유일한 방법은 사용자가 처음에 NULL 값을 삽입하는 것을 방지하고 "Key Not Found"의 자리 표시 자로 계속 사용하는 것이 었습니다.

Josh Bloch가 디자인했습니다 HashMap; Doug Lea가 설계되었습니다 ConcurrentHashMap. 나는 그것이 비방적이지 않기를 바랍니다. 실제로 나는 문제는 널이 종종 랩핑을 요구하여 진짜 null이 초기화되지 않은 것을 의미 할 수 있다는 것입니다. 클라이언트 코드에 NULLS가 필요하면 널을 포장하는 비용을 자체로 지불 할 수 있습니다.

ConsurethShashmap은 스레드 안전입니다. 나는 널 키와 값을 허용하지 않는 것이 스레드 안전인지 확인의 일부라고 생각합니다.

다음과 같은 API 문서 스 니펫은 좋은 힌트를 제공한다고 생각합니다.

그들은 아마 단지 만들고 싶었을 것입니다 ConcurrentHashMap 완전히 호환/교환 가능 Hashtable. 그리고 AS Hashtable 널 키와 값을 허용하지 않습니다 ..

널에 동기화 할 수 없습니다.

편집 : 이것이이 경우에 정확히 그 이유는 아닙니다. 처음에는 동시 업데이트에 대해 물건을 잠그거나 객체 모니터를 사용하여 무언가가 수정되었는지 여부를 감지했지만 검사 할 때 멋진 일이 있다고 생각했습니다. 소스 코드 내가 틀린 것 같습니다. 해시의 비트 마스크를 기반으로 "세그먼트"를 사용하여 잠그십시오.

이 경우, 나는 그들이 hashtable을 복사하기 위해 그것을했다고 생각하고, 관계형 데이터베이스 세계에서 null! = null이므로 널을 키로 사용하면 의미가 없기 때문에 Hashtable이 그렇게했다고 생각합니다.

나는 널 가치를 허용하지 않는 것이 올바른 옵션이라고 생각하지 않습니다. 많은 경우에, 우리는 널 값을 가진 키를 con-current 맵에 넣기를 원합니다. 그러나 ConcurrEthashMap을 사용하면 그렇게 할 수 없습니다. 다가오는 JDK 버전이이를 지원할 수 있다고 제안합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top