我有一个类,我重写了 hashCode 方法和 equals 方法。 equals 方法的行为符合我的预期,但是 hashCode 方法的行为似乎并不符合我的预期。我假设我的期望是不正确的,但不确定为什么。以下是重写的方法:
public class Car extends SomeBaseClass implements Cloneable, Serializable {
private static final long serialVersionUID = 1L;
private String id;
private String name;
private String carName;
private String carModel;
private String displayTextCar;
public boolean equals(Car car)
{
return (getCarName().equals(car.getCarName()) && getCarModel().equals(car.getCarModel()));
}
public int hashCode()
{
return (this.getCarName() + this.getCarModel()).hashCode();
}
现在我有一个测试类,其中创建两个汽车对象,并调用 equals 方法,然后将汽车的每个实例放入 HashMap 中。我将每个实例设置为具有相同的汽车名称和型号,并且调用 equals 方法实际上返回 true。然而,即使每个实例返回相同的 hashCode,当我将它们添加到 HashMap 时,它会在 Map 中保留两个对象,而我希望第二个 put 替换映射中的第一个对象???以下是测试类的内容:
HashMap<Car,String> testMap;
Car testCar1 = new Car();
testCar1.setCarName("DaveCar");
testCar1.setCarModel("DaveModelTest");
System.out.println("Car Hash 1: " + testCar1.hashCode());
Car testCar2 = new Car();
testCar2.setCarName("DaveCar");
testCar2.setCarModel("DaveModelTest");
System.out.println("Car Hash 2: " + testCar2.hashCode());
//hashCodes prints identical numbers
System.out.println("Car 1 equal Car 2 ?? " + testCar1.equals(testCar2));
//returns true
testMap.put(testCar1, "3");
testMap.put(testCar2, "16");
System.out.println("Map size is " + testMap.size());
//I would expect the size to be 1 here, but it's in fact 2.
所以这对我来说似乎不正确,我自然地在这里留下了一些代码,但这是基本原理。希望有人能指出我这里出错的地方。请注意,我确实使用 Eclipse 生成 hashCode 和 equals 方法,并且工作正常,但令我烦恼的是,我的 hashCode 实现并未按预期工作,即使两个对象似乎返回了相同的 hashCode 值。感谢任何人的意见。
问题是你提供了错误的equals
: 它应该是equals(Object)
, not equals(Car)
.
本质上,您已经提供了overload而不是override, so HashMap
一直打电话给equals
来自基类。
解决这个问题很简单:添加一个执行强制转换的覆盖,并调用equals
你写的方法,像这样:
@Override
public boolean equals(Object other) {
return (other instanceof Car) && equals((Car)other);
}
注意使用@Override
注解。它可以帮助 Java 自动发现此类问题。
注意:解决这个问题后,请考虑实施您的hashCode
以更“节俭”的方式。而不是创造一个一次性的(this.getCarName() + this.getCarModel())
string 只是为了获取其哈希码,可以考虑重写方法如下:
public int hashCode() {
return 31*getCarName().hashCode() + getCarModel().hashCode();
}
或者在 Java 1.7+ 中你可以这样写
public int hashCode() { // Thanks, fge, for a nice improvement!
return Objects.hash(carName, carModel);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)