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

Java Hashset.contains()产生了神秘的结果

Java中的HashSet是一种无序、不重复的集合,它基于哈希表实现。HashSet的contains()方法用于检查集合中是否包含指定的元素。当使用HashSet的contains()方法时,可能会遇到一些神秘的结果。

这种神秘的结果通常是由于对象的hashCode()和equals()方法的实现不正确导致的。HashSet内部使用hashCode()方法确定元素在哈希表中的位置,并使用equals()方法来判断两个元素是否相等。因此,如果对象的hashCode()方法返回的哈希码不一致,或者equals()方法没有正确地比较对象的内容,就会导致contains()方法返回错误的结果。

为了解决这个问题,我们需要确保在使用HashSet时正确实现hashCode()和equals()方法。以下是一些关键点:

  1. hashCode()方法:hashCode()方法应该根据对象的内容计算哈希码。如果两个对象的内容相等,它们的hashCode()方法应该返回相同的哈希码。推荐使用IDE生成的hashCode()方法,确保正确实现。
  2. equals()方法:equals()方法应该根据对象的内容比较相等性。如果两个对象的内容相等,equals()方法应该返回true。同样,推荐使用IDE生成的equals()方法,确保正确实现。
  3. 不可变对象:如果对象是不可变的(即对象的内容不会改变),则hashCode()方法的结果应该在对象创建时计算并缓存起来。这样可以确保对象在集合中的位置不会改变。
  4. 自定义对象:如果使用自定义对象作为HashSet的元素,需要确保正确实现hashCode()和equals()方法。通常,hashCode()方法应该基于对象的所有字段计算哈希码,equals()方法应该比较所有字段的相等性。

总结起来,当使用HashSet的contains()方法时,确保正确实现对象的hashCode()和equals()方法是非常重要的。这样可以避免产生神秘的结果,并确保HashSet的正常使用。

腾讯云提供了多种云计算相关产品,例如云服务器、云数据库、云存储等。具体推荐的产品和产品介绍链接地址可以根据具体需求和场景进行选择。

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

相关·内容

Java基础语法(一)褪去Java神秘衣服,“深入”了解

Java基础语法 了解Java Java——面向对象编程 Java某些名词 结语 了解Java Java——面向对象编程 想学一个语言,至少要了解他是干嘛,是什么类型,创始人是谁什么等等等乱七八糟...Java通常用于网络环境中,为此,Java提供了安全机制以防恶意代码攻击。...Java语言提供同步机制可保证各线程对共享数据正确操作。...Java按照用途来分,有三个版本,分别是JavaSE(Java标准版),JavaEE(Java企业版),JavaME(移动版) 上面的已经划过重点了,要考 ?...备提供解决方案现在JavaME已经被Android代替 JDK Java开发工具包,Java核心含Java编译器、Java运行环境、Java打包工具、Java文档生成工具等 JRE Java运行环境

30730

Python决策权投票结果生了,“指导委员会”模式拔得头筹

2018年12月17日20点,Python 治理提案投票结果出来了,最终胜出是 PEP-8016。...在几天前,我们推文《最新进展|关于Python治理模式投票》,已经很明白地预测了这个结果,现在得到了证实。毫无悬念。 ? ? 对于这个结果,暂时没必要多说吧。...2、这件正在发生事,关乎所有Python开发者 本文主要回顾了Python 之父退位风波、各种治理提案提出、以及此次事件重要意义。...这对投票方案实施,是否会带来不利影响呢? 2、关于投票时间。首先,投票开启时间就比几个月前计划延迟了,而投票结束时间也有临时变更——本应结束于17日中午12点,但实际却延迟到晚上8点。...这段时间里,发生了什么事情呢? 但愿这只是“区区小事”吧......

51110
  • Java 基础篇】Java类型通配符:解密泛型神秘面纱

    Java中,类型通配符(Type Wildcard)是泛型重要概念之一。它使得我们能够更加灵活地处理泛型类型,使代码更通用且可复用。本文将深入探讨Java类型通配符用法、语法和最佳实践。...总之,类型通配符是Java泛型编程强大工具,可以使代码更灵活和通用。然而,在使用时需要谨慎处理,特别是在添加元素和处理通配符类型时。...通过遵循上述注意事项,您可以更好地利用类型通配符来编写高质量Java代码。 结语 Java类型通配符是泛型编程重要组成部分,它使得代码更加灵活和通用。...通过了解类型通配符基本语法和最佳实践,您可以更好地应用它们来编写类型安全且 可复用代码。希望本文能够帮助您更好地理解和使用Java类型通配符。...如果你想深入了解更多关于Java泛型和类型通配符知识,可以查阅官方文档或相关教程。愿您Java编程之路越来越顺利!

    58220

    Java多线程:神秘线程变量 ThreadLocal 你了解吗?

    前言 在 Java多线程中,线程变量ThreadLocal非常重要,但对于很多开发者来说,这并不容易理解,甚至觉得有点神秘 今天,我将献上一份 ThreadLocal介绍 & 实战攻略,希望你们会喜欢...System.out.println(name + ":" + threadLocal.get()); } } } 测试结果...线程1:线程1threadLocal 线程2:线程2threadLocal // 从上述结果看出,在2个线程分别设置ThreadLocal值 & 分别获取,结果并未互相干扰 ---- 4....线程1:线程1threadLocal 线程2:线程2threadLocal // 从上述结果看出,在2个线程分别设置ThreadLocal值 & 分别获取,结果并未互相干扰 5.2 与同步机制区别...总结 本文全面讲解了Java多线程ThreadLocal相关知识 下面我将继续对 Android中知识进行深入讲解 ,有兴趣可以继续关注Carson_Ho安卓开发笔记 ---- 请 帮顶 / 评论点赞

    49420

    java中构建高效结果缓存

    缓存是现代应用服务器中非常常用组件。除了第三方缓存以外,我们通常也需要在java中构建内部使用缓存。那么怎么才能构建一个高效缓存呢? 本文将会一步步进行揭秘。...使用HashMap 缓存通常用法就是构建一个内存中使用Map,在做一个长时间操作比如计算之前,先在Map中查询一下计算结果是否存在,如果不存在的话再执行计算操作。...; } 该接口定义了一个calculate方法,接收一个参数,并且返回计算结果。...我们希望是如果一个线程正在做计算,其他线程只需要等待这个线程执行结果即可。很自然,我们想到了之前讲到FutureTask。...上面我们还要考虑一个缓存污染问题,因为我们修改了缓存结果,如果在计算时候,计算被取消或者失败,我们需要从缓存中将FutureTask移除。

    1.5K30

    Java new一个对象过程中发生了什么?

    作者:沉默哥 cnblogs.com/JackPn/p/9386182.html java在new一个对象时候,会先查看对象所属类有没有被加载到内存,如果没有的话,就会先通过类全限定名来加载。...一、类加载过程(第一次使用该类) java是使用双亲委派模型来进行类加载,所以在描述类加载过程前,我们先看一下它工作过程: 双亲委托模型工作过程是:如果一个类加载器(ClassLoader)收到了类加载请求...1、加载 由类加载器负责根据一个类全限定名来读取此类二进制字节流到JVM内部,并存储在运行时内存区方法区,然后将其转换为一个与目标类型对应java.lang.Class对象实例 2、验证 格式验证...如果继承层次比较深,要调用方法位于比较上层父类,则调用效率是比较低,因为每次调用都要经过很多次查找。这时候大多系统会采用一种称为虚方法表方法来优化调用效率。...•001:《Java并发与高并发解决方案》学习笔记;•002:《深入JVM内核——原理、诊断与优化》学习笔记;•003:《Java面试宝典》•004:《Docker开源书》•005:《Kubernetes

    61910

    java new一个对象过程中发生了什么

    java在new一个对象时候,会先查看对象所属类有没有被加载到内存,如果没有的话,就会先通过类全限定名来加载。加载并初始化类完成后,再进行对象创建工作。...一、类加载过程(第一次使用该类) java是使用双亲委派模型来进行类加载,所以在描述类加载过程前,我们先看一下它工作过程: 双亲委托模型工作过程是:如果一个类加载器(ClassLoader...1、加载 由类加载器负责根据一个类全限定名来读取此类二进制字节流到JVM内部,并存储在运行时内存区方法区,然后将其转换为一个与目标类型对应java.lang.Class对象实例 2、验证 格式验证...// 所有不会被重写方法和域都会被静态绑定 以上2、3、4三个阶段又合称为链接阶段,链接阶段要做是将加载到JVM中二进制字节流类数据信息合并到JVM运行时状态中。...如果继承层次比较深,要调用方法位于比较上层父类,则调用效率是比较低,因为每次调用都要经过很多次查找。这时候大多系统会采用一种称为虚方法表方法来优化调用效率。

    2.6K21

    java new一个对象过程中发生了什么

    java在new一个对象时候,会先查看对象所属类有没有被加载到内存,如果没有的话,就会先通过类全限定名来加载。加载并初始化类完成后,再进行对象创建工作。...一、类加载过程(第一次使用该类)   java是使用双亲委派模型来进行类加载,所以在描述类加载过程前,我们先看一下它工作过程: 双亲委托模型工作过程是:如果一个类加载器(ClassLoader)...1、加载      由类加载器负责根据一个类全限定名来读取此类二进制字节流到JVM内部,并存储在运行时内存区方法区,然后将其转换为一个与目标类型对应java.lang.Class对象实例 2、验证...,但方法返回值不同)操作验证:在操作数栈中数据必须进行正确操作,对常量池中各种符号引用执行验证(通常在解析阶段执行,检查是否可以通过符号引用中描述全限定名定位到指定类型上,以及类成员信息访问修饰符是否允许访问等...如果继承层次比较深,要调用方法位于比较上层父类,则调用效率是比较低,因为每次调用都要经过很多次查找。这时候大多系统会采用一种称为虚方法表方法来优化调用效率。

    58420

    Java:new一个对象过程中发生了什么?

    来源:www.cnblogs.com/JackPn/p/9386182.html ---- java在new一个对象时候,会先查看对象所属类有没有被加载到内存,如果没有的话,就会先通过类全限定名来加载...一、类加载过程(第一次使用该类) java是使用双亲委派模型来进行类加载,所以在描述类加载过程前,我们先看一下它工作过程: 双亲委托模型工作过程是:如果一个类加载器(ClassLoader)收到了类加载请求...1、加载 由类加载器负责根据一个类全限定名来读取此类二进制字节流到JVM内部,并存储在运行时内存区方法区,然后将其转换为一个与目标类型对应java.lang.Class对象实例 2、验证 格式验证...解析需要静态绑定内容。 // 所有不会被重写方法和域都会被静态绑定 以上2、3、4三个阶段又合称为链接阶段,链接阶段要做是将加载到JVM中二进制字节流类数据信息合并到JVM运行时状态中。...如果继承层次比较深,要调用方法位于比较上层父类,则调用效率是比较低,因为每次调用都要经过很多次查找。这时候大多系统会采用一种称为虚方法表方法来优化调用效率。

    1K20

    继承与隐藏:Java中父类成员变量神秘禁忌

    摘要 在Java中,子类继承了父类成员变量,但不能直接覆盖(或称为隐藏)父类成员变量。...本文将解释为什么Java设计了这样规则,探讨与此相关继承和多态概念,并说明如何在子类中访问和使用父类成员变量。 1....引言 Java作为一门面向对象编程语言,支持继承和多态等特性,允许子类继承父类属性和行为。然而,与成员方法不同,Java父类成员变量在子类中不能被覆盖。...但是与方法不同,Java不允许子类直接覆盖(隐藏)父类成员变量。...设计决策原因 为什么Java不允许子类直接覆盖父类成员变量呢?这涉及到Java语言一些设计原则和语法约定。

    57820

    简单面试题目,大跌眼镜结果JAVA

    1-3年 初级 java基础 1、线程安全Map是什么 (推荐答案是ConcurrentHashMap,如果实在不知道答Hashtable也可以。...= 0)throw new IllegalThreadStateException(); 3、javaObject类都有哪些方法 (4个以上即可) (基本java对象理解,4个超级easy:hashCode...操作系统基本了解。 2、怎么看内存占用 (free) 3、jstack命令是做什么 (打印java堆栈) 对jdk基本了解 3-5年 中级 java基础 1、线程安全List是什么 ?...(CopyOnWriteList,退而求其次Vector) 2、java中可排序map(自然排序)是什么,底层什么结构 (TreeMap-红黑树/ ConcurrentSkipListMap-跳表)...动态数据源等) Linux基础 1、如何查看java进程个数 (ps,grep,wc组合使用) ps -ef| grep java|grep -v grep | wc -ljps | wc -l

    58530

    揭秘java中无数人伤透脑筋最为神秘技术之一——ClassLoader

    ClassLoader 是 Java 届最为神秘技术之一,无数人被它伤透了脑筋,摸不清门道究竟在哪里。网上文章也是一篇又一篇,经过本人亲自鉴定,很多都是在误导别人。...BootstrapClassLoader 负责加载 JVM 运行时核心类,这些类位于 $JAVA_HOME/lib/rt.jar 文件中,我们常用内置库 java.xxx.* 都在里面,比如 java.util...、java.io.、java.nio.、java.lang. 等等。这个 ClassLoader 比较特殊,它是由 C 代码实现,我们将它称之为「根加载器」。...$cd~/source/jcl/v1$ javac Dep.java $cd~/source/jcl/v2$ javac Dep.java $cd~/source/jcl$ javac Test.java...$ java Test v1 v2 false 在这个例子中如果两个 URLClassLoader 指向路径是一样,下面这个表达式还是 false,因为即使是同样字节码用不同 ClassLoader

    49120

    Java虚拟机小测结果来看JVM

    第三题 以下关于Java虚拟机说法错误是: A.类对象不能被回收 B.Java堆不一定能扩展 C.一般来说,大对象回收周期较小对象长 D.方法区溢出错误提示信息是PermGen Space...因为是对象,Class对象就存在于Java堆中……对吗?答案是否定,Class对象并没有明确规定存在于Java堆。而事实上,Hotspot中,Class对象存放在方法区中。...(提示:请分别给出两版本运行结果,指出带来此变化更新并分析) 这是一道考察同时考察文档阅读与JVM知识题目,曾经被我当作入群题(因为题目难度过于友好所以仅存活了数小时)。...其次就是对String::intern方法理解了。首先要注意是,如果字符串由toString方法创建,那么字符串会出现在Java堆中。...不过这里比较坑是,在编译期字符串“java”就已经被加入到常量池中了,所以intern会直接返回其在常量池中引用。

    29310
    领券