首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么set.contains不使用覆盖的equals()方法?

set.contains不使用覆盖的equals()方法的原因是为了提高性能和效率。

在Java中,Set是一种不允许重复元素的集合,它的实现类通常是HashSet或TreeSet。当我们调用Set的contains方法时,它会根据元素的hashCode值来确定元素的存储位置,然后再使用equals方法来判断元素是否相等。

如果Set在判断元素是否相等时直接使用equals方法,那么对于包含大量元素的Set来说,每次调用contains方法都需要遍历整个集合,逐个比较元素的值,这样的效率非常低下。

而如果Set在判断元素是否相等时使用覆盖的equals方法,那么每次调用contains方法时,都需要调用equals方法来比较元素的值,这样会增加额外的开销。

为了提高性能,Set在判断元素是否相等时通常会先根据元素的hashCode值来确定元素的存储位置,然后再使用equals方法来判断元素是否相等。这样可以大大减少比较的次数,提高查找元素的效率。

总结起来,Set.contains不使用覆盖的equals方法是为了提高性能和效率,通过先根据hashCode值确定元素的存储位置,再使用equals方法判断元素是否相等,来减少比较的次数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

为什么阿里巴巴禁止使用BigDecimalequals方法做等值比较?

(bigDecimal5)); 以上代码,输出结果为: true true false BigDecimalequals原理 通过以上代码示例,我们发现,在使用BigDecimalequals方法对...那么,为什么会出现这样情况呢,我们先来看下BigDecimalequals方法。...所以,因为BigDecimal(1.0)和BigDecimal(1.00)精度是一样,所以在使用equals方法比较时候,得到结果就是true。...所以,因为BigDecimal("1.0")和BigDecimal("1.00")精度不一样,所以在使用equals方法比较时候,得到结果就是false。...所以,当我们使用equals方法判断判断两个数是否相等时候,是极其严格。 那么,如果我们只想判断两个BigDecimal值是否相等,那么该如何判断呢?

86130

为什么重写对象equals方法要重写hashcode方法真正原因!

javaGuide里说到了为什么要重写hashcode原因: 3)为什么重写 equals 时必须重写 hashCode 方法? 如果两个对象相等,则 hashcode 一定也是相同。...因此,equals 方法覆盖过,则 hashCode 方法也必须被覆盖。 hashCode()默认行为是对堆上对象产生独特值。...后面自己看了别的博文,理解了下,我觉得一定要重写hashcode主要原因是要保障equals方法特性,即equals返回结果必须与其hashcode比较结果必须保持一致. 为什么要这样保障呢?...(摘自我 Java 启蒙书《Head First Java》第二版)。,为什么呢 ?这样我们就大大减少了 equals 次数,相应就大大提高了执行速度。...2,重写equals()方法就重写hashCode()方法。 3,一般相等对象都规定有相同hashCode。 4,String类重写了equals和hashCode方法,比较是值。

93430
  • 为什么推荐使用 stop、suspend 方法中断线程?

    java版本中已经被标记上了@Deprecated过期标签,那么为什么她们曾经登上了java历史舞台而又渐渐推出了舞台呢?...我们从中可以看出以下几点: stop这种方法本质上是不安全 使用Thread.stop停止线程会导致它解锁所有已锁定监视器,即直接释放当前线程已经获取到所有锁,使得当前线程直接进入阻塞状态 我们举例来看一下上边提到两点...那么建议使用stop中断线程我们应该怎么去优雅结束一个线程呢,我们可以存java开发者注释中窥探到一种解决方案: Many uses of stop should be replaced by code...可以看到java开发者推荐我们使用以下两种方法来优雅停止线程。 1.定义一个变量,由目标线程去不断检查变量状态,当变量达到某个状态时停止线程。...二、suspend落幕 suspend方法作用是挂起某个线程直到调用resume方法来恢复该线程,但是调用了suspend方法后并不会释放被挂起线程获取到锁,正因如此就给suspend和resume

    53920

    为什么推荐使用 stop、suspend 方法中断线程?

    我们知道像stop、suspend这几种中断或者阻塞线程方法在较高java版本中已经被标记上了@Deprecated过期标签,那么为什么她们曾经登上了java历史舞台而又渐渐推出了舞台呢?...我们从中可以看出以下几点: stop这种方法本质上是不安全 使用Thread.stop停止线程会导致它解锁所有已锁定监视器,即直接释放当前线程已经获取到所有锁,使得当前线程直接进入阻塞状态 我们举例来看一下上边提到两点...那么建议使用stop中断线程我们应该怎么去优雅结束一个线程呢,我们可以存java开发者注释中窥探到一种解决方案: Many uses of stop should be replaced by code...可以看到java开发者推荐我们使用以下两种方法来优雅停止线程。另外,多线程系列面试题和答案全部整理好了,微信搜索Java技术栈,在后台发送:面试,可以在线阅读。...2.使用interrupt方法中断线程。

    80130

    2019Java面试题:为什么使用hashmap需要重写hashcodes和equals方法

    那么这里就有一个比较严重问题了:要想保证元素不重复,可两个元素是否重复应该依据什么来判断呢?这就是Object.equals方法了。...也就是说,如果集合中现在已经有1000个元素,那么第1001个元素加入集合时,它就要调用1000次equals方法。这显然会大大降低效率。 于是,Java采用了哈希表原理。...(2)双散列函数法:在位置d冲突后,再次使用另一个散列函数产生一个与散列表桶容量m互质数c,依次试探(d+n*c)%m,使探查序列跳跃式分布。...所以这里存在一个冲突解决问题。这样一来实际调用equals方法次数就大大降低了。...你当然可以按要求去做了,但你会发现,相同对象可以出现在Set集合中。同时,增加新元素效率会大大下降。

    92140

    关于 java 中 set,get方法,而为什么推荐直接使用public

    我不知道有没有人遇到过,有一段时间,我都觉得那些 set,get用处何在,我直接写一个public直接拿不就行了,多爽,但是随着使用频繁,越来越想去搜索一下这个问题,而不是按照官方推荐,前辈们使用都是建议...这里引入其中一句话: 在任何相互关系中,具有关系所涉及各方都遵守边界是十分重要事情,当创建一个类库时,就建立了与客户端程序员之间关系,他们同样也是程序员,但是他们是使用类库来构建应用...综上所述,写到这里,我诞生了一个想法,其实set ,get ,public,对于它们使用完全取决于我们程序员自己,为了让项目之间逻辑更加清晰,有些标准自上而下,慢慢传了下来,无论你使用那种,但是有一个东西是无法避免...补充说明,set字面意思设置,get获取,我们了解一下java面向对象编程封闭性与安全性,private 修饰set get方法方法封闭在了一个特定类中,其他类就无法对其变量进行方法,这样就提高了数据安全性...一些杂谈:这些只是来自我一个菜鸡自己想法,当然对于很多大神来说不值一提,可能以后我会有更深入理解,但是至少,在程序员这条路上,不想盲目的去使用一些东西,或者说不想单纯只是去听别人一些看法。

    1.5K20

    为什么建议使用框架默认 DefaultMeterObservationHandler

    为什么建议使用框架默认 DefaultMeterObservationHandler 背景知识 最近,我们升级了 SpringBoot 3.x,并且,升级后,我们全面改造了原来 Sleuth 以及...全面使用 Observation 遇到了内存溢出以及 CPU 飙高(非不断 GC 导致) 但是,我们在全面使用 Observation 时候,发现了一个问题,就是内存溢出以及 CPU 飙高(非不断 GC...为何会出现内存溢出 我们通过增加如下启动参数启动并且在退出时候 dump JFR: -XX:StartFlightRecording=disk=true,dumponexit=true 或者使用下面的参数在内存溢出时候...我们将全局 ObservationHandler 改为什么都不做,对比下: package com.github.hashjang.wwsmbjysymrdo; import io.micrometer.common.KeyValue...解决方案 我们可以替换掉 DefaultMeterObservationHandler,自己实现一个 MeterObservationHandler,在 start 时候,创建 LongTaskTimer.Sample

    10000

    ACL2021 | 一种巧妙解决NER覆盖连续问题方法

    问题被研究透透了,本文主要解决一种稍微复杂些问题:一种带有覆盖连续(Overlapped and Discontinuous)命名实体识别任务。...而在这两者研究上来说,前人只是要么解决覆盖问题,要么解决不连续问题,但是本文提出一种联合解决这两种问题span-based方法。...span-based方法昨天也提到过了,所以关于实体+关系抽取任务都可以尝试。...这样,我们不仅可以识别Discontinuous实体,同时也可以对Overlapped实体进行双重检查。 通过上述方法轻松将NER装换成RE(Relation Extraction)任务。...传统GCN: 而AGGCN就是使用self-attention,替换以前邻接矩阵A,最后通过线性方法将multi head生成结果合一: Span表示 解码 先预测实体片段,再预测关系

    1.9K30

    为什么建议使用 Java 自带序列化?

    但是在提供很用户简单调用同时他也存在很多问题: 1、无法跨语言 当我们进行跨应用之间服务调用时候如果另外一个应用使用c语言来开发,这个时候我们发送过去序列化对象,别人是无法进行反序列化因为其内部实现对于别人来说完全就是黑盒...2、序列化之后码流太大 这个我们可以做一个实验还是上一节中Message类,我们分别用java序列化和使用二进制编码来做一个对比,下面我写了一个测试类: @Test public void testSerializable...byte[] result = new byte[buffer.remaining()]; buffer.get(result); System.out.println("使用二进制序列化长度...result = new byte[buffer.remaining()]; buffer.get(result); /*System.out.println("使用二进制序列化长度...结合以上我们看到: 目前序列化过程中使用 Java 本身肯定是不行,使用二进制编码的话又我们自己去手写,所以为了让我们少搬砖前辈们早已经写好了工具让我们调用,目前社区比较活跃有 google

    64930

    为什么建议使用自定义Object作为HashMapkey?

    第一反应就是这里key对应类没有去覆写equals()和hashCode()方法,但对照代码仔细一看却发现其实已经按要求提供了自定义equals和hashCode方法了。...原来编码时候直接用IDE工具自动生成equals和hashCode方法,里面将lastLoginTime也纳入计算逻辑了。...为什么hashCode和equals要同时覆写 这就与HashMap底层实现逻辑有关系了。...根据上面的介绍,可以概括为: hashCode负责大概定位,先定位到对应片区 equals负责在定位片区内,精确找到预期那一个 这里也就明白了为什么hashCode()和equals()需要同时覆写...Object作为HashMapKey 如果不得已必须要使用,除了要覆写equals和hashCode方法 覆写equals和hashCode方法中一定不能有频繁易变更字段 内存缓存使用Map,最好对

    47710

    为什么建议在云主机上使用ftp2个原因

    记得当年2002年第一次使用IIS搭建FTP服务器,使用CuteFtp客户端访问下载教育网内FTP视频资源.........到了今天云计算时代,笔者已经不再建议大家在云主机上使用ftp来做文件传输,原因如下: 配置困难: FTP文件传输有两种模式,PORT(主动)模式和PASSIVE(被动)模式,PORT(主动)模式在创建数据传输连接时...PASSIVE(被动)模式是如今使用最广泛,可是即使是PASSIVE(被动)模式,传输过程中需要使用“命令连接”和“数据连接”配合才能完成一个文件传输,因此FTP服务器在配置时,常常需要在服务器端配置...对个人用户完全免费,如果你现在在使用FTP做文件传输,你值得使用一次镭速RaySync。...它缺点是只能在Linux系统上使用,当然Windows上也有ssh/sftp服务端,但那就需要额外安装软件了。

    5.4K80

    详解Java构造方法为什么不能覆盖,我钻牛角尖病又犯了....

    三 但是,看了输出,我就纳闷为什么为什么第三行不是BigEgg2.Yolk(),不能覆盖吗?...那么,他们构造方法为什么不能覆盖,都是Public Yolk(){}。 当然,网上都说子类继承父类除构造方法以外所有方法,但这是结果,我要知道为什么!! 五 先说几个错误观点 1....有说构造方法方法名与类名必须一样,父子类不能同名,故不能继,所以不能覆盖构造方法。 这个不用多说,这个例子,就是大神写出来打这样说的人。 2....(这就是为什么创建子类时先创建完父类原因了) 那么很明显了,要是同名类之间可以覆盖了,子类创建时就是创建了两个自己而没有父类。...Java设计时候,他们绝对想到有些人会像强迫症那样折腾个同名类继承,然后实现构造覆盖场景吧.... 总结 构造方法是唯一,不能又造爸爸又造儿子

    2.1K20

    为什么推荐另外2种快速传几百G文件方法

    所以给出了5种解决方法。但是只说了其中三种。参看 两台电脑之间如何快速传输几百G文件?-两台,传输,文件,电脑 ? 这里说说为什么推荐另外2种。 一个是网络存储。...为什么推荐,因为pandownload被举报,开发者收监,百度名声臭不可救药。所以推荐。 国外网速,你我都是知道。 还有一个是,软件共享。 有人说这很简单啊,局域网有QQ,不就行了?...或者用比较老飞秋,传输起来都是贼快吗? 可是你有没有考虑到,如果是Windows要传输给苹果笔记本,或者Linux发行版要传输给Windows,这些软件有没有跨平台应用呢?...单说用户量超大QQ,在Linux发行版支持,都多少年没有更新了?这能用了? 所以软件推荐,只能在软件和网络层面加快传输速度,还要搞跨平台兼容,老复杂了。Bye!...很多朋友第一反应,就这么干,是因为默认使用都是windows系统。 惯性使然。 写在最后 最快办法还是物理连接,使用电缆线,网线,硬盘挂载,都比纯软件实现要快多。

    2.8K10

    为什么建议使用Date,而是使用Java8新时间和日期API?

    Java 8:新时间和日期API 在Java 8之前,所有关于时间和日期API都存在各种使用方面的缺陷,因此建议使用时间和日期API,分别从旧时间和日期API缺点以及解决方法、Java 8...Date如果格式化,打印出日期可读性差。...在多并发情况下使用 SimpleDateFormat 需注意。 SimpleDateFormat 除了 format 是线程不安全以外,parse 方法也是线程不安全。...parse 方法实际调用 alb.establish(calendar).getTime() 方法来解析,alb.establish(calendar) 方法里主要完成了 重置日期对象cal属性值 使用...和 parse 方法地方进行加锁 => 线程阻塞性能差 使用 ThreadLocal 保证每个线程最多只创建一次 SimpleDateFormat 对象 => 较好方法 Java 8 新时间和日期

    2K30

    关于Spring中@Async注解以及为什么建议使用 - Java技术债务

    只适用于不需要多线程地方。 ConcurrentTaskExecutor:Executor适配类,推荐使用。如果ThreadPoolTaskExecutor不满足要求时,才用考虑使用这个类。...defaultExecutor : new SimpleAsyncTaskExecutor()); } 为什么建议直接使用 @Async 注解?...在泰山版《阿里巴巴开发手册》规定开发中建议使用 Async 注解,这是为什么?在实际开发中,异步编程已经成为了一个必备技能。...建议直接使用 Async 注解原因 由于 Async 注解局限性,直接使用 Async 注解可能不是一个好主意。...如何更好地使用 Async 注解 虽然建议直接使用 Async 注解,但是在某些情况下,使用 Async 注解仍然是一个不错选择。

    10910

    使用PHPUnit进行单元测试并生成代码覆盖率报告方法

    代码覆盖率 代码覆盖率反应是测试用例对测试对象行,函数/方法,类/特质访问率是多少(PHP_CodeCoverage 尚不支持 Opcode覆盖率、分支覆盖率 及 路径覆盖率),虽然有很多人认为过分看重覆盖率是不对...测试覆盖检测对象是我们业务代码,PHPUnit通过检测我们编写测试用例调用了哪些函数,哪些类,哪些方法,每一个控制流程是否都执行了一遍来计算覆盖率。...这样我们就对业务代码App\Example做单元测试,并且获得我们单元测试代码覆盖率,现在自然是百分之百,因为我测试用例已经访问了App\Example所有方法,没有遗漏,开发中则能体现出你测试时用力对业务代码测试度完善性...基境共享测试数据 可能你会发现我们在每个测试方法中都创建了App\Example对象,在一些场景下是重复劳动,为什么不能只创建一次然后供其他测试方法访问呢?...主要用于一些资源清理,比如关闭文件,数据库连接),然后让每一个测试方法用例使用它: <?

    1.7K31

    Java避坑记:比较数字是不同包装类型,千万注意使用equals方法导致问题

    ---- Java中,比较两个不同类型包装类型时候,即使数值相等,使用equals方法也会返回false ---- 示例: public static void main(String[] args...= null && a.equals(b)); } 其他数字类型源码暂不贴出。 从源码看出,包装数字类型,使用equals方法前提必须是:类型一致。...如果原生类型存在自动类型转换,或原生类型与包装类型混用比较,很容易导致bug发生。 如何避免 ---- 除了类型转换成一致使用equals方法,数字类型比较使用compare方法。...,即使数值相等,使用equals方法也会返回false。...封装数字类型,使用equals方法前提必须是:类型一致,我们必须类型转换成同一类型。 数字类型比较最好使用compare方法。 ----

    40520

    如何编写出高质量 equals 和 hashcode 方法

    为什么要重写 equals 和 hashcode 方法?...为什么需要重写 equals 方法和 hashcode 方法,我想主要是基于以下两点来考虑: 1、我们已经知道了 Object 中 equals 方法是用来判断两个对象引用是否相同,但是有时候我们并不需要判断两个对象引用是否相等...我们使用一个小 Demo 来模拟一下特殊场景,让我们更好理解为什么需要重写 equals 和 hashcode 方法,我们场景是:我们有很多篇文章,我需要判断文章是否已经存在 Set 中,两篇文章相同条件是访问路径相同...由于我们只重写了 equals 方法并没有重写 hashcode 方法,所以两篇文章 hashcode 值不一样,这样映射到数组位置就不一样,调用 set.contains(article1) 方法时...其实你这跟重写 equals 方法没有半毛线关系,这完全是重新定义了一个参数类型为 Article equals 方法,并没有去覆盖 Object 类中 equals 方法

    61850
    领券