為什麼在 Java 中使用迴圈時要小心字串連線 (+) 運算子?


字串用於在 Java 中儲存一系列字元,它們被視為物件。java.lang 包的 String 類表示一個字串。

您可以使用 new 關鍵字(像任何其他物件一樣)或透過為字面量賦值(像任何其他原始資料型別一樣)來建立一個字串。

Public class Sample{
   Public static void main(String args[]){
      String str1 = "Hello";
      String str2 = "how are you";
   }
}

Java 中的字串是不可變的,也就是說,一旦建立了字串字面量,就不能修改它。

儲存

由於我們定義的所有字串值都是 String 類的物件,因此它們儲存在堆區域。但是,與其他物件在單獨的記憶體位置不同,為字串物件分配了一個稱為字串常量池的單獨記憶體位置。

每當你定義一個字串值時,JVM 都會在字串常量池中建立一個具有給定值的字串物件。因此,如果你執行上面的程式,將在字串常量池中建立兩個字串值。

兩個字串的連線

如果你嘗試連線這兩個字串值,如下所示:

str1 = str2 + str2;

由於 Java 中的字串是不可變的,因此不會修改 str1,而是會建立一個新的(中間)字串物件,其中包含連線後的值,並將其賦值給引用 str1。

如果你在迴圈中連線字串,則每次迭代都會在字串常量池中建立一個新的中間物件。這不推薦,因為它會導致記憶體問題。因此,不推薦如下例所示在迴圈中連線字串。

示例

public class StringExample {
   public static void main(String args[]) {
      String stringArray[] = {"Java", "JavaFX", "HBase", "Oracle"};
      String singleString = new String();
      for (int i=0; i<stringArray.length; i++) {
         singleString = singleString+stringArray[i]+" ";
      }
      System.out.println(singleString);
   }
}

輸出

Java JavaFX HBase Oracle

示例

如果你需要在迴圈中新增字串值,建議使用 StringBuilder 而不是 String:

public class StringExample {
   public static void main(String args[]) {
      String stringArray[] = {"Java", "JavaFX", "HBase", "Oracle"};
      StringBuilder singleString = new StringBuilder();
      for (int i=0; i<stringArray.length; i++) {
         singleString.append(stringArray[i]);
         singleString.append(" ");
      }
      System.out.println(singleString);
   }
}

輸出

Java JavaFX HBase Oracle

更新於:2020年7月2日

4K+ 瀏覽量

啟動你的職業生涯

完成課程獲得認證

開始
廣告
© . All rights reserved.