首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

HashMap在JDK1.7以及JDK1.8的区别?

底层是以数组+单链表的形式进行存储的! 1.1.实例化:在底层直接创建Entry[]一维空数组,在第一次put元素时进行初始化和计算容量,数组长度为大于等于给定Size的最小2的次幂。 1.2.插入键值对: 当调用put(key,value)时,经历以下步骤: ①计算key的哈希值(详见我的之前一篇写HashMap底层哈希值计算的文章),然后将哈希值与数组长度-1进行按位与运算,得到应该存储的数组下标索引。 ②如果该数组位置没有Entry,则直接添加即可。 ③若该数组位置已经有Entry了,则计算key与该位置上的其他key的hash值,如果hash值都不相同,则采用头插法添加(key,value)到该数组位置。若与某个Entry中的key的hash值相同,则进一步通过equals方法进行比较,若equals相同则覆盖,若不同则采用头插法添加(key,value)到该数组位置。 1.3.扩容方式 先进行条件判断,key是否为空等等。然后准备进行Entry添加。 当数组的长度大于等于threshold且要插入的地方不为null空值时,进行扩容为原来的2倍。 扩容后需要重新计算要插入元素的hash值,并且计算在新数组长度下的索引。 1.4.Hash算法: 1.7版本会进行判断,当要插入的键值为字符串时,选用其他的hash值计算方法。并且hash值计算完之后采用复杂的避免hash碰撞的运算。hash值没有用final修饰,在进行扩容后可以重新计算。

00
领券