1. 程式人生 > >java中==和eqauls()的區別,equals()和`hashcode的區別

java中==和eqauls()的區別,equals()和`hashcode的區別

==是運算子,用於比較兩個變數是否相等,而equals是Object類的方法,用於比較兩個物件是否相等。預設Object類的equals方法是比較兩個物件的地址,此時和==的結果一樣。換句話說:基本型別比較用==,比較的是他們的值。預設下,物件用==比較時,比較的是記憶體地址,如果需要比較物件內容,需要重寫equal方法。

equals()和hashcode()的聯絡
hashCode()是Object類的一個方法,返回一個雜湊值。如果兩個物件根據equal()方法比較相等,那麼呼叫這兩個物件中任意一個物件的hashCode()方法必須產生相同的雜湊值。
如果兩個物件根據eqaul()方法比較不相等,那麼產生的雜湊值不一定相等(碰撞的情況下還是會相等的。)

a.hashCode()有什麼用?與a.equals(b)有什麼關係
hashCode() 方法是相應物件整型的 hash 值。它常用於基於 hash 的集合類,如 Hashtable、HashMap、LinkedHashMap等等。它與 equals() 方法關係特別緊密。根據 Java 規範,使用 equal() 方法來判斷兩個相等的物件,必須具有相同的 hashcode。

將物件放入到集合中時,首先判斷要放入物件的hashcode是否已經在集合中存在,不存在則直接放入集合。如果hashcode相等,然後通過equal()方法判斷要放入物件與集合中的任意物件是否相等:如果equal()判斷不相等,直接將該元素放入集合中,否則不放入。

package StringTest;

class Dog{
	
}
public class EqualTest {
       public static void main(String[] args) {
		int a = 0;  // 基本資料型別可以使用==,不能使用equals函式
		Integer a1 = new Integer(0);  // 基本資料型別的包裝類可以使用==和equals函式
		int b = 0;
		Integer b1 = new Integer(0);
		System.out.println(a == b); // true,基本資料型別不用建立新物件,指向常量池
		System.out.println(a1 == b1); // false
		System.out.println(a1.equals(b1));// true
		Dog dog1 = new Dog();
		Dog dog2 = new Dog();
		System.out.println(dog1 == dog2);
		System.out.println(dog1.equals(dog2));
		Dog dog3 = dog1;
		System.out.println(dog1 == dog3);
		System.out.println(dog1.equals(dog3));
	}     
}