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