我有一个我重写了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();
}
现在,我有一个测试类,其中创建两个car对象,并调用equals方法,然后将car的每个实例放入HashMap中。我将每个实例设置为具有相同的汽车名称和模型,并调用equals方法实际上返回true。但是,即使每个实例返回相同的hashCode,当我将它们添加到HashMap时,它仍将两个对象保留在Map中,而我希望第二个放置项可以替换地图中的第一个对象。以下是测试课程的内容:
HashMap 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的实现也没有按我的预期工作。感谢任何人的输入。