programing

Java의 해시맵과 해시테이블의 차이점은 무엇입니까?

bestcode 2022. 8. 25. 23:56
반응형

Java의 해시맵과 해시테이블의 차이점은 무엇입니까?

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

스레드화되지 않은 어플리케이션에서는 어떤 것이 더 효율적입니까?

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

  1. Hashtable동기화된 반면,HashMap렇지않않 않않않다다 하면 렇렇이 됩니다.HashMap일반적으로 동기화되지 않은 개체는 동기화된 개체보다 성능이 좋기 때문에 스레드되지 않은 애플리케이션에 적합합니다.

  2. Hashtable하지 않다null아, 아, 아, 아, 아, 아, 아, 아, 아.HashMapnull 및 " " " "null★★★★★★ 。

  3. HashMap의 서브클래스 중 하나는 입니다.따라서 예측 가능한 반복 순서(기본적으로 삽입 순서)가 필요한 경우 쉽게 교환할 수 있습니다.HashMap잠 a LinkedHashMap 하면 것 같아요.Hashtable.

않기 때문에,는 「동기」를 합니다.HashMap동기화가 문제가 되는 경우는, 을 참조해 주세요.

많은 답변이 해시 테이블이 동기화되어 있음을 나타냅니다.실제로는, 이것으로 얻는 것이 거의 없다.동기화는 액세스/변환기 메서드에 의해 맵에서2개의 스레드가 동시에 추가 또는 삭제되지 않게 됩니다만, 실제 환경에서는 많은 경우 추가 동기화가 필요하게 됩니다.

후 풋(check put)'이라는은 '체크 후 풋(check then put)'에Map아직 존재하지 않는 경우 추가합니다..Hashtable ★★★★★★★★★★★★★★★★★」HashMap.

하게 동기화된 「」HashMap하다

Collections.synchronizedMap(myMap);

그러나 이 논리를 올바르게 구현하려면 폼의 추가 동기화가 필요합니다.

synchronized(myMap) {
    if (!myMap.containsKey("tomato"))
        myMap.put("tomato", "red");
}

에 대한 반복도Hashtable의 엔트리 「」)HashMapobtained obtained by Collections.synchronizedMap은 ( ), ( ), ( ), ( ), ( ), ( ), ( ), ( ), ( ), ( ), ( ), ( ), ( ), ( ), ( )는 스레드 세이프가 아닙니다.Map추가 동기화를 통해 수정되지 않도록 합니다.

인터페이스의 실장(예를 들면 )에서는, 다음과 같은 스레드 세이프 체크액션의 시멘틱스가 포함되어 있기 때문에, 이 문제의 일부를 해결할 수 있습니다.

ConcurrentMap.putIfAbsent(key, value);

Hashtable레거시 코드로 간주됩니다.도 없다Hashtable that that that that that HashMap 는는의ationsationsationsations의 HashMap코드의 , , 아,,,,,, ,,, , , , ,,,, , , ,로 돌아갈 이유가 Hashtable.

이 질문은 후보자가 컬렉션 클래스의 올바른 사용법을 이해하고 있는지, 사용 가능한 대체 솔루션을 알고 있는지 확인하기 위해 면접에서 자주 질문됩니다.

  1. HashMap 클클entententent에 Hashtable이며, null.dl하고 있는 을 제외합니다HashMap에서는 늘 키 및 할 수 있습니다.반면, 「키 및 값」은 「키 및 값」으로 사용할 수 있습니다.Hashtable하지 않다null
  2. HashMap는 맵의 순서가 시간이 지남에 따라 일정하게 유지되는 것을 보증하지 않습니다.
  3. HashMap 않습니다만, 「비동기화」는, 「비동기화」입니다.Hashtable동기화되어 있습니다.
  4. HashMap는 Fail Safe 에 가 됩니다.Hashtable, 던지다ConcurrentModificationException, 그 이외의 를 추가 했을 경우.Iterator님 'remove() 의 노력을 기울여 됩니다.그러나 이는 보장된 동작이 아니며 JVM이 최선을 다해 수행합니다.

몇 가지 중요한 용어에 대한 주의:

  1. Synchronized는 한 시점에서 하나의 스레드만 해시 테이블을 수정할 수 있음을 의미합니다.를에 모든 가 "업데이트"를합니다.Hashtable다른 사용자가 잠금이 해제되기를 기다리는 동안 객체에 대한 잠금을 획득해야 합니다.
  2. 페일 세이프컬렉션 오브젝트에 반복기가 생성되어 있고 다른 스레드가 컬렉션 오브젝트를 구조적으로 수정하려고 하면 동시 수정 예외가 느려집니다. 다른 에서도 이 명령어를 할 수 .setmethod는 컬렉션을 "비정상적으로" 수정하지 않기 때문에 method를 사용합니다. 「」를 호출하기 에, 「」를 참조해 주세요.set구조적으로 IllegalArgumentException던져질 것이다.
  3. 구조변경은 지도의 구조를 효과적으로 바꿀 수 있는 요소를 삭제하거나 삽입하는 것을 말한다.

HashMap할 수

Map m = Collections.synchronizeMap(hashMap);

맵은 Enumeration 객체를 통한 반복을 직접 지원하는 대신 컬렉션 뷰를 제공합니다.이 섹션의 후반부에서 설명하듯이 컬렉션뷰는 인터페이스의 표현성을 크게 향상시킵니다.,값페어를 할 수 있습니다.키, 값, 키와 값의 페어를 할 수 있습니다.Hashtable에서는 세 번째 옵션이 제공되지 않습니다.은 반복할 수 방법을 제공합니다.Hashtable맵의 작은 .Hashtable인터페이스입니다. Hashtablecontains라는 이는 contains에 되어 있으면 true를 합니다.사실Hashtable에는 소정의 값이 포함되어 있습니다. '참이면 '참이Hashtable키가 '키의에는 특정 되어 있습니다.Hashtable. 는 메서드의 을 Map으로 변경함으로써 이containsValue됩니다( 「 」 , 「 」 。containsValuecontainsKey.

맵 인터페이스

HashMap의 : " " "Map해시 코드를 사용하여 어레이를 인덱싱하는 인터페이스입니다. Hashtable1998년API를 사용하다

멀리 떨어져 게 거야.Hashtable의 경우동기화에 싱글 스레드 애플리케이션의 경우 동기화에 따른 추가 오버헤드가 필요하지 않습니다.동시성이 높은 애플리케이션의 경우 편집성 동기로 인해 부족, 교착 상태 또는 불필요한 가비지 수집이 일시 중지될 수 있습니다.와 같이, 은 ""를 사용할 수 .ConcurrentHashMap★★★★★★ 。

주의해 주세요HashTable Framework에 JCF(Java Collections Framework)를 되었습니다.Map인터페이스입니다. 그랬다Vector ★★★★★★★★★★★★★★★★★」Stack

따라서 JCF에는 다른 사람들이 지적한 것처럼 항상 더 나은 대안이 있기 때문에 새로운 코드에서는 항상 이러한 코드로부터 떨어져 있어야 합니다.

여기 Java 컬렉션 치트 시트입니다.회색 블록에는 레거시 클래스 HashTable, Vector 및 Stack이 포함되어 있습니다.

enter image description here

이미 좋은 답변들이 많이 올라오고 있어요.몇 가지 새로운 점을 추가하여 요약하고 있습니다.

HashMap ★★★★★★★★★★★★★★★★★」Hashtable둘 다 와 값 형식으로 데이터를 저장하는 데 사용됩니다.둘 다 해시 기술을 사용하여 고유한 키를 저장합니다.그러나 HashMap 클래스와 Hashtable 클래스에는 다음과 같은 많은 차이가 있습니다.

해시 맵

  1. HashMap이치노스레드화되지 않아 적절한 동기화 코드가 없으면 많은 스레드 간에 공유할 수 없습니다.
  2. HashMap그럼 1개의 늘키와 여러 개의 늘값을 사용할 수 있습니다.
  3. HashMap 1입니다.
  4. HashMap★★★★★★★★★★★★★★★★★★.
  5. ''는 ''가 될 수 있어요.HashMap this code(이 됨)
    Map m = Collections.synchronizedMap(HashMap);
  6. HashMap는 반복기에 의해 통과됩니다.
  7. 터の の [ 。HashMap실패가 빠르다.
  8. HashMapAbstract Map 。

해시 테이블

  1. Hashtable동기화되어 있습니다.스레드 세이프이며, 많은 스레드와 공유할 수 있습니다.
  2. Hashtable에서는 늘 키 또는 값을 사용할 수 없습니다.
  3. Hashtable을 사용하다
  4. Hashtable
  5. Hashtable는 내부적으로 동기화되어 있기 때문에 비동기화할 수 없습니다.
  6. Hashtable열거자, 반복자, 반복자
  7. HashtableFail Fast(빠르다)
  8. Hashtable는 딕셔너리 클래스를 상속합니다.

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

enter image description here

이 차트를 보세요. 다양한 할 수 있습니다.HashMap ★★★★★★★★★★★★★★★★★」Hashtable비교는 정확하고 명확하며 이해하기 쉽다.

Java 컬렉션 매트릭스

말한 것 에, izb가 것은HashMap값을 할 수 늘 값은 사용할 수 없습니다.Hashtable지지않않않않

, 「 」, 「 」라고 하는 도 주의해 주세요.Hashtable Dictionary클래스는 Javadocs 상태로 사용되지 않고Map인터페이스입니다.

Hashtable 해서 '비슷비슷한 표현이에요.HashMap및 같은 인터페이스를 갖추고 있습니다. 하다를 사용하는 것이 .HashMap에 대한 또는 가 필요한 경우를 「」는 「」로 합니다.Hashtables메서드가 동기화됩니다.아니므로, 이 경우 멀티스레딩이 아니게 .HashMaps최선의 선택이야

Hashtable 되어 있는데 , 「」는, 「」입니다.HashMap그렇지 않다. 그러면HashtableHashmap.

어플리케이션의 는, 「」를 합니다.HashMap그 외에는 기능 면에서 동일하기 때문입니다.

해시테이블과 해시맵의 다른 주요 차이점은 해시맵의 반복기는 fail-fast이지만 해시테이블의 열거자는 fail-fast가 아닌 Concurrent Modification을 슬로우한다는 것입니다.다른 스레드가 Iterator 자신의 remove() 메서드 이외의 요소를 추가 또는 삭제하여 구조적으로 맵을 변경하는 경우 예외입니다.그러나 이는 보장된 동작은 아니며 JVM이 최선을 다해 수행할 것입니다."

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

여기에 이미 언급된 다른 모든 중요한 측면 외에도 Collections API(맵 인터페이스 등)는 Java 사양에 추가된 "최신 및 최대"에 적합하도록 항상 수정되고 있습니다.

예를 들어 Java 5 Map 반복을 비교합니다.

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

기존 해시 테이블 접근 방식과 비교:

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

Java 1.8에서는 이전 스크립트 언어처럼 HashMaps를 구축하고 액세스할 수 있습니다.

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

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

Project Coin의 컬렉션 확장 기능은 JDK8에 포함됩니까?

  • HashTable은 동기화되어 있습니다.단일 스레드에서 사용하는 경우 동기화되지 않은 버전인 HashMap을 사용할 수 있습니다.동기화되지 않은 객체의 성능이 약간 향상되는 경우가 많습니다.덧붙여서 여러 스레드가 동시에 HashMap에 접속하여 적어도 하나의 스레드가 맵을 구조적으로 수정하는 경우에는 외부에서 동기화해야 합니다.Yoon은 다음을 사용하여 동기화되지 않은 맵을 동기화된 맵으로 래핑할 수 있습니다.

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

  • 후 경우(방식을 하고) 는 Map을 . 반복기 작성 후 언제든지 맵이 구조적으로 변경되면 반복기 자체의 제거 방법을 제외하고 반복기는 반복기를 던집니다.ConcurrentModificationException따라서 동시 변경에 직면했을 경우, 향후의 결정적이지 않은 임의의 동작의 위험을 감수하지 않고, 리터레이터는 신속하고 깔끔하게 실패합니다.반면 해시테이블의 키 및 요소 메서드에서 반환되는 열거는 실패 속도가 빠르지 않습니다.

  • HashTable과 HashMap은 Java Collections Framework의 멤버입니다(Java 2 플랫폼 v1.2 이후 HashTable은 맵인터페이스를 구현하기 위해 개조되었습니다).

  • HashTable은 레거시 코드로 간주됩니다.이 문서에서는 스레드 세이프 고동시 구현이 필요한 경우 Hashtable 대신 ConcurrentHashMap을 사용하도록 권장하고 있습니다.

  • HashMap은 요소가 반환되는 순서를 보장하지 않습니다.HashTable도 마찬가지라고 생각합니다만, 확실히는 모르겠습니다만, 그것을 명확하게 기술하고 있는 리소스는 찾을 수 없습니다.

HashMap ★★★★★★★★★★★★★★★★★」Hashtable알고리즘적으로도 상당한 차이가 있습니다.지금까지 아무도 이 얘기를 하지 않았기 때문에 그 얘기를 꺼냅니다. HashMap는 두 가지 크기의 거듭제곱을 가진 해시 테이블을 작성하고 버킷에 최대 8개의 요소(충돌)를 포함할 수 있도록 동적으로 증가시켜 일반적인 요소 유형에 맞게 요소를 매우 잘 교반합니다. 「」, 「」는Hashtable구현에서는 해시를 보다 세밀하게 제어할 수 있습니다.즉, 값 도메인 크기에 가장 가까운 소수(prime number)를 사용하여 테이블 크기를 수정할 수 있습니다.이를 통해 HashMap보다 성능이 향상됩니다(경우에 따라서는 충돌이 감소합니다).

이 질문에서 광범위하게 논의된 명백한 차이와는 별개로, 해시 테이블을 해시를 더 잘 제어할 수 있는 "수동 드라이브" 자동차로, 해시 맵을 일반적으로 잘 작동하는 "자동 드라이브" 차량으로 봅니다.

정보를 바탕으로 HashMap을 추천합니다.가장 큰 장점은 반복기를 통해 수정하지 않는 한 반복 중에 자바가 수정하지 못하게 한다는 것입니다.

A(컨테이너라고도 함)는 여러 요소를 하나의 단위로 그룹화하는 단순한 개체입니다. Collection는 집약 데이터의 저장, 취득, 조작 및 통신에 사용됩니다.컬렉션 프레임워크는 컬렉션을 표현하고 조작하기 위한 통합 아키텍처입니다.

HashMap JDK1.2 및 Hashtable은 둘 다 에서 나타내는 오브젝트 그룹을 나타내기 위해 사용됩니다.<Key, Value>.<Key, Value>은 쌍이라고 .Entry 엔트리의 대상.HashMap ★★★★★★★★★★★★★★★★★」Hashtable 컬렉션의 키는 고유하거나 고유해야 합니다.[이러한 키를 사용하여 매핑된 값을 검색할 수 있습니다.]]]]]]]]]]]]]]]]]]] 【속담】


« Superclass, 레거시 및 수집 프레임워크 멤버

은 에 입니다.JDK1.0사전하위 클래스입니다 클래스의.부터부터JDK1.2해시 테이블은 Map 인터페이스를 구현하여 컬렉션 프레임워크의 멤버로 만들도록 재설계되었습니다.HashMap은 Java Collection Framework의 멤버입니다.JDK1.2그 AbstractMap 클래스의. HashMap은 아강으로 분류하다.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 { ... }

« 초기 용량 및 부하 계수

양동이의 해시 표의 용량은 번호 및 해시 테이블이 있created.capacity는해시테이블내의 버킷 수입니다 그 당시 초기 용량은 단순히 용량.초기capacity는 단순히작성 시점의 capacity입니다 테이블 해시.해시 테이블 열고``해시 테이블이의 경우것에 주의해 주세요 있는 열려습니다.hash collision"는 1개의 버킷에 여러 엔트리가 저장되어 있습니다.이 엔트리는 순차적으로 검색해야 합니다.로드 팩터는 해시 테이블의 용량이 자동으로 증가하기 전에 해시 테이블이 얼마나 가득 찰 수 있는지를 나타내는 척도입니다.

HashMap은 기본 초기 용량(16)과 기본 부하 계수(0.75)를 사용하여 빈 해시 테이블을 구성합니다.여기서 Hashtable은 기본 초기 용량(11)과 부하 계수/채움 비율(0.75)을 사용하여 빈 해시 테이블을 구성합니다.

Hash Map & Hashtable

« 해시 충돌 시 구조 수정

HashMap,,Hashtable해시 충돌의 경우 맵 엔트리가 링크 목록에 저장됩니다.Java8에서 해시 버킷이 특정 임계값을 초과할 경우 해당 버킷은 에서 전환되며 최악의 경우 O(n)에서 O(log n)로 성능이 향상됩니다.목록을 바이너리 트리로 변환할 때 해시 코드가 분기 변수로 사용됩니다.같은 버킷에 2개의 다른 해시 코드가 있는 경우 하나는 더 큰 것으로 간주되어 트리의 오른쪽, 다른 하나는 왼쪽으로 이동합니다.하지만 두 해시코드가 같으면HashMap는 키가 비교 가능한 것을 전제로 키를 비교하여 순서를 유지할 수 있도록 방향을 결정합니다.'키는 '키'를 만드는 .HashMap 동등.버킷 크기가 다음 크기에 도달한 경우 항목 추가TREEIFY_THRESHOLD = 8TREEIFY_THRESHOLDUNTREEIFY_THRESHOLD = 6는 균형 트리를 링크된 엔트리 목록으로 다시 변환합니다.Java 8 SRC, stackpost

« 수집 뷰 반복, Fail-Fast 및 Fail-Safe

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

Iterator 즉, Concurrent Modification을 슬로우합니다.자체 remove() 메서드 이외의 반복 중에 컬렉션이 변경된 경우 예외입니다.자연이 안전할 수 있는 곳이죠반복하는 동안 컬렉션이 수정되어도 예외가 발생하지 않습니다.

Java API Docs에 따르면 반복기는 항상 Enumeration보다 우선됩니다.

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

Java 5에서 도입된 ConcurrentMap 인터페이스:ConcurrentHashMap 퍼포먼스, 퍼포먼스 동시 - 하이 퍼포먼스ConcurrentMap해시 테이블을 통해 구현됩니다.이 구현에서는 검색을 수행할 때 차단되지 않으며 클라이언트는 업데이트의 동시성 수준을 선택할 수 있습니다.이것은, 의 드롭 인 교환을 목적으로 하고 있습니다.Hashtable에 : 「 」ConcurrentMap"비활성화" 에 고유한 "비활성화" 방식을 모두 지원합니다.Hashtable.

  • ★★HashMapEntrys 값은 변동성이 있기 때문에 경합된 수정 및 후속 읽기에 대해 미세한 정합성이 확보됩니다.각 판독치는 가장 최근에 완료된 업데이트를 반영합니다.

  • 반복기 및 열거는 Fail Safe입니다.반복기/계수 작성 이후의 상태를 반영합니다.이것에 의해, 일관성의 저하를 수반해 읽기와 수정을 동시에 실시할 수 있습니다.Concurrent Modification은 슬로우하지 않습니다.예외.그러나 반복기는 한 번에 하나의 스레드에서만 사용하도록 설계되었습니다.

  • 맘에 들다Hashtable, 하하 but but와는 달리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그럼 최대 1개의 늘키와 임의의 수의 늘 값을 사용할 수 있습니다.서 ★★★★★★★★★★★★★★★」Hashtable하나의 null 키와 null 값도 허용하지 않습니다. 키 또는 값이 null이면 Null Pointer가 느려집니다.예외.Example

« 동기화, 스레드 세이프

Hashtable는 내부적으로 동기화됩니다. 때문에하다고 할 수 .Hashtable멀티 스레드 어플리케이션에서 사용할 수 있습니다.서 ★★★★★★★★★★★★★★★」HashMap는 내부적으로 동기화되지 않습니다.따라서 사용하기에 안전하지 않습니다.HashMap멀티 스레드 어플리케이션에서 사용할 수 있습니다.으로 동기화할 수 .HashMap를 사용합니다.Collections.synchronizedMap()★★★★★★ 。

« 성능

~로Hashtable동기화되어 에, 「동기가 됩니다.」가 됩니다.Hashtable HashMap.


@ 참조

스레드 애플리케이션의 경우 성능 요구사항에 따라 Concurrent Hash Map을 사용할 수 있습니다.

1.Hashmap ★★★★★★★★★★★★★★★★★」HashTable키와 값을 저장합니다.

2.Hashmap를 할 수 .nullHashtable이 안 되다null.

3.HashMap되어 있지 않습니다만, 「동기가 되지 않습니다」Hashtable동기화되어 있습니다.

4.HashMap 수 있다Collection.SyncronizedMap(map)

Map hashmap = new HashMap();

Map map = Collections.SyncronizedMap(hashmap);

설명한 8 이후 Java 8은 Java 8이라는 점에 .HashMap는 각 버킷에서 사용되는 노드(링크 리스트)를 TreeNodes(빨간색-검은색 트리)로 동적으로 치환하기 때문에 높은 해시 콜리전이 존재하는 경우에도 검색 시 최악의 경우는 다음과 같습니다.

O(log(n)) 대상HashMap O(n)와 O(nHashtable.

* 상기의 개선은 미적용Hashtable아직이지만, 에 한해서HashMap,LinkedHashMap,그리고.ConcurrentHashMap.

참고로 현재

  • TREEIFY_THRESHOLD = 8: 버킷에 8개 이상의 노드가 포함된 경우 링크된 목록이 균형 트리로 변환됩니다.
  • UNTREEIFY_THRESHOLD = 6: 버킷이 너무 작아지면(삭제 또는 크기 변경으로 인해) 트리는 링크된 목록으로 다시 변환됩니다.

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

  1. 맵을 사용하면 키, 값 및 두 키-값 쌍 모두를 반복하고 검색할 수 있습니다. 여기서 HashTable에는 이러한 기능이 모두 없습니다.
  2. Hashtable에는 함수가 contains()를 포함하고 있어 사용하기 매우 어렵습니다.왜냐하면 contains의 의미가 약간 어긋나기 때문입니다.키가 포함되어 있는지, 값이 포함되어 있는지를 확인합니다.이해하기 어렵다.맵에서도 마찬가지로 이해하기 쉬운 ContainsKey() 및 ContainsValue() 함수가 있습니다.
  3. 해시맵에서는 반복하는 동안 안전하게 요소를 제거할 수 있습니다.해시 테이블에서는 불가능하기 때문입니다.
  4. HashTables는 기본적으로 동기화되어 있기 때문에 여러 스레드에서 쉽게 사용할 수 있습니다.여기서 HashMaps는 기본적으로 동기화되지 않으므로 단일 스레드에서만 사용할 수 있습니다.그러나 Collections util 클래스의 synchronizedMap(Map m) 함수를 사용하여 HashMap을 동기화할 수 있습니다.
  5. HashTable은 null 키 또는 null 값을 허용하지 않습니다.여기서 HashMap은 1개의 늘키와 여러 개의 늘 값을 허용합니다.

나의 작은 공헌:

  1. 첫 번째와 가장 중요한 차이점은Hashtable그리고.HashMap그게 뭐냐면HashMap이 경우 스레드 세이프가 아닙니다.Hashtable스레드 세이프 컬렉션입니다.

  2. 두 번째로 중요한 차이점Hashtable그리고.HashMap퍼포먼스입니다.HashMap동기화되어 있지 않습니다.Hashtable.

  3. 세 번째 차이점HashtableHashMap그것이다Hashtable오래된 클래스이므로ConcurrentHashMap대신해서Hashtable자바어.

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

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

  1. Hashtable동기화된 반면,HashMap그렇지 않습니다.
  2. 또 다른 차이점은 I/O/O/O/O/O/O/O/O/O의HashMap에 대한 열거자를 사용하는 동안 Fail Safe가 됩니다.Hashtable아니에요. 반복하면서 지도를 바꾸면 알 수 있어요.
  3. HashMap는 null 값을 허용합니다.HashtableDoesn't.

HashTable은 jdk의 레거시 클래스이며 더 이상 사용하지 않아야 합니다.사용법을 ConcurrentHashMap으로 바꿉니다.스레드 안전이 필요하지 않은 경우 스레드 세이프가 아닌 고속으로 메모리 사용량이 적은 HashMap을 사용하십시오.

해시맵 및 해시테이블

  • HashMap 및 HashTable에 대한 몇 가지 중요한 점. 아래 내용을 읽어보시기 바랍니다.

1) 해시테이블과 해시맵은 java.util을 구현합니다.맵 인터페이스 2) 해시맵과 해시테이블은 모두 해시베이스 컬렉션입니다.해시 작업을 하고 있습니다.이것들은 HashMap과 HashTable의 유사성입니다.

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

1) 첫 번째 차이점은 HashMap은 스레드 세이프가 아닌 반면 HashTable은 스레드 세이프입니다.
2) HashMap은 스레드 세이프가 아니기 때문에 퍼포먼스가 우수합니다.반면 해시 테이블 퍼포먼스는 스레드 세이프이기 때문에 향상되지 않습니다.따라서 여러 스레드가 동시에 해시 테이블에 액세스할 수 없습니다.

HashMapHashtable은 둘 다 키와 값 형식으로 데이터를 저장하는 데 사용됩니다.둘 다 해시 기술을 사용하여 고유한 키를 저장합니다.HashMap 클래스와 Hashtable 클래스 사이에는 다음과 같은 많은 차이가 있습니다.

enter image description here

Hashtable:

해시 테이블은 키-값 쌍의 값을 유지하는 데이터 구조입니다.키와 값 모두에 대해 null을 사용할 수 없습니다.당신은 그것을 얻을 것입니다.NullPointerExceptionnull 값을 추가할 경우.동기화되어 있습니다.따라서 비용이 수반됩니다.한 번에 하나의 스레드만 HashTable에 액세스할 수 있습니다.

:

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));

    }
}

해시 맵:

HashMap해시테이블과 비슷하지만 키 값 쌍도 받아들입니다.키와 값 모두에 대해 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));

    }
}

오래된 고전적인 토픽입니다.다음 내용을 설명하는 도움이 되는 블로그를 추가하려고 합니다.

http://blog.manishchhabra.com/2012/08/the-5-main-differences-betwen-hashmap-and-hashtable/

매니시 차브라 블로그

HashMap과 Hashtable의 5가지 주요 차이점

HashMap과 Hashtable은 둘 다 java.util을 구현합니다.맵 인터페이스이지만 Java 개발자가 보다 효율적인 코드를 작성하기 위해 이해해야 하는 몇 가지 차이점이 있습니다.Java 2 플랫폼 v1.2에서 Hashtable 클래스는 맵인터페이스를 구현하도록 개조되어 Java Collections Framework의 멤버가 되었습니다.

  1. HashMap과 Hashtable의 주요 차이점 중 하나는 HashMap이 동기화되지 않은 반면 Hashtable은 동기화되지 않았다는 것입니다. 즉, Hashtable은 스레드 안전하며 여러 스레드 간에 공유할 수 있지만 적절한 동기화 없이는 HashMap을 여러 스레드 간에 공유할 수 없습니다.Java 5는 Hashtable의 대안으로 Java의 Hashtable보다 뛰어난 확장성을 제공하는 ConcurrentHashMap을 도입했습니다.Synchronized는 한 시점에서 하나의 스레드만 해시 테이블을 수정할 수 있음을 의미합니다.기본적으로 해시테이블에 대한 업데이트를 수행하기 전에 모든 스레드는 오브젝트에 대한 잠금을 취득해야 하며 다른 스레드는 잠금이 해제되기를 기다립니다.

  2. HashMap 클래스는 Null을 허용한다는 점을 제외하고 Hashtable과 거의 동일합니다(HashMap은 null 값을 키 및 값으로 허용하지만 Hashtable은 null을 허용하지 않습니다).

  3. HashMap과 Hashtable의 세 번째 중요한 차이점은 HashMap의 Iterator는 Fail-Fast Iterator이지만 Hashtable의 Enumerator는 Fail-Fast Iterator이며 Concurrent Modification을 슬로우한다는 것입니다.다른 스레드가 Iterator 자신의 remove() 메서드 이외의 요소를 추가 또는 삭제하여 구조적으로 맵을 변경하는 경우 예외입니다.그러나 이는 보장된 동작이 아니며 JVM이 최선을 다해 수행합니다.이는 Java에서 Enumeration과 Iterator의 중요한 차이이기도 합니다.

  4. Hashtable과 HashMap의 또 다른 차이점은 스레드 안전성 및 동기화 때문에 싱글 스레드 환경에서 사용하는 경우 HashMap보다 해시테이블이 훨씬 느리다는 것입니다.따라서 동기화가 필요하지 않고 HashMap이 하나의 스레드에서만 사용되는 경우 Java에서 Hashtable을 수행합니다.

  5. HashMap은 맵의 순서가 일정하게 유지되는 것을 보증하지 않습니다.

HashMap은 다음 방법으로 동기화할 수 있습니다.

Map m = Collections.synchronizedMap(hashMap);

요약에서 Java의 Hashtable과 HashMap 사이에는 스레드 안전성과 속도 등의 큰 차이가 있습니다.또한 이를 바탕으로 Java 5를 실행하고 있는 경우에는 Java에서 Concurrent HashMap을 사용하는 것을 검토해 주십시오.

동기화 또는 스레드 세이프:

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

null 키 및 null 값:

HashMap에서는 1개의 늘키와 임의의 수의 늘 값을 사용할 수 있습니다.해시 테이블에서는 null 키 또는 값을 사용할 수 없습니다.

값 반복:

HashMap의 반복자는 Fail-Fast 반복자이지만 Hashtable의 열거자는 Fail-Fast 반복자이며 ConcurrentModification을 슬로우합니다.다른 스레드가 Iterator 자신의 remove() 메서드 이외의 요소를 추가 또는 삭제하여 구조적으로 맵을 변경하는 경우 예외입니다.

슈퍼클래스와 레거시:

HashMap은 AbstractMap 클래스의 하위 클래스이고 Hashtable은 Dictionary 클래스의 하위 클래스입니다.

퍼포먼스:

HashMap은 동기화되어 있지 않기 때문에 Hashtable에 비해 속도가 빠릅니다.

Java 컬렉션에 관한 예, 인터뷰 질문 및 퀴즈는 http://modernpathshala.com/Article/1020/difference-between-hashmap-and-hashtable-in-java을 참조하십시오.

언급URL : https://stackoverflow.com/questions/40471/what-are-the-differences-between-a-hashmap-and-a-hashtable-in-java

반응형