1. 程式人生 > >簡單說說對==,equals,和hashcode的理解

簡單說說對==,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。