HashMap, LinkedHashMap和TreeMap在Java中的区别是什么? 我在输出中没有看到任何不同,因为这三个都有keySet和values。什么是哈希表?

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());

当前回答

HashMap、TreeMap和LinkedHashMap这三个类都实现了java.util.Map接口,并表示从唯一键到值的映射。

HashMap

HashMap包含基于键的值。 它只包含独特的元素。 它可以有一个空键和多个空值。 它没有维持秩序。 公共类HashMap<K,V>扩展了AbstractMap<K,V>实现了Map<K,V>,可克隆,可序列化

LinkedHashMap

LinkedHashMap包含基于键的值。 它只包含独特的元素。 它可以有一个空键和多个空值。 它与HashMap相同,只是维护插入顺序。//见下面的减速等级 公共类LinkedHashMap<K,V>扩展HashMap<K,V>实现Map<K,V>

TreeMap

TreeMap包含基于键的值。它实现了NavigableMap接口并扩展了AbstractMap类。 它只包含独特的元素。 它不能有空键,但可以有多个空值。 它与HashMap相同,只是维护升序(使用键的自然顺序进行排序)。 公共类TreeMap<K,V>扩展AbstractMap<K,V>实现NavigableMap<K,V>,可克隆,可序列化

哈希表

哈希表是一个列表数组。每个列表都被称为一个桶。桶的位置通过调用hashcode()方法来标识。哈希表包含基于键的值。 它只包含独特的元素。 它可能没有任何空键或值。 它是同步的。 这是一个传承类。 公共类Hashtable<K,V>扩展Dictionary<K,V>实现Map<K,V>,可克隆,可序列化

裁判:http://javarevisited.blogspot.in/2015/08/difference-between-HashMap-vs-TreeMap-vs-LinkedHashMap-Java.html

其他回答

这是我自己使用地图的经验,关于我何时使用每种地图:

HashMap - Most useful when looking for a best-performance (fast) implementation. TreeMap (SortedMap interface) - Most useful when I'm concerned with being able to sort or iterate over the keys in a particular order that I define. LinkedHashMap - Combines advantages of guaranteed ordering from TreeMap without the increased cost of maintaining the TreeMap. (It is almost as fast as the HashMap). In particular, the LinkedHashMap also provides a great starting point for creating a Cache object by overriding the removeEldestEntry() method. This lets you create a Cache object that can expire data using some criteria that you define.

请看下图(大图)中每个类在类层次结构中的位置。TreeMap实现了SortedMap和NavigableMap,而HashMap没有。

HashTable已经过时,应该使用相应的ConcurrentHashMap类。

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

HashMap does not maintain any order. In other words , HashMap does not provide any guarantee that the element inserted first will be printed first, where as Just like TreeSet , TreeMap elements are also sorted according to the natural ordering of its elements Internal HashMap implementation use Hashing and TreeMap internally uses Red-Black tree implementation. HashMap can store one null key and many null values.TreeMap can not contain null keys but may contain many null values. HashMap take constant time performance for the basic operations like get and put i.e O(1).According to Oracle docs , TreeMap provides guaranteed log(n) time cost for the get and put method. HashMap is much faster than TreeMap, as performance time of HashMap is constant against the log time TreeMap for most operations. HashMap uses equals() method in comparison while TreeMap uses compareTo() method for maintaining ordering. HashMap implements Map interface while TreeMap implements NavigableMap interface.

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

HashMap is a map based on hashing of the keys. It supports O(1) get/put operations. Keys must have consistent implementations of hashCode() and equals() for this to work. LinkedHashMap is very similar to HashMap, but it adds awareness to the order at which items are added (or accessed), so the iteration order is the same as insertion order (or access order, depending on construction parameters). TreeMap is a tree based mapping. Its put/get operations take O(log n) time. It requires items to have some comparison mechanism, either with Comparable or Comparator. The iteration order is determined by this mechanism.

我更喜欢视觉呈现:

Property HashMap TreeMap LinkedHashMap
Iteration Order no guaranteed order, will remain constant over time sorted according to the natural ordering insertion-order
Get / put / remove / containsKey O(1) O(log(n)) O(1)
Interfaces Map NavigableMap, Map, SortedMap Map
Null values/keys allowed only values allowed
Fail-fast behavior Fail-fast behavior of an iterator cannot be guaranteed, impossible to make any hard guarantees in the presence of unsynchronized concurrent modification Fail-fast behavior of an iterator cannot be guaranteed, impossible to make any hard guarantees in the presence of unsynchronized concurrent modification Fail-fast behavior of an iterator cannot be guaranteed, impossible to make any hard guarantees in the presence of unsynchronized concurrent modification
Implementation buckets Red-Black Tree double-linked buckets
Is synchronized implementation is not synchronized implementation is not synchronized implementation is not synchronized