HashMap, LinkedHashMap 및 TreeMap의 차이점
HashMap
, LinkedHashMap
및 TreeMap
Java 의 차이점은 무엇입니까 ? 세 가지 모두 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
항목이 맵에 입력 된 순서대로 반복됩니다.
"Hashtable" 은 해시 기반 맵의 일반적인 이름입니다. 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
클래스를 사용해야합니다.
HashMap
- 쌍 값 (키, 값)이 있습니다.
- 중복 키 값 없음
- 정렬되지 않은 정렬되지 않은
- 하나의 널 키와 둘 이상의 널 값을 허용합니다.
HashTable
- 해시 맵과 동일
- null 키 및 null 값을 허용하지 않습니다.
LinkedHashMap
- 지도 구현의 주문 버전입니다
- 연결 목록 및 해싱 데이터 구조 기반
TreeMap
- 주문 및 분류 된 버전
- 해싱 데이터 구조 기반
지도에 대한 내 경험에서 얻은 추가 정보, 각각을 사용할 때 :
- HashMap-최고의 성능 (빠른) 구현을 찾을 때 가장 유용합니다.
- TreeMap (SortedMap 인터페이스)-내가 정의한 특정 순서로 키를 정렬하거나 반복 할 수있는 것과 관련이있을 때 가장 유용합니다.
- LinkedHashMap-TreeMap 유지 비용 증가없이 TreeMap에서 보장 된 순서의 이점을 결합합니다. (거의 HashMap만큼 빠릅니다). 특히 LinkedHashMap은
removeEldestEntry()
메서드 를 재정 의하여 Cache 개체를 만들기위한 훌륭한 시작점을 제공합니다 . 이렇게하면 정의한 일부 기준을 사용하여 데이터를 만료 할 수있는 Cache 개체를 만들 수 있습니다.
세 가지 클래스 HashMap
, TreeMap
및 LinkedHashMap
구현은 java.util.Map
인터페이스 및 값 고유 키의 매핑을 나타냅니다.
A
HashMap
에는 키를 기반으로하는 값이 포함됩니다.고유 한 요소 만 포함합니다.
하나의 null 키와 여러 개의 null 값이있을 수 있습니다.
그것은 순서를 유지 하지 않습니다 .
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
- A
LinkedHashMap
에는 키를 기반으로하는 값이 포함됩니다. - 고유 한 요소 만 포함합니다.
- 하나의 null 키와 여러 개의 null 값이있을 수 있습니다.
대신 삽입 순서 를 유지하는 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
HashMap은 반복 순서에 대해 절대적으로 보장하지 않습니다. 새 요소가 추가되면 완전히 변경 될 수도 있습니다. TreeMap은 compareTo () 메서드 (또는 외부에서 제공되는 Comparator)에 따라 키의 "자연 순서"에 따라 반복됩니다. 또한이 정렬 순서에 의존하는 메서드를 포함하는 SortedMap 인터페이스를 구현합니다. LinkedHashMap은 항목이 맵에 입력 된 순서대로 반복됩니다.
성능이 어떻게 달라지는 지보세요 ..
Sorted 맵을 구현 한 트리 맵입니다. put, get 및 containsKey 작업의 복잡성은 자연 순서로 인해 O (log n)입니다.
@Amit : SortedMap
은 인터페이스 인 반면 인터페이스 TreeMap
를 구현하는 클래스입니다 SortedMap
. 이는 SortedMap
구현 자에게 요청 하는 프로토콜을 따르는 경우를 의미합니다 . 검색 트리로 구현되지 않는 한 트리는 모든 종류의 트리가 될 수 있기 때문에 정렬 된 데이터를 제공 할 수 없습니다. 따라서 TreeMap이 Sorted 순서처럼 작동하도록하기 위해 SortedMap을 구현합니다 (예 : Binary Search Tree-BST, AVL 및 RB Tree와 같은 균형 BST, 심지어는 순서대로 반복 검색에 주로 사용되는 Ternary Search Tree).
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements SortedMap<K,V>, Cloneable, Serializable
NUT-SHELL에서 HashMap
: O (1)에 데이터를 제공하며 순서는 없습니다.
TreeMap
: 순서가 지정된 키로 O (log N), base 2에 데이터를 제공합니다.
LinkedHashMap
: 데이터가 트리에 삽입되는 방식으로 데이터를 저장하는 연결 목록 (indexed-SkipList를 생각해보십시오) 기능이있는 해시 테이블입니다. LRU 구현에 가장 적합합니다 (가장 최근에 사용됨).
다음은 HashMap과 TreeMap의 주요 차이점입니다.
HashMap은 어떤 순서도 유지하지 않습니다. 즉, HashMap은 먼저 삽입 된 요소가 먼저 인쇄된다는 보장을 제공하지 않습니다. 여기서 TreeSet과 마찬가지로 TreeMap 요소도 해당 요소의 자연스러운 순서에 따라 정렬됩니다.
내부 HashMap 구현은 Hashing을 사용하고 TreeMap은 내부적으로 Red-Black 트리 구현을 사용합니다.
HashMap은 하나의 null 키와 많은 null 값을 저장할 수 있으며 TreeMap은 null 키를 포함 할 수 없지만 많은 null 값을 포함 할 수 있습니다.
HashMap은 get 및 put과 같은 기본 작업, 즉 O (1)에 대해 일정한 시간 성능을 취합니다. Oracle 문서에 따르면 TreeMap은 get 및 put 메소드에 대해 보장 된 log (n) 시간 비용을 제공합니다.
HashMap은 대부분의 작업에서 로그 시간 TreeMap에 대해 HashMap의 성능 시간이 일정하기 때문에 TreeMap보다 훨씬 빠릅니다.
HashMap은 비교에서 equals () 메소드를 사용하는 반면 TreeMap은 순서 유지를 위해 compareTo () 메소드를 사용합니다.
HashMap은 Map 인터페이스를 구현하고 TreeMap은 NavigableMap 인터페이스를 구현합니다.
이들은 동일한 인터페이스의 다른 구현입니다. 각 구현에는 몇 가지 장점과 단점 (빠른 삽입, 느린 검색)이 있으며 그 반대도 마찬가지입니다.
자세한 내용은 TreeMap , HashMap , LinkedHashMap 의 javadoc을 참조하십시오 .
해시 맵은 삽입 순서를 유지하지 않습니다.
예. Hashmap 키를 다음과 같이 삽입하는 경우
1 3
5 9
4 6
7 15
3 10
다음과 같이 저장할 수 있습니다.
4 6
5 9
3 10
1 3
7 15
연결된 Hashmap은 삽입 순서를 유지합니다.
예.
키를 삽입하는 경우
1 3
5 9
4 6
7 15
3 10
다음과 같이 저장됩니다.
1 3
5 9
4 6
7 15
3 10
삽입 한 것과 동일합니다.
트리 맵은 키의 증가 순서로 값을 저장합니다. 예.
키를 삽입하는 경우
1 3
5 9
4 6
7 15
3 10
다음과 같이 저장됩니다.
1 3
3 10
4 6
5 9
7 15
HashMap :
- 주문이 유지되지 않음
- LinkedHashMap보다 빠름
- 객체 힙 저장에 사용
LinkedHashMap :
- LinkedHashMap 삽입 순서가 유지됩니다.
- HashMap보다 느리고 TreeMap보다 빠름
- 게재 신청서를 유지하려면 이것을 사용하십시오.
TreeMap :
- TreeMap은 트리 기반 매핑입니다.
- TreeMap은 키의 자연스러운 순서를 따릅니다.
- HashMap 및 LinkedHashMap보다 느림
- 자연스러운 (기본) 순서를 유지해야 할 때 TreeMap 사용
모두 키-> 값 맵과 키를 반복하는 방법을 제공합니다. 이 클래스 간의 가장 중요한 차이점은 시간 보장과 키 순서입니다.
- HashMap offers 0(1) lookup and insertion. If you iterate through the keys, though, the ordering of the keys is essentially arbitrary. It is implemented by an array of linked lists.
- TreeMap offers O(log N) lookup and insertion. Keys are ordered, so if you need to iterate through the keys in sorted order, you can. This means that keys must implement the Comparable interface.TreeMap is implemented by a Red-Black Tree.
- LinkedHashMap offers 0(1) lookup and insertion. Keys are ordered by their insertion order. It is implemented by doubly-linked buckets.
Imagine you passed an empty TreeMap, HashMap, and LinkedHashMap into the following function:
void insertAndPrint(AbstractMap<Integer, String> map) {
int[] array= {1, -1, 0};
for (int x : array) {
map.put(x, Integer.toString(x));
}
for (int k: map.keySet()) {
System.out.print(k + ", ");
}
}
The output for each will look like the results below.
For HashMap, the output was, in my own tests, { 0, 1, -1}, but it could be any ordering. There is no guarantee on the ordering.
Treemap,the output was,{ -1, 0, 1}
LinkedList,the output was,{ 1, -1, 0}
HashMap
can contain one null key.
HashMap maintains no order.
TreeMap
TreeMap can not contain any null key.
TreeMap maintains ascending order.
LinkedHashMap
LinkedHashMap can be used to maintain insertion order, on which keys are inserted into Map or it can also be used to maintain an access order, on which keys are accessed.
Examples::
1) HashMap map = new HashMap();
map.put(null, "Kamran");
map.put(2, "Ali");
map.put(5, "From");
map.put(4, "Dir");`enter code here`
map.put(3, "Lower");
for (Map.Entry m : map.entrySet()) {
System.out.println(m.getKey() + " " + m.getValue());
}
2) TreeMap map = new TreeMap();
map.put(1, "Kamran");
map.put(2, "Ali");
map.put(5, "From");
map.put(4, "Dir");
map.put(3, "Lower");
for (Map.Entry m : map.entrySet()) {
System.out.println(m.getKey() + " " + m.getValue());
}
3) LinkedHashMap map = new LinkedHashMap();
map.put(1, "Kamran");
map.put(2, "Ali");
map.put(5, "From");
map.put(4, "Dir");
map.put(3, "Lower");
for (Map.Entry m : map.entrySet()) {
System.out.println(m.getKey() + " " + m.getValue());
}
The most important among all the three is how they save the order of the entries.
HashMap
- Does not save the order of the entries. eg.
public static void main(String[] args){
HashMap<String,Integer> hashMap = new HashMap<>();
hashMap.put("First",1);// First ---> 1 is put first in the map
hashMap.put("Second",2);//Second ---> 2 is put second in the map
hashMap.put("Third",3); // Third--->3 is put third in the map
for(Map.Entry<String,Integer> entry : hashMap.entrySet())
{
System.out.println(entry.getKey()+"--->"+entry.getValue());
}
}
LinkedHashMap
: 입력 한 순서를 저장합니다. 예 :
public static void main(String[] args){
LinkedHashMap<String,Integer> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("First",1);// First ---> 1 is put first in the map
linkedHashMap.put("Second",2);//Second ---> 2 is put second in the map
linkedHashMap.put("Third",3); // Third--->3 is put third in the map
for(Map.Entry<String,Integer> entry : linkedHashMap.entrySet())
{
System.out.println(entry.getKey()+"--->"+entry.getValue());
}
}
TreeMap
: 키의 오름차순으로 항목을 저장합니다. 예 :
public static void main(String[] args) throws IOException {
TreeMap<String,Integer> treeMap = new TreeMap<>();
treeMap.put("A",1);// A---> 1 is put first in the map
treeMap.put("C",2);//C---> 2 is put second in the map
treeMap.put("B",3); //B--->3 is put third in the map
for(Map.Entry<String,Integer> entry : treeMap.entrySet())
{
System.out.println(entry.getKey()+"--->"+entry.getValue());
}
}
참고 URL : https://stackoverflow.com/questions/2889777/difference-between-hashmap-linkedhashmap-and-treemap
'program story' 카테고리의 다른 글
zlib, gzip 및 zip은 어떤 관련이 있습니까? (0) | 2020.09.28 |
---|---|
유효한 이메일 주소의 최대 길이는 얼마입니까? (0) | 2020.09.28 |
숫자가 정밀도를 잃지 않고 갈 수있는 JavaScript의 가장 높은 정수 값은 무엇입니까? (0) | 2020.09.28 |
HTML5 숫자 입력의 스핀 상자를 숨길 수 있습니까? (0) | 2020.09.28 |
로컬에 설치된 Python 모듈 목록을 어떻게 얻을 수 있습니까? (0) | 2020.09.28 |