문제

a의 차이점은 무엇인가요? HashMap 그리고 Hashtable 자바에서는?

스레드가 아닌 응용 프로그램에는 어느 것이 더 효율적입니까?

도움이 되었습니까?

해결책

사이에는 몇 가지 차이점이 있습니다. HashMap 그리고 Hashtable 자바에서:

  1. Hashtable ~이다 동기화됨, 반면 HashMap 아니다.이것은 만든다 HashMap 비동기화된 개체는 일반적으로 동기화된 개체보다 더 나은 성능을 발휘하므로 스레드되지 않은 응용 프로그램에 더 좋습니다.

  2. Hashtable 허용하지 않는다 null 키 또는 값. HashMap 하나를 허용 null 키와 개수 제한 없음 null 가치.

  3. HashMap의 하위 클래스 중 하나는 다음과 같습니다. LinkedHashMap, 따라서 예측 가능한 반복 순서(기본적으로 삽입 순서)를 원하는 경우 쉽게 교체할 수 있습니다. HashMap 한 동안 LinkedHashMap.당신이 사용한다면 이것은 쉽지 않을 것입니다 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.

이 질문은 지원자가 컬렉션 클래스의 올바른 사용법을 이해하고 있으며 사용 가능한 대체 솔루션을 알고 있는지 확인하기 위해 인터뷰에서 자주 묻는 질문입니다.

  1. HashMap 클래스는 동기화되지 않고 null을 허용한다는 점을 제외하면 Hashtable과 거의 동일합니다.(HashMap은 null 값을 키와 값으로 허용하는 반면 Hashtable은 null을 허용하지 않습니다.)
  2. HashMap은 지도의 순서가 시간이 지나도 일정하게 유지된다는 것을 보장하지 않습니다.
  3. HashMap은 동기화되지 않지만 Hashtable은 동기화됩니다.
  4. HashMap의 Iterator는 안전하지만 Hashtable의 열거자는 안전하지 않으며 다른 Thread가 Iterator의 자체 Remove() 메서드를 제외한 모든 요소를 ​​추가하거나 제거하여 맵을 구조적으로 수정하는 경우 ConcurrentModificationException을 발생시킵니다.그러나 이는 보장된 동작은 아니며 JVM에서 최선의 노력을 다해 수행됩니다.

일부 중요한 용어에 대한 참고 사항

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

HashMap은 다음을 통해 동기화할 수 있습니다.

Map m = Collections.synchronizeMap(hashMap);

MAP는 열거 개체를 통한 반복을 직접 지원하는 대신 컬렉션 뷰를 제공합니다.컬렉션보기는이 섹션의 뒷부분에서 논의 된 바와 같이 인터페이스의 표현력을 크게 향상시킵니다.Map을 사용하면 키, 값 또는 키-값 쌍을 반복할 수 있습니다.Hashtable은 세 번째 옵션을 제공하지 않습니다.MAP는 반복 한가운데 항목을 제거하는 안전한 방법을 제공합니다.해시테이블은 그렇지 않았습니다.마지막으로 Map은 Hashtable 인터페이스의 사소한 결함을 수정합니다.Hashtable에는 contative라는 메소드가 있으며 해시 가능에 주어진 값이 포함 된 경우 True를 반환합니다.이름이 주어지면 해시 테이블에 주어진 키가 포함 된 경우이 메소드가 True를 반환 할 것으로 예상됩니다. 키는 해시 테이블의 기본 액세스 메커니즘이기 때문입니다.MAP 인터페이스는이 메소드가 포함 된 Value의 이름을 바꾸어 이러한 혼란의 소스를 제거합니다.또한 이는 인터페이스의 일관성을 향상시킵니다.

지도 인터페이스

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

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

명심하세요 HashTable JCF(Java Collections Framework)가 도입되기 전의 레거시 클래스였으며 나중에 Map 상호 작용.그랬어요 Vector 그리고 Stack.

따라서 JCF에는 항상 더 나은 대안이 있으므로 새 코드에서는 항상 이러한 코드를 사용하지 마십시오. 다른 사람들이 지적했듯이.

여기는 Java 컬렉션 치트 시트 당신이 유용하다고 생각할 것입니다.회색 블록에는 레거시 클래스 HashTable, Vector 및 Stack이 포함되어 있습니다.

enter image description here

izb가 말한 것 외에도 HashMap null 값을 허용하는 반면 Hashtable 하지 않습니다.

또한 Hashtable 확장합니다 Dictionary 수업은 Javadoc 상태는 더 이상 사용되지 않으며 다음으로 대체되었습니다. Map 상호 작용.

이미 게시된 좋은 답변이 많이 있습니다.몇 가지 새로운 점을 추가하고 요약하겠습니다.

HashMap 그리고 Hashtable 둘 다 저장하는 데 사용됩니다. 키와 값 형식의 데이터.둘 다 해싱 기술을 사용하여 고유 키를 저장합니다.그러나 아래에 나와 있는 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의 차이점은 무엇입니까?

enter image description here

이 차트를 살펴보세요.HashMap 및 Hashtable과 함께 다양한 데이터 구조 간의 비교를 제공합니다.비교는 정확하고 명확하며 이해하기 쉽습니다.

Java 컬렉션 매트릭스

Hashtable 와 비슷하다 HashMap 비슷한 인터페이스를 가지고 있습니다.사용하는 것이 좋습니다 HashMap, 단, 레거시 애플리케이션에 대한 지원이 필요하지 않거나 동기화가 필요한 경우는 제외됩니다. Hashtables 메소드가 동기화됩니다.따라서 귀하의 경우에는 멀티스레딩이 아니기 때문에 HashMaps 최선의 방법입니다.

Hashtable과 hashmap의 또 다른 주요 차이점은 HashMap의 Iterator는 오류가 없는 반면 Hashtable의 열거자는 그렇지 않으며 다른 Thread가 Iterator의 자체 Remove() 메서드를 제외한 모든 요소를 ​​추가하거나 제거하여 맵을 구조적으로 수정하는 경우 ConcurrentModificationException을 발생시킨다는 것입니다.그러나 이는 보장된 동작이 아니며 JVM이 최선의 노력을 다해 수행할 것입니다."

내 출처: http://javarevisited.blogspot.com/2010/10/difference-between-hashmap-and.html

여기에 이미 언급된 다른 모든 중요한 측면 외에도 컬렉션 API(예:지도 인터페이스)는 Java 사양에 대한 "최신 및 최고의" 추가 사항을 준수하기 위해 항상 수정되고 있습니다.

예를 들어 Java 5 Map 반복을 비교해 보세요.

for (Elem elem : map.keys()) {
  elem.doSth();
}

기존 Hashtable 접근 방식과 비교:

for (Enumeration en = htable.keys(); en.hasMoreElements(); ) {
  Elem elem = (Elem) en.nextElement();
  elem.doSth();
}

Java 1.8에서는 또한 오래된 스크립팅 언어처럼 HashMap을 구성하고 액세스할 수 있다고 약속되었습니다.

Map<String,Integer> map = { "orange" : 12, "apples" : 15 };
map["apples"];

업데이트: 아니요, 1.8에는 착륙하지 않습니다...:(

Project Coin의 컬렉션 향상이 JDK8에 포함될 예정인가요?

  • 해시테이블 동기화됩니다. 단일 스레드에서 사용하는 경우 다음을 사용할 수 있습니다. 해시맵, 이는 비동기화된 버전입니다.동기화되지 않은 개체는 종종 성능이 조금 더 좋습니다.그런데 여러 스레드가 HashMap에 동시에 액세스하고 스레드 중 적어도 하나가 맵을 구조적으로 수정하는 경우 외부에서 동기화해야 합니다.다음을 사용하여 동기화되지 않은 맵을 동기화된 맵으로 래핑할 수 있습니다.

    Map m = Collections.synchronizedMap(new HashMap(...));
    
  • HashTable은 null이 아닌 개체만 키 또는 값으로 포함할 수 있습니다.HashMap은 하나의 null 키와 null 값을 포함할 수 있습니다.

  • Map에서 반환된 반복자는 오류가 발생하지 않습니다. 반복자가 생성된 후 언제든지 반복자의 자체 제거 메서드를 통하지 않는 방식으로 맵이 구조적으로 수정되면 반복자는 다음을 발생시킵니다. ConcurrentModificationException.따라서 동시 수정이 발생하는 경우 미래의 결정되지 않은 시간에 임의적이고 비결정적인 동작을 위험에 빠뜨리는 대신 반복자가 빠르고 명확하게 실패합니다. 반면 Hashtable의 키 및 요소 메서드에서 반환된 열거형은 실패하지 않습니다.

  • HashTable과 HashMap은 Java 컬렉션 프레임워크 (Java 2 플랫폼 v1.2부터 HashTable은 Map 인터페이스를 구현하도록 개조되었습니다.)

  • HashTable은 레거시 코드로 간주되며 문서에서는 사용을 권장합니다. 동시해시맵 스레드로부터 안전한 동시 구현이 필요한 경우 Hashtable을 대신합니다.

  • HashMap은 요소가 반환되는 순서를 보장하지 않습니다.HashTable의 경우 동일한 것 같지만 완전히 확실하지는 않습니다. 명확하게 설명하는 리소스를 찾지 못했습니다.

HashMap 그리고 Hashtable 알고리즘에도 상당한 차이가 있습니다.이전에 이에 대해 언급한 사람이 없었기 때문에 이에 대해 언급하게 되었습니다. HashMap 두 가지 크기의 거듭제곱으로 해시 테이블을 구성하고 버킷에 최대 약 8개의 요소(충돌)가 있도록 동적으로 늘리며 일반 요소 유형에 대해 요소를 매우 잘 섞습니다.그러나, 그 Hashtable 구현은 수행 중인 작업을 알고 있는 경우 해싱에 대해 더 좋고 더 세밀한 제어를 제공합니다. 즉, 예를 들어 다음을 사용하여 테이블 크기를 수정할 수 있습니다.값 도메인 크기에 가장 가까운 소수를 선택하면 HashMap보다 성능이 향상됩니다.어떤 경우에는 충돌이 적습니다.

이 질문에서 광범위하게 논의된 명백한 차이점과는 별도로 Hashtable은 해싱을 더 잘 제어할 수 있는 "수동 드라이브" 자동차로 보고 HashMap은 일반적으로 잘 수행되는 "자동 드라이브" 대응 장치로 봅니다.

Hashtable은 동기화되지만 HashMap은 그렇지 않습니다.이로 인해 Hashtable이 Hashmap보다 느려집니다.

스레드되지 않은 앱의 경우 기능 측면에서 동일하므로 HashMap을 사용하십시오.

정보를 바탕으로 여기, HashMap을 사용하는 것이 좋습니다.내 생각에 가장 큰 장점은 반복자를 통해 수행하지 않는 한 Java가 반복하는 동안 이를 수정하는 것을 방지한다는 것입니다.

Collection —때때로 컨테이너라고도 불리는 —은 단순히 여러 요소를 단일 단위로 그룹화하는 개체입니다. Collections는 집계 데이터를 저장, 검색, 조작 및 전달하는 데 사용됩니다.컬렉션 프레임워크 컬렉션을 표현하고 조작하기 위한 통합 아키텍처입니다.

그만큼 HashMap JDK1.2 및 해시테이블 JDK1.0, 둘 다 다음에서 표현되는 개체 그룹을 나타내는 데 사용됩니다. <Key, Value> 쌍.각 <Key, Value> 쌍이 호출됩니다 Entry 물체.항목 컬렉션은 다음 개체에 의해 참조됩니다. HashMap 그리고 Hashtable.컬렉션의 키는 고유하거나 고유해야 합니다.[특정 키의 매핑된 값을 검색하는 데 사용됩니다.컬렉션의 값은 중복될 수 있습니다.]


« 슈퍼클래스, 레거시 및 컬렉션 프레임워크 멤버

Hashtable은 다음에서 소개된 레거시 클래스입니다. JDK1.0, 이는 Dictionary 클래스의 하위 클래스입니다.에서 JDK1.2 해시테이블은 다음을 구현하도록 재설계되었습니다. 지도 인터페이스 컬렉션 프레임워크의 멤버를 만듭니다.HashMap은 도입 초기부터 Java Collection Framework의 구성원이었습니다. JDK1.2.HashMap은 AbstractMap 클래스의 하위 클래스입니다.

public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable { ... }

public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable { ... }

« 초기용량 및 부하율

용량은 해시 테이블에 포함된 버킷의 개수이고, 초기 용량은 단순히 해시 테이블이 생성될 당시의 용량이다.해시 테이블이 열려 있습니다."의 경우hashcollision", 단일 버킷은 순차적으로 검색해야 하는 여러 항목을 저장합니다.로드율은 해시 테이블의 용량이 자동으로 증가하기 전에 얼마나 가득 차도록 허용되는지를 측정한 것입니다.

HashMap은 기본 초기 용량으로 빈 해시 테이블을 구성합니다. (16) 및 기본 부하 계수(0.75)입니다.Hashtable은 기본 초기 용량으로 빈 해시 테이블을 구성합니다. (11) 및 부하율/채우기 비율(0.75).

Hash Map & Hashtable

« 해시 충돌 시 구조 수정

HashMap, Hashtable 해시 충돌이 발생하는 경우 지도 항목을 연결된 목록에 저장합니다. Java8에서 HashMap 해시 버킷이 특정 임계값을 초과하면 해당 버킷은 linked list of entries to a balanced tree.이는 최악의 성능을 O(n)에서 O(log n)으로 향상시킵니다.목록을 이진 트리로 변환하는 동안 해시코드가 분기 변수로 사용됩니다.동일한 버킷에 두 개의 서로 다른 해시코드가 있는 경우 하나는 더 큰 것으로 간주되어 트리 오른쪽으로 이동하고 다른 하나는 왼쪽으로 이동합니다.하지만 두 해시코드가 동일하면 HashMap 키가 비교 가능하다고 가정하고 키를 비교하여 일부 순서가 유지될 수 있도록 방향을 결정합니다.열쇠를 만드는 것이 좋은 습관입니다. HashMap 유사한.버킷 크기가 도달한 경우 항목 추가 시 TREEIFY_THRESHOLD = 8 다음보다 작은 항목을 제거하면 항목의 연결 목록을 균형 트리로 변환합니다. TREEIFY_THRESHOLD 그리고 기껏해야 UNTREEIFY_THRESHOLD = 6 균형 트리를 항목의 연결 목록으로 다시 변환합니다. 자바 8 SRC, 스택포스트

« 컬렉션 뷰 반복, Fail-Fast 및 Fail-Safe

    +--------------------+-----------+-------------+
    |                    | Iterator  | Enumeration |
    +--------------------+-----------+-------------+
    | Hashtable          | fail-fast |    safe     |
    +--------------------+-----------+-------------+
    | HashMap            | fail-fast | fail-fast   |
    +--------------------+-----------+-------------+
    | ConcurrentHashMap  |   safe    |   safe      |
    +--------------------+-----------+-------------+

Iterator 본질적으로 빠른 실패입니다.즉, 컬렉션이 자체의 Remove() 메서드가 아닌 반복 중에 수정되면 ConcurrentModificationException이 발생합니다.반면 Enumeration 본질적으로 안전합니다.반복하는 동안 컬렉션이 수정되면 예외가 발생하지 않습니다.

Java API Docs에 따르면 Iterator는 항상 Enumeration보다 선호됩니다.

메모: Enumeration 인터페이스의 기능은 Iterator 인터페이스에 의해 복제됩니다.또한 Iterator는 선택적 제거 작업을 추가하고 더 짧은 메서드 이름을 갖습니다.새로운 구현에서는 열거형보다 Iterator를 사용하는 것을 고려해야 합니다.

~ 안에 Java 5에는 ConcurrentMap 인터페이스가 도입되었습니다.: ConcurrentHashMap - 고도의 동시성, 고성능 ConcurrentMap 해시 테이블을 기반으로 하는 구현입니다.이 구현은 검색을 수행할 때 절대 차단되지 않으며 클라이언트가 업데이트에 대한 동시성 수준을 선택할 수 있도록 합니다.이는 드롭인 교체용으로 고안되었습니다. Hashtable:구현하는 것 외에도 ConcurrentMap, 이는 고유한 "레거시" 방법을 모두 지원합니다. Hashtable.

  • HashMapEntrys 값은 휘발성 물질 이를 통해 경합 수정 및 후속 읽기에 대한 미세한 일관성을 보장합니다.각 읽기는 가장 최근에 완료된 업데이트를 반영합니다.

  • 반복자와 열거형은 안전합니다. 반복자/열거형 생성 이후 특정 시점의 상태를 반영합니다.이는 일관성을 감소시키는 비용으로 동시 읽기 및 수정을 허용합니다.ConcurrentModificationException을 발생시키지 않습니다.그러나 반복자는 한 번에 하나의 스레드에서만 사용되도록 설계되었습니다.

  • 좋다 Hashtable 하지만 달리 HashMap, 이 클래스는 null을 키나 값으로 사용하는 것을 허용하지 않습니다.

public static void main(String[] args) {

    //HashMap<String, Integer> hash = new HashMap<String, Integer>();
    Hashtable<String, Integer> hash = new Hashtable<String, Integer>();
    //ConcurrentHashMap<String, Integer> hash = new ConcurrentHashMap<>();

    new Thread() {
        @Override public void run() {
            try {
                for (int i = 10; i < 20; i++) {
                    sleepThread(1);
                    System.out.println("T1 :- Key"+i);
                    hash.put("Key"+i, i);
                }
                System.out.println( System.identityHashCode( hash ) );
            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    }.start();
    new Thread() {
        @Override public void run() {
            try {
                sleepThread(5);
                // ConcurrentHashMap  traverse using Iterator, Enumeration is Fail-Safe.

                // Hashtable traverse using Enumeration is Fail-Safe, Iterator is Fail-Fast.
                for (Enumeration<String> e = hash.keys(); e.hasMoreElements(); ) {
                    sleepThread(1);
                    System.out.println("T2 : "+ e.nextElement());
                }

                // HashMap traverse using Iterator, Enumeration is Fail-Fast.
                /*
                for (Iterator< Entry<String, Integer> > it = hash.entrySet().iterator(); it.hasNext(); ) {
                    sleepThread(1);
                    System.out.println("T2 : "+ it.next());
                    // ConcurrentModificationException at java.util.Hashtable$Enumerator.next
                }
                */

                /*
                Set< Entry<String, Integer> > entrySet = hash.entrySet();
                Iterator< Entry<String, Integer> > it = entrySet.iterator();
                Enumeration<Entry<String, Integer>> entryEnumeration = Collections.enumeration( entrySet );
                while( entryEnumeration.hasMoreElements() ) {
                    sleepThread(1);
                    Entry<String, Integer> nextElement = entryEnumeration.nextElement();
                    System.out.println("T2 : "+ nextElement.getKey() +" : "+ nextElement.getValue() );
                    //java.util.ConcurrentModificationException at java.util.HashMap$HashIterator.nextNode
                    //                                          at java.util.HashMap$EntryIterator.next
                    //                                          at java.util.Collections$3.nextElement
                }
                */
            } catch ( Exception e ) {
                e.printStackTrace();
            }
        }
    }.start();

    Map<String, String> unmodifiableMap = Collections.unmodifiableMap( map );
    try {
        unmodifiableMap.put("key4", "unmodifiableMap");
    } catch (java.lang.UnsupportedOperationException e) {
        System.err.println("UnsupportedOperationException : "+ e.getMessage() );
    }
}
static void sleepThread( int sec ) {
    try {
        Thread.sleep( 1000 * sec );
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

« 널 키와 널 값

HashMap 최대 하나의 널 키와 임의 개수의 널 값을 허용합니다.반면 Hashtable 단일 null 키와 null 값도 허용하지 않으며, 키나 값이 null이면 NullPointerException이 발생합니다.

« 동기화, 스레드 안전

Hashtable 내부적으로 동기화됩니다.따라서 매우 안전하게 사용 가능합니다 Hashtable 다중 스레드 응용 프로그램에서.반면 HashMap 내부적으로 동기화되지 않습니다.따라서 사용하는 것이 안전하지 않습니다. HashMap 외부 동기화가 없는 다중 스레드 응용 프로그램에서.외부에서 동기화할 수 있습니다. HashMap 사용하여 Collections.synchronizedMap() 방법.

« 성능

처럼 Hashtable 내부적으로 동기화되므로 Hashtable 것보다 약간 느리다. HashMap.


@보다

스레드 앱의 경우 성능 요구 사항에 따라 ConcurrentHashMap을 사용하여 벗어날 수 있는 경우가 많습니다.

1.Hashmap 그리고 HashTable 키와 값을 모두 저장합니다.

2.Hashmap 하나의 키를 다음과 같이 저장할 수 있습니다. null. Hashtable 저장할 수 없습니다 null.

3.HashMap 동기화되지는 않았지만 Hashtable 동기화됩니다.

4.HashMap 와 동기화할 수 있습니다. Collection.SyncronizedMap(map)

Map hashmap = new HashMap();

Map map = Collections.SyncronizedMap(hashmap);

이미 언급한 차이점 외에도 Java 8부터 HashMap 각 버킷에 사용되는 노드(연결된 목록)를 TreeNodes(레드-블랙 트리)로 동적으로 대체하므로 높은 해시 충돌이 존재하더라도 최악의 경우 검색할 때 ~이다

O(log(n)) HashMap 의에 Hashtable.

*앞서 언급한 개선사항은 적용되지 않았습니다. Hashtable 아직은 그렇지만 HashMap, LinkedHashMap, 그리고 ConcurrentHashMap.

참고로 현재는

  • TREEIFY_THRESHOLD = 8 :버킷에 노드가 8개보다 많으면 연결 목록이 균형 트리로 변환됩니다.
  • UNTREEIFY_THRESHOLD = 6 :버킷이 너무 작아지면(제거 또는 크기 조정으로 인해) 트리가 다시 연결 목록으로 변환됩니다.

HashTable과 HashMap에는 5가지 기본 차이점이 있습니다.

  1. Maps를 사용하면 키, 값 및 키-값 쌍 모두를 반복하고 검색할 수 있습니다. 여기서 HashTable에는 이 모든 기능이 없습니다.
  2. Hashtable에는 사용하기 매우 혼란스러운 함수 contain()이 있습니다.포함의 의미가 약간 벗어나기 때문입니다.키가 포함되어 있는지 아니면 값이 포함되어 있는지 여부는 무엇입니까?이해하기 어렵다.지도에도 마찬가지로 ContainsKey() 및 ContainsValue() 함수가 있는데, 이는 매우 이해하기 쉽습니다.
  3. 해시맵에서는 반복하는 동안 안전하게 요소를 제거할 수 있습니다.해시 테이블에서는 불가능합니다.
  4. HashTable은 기본적으로 동기화되므로 여러 스레드에서 쉽게 사용할 수 있습니다.HashMap은 기본적으로 동기화되지 않으므로 단일 스레드에서만 사용할 수 있습니다.그러나 Collections util 클래스의 syncinizedMap(Map m) 함수를 사용하여 HashMap을 동기화로 변환할 수 있습니다.
  5. HashTable은 null 키나 null 값을 허용하지 않습니다.HashMap은 하나의 null 키와 여러 개의 null 값을 허용합니다.

나의 작은 기여:

  1. 첫 번째이자 가장 중요한 차이점 Hashtable 그리고 HashMap 그게, HashMap 스레드로부터 안전하지 않습니다. Hashtable 스레드로부터 안전한 컬렉션입니다.

  2. 두 번째 중요한 차이점 Hashtable 그리고 HashMap 성능이다. HashMap 동기화되지 않아 다음보다 성능이 더 좋습니다. Hashtable.

  3. 세 번째 차이점 HashtableHashMap 그게 Hashtable 더 이상 사용되지 않는 클래스이므로 사용해야 합니다. ConcurrentHashMap 대신에 Hashtable 자바에서.

해시테이블 더 이상 사용해서는 안되는 jdk의 레거시 클래스입니다.그것의 사용법을 다음으로 바꾸십시오. 동시해시맵.스레드 안전성이 필요하지 않은 경우 다음을 사용하십시오. 해시맵 그렇지 않다 스레드세이프 하지만 속도가 더 빠르고 메모리도 덜 사용합니다.

1) 해시테이블은 동기화되지만 해시맵은 동기화되지 않습니다.2) 또 다른 차이점은 HashMap의 반복자는 안전하지만 Hashtable의 열거자는 그렇지 않다는 것입니다.반복하면서 맵을 변경해 보면 알 수 있습니다.

3) HashMap은 null 값을 허용하지만 Hashtable은 허용하지 않습니다.

해시맵과 해시테이블

  • HashMap 및 HashTable에 대한 몇 가지 중요한 사항입니다.자세한 내용은 아래를 읽어주세요.

1) HASHTABLE 및 HASHMAP 구현 Java.util.map 인터페이스 2) Hashmap 및 Hashtable은 해시 기반 컬렉션입니다.해싱 작업을 하고 있습니다.그래서 이것은 HashMap과 HashTable의 유사성입니다.

  • HashMap과 HashTable의 차이점은 무엇입니까?

1) 첫 번째 차이점은 HashMap은 스레드로부터 안전하지 않지만 HashTable은 ThreadSafe입니다.
2) HashMap은 스레드로부터 안전하지 않기 때문에 성능 측면에서 더 좋습니다.Hashtable 성능은 스레드로부터 안전하기 때문에 더 좋지 않습니다.따라서 여러 스레드가 동시에 Hashtable에 액세스할 수 없습니다.

해시맵:java.util 패키지 내에서 사용 가능한 클래스로 키와 값 형식으로 요소를 저장하는 데 사용됩니다.

해시테이블:컬렉션 프레임워크 내에서 인식되는 레거시 클래스입니다.

Hashtable:

해시테이블 키-값 쌍의 값을 유지하는 데이터 구조입니다.키와 값 모두에 대해 null을 허용하지 않습니다.당신은 얻을 것이다 NullPointerException null 값을 추가하는 경우.동기화됩니다.따라서 비용이 발생합니다.하나의 스레드만 접근 가능 해시테이블 특정 시간에.

:

import java.util.Map;
import java.util.Hashtable;

public class TestClass {

    public static void main(String args[ ]) {
    Map<Integer,String> states= new Hashtable<Integer,String>();
    states.put(1, "INDIA");
    states.put(2, "USA");

    states.put(3, null);    //will throw NullPointerEcxeption at runtime

    System.out.println(states.get(1));
    System.out.println(states.get(2));
//  System.out.println(states.get(3));

    }
}

해시맵:

해시맵 처럼 해시테이블 하지만 키-값 쌍도 허용합니다.키와 값 모두에 대해 null을 허용합니다.성능이 더 좋습니다. HashTable, 이 때문에 unsynchronized.

예:

import java.util.HashMap;
import java.util.Map;

public class TestClass {

    public static void main(String args[ ]) {
    Map<Integer,String> states = new HashMap<Integer,String>();
    states.put(1, "INDIA");
    states.put(2, "USA");

    states.put(3, null);    // Okay
    states.put(null,"UK");

    System.out.println(states.get(1));
    System.out.println(states.get(2));
    System.out.println(states.get(3));

    }
}

HashMaps는 동기화의 자유를 제공하며 디버깅이 훨씬 더 쉽습니다.

HashMap 에뮬레이션되므로 다음에서 사용할 수 있습니다. GWT client code 반면 Hashtable 아니다.

동기화 또는 스레드 안전 :

해시 맵은 동기화되지 않으므로 스레드 안전하지 않으며 적절한 동기화 블록 없이 여러 스레드 간에 공유할 수 없습니다. 반면 해시 테이블은 동기화되므로 스레드 안전합니다.

Null 키 및 Null 값 :

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

값 반복:

HashMap의 Iterator는 빠른 속도의 반복자이지만 Hashtable의 열거자는 그렇지 않으며 다른 Thread가 Iterator의 자체 Remove() 메서드를 제외한 요소를 추가하거나 제거하여 맵을 구조적으로 수정하는 경우 ConcurrentModificationException을 발생시킵니다.

슈퍼클래스와 레거시 :

HashMap은 AbstractMap 클래스의 하위 클래스인 반면 Hashtable은 Dictionary 클래스의 하위 클래스입니다.

성능 :

HashMap은 동기화되지 않으므로 Hashtable에 비해 속도가 빠릅니다.

나타내다 http://modernpathshala.com/Article/1020/difference-between-hashmap-and-hashtable-in-java Java 컬렉션과 관련된 예와 인터뷰 질문 및 퀴즈

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