雖說經常用map,但是我用它的時候,key都是用string或者integer型別,今天偶然想到,可不可以用自己定義的物件作為map的key呢?
talk is cheap give me code
class student
public student(string name,string ***)
public student(){}
public void setname(string name)
public string get***()
public void set***(string ***)
public static void main(string args)
map.put(new student("二號","女"),"333");
system.out.println(map.get(new student("二號","女"))); //試了試單獨根據key獲取值}}
結果是這個,為何會存在乙個null呢????
因為map儲存獲取都是根據hashcode值和equals方法有聯絡,前邊將map的key拿到再放進去獲取value,並沒有發生物件的變化,hashcode值也不變,下邊我又以新的物件去map中獲取,此時的hashcode值已經變了,所以返回為null,因為那是我新new的物件所以,map已經不認識了。
怎麼才能解決這個問題呢。重寫student的hashcode方法和equals方法就可以了,如下:
class student
public student(string name,string ***)
public student(){}
public void setname(string name)
public string get***()
public void set***(string ***) @override
public int hashcode()
@override
public boolean equals(object obj) else if (!name.equals(other.name))
return false;
if (*** == null) else if (!***.equals(other.***))
return false;
return true;
}public static void main(string args)
map.put(new student("二號","女"),"333");
system.out.println(map.get(new student("二號","女"))); //試了試單獨根據key獲取值}}
綜上:如果要以可變物件作為key的話,需要重寫hashcode和equal方法來達到這個目的。
本篇部落格是剛剛踩坑之後寫的,之前的博主坑還是很明顯的。附上鏈結
map 自定義型別作為鍵值
作為乙個計算機專業的學生,一直沒有深入的學習過map真是罪過罪過!今天終於對map的insert機制做了一點研究,弄明白了如何用自定義型別作為鍵值了。網上大多數的言論都是必須過載 操作符,但其實不止要過載 操作符,還需過載 操作符才能更好的完成工作。對於乙個自定義型別,過載 操作符一定要合適,即對於...
C 中vector可以作為map的鍵值
因為專案中需要根據狀態找到乙個對應的結果,就採用了map的結構,但是狀態本身較為複雜,存在乙個vector中。上次使用map的經驗是自定義類型別作為鍵值必須過載 操作符,因為map的快速查詢是基於紅黑樹的構建,因而鍵值必須能相互之間比較。所以擔心vector作為類型別的鍵值會引發一些錯誤,就寫了乙個...
std map 自定義型別作為key
昨天給同事寫了乙個把自定義型別作為map中key值的示例,結果過了半個小時,同事反饋 不滿足需求。嗯哼?作為乙個程式設計師,不滿足需求那可就是bug呀 不行,得盡快給處理一下。異常示例 不滿足需求樣例 源 如下 1 include 2 include 3 include 4 using namesp...