equals和“==”的區別
阿新 • • 發佈:2020-12-10
參考:https://www.cnblogs.com/weibanggang/p/9457757.html
“==”是比較兩個變數本身的值,物件在記憶體的首地址。
首地址:物件的首地址是它在記憶體中存放的起始地址,它後面的地址是用來存放它所包含的各個屬性的地址,所以記憶體中會用多個記憶體塊來存放物件的各個引數,通過這個首地址就能找到該物件,進而找到該物件的各個屬性
"equals()"用來比較字串中的包含的內容是否相同
String s1,s2,s3 = "abc", s4 ="abc" ;
s1 = new String("abc");
s2 = new String("abc");
System.out.println( "s1==s2:"+(s1==s2));//false
System.out.println("s1==s3:"+(s1==s3));//false
System.out.println("s3==s4:"+(s3==s4));//true
System.out.println("s1.equals(s2):"+(s1.equals(s2)));//true
System.out.println("s1.equals(s3):"+(s1.equals(s3)));//true
System.out.println("s3.equals(s4):"+(s3.equals(s4)));//true
s3 = "abc" // 在常量池中建立物件 abc
s1 = new String("abc"); //在堆中建立new String()物件 但是因為abc已經在常量池中存在,所以不需要在常量池中建立物件
//所以 s1==s3 比較的是堆中的物件和常量池中的物件,這不是一個物件
StringBuffer sb1 = new StringBuffer("abc");
StringBuffer sb2 = new StringBuffer("abc");
System.out.println(sb1==sb2);
System.out.println(sb1.equals(sb2));
StringBuilder sb3 = new StringBuilder("abc");
StringBuilder sb4 = new StringBuilder("abc");
System.out.println(sb3==sb4);
System.out.println(sb3.equals(sb4));
原因:StringBuilder和StringBuffer類中沒有重寫equals這個方法,因此這個方法來自於Object
Object類中的equals的方法是用來比較地址的,所以是false。
Test t1 = new Test();
Test t2 = new Test();
System.out.println(t1==t2);
System.out.println(t1.equals(t2));
t1 = t2;
System.out.println(t1==t2);
System.out.println(t1.equals(t2));
前面的兩個false相當於比較記憶體地址,false不言而喻
執行 t1=t2相當於 t1指向了t2的記憶體地址,兩個記憶體地址一樣
所以兩個都是true
- equals方法對於字串來說是比較的內容,對於非字串來說,是比較的記憶體地址
- ==比較物件的記憶體首地址
- 如果是基本資料型別,只能用==,不能用equals
- 對於基本型別的包裝型別,比如Boolean、Character、Byte、Short、Integer、Long、Float、Double等的引用變數,==是比較地址的,而equals是比較內容的
- equals方法對於字串來說是比較的內容,對於非字串來說,是比較的記憶體地址
- ==比較物件的記憶體首地址
- 如果是基本資料型別,只能用==,不能用equals
- 對於基本型別的包裝型別,比如Boolean、Character、Byte、Short、Integer、Long、Float、Double等的引用變數,==是比較地址的,而equals是比較內容的