關於java String的“==”和equals()比較、引用的小問題

這是一個老生常談的問題了,不過我最近才仔細看。

一點體會,筆而記之。

 

先看這幾句代碼

 

  1. String s1 = "String";  
  2. String s2 = "String";  
  3. System.out.println(s1 == s2 );  
  4. System.out.println(s1.equals(s2));  
 

結果爲:

true

true

 

這個結果說明什麼呢?

==在java中是比較引用的,即在內存中的地址。而String的equals()是比較字符串的內容。

 

第二個true無可爭議,因爲s1和s2的內容顯然 相同。

 

第一個true呢?

這說明s1和s2的地址相同,s1和s2的地址爲什麼會相同?

查閱資料,發現 :

String s1 = "String";

這種方式,java首先會在緩衝區查找是否有"String"這個常量對象,有就直接將其地址賦給s1,沒有就創建一個"String",然後將其賦給s1;然後        

String s2 = "String";

java同樣會在緩衝區中查找"String",這次能查找到了,因爲s1創建了一個"String",所以會將其地址賦給s2,如此,s1和s2便有了相同的地址。

 

 

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

 

 

 

OK。

再看這一段代碼

 

  1. String s3 = new String("String");  
  2. String s4 = new String("String");  
  3. System.out.println(s3 == s4);  
  4. System.out.println(s3.equals(s4));  
 

結果爲:

false

true

 

第二個true同樣無爭議。

 

第一個false說明s3和s4不是指向同一地址。

查閱資料發現,

String s3 = new String("String");會直接在內存中開闢一個空間存儲一個"String",並講引用賦給s3;

同樣 String s4 = new String("String");也會開闢一個空間,降低至給s4;

所以s3和s4的地址不一樣。

   即 

System.out.println(s3 == s4); 會打印出false。

 

 

 

 

 

 

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////*/

 

關於String的equals方法:

這是直接從jdk源碼複製的equals方法代碼:

  1.   public boolean equals(Object anObject) {  
  2. if (this == anObject) {  
  3.     return true;  
  4. }  
  5. if (anObject instanceof String) {  
  6.     String anotherString = (String)anObject;  
  7.     int n = count;  
  8.     if (n == anotherString.count) {  
  9.         char v1[] = value;  
  10.         char v2[] = anotherString.value;  
  11.         int i = offset;  
  12.         int j = anotherString.offset;  
  13.         while (n-- != 0) {  
  14.             if (v1[i++] != v2[j++])  
  15.                 return false;  
  16.         }  
  17.     return true;  
  18.     }  
  19. }  
  20. return false;  
  21.   }  
 

java的String是用字符數組模擬的。

從上面的代碼可以看出String的equals()的工作原理——

1、首先比較引用,如果引用相同,返回true;

2、比較類型,如果不是比較的不是String對象,返回false;

3、比較長度,字符串長度不等時,返回false;

4、逐個字符比較兩個字符串,遇到不一樣的字符,返回false;

5、到最後都一致,返回ture;

 

發佈了100 篇原創文章 · 獲贊 6 · 訪問量 12萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章