Java的学习之路--HashMap原理

来源:互联网 发布:sql server有证书吗 编辑:程序博客网 时间:2024/05/29 10:51

http://www.cnblogs.com/chenssy/p/3521565.html
[链接为 树上月 博主的hashmap的总结]
http://blog.csdn.net/zhuhao717/article/details/47444763
[链接为 zhuhao717 博主的关于HashMap,LinkedHashMap,TreeMap的有序性的总结]

里面内容摘要:
1. HashMap实现了Map接口,继承AbstractMap
2. HashMap是一种支持快速存取的数据结构
3. Java中最常用的两种结构是数组和模拟指针(引用)
4. 实际上HashMap是一个“链表散列”
5. HashMap底层实现还是数组,只是数组的每一项都是一条链
6. 当length = 2^n时,不同的hash值发生碰撞的概率比较小,这样就会使得 数据在table数组中分布较均匀,查询速度也较快
7. 链的产生:系统总是将新的Entry对象添加到bucketIndex处。如果bucketIndex处已经有了对象,那么新添加的Entry对象将指向原有的Entry对象,形成一条Entry链,但是若bucketIndex处没有Entry对象,也就是e==null,那么新添加的Entry对象指向null,也就不会产生Entry链了
8. HashMap 是将 Key 做 Hash 算法,然后将 Hash 值映射到内存地址,直接取得 Key 所对应的数据。在 HashMap 中,底层数据结构使用的是数组,所谓的内存地址即数组的下标索引
9. HashMap是无序的Map实现类
10. TreeMap和LinkedHashMap是无序的Map实现类
11. 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 进行排序。

根据 zhuhao717博主中的测试代码,编写了自己的代码,如下:

package com.unimattna.test;import java.util.Map;import java.util.HashMap;import java.util.LinkedHashMap;import java.util.TreeMap;public class KeySetTest {    public static void main(String[] args) {        Map<Integer, String> hashmap = new HashMap<Integer, String>();        hashmap.put(1, "赵");        hashmap.put(0, "钱");        hashmap.put(3, "孙");        hashmap.put(2, "李");        System.out.println("HashMap: ");        for (Integer i : hashmap.keySet()) {            System.out.println(hashmap.get(i));        }        Map<Integer, String> linkedmap = new LinkedHashMap<Integer, String>();        linkedmap.put(1, "赵");        linkedmap.put(0, "钱");        linkedmap.put(3, "孙");        linkedmap.put(2, "李");        System.out.println("LinkedMap: ");        for (Integer i : linkedmap.keySet()) {            System.out.println(linkedmap.get(i));        }        Map<Integer, String> treemap = new TreeMap<Integer, String>();        treemap.put(1, "赵");        treemap.put(0, "钱");        treemap.put(3, "孙");        treemap.put(2, "李");        System.out.println("TreeMap: ");        for (Integer i : treemap.keySet()) {            System.out.println(treemap.get(i));        }    }}

输出结果:

HashMap:  钱 赵 李 孙LinkedMap: 赵 钱 孙 李TreeMap: 钱 赵 李 孙

由此可以看出:
HashMap 是无序的 (这里因为key值是用的Integer型,所以这里的输出顺序为按照key值从小到大的顺序输出的)
LinkedHashMap 是根据元素增加或者访问的先后顺序进行排序
TreeMap 则根据元素的 Key 进行排序

总结暂时到此,以后会加点自己的理解,之后会补充的。

原创粉丝点击