Java面试题之 -- HashMap常见面试题总结

本文总结了Java中HashMap的常见面试题,涵盖了HashMap的工作原理,包括hashing、碰撞处理、get()方法逻辑,以及当两个对象hashCode相同的情况。还讨论了多线程环境下HashMap的条件竞争问题,为什么String和Integer适合作为键,以及自定义对象作为键的注意事项。最后,提到了ConcurrentHashMap与HashTable的对比。
摘要由CSDN通过智能技术生成

1. 你用过HashMap吗, 什么是HashMap? 为什么用到它?

用过, 然后可以接着回答一些HashMap的特性, 比如HashMap可以接收null键值和值, 而HashTable则不能, HashMap是非synchronized的; HashMap很快, 以及HashMap存储的是键值对等.

2. 你知道HashMap的工作原理吗? 你知道HashMap的get() 方法的工作原理吗?

HashMap是基于hashing的原理, 我们使用put(key, value) 存储对象到HashMap中, 使用get(key) 从HashMap中获取对象, 当我们给put() 方法传键和值时, 我们先对键调用hashCode()方法, 返回的hashCode用于找到bucket的位置来存储entry对象.

这里关键点在于指出, HashMap是在bucket中存储键对象和值对象, 作为Map.Entry 这一点有助于理解获取对象的逻辑.  如果你没有意识到这一点, 或者错误的认为仅仅只在bucket中存储值的话, 你将不会回答如何从HashMap中获取对象的逻辑. 

3. 当两个对象的hashCode相同会发生什么?

这个问题一般是分界点了. 一般同学都会回答, 因为hashCode相同, 所以两个对象是相等的, HashMap将会抛出异常, 或者不会存储它们.  

这个时候, 如果面试官对你之前的回答比较满意, 可能会提醒你他们有equals()和hashCode(0两个方法, 并告诉他们两个对象就算hashCode相同, 但是他们可能并不相等.  如果掌握的不太好, 可能这个问题就会不了了之.

而这个题的答案是: 因为hashCode相同, 所以他们的bucket位置相同, 碰撞会发生, 因为HashMap使用链表存储对象, 这个Entry(包含有键值对的Map.Entry)会存储在链表中, 这个时候要根据hashCode来划分数组, 如果数组的坐标相同, 则进入链表这个数据结构中了, 一般的添加都在最前面, 也就是和数组下标直接相连的地方, 链表长度到达8的时候, JDK1.8上升为红黑树. 这样回答基本就ok了, 要不要

  • 3
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值