Java 自定義類做key值,需注意什麼

2021-08-08 05:24:48 字數 713 閱讀 1690

hashtable和hashmap都是用來存放鍵值對的一種容器,他們都有乙個特點就是,不能用來儲存重複的鍵值。

我們首先來說一下,他們是如何判斷是否存在重複鍵值的。主要有兩個步驟:

1.呼叫key的hashcode()方法生成乙個hash值h1,如果這個h1在hashmap中不存在,那麼就直接將新增到hashmap中;否則認為存在。

2. 認為存在後,找出所有hash值為h1的key,然後呼叫key的equals()方法判斷當前新增的key是否和已經存在的key值相同。如果相同,則覆蓋掉原來的value,不過不相同,則產生雜湊衝突,hashmap採用鏈位址法來解決衝突。

這裡有乙個邏輯一定要理清:equals()相同,則hashcode()一定相同;hashcode()相同,equals()未必相同。

可以想象,如果兩個內容相同的物件,因為其記憶體位址不同,未重寫的equals()最終會認為這兩個物件是不同的物件,最終就會導致看起來彷彿又兩個相同的key值。

所以為了實現,根據物件內容來判斷物件是否相同,這就需要重寫hashcode()和equals()方法。

示例如下:

public class person 

public int hashcode()

public boolean equals(object o)

}

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

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

JAVA自定義類

下面看乙個簡單的bankcard類 public class bankcard public int getpasswd public void setpasswd int passwd more methods 從構造器開始 public bankcard int id,int passwd 1....

以自定義物件作為hashmap的key需要注意什麼

用自定義類作為key,必須重寫equals 和hashcode 方法。自定義類中的equals 和 hashcode 都繼承自object類。object類的hashcode 方法返回這個物件儲存的記憶體位址的編號。而equals 比較的是記憶體位址是否相等。以下是沒有重寫equals 和hashc...