HashMap,LinkedHashMap和TreeMap之间的区别

Kev*_*vin 919 java map

是什么区别HashMap,LinkedHashMapTreeMap在Java中?我没有看到输出有任何差异,因为所有三个都有keySetvalues.什么是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());
Run Code Online (Sandbox Code Playgroud)

Ser*_*hyk 1557

我更喜欢视觉呈现:

????????????????????????????????????????????????????????????????????????????????
?   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               ?
????????????????????????????????????????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

  • 除了插入顺序之外,LinkedHashMap还支持访问顺序(当使用带有布尔访问顺序参数的构造函数时). (14认同)
  • @SaiDubbaka LinkedHashMap有双链接桶,但也有桶表HashMap.它不是取代它.这意味着以与HashMap相同的方式访问存储桶,因为链接列表仅用于按插入顺序(或访问顺序)进行迭代. (5认同)
  • 值得一提的是,O(1)是最好的情况(我们通常不会称之为O,见[this question](http://stackoverflow.com/questions/471199/what-is-the-差between-%CE%98N和-ON)) (5认同)
  • 双链斗?我认为这会增加搜索存储桶以进行插入/删除操作的不必要的开销(因为它必须搜索正确的存储桶以放置对象).我一直认为LinkedHashMap实现类似于Map的实现,但是带有一些额外的"条目列表"开销(可能是链接列表),用于迭代目的.你确定吗,shevchyk?如果是的话,你能解释或给我一些支持你陈述的在线链接吗? (4认同)
  • 值得注意的是O(1)并不总是优于O(log n); 如果你有一个很长的密钥,那么基于BST的东西可能要比在整个密钥上执行O(n)哈希之前能够做任何事情要快得多. (4认同)
  • 感谢您的视觉展示.你能为List和Set视觉演示提供一些链接吗?再次感谢. (3认同)

Mic*_*rdt 1131

这三个类都实现了Map接口,并提供了大部分相同的功能.最重要的区别是条目的迭代顺序:

  • HashMap绝对不保证迭代顺序.当添加新元素时,它甚至可以(并且将)完全改变.
  • TreeMap将根据其compareTo()方法(或外部提供的Comparator)按键的"自然排序"进行迭代.此外,它实现了SortedMap接口,该接口包含依赖于此排序顺序的方法.
  • LinkedHashMap 将按照条目放入地图的顺序进行迭代

"Hashtable"是基于散列的映射的通用名称.在Java API的上下文中, Hashtable是一个过时的类,它来自Java 1.1之前的集合框架.它不应再被使用,因为它的API混杂着复制功能的过时方法,并且它的方法是同步的(这会降低性能并且通常是无用的).使用ConcurrentHashMap而不是Hashtable.

  • "Hashtable"和"HashMap"之间的显着区别在于,在Hashtable中,"键和值都不能为空".后者不存在这种约束. (94认同)
  • @theband:Map是一个界面.HashMap和Hashtable都实现了它; 正如我所写,Hashtable是一个遗产类. (4认同)
  • 您可以选择是否要按插入顺序或访问顺序进行LinkedHashMap迭代. (4认同)
  • @AshkanN:是的 - 实际上这些是实现排序的标准方法.TreeMap有一个构造函数,它使用Comparator,如果没有提供,它期望添加的所有对象都实现Comparable. (3认同)
  • 那么 Map 实际上是什么,Map、HashMap 和 Hashtables 之间有什么区别。 (2认同)

Eya*_*der 63

这三个都表示从唯一键到值的映射,因此实现了Map接口.

  1. HashMap是基于键散列的映射.它支持O(1)get/put操作.密钥必须具有一致的实现hashCode()并且equals()为此工作.

  2. LinkedHashMap与HashMap非常相似,但它增加了对添加(或访问)项目的顺序的认知,因此迭代顺序与插入顺序(或访问顺序,取决于构造参数)相同.

  3. TreeMap是基于树的映射.其put/get操作需要O(log n)时间.它要求项目具有一些比较机制,可以使用Comparable或Comparator.迭代顺序由此机制确定.

  • @MosheShaham正如他在#2中所说:`LinkedHashMap`将按插入顺序迭代,而不是自然顺序.因此,如果你将`(2,5,3)`添加到`LinkedHashMap`并为每个上面做一个,它将返回`2,5,3`.如果它是`TreeMap`的"2,5,3",它将返回`2,3,5`. (19认同)
  • 树图也有很多其他不错的技巧.像头部和尾部地图. (2认同)
  • @ B.shruti:这是因为您的插入顺序与键的词典顺序("abc1","abc2","abc3")相匹配.如果以不同的顺序插入,则代码仍将根据字典顺序进行迭代. (2认同)

pie*_*fou 45

在下图中查看每个类在类层次结构中的位置(较大的一个).TreeMap实现SortedMap,NavigableMapHashMap不是.

HashTable已过时,ConcurrentHashMap应使用相应的类. 在此输入图像描述


小智 37

HashMap中

  • 它有对值(键,值)
  • 没有重复键值
  • 无序的未分类
  • 它允许一个空键和多个空值

哈希表

  • 与哈希映射相同
  • 它不允许null键和null值

LinkedHashMap的

  • 它是地图实现的有序版本
  • 基于链表和散列数据结构

TreeMap的

  • 有序和分拣版本
  • 基于散列数据结构

  • HashTable也是同步的.无论如何,我喜欢你的答案,清洁和清晰. (3认同)

Ogr*_*m33 35

从我自己的地图经验中获得更多的输入,当我使用每个地图时:

  • HashMap - 在寻找最佳性能(快速)实现时最有用.
  • TreeMap(SortedMap接口) - 当我关心能够按照我定义的特定顺序对键进行排序或迭代时,最有用.
  • LinkedHashMap - 结合TreeMap保证排序的优点,而不会增加维护TreeMap的成本.(它几乎与HashMap一样快).特别是,LinkedHashMap还为通过覆盖removeEldestEntry()方法创建Cache对象提供了一个很好的起点.这使您可以使用您定义的某些条件创建可以使数据到期的Cache对象.

  • 确切地说,TreeMap没有按顺序保留元素.它使按键保持有序. (10认同)

roo*_*ler 17

所有这三个班HashMap,TreeMapLinkedHashMap工具java.util.Map接口,并表示从唯一关键值映射.

HashMap中

  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>

TreeMap的

  1. A TreeMap包含基于密钥的值.它实现了NavigableMap接口并扩展了AbstractMap类.
  2. 它只包含独特的元素.
  3. 它不能有null键但可以有多个空值.
  4. 它与HashMap维持升序相同(使用其键的自然顺序排序).

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

哈希表

  1. Hashtable是一个列表数组.每个列表都称为存储桶.通过调用hashcode()方法来识别存储桶的位置.Hashtable包含基于密钥的值.
  2. 它只包含独特的元素.
  3. 它可能没有任何null键或值.
  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


Ruc*_*era 14

HashMap绝对不保证迭代顺序.当添加新元素时,它甚至可以(并且将)完全改变.TreeMap将根据其compareTo()方法(或外部提供的Comparator)根据键的"自然排序"进行迭代.此外,它还实现了SortedMap接口,该接口包含依赖于此排序顺序的方法.LinkedHashMap将按照条目放入地图的顺序进行迭代

看看性能如何变化.. 在此输入图像描述

树图是排序图的一种实现.由于自然排序,put,get和containsKey操作的复杂性为O(log n)


sid*_*ngh 9

@Amit:SortedMap是一个接口,TreeMap而是一个实现SortedMap接口的类.这意味着如果遵循SortedMap要求其实施者做的协议.除非实现为搜索树,否则树不能为您提供有序数据,因为树可以是任何类型的树.因此,为了使TreeMap像分类顺序一样工作,它实现了SortedMap(例如,二进制搜索树 - BST,平衡BST,如AVL和RB树,甚至三元搜索树 - 主要用于按顺序迭代搜索).

public class TreeMap<K,V>
extends AbstractMap<K,V>
implements SortedMap<K,V>, Cloneable, Serializable
Run Code Online (Sandbox Code Playgroud)

在NUT-SHELL中 HashMap:给出O(1)中的数据,没有排序

TreeMap :使用有序键在O(log N),base 2中提供数据

LinkedHashMap:是具有链表的哈希表(想想indexed-SkipList)能够以插入树中的方式存储数据.最适合实施LRU(最近最少使用).


小智 6

以下是HashMap和TreeMap之间的主要区别

  1. HashMap不维护任何订单.换句话说,HashMap没有提供任何保证首先插入的元素将首先打印,其中就像TreeSet一样,TreeMap元素也根据其元素的自然顺序排序

  2. 内部HashMap实现使用Hashing和TreeMap在内部使用Red-Black树实现.

  3. HashMap可以存储一个空键和许多空值.TreeMap不能包含空键,但可能包含许多空值.

  4. HashMap为get和put等基本操作提供恒定时间性能,即O(1).根据Oracle文档,TreeMap为get和put方法提供了保证log(n)时间成本.

  5. HashMap比TreeMap快得多,因为对于大多数操作,HashMap的执行时间对于日志时间TreeMap是恒定的.

  6. HashMap使用equals()方法进行比较,而TreeMap使用compareTo()方法来维护排序.

  7. HashMap实现了Map接口,而TreeMap实现了NavigableMap接口.


tan*_*ens 5

这些是同一界面的不同实现.每个实现都有一些优点和一些缺点(快速插入,慢速搜索),反之亦然.

有关详细信息,请查看TreeMap,HashMap,LinkedHashMap的javadoc .


Shi*_*kla 5

哈希图不保留插入顺序。
例。Hashmap如果您要插入密钥

1  3
5  9
4   6
7   15
3   10
Run Code Online (Sandbox Code Playgroud)

它可以存储为

4  6
5  9
3  10
1  3
7  15
Run Code Online (Sandbox Code Playgroud)

链接的哈希图保留插入顺序。

例。
如果要插入密钥

1  3
5  9
4   6
7   15
3   10
Run Code Online (Sandbox Code Playgroud)

它将存储为

1  3
5  9
4   6
7   15
3   10
Run Code Online (Sandbox Code Playgroud)

与我们插入的相同。

树状图按键的递增顺序存储值。例。
如果要插入密钥

1  3
5  9
4   6
7   15
3   10
Run Code Online (Sandbox Code Playgroud)

它将存储为

1  3
3  10
4   6
5   9
7   15
Run Code Online (Sandbox Code Playgroud)


Pre*_*raj 5

  • 哈希映射:

    • 订单不维持
    • 比 LinkedHashMap 快
    • 用于存储对象堆
  • LinkedHashMap:

    • LinkedHashMap 插入顺序将保持不变
    • 比 HashMap 慢,比 TreeMap 快
    • 如果您想维护广告订单,请使用它。
  • 树图:

    • TreeMap 是一种基于树的映射
    • TreeMap 将遵循 key 的自然顺序
    • 比 HashMap 和 LinkedHashMap 慢
    • 当您需要保持自然(默认)排序时使用 TreeMap