java面试重难点之集合专题-Map

大家好,现在开始陆续更新面试题,文章部分是我在面试中遇到的重难点,参考于网络,现将总结出来,帮助大家准备春招、暑期实习等。

如果有帮助,记得点赞收藏关注哦,你们的支持是我更新的动力,接下来会陆续更新各个专题的面试题。

Map集合主要考查HashMap,在这个专题里我会重点列出相关面试题。

1、Map集合图

主要了解常见的HashMap、HashTable,SortedMap、LinkedHashMap、TreeMap,并了解相关关系。

(图片来源于网络)

2、HashMap集合简介

HashMap基于哈希表的Map接口实现,是以key-value存储形式存在,即主要用来存放键值对。HashMap 的实现不是同步的,这意味着它不是线程安全的。它的key、value都可以为null。此外,HashMap中的映射不是有序的。

JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突(两个对象调用的hashCode方法计算的哈希码值一致导致计算的数组索引值相同)而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(或者红黑树的边界值,默认为 8)并且当前数组的长度大于64时,此时此索引位置上的所有数据改为使用红黑树存储。

补充:将链表转换成红黑树前会判断,即使阈值大于8,但是数组长度小于64,此时并不会将链表变为红黑树。而是选择进行数组扩容。

这样做的目的是因为数组比较小,尽量避开红黑树结构,这种情况下变为红黑树结构,反而会降低效率,因为红黑树需要进行左旋,右旋,变色这些操作来保持平衡 。同时数组长度小于64时,搜索时间相对要快些。所以综上所述为了提高性能和减少搜索时间,底层在阈值大于8并且数组长度大于64时,链表才转换为红黑树。具体可以参考 treeifyBin方法。

当然虽然增了红黑树作为底层数据结构,结构变得复杂了,但是阈值大于8并且数组长度大于64时,链表转换为红黑树时,效率也变的更高效。

3、HashMap的put方法

HashMap的put方法可分成1.7与1.8两个版本

1.7:①、调用 hash(K) 方法计算 K 的 hash值,然后结合数组长度,计算得数组下标; hash(k)&(length - 1)

②、判断是否需要扩容(当容器中的元素个数大于 capacity * loadfactor 时,容器会进行扩容resize 为 2n);

③、i.如果 该位置不存在元素,则执行插入,若存在,则发生碰撞;

如果该位置存在元素的话,用equals方法 判断当前数组位置上key以及这个位置链表中的key是否相等,相等的话就覆盖该key的value;

如果不相等的话就用头插法插入该键值对

1.8:①、调用 hash(K) 方法计算 K 的 hash值,然后结合数组长度,计算得数组下标;

②、判断该位置是否存在元素,如果不存在就把key和val封装成entry对象加入链表

③、如果该位置存在元素,判断该节点是红黑树节点还是

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值