HashSet源码解析(最好先看HashMap的源码解析)

HashMap的源码解析:https://mp.csdn.net/console/editor/html/106188425

HashSet:Java中的一个集合类,该容器不允许包含重复的数值

public class HashSet<E>extends AbstractSet<E>implements Set<E>, Cloneable, java.io.Serializable
{static final long serialVersionUID = -5024744406713321676L;private transient HashMap<E,Object> map;// Dummy value to associate with an Object in the backing Mapprivate static final Object PRESENT = new Object();

可以看出,HashSet类继承了AbstractSet类,并且实现了Cloneable,Serizalizable接口。

HashSet是基于HashMap实现的,因此建立了map变量

PRESENT是用来填充map中的value,定义为Object类型。

下面先来看HashSet的构造方法:

1.无参构造
public HashSet() {map = new HashMap<>();}2.参数为一个HashSet的实例对象
public HashSet(Collection<? extends E> c) {map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));addAll(c);}3.参数为初始化的大小以及负载因子
public HashSet(int initialCapacity, float loadFactor) {map = new HashMap<>(initialCapacity, loadFactor);}4. 参数为初始化的大小
public HashSet(int initialCapacity) {map = new HashMap<>(initialCapacity);}5.参数为初始化的大小,负载因子,以及一个标志位
HashSet(int initialCapacity, float loadFactor, boolean dummy) {map = new LinkedHashMap<>(initialCapacity, loadFactor);}//第五个构造函数为默认修饰符default,所以为包访问权限,只要是为了支持LinkedHashSet

接下来的iterator(),size(),isEmpty(),containss(),clear()方法都是基本上直接调用了HashMap的方法:

public Iterator<E> iterator() {return map.keySet().iterator();}public int size() {return map.size();}public boolean isEmpty() {return map.isEmpty();}public boolean contains(Object o) {return map.containsKey(o);}public void clear() {map.clear();}

add(),remove()把要加入,移除的值当作key,初始定义的PRESENT当作value来进行实现的

 public boolean add(E e) {return map.put(e, PRESENT)==null;}public boolean remove(Object o) {return map.remove(o)==PRESENT;}

clone()方法:

@SuppressWarnings("unchecked")public Object clone() {try {HashSet<E> newSet = (HashSet<E>) super.clone();newSet.map = (HashMap<E, Object>) map.clone();return newSet;} catch (CloneNotSupportedException e) {throw new InternalError(e);}}

@SuppressWarnings("unchecked")表示告诉编译器忽视unchecked警告

直接调用了父类的clone方法

这里的clone是深拷贝,当原来的本体发生了改变,克隆体不会变,看下面这个例子:

public class test {@SuppressWarnings("unchecked")public static void main(String[] args) {HashSet<Integer> set = new HashSet<>();set.add(1);set.add(2);set.add(3);set.add(4);set.add(5);HashSet<Integer> set1;set1 = (HashSet<Integer>) set.clone();System.out.println(set+"  "+set1);set.remove(5);set.add(6);System.out.println(set+"  "+set1);}
}输出的结果为:
[1, 2, 3, 4, 5]  [1, 2, 3, 4, 5]
[1, 2, 3, 4, 6]  [1, 2, 3, 4, 5]

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/484926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【前沿技术】2021年AI将改变制造业的6大应用趋势

来源&#xff1a;智能研究院 如今制造行业流行的是什么?我想&#xff0c;这可少不了“数字转换”、“工业4.0”、“人工智能(AI)”...下面&#xff0c;就让我们一起看看AI如何改变制造业。▍一、用于缺陷检测的深度学习在制造中&#xff0c;生产线中的缺陷检测过程变得越来越…

MarkDown/Html在线转换(支持代码高亮,可复制到微信公众号、今日头条)

MarkDown/Html在线转换能够将md渲染成html并且能保持代码高亮&#xff0c;可以方便的复制待格式的html粘贴到微信公众号&#xff0c;CSDN&#xff0c;简书&#xff0c;博客园&#xff0c;开源中国等。 扫码体验在线助手小程序 我是java代码public static void main(String[] ar…

idea控制台乱码问题

出现 淇℃伅 乱码 进入Tomcat下的 logging.properties 讲UTF-8改为GBK java.util.logging.ConsoleHandler.encoding UTF-8 java.util.logging.ConsoleHandler.encoding GBK

脑机接口简史——假如这篇推送是你靠意念打开的

来源&#xff1a;脑极体未来智能实验室的主要工作包括&#xff1a;建立AI智能系统智商评测体系&#xff0c;开展世界人工智能智商评测&#xff1b;开展互联网&#xff08;城市&#xff09;云脑研究计划&#xff0c;构建互联网&#xff08;城市&#xff09;云脑技术和企业图谱&a…

10-18考试记

10-18考试记 300分。开心。 1、咒语 【题目描述】 亮亮梦到自己来到了魔法城堡&#xff0c;但一扇巨大的石门阻拦了他通向城堡内的路。 正当他沮丧之际&#xff0c;突然发现门上有一处机关&#xff0c;机关上有一张很长的纸条。 亮亮拿起纸条的一端&#xff0c;只见上面写着打开…

一文读懂深度学习中的各种卷积

来源&#xff1a;海豚数据科学实验室编辑&#xff1a;王萌(深度学习冲鸭公众号)我们都知道卷积的重要性&#xff0c;但你知道深度学习领域的卷积究竟是什么&#xff0c;又有多少种类吗&#xff1f;研究学者 Kunlun Bai 发布了一篇介绍深度学习的卷积文章&#xff0c;用浅显易懂…

Leetcode--96. 不同的二叉搜索树(java)

给定一个整数 n&#xff0c;求以 1 ... n 为节点组成的二叉搜索树有多少种&#xff1f; 示例: 输入: 3 输出: 5 解释: 给定 n 3, 一共有 5 种不同结构的二叉搜索树: 1 3 3 2 1 \ / / / \ \ 3 2 1 1…

简介

现在市场上存在很多厂商推出的数据库管理系统&#xff0c;商业化的有Oracle、MSSQLServer、DB2、SybaseSQLServer、Informix&#xff0c;开源的有MYSQL、SQLite、SimpleSQL、Berkely DB、Minosse、Firebird、HSQLDB等&#xff0c;这些数据库产品的出现给了开发者更多的选择余地…

为什么信不过AI看病?数据集小、可靠性差,AI医疗任重道远

来源&#xff1a;机器之心近年来&#xff0c;AI 在医疗诊断中的应用受到了越来越多的关注&#xff0c;也出现了一些实际的应用场景&#xff0c;如药物筛选、AI 诊断。但似乎正确的 AI 医疗诊断难以实现&#xff0c;这是哪些原因造成的呢&#xff1f;本文探讨并汇总了人们对 AI …

URI与URL

统一资源标志符URI就是在某一规则下能把一个资源独一无二地标识出来。 拿人做例子&#xff0c;假设这个世界上所有人的名字都不能重复&#xff0c;那么名字就是URI的一个实例&#xff0c;通过名字这个字符串就可以标识出唯一的一个人。 现实当中名字当然是会重复的&#xff0c;…

p1470 Longest Prefix

原本就想到dp&#xff0c;可是是我的思路是在串的各个位置都遍历一次set&#xff0c;看dp[i-st[k]]是否为1且前length(st[k])是st[k]。这样200000*200*10会超时。更好的办法是在i位取前len<10个看dp[]和set中是否存在。只要200000*55*log200。 #include <iostream> #i…

人工智能学派之间的「联姻」——Yoshua 新作居然用DL「复活」了符号主义

来源&#xff1a;混沌巡洋舰 近日&#xff0c;Yoshua Bengio及其团队利用深度学习&#xff0c;开发出了一套可以揭示丰富视觉环境中的潜在规则的「神经生产系统」&#xff0c;使得现在暂时沉寂的符号人工智能重新恢复了活力。相信大家都知道&#xff0c;目前人工智能的主要学派…

域名,ip,mac地址

域名&#xff1a;由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称&#xff0c;用于在数据传输时对计算机的定位标识&#xff08;有时也指地理位置&#xff09;。 mac地址&#xff1a;物理地址、硬件地址&#xff0c;用来定义网络设备的位置。 IP地址&…

25万亿规模!中国智慧城市建设刚需在哪?

来源&#xff1a;帮尼资讯如果说当下在中国新基建中最火的名词是什么&#xff0c;智慧城市这四个字几乎脱口而出。而在雪亮工程已经基本结束的当下&#xff0c;智慧城市接过了雪亮工程的大旗&#xff0c;成为了对安防企业来说利润最大、保障最稳的政府类项目。前瞻产业研究院预…

Python面向对象(类的成员之属性)

day24 类的成员之属性 1 class Foo():2 def bar(self):3 print("bar")4 5 property6 def per(self):7 print(123)8 return 19 10 obj Foo() 11 obj.bar() 12 13 r obj.per#实际上是方法&#xff0c;但通过字段的方式访问 14…

浅析Serverless

近两年来&#xff0c;Serverless 概念在开发者中交流的越来越多&#xff0c;主题分享呈现爆发趋势。有人说&#xff1a;Serverless 正在改变未来软件开发的模式和流程&#xff0c;它就是云计算的未来。 在一个应用中包含了多个功能&#xff0c;如订单创建、订单查询和订单修改…

复兴or幻象?VR的2021三重门

来源&#xff1a;脑极体从2020年底开始&#xff0c;无论你日常看一些数码博主的评测&#xff0c;还是喜欢了解科技产业的动态、投融资的报道&#xff0c;都能在媒体中了解到这么一个信号&#xff1a;2021&#xff0c;VR复兴了&#xff01;当然&#xff0c;这个表述有很多说法&a…

关于ubuntu环境下gcc使用的几点说明

1 sudo apt-get build-dep gcc //安装gcc编译器2 3 4 /*5 假设已经创建hello.c文件6 */7 8 //方法一9 $gcc hello.c //将源文件直接编译成文件名为a.out的可执行文件 10 $./a.out //执行a.out可执行文件 11 12 13 //方法二 14 $gcc -o hello hello.c //将…

24张GIF图,让你秒懂非标自动化机构的原理

来源&#xff1a;工业机器人1.组合加紧机构↓↓2.凸轮连杆组合输送薄板机构↓↓3.热合联动↓↓4.凸轮双摇杆机构单独运动↓↓5.步进输送机构↓↓6.输出构件作间歇运动↓↓7.输出构件作间歇运动等宽凸轮间歇移动机构↓↓8.双摇杆夹紧机构↓↓9.不自锁推拉式夹紧机构↓↓10.双肘杆…

selectByExample和selectByExampleWithBLOBs的区别

1、问题描述&#xff1a; 在mybatis逆向工程生成的代码中会有selectByExample 和selectByExampleWithBLOBs 两个方法&#xff0c;这个两个方法有何区别&#xff1f; 2、问题解析&#xff1a; 1>两个方法的返回的resultMap 不同 selectByExample 方法返回&#xff1a;Base…