自定義型別是否可以作為Map的Key問題

2021-09-19 22:53:19 字數 1596 閱讀 3022

雖說經常用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...