深入理解HashSet(底层是HashMap) 您所在的位置:网站首页 hashmap实现方法 深入理解HashSet(底层是HashMap)

深入理解HashSet(底层是HashMap)

2023-11-10 14:04| 来源: 网络整理| 查看: 265

首先是有一个悲伤的故事

讲道理,这是面试时遇到的第一个卡壳以至于转移面试官注意力的地方(……),还好之前有被人指点一下加确实已经仔细研究过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 实验室设备网 版权所有