为什么在 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+ 浏览量

启动你的职业生涯

完成课程获得认证

开始
广告