[java] HashMap과 Hashtable의 차이점은 무엇입니까?

Java HashMap와 a 의 차이점은 무엇입니까 Hashtable?

스레드되지 않은 응용 프로그램에 더 효과적인 것은 무엇입니까?



답변

Java HashMapHashtableJava 에는 몇 가지 차이점이 있습니다 .

  1. Hashtable되고 동기화 반면 HashMap아니다. 이 차종 HashMap보다 비 스레드 응용 프로그램을위한, 동기화 객체는 일반적으로 더 나은 동기화 것보다 수행한다.

  2. Hashtablenull키나 값을 허용하지 않습니다 . HashMap하나의 null키와 여러 null값을 허용 합니다.

  3. 의 HashMap의 서브 클래스 중 하나입니다 LinkedHashMap그래서 당신은 (기본적으로 삽입 순서입니다) 예측 가능한 반복 순서를 싶어하는 경우에, 당신은 쉽게를 교환 할 수있는 HashMap경우 a LinkedHashMap. 를 사용하는 경우 쉽지 않습니다 Hashtable.

동기화는 문제가되지 않기 때문에 권장 HashMap합니다. 동기화가 문제가되면을 참조하십시오 ConcurrentHashMap.


답변

많은 답변은 Hashtable이 동기화되었음을 나타냅니다. 실제로 이것은 당신을 거의 사지 않습니다. 접근자는 접근 자 / 뮤 테이터 메소드에서 동기화되어 맵에서 동시에 두 개의 스레드를 추가하거나 제거하지 않지만 실제 환경에서는 종종 추가 동기화가 필요합니다.

매우 일반적인 관용구는 “확인하고 입력”하는 것입니다. 즉 Map, 에서 항목을 찾아서 존재하지 않는 경우 추가합니다. 사용 여부 이것은 어떤 방법으로 원자 작동하지 않습니다 HashtableHashMap.

동등하게 동기화 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.


답변

이 질문은 종종 후보자가 수집 클래스의 올바른 사용법을 이해하고 사용 가능한 대체 솔루션을 알고 있는지 확인하기 위해 인터뷰에서 요청됩니다.

  1. HashMap클래스는 Hashtable동기화되지 않았으며 null을 허용한다는 점을 제외하고 대략와 같습니다. ( HashMapnull 값은 키와 값으로 Hashtable허용하고 nulls 는 허용하지 않습니다 ).
  2. HashMap 지도의 순서가 시간이 지남에 따라 일정하게 유지된다는 보장은 없습니다.
  3. HashMap동기화되지 않은 반면 Hashtable동기화됩니다.
  4. HashMap대한 열거자는 Hashtableis 안전 하지 않은 반면에 다른 열거자가 자체 메소드를 ConcurrentModificationException제외한 요소를 추가하거나 제거하여 구조적으로 맵을 수정하면 throw는 안전 하지 않습니다 . 그러나 이것은 보장 된 동작이 아니며 최선의 노력으로 JVM에 의해 수행됩니다.Iteratorremove()

몇 가지 중요한 용어에 대한 참고 사항 :

  1. 동기화는 한 시점에서 하나의 스레드 만 해시 테이블을 수정할 수 있음을 의미합니다. 기본적으로 이는 업데이트를 수행하기 전에 모든 스레드 Hashtable가 객체에 대한 잠금을 획득해야 하고 다른 스레드 는 잠금이 해제 될 때까지 대기해야 함을 의미합니다.
  2. 페일 세이프는 이터레이터와 관련이 있습니다. 컬렉션 객체에서 반복자가 생성되고 다른 스레드가 컬렉션 객체를 “구조적으로”수정하려고하면 동시 수정 예외가 발생합니다. set컬렉션을 “구조적으로”수정하지 않기 때문에 다른 스레드가 메소드 를 호출 할 수도 있습니다. 그러나을 호출하기 전에 set컬렉션이 구조적으로 수정 된 IllegalArgumentException경우 던져집니다.
  3. 구조적으로 수정하는 것은 맵의 구조를 효과적으로 변경할 수있는 요소를 삭제하거나 삽입하는 것을 의미합니다.

HashMap 에 의해 동기화 될 수있다

Map m = Collections.synchronizeMap(hashMap);

지도는 열거 객체를 통한 반복을 직접 지원하는 대신 컬렉션보기를 제공합니다. 컬렉션 뷰는이 섹션의 뒷부분에서 설명하는 것처럼 인터페이스의 표현성을 크게 향상시킵니다. 맵을 사용하면 키, 값 또는 키-값 쌍을 반복 할 수 있습니다.
Hashtable세 번째 옵션은 제공하지 않습니다. 맵은 반복 중에 항목을 안전하게 제거 할 수있는 방법을 제공합니다. Hashtable하지 않았다. 마지막으로, Map은 Hashtable인터페이스 의 약간의 결함을 수정합니다 .
Hashtablecontains라는 메소드가 있는데 Hashtable, 주어진 값 이 포함되어 있으면 true를 리턴합니다
. 이름이 주어지면 Hashtable키가 a의 기본 액세스 메커니즘이기 때문에 주어진 키 가 포함되어 있으면이 메소드가 true를 반환 할 것으로 예상 Hashtable됩니다. 지도 인터페이스는 메소드의 이름을 바꾸어 이러한 혼란의 원인을 제거합니다.
containsValue. 또한 인터페이스의 일관성 ( containsValue병렬)을 향상시킵니다
containsKey.

지도 인터페이스


답변

HashMap: Map해시 코드를 사용하여 배열을 색인화하는 인터페이스 의 구현입니다 .
Hashtable: 1998 년 안녕하세요. 그들은 컬렉션 API를 다시 원합니다.

진지하게, 당신은 Hashtable완전히 떨어져있는 것이 좋습니다 . 단일 스레드 앱의 경우 동기화 오버 헤드가 추가로 필요하지 않습니다. 동시성이 높은 앱의 경우 편집증 동기화로 인해 기아, 교착 상태 또는 불필요한 가비지 수집 일시 중지가 발생할 수 있습니다. Tim Howland가 지적한 것처럼 ConcurrentHashMap대신 사용할 수 있습니다 .


답변

명심 HashTable자바 컬렉션 프레임 워크 (JCF)를 도입하고 나중에 구현하기 위해서 개량되기 전에 기존 클래스했다 Map인터페이스를. 그래서이었다 VectorStack.

따라서 다른 사람들이 지적했듯이 JCF에는 항상 더 나은 대안이 있기 때문에 항상 새 코드에서 멀리하십시오 .

다음은 유용한 Java 콜렉션 치트 시트 입니다. 회색 블록에는 레거시 클래스 HashTable, Vector 및 Stack이 포함되어 있습니다.

여기에 이미지 설명을 입력하십시오


답변

이미 게시 된 좋은 답변이 많이 있습니다. 몇 가지 새로운 포인트를 추가하고 요약합니다.

HashMapHashtable모두를 저장하는 데 사용되는 키 값 데이터 형태 . 둘 다 고유 키를 저장하기 위해 해싱 기술을 사용하고 있습니다. 그러나 아래에 주어진 HashMap과 Hashtable 클래스에는 많은 차이점이 있습니다.

해시 맵

  1. HashMap동기화되지 않았습니다. 스레드 안전하지 않으며 적절한 동기화 코드가 없으면 많은 스레드간에 공유 할 수 없습니다.
  2. HashMap 하나의 null 키와 여러 null 값을 허용합니다.
  3. HashMap JDK 1.2에 도입 된 새로운 클래스입니다.
  4. HashMap 빠릅니다.
  5. HashMap이 코드를 호출 하여 로 동기화 할 수 있습니다
    Map m = Collections.synchronizedMap(HashMap);
  6. HashMap Iterator에 의해 순회됩니다.
  7. 반복자 HashMap가 실패했습니다.
  8. HashMap AbstractMap 클래스를 상속합니다.

해시 테이블

  1. Hashtable동기화됩니다. 스레드 안전하고 많은 스레드와 공유 할 수 있습니다.
  2. Hashtable null 키 또는 값을 허용하지 않습니다.
  3. Hashtable 레거시 클래스입니다.
  4. Hashtable 느리다.
  5. Hashtable 내부적으로 동기화되며 동기화 할 수 없습니다.
  6. Hashtable Enumerator와 Iterator에 의해 순회됩니다.
  7. 열거자가 Hashtable실패하지 않습니다.
  8. Hashtable Dictionary 클래스를 상속합니다.

더 읽기 Java에서 HashMap과 Hashtable의 차이점은 무엇입니까?

여기에 이미지 설명을 입력하십시오