String 字符串相加比較


String 字符串相加 對比
public static void main(String[] args)  {
String a = "helloword";
final String b = "hello";
String d = "hello";
String c = b + "word";
String e = d + "word";
String f ="hello"+"word";
System.out.println(a == c);
System.out.println(a == e);
System.out.println(a == f);

}

輸出:

  true
  false
  true

 

2019-04-1217:23:56

首先要明確的是 引用數據類型 == 比較的是地址值,equal 沒重寫比較的是地址值,重寫之后比較的是內容.String重寫了,StringBuffer沒有重寫

其次:

a==c 為true是因為 b為final類型,當final變量是基本數據類型以及String類型時,如果在編譯期間能知道它的確切值,則編譯器會把它當做編譯期常量使用。也就是說在用到該final變量的地方,相當於直接訪問的這個常量,不需要在運行時確定。因此在上面的一段代碼中,由於變量b被final修飾,因此會被當做編譯器常量,所以在使用到b的地方會直接將變量b 替換為它的  值。所以 c = b+"word" 等於 c = “hello”+“word” 同--->有final時是直接比較內容而不是地址。

a ==e 為false是因為e = d+"word" 其實是創建了一個StringBuffer對象,然后用StringBuffer對象執行append方法來創建出字符串對象“ab”,然后再轉換成為String。但是這個轉換后的String對象,也就是上面的s3是放在堆里面的。而s4則是字符串常量,放在常量池里面。所以返回的是false。 ----->地址值不同

a ==f 為true 是因為: 常量相加的時候,其實是在編譯的時候就直接相加為“helloword”,這是JVM的優化,所以運行的時候,a和f的字節碼是一樣的。因為在常量池中有了一個“helloword”,所以兩個引用指向的是一個字符串“helloword”,所以返回結果也是true。----->指向同一個地址


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM