- 現象
map.get(Object key)爲null,我很確定這個key是我傳進去並且自認爲是與put進去的值相等。 - 過程
我有一個用於儲存成績信息的座標(key)及成績值(value)的LinkedHashMap:
private LinkedHashMap<Location, String> gradesMap = new LinkedHashMap<>();
Location類如下(爲了篇幅,去掉了getter和setter方法):
public class Location {
public Location(Integer row, Integer column) {
this.row = row;
this.column = column;
}
private Integer row;
private Integer column;
@Override
public boolean equals(Object obj) {
Location location = (Location) obj;
return column.equals(location.getColumn()) && row.equals(location.getRow());
}
}
重寫了equals是爲了使得當Location兩個屬性分別相等時對象引用就相同。即形如locationA.equals(locationB)這種。我還做了測試:
Location a = new Location(1,1);
Location b = new Location(1,1);
LOGGER.info("相等不:{}", a.equals(b));
輸出結果爲true。
這裏是爲了解析如下圖所示的excel裏面的數據使用:
按行解析後,將
最後按照預想的做法取出map中的值:
結果發現這個value始終爲null。
很不甘心,又做了個實驗:
輸入結果也爲null,這時候開始懷疑人生了,按道理說,key都是同一個了,爲啥獲取到值還是空的。於是就去翻這個map.get(Object key)方法:
這是LinkedHashMap中的get方法源碼,一眼我就瞧見了這個醒目的hash單詞,果斷去Location類重寫了下hashCode方法:
運行成功!
- 原因
我想大概是因爲要確定兩個對象是否相等需要equals與hashcode同時滿足吧。
找了些資料供參考,後續研究完善。
Java面試題之爲什麼要重寫hashcode( )和equals( )?
重寫equals和hashCode的區別