深入理解HashSet(底层是HashMap) | 您所在的位置:网站首页 › hashmap实现方法 › 深入理解HashSet(底层是HashMap) |
首先是有一个悲伤的故事
讲道理,这是面试时遇到的第一个卡壳以至于转移面试官注意力的地方(……),还好之前有被人指点一下加确实已经仔细研究过HashMap,才不至于无法补救 其次我TM惊呆了本想着回来以后好好看看HashSet的底层实现,结果打开源码一看的我惊呆了 wocao怎么这么刺眼呢?你是set啊,你是Collection的子类啊,你叔叔才是Map啊, 你这样我心好痛啊 冷静下来我仔细一想,Set不能有重复的元素,HashMap不允许有重复的键,又是一口老血,当时也没想到也没敢去这么想 转一下dalao的博客于是接着去看网上的dalao的博客,发现了这一篇私自转载dalao博文侵删 HashSet概述和实现HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持。它不保证set 的迭代顺序;特别是它不保证该顺序恒久不变,此类允许使用null元素。 在HashSet中,元素都存到HashMap键值对的Key上面,而Value时有一个统一的值private static final Object PRESENT = new Object();,(定义一个虚拟的Object对象作为HashMap的value,将此对象定义为static final。) HashSet插入当有新值加入时,底层的HashMap会判断Key值是否存在(HashMap细节请移步深入理解HashMap),如果不存在,则插入新值,同时这个插入的细节会依照HashMap插入细节;如果存在就不插入 删除同HashMap删除原理 源码分析盗(xue)用(xi)一下dalao 的分析代码,侵权请告之,立马删除 public class HashSet extends AbstractSet implements Set, Cloneable, java.io.Serializable { static final long serialVersionUID = -5024744406713321676L; // 底层使用HashMap来保存HashSet中所有元素。 private transient HashMap map; // 定义一个虚拟的Object对象作为HashMap的value,将此对象定义为static final。 private static final Object PRESENT = new Object(); /** * 默认的无参构造器,构造一个空的HashSet。 * * 实际底层会初始化一个空的HashMap,并使用默认初始容量为16和加载因子0.75。 */ public HashSet() { map = new HashMap(); } /** * 构造一个包含指定collection中的元素的新set。 * * 实际底层使用默认的加载因子0.75和足以包含指定 * collection中所有元素的初始容量来创建一个HashMap。 * @param c 其中的元素将存放在此set中的collection。 */ public HashSet(Collection |
CopyRight 2018-2019 实验室设备网 版权所有 |