HashSet的去重问题_set<string> set1 = new hashset<string>(); set1.add-程序员宅基地

技术标签: java语言  hashCode  equals  去重  Object  HashSet  

HashSet的去重问题:
我们知道HashSet在存放对象的时候会判断对象时候是同一对象。
默认引用类型比较的是地址值,如果地址值相同,那么这是一模一样的对象,那么判断肯定是同一对象,就不再重复的往里放。

如果对象重写了hashcode和equals方法,就比较这二者是否相等。
如果hashcode相等,那么比较equals方法,如果equals再相等,那么证明这是同一个对象;如果equals不相等,那么及时hashcode相等,也是两个对象。
所以得证:
如果equals不相等,那么hashcode可能相等;
如果equals相等,那么hashcode一定相等。
如果hashcode相等,那么equals可能相等;
如果hashcode不相等,那么equals一定不相等。
因此举个例子:
再举例子之前先看一个代码:
String s =”中国”;
String s1 = new String(“中国”);
System.out.println(s==s1);
结果我们知道肯定是不相等的。
		Set<String> set1 = new HashSet<String>();
		String s = "中国";
		set1.add(s);
		set1.add(s);
		String s1 = new String("中国");
		set1.add(s1);
		System.out.println(set1.size());
结果是多少?
可能我们会以为,s和s1的地址值不一样,那么肯定是两个不同的对象,所以应该是存入了两个对象,那么结果应该是2.
其实结果是1,
为什么?因为我们说了 引用类型如果没有重写hashcode和equals方法,那么默认比较的是Object类的hashcode和equals方法。
Object类中的hashcode返回的是是通过将该对象的内部地址转换成一个整数来实现的。
如:
 
Hashcode也能确保对象的唯一性。
而equals默认比较的是对象的地址值。


 因此,默认情况下比较不同的引用类型结果肯定是不同的对象。
那么为什么我们刚才比较的地址值不同,但是存放的时候却被HashSet判定是一样的呢?
就是因为String重写了hashCode和equals方法造成了HashSet判断是同一元素的缘故。
 

 
可以自己思考一下。


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_28385797/article/details/72834970

智能推荐

Flask+Bootstrap Web开发中Python代码嵌入html 时中文显示失败的解决方法_flask wtforms 中文错误-程序员宅基地

文章浏览阅读4.7k次。最近由于的调整,要使Python的Flask框架和Bootstrap框架结合开发web项目非常方便,但今天在写项目时遇到一个问题,上网查了很久都没有找到具体的方法,最后尝试进行修改Python文件解决问题。问题过程:在Python文件中使用flask定义的表单进行表单类文件的编写,demon代码如下:# _*_ coding:utf-8 _*_from flask import F_flask wtforms 中文错误

Linux系统上SQL Server中文乱码问题解决办法_linux sqlserver utf8-程序员宅基地

文章浏览阅读2.1k次。刚在linux上搭建好了SQL Server。结果试了一下。显然中文乱码了。解决乱码最直接的办法就是修改编码了。把数据库使用的编码改成支持中文的就行。建库的时候指定UTF8编码create database dbteston primary( name='dbtest_data', filename='/var/opt/mssql/data/dbtest.mdf')col..._linux sqlserver utf8

uboot device tree宏定义_config_default_device_tree-程序员宅基地

文章浏览阅读1.3k次。了解 uboot device tree 宏定义(README.fdt-control)1.CONFIG_OF_CONTROL  To enable this device tree feature, add CONFIG_OF_CONTROL to your board config file.2.CONFIG_DEFAULT_DEVICE_TREE  To set the file..._config_default_device_tree

Unity全局光照/Bake GI/Precomputed Real-time GI/Lightmap/Light Probe_csdn unity 动态物体 静态光照-程序员宅基地

文章浏览阅读2.5k次,点赞2次,收藏18次。目录Baked GILightmap和Light ProbePrecomputed Real-time GIUnity的全局光照系统采用Enlighten解决方案,包含Baked GI和Precomputed Real-time GI系统。在不开启全局光照时,Unity的光源只产生直接光照的效果,没有任何间接光照。Baked GIBaked GIBaked GI采用一个离线的烘焙过程,将静态物体接收到的光照信息存入Lightmap中储存。由于烘焙是离线的过程,可以耗费时间来计算复杂的间接光照,将结果_csdn unity 动态物体 静态光照

Javascript 产生随机数——服从均匀分布随机数、服从正态分布(高斯分布)随机数、服从柯西分布随机数_js 正态分布随机数-程序员宅基地

文章浏览阅读3.6k次,点赞6次,收藏16次。Javascript 产生服从均匀分布随机数大家都知道Math.random是 javascript 中返回伪随机数的方法,但Math.random()产生 [0,1)区间的随机数(注意,不包括1),如果要取到1,可以这样:Math.floor(Math.random()*2);,取到 [0,2)之间的数然后向下取整。Box-Muller变换是通过服从均匀分布的随机变量,来构建服从正态分布的随机变量的一种方法。_js 正态分布随机数

Keras实现层的分离_keras输入图像通道分离-程序员宅基地

文章浏览阅读522次。前言笔者最近在复现Shufflenet Mobilenet 和谷歌最新推出的EfficientNet结构发现各大网络都在往轻巧化方向发展其中一个很关键的,就是Depthwise卷积结构的提出,可以参考我上篇博客而其中Depthwise卷积需要对单独的通道在做一次卷积,而不是多通道上进行累加因此这就涉及到了通道的分离下面我们直接来看代码代码实现import kerasfrom ke..._keras输入图像通道分离

随便推点

搭建springcloud服务初次启动报错_receive server push request, request = notifysubsc-程序员宅基地

文章浏览阅读243次。启动SpringCloudEureka 报错:com.netflix.discovery.shared.transport.TransportException: Cannot execute request on any known server原因是SpringCloudEureka这个应用本身就是eureka服务器,不需要不断的尝试连接注册自己。可以添加以下配置:如果配置文件a..._receive server push request, request = notifysubscriberrequest, requestid =

mysql ip查找IP段的方法_mysql 查ip段-程序员宅基地

文章浏览阅读2.4k次。SELECT ipRange, SUBSTRING_INDEX(ipRange, '/', 1) startip, CONCAT(SUBSTRING_INDEX(ipRange, '.', 3), '.' ,SUBSTRING_INDEX(ipRange, '/', -1)) endipFROM sm_ip WHERE INET_ATON('0.0.0.2') BETWEEN INET_ATO_mysql 查ip段

戴尔G3 3590双系统卸载Ubuntu后出现gun grub version 2.04的解决办法_gnu grub version 2.04-程序员宅基地

文章浏览阅读4.9k次。双系统卸载Ubuntu后出现gun grub version 2.04界面的解决办法(机型为戴尔G3 3590)出现这个的原因我猜大概是因为电脑启动后优先会启动Ubuntu操作系统而Ubuntu已经被删除或并没有完全被删除,所以弹出了这个界面。我的解决办法:电源键关机,再开机,狂按F2进入BIOS,进入General内的Boot Sequence界面在该界面中,鼠标点击上下箭头把U盘放到第一位,目的是把你插入的系统U盘的优先_gnu grub version 2.04

LLVM IR:从中间文件提取struct信息_解析头文件结构体-程序员宅基地

文章浏览阅读1.3k次。LLVM IR:从中间文件提取struct信息先放上源代码:struct demo1 { long long A; long long B;};struct demo2 { long long C; long long D; float E;};int main(){ struct demo1 d1; struct demo2 d2; d1.A = 1; d2.C = 2; d2.D = d1.A + d2.C; return 0;_解析头文件结构体

MATLAB 画图_plot(t,y),y为矩阵-程序员宅基地

文章浏览阅读1.2k次。MATLAB第一节 图形窗口与坐标系一.图形窗口 1.MATLAB在图形窗口中绘制或输出图形,因此图形窗口就像一张绘图纸. 2. 在MATLAB下,每一个图形窗口有唯一的一个序号h,称为该图形窗口的句柄.MATLAB通过管理图形窗口的句柄来管理图 形窗口; 3.当前窗口句柄可以由MATLAB函数gcf获得; 4.在任何时刻,只有唯一的一个窗口是当前的图形 窗口(活跃窗口); ..._plot(t,y),y为矩阵

C#加壳工具做代码加密保护_c# exe代码加固-程序员宅基地

文章浏览阅读6.1k次,点赞2次,收藏17次。当前C# .net语言的应用范围越来越广泛,IIS 的服务器架构后台代码、桌面应用程序的 winform 、Unity3d 的逻辑脚本都在使用。C# .net 具备强大的便捷特性,使得开发成本极低。而作为一款.net 语言,也有它让开发者头疼的弊病——非常容易被反编译。市面上的 Dnspy, ILspy,de4dot等工具可以非常容易反编译出被混淆保护的C# .net 程序。解决方案深思自..._c# exe代码加固

推荐文章

热门文章

相关标签