Java面试题 从源码角度分析HashSet实现原理?

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

应聘者: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中添加一个已经存在的元素,新添加的集合元素不会覆盖原来已有的集合元素;源码分析

 

源码分析code

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

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。hash

源码中HashSet的绝大部分方法都是经过调用HashMap的方法来实现的,其余的方法,就请你们本身查阅一下源码吧。class

相关文章
相关标签/搜索