java中.equals()方法和==號的區別
阿新 • • 發佈:2018-11-19
主方法要進棧
==號和equals()方法都是比較是否相等的方法,那它們有什麼區別和聯絡呢?
首先,==號在比較基本資料型別時比較的是值,而用==號比較兩個物件時比較的是兩個物件的地址值,實際上.equals()方法比較的就是相當於把變數進行打包,就是比較包裡面的內容:
int x = 10; int y = 10; String str1 = new String("abc"); String str2 = new String("abc"); System.out.println(x == y); // 輸出true System.out.println(str1 == str2); // 輸出false
那equals()方法呢?我們可以通過檢視原始碼知道,equals()方法存在於Object類中,因為Object類是所有類的直接或間接父類,也就是說所有的類中的equals()方法都繼承自Object類,而通過原始碼我們發現,Object類中equals()方法底層依賴的是==號,那麼,在所有沒有重寫equals()方法的類中,呼叫equals()方法其實和使用==號的效果一樣,也是比較的地址值,然而,Java提供的所有類中,絕大多數類都重寫了equals()方法,重寫後的equals()方法一般都是比較兩個物件的值;
這個是.equals()方法的原始碼:(所以說如果不重寫的話底層架構還是用==的)
public boolean equals(Object anObject) { if (this == anObject) { return true; } if (anObject instanceof String) { String anotherString = (String)anObject; int n = value.length; if (n == anotherString.value.length) { char v1[] = value; char v2[] = anotherString.value; int i = 0; while (n-- != 0) { if (v1[i] != v2[i]) return false; i++; } return true; } } return false; }
然後我下面列出我的測試程式碼:
package com.heima.string;
public class Demo2_String2 {
public static void main(String[] args) {
//demo1();
//建立了兩個物件,一個在常量池中,還有一個在堆記憶體中
//demo2();
//demo3();
//demo4();
demo5();
}
private static void demo5() {
String s1 = "ab";
String s2 = "abc";
String s3 = s1 + "c";
System.out.println(s3 == s2);//false
System.out.println(s3.equals(s2));//true
}
private static void demo4() {
String s1 = "a" + "b" + "c";
String s2 = "abc";
System.out.println(s1 == s2);//true,在java中有常量優化機制
System.out.println(s1.equals(s2));//true
}
private static void demo3() {
String s1 = new String("abc");//記錄的是堆記憶體中的地址值
String s2 = "abc";//記錄的是常量池中的地址值
System.out.println(s1 == s2);//false
System.out.println(s1.equals(s2));//true
}
private static void demo2() {
String s1 = new String("abc");
System.out.println(s1);//abc
}
private static void demo1() {
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);//true
System.out.println(s1.equals(s2));//true
}
}
在demo1中:這就涉及到了記憶體中的常量池,常量池屬於方法區的一部分,當執行到s1建立物件時,如果常量池中沒有,就在常量池中建立一個物件”abc”,第二次建立的時候,就直接使用,所以兩次建立的物件其實是同一個物件,它們的地址值相等。
所以兩個都是為true的;
在demo2中:
建立了兩個物件,一個在常量池中,一個在堆記憶體中;
在demo3中:
s1記錄的是堆記憶體的地址,s2是在常量池中;
在demo4中:
是常量優化原則;
在demo5中: