HashMap知识点

使用的数据结构:
1.8以前:数组+链表
1.8以后:数组+红黑树+链表
为什么使用数组+链表+红黑树,而不是只用数组或链表?
1.数组的查询速度快,但是增删速度慢。
链表的增删速度快,但是查询速度慢。
hashMap集合了这2种优点。
数组初始长度是16, 
加载因子 0.75
put方法:
1.如果HashMap未被初始化,则初始化
2.对key求Hash值,再计算下标。
3.如果没有碰撞,直接放入桶中,如果碰撞了,以链表的方式放到后面。
4.如果链表的长度超过8,转成红黑树
5.如果链表地长度小于6,转回链表
6.如果节点已经存在就替换旧值。
7.如果数值超过0.75,就扩容2倍。
特性:
1.存储非同步,线程不安全
2.底层是hash表,不保证有序。
3.key值重复则覆盖。
hashMap中什么时候需要进行扩容,扩容resize()又是如何实现的?
当数组Size达到数组长度*加载因子时,分配一个新的数组,在将原来数据逐步计算hash值放置进去。
谈一下hashMap中get是如何实现的?
对key求hash值,获取位置,如果在桶的首位直接返回就行,否则对链表进行遍历,使用equals方法查找节点。
为什么是16?为什么必须是2的幂?如果输入值不是2的幂比如10会怎么样?
为了数据均匀分布,减少hash冲突。
谈一下当两个对象的hashCode相等时会怎么样?
会产生hash碰撞,若key值相同,会进行替换,否则会链接到链表后面,长度超过阙值转为红黑树。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值