java HashMap用自定義類做key(二)

2021-06-22 18:35:45 字數 1729 閱讀 1098

由於設計的需要,要自己編寫乙個類,作為hashmap中的key。先簡單測試一下,三下五除二,寫了個類,沒想到不行。才知道自己又想當然了。下面是我的程式:

class index

public string getid()

}string str="123";

string str1=new string("123");

hashmaphm=new hashmap();

hm.put(new index("123"), "lue");

hm.put(new index("123"), "abcue");

hm.put(new index(str), "alsfeue");

hm.put(new index(str), "value");

hm.put(new index(str1), "zzzzzzz");

system.out.println(hm.size());

system.out.println(hm.get(new index("123")));

執行結果為:

5null

結果讓我很是失望。但原因其實很簡單,就是這些key的hashcode不同,因此不能把內容相同的key的value給覆蓋掉。但如何解決呢?在網上找了一下,結果還真有這方面的內容,不過好像很少有人這麼用。

原來是因為index是繼承object的.使用object的hashcode生成的雜湊碼.它預設是使用物件的位址計算雜湊碼的.因此.兩次new的mykey的雜湊碼是不一樣的.有人可能又問了,既然是用物件位址計算雜湊碼,那麼如果用string物件作為hashmap的key,則不會出現這種情況,這是為什麼呢?這是因為string類過載了hashcode函式。看來我也應該重新寫我的類的hashcode函式了。

還有乙個函式應該過載,就是equals函式,因為當比較兩個類時,如果這個類中沒有equals函式,則到它的上一級去找,而我的這個類是繼承自object類,則呼叫object類的equals,結果是按照這兩個物件的位址比較的,自然是不會相等的。

下面是修改後的類:

class index

public string getid()

public int hashcode()

public boolean equals(object index)

}string str="123";

string str1=new string("123");//使str1和str位址不同

hashmaphm=new hashmap();

hm.put(new index("123"), "lue");

hm.put(new index("123"), "abcue");

hm.put(new index(str), "alsfeue");

hm.put(new index(str), "value");

hm.put(new index(str1), "zzzzzzz");

system.out.println(hm.size());

system.out.println(hm.get(new index("123")));

執行結果為:

1zzzzzzz

搞定!這其中涉及到了乙個操作符:instanceof。下面做簡要介紹:

instanceof 運算子是在執行期間測試乙個物件的型別,運算子左邊是乙個物件的例項,而右邊是乙個類或介面的名字。如果左邊的物件例項是屬於右邊的類或其子類的例項,或者是實現了介面類的例項則返回true。

用WP Query自定義WordPress 主迴圈

我們知道操作 wordpress 主迴圈 wordpress loop 最容易的方法是使用 query posts 函式。但是使用 query posts 直接修改 wordpress 預設的主迴圈,會有以下的問題 會干擾那些用到了 wordpress 迴圈的外掛程式。可能使一些 wordpress...

用js自定義彈窗

用js自定義彈窗 如下 doctype html html lang zh cn head meta charset utf 8 title title title style popup popup content top info style script 給定乙個值,使點 確定按鈕 為 tru...

自定義 如何自定義協議

何為自定義協議,其實是相對標準協議來說的,這裡主要針對的是應用層協議 常見的標準的應用層協議如http ftp smtp等,如果我們在網路通訊的過程中不去使用這些標準協議,那就需要自定義協議,比如我們常用的rpc框架 dubbo,thrift 分布式快取 redis,memcached 等都是自定義...