[学习日记]简述hashmap
hashmap的底层实现 jdk7
当new hashmap()以后,底层创建了 一个是长度是16的一维数组,数组的类型是Entry[] 类型,数组的名称叫table,当map调用put()方法时,可能之前已经调用了多次put()了,我们希望把我们的key value放入到我们的数组中,首先,调用key所在类的hashcode()方法计算key的hash值,此hash值经过某种算法计算以后,得到在Entry数组中的存放位置,如果此位置的数据为空,则直接添加,如果此位置的数据不为空,意味此位置上存在一个或者多个数据(以链表形式存在),比较key和已经存在数据的hash值,如果key的hash值和已经存在的数据的hash值都不相同,此时key value就添加成功,如果key的hash值和已经存在的数据的hash值相同,则继续比较,调用key所在类的equals()方法比较,如果equels()返回false,key value就添加成功,如果equels()返回true,使用value去替换相同key的value值
在不断的添加过程中,会涉及到扩容的问题,默认的扩容方式为原来容量的2倍,并将原有的数据复制过来
jdk8相较于jdk7的不同
在new hashmap()时,底层没有创建一个长度为16的数组,jdk8底层的数组为node()类型,而非entry类型,首次调用put方法是,底层去创建长度为16的数组,jdk7的底层结构只有数组+链表,jdk8的底层结构数组+链表+红黑树,当数组的某一个索引位置上元素以链表形式存在的数据个数 >8,且当前数组的长度超过64,此时索引位置上的数据改为红黑树存储