1. 程式人生 > >介紹equals 和 "==" 及記憶體分配

介紹equals 和 "==" 及記憶體分配

在Java語言中,equals和“==”都可以為兩個物件判斷是否相等

我先來介紹一下equals

equals是Object類的一個方法詳情請看JDK中的解釋

簡單來說,equals是一個判斷是否相等的方法,但需要注意的是如果比較的物件是引用型別的話,還要比較物件的地址是否相同。

再來說一下“==”和equals的關係

“==”是一個字串,而equals是一個方法,兩者本質上沒有多大的區別,都可以進行相同性的比較。在比較基礎資料和比較引用物件之間的方式也都相同。

1、基本資料型別比較
  ==和Equals都比較兩個值是否相等。相等為true 否則為false;
2、引用物件比較
  ==和Equals都是比較棧記憶體中的地址是否相等 。相等為true 否則為false;
需注意幾點:
  1、string是一個特殊的引用型別。對於兩個字串的比較,不管是 == 和 Equals 這兩者比較的都是字串是否相同;
  2、當你建立兩個string物件時,記憶體中的地址是不相同的,你可以賦相同的值。
  所以字串的內容相同。引用地址不一定相同,(相同內容的物件地址不一定相同),但反過來卻是肯定的;
  3、基本資料型別比較(string 除外) == 和 Equals 兩者都是比較值;
這裡我們要對第2點進行一下解釋:
舉個例子來說
這裡的返回值結果是什麼呢?
很多人會以為上述程式的輸出結果會是false,因為他們在記憶體中的地址不一樣嘛,但是很遺憾,程式的輸出結果是true,str1 == str2;
原因就在我們的記憶體之中
str1和str2是存在棧區的,因為他們屬於區域性變數,而字串"china"卻不存在堆區!字串"china"存放的位置是data segment(資料區域),他們是同一份拷貝,所以str1和str2指向的是同一個內容。