[英]Java HashMap Object, Integer
我有以下地圖:
Map<City, Integer> map = getMap();
和我的班級城市:
public class City {
private String c1;
private String c2;
public City(String c1, String c2){
this.c1 = c1;
this.c2 = c2;
}
現在,我有了一張充滿值的地圖,我需要尋找一個特定的鍵,例如:“ London,Paris”。 我的主要方法是:
map.get(new City("London", "Paris"));
由於某種原因,它給了我
線程“主”中的異常java.lang.NullPointerException
而且我幾乎可以肯定我不能這樣做。
為City
類實現hashCode
和equals
方法,否則為map.get(new City("London", "Paris"));
將始終返回null
。
當您嘗試使用結果時,您可能會得到nullpointer。 為此,您還需要實現city的equals和hashcode方法。
如果要在哈希映射中使用您的類,則需要重寫hashCode
和equals
:
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((c1 == null) ? 0 : c1.hashCode());
result = prime * result + ((c2 == null) ? 0 : c2.hashCode());
return result;
}
平等的實現應該是微不足道的。
您的代碼失敗,因為您沒有為編譯器定義如何比較兩個City對象。 您可以通過覆蓋equals
函數來定義比較規則。 每當覆蓋equals函數時,還應該覆蓋hashCode
函數。 哈希映射使用hashCode
函數以有意義且最佳的方式存儲鍵值對。 在哈希映射中執行查找時,也使用hashCode
函數。
您可以在以下文章中找到關於這些語義的更多豐富和准確的信息: http : //www.ibm.com/developerworks/java/library/j-jtp05273/index.html
關於為什么您可能會遇到NullPointerException的原因有兩個:
map.get()
,會引發異常 equals()
和hashCode()
方法,因此在執行get()
,映射不會返回正確的對象,而是返回null。 當您嘗試使用此方法時,您會得到例外。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.