为什么在 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
广告