HashMap 是将 Key 作 Hash 算法,而后将 Hash 值映射到内存地址,直接取得 Key 所对应的数据。在 HashMap 中,底层数据结构使用的是数组,所谓的内存地址即数组的下标索引。HashMap 的高性能须要保证如下几点:java
HashMap 其实是一个链表的数组。基于 HashMap 的链表方式实现机制,只要 HashCode() 和 Hash() 方法实现得足够好,可以尽量地减小冲突的产生,那么对 HashMap 的操做几乎等价于对数组的随机访问操做,具备很好的性能。可是,若是 HashCode() 或者 Hash() 方法实现较差,在大量冲突产生的状况下,HashMap 事实上就退化为几个链表,对 HashMap 的操做等价于遍历链表,此时性能不好。算法
HashMap 的一个功能缺点是它的无序性,被存入到 HashMap 中的元素,在遍历 HashMap 时,其输出是无序的。若是但愿元素保持输入的顺序,可使用 LinkedHashMap 替代。数组
LinkedHashMap 继承自 HashMap,具备高效性,同时在 HashMap 的基础上,又在内部增长了一个链表,用以存放元素的顺序。数据结构
HashMap 经过 hash 算法能够最快速地进行 Put() 和 Get() 操做。TreeMap 则提供了一种彻底不一样的 Map 实现。从功能上讲,TreeMap 有着比 HashMap 更为强大的功能,它实现了 SortedMap 接口,这意味着它能够对元素进行排序。TreeMap 的性能略微低于 HashMap。若是在开发中须要对元素进行排序,那么使用 HashMap 便没法实现这种功能,使用 TreeMap 的迭代输出将会以元素顺序进行。LinkedHashMap 是基于元素进入集合的顺序或者被访问的前后顺序排序,TreeMap 则是基于元素的固有顺序 (由 Comparator 或者 Comparable 肯定)。性能
LinkedHashMap 是根据元素增长或者访问的前后顺序进行排序,而 TreeMap 则根据元素的 Key 进行排序。测试
测试代码:code
package mapKeySet; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import java.util.TreeMap; /** * 2015年4月9日下午3:33:44 * @version 1.0 */ public class KeySetTest { public static void main(String[] args) { Map<String, String> map = new HashMap<String, String>(); map.put("a", "1"); map.put("b", "2"); map.put("c", "3"); map.put("d", "4"); System.out.print("HashMap:"); for(String key : map.keySet()) { System.out.print(map.get(key) + " "); } Map<String, String> linkedMap = new LinkedHashMap<String, String>(); linkedMap.put("a", "1"); linkedMap.put("b", "2"); linkedMap.put("c", "3"); linkedMap.put("d", "4"); System.out.print("LinkedHashMap:"); for(String key : linkedMap.keySet()) { System.out.print(linkedMap.get(key) + " "); } Map<String, String> treeMap = new TreeMap<String, String>(); treeMap.put("a", "1"); treeMap.put("b", "2"); treeMap.put("c", "3"); treeMap.put("d", "4"); System.out.print("TreeMap:"); for(String key : treeMap.keySet()) { System.out.print(treeMap.get(key) + " "); } } }
输出结果为:排序
HashMap:4 2 3 1 LinkedHashMap:1 2 3 4 TreeMap:1 2 3 4