时间: 2021年9月26日星期日 阴
说声抱歉
这个专辑做了12期,就放了 7 个月,这说起来我都不好意思,究其原因,还是懒,其他的理由都站不住脚,就是自己懒这个理由最坚挺,谁都得服。我自己也是服了,咋就一下懒了7个月呢。想想也是自己性格使然,又想想,这个专辑还得继续写下去,从今天继续吧。
问题
本期要说的是《2020年Java面试208题》的第17题,面试官问了一个特通用的问题:
请说说List,Set,Map的区别。
这个问题在对初级程序员的面试中,是特别常见,甚至很多中级程序员面试的时候也会遇到这个问题。
这个题我个人认为应该从三个接口的特性进行解释,最好在讲解的时候从源码的角度进行说明。
这个题目太简单,基本上很难讲出什么新意,所以如果按照老套路进行回答,面试官很难对你留下印象,因此,在几句话进行基础解答后,一定要扩展出自己的更深的理解。
演示面试
那么现在我就来进行演示面试。
您好,面试官。
1 List Set Map 这是三个接口。
2 一般来说,List 的元素是可重复的,Set的元素是不可重复的。
不过这一点在List和Set的源代码上并没有定义出来,其实很好理解,元素是不是重复,只能在方法的实现代码中进行约束,而接口在传统意义上来说是不支持方法的实现的,因此从代码级别分析 Set 并没有办法约束元素不重复。
Set 的官方文档是给出了建议,建议实现者不要元素重复。也就是说,这是一个协议,是一种约定。
3 一般来说,List的元素是有序的,Set的元素是无序的
List的方法定义中,有 indexOf 方法这个方法是找到某个元素在集合中的索引位置,从这一个方法的定义就决定了List中的元素必须是有序的,因为无序的话就没可能找到某个元素的索引位置。
List的 add 方法和 set 方法,也都有索引位置这个参数。
这几个方法就决定了 List 一定是有序的。
而 Set 是无序的这个事儿,就没办法在代码里面约束了,事实上,Set接口根本就没规定元素无序,甚至就没有这样的建议。只不过我们一般用HashSet 类用的多了,而HashSet是元素无序的,因此很多程序员总是说 Set 无序的,这个其实是错误的认识。比如 TreeSet 和 LinkedHashSet 都是有序的。
4 List 和 Set 都是元素单列的,Map是键值对结构的双列
个人感觉 Map 在底层其实也应该理解为是单列的,只不过Map的每个元素都是 Entry 类型的。这个Entry类型是 Map 接口的内部接口,该接口定义了一个键值对结构。因此,Map其实是一种变种的 Set, 当然,这是我个人的理解,没见过啥资料这么定义的 。
事实上 ,Map 和 Set是非常相像的,HashSet的底层就是使用的HashMap。
单纯从这三个接口的定义角度的解释,我就说这么多,我的回答完毕了。
下期再见
对这个问题最核心的回答,我觉得就应该说明这些,网上很多东拉西扯的讲一大堆ArrayList LinkedList HashMap SortMap啥的,我觉得扯得有点儿远,不过也不算错,能扯就扯会儿,毕竟你多说会儿就多一些机会。
如果真东拉西扯的话,我觉得还可以扯扯 JDK8接口的 default 方法,还可以在说说这三个接口对 Lambda语法的支持。这些都是挺给力的聊天热点,会让你的面试成功性更大。
不过我这一期就不说这些了,我今后把这些作为新的面试题讲讲吧。
好的,本期就到这里,我们下期再见。