八股十问之Java集合Set

文章来源(公众号:八股bro,每天一篇经典面试题,内推大厂)

1、Set是什么?Set的实现类都有哪些?

Set是一个不能包含重复元素的集合。Set的实现类有HashSet, LinkedHashSet, TreeSet。

2、HashSet的实现原理是什么?

HashSet底层由HashMap实现,HashMap中的key值为HashSet中的元素,HashMap中的value为一个提前设定好的虚拟Object对象。HashSet集合中的元素允许为null。

3、HashSet提前设定的value对象为什么是Object类型,而不是null。

因为HashSet在删除元素时,会调用HashMap的remove方法,返回 map.remove(o)==PRESENT。当HashMap删除元素成功后,会返回value值,删除元素失败后,会返回null。如果HashSet初始的value对象PRESENT为null,那就无法判断HashMap删除元素是否成功了,因为无论成功或者失败,都会返回null==null。

4、HashSet如何插入一个元素?

HashSet插入元素,调用了HashMap的put方法。首先,计算插入元素的hash值,判断该元素是否出现过。如果存在两个key的哈希值是相同的,通过equals方法判断两个元素是否相等。如果二者不相等,则插入元素。

5、HashSet如果出现hash值冲突后怎么解决?

如果两个元素的hashcode()相等,但是equals()不相等。那么会用链地址法解决冲突。首先确定数组中元素位置,如果发生冲突,遍历该位置冲突链表。

6、hashcode()和equals()方法有什么关系?

equals()相等的两个对象,hashcode()一定相等,equals是可靠的。有时候不同对象,生成的hashcode可能是相同的,所以hashcode()方法不一定可靠。

7、HashSet和TreeSet有哪些异同?

  • HashSet中的元素可以为null,TreeSet中元素不能为null。
  • HashSet不能保证插入元素的排列顺序,TreeSet支持自然排序和定制排序。
  • HashSet底层使用哈希表实现,TreeSet底层采用红黑树实现。

8、TreeSet的实现原理是什么?

TreeSet的底层基于TreeMap实现,新加入的元素需要实现Comparable 接口。该接口里定义了一个compareTo(Object obj)方法。当一个对象调用该方法与另一个对象进行比较,例如obj1.comparTo(obj2),如果该方法返回0,则表明这两个对象相等;如果返回一个正整数,则表明obj1大于obj2;如果该方法返回一个负整数,则表明obj1小于obj2.

9、Comparable接口和Comparator接口有什么区别?

  • Comparable 自然排序。(实体类实现)
  • Comparator 是定制排序。(无法修改实体类时,直接在调用方创建)
  • 二者都实现的情况下,遵守Comparator排序规则。

10、如何按照元素加入顺序遍历Set?

可以使用LinkedHashSet。LinkedHashSet保证元素不重复,并且按照插入顺序排序。LinkedHashSet底层由LinkedHashMap实现。在构造LinkedHashSet时,实际上是调用了HashSet(int initialCapacity, float loadFactor, boolean dummy)三个参数的构造函数。

文章来源(公众号:八股bro,每天一篇经典面试题,内推大厂)
#Java开发##Java##学习路径#
全部评论
华为OD招聘,待遇丰厚,有意者进
点赞 回复 分享
发布于 2022-02-14 09:07
谢谢大佬的分享 东西很好用
点赞 回复 分享
发布于 2022-02-11 19:46

相关推荐

点赞 评论 收藏
分享
purcoter:虚拟货币预测正确率百分之99,还要找工作干嘛,不早就财富自由了
点赞 评论 收藏
分享
评论
13
106
分享

创作者周榜

更多
牛客网
牛客企业服务