HashMap相关知识学习

2018-06-18 02:03:44来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

HashMap

HashMap是基于哈希表的Map接口的实现,HashMap是一个散列表,存储的内容是键值对(key-value)映射,键值对都可为null;

HashMap继承自 AbstractMap<K, V> 并实现 Map<K, V>, Cloneable, Serializable接口;

HashMap不是同步的,不是线程安全的;

HashMap实际上是一个“链表散列”的数据结构,即数组和链表的结合体。底层是个数组,数组上存储的数据是Entry<K,V>类型的链表结构对象。

HashMap和HashTable

HashMap和HashTable都实现了Map接口,主要区别有,线程安全性,同步(synchronize)和速度;

HashMap可以接受空的键值对而HashTable不行;

HashMap是非synchronize而HashTable是synchronize,意味着HashTable是线程安全的,多个线程可以公用一个HashTable;如果没有正确的同步,多个线程不能共享HashMap;

由于HashTable是线程安全的也是synchronize的,在单线程的环境下它比HashMap慢;

HashMap不能保证随着时间的推移Map中的元素的位置不变

HashMap,LinkedHashMap和treeMap

HashMap是无序的,LinkedHashMap和treeMap是有序的;

LinkedHashMap是HashMap的子类,保存了插入的顺序,需要输出的顺序和输入的顺序相同时可用LinkedHashMap;

treeMap实现了sortMap接口,能够把保存的数据按照键的值排序,默认是按照自然数排序也可自定义排序方式。

HashMap工作原理

HashMap基于哈希原理,可以通过put和get方法存储和获取对象。当我们将键值对传递给put方法时,它调用键对象的hashCode()方法来计算hashcode,然后找到对应的bucket位置存储键对象和值对象作为Map.Entry;如果两个对象的hashcode相同,所以对应的bucket位置是相同的,HashMap采用链表解决冲突碰撞,这个Entry(包含有键值对的Map.Entry对象)会存储到链表的下一个节点中;如果对应的hashcode和key值都相同,则修改对应的value的值。HashMap在每个链表节点中存储键值对对象。当使用get()方法获取对象时,HashMap会根据键对象的hashcode去找到对应的bucket位置,找到对应的bucket位置后会调用keys.equals()方法去找到连表中对应的正确的节点找到对象。

 

参考资料:http://www.importnew.com/7099.html,https://www.cnblogs.com/skywang12345/p/3310835.html

 

 

 

 

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:Java集合总结【面试题+脑图】,将知识点一网打尽!

下一篇:如何接手一个新项目