HashMap,LinkedHashMap和TreeMap之间的区别

Java中的HashMapLinkedHashMapTreeMap什么区别? 我没有看到输出中的任何差异,因为所有三个都有keySetvalues 。 什么是Hashtable

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混淆了重复功能的过时方法,并且它的方法是同步的(这会降低性能并且通常是无用的)。 使用ConcurrentHashMap而不是Hashtable。


    我更喜欢视觉呈现:

    ╔══════════════╦═════════════════════╦═══════════════════╦═════════════════════╗
    ║   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是一个基于树的映射。 它的put / get操作需要O(log n)时间。 它要求项目具有一些比较机制,可以使用Comparable或Comparator。 迭代顺序由此机制决定。

  • 链接地址: http://www.djcxy.com/p/2687.html

    上一篇: Difference between HashMap, LinkedHashMap and TreeMap

    下一篇: Difference between wait() and sleep()