hashmap的含义
HashMap实现了Map接口,Map接口对键值对进行映射。Map中不允许重复的键。Map接口有两个基本的实现,HashMap和TreeMap。TreeMap保存了对象的排列次序,而HashMap则不能。HashMap允许键和值为null。HashMap是非synchronized的,但collection框架提供方法能保证HashMap synchronized,这样多个线程同时访问HashMap时,能保证只有一个线程更改Map。
hashmap的数据结构
hashmap出现于JDK1.2中,为map接口的实现类,底层通过拉链法来实现散列表,以达到存储数据的目的,散列表为数组+链表的结构,技术组上每个元素都是一条链表。
而之所以采用散列表的结构是因为:数组因为其地址连续,查找和修改元素效率高,时间复杂度为0(1),但其增加和删除元素效率低下,因为有可能会引发一半以上的数据偏移,平均时间复杂度为0(n),且因为地址连续,占用内存严重。
链表的优点为存储区间离散,内存占用宽松,且插入和删除其实只是地址间的相互拷贝,时间复杂度为0(1),但其查找一个元素往往需要遍历整条链表,时间复杂度为0(n)。
散列表就是综合了数组与链表优点的产物,平衡了两者的性能,是数据的增删和查询都有了较好的效率。
hashmap中的红黑树
如果某个桶中的记录过大的话(当前是TREEIFY_THRESHOLD = 8),HashMap会动态的使用一个专门的treemap实现来替换掉它。这样做的结果会更好,是O(logn),而不是糟糕的O(n)。
它是如何工作的?前面产生冲突的那些KEY对应的记录只是简单的追加到一个链表后面,这些记录只能通过遍历来进行查找。但是超过这个阈值后HashMap开始将列表升级成一个二叉树,使用哈希值作为树的分支变量,如果两个哈希值不等,但指向同一个桶的话,较大的那个会插入到右子树里。如果哈希值相等,HashMap希望key值最好是实现了Comparable接口的,这样它可以按照顺序来进行插入。这对HashMap的key来说并不是必须的,不过如果实现了当然最好。如果没有实现这个接口,在出现严重的哈希碰撞的时候,你就并别指望能获得性能提升了。
————————————————
版权声明:本文为CSDN博主「tuke_tuke」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tuke_tuke/article/details/51588156