深入了解Java中「 」與「equals」的區別

2021-07-24 19:26:09 字數 1828 閱讀 1710

1.「==」比較的是物件或者基礎資料型別的位址是否相同

給出例子:

son son1 = new son();

son son2 = new son();

system.out.println(son1==son2);

再來看:

int a = 3;

int b = 3;

system.out.pritln(a==b);

我們都知道結果是true,但是原因是什麼?這要深入到jvm的資料記憶體結果原理,這裡不深入,只給出結論:a與b都存放在棧中。基本資料變數存放在棧時,如果值相同的話,它們的引用就會指向相同的位址。

2.「equals」比較的內容要根據物件的equals方法怎麼寫

聽起來像廢話,但確實是這樣,不同物件有不同的equals實現。

這裡給出常用情況:

string:

public boolean equals(object anobject) 

if (anobject instanceof string)

return true;}}

return false;

}

先給出結論:string比較的是物件內容是否一樣。

第乙個if很明顯就是比較兩個string引用指向的位址是否一樣

大家疑惑肯定是第二個,為什麼會有第二個if,怎麼感覺有點多餘啊?

這並沒有多餘。string有兩種定義方式:

1).string str1 = "test";

2).string str2 = new string("test");

這兩種定義所導致的記憶體儲存有點不一樣。這要涉及到常量池的內容,str1定義會產生乙個或者0個物件。如果你在str1前像這樣string str1bf = "test";的話那麼就不會在常量池產生新的物件,而是直接指向已經存在的"test";

第二種會產生至少乙個物件,首先記憶體的堆裡面肯定會產生乙個物件。另外,跟上面一樣,當常量池存在「test」這個物件是,就不會在常量池產生新的「test」物件。反之,就會。

現在我們就明白了。第二個if所比較的是物件的內容是否一樣(即使記憶體位址不一樣,例如上面的str1與str2比較)。

其實第一if比較的雖然是位址的大小,但是實際上也可以看作比較的內容是否一樣。位址都一樣了,內容肯定一樣啦。

integer:

public boolean equals(object obj) 

return false;

}

這個所比較的也是內容是否一樣。

自定義類:

public boolean equals(object obj)
自己

定義的類預設是繼承了object物件的,預設比較的是位址。

但一般都建議要重寫equals()方法,使其比較的是內容。畢竟有了"=="這個比較位址異同的存在。你再用equals來比較位址的話就重複了。

總結一下:

1)「==」比較的是位址的異同

2)「equals」一般比較的是內容的異同

3)

自定的類,"equals"預設比較的也是位址的異同,一般建議重寫。

深入了解A

一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...

深入了解A

一 前言 在這裡我將對a 演算法的實際應用進行一定的 並且舉乙個有關a 演算法在最短路徑搜尋的例子。值得注意的是這裡並不對a 的基本的概念作介紹,如果你還對a 演算法不清楚的話,請看姊妹篇 初識a 演算法 這裡所舉的例子是參考amit主頁中的乙個源程式,使用這個源程式時,應該遵守一定的公約。二 a ...

java中的構造方法的深入了解

很長時間對與構造方法沒有很深的認識,但看過一篇介紹他的文章後感覺恍然大悟,故而把文章整理了一下收藏至此。類的繼承機制使得子類可以使用父類的功能 即 並且子類也具有父類的型別。下面 介紹類在繼承關係上的初始化的順序問題。示例1 class superclass public class subclas...