Hashmap核心原理
Posted 程序员食堂
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Hashmap核心原理相关的知识,希望对你有一定的参考价值。
HASHMAP
昨天,概述了一下Hashmap的底层原理,今天再围绕Hashmap在JDK不同版本的一些区别,从实现改进的层面进一步深入了解Hashmap,希望大家能够对Hashmap深有体会,深刻理解Hash算法。
一、HashMap在jdk1.7和1.8中的区别
1.7中 使用一个Entry数组来存储数据,用key的hashcode取模来决定key会被放到数组里的位置,如果hashcode相同,或者hashcode取模后的结果相同(hash collision),那么这些key会被定位到Entry数组的同一个格子里,这些key会形成一个链表。
在hashcode特别差的情况下,比方说所有key的hashcode都相同,这个链表可能会很长,那么put/get操作都可能需要遍历这个链表也就是说时间复杂度在最差情况下会退化到O(n)
1.8中 使用一个Node数组来存储数据,但这个Node可能是链表结构,也可能是红黑树结构
如果插入的key的hashcode相同,那么这些key也会被定位到Node数组的同一个格子里。
如果同一个格子里的key不超过8个,使用链表结构存储。如果超过了8个,那么会调用treeifyBin函数,将链表转换为红黑树。
因此即使hashcode完全相同,由于红黑树的特点,查找某个特定元素,也只需要O(log n)的开销
也就是说put/get的操作的时间复杂度最差只有O(log n)
二、jdk1.8中的部分新特性
a) putVal方法源码
JDK1.8之前的版本新放入的元素是加在链表的头部的。我个人感觉遍历完链表再跑到其头部,有点画蛇添足,所以1.8之后都是尾插
b)扩容实现
之前提到了hashcode ,再BB两句hashCode
2.如果两个对象相同,就是适用于equals(java.lang.Object) 方法,那么这两个对象的hashCode一定要相同
3.如果对象的equals方法被重写,那么对象的hashCode也尽量重写,并且产生hashCode使用的对象,一定要和equals方法中使用的一致.
4.两个对象的hashCode相同,并不一定表示两个对象就相同,也就是不一定适用于equals(java.lang.Obj
ect) 方法,只能够说明这两个对象在散列存储结构中,如Hashtable,他们“存放在同一个篮子里“.再归纳一下就是hashCode是用于查找使用的,而equals是用于比较两个对象的是否相等的。
毕竟,毕竟,毕竟equsals是作为比较两个对象的最后一道防线
-end-
格式 1 ( 15px, #FFFFFF )
以上是关于Hashmap核心原理的主要内容,如果未能解决你的问题,请参考以下文章