1. 程式人生 > 實用技巧 >equals和“==”的區別

equals和“==”的區別

參考: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和==的區別:
  1. 如果是基本資料型別,只能用==,不能用equals
  2. 對於基本型別的包裝型別,比如Boolean、Character、Byte、Short、Integer、Long、Float、Double等的引用變數,==是比較地址的,而equals是比較內容的

只要是沒有重寫equals類中,來用equals來比較,那就是來比較記憶體地址的

參考: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和==的區別:
  1. 如果是基本資料型別,只能用==,不能用equals
  2. 對於基本型別的包裝型別,比如Boolean、Character、Byte、Short、Integer、Long、Float、Double等的引用變數,==是比較地址的,而equals是比較內容的
只要是沒有重寫equals類中,來用equals來比較,那就是來比較記憶體地址的