차이점은 무엇이며 HashMap
, LinkedHashMap
그리고 TreeMap
자바는? 세 가지 모두 keySet
와와 같이 출력에 차이가 보이지 않습니다 values
. Hashtable
S 는 무엇입니까 ?
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
반복 순서를 보장하지 않습니다. 새로운 요소가 추가되면 완전히 바뀔 수 있습니다.TreeMap
compareTo()
방법 (또는 외부 제공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 인터페이스를 구현합니다 .
-
HashMap은 키 해싱 을 기반으로하는 맵 입니다. O (1) get / put 작업을 지원합니다. 키가 있어야합니다 의 일관된 구현
hashCode()
하고equals()
이 작동 할 수 있습니다. -
LinkedHashMap은 HashMap과 매우 유사하지만 항목이 추가되거나 액세스되는 순서에 대한 인식을 추가하므로 반복 순서는 삽입 순서 (또는 구성 매개 변수에 따라 액세스 순서)와 동일합니다.
-
TreeMap은 트리 기반 매핑입니다. 넣기 / 받기 작업에는 O (log n) 시간이 걸립니다. 아이템은 Comparable 또는 Comparator와 비교 메커니즘을 가지고 있어야합니다. 반복 순서는이 메커니즘에 의해 결정됩니다.
답변
다음 다이어그램에서 각 클래스가 클래스 계층 구조에서 어디에 있는지 확인하십시오 ( 더 큰 클래스 ). TreeMap의 구현 SortedMap
과 NavigableMap
동안은 HashMap
하지 않습니다.
HashTable
사용되지 않으며 해당 ConcurrentHashMap
클래스를 사용해야합니다.
답변
해시 맵
- 쌍 값 (키, 값)이 있습니다
- 중복 키 값 없음
- 정렬되지 않은 정렬되지 않은
- 하나의 null 키와 둘 이상의 null 값을 허용합니다
해시 테이블
- 해시 맵과 동일
- null 키와 null 값을 허용하지 않습니다
LinkedHashMap
- 지도 구현의 주문 버전입니다
- 링크 된 목록 및 해싱 데이터 구조 기반
나무지도
- 주문 및 분류 버전
- 해싱 데이터 구조 기반
답변
각 맵을 사용할 때의 맵에 대한 내 경험에서 더 많은 정보를 얻을 수 있습니다.
- HashMap-최상의 성능 (빠른) 구현을 찾을 때 가장 유용합니다.
- TreeMap (SortedMap 인터페이스)-내가 정의한 특정 순서로 키를 정렬하거나 반복 할 수있을 때 가장 유용합니다.
- LinkedHashMap-TreeMap 유지 관리 비용을 증가시키지 않으면 서 TreeMap에서 주문 보장의 이점을 결합합니다. (HashMap만큼 빠릅니다). 특히, LinkedHashMap은 또한
removeEldestEntry()
메소드 를 대체하여 Cache 오브젝트를 작성하기위한 훌륭한 시작점을 제공합니다 . 이를 통해 정의한 몇 가지 기준을 사용하여 데이터를 만료 할 수있는 캐시 개체를 만들 수 있습니다.
답변
세 가지 클래스 HashMap
, TreeMap
및 LinkedHashMap
구현은 java.util.Map
인터페이스 및 값 고유 키의 매핑을 나타냅니다.
-
A
HashMap
는 키를 기반으로 한 값을 포함합니다. -
고유 한 요소 만 포함합니다.
-
하나의 널 키와 여러 개의 널 값을 가질 수 있습니다.
-
순서를 유지 하지 않습니다 .
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
- A
LinkedHashMap
는 키를 기반으로 한 값을 포함합니다. - 고유 한 요소 만 포함합니다.
- 하나의 널 키와 여러 개의 널 값을 가질 수 있습니다.
-
HashMap이 대신 삽입 순서 를 유지하는 것과 같습니다 . // 아래 클래스 감속 참조
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
- A
TreeMap
는 키를 기반으로 한 값을 포함합니다. NavigableMap 인터페이스를 구현하고 AbstractMap 클래스를 확장합니다. - 고유 한 요소 만 포함합니다.
- 널 키는 가질 수 없지만 여러 널 값을 가질 수 있습니다.
-
HashMap
대신 오름차순 을 유지하는 것과 동일합니다 (키의 자연 순서를 사용하여 정렬).public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable
- Hashtable은 목록의 배열입니다. 각 목록을 버킷이라고합니다. 버킷 위치는 hashcode () 메서드를 호출하여 식별됩니다. Hashtable에는 키를 기반으로하는 값이 포함됩니다.
- 고유 한 요소 만 포함합니다.
- 널 키 또는 값이 없을 수 있습니다.
- 그것은됩니다 동기화 .
-
레거시 클래스입니다.
public class Hashtable<K,V> extends Dictionary<K,V> implements Map<K,V>, Cloneable, Serializable