Java面试题 从源码角度分析HashSet实现原理?
2019-07-25 06:45
1561 查看
面试官:请问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的方法来实现的,其他的方法,就请大家自己查阅一下源码吧。
相关文章推荐
- 从源码角度分析HashSet实现原理?
- Java并发框架Disruptor实现原理与源码分析(三) RingBuffer原理模型与源码分析
- (转载)Java中HashMap底层实现原理(JDK1.8)源码分析
- Java基于微信公众号接口实现授权登录源码及原理分析
- java并发编程之源码分析ThreadPoolExecutor线程池实现原理
- 从虚拟机指令执行的角度分析JAVA中多态的实现原理
- 【Java集合学习系列】HashMap实现原理及源码分析
- HashSet实现原理及源码分析
- (10) java源码分析 ---- HashMap源码分析 及其 实现原理分析
- 从源码角度分析RACObserve的实现原理(一)
- [转]Java HashMap实现原理与源码分析
- JAVA基础之HashMap实现原理及源码分析
- Java中HashMap底层实现原理(JDK1.8)源码分析
- Java中HashMap底层实现原理(JDK1.8)源码分析
- Java面试绕不开的问题: Java中HashMap底层实现原理(JDK1.8)源码分析
- Java中HashMap底层实现原理(JDK1.8)源码分析
- Java集合ArrayList实现原理——源码分析
- (10) java源码分析 ---- HashMap源码分析 及其 实现原理分析
- Java多线程之ThreadPoolExecutor实现原理和源码分析(五)
- Java集合LinkedList链表实现原理及源码分析详解_一点课堂(多岸学院)