java - 不同对象的哈希码相同
问题描述
在内部自定义依赖项之一(我们在我公司开发的库)升级后,我在 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()
接受它。
某个地方的某个人已经实现hashCode()
了返回 1,这很愚蠢。他们最好根本不实施它。而且不难找到。只需查看 JavadocCustomObject
并查看它从何处继承即可hashCode()
。
推荐阅读
- excel - 从用户窗体中动态创建的文本框中获取值并将其写入工作表
- c# - 如何调用函数(表达式
> 谓词)与一个什么都不做的谓词? - python - 如何列出从熊猫附加的列表的每个值?
- html - 为什么我的 svg 路径放在 div 中时没有显示?
- angular - html 中的 onChange 转换为 Angular 是什么样的?
- terminal - 单独更改每个终端窗口的背景颜色
- gdb - 带有 Eclipse Oxygen 3a 的远程 gdb
- php - 在 PHP 中转义一个充满“和”的字符串
- php - 如果存在则更新行或插入
- angular - 尝试使用带有自定义 tslint 规则的 typescript 库,但在 ng lint 时出现“无法在模块外使用 import 语句”错误