java - 不同对象的哈希码相同

标签 java object hashcode

在内部自定义依赖项之一(我们在我公司开发的库)升级后,我在 Java 应用程序(Spring 批处理作业)中遇到了一个奇怪的结果。 代码升级后,同一类型的两个新的不同对象显示具有相同的哈希码。

CustomObject oj1 = new CustomObject();
oj1.setId(1234L);

CustomObject oj2 = new CustomObject();
oj2.setId(9999L);

System.out.println(oj1); //Prints CustomObject@1
System.out.println(oj2); //Prints CustomObject@1

System.out.println(oj1.hashCode()); //Prints 1
System.out.println(oj2.hashCode()); //Prints 1

在意识到其中一个具有 HashSet 变量的单元测试仅添加第一个对象而忽略其余对象后,我注意到了这个问题。显然 hashSet 正在做应该做的事情,但对象不应该是相同的,而是具有不同 ID 的新实例。我在应用程序中的单元测试之外测试了同样的东西,但仍然是同样的问题。一旦我恢复到旧的依赖代码,代码就会正常运行,并且上面的打印语句显示不同的数字! 我确信其中一个依赖项导致了这个问题,但我无法确定根本原因。 CustomObject 是通过相同的依赖项间接拉取的,并且没有实现 equals() 和 hashcode(),它只有

private static final long serialVersionUID = 1L;

查看 CustomObject 的源代码揭示了这个实现

public class CustomObject extends BaseModel implements Serializable

BaseModel 定义了 equals 和 hashCode 方法

import org.jvnet.jaxb2_commons.lang.*;
import org.jvnet.jaxb2_commons.locator.ObjectLocator;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlSeeAlso;
import javax.xml.bind.annotation.XmlType;
import java.io.Serializable;
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "BaseModel")
@XmlSeeAlso({
CustomObject.class
})
public abstract class BaseModel implements Serializable, Equals2, HashCode2
{

    private final static long serialVersionUID = 1L;

    public boolean equals(ObjectLocator thisLocator, ObjectLocator thatLocator, Object object, EqualsStrategy2 strategy) {
        if ((object == null)||(this.getClass()!= object.getClass())) {
            return false;
        }
        if (this == object) {
            return true;
        }
        return true;
    }

    public boolean equals(Object object) {
        final EqualsStrategy2 strategy = JAXBEqualsStrategy.INSTANCE;
        return equals(null, null, object, strategy);
    }

    public int hashCode(ObjectLocator locator, HashCodeStrategy2 strategy) {
        int currentHashCode = 1;
        return currentHashCode;
    }

    public int hashCode() {
        final HashCodeStrategy2 strategy = JAXBHashCodeStrategy.INSTANCE;
        return this.hashCode(null, strategy);
    }

}

提前谢谢你。

最佳答案

很明显,基类中发生了一些变化,您只需要找到它并修复它,或者以可接受的方式实现 hashCode()equals()这个类。

有人在某个地方实现了返回 1 的 hashCode(),这是愚蠢的。他们最好根本不实现它。而且并不难找。只需查看 CustomObject 的 Javadoc,看看它从哪里继承 hashCode()

关于java - 不同对象的哈希码相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50421240/

相关文章:

java - 对象列表的 Spring @NotNull 验证约束未显示所需的元素名称

java - jBrowserDriver 获取调用挂起

java - 如何在intellij中重新添加.classpath?

javascript - 如何获取比数组中其他元素更大的3个对象javascript

java - 我的哈希码不起作用 - 是我的 equals() 有问题吗?

Java - TreeSet 和 hashCode()

java - 循环 HashMap 并计算最小值并在没有剩余点时停止

Javascript - 将数组列表的对象转换为新格式的对象?

javascript - 循环遍历数组对象以查找重复项。为什么一个元素返回 "undefined"?

java - 当两个对象具有相同的哈希码时,不明白 HashMap 发生了什么