Java社招面试题:Map的Key你真的了解吗?

大家好,我是积极分享技术的小米!今天给大家带来一道经典的Java社招面试题:“能否使用任何类作为Map的Key?为什么HashMap中String、Integer这样的包装类适合作为Key?如果使用Object作为HashMap的Key,应该怎么办?” 这个问题看似简单,但实际上涉及到HashMap的核心机制,面试中说得清楚绝对能让面试官眼前一亮!

话不多说,让我们通过一个小故事,边学边聊。

故事从小明找工作说起。小明在面试时被问到:“你能用任何类作为Map的Key吗?”

小明想了想,答:“理论上可以吧,但会有坑。”

没错,理论上任何类都可以作为Map的Key。但是!能否真正高效和正确地使用,得满足两个条件:

  • 必须重写hashCode()方法:这是因为HashMap基于哈希表实现,hashCode()决定了对象的存储位置。
  • 必须重写equals()方法:当两个对象的hashCode相同,HashMap会使用equals()方法来判断它们是否真的相等。

如果你用的类没有重写这两个方法,HashMap就可能无法正确判断Key是否相等,导致奇怪的行为。比如,明明存进去了,却取不出来。

接着,面试官进一步追问:“那为什么StringInteger这样的包装类适合作为Key呢?”

小明顿时慌了,但冷静下来,他回忆起学过的知识,侃侃而谈。

String

  • String的hashCode()实现简单明了,基于内容计算哈希值。
  • 它的equals()方法也是内容比较,完全符合HashMap的需求。
  • 不可变性:String是不可变类,哈希值一旦计算,就不会因内容变化而失效。

Integer

  • Integer的hashCode()直接返回它的值,简单高效。
  • equals()也是基于值的比较。
  • 同样是不可变的包装类,Key的状态不会因外部修改而改变。

对比之下,如果你使用一个可变对象作为Key,比如一个List,情况会变得复杂。如果在存入HashMap后,你修改了List的内容,它的hashCode就会改变,导致HashMap无法正确找到存储的位置。

这时,面试官继续刁难:“假如我想用自己的类Person作为Key呢?”

小明心里有底了,他微微一笑:“那就得自己实现hashCode()equals()方法了。”

如何实现?

以下是小明举的例子:

  • hashCode():使用Objects.hash()方法将name和age的值组合成一个哈希值,保证哈希分布的均匀性。
  • equals():确保当两个对象的name和age都相同时,它们被认为是相等的。

1、不可变性

Key最好是不可变的(如StringInteger),否则会导致数据一致性问题。

2、重写规则一致

如果你重写了equals(),就必须重写hashCode(),并保证规则一致:

  • 如果两个对象相等(equals()返回true),它们的hashCode必须相等。
  • 如果两个对象不相等,它们的hashCode尽量不同。

3、合理选择Key

如果使用复杂对象作为Key,确保它的字段值不会频繁变动,否则建议使用唯一标识符(如ID)。

面试结束后,小明总结道:

  • 能否使用任何类作为Map的Key?:可以,但必须保证重写hashCode()和equals()方法。
  • 为什么String和Integer适合作为Key?:它们有良好的hashCode()和equals()实现,并且是不可变类。
  • 如果使用自定义类作为Key?:重写hashCode()和equals()方法,确保Key的唯一性和一致性。

希望今天的分享对大家有所帮助!如果你喜欢这样的技术干货,记得点个“在看”支持小米哦~

你有没有踩过使用HashMap时Key不合适的坑?欢迎在评论区分享,我们一起探讨!

我是小米,一个喜欢分享技术的29岁程序员。如果你喜欢我的文章,欢迎关注我的微信公众号软件求生,获取更多技术干货!

有程序员专门的刷题网站吗?

废话不多说,直接进入主题。

五个国内+五个国外,满足你所有面试和学习需求。

优点:题型多题目多且经典。在国内绝对是头部的刷题软件了。

算法学习网站,上去每天刷两道算法题,走遍天下都不怕。

集笔面试系统、题库、课程教育、社群交流、招聘内推于一体的招聘类网站。各个公司的面试题和面经分享,找工作前认真刷一刷,一定会有很大收获!拿到心仪的 offer!

这是国外发起的一个 Web 开发学习的网站,从简单到深入,一步一步带你学习 Web 开发。就像一本练习册,并且当你完成相应的内容后,会得到相应的资格认证。

学前端的看这里,百度官方推出的前端开发学习技术学院,题目从简单到困难,如果你把里面的题都做会了,找个 BAT 的前端工作不成问题的。

AtCoder是日本最大的算法竞技网站,支持日语和英语两种语言,对于学日文的小伙伴来说是最再合适不好过的。

(图中右上角椭圆内就是切换英语日语的开关,两个语言的界面是不一样的哦,大家自己去看看英文版的界面)

作为“战斗民族”最大的刷题网站,Timus Online Judge中的题目大多来自于乌拉尔联邦大学,乌拉尔锦标赛,乌拉尔ACM ICPC竞赛和彼得罗扎沃茨克训练营举行的比赛。有比较进阶的演算法题目,难度偏高。能力比较强的小伙伴可以试一试哦。同时该网站还支持俄语和英语两种语言,学俄语的小伙伴不要错过哦。(切换的按钮在图中的左上方椭圆内哦)

“SPOJ”是波兰Sphere实验室建立的,题目很有特色,但是品质参差不齐,小伙伴们需要自己甄别一下,但是会员可以自创题目,而且其高级用户是允许根据自己的规则和问题来组织竞赛。

这个网站可以说是一个程序设计比赛的网站,每个月都有两到三次在线比赛,根据比赛的结果对参赛者进行新的排名。参赛者可根据自己的爱好选用Java, C++, C#, VB或python进行编程。采用比赛、评分、支酬等方式吸引众多平面设计师和程序员进行业余工作。

该网站是俄罗斯萨拉托夫国立大学的团队创立运营的。是全球最著名的在线评测系统之一,这里有高水平的选手,高质量的题目,高密度的比赛。

Java八股文刷题,有捷径可走吗?(附刷题路线和题目整理)

刷Java面试八股文有捷径吗?

java 基础, Java 集合、Java 并发编程,JVM,Spring ,SpringBoot,微服务, Kafka ,分布式,Redis ,分布式事务,设计模式,算法,数据结构,MySQL ……这么多相关内容,要背到什么时候?

现下 Java 八股文资源满天飞,但面试题那么多,到底该先刷哪个?

鸭鸭只能说,捷径没有,但刷题路线,倒有一条。

我们按照校招、初级开发、中级开发、高级开发不同岗位,以及大厂面试官团队的实际招聘和工作经验总结,整理了4条 Java 八股文刷题路线,想要的朋友点个赞,点击 面试鸭 即可领取学习路线。

对学编程的同学来说,八股文是不得不熟悉的一位“朋友”,面试总要考,日常必须刷。

而且刷题的体验感一般,投入了很多时间精力,搜索题目,刷题背题,但并不一定能带给你一个很好的面试结果。大家总免不了私下吐槽,每次参加面试,都好像在被面试官狠狠拷打。

特别是 Java 、 python 之类常见方向的面试八股文,虽然在互联网上一搜一大把,但问题也不少,八股文的题目和题解质量参差不齐,即便花了大量时间在八股文上,依然可能在面试中遇到意料之外的问题。

因此,我们花大量时间人力,为大家打造了八股文面试神器。紧跟面试趋势,持续更新题库和题解,同时邀请大厂面试官原创题解,为大家提供大量的优质面试八股文题目和题解,我们还提供了网页和小程序双端,方便大家进行刷题。

1)系统复习,重点突击

常常是越到面试前夕,大家越是在刷面试八股文。毕竟,几天时间,你可能写不完一个新的项目,但你可以多背好几道八股文面试题。

有的同学常常是下载几个面试题压缩包,然后蒙头就背,主打一个多背点安心。

但盲目背题真的很花时间!常常是事倍功半而不自知。因为对不同工作经验的同学来说,需要重点学习背诵的Java八股文题目是有区别的。因此,除了系统地重温Java编程语言的基础知识、深入理解Java面向对象的概念问题,以及掌握常见场景题外,还需要有侧重地对Java知识进行复习。

我们在邀请大厂面试官创作和优化题解的同时,也根据之前工作和面试人的经验,为大家总结了不同的Java八股文刷题路线,供同学们选择。

Java 面试刷题路线就是我们为大家“划的重点”。

在系统复习之后,同学们可以根据我们的 Java 面试刷题路线,有侧重地复习 Java 。

2)整理笔记,理解归纳

刷题和背题外,最重要的还是将知识理解归纳,变成“自己的东西”。

整理笔记是一个好办法。

当然,同学们也可以直接根据我们的 Java 刷题路线,在刷题的同时,针对自己对知识的掌握情况,直接在刷题路线上记录。

面试鸭的题目涵盖几乎所有主流变成方向,Java 开发的知识点就覆盖了 Java 基础、主流框架、并发编程、JVM ……我们的题库还根据面试考点进行了优先级的调整

公司面试时常考的面试题,或是意想不到的冷门题目,你在面试鸭都能找到。除了详细的题解,面试鸭同样为你准备了图片,辅助理解,保证题解通俗易懂,在背题的同时,也学习巩固了知识。

背八股文是一种手段,但刷题和背题,同时也是增加我们知识广度的一个方法。

在我们学习理解了大量八股文后,我们同样可以基于这些知识,真正能学到东西 ,全面提升技术视野、开发能力和面试经验。

本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com

点赞 0
收藏 0

文章为作者独立观点不代本网立场,未经允许不得转载。