HashMap常见面试题

HashMap与HashTable的主要区别在于线程安全性和空key处理。HashMap在1.7与1.8的区别体现在底层数据结构,1.8引入了红黑树以优化链表过长的查找效率。HashMap解决冲突的方式是链地址法,put方法实现包括计算hash值、处理冲突及扩容。负载因子0.75是为了兼顾空间利用率和冲突减少。1.7扩容可能导致死循环,1.8通过尾插入和红黑树避免了这个问题。在高并发环境下,推荐使用ConcurrentHashMap而非HashTable,因为HashTable的全局锁会降低性能。
摘要由CSDN通过智能技术生成

HashTable和HashMap的区别:

1、HashMap 线程不安全,可以放空key(只能放一个)

2、HashTable 线程安全,不可以放空key

存放空Key的hash值放在数组的哪个位置上:

存放在下标为0的位置上,也就是第一个链表的位置

HashMap1.7和HashMap1.8有什么区别:

1.7 底层用的是数组+链表实现的

1.8 底层用的是数组+链表+转换红黑树实现的

HashMap是如何解决Hash冲突问题的:

使用链表存放hash值相等且内容不等,存放在统一个链表中

HashMap的put方法底层是如何实现:

1、判断key如果为空的情况下,存放数组0

2、默认HashMap初始容量为16、负载因子大小 16*0.75 = 12 , 每次扩容 2 倍

3、根绝key计算hash值,存放到数组下标等于hash值的位置

4、如果计算出的hash值的位置已经存在数据(hash冲突),但是内容不等,则通过链表进行存储

5、如果当前size > 负载因子阈值,开始*2扩容

备注:1.8 中链表长度如果大于8的情况下,开始将链表转换为红黑树

为什么负载因子是0.75:

空间利用率高、冲突少、0.75最合适

HashMap 1.7中数组扩容死循环的问题:

HashMap面试题主要涉及以下几个方面: 1. HashMap底层数据结构是什么? HashMap底层数据结构是数组。当进行put()操作时,会进行hash计算,确定对象在数组中位置。如果多个对象的值在同一个数组位置上,就会出现hash冲突,此时会使用链表来解决冲突。 2. JDK 1.8为什么引入了红黑树? JDK 1.8引入红黑树是为了解决链表过长导致的性能问题。当链表长度超过一定阈值(默认为8),链表会转换为红黑树来提高查找效率。 3. HashMap的内部类Node<K,V>是什么作用? HashMap的内部类Node<K,V>实现了Entry接口,用于存储键值对的数据。每个Node对象表示一个映射关系,包含了键和值。 以上是关于HashMap的一些常见面试题,希望对你有帮助。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [史上最全Hashmap面试总结,51道附带答案,持续更新中...](https://blog.csdn.net/androidstarjack/article/details/124507171)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【硬核】HashMap最全面试题(附答案)](https://blog.csdn.net/weixin_43689480/article/details/118752906)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值