답변
Java HashMap
와 Hashtable
Java 에는 몇 가지 차이점이 있습니다 .
-
Hashtable
되고 동기화 반면HashMap
아니다. 이 차종HashMap
보다 비 스레드 응용 프로그램을위한, 동기화 객체는 일반적으로 더 나은 동기화 것보다 수행한다. -
Hashtable
null
키나 값을 허용하지 않습니다 .HashMap
하나의null
키와 여러null
값을 허용 합니다. -
의 HashMap의 서브 클래스 중 하나입니다
LinkedHashMap
그래서 당신은 (기본적으로 삽입 순서입니다) 예측 가능한 반복 순서를 싶어하는 경우에, 당신은 쉽게를 교환 할 수있는HashMap
경우 aLinkedHashMap
. 를 사용하는 경우 쉽지 않습니다Hashtable
.
동기화는 문제가되지 않기 때문에 권장 HashMap
합니다. 동기화가 문제가되면을 참조하십시오 ConcurrentHashMap
.
답변
많은 답변은 Hashtable이 동기화되었음을 나타냅니다. 실제로 이것은 당신을 거의 사지 않습니다. 접근자는 접근 자 / 뮤 테이터 메소드에서 동기화되어 맵에서 동시에 두 개의 스레드를 추가하거나 제거하지 않지만 실제 환경에서는 종종 추가 동기화가 필요합니다.
매우 일반적인 관용구는 “확인하고 입력”하는 것입니다. 즉 Map
, 에서 항목을 찾아서 존재하지 않는 경우 추가합니다. 사용 여부 이것은 어떤 방법으로 원자 작동하지 않습니다 Hashtable
나 HashMap
.
동등하게 동기화 HashMap
할 수 있습니다 :
Collections.synchronizedMap(myMap);
그러나이 논리를 올바르게 구현 하려면 다음 양식을 추가로 동기화 해야 합니다.
synchronized(myMap) {
if (!myMap.containsKey("tomato"))
myMap.put("tomato", "red");
}
추가 Hashtable
항목을 통해 항목을 수정 하지 않도록 보호하지 않는 한의 항목을 반복해도 (또는에 HashMap
의해 획득 됨 Collections.synchronizedMap
) 스레드로부터 안전하지 않습니다 Map
.
ConcurrentMap
인터페이스의 구현 (예 ConcurrentHashMap
:)은 다음과 같은 스레드 안전 점검 후 동작 시맨틱 을 포함하여이 중 일부를 해결합니다 .
ConcurrentMap.putIfAbsent(key, value);
답변
Hashtable
레거시 코드로 간주됩니다. 에 대한 Hashtable
사용 HashMap
이나 파생을 수행 할 수없는 것은 HashMap
없으므로 새로운 코드의 경우로 돌아가는 데 대한 정당성이 보이지 않습니다 Hashtable
.
답변
이 질문은 종종 후보자가 수집 클래스의 올바른 사용법을 이해하고 사용 가능한 대체 솔루션을 알고 있는지 확인하기 위해 인터뷰에서 요청됩니다.
- 이
HashMap
클래스는Hashtable
동기화되지 않았으며 null을 허용한다는 점을 제외하고 대략와 같습니다. (HashMap
null 값은 키와 값으로Hashtable
허용하고null
s 는 허용하지 않습니다 ). HashMap
지도의 순서가 시간이 지남에 따라 일정하게 유지된다는 보장은 없습니다.HashMap
동기화되지 않은 반면Hashtable
동기화됩니다.- 에
HashMap
대한 열거자는Hashtable
is 안전 하지 않은 반면에 다른 열거자가 자체 메소드를ConcurrentModificationException
제외한 요소를 추가하거나 제거하여 구조적으로 맵을 수정하면 throw는 안전 하지 않습니다 . 그러나 이것은 보장 된 동작이 아니며 최선의 노력으로 JVM에 의해 수행됩니다.Iterator
remove()
몇 가지 중요한 용어에 대한 참고 사항 :
- 동기화는 한 시점에서 하나의 스레드 만 해시 테이블을 수정할 수 있음을 의미합니다. 기본적으로 이는 업데이트를 수행하기 전에 모든 스레드
Hashtable
가 객체에 대한 잠금을 획득해야 하고 다른 스레드 는 잠금이 해제 될 때까지 대기해야 함을 의미합니다. - 페일 세이프는 이터레이터와 관련이 있습니다. 컬렉션 객체에서 반복자가 생성되고 다른 스레드가 컬렉션 객체를 “구조적으로”수정하려고하면 동시 수정 예외가 발생합니다.
set
컬렉션을 “구조적으로”수정하지 않기 때문에 다른 스레드가 메소드 를 호출 할 수도 있습니다. 그러나을 호출하기 전에set
컬렉션이 구조적으로 수정 된IllegalArgumentException
경우 던져집니다. - 구조적으로 수정하는 것은 맵의 구조를 효과적으로 변경할 수있는 요소를 삭제하거나 삽입하는 것을 의미합니다.
HashMap
에 의해 동기화 될 수있다
Map m = Collections.synchronizeMap(hashMap);
지도는 열거 객체를 통한 반복을 직접 지원하는 대신 컬렉션보기를 제공합니다. 컬렉션 뷰는이 섹션의 뒷부분에서 설명하는 것처럼 인터페이스의 표현성을 크게 향상시킵니다. 맵을 사용하면 키, 값 또는 키-값 쌍을 반복 할 수 있습니다.
Hashtable
세 번째 옵션은 제공하지 않습니다. 맵은 반복 중에 항목을 안전하게 제거 할 수있는 방법을 제공합니다. Hashtable
하지 않았다. 마지막으로, Map은 Hashtable
인터페이스 의 약간의 결함을 수정합니다 .
Hashtable
contains라는 메소드가 있는데 Hashtable
, 주어진 값 이 포함되어 있으면 true를 리턴합니다
. 이름이 주어지면 Hashtable
키가 a의 기본 액세스 메커니즘이기 때문에 주어진 키 가 포함되어 있으면이 메소드가 true를 반환 할 것으로 예상 Hashtable
됩니다. 지도 인터페이스는 메소드의 이름을 바꾸어 이러한 혼란의 원인을 제거합니다.
containsValue
. 또한 인터페이스의 일관성 ( containsValue
병렬)을 향상시킵니다
containsKey
.
답변
HashMap
: Map
해시 코드를 사용하여 배열을 색인화하는 인터페이스 의 구현입니다 .
Hashtable
: 1998 년 안녕하세요. 그들은 컬렉션 API를 다시 원합니다.
진지하게, 당신은 Hashtable
완전히 떨어져있는 것이 좋습니다 . 단일 스레드 앱의 경우 동기화 오버 헤드가 추가로 필요하지 않습니다. 동시성이 높은 앱의 경우 편집증 동기화로 인해 기아, 교착 상태 또는 불필요한 가비지 수집 일시 중지가 발생할 수 있습니다. Tim Howland가 지적한 것처럼 ConcurrentHashMap
대신 사용할 수 있습니다 .
답변
명심 HashTable
자바 컬렉션 프레임 워크 (JCF)를 도입하고 나중에 구현하기 위해서 개량되기 전에 기존 클래스했다 Map
인터페이스를. 그래서이었다 Vector
및 Stack
.
따라서 다른 사람들이 지적했듯이 JCF에는 항상 더 나은 대안이 있기 때문에 항상 새 코드에서 멀리하십시오 .
다음은 유용한 Java 콜렉션 치트 시트 입니다. 회색 블록에는 레거시 클래스 HashTable, Vector 및 Stack이 포함되어 있습니다.
답변
이미 게시 된 좋은 답변이 많이 있습니다. 몇 가지 새로운 포인트를 추가하고 요약합니다.
HashMap
및 Hashtable
모두를 저장하는 데 사용되는 키 값 데이터 형태 . 둘 다 고유 키를 저장하기 위해 해싱 기술을 사용하고 있습니다. 그러나 아래에 주어진 HashMap과 Hashtable 클래스에는 많은 차이점이 있습니다.
해시 맵
HashMap
동기화되지 않았습니다. 스레드 안전하지 않으며 적절한 동기화 코드가 없으면 많은 스레드간에 공유 할 수 없습니다.HashMap
하나의 null 키와 여러 null 값을 허용합니다.HashMap
JDK 1.2에 도입 된 새로운 클래스입니다.HashMap
빠릅니다.HashMap
이 코드를 호출 하여 로 동기화 할 수 있습니다
Map m = Collections.synchronizedMap(HashMap);
HashMap
Iterator에 의해 순회됩니다.- 반복자
HashMap
가 실패했습니다. HashMap
AbstractMap 클래스를 상속합니다.
해시 테이블
Hashtable
동기화됩니다. 스레드 안전하고 많은 스레드와 공유 할 수 있습니다.Hashtable
null 키 또는 값을 허용하지 않습니다.Hashtable
레거시 클래스입니다.Hashtable
느리다.Hashtable
내부적으로 동기화되며 동기화 할 수 없습니다.Hashtable
Enumerator와 Iterator에 의해 순회됩니다.- 열거자가
Hashtable
실패하지 않습니다. Hashtable
Dictionary 클래스를 상속합니다.