HashMap, LinkedHashMap 및 TreeMap의 차이점
HashMap
,LinkedHashMap
★★★★★★★★★★★★★★★★★」TreeMap
자바어?이 세 가지가 모두 가지고 있는 것처럼 출력에는 차이가 없습니다.keySet
★★★★★★★★★★★★★★★★★」values
.가 뭐죠?Hashtable
s?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());
시각적인 프레젠테이션을 선호합니다.
소유물 | 해시 맵 | 트리 맵 | Linked Hash Map |
---|---|---|---|
반복 순서 | 보증된 순서가 없으며, 시간이 지남에 따라 일정하게 유지됩니다. | 자연의 순서에 따라 분류되다 | 삽입 순서 |
가져오기/넣기/제거/containsKey | O(1) | O(log(n)) | O(1) |
인터페이스 | 지도 | 탐색 가능한 지도, 지도, 정렬된 지도 | 지도 |
Null 값/키 | 허용된 | 값만 | 허용된 |
Fail-Fast 동작 | 동기되지 않은 동시 수정이 있는 경우 반복기의 Fail-Fast 동작을 보장할 수 없으며 하드 보증을 할 수 없습니다. | 동기되지 않은 동시 수정이 있는 경우 반복기의 Fail-Fast 동작을 보장할 수 없으며 하드 보증을 할 수 없습니다. | 동기되지 않은 동시 수정이 있는 경우 반복기의 Fail-Fast 동작을 보장할 수 없으며 하드 보증을 할 수 없습니다. |
실행 | 버킷 | 레드-블랙 트리 | 이중 링크 버킷 |
동기화되어 있다 | 구현이 동기화되지 않았습니다. | 구현이 동기화되지 않았습니다. | 구현이 동기화되지 않았습니다. |
" " " 를 합니다.Map
인터페이스와 거의 동일한 기능을 제공합니다.가장 중요한 차이는 엔트리를 반복하는 순서입니다.
HashMap
는 반복 순서를 전혀 보증하지 않습니다.새로운 요소가 추가되면 완전히 변경될 수도 있습니다.TreeMap
「자연 에 의 「자연 순서」에 따라서 반복됩니다.compareTo()
에서 공급된 방법)Comparator
게다가 이 정렬 순서에 의존하는 메서드를 포함한 인터페이스를 실장합니다.LinkedHashMap
됩니다.
해시 테이블은 해시 기반 맵의 총칭입니다.Java API의 경우,Hashtable
는 컬렉션 프레임워크가 존재하기 전의 Java 1.1 시대의 오래된 클래스입니다.API는 기능을 복제하는 오래된 메서드로 어수선하고 메서드는 동기화되어 있기 때문에 더 이상 사용하지 마십시오(성능을 저하시킬 수 있으며 일반적으로는 쓸모가 없습니다).해시 테이블 대신 ConcurrentHashMap을 사용합니다.
3가지 모두 하나의 키에서 값으로의 매핑을 나타내며, 따라서 맵인터페이스를 실장합니다.
HashMap은 키의 해시에 기반한 맵입니다.O(1) get/put 조작을 지원합니다.키를 사용하려면 , 및 를 일관되게 실장할 필요가 있습니다.
LinkedHashMap은 HashMap과 매우 유사하지만 항목이 추가(또는 액세스)되는 순서에 인식을 추가하므로 반복 순서는 삽입 순서(또는 구성 매개 변수에 따라 액세스 순서)와 동일합니다.
TreeMap은 트리 기반 매핑입니다.put/get 조작에는 O(log n) 시간이 걸립니다.여기에는 Comparible 또는 Comparator 중 하나와 비교 메커니즘이 있는 항목이 필요합니다.반복 순서는 이 메커니즘에 의해 결정됩니다.
다음 그림(큰 그림)에서 각 클래스가 클래스 계층에서 어디에 있는지 확인하십시오.TreeMap 구현SortedMap
★★★★★★★★★★★★★★★★★」NavigableMap
동시에HashMap
그렇지 않다.
HashTable
, 하는 「」는 「」입니다.ConcurrentHashMap
를 사용해야 합니다.
해시 맵
- 쌍값(키, 값)이 있습니다.
- 중복 키 값 없음
- 무질서한
- 1개의 null 키와 여러 개의 null 값을 사용할 수 있습니다.
해시 테이블
- 해시 맵과 동일
- null 키와 null 값을 사용할 수 없습니다.
Linked Hash Map
- 맵 구현의 순서 버전입니다.
- 링크 목록 및 해시 데이터 구조 기반
트리 맵
- 주문 및 정렬된 버전
- 해싱 데이터 구조에 기반하여
지도에 대한 나의 경험에서 얻은 각 지도의 사용 시기에 대한 몇 가지 추가 정보:
- HashMap - 최고의 퍼포먼스(고속) 구현을 필요로 할 때 가장 유용합니다.
- TreeMap(SortedMap 인터페이스) - 정의한 순서대로 키를 정렬하거나 반복할 수 있을 때 가장 유용합니다.
- LinkedHashMap - TreeMap을 유지 보수하는 비용이 증가하지 않고 TreeMap에서 확실하게 주문할 수 있는 장점을 결합합니다(대부분 HashMap과 같은 속도입니다).특히 LinkedHashMap은 메서드를 오버라이드하여 캐시 개체를 생성하기 위한 훌륭한 시작점을 제공합니다.이렇게 하면 사용자가 정의한 기준을 사용하여 데이터를 만료할 수 있는 캐시 개체를 생성할 수 있습니다.
의 클래스 모두 3개의 클래스HashMap
,TreeMap
★★★★★★★★★★★★★★★★★」LinkedHashMap
를 실장하다java.util.Map
interface를 선택합니다.
A
HashMap
에 키에 근거한 값을 나타냅니다.여기에는 고유한 요소만 포함됩니다.
1개의 늘키와 여러 개의 늘값을 포함할 수 있습니다.
그것은 질서를 유지하지 않는다.
public class HashMap<K,V> extends AbstractMap<K,V> implements Map<K,V>, Cloneable, Serializable
- A
LinkedHashMap
에 키에 근거한 값을 나타냅니다. - 여기에는 고유한 요소만 포함됩니다.
- 1개의 늘키와 여러 개의 늘값을 포함할 수 있습니다.
대신 HashMap이 삽입 순서를 유지하는 것과 동일합니다. //아래 클래스 감속 참조
public class LinkedHashMap<K,V> extends HashMap<K,V> implements Map<K,V>
- A
TreeMap
에 키에 근거한 값을 나타냅니다.NavigableMap은 AbstractMap이다. - 여기에는 고유한 요소만 포함됩니다.
- null 키는 사용할 수 없지만 여러 null 값을 사용할 수 있습니다.
it it 와 같다
HashMap
대신 (키의 자연 순서를 사용하여 정렬됨) 오름차순을 유지합니다.public class TreeMap<K,V> extends AbstractMap<K,V> implements NavigableMap<K,V>, Cloneable, Serializable
- 해시 테이블은 목록의 배열입니다.각 목록을 버킷이라고 합니다.버킷의 위치는 hashcode() 메서드를 호출하여 식별합니다.해시 테이블에는 키에 기반한 값이 포함됩니다.
- 여기에는 고유한 요소만 포함됩니다.
- null 키 또는 값이 없을 수 있습니다.
- 동기화되어 있습니다.
레거시 클래스입니다.
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
HashMap은 반복 순서에 대해 전혀 보증하지 않습니다.새로운 요소가 추가되면 완전히 변경될 수도 있습니다.TreeMap은 compareTo() 메서드(또는 외부에서 제공되는 Comparator)에 따라 키의 "자연적 순서"에 따라 반복됩니다.또한 이 정렬 순서에 따라 달라지는 메서드를 포함하는 SortedMap 인터페이스를 구현합니다.LinkedHashMap은 엔트리가 맵에 삽입된 순서대로 반복됩니다.
이치노
정렬된 맵의 구현인 트리 맵.put, get 및 containsKey 조작의 복잡성은 자연스러운 순서로 인해 O(log n)입니다.
@Amit:SortedMap
는 인터페이스인 , 「」는TreeMap
is is is is 를 구현하는 입니다.SortedMap
인터페이스입니다., SortedMap
구현자에게 의뢰합니다.트리는 모든 종류의 트리가 될 수 있기 때문에 검색 트리로 구현되지 않는 한 순서 있는 데이터를 제공할 수 없습니다.「TreeMap」Sorted 「Sorted」는, 「SortedMap」의 「SortedMap」의 「Binary Search Tree - BST, AVL 」의 「R-B Tree」의 「BST, AVL」의 「Ternary」서치 트리입니다.
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements SortedMap<K,V>, Cloneable, Serializable
NUT-SHELL in in in inHashMap
(1)의.순서는 .O(1)는 없습니다.서는없없 없없없다다
TreeMap
N 2를 O(log N), Base 2.의 순서로 합니다.
LinkedHashMap
: 는 데이터를 트리에 삽입하는 방법으로 저장하는 링크 리스트(indexed-SkipList를 생각할 수 있음) 기능이 있는 해시 테이블입니다.LRU ( 「 」 ) 。
해시 맵은 삽입 순서를 유지하지 않습니다.
하는
1 3
5 9
4 6
7 15
3 10
저장할 수 있습니다.
4 6
5 9
3 10
1 3
7 15
링크된 해시맵은 삽입 순서를 유지합니다.
를
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
과 TreeMapHashMap의 주요 차이점은 .
HashMap은 순서를 유지하지 않습니다.즉, HashMap은 처음에 삽입된 요소가 먼저 인쇄되는 것을 보증하지 않습니다.TreeSet과 마찬가지로 TreeMap 요소도 요소의 자연스러운 순서에 따라 정렬됩니다.
내부 HashMap 구현에서는 Hashing을 사용하고 TreeMap에서는 내부적으로 Red-Black 트리 구현을 사용합니다.
HashMap은 1개의 늘키와 다수의 늘값을 저장할 수 있습니다.TreeMap에는 null 키를 포함할 수 없지만 다수의 null 값을 포함할 수 있습니다.
HashMap은 get 및 put 등의 기본 조작(예: O(1))에 대해 일정한 시간 성능을 필요로 합니다.Oracle 문서에 따르면 TreeMap은 get and put 방식의 로그(n) 시간 비용을 보장합니다.
대부분의 작업에서 HashMap의 성능 시간은 로그 시간 TreeMap에 대해 일정하므로 HashMap은 TreeMap보다 훨씬 빠릅니다.
HashMap은 비교에 equals() 메서드를 사용하는 반면 TreeMap은 순서를 유지하기 위해 compareTo() 메서드를 사용합니다.
HashMap은 Map 인터페이스를 구현하고 TreeMap은 NavigableMap 인터페이스를 구현합니다.
해시 맵:
- 주문이 유지되지 않음
- Linked Hash Map보다 고속
- 개체의 저장 힙에 사용됩니다.
Linked Hash Map:
- LinkedHashMap 삽입 순서가 유지됩니다.
- HashMap보다 느리고 TreeMap보다 빠르다
- 삽입 순서를 유지하려면 이것을 사용합니다.
트리 맵:
- TreeMap은 트리 기반 매핑입니다.
- TreeMap은 키의 자연스러운 순서를 따릅니다.
- HashMap 및 LinkedHashMap보다 느림
- 자연스러운(기본값) 순서를 유지해야 할 경우 TreeMap 사용
이것들은, 같은 인터페이스의 다른 실장입니다.각 구현에는 장점과 단점이 있습니다(고속 삽입, 저속 검색). 또는 그 반대도 있습니다.
자세한 내용은 TreeMap, HashMap, LinkedHashMap의 javadoc을 참조하십시오.
저는 다양한 합니다.Map
Java 11에 번들된 구현입니다.
표 그래픽에 기재되어 있는 차이는 다음과 같습니다.
HashMap
는 특별한 필요가 없을 때 일반적으로 사용되는 범용입니다.LinkedHashMap
확장HashMap
, adding this behavior: 엔트리가 처음 추가된 순서인 순서를 유지합니다.key-value 엔트리의 값을 변경해도 순서에서의 위치는 변경되지 않습니다.TreeMap
too는 순서를 유지하지만 (a) 인터페이스에서 정의된 주요 오브젝트의 메서드 값을 의미하는 '자연' 순서를 사용하거나 (b) 사용자가 지정한 구현을 호출합니다.TreeMap
는 인터페이스와 그 후계자인 인터페이스를 모두 실장합니다.
- 특수한 절차:
TreeMap
에서는 NULL을 키로 사용할 수 없습니다.HashMap
&LinkedHashMap
하다.- 세 가지 모두 NULL을 값으로 사용할 수 있습니다.
HashTable
Java 1의 레거시입니다.학급에 의해 대체되었다.Javadoc 인용:ConcurrentHashMap
ob ob ob ob ob ob ob ob ob ob ob ob ob ob 와 동일한 기능 사양을 합니다.Hashtable
「」의 각 을 나타내고 있습니다.Hashtable
.
이 세 가지 중 가장 중요한 것은 엔트리의 순서를 저장하는 방법입니다.
HashMap
. - 엔트리의 순서를 저장하지 §:
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());
}
}
모두 키 > 값 맵과 키를 사용하여 반복하는 방법을 제공합니다.이들 클래스의 가장 중요한 차이는 시간 보증과 키의 순서입니다.
- HashMap은 0 (1) 검색 및 삽입을 제공합니다.단, 키를 반복하면 키의 순서는 기본적으로 임의입니다.링크 리스트 배열에 의해 구현됩니다.
- TreeMap은 O(log N) 검색 및 삽입을 제공합니다.키가 정렬되어 있으므로 정렬된 순서대로 키를 반복해야 할 경우 가능합니다.즉, 키는 Comparable 인터페이스를 구현해야 합니다.TreeMap은 Red-Black Tree에 의해 구현됩니다.
- Linked Hash Map은 0 (1) 검색 및 삽입을 제공합니다.키는 삽입 순서에 따라 정렬됩니다.이중 링크 버킷에 의해 구현됩니다.
빈 TreeMap, HashMap 및 LinkedHashMap을 다음 함수에 전달했다고 가정합니다.
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 + ", ");
}
}
각각의 출력은 다음과 같습니다.
HashMap의 경우 자체 테스트에서는 출력은 {0, 1, -1}이었지만 임의의 순서를 지정할 수 있습니다.주문에 대한 보장은 없습니다.
{-1} 트리맵 - {-1, 0, 0, 0,
List 0Linked List {1, -1, 0}입니다.
HashMap
1번으로 하다
HashMap은 순서를 유지하지 않습니다.
트리 맵
TreeMap에는 null 키를 포함할 수 없습니다.
TreeMap은 오름차순을 유지합니다.
Linked Hash Map
Linked Hash Map은 삽입 순서를 유지하기 위해 사용할 수 있습니다.이 순서에서는 키를 삽입할 수 있습니다.또, 키에 액세스 하는 액세스 순서를 유지하기 위해 사용할 수도 있습니다.
예:
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) Linked Hash Map 맵= new Linked Hash Map();
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());
}
언급URL : https://stackoverflow.com/questions/2889777/difference-between-hashmap-linkedhashmap-and-treemap
'IT이야기' 카테고리의 다른 글
휘발성 부울 vs Atomic Boolean (0) | 2022.06.30 |
---|---|
같은 값의 라디오 버튼을 재사용하려면 어떻게 해야 합니까? (0) | 2022.06.30 |
내보낸 이벤트가 Vue JS 구성 요소의 상위 메서드를 호출하지 않음 (0) | 2022.06.30 |
UNIX 소켓, SOCK_SEQPACKET vs SOCK_DGRAM (0) | 2022.06.30 |
Java에서 클래스 개체가 다른 클래스 개체의 하위 클래스인지 확인합니다. (0) | 2022.06.30 |