[java] HashMap, LinkedHashMap 및 TreeMap의 차이점

차이점은 무엇이며 HashMap, LinkedHashMap그리고 TreeMap자바는? 세 가지 모두 keySet와와 같이 출력에 차이가 보이지 않습니다 values. HashtableS 는 무엇입니까 ?

Map m1 = new HashMap();
m1.put("map", "HashMap");
m1.put("schildt", "java2");
m1.put("mathew", "Hyden");
m1.put("schildt", "java2s");
print(m1.keySet());
print(m1.values());

SortedMap sm = new TreeMap();
sm.put("map", "TreeMap");
sm.put("schildt", "java2");
sm.put("mathew", "Hyden");
sm.put("schildt", "java2s");
print(sm.keySet());
print(sm.values());

LinkedHashMap lm = new LinkedHashMap();
lm.put("map", "LinkedHashMap");
lm.put("schildt", "java2");
lm.put("mathew", "Hyden");
lm.put("schildt", "java2s");
print(lm.keySet());
print(lm.values());



답변

세 클래스 모두 Map인터페이스를 구현하고 대부분 동일한 기능을 제공합니다. 가장 중요한 차이점은 항목을 반복하는 순서입니다.

  • HashMap반복 순서를 보장하지 않습니다. 새로운 요소가 추가되면 완전히 바뀔 수 있습니다.
  • TreeMapcompareTo()방법 (또는 외부 제공 Comparator) 에 따라 키의 “자연 순서”에 따라 반복됩니다 . 또한 SortedMap이 정렬 순서에 의존하는 메소드가 포함 된 인터페이스를 구현합니다 .
  • LinkedHashMap 항목이 맵에 배치 된 순서대로 반복됩니다.

“해시 테이블” 은 해시 기반 맵의 일반 이름입니다. Java API와 관련
Hashtable하여 컬렉션 프레임 워크가 존재하기 전에 Java 1.1 시절부터 사용되지 않는 클래스입니다. API는 기능을 복제하는 더 이상 사용되지 않는 메소드로 어수선 해지며 메소드가 동기화되므로 성능이 저하되고 일반적으로 쓸모가 없습니다. Hashtable 대신 ConcurrentHashMap 을 사용하십시오 .


답변

나는 시각적 인 프리젠 테이션을 선호합니다 :

╔══════════════╦═════════════════════╦═══════════════════╦═════════════════════╗
║   Property   ║       HashMap       ║      TreeMap      ║     LinkedHashMap   ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║ Iteration    ║  no guarantee order ║ sorted according  ║                     ║
║   Order      ║ will remain constant║ to the natural    ║    insertion-order  ║
║              ║      over time      ║    ordering       ║                     ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║  Get/put     ║                     ║                   ║                     ║
║   remove     ║         O(1)        ║      O(log(n))    ║         O(1)        ║
║ containsKey  ║                     ║                   ║                     ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║              ║                     ║   NavigableMap    ║                     ║
║  Interfaces  ║         Map         ║       Map         ║         Map         ║
║              ║                     ║    SortedMap      ║                     ║
╠══════════════╬═════════════════════╬═══════════════════╬═════════════════════╣
║              ║                     ║                   ║                     ║
║     Null     ║       allowed       ║    only values    ║       allowed       ║
║ values/keys  ║                     ║                   ║                     ║
╠══════════════╬═════════════════════╩═══════════════════╩═════════════════════╣
║              ║   Fail-fast behavior of an iterator cannot be guaranteed      ║
║   Fail-fast  ║ impossible to make any hard guarantees in the presence of     ║
║   behavior   ║           unsynchronized concurrent modification              ║
╠══════════════╬═════════════════════╦═══════════════════╦═════════════════════╣
║              ║                     ║                   ║                     ║
║Implementation║      buckets        ║   Red-Black Tree  ║    double-linked    ║
║              ║                     ║                   ║       buckets       ║
╠══════════════╬═════════════════════╩═══════════════════╩═════════════════════╣
║      Is      ║                                                               ║
║ synchronized ║              implementation is not synchronized               ║
╚══════════════╩═══════════════════════════════════════════════════════════════╝


답변

세 가지 모두 고유 키에서 값으로의 맵핑을 나타내므로 Map 인터페이스를 구현합니다 .

  1. HashMap은 키 해싱 을 기반으로하는 맵 입니다. O (1) get / put 작업을 지원합니다. 키가 있어야합니다 의 일관된 구현 hashCode()하고equals() 이 작동 할 수 있습니다.

  2. LinkedHashMap은 HashMap과 매우 유사하지만 항목이 추가되거나 액세스되는 순서에 대한 인식을 추가하므로 반복 순서는 삽입 순서 (또는 구성 매개 변수에 따라 액세스 순서)와 동일합니다.

  3. TreeMap은 트리 기반 매핑입니다. 넣기 / 받기 작업에는 O (log n) 시간이 걸립니다. 아이템은 Comparable 또는 Comparator와 비교 메커니즘을 가지고 있어야합니다. 반복 순서는이 메커니즘에 의해 결정됩니다.


답변

다음 다이어그램에서 각 클래스가 클래스 계층 구조에서 어디에 있는지 확인하십시오 ( 더 큰 클래스 ). TreeMap의 구현 SortedMapNavigableMap동안은 HashMap하지 않습니다.

HashTable사용되지 않으며 해당 ConcurrentHashMap클래스를 사용해야합니다.
여기에 이미지 설명을 입력하십시오


답변

해시 맵

  • 쌍 값 (키, 값)이 있습니다
  • 중복 키 값 없음
  • 정렬되지 않은 정렬되지 않은
  • 하나의 null 키와 둘 이상의 null 값을 허용합니다

해시 테이블

  • 해시 맵과 동일
  • null 키와 null 값을 허용하지 않습니다

LinkedHashMap

  • 지도 구현의 주문 버전입니다
  • 링크 된 목록 및 해싱 데이터 구조 기반

나무지도

  • 주문 및 분류 버전
  • 해싱 데이터 구조 기반

답변

각 맵을 사용할 때의 맵에 대한 내 경험에서 더 많은 정보를 얻을 수 있습니다.

  • HashMap-최상의 성능 (빠른) 구현을 찾을 때 가장 유용합니다.
  • TreeMap (SortedMap 인터페이스)-내가 정의한 특정 순서로 키를 정렬하거나 반복 할 수있을 때 가장 유용합니다.
  • LinkedHashMap-TreeMap 유지 관리 비용을 증가시키지 않으면 서 TreeMap에서 주문 보장의 이점을 결합합니다. (HashMap만큼 빠릅니다). 특히, LinkedHashMap은 또한 removeEldestEntry()메소드 를 대체하여 Cache 오브젝트를 작성하기위한 훌륭한 시작점을 제공합니다 . 이를 통해 정의한 몇 가지 기준을 사용하여 데이터를 만료 할 수있는 캐시 개체를 만들 수 있습니다.

답변

세 가지 클래스 HashMap, TreeMapLinkedHashMap구현은 java.util.Map인터페이스 및 값 고유 키의 매핑을 나타냅니다.

해시 맵

  1. A HashMap는 키를 기반으로 한 값을 포함합니다.

  2. 고유 한 요소 만 포함합니다.

  3. 하나의 널 키와 여러 개의 널 값을 가질 수 있습니다.

  4. 순서를 유지 하지 않습니다 .

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

LinkedHashMap

  1. A LinkedHashMap는 키를 기반으로 한 값을 포함합니다.
  2. 고유 한 요소 만 포함합니다.
  3. 하나의 널 키와 여러 개의 널 값을 가질 수 있습니다.
  4. HashMap이 대신 삽입 순서 를 유지하는 것과 같습니다 . // 아래 클래스 감속 참조

    public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>

나무지도

  1. A TreeMap는 키를 기반으로 한 값을 포함합니다. NavigableMap 인터페이스를 구현하고 AbstractMap 클래스를 확장합니다.
  2. 고유 한 요소 만 포함합니다.
  3. 널 키는 가질 수 없지만 여러 널 값을 가질 수 있습니다.
  4. HashMap대신 오름차순 을 유지하는 것과 동일합니다 (키의 자연 순서를 사용하여 정렬).

    public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable

해시 테이블

  1. Hashtable은 목록의 배열입니다. 각 목록을 버킷이라고합니다. 버킷 위치는 hashcode () 메서드를 호출하여 식별됩니다. Hashtable에는 키를 기반으로하는 값이 포함됩니다.
  2. 고유 한 요소 만 포함합니다.
  3. 널 키 또는 값이 없을 수 있습니다.
  4. 그것은됩니다 동기화 .
  5. 레거시 클래스입니다.

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

참조 : http://javarevisited.blogspot.in/2015/08/difference-between-HashMap-vs-TreeMap-vs-LinkedHashMap-Java.html