大厂面试经典:List和Set的全面对比解析!

软件求生 2024-12-22 22:04:06



大家好呀,我是你们的技术分享伙伴小米! 最近,有不少小伙伴和我说,面试的时候经常被问到一些基础问题,比如List 和 Set 的区别。虽然听上去简单,但如果没有理解到位,真的很容易踩坑。所以,今天我们就来深挖一下这个经典问题,给大家一个清晰的解答!

从场景说起

故事从小明的面试开始。

小明面试了一家互联网大厂,技术面试官问他:

“Java 中的 List 和 Set 有什么区别?”

小明当时信心满满:“List 是有序可重复的,Set 是无序不重复的!”

面试官微微一笑:“那你能具体说说它们的实现原理,以及在实际场景中的应用吗?”

小明懵了,他的答案只停留在表面。于是,今天小米就带大家深入聊聊,这两个看似简单的集合到底有哪些细节需要注意!

基本概念解析

我们先来回顾一下List和Set的基本定义。

1. List

特点:有序、可重复。

实现类:常用的有 ArrayList 和 LinkedList。

使用场景:当需要按插入顺序存储数据,或者允许存储重复值时,List 是你的首选。

举个例子:班级点名时,学生名单里可能会有重复名字,比如“张伟”。点名顺序也很重要,所以用 List 很合适。

2. Set

特点:无序、不可重复。

实现类:常用的有 HashSet、TreeSet 和 LinkedHashSet。

使用场景:当需要确保元素唯一性,或者对集合元素进行排序时,Set 是更好的选择。

举个例子:微信群成员列表中,不允许有重复的人,用 Set 来存储更合适。

核心实现原理

知道了基本定义,我们再来深入聊聊它们的内部实现,帮助大家理解为什么会有这些特性。

1. List 的实现

ArrayList:底层基于动态数组实现,支持快速随机访问,增删效率相对较低。

LinkedList:底层基于双向链表实现,增删效率较高,但随机访问性能不如 ArrayList。

重点:List 的有序性来源于底层数据结构对插入顺序的维护。

2. Set 的实现

Set 的实现类通常与 Hash 或 Tree 数据结构相关:

HashSet:基于哈希表实现,通过 hashCode() 和 equals() 确保元素唯一性。

TreeSet:基于红黑树实现,自动对元素进行排序。

LinkedHashSet:在 HashSet 的基础上维护了一个链表,用于记录插入顺序。

重点:Set 的不重复性依赖于 hashCode() 和 equals() 方法。

经典面试追问

面试官在问完基础区别后,往往会继续深挖,比如下面这些问题:

1. 为什么 HashSet 可以保证元素唯一?

回答:

HashSet 的底层是基于 HashMap 实现的。

当往 HashSet 中添加元素时,首先通过 hashCode() 方法计算哈希值,然后定位到相应的哈希桶。

如果哈希桶中已经存在相同哈希值的元素,则会进一步调用 equals() 方法检查内容是否相等。

如果 equals() 返回 true,则认为是重复元素,不会添加。

2. 如何选择 List 和 Set?

回答:

如果需要保证顺序并允许重复值,选择 List。

如果需要保证唯一性或排序,选择 Set。

3. Set 中的元素如何排序?

回答:

使用 TreeSet,元素会按照自然顺序(或自定义比较器)进行排序。

如果使用的是 LinkedHashSet,元素则会按照插入顺序排序。

实际应用场景对比

1. List 的应用场景

需要按顺序存储数据,比如用户操作记录。

允许重复值,比如投票系统中每个人的投票记录。

2. Set 的应用场景

需要快速去重,比如清理爬虫爬取的重复 URL。

需要排序的唯一集合,比如生成有序的排行榜。

总结对比表

小彩蛋:一段综合性代码

最后,我们用一段代码来加深理解。

输出结果:

END

好了,今天的分享就到这里啦!希望大家看完后,不仅能轻松回答面试官的问题,还能在工作中正确选择集合类型。

觉得有帮助的小伙伴,记得点个赞,转发给更多正在学习的小伙伴吧!

我是小米,期待下次再和你们一起探索技术的奥秘!

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

0 阅读:0

软件求生

简介:从事软件开发,分享“技术”、“运营”、“产品”等。