Object的默认hashCode()返回该对象的内存地址。所以,如果你有下面的类:
class Car {
String make;
String model;
int year;
public Car(String make, String model, int year) {
this.make = make;
this.model = model;
this.year = year;
}
}
再创建两个对象:
Car car1 = new Car("Toyota", "Corolla", 2010);
Car car2 = new Car("Toyota", "Corolla", 2010);
car1.hashCode()将从car2.hashCode()不同,因为每个对象都会有一个不同的内存地址。
如果您想让car1和car2返回相同的哈希码,该怎么办?在这种情况下,你应该覆盖默认的对象的hashCode()方法为汽车类,如下所示:
@Override
public int hashCode() {
Object[] x = {model, make, Integer.valueOf(year)};
int hashArray = Arrays.hashCode(x);
return hashArray;
}
这将使car1.hashCode()等于car2.hashCode(),因为String.hashCode()根据字符串内容计算hashCode,Integer.hashCode()将返回整数值本身。
在Java 7中,您可以使用Objects.hash(Object ... values)。因此,我们的新车hashCode()方法将如下所示:
@Override
public int hashCode() {
return Objects.hash(model, make, year);
}
Objects.hash(对象...值)将调用Arrays.hashCode你。
最后,Objects.hashCode(Object o)将执行空检查。如果对象为null,它将返回0。否则,它会调用对象的hashCode()方法。
在什么情况下'散列(o)'和'hashCode(o)'不会返回相同的值? ''hash()'state'的文档警告:当提供单个对象引用时,返回的值不等于该对象引用的哈希代码,但我仍在挖掘以找出原因。 – 2017-08-24 13:25:57