当前位置: 首页 > 知识库问答 >
问题:

为什么对象不相同,添加到具有相同值的hashset,甚至hashCode和equals都被覆盖

扈俊健
2023-03-14

下面是产生散列集大小为3而不是2的代码

package dump.test;
import java.util.*;
public class WrappedString {
    private String s;
    public WrappedString(String s) { this.s = s; }
    public static void main(String[] args) {
        HashSet<Object> hs = new HashSet<Object>();
        WrappedString ws1 = new WrappedString("aardvark");
        WrappedString ws2 = new WrappedString("aardvark");
        String s1 = new String("aardvark");
        String s2 = new String("aardvark");
        hs.add(ws1); hs.add(ws2); hs.add(s1); hs.add(s2);
        System.out.println(hs.size()+hs.toString()); 
    }
    public boolean equals(Object aSong) {
        String s = aSong.toString();
        System.out.println(s);
        return s.equals(this.s);
    }
    public int hashCode() {
        System.out.println(this.s + "-" + this.s.hashCode());
        return this.s.hashCode();
    }
    /*public int compareTo(Object aSong) {
        String s = aSong.toString();
        return this.s.compareTo(s);
    }*/
}

您可以看到这两个对象在输出中具有相同的代码,但被计算为不同的,并且产生的代码被计算为3

请协助我如何工作。

共有1个答案

从元明
2023-03-14

问题是你的案例不对称。如果实现决定在string实例上以类作为参数调用equals,那么它肯定会返回false,因此您的代码不会始终工作。

 类似资料:
  • 问题内容: 在以下代码中,我不明白为什么当它属于两个不同的对象时具有相同的ID? 问题答案: 我认为这是正在发生的事情: 取消引用时,将在内存中创建其副本。该存储位置由以下位置返回 由于没有引用到刚刚创建的方法的副本,因此GC将其回收,并且该内存地址再次可用 取消引用时,将在相同的内存地址(可用)中创建它的副本,您可以再次使用该地址。 第二个副本是GCd 如果您要运行一堆其他代码并再次检查实例方法

  • 问题内容: 我正在阅读Head First Java的书中的一句话: 关键是哈希码可以相同,而不必保证对象相等,因为该方法中使用的“哈希算法” 可能会为多个对象返回相同的值。 为什么该方法可能为不同的对象返回相同的值?这不会引起问题吗? 问题答案: *对对象进行 *散列 意味着“ 找到可以由相同实例一次又一次地再现的良好的描述性值(数字) ”。由于Java的哈希码类型为,因此只能具有不同的值。这就

  • 问题内容: 我以为运算符检查对象的相等性。但事实并非如此: 问题答案: *Python *将相同的内存 位置用于方法和,这是*两个对象,它们的生命周期不重叠,因此对它们返回相同的标识。请参阅下面的详细说明。 从is运算符的文档中: 运算符是否测试对象标识:并且仅当x和y是同一对象时,x is y才是true。 从ID的文档中 返回对象的“身份”。这是一个整数(或长整数),在此对象的生存期内,此整数

  • 问题内容: 我正在尝试一些有关Java中对象相等的代码。正如我在某处阅读 是通过应用哈希函数生成的数字。每个对象的哈希函数可以不同,但​​也可以相同。在对象级别,它返回对象的内存地址。 现在,我有示例程序,该程序连续运行10次。每次我运行程序时,我都会得到与哈希码相同的值。 如果函数返回对象的内存位置,那么java(JVM)如何在连续运行中将对象存储在相同的内存地址? 您能给我一些见解和您对这个问

  • 本文向大家介绍两个对象值相同equals结果为true,但却可有不同的 hashCode,这句话对不对?相关面试题,主要包含被问及两个对象值相同equals结果为true,但却可有不同的 hashCode,这句话对不对?时的应答技巧和注意事项,需要的朋友参考一下 不对,如果两个对象x和y满足x.equals(y) == true,它们的哈希值(hashCode)应当相同。Java 对于equals

  • 如果您看一下这个程序,在Location类中,我们分别用return false和110重写了两个方法(equals和hashcode)。我们正在创建Location类的一个实例,并在map中放置两次。当我们从equals方法返回false时,为什么要用key映射覆盖last value?