簡單說說對==,equals,和hashcode的理解
1.簡單型別的變數沒有equals和hashcode方法,只能應用==進行比較;
2.變數,==比較的是物件在堆記憶體中的地址,如果要比較其中的內容的話,就要用equals方法。
如果是自己定義的物件,沒有重寫equals方法,那==和equals意義是一樣的,都是比較該物件的存放地址。因為Object 的equals方法,就是用==來實現的(可以看原始碼)。
3.hashcode
就是把任意長度的輸入(又叫做預對映, pre-image),通過雜湊演算法,變換成固定長度的輸出,該輸出就是雜湊值。這種轉換是一種壓縮映 射,也就是,雜湊值的空間通常遠小於輸入的空間,不同的輸入可能會雜湊成相同的輸出,而不可能從雜湊值來唯一的確定輸入值。
一般情況不用瞭解,但是在用到HashMap或者HashSet時候,這個方法就得關注了。
HashSet(無序,不可重複):基本數值型別的直接==比較就能確定是不是相同;當要存入的是引用型變數或者物件時,保證不可重複要實現2重比較:首先比較兩個物件的hashcode值,如果hashcode值相同,則再通過equals比較,再相同的話才能確定是同一個物件,不新增。否則就可以新增進HashSet。
HashMap,你想通過一個object的key來拿hashmap的value,hashmap的工作方法是,通過你傳入的object的hashcode在記憶體中找地址,當找到這個地址後再通過equals方法來比較這個地址中的內容是否和你原來放進去的一樣,一樣就取出value。
舉例說明一下:
1.兩個Man物件,儲存內容一致,都沒有重寫hashcode和equals方法
Man man = new Man("liming", 25, "lili");
Man man1 = new Man("liming", 25, "lili");
Set<Man> set = new HashSet<Man>();
set.add(man);
set.add(man1);
System.out.println(set.size());
得到的size是2
2.兩個man物件,儲存內容不一致,但是自定義了hashcode和equals比較規則
@Override
public int hashCode()
{
// TODO Auto-generated method stub
return 123;
}
@Override
public boolean equals(Object obj)
{
Man man = (Man) obj;
return man.age == this.age;
}
Man man = new Man("liming", 25, "lili");
Man man1 = new Man("limingasd", 25, "liliasd");
Set<Man> set = new HashSet<Man>();
set.add(man);
set.add(man1);
System.out.println(set.size());
再呼叫1裡面的程式碼,得到的結果是1。