|
关于HashSet的发现:
1:HashSet是一个Set,也就是所谓的集合。集合的概念是元素在集合中无序、唯一。无序对于计算机来说没有什么意义,因为计算机总要按照一定的顺序存储对象。唯一是怎么实现的呢?名字上说的已经很清楚了。HashSet,就是通过其中的元素(对象)的hashconde来区分对象是否唯一的。所以,HashSet的对象中着一个集合中对象的hashcode的list,每次执行set.add(obj)的时候,都会取出obj的hashcode与其内部的list进行比较,如果没有与之相等的,就加进set里去,同时把那个obj的hashcode加到list里面去;如果有相等的,就再调用obj的equals方法与各个对象进行比较,如果没有相等的,就加入到set里面去,如果还有相等的,就不执行加入操作。
public Set add(Object obj){
int code = obj.hashCode(); if(code not in this.hashcodeList){//如果没有于之相等的hashcode。就将obj加入 this.valueList.add(obj); this.hashcodeList.add(code); return true; }else{//否则看看是否有与之equals相等的。 if(code in this.valueList){//有,add失败 return false; }else{//没有,add成功 this.valueList.add(obj); return true; } } } 其实相当于执行了一次contains方法,根据contains方法的返回值决定是否真的add。
也就是说HashSet在确定已经包含某个对象相等的标准是:它们的hashcode相等或者它们的equals方法返回true。
郁闷了半天,怎么先比较hashcode呢?
总算知道了为什么覆盖了toString()后不覆盖hashcode(),Eclipse会给出警告。原来这两个都和对象的相等比较有关系啊。Object的hashcode就是根据对象的内存地址计算出了,保证不重复。而String的hashcode就不一样了,只要字符串的内容相等(equals返回true),它们的hashcode就是相等的。
特别需要注意的是HashSet是有缓存的,第一次contains执行完后会缓存所有的hashcode,以后再调用contains比较的时候使用缓存的hashcode(就是那个list),所以说HashSet最好只用来存储不可变对象,否则contains方法的返回值是不准确的。
一下原则要记住:
1:对于不可变类(String、Integer、以及自己定义的不可变类等),要保证equals返回true的时候,它们的hashcode的值相等。
2:对于不可变类,也要尽量满足1。以避免出现上面说的Set比较时出现的问题。
3:覆盖一个类的equals方法的时候,要注意可交换性,要保证a.equals(b)的值一定等于b.equals(a)的数值。
|
相关推荐
【SigmaStar SSC335系列】空片用Flash_Tool烧写
简介 本文主要讲新拿到的PCBA,板上spi nand flash还是空的,如何在这种情况下烧录固件,这里讲解用官方Flash_Tool烧写的方式。 但只讲一些注意的地方和坑,其它的官方文档里说的比较清楚,不多说。 准备 Flash_Tool烧写软件 编译打包好烧写镜像 串口烧录小板 ----- 这个是个坑,在官方文档里并没有提及,刚开始用的平时调试的USB转串口,怎么都没反应,一度不知烧写软件不对还是硬件有问题,最后通过厂家技术支持才得知,除了专门的Flash_Tool外,还要专门的串口烧录器
Java HashSet contains()方法与示例
HashSet类contains()方法 (HashSet Class contains() method) contains() method is available in java.util package. contains()方法在java.util包中可用。 contains() method is used to check the existence of the given o...
第1关:STL模板之queue实例一:最少个数
头歌自创答案
HashSet和ArrayList的contains方法区别
方法都用于检查集合中是否存在某个元素,但它们的实现机制和性能差异很大。方法通过哈希表(HashMap 的 key 部分)查找元素是否存在。方法通过遍历整个列表,逐个调用。方法检查元素是否相等。
电商平台大数据分析指标
一、五大关键数据分析指标 1.1活跃用户量 活跃用户量是一个基本的指标,有 DAU(日活跃用户)、WAU(周活跃用户)和 MAU(月活跃用户)三个层次; 1.2转化 转化是一个非常重要的指标,电商运营需要关注主路径、次路径甚至精细到每一个品类 / SKU 的转化率; 1.3留存 留存要从不同的时间周期上研究,包括次日留存率、3 日、7 日、30 日留存; 1.4复购 复购则要从 3 个角度去看,复购用户量、复购率和复购金额比; 1.5GMV GMV 是最重要的指标,我们的运营最终是围绕这
统信UOS/麒麟ARM桌面版,不联网也能用Docker部署MySQL 5.7(离线部署详解)
本文详细介绍了在统信UOS/银河麒麟ARM桌面版系统中,如何离线部署MySQL 5.7的完整流程。通过Docker技术实现环境隔离和依赖封装,解决了封闭网络环境下的部署难题,包括资源准备、系统配置、容器化部署及安全加固等关键步骤,为政企和科研场景提供实用解决方案。
HashSet的contains方法比对机制
摘要: HashSet的contains()方法判断元素存在需同时满足哈希值相同和equals()相等两个条件,例如Set<String>存储"hanlpp"时,查询"hanlp"会返回false。而String的contains()是子串匹配,如"hanlpp".contains("hanlp")返回true。关键区别在于:HashSet要求完全匹配,String只需包含子串。示例对比:"abcde&qu
电商数据分析18——电商广告投放的数据分析与优化
在当今的电商行业中,广告投放是提高品牌知名度、吸引潜在客户和增加销售额的关键策略之一。随着市场竞争的加剧,仅仅依靠直观判断和传统方法已经无法满足广告投放的需求。数据分析在这里扮演了至关重要的角色,它可以帮助企业更准确地定位目标受众,评估广告效果,优化广告内容,从而提高广告效率和投资回报率(ROI)。
慎用ArrayList的contains方法,使用HashSet的contains方法代替
ArrayList的contains到了十万级别,就基本上很慢了,HashSet到了百万级的数据也特别快,而且是快得特别多。 ArrayList的contains方法与HashSet的contains方法的区别? ArrayList的contains方法会直接判断元素的内存地址是否相同,HashSet的contains方法会先判断元素的hashCode是否相同,如果不同则返回false,如果相同再用equals判断,因此HashSet的contains方法的方法效率会更高。 ArrayList..
【GlobalMapper精品教程】084:tif(tfw)、jpg(jgw)、png(pgw)的区别与联系
摘要:本文介绍了TFW、JGW、PGW等地理参考文件的基本原理和应用。这些文件通过简单的文本格式存储栅格图像的地理坐标信息,适用于平面坐标系下的GIS数据处理。文章详细说明了文件各行的含义,并提供了在ArcGIS和Globalmapper中生成这些文件的具体操作步骤,包括导出TIFF、JPG、PNG格式时勾选生成对应坐标文件的选项。这些文件虽然简单易用,但仅适用于平面坐标系,且功能相对有限。配套视频教程提供了更详细的操作演示。
华为OD机试双机位C卷:打印机队列 (C++/Py/C/Java/Js/Go)
华为OD机试双机位C卷 打印机队列,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解。华为OD机试 - 打印机队列。
HashSet与TreeSet的contains方法解读
Set与Map的关系 1、看下HashSet的add方法: // Dummy value to associate with an Object in the backing Map private static final Object PRESENT = new Object(); public boolean add(E e) { return map.put(e, PRESENT)==null; } 它的put调用了map的put方法,其实Set和
嵌入式u-boot最全面试题及参考答案(5万字长文持续更新)
例如,在一个便携式设备中,U-Boot 在启动时初始化电源控制器,将输出电压设置为合适的值。命令是u-boot构建过程中用于配置u-boot选项的命令。在嵌入式系统中,启动画面(也称为启动Logo或Splash Screen)是展示给用户的第一印象,它可以包含公司的标志、产品的名称或其他相关信息。u-boot允许通过环境变量来进行配置,这使得开发者可以根据不同的硬件平台和项目需求灵活地调整u-boot的行为。写入操作可以是字节级别的,也可以是块级别的,具体取决于设备的性能和操作系统的需求。
Sgg:HashSet的contains方法
HashSet的contains方法 contains方法用来判断Set集合是否包含指定的对象。 语法 boolean contains(Object o) 返回值:如果Set集合包含指定的对象,则返回true;否则返回false。 ...
怀旧版电脑GBC模拟器
再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。
ET2012新版免狗免安装绿色软件
ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,
JAVA HashSet contains()方法实现机制
contains()方法是通过HashSet容器内对象的两个方法进行判断的。—————————————————————————————— 第一个是hashCode()方法。通过此方法可以快速确定希望添加的元素是否不存在于该容器。如果不存在,那hash值一定不相同。当hash值比较有相同时,继续通过equals方法进行比较。Object类对equals方法的定义是比较两个对象的内存地址是否一样,如果
Devexpress16.2.6破解工具
Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具
contains方法_「Java必修课」ArrayList与HashSet的contains方法性能比较
1 简介在日常开发中,ArrayList和HashSet都是Java中很常用的集合类。ArrayList是List接口最常用的实现类;HashSet则是保存唯一元素Set的实现。本文主要对两者共有的方法contains()做一个简单的讨论,主要是性能上的对比,并用JMH(ava Microbenchmark Harness)进行测试比较。2 先看JMH测试结果我们使用一个由OpenJDK/Orac...
STM32F407中文手册
STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。
HashSet与List的Contains方法
HashSet不能用索引访问,不能存储重复数据。 HashSet<string> hs = new HashSet<string>(); hs.Add("hahah"); Console.Write(hs[0]); //这里会报错 List<string> ls = new List<string>(); ls.Add("hhhh"); Co
ArrayList和HashSet的Contains()方法
首先来看一道笔试题: import java.util.ArrayList; import java.util.HashSet; public class Foo { int value; Foo(int value) {
java 中ArrayList、HashSet和HashMap的contains方法
对于List.contains方法,实际上对每个对象调用一次equals方法,时间复杂度为o(n) HashSet的contains需要对象的hashCode(根据内存地址计算)和equals都为真才会判定为true,时间复杂度为o(1) HashMap实现了两种contains:containsKey、containsValue containsKey:对key的...
ArrayList和HashSet中contains方法的不同
ArrayList和HashSet中contains方法的不同 首先来看一道笔试题: view plaincopy to clipboardprint?import java.util.ArrayList; import java.util.HashSet; public class Foo { int value;
ArrayList和HashSet的contains()方法的时间复杂度
ArrayList底层使用数组作为存储,当给定一个Object判断是否存在需要去遍历数组,和每一个元素进行比较从源码可以发现,contains()方法通过调用indexOf()方法来判断,而后者需要遍历数组,因此ArrayList的contains()方法的时间复杂度为O(n)
4700



被折叠的 条评论
为什么被折叠?



