HashMap

HashMap学习:链表数组,初始长度16,扩容因子0.75,代表每次容量为0.75的时候,就扩容为当前长度的2倍。同时实现了equals方法和hashcode方法,可以规避相同的K值存储一个,否则会放置多个。key可以为null。线程不安全,某些情况下会造成死锁

静态内部类:定义了一个entry类,用来保存键值对,同时next用来指向下一个entry,表示是一个链表

在扩容的时候涉及到数据搬迁,原来entry碰撞位置的指向是1-2-3的话,搬迁过后顺序为3-2-1,这个过程中有多线程的话,可能会造成循环链表1-2-1。http://www.importnew.com/22011.html

put方法,更具hashcode值确定元素的下标位置。会返回老的K对应的Value,更新新的Value

get方法:

另:如果一个元素只实现lequals方法,没有实现hashcode方法的话,会造成K的预期错误,2个K值相等的元素会放入到hashmap中,想要的结果是k值一样,元素覆盖。对于HashMap,hash相等和K值相等的话才认为是同一个K。

时间复杂度分析:

1.判断key,根据key算出索引。

2.根据索引获得索引位置所对应的键值对链表。

3.遍历键值对链表,根据key找到对应的Entry键值对。

4.拿到value。

分析:

以上四步要保证HashMap的时间复杂度O(1),需要保证每一步都是O(1),现在看起来就第三步对链表的循环的时间复杂度影响最大,链表查找的时间复杂度为O(n),与链表长度有关。我们要保证那个链表长度为1,才可以说时间复杂度能满足O(1)。但这么说来只有那个hash算法尽量减少冲突,才能使链表长度尽可能短,理想状态为1。因此可以得出结论:HashMap的查找时间复杂度只有在最理想的情况下才会为O(1),而要保证这个理想状态不是我们开发者控制的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值