JDK7时使用的主要步骤
当我们创建HashMap实例即new一个对象时,在底层HashMap会帮我们创建一个长度为16的一维数组,类型为Entry[],名为table。为什么长度是16?因为底层容量默认就是定义为16。
当我们逐个调用put方法将key-value(Entry对象)放入底层数组时,底层的方法首先会调用key(我们所插入的key-value中的key)所在类(不一定是自定义类,String,Object等都可,提到这三个类是因为自定义类你可以选择重写hashCode,而String则已经重写了hashCode,Object作为所有类的间接父类本身具有hashCode)的hashCode()计算当前key的哈希值(如果自定义类没有重写则调用其父类的hashCode)。
这个哈希值在经过某种算法计算后,能够得到该key-value将在数组中存放的位置。如果此时该位置没有其他元素,则该key-value直接添加成功。如果该位置上已经有元素了,则会比较key和该位置上已经存在的元素的哈希值。如果key的哈希值与其他数值的哈希值都不同,则该key-value直接添加成功。如果key的哈希值与某个元素的哈希值相同,则会调用key所在类的equals方法,若equals方法返回false,则该key-value直接添加成功,否则说明key与这个元素相同,则该key对应的value去覆盖这个元素的value值。
JDK8与JDK7使用的主要步骤区别:
- 在创建HashMap实例时,jdk7是直接创建数组,而jdk8是将负载因子赋给当前实例,没有创建数组,在第一次调用put时才会创建数组。

- jdk7底层数组为Entry类型,而jdk8底层数组是Node类型,

- 虽然本质上也是Entry类型。

- jdk7时底层结构为数组加链表,而jdk8时底层结构为数组加链表加红黑树。
- jdk7用的是头插法,而jdk8及之后使用的都是尾插法,那么他们为什么要这样做呢?因为jdk7是用单链表进行的纵向延伸,当采用头插法时会容易出现逆序且环形链表死循环问题。但是在jdk8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。
JDK8什么时候使用红黑树存储数据?
当数组的某一索引位置上的元素以链表形式存在的个数>=8并且当前数组长度>64时,此时该索引位置上的所有数据将会改用红黑树存储。

最低0.47元/天 解锁文章
1089

被折叠的 条评论
为什么被折叠?



