温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Java面试中如何从源码角度分析HashSet实现原理

发布时间:2021-10-13 11:25:10 来源:亿速云 阅读:105 作者:柒染 栏目:编程语言

这篇文章给大家介绍Java面试中如何从源码角度分析HashSet实现原理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

面试官:请问HashSet有哪些特点?

应聘者:HashSet实现自set接口,set集合中元素无序且不能重复;

面试官:那么HashSet 如何保证元素不重复?

应聘者:因为HashSet底层是基于HashMap实现的,当你new一个HashSet时候,实际上是new了一个map,执行add方法时,实际上调用map的put方法,value始终是PRESENT,所以根据HashMap的一个特性: 将一个key-value对放入HashMap中时,首先根据key的hashCode()返回值决定该Entry的存储位置,如果两个key的hash值相同,那么它们的存储位置相同。

如果这个两个key的equalus比较返回true。那么新添加的Entry的value会覆盖原来的Entry的value,key不会覆盖。因此,如果向HashSet中添加一个已经存在的元素,新添加的集合元素不会覆盖原来已有的集合元素;

源码分析

先来看一下无参的构造函数:

public HashSet() {  map = new HashMap<>();}

很显然,当你new一个HashSet的时候,实际上是new了一个HashMap

再来看一下add方法:

private static final Object PRESENT = new Object(); public boolean add(E e) { return map.put(e, PRESENT)==null;}

定义一个虚拟的Object PRESENT是向map中插入key-value对应的value,因为HashSet中只需要用到key,而HashMap是key-value键值对;所以,向map中添加键值对时,键值对的值固定是PRESENT。

源码中HashSet的绝大部分方法都是通过调用HashMap的方法来实现的,其他的方法,就请大家自己查阅一下源码吧。

关于Java面试中如何从源码角度分析HashSet实现原理就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI