在java中equals比較的是內容,值是否相等,==比較的是地址是否相同。
對於引用變量,引用類型的變量在棧中僅僅是存儲引用類型變量的地址,而其本身內容則存儲在堆中。
equals比較的是堆裏的值,==則比較的是引用的地址,棧中的值 。
對於基本類型,char,int等只要比較他們的值是否相同就可以,但是他們封裝的類就要另外考慮了。
這裏主要想說的是String類型。
String a = "Man";
String b = "Man";
String sa = new String("Man");
String sb = new String("Man");
System.out.println(a==b); //true
System.out.println(sa == sb); //false
System.out.println(sa.equals(a)); // true
System.out.println(sa.equals(sb)); //true
在運行a==b時返回的是true,而sa == sb時返回的是false
主要原因是sa和sb是對象引用,需要比較的是他們的地址,他們的值在堆中,sa,sb保存的是地址。
而a和b則是因爲有字符串緩衝池的緣故。
字符串緩衝池:
程序在運行的時候會創建一個字符串緩衝池, 當使用
b = "Man" 這樣的表達是創建字符串的時候,程序首先會
在這個String緩衝池中尋找相同值的對象,在第一個程序中,a先被 放到了池中,所以在b被創建的時候,程序找 到了具有相同值的
a, 將 b 引用
a 所引用的對象"Man";
使用了 new 操作符時,他明白的告訴程序: “我要一個新的!不要舊的!”與是一個新的"Man"Sting對象被創
建在內存中。他們的值相同,但是位置不同。