關於「==」 && equals()&&hashcode

在面試的時候不少時候會問到「==」和equals()對於不少人來講都已經很瞭解了,對於我來講彷佛和新的知識點同樣。下面就來分析一下:java

  1. 「==」是幹什麼的呢? 答案:是比較兩個變量的值是否相等,在java中有8中基本類型:byte,short,int,long,chart,boolean,float,double;對於基本類型的數據使用「==」的時候就會比較的是他們自己的值。此處再也不舉例便很容易明白。 有人會很奇怪String類型,它不是基本數據類型,在使用「==」的時候爲何有時候返回的是true有時候返回的是false呢?接下來進行說明一下: String str1 = "test"; String str2 = "test"; System.out.println(str1==str2); 這個時候的結果是true;爲何呢?這個時候能夠確定的時候比較的時候依然比較的是內存地址,說明此刻str1和str2指向的是同一對象因此此處相等。 String str3 = new String("test"); String str4 = new String("test"); System.out.println(str3==str4); 這個時候的結果是false;這個時候str3和str4比較內存地址的時候不一樣因此返回的是false,那麼在使用「==」作比較的時候結果是對的呢?就不得不說「字符串緩衝池」,在程序運行的時候str2="test"的時候會在String的緩衝池中尋找相同值的對象,因爲str1=「test」已經被放到了字符串緩衝池中,因此在str2獲得的是str1的引用因此「==」獲得的結果是true; 當咱們使用了new時候就是告訴虛擬機,須要建立一個新的對象,這個時候就會在堆和棧中分別建立出對象和相應對象的引用。因此,兩個不一樣的地址「==」的時候,必定是false(內存有必定的浪費);若是想要避免相同狀況的內存的浪費能夠是用str4=str3.intern();這個函數是對字符串緩衝池進行了檢查而後將str3內容相的緩衝池的值給返回。

2.「equals()」面試

在做對象內容進行比較的時候顯然「==」是不行的,因此equals()方法隨之誕生了。 在基類Object中有方法equals()實現方式,此刻比較的仍然是內存地址: public boolean equals(Object paramObject) { return (this == paramObject); } 在封裝的對象類型不少都已經重寫了Object中equals方法那麼簡單看兩個: String類中的:函數

public boolean equals(Object paramObject) {
	if (this == paramObject)
		return true;
	if (paramObject instanceof String) {
		String str = (String) paramObject;
		int i = this.count;
		if (i == str.count) {
			char[] arrayOfChar1 = this.value;
			char[] arrayOfChar2 = str.value;
			int j = this.offset;
			int k = str.offset;
			while (i-- != 0)
				if (arrayOfChar1[(j++)] != arrayOfChar2[(k++)])
					return false;
			return true;
		}
	}
	return false;
}

String類中的equals()方法首先比較的是內存地址,而後是字符串長度,而後逐個字符進行比較。 Integer類中:this

public boolean equals(Object paramObject) {
	if (paramObject instanceof Integer)
		return (this.value == ((Integer) paramObject).intValue());
	return false;
}

此刻比較的也是內容,因此當咱們建立類的時候,對象作比較的時候須要重寫equals方法,由於通常若是使用java中的Map對象進行存儲時,他會自動調用hashCode方法來比較兩個對象是否相等。設計

3.「hashcode()」code

因此若是咱們對equals方法進行了重寫,建議必定要對hashCode方法重寫,以保證相同的對象返回相同的hash值,不一樣的對象返回不一樣的hash值。重寫hashcode()方法的目的是提升查找效率。 設計hashCode()時最重要的因素就是:不管什麼時候,對同一個對象調用hashCode()都應該產生一樣的值。若是在講一個對象用put()添加進HashMap時產生一個hashCdoe值,而用get()取出時卻產生了另外一個hashCode值,那麼就沒法獲取該對象了。因此若是你的hashCode方法依賴於對象中易變的數據,用戶就要小心了,由於此數據發生變化時,hashCode()方法就會生成一個不一樣的散列碼。 所以必定要注意:千萬不能改變生產hashcode的相關變量,這個會形成內存泄漏,永遠get不到存放在內存中的對象。對象

相關文章
相關標籤/搜索