Java中equals和==的區別,java中equals區別

來源:互聯網
上載者:User

Java中equals和==的區別,java中equals區別

java中的資料類型,可分為兩類: 

1.基礎資料型別 (Elementary Data Type),也稱未經處理資料類型。byte,short,char,int,long,float,double,boolean 

  他們之間的比較,應用雙等號(==),比較的是他們的值。 
2.複合資料型別(類) 
 當他們用(==)進行比較的時候,比較的是他們在記憶體中的存放地址,所以,除非是同一個new出來的對象,他們的比較後的結果為true,否則比較後結果為false。 JAVA當中所有的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行為是比較對象的記憶體地 址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現,而不再是比較類在堆記憶體中的存放地址了。
對於複合資料型別之間進行equals比較,在沒有覆寫equals方法的情況下,他們之間的比較還是基於他們在記憶體中的存放位置的地址值的,因為Object的equals方法也是用雙等號(==)進行比較的,所以比較後的結果跟雙等號(==)的結果相同。
public class TestString { public static void main(String[] args) {String s1 = "Monday";String s2 = "Monday";if (s1 == s2){System.out.println("s1 == s2");}else{System.out.println("s1 != s2");}}

編譯並運行程式,輸出:s1 == s2說明:s1 與 s2 引用同一個 String 對象 -- "Monday"!
2.再稍微改動一下程式,會有更奇怪的發現:
public class TestString {public static void main(String[] args) {String s1 = "Monday";String s2 = new String("Monday");if (s1 == s2){System.out.println("s1 == s2");}else{System.out.println("s1 != s2");}if (s1.equals(s2)) {System.out.println("s1 equals s2");}else{System.out.println("s1 not equals s2");}}}
我們將s2用new操作符建立
程式輸出:
s1 != s2
s1 equals s2
說明:s1 s2分別引用了兩個"Monday"String對象


3. 字串緩衝池
原來,程式在啟動並執行時候會建立一個字串緩衝池當使用 s2 = "Monday" 這樣的表達是建立字串的時候,程式首先會在這個String緩衝池中尋找相同值的對象,在第一個程式中,s1先被放到了池中,所以在s2被建立的時候,程式找到了具有相同值的 s1
將s2引用s1所引用的對象"Monday"
第二段程式中,使用了 new 操作符,他明白的告訴程式:"我要一個新的!不要舊的!"於是一個新的"Monday"Sting對象被建立在記憶體中。他們的值相同,但是位置不同,一個在池中遊泳一個在岸邊休息。哎呀,真是資源浪費,明明是一樣的非要分開做什麼呢?


4.再次更改程式:
public class TestString {public static void main(String[] args) {String s1 = "Monday";String s2 = new String("Monday");s2 = s2.intern();if (s1 == s2){System.out.println("s1 == s2");}else{System.out.println("s1 != s2");}if (s1.equals(s2)) {System.out.println("s1 equals s2");}else{System.out.println("s1 not equals s2");}}}


這次加入:s2 = s2.intern();
程式輸出:
s1 == s2
s1 equals s2
原 來,(java.lang.String的intern()方法"abc".intern()方法的返回值還是字串"abc",表面上看起來好像這個方 法沒什麼用處。但實際上,它做了個小動作:檢查字串池裡是否存在"abc"這麼一個字串,如果存在,就返回池裡的字串;如果不存在,該方法會 把"abc"添加到字串池中,然後再返回它的引用。

問 java中 ==與equals 的不同 ?

=操作符專門用來比較變數的值是否相等。比較好理解的一點是:
int a=10;
int b=10;
則a==b將是true。
但不好理解的地方是:
String a=new String( "foo ");
String b=new String( "foo ");
則a==b將返回false。

物件變數其實是一個引用,它們的值是指向對象所在的記憶體位址,而不是對象本身。a和b都使用了new操作符,意味著將在記憶體中產生兩個內容為 "foo "的字串,既然是“兩個”,它們自然位於不同的記憶體位址。a和b的值其實是兩個不同的記憶體位址的值,所以使用 "== "操作符,結果會是false。誠然,a和b所指的對象,它們的內容都是 "foo ",應該是“相等”,但是==操作符並不涉及到對象內容的比較。
對象內容的比較,正是equals方法做的事。

看一下Object對象的equals方法是如何?的:
boolean equals(Object o){

return this==o;

}
Object對象預設使用了==操作符。所以如果你自創的類沒有覆蓋equals方法,那你的類使用equals和使用==會得到同樣的結果。同樣也可以看出,Object的equals方法沒有達到equals方法應該達到的目標:比較兩個對象內容是否相等。因為答案應該由類的建立者決定,所以Object把這個任務留給了類的建立者。

看一下一個極端的類:
Class Monster{
private String content;
...
boolean equals(Object another){ return true;}

}
我覆蓋了equals方法。這個實現會導致無論Monster執行個體內容如何,它們之間的比較永遠返回true。

所以當你是用equals方法判斷對象的內容是否相等,請不要想當然。因為可能你認為相等,而這個類的作者不這樣認為,而類的equals方法的實現是由他掌握的。如果你需要使用equals方法,或者使用任何基於散列碼的集合(HashSet,HashMap,HashTable),請察看一下java doc以確認這個類的equals邏輯是如何?的。
 
java 中equals 與 ==的不同

== 對於 Object及其子類 判斷是不是同一個 執行個體。
equals 看你怎麼重寫了,一般用來判斷內容是否相同。

對於int等類型 == 判等。
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.