【发布时间】:2021-06-10 11:26:17
【问题描述】:
我是 Java 初学者,我对增强的 for 循环和字符串数组有一些疑问。 在下面的源代码中,我一直在尝试使用增强的 for 循环来更改数组的内容。 似乎我无法更改字符串数组(arrString)中的内容,但我不知道具体原因。 (它适用于 StringBuilder 对象。) 我有点困惑,因为我实际上可以在正常情况下执行 str1+=str2 之类的操作并更改字符串内容(尽管此操作是通过 StringBuilder 类完成的)。
谁能指出为什么会发生这种情况以及我是否有任何误解?
class EnhancedForTest{
public static void main(String[] args){
//StringBuilder
StringBuilder[] arrStringBuilder=new StringBuilder[]{new StringBuilder("Hello1"), new
StringBuilder("Hello2"),new StringBuilder("Hello3")};
for(StringBuilder e: arrStringBuilder){
e.append("!");
}
for(StringBuilder e:arrStringBuilder){
System.out.println(e);
}
//String
String[] arrString=new String[]{"Hello1","Hello2","Hello3"};
for(String s:arrString){
s+="!";
}
for(String s:arrString){
System.out.println(s);
}
}
}
结果如下(对不起,我没有添加结果!):
Hello1!
Hello2!
Hello3!
Hello1
Hello2
Hello3
P.S.:我已将打印行作为新的 for 循环取出,它仍然适用于 StringBuilder 但不适用于 String
【问题讨论】:
-
请包括预期输出与实际输出。向我们提供可以自己运行的代码是一个好的开始,但总的来说,在问题中也有关于输出的信息会很有帮助。
-
它不起作用,因为字符串是不可变的,您尝试分配一个新值
s = ...- 对于 StringBuilders,您不创建新值,而是更改原始值。 -
@JanezKuhar 我已经尝试在外面获取打印代码,但仍然适用于 StringBuilder 但不适用于 String 类!我刚刚添加了分号。
-
如上所述,
String是不可变的,因此当您更改s += "!";时,会创建一个由局部变量@987654327 引用的新字符串(与arrString中的不同) @。如果需要修改String数组的内容,请使用对数组元素的引用:for (int i = 0; i < arr.length; i++) { arrString[i] += "!"; } -
感谢大家的回复!我现在明白为什么它不适用于 String 类。因为像'code'这样的操作 str1+=str2;由 StringBuilder 类完成,我误以为它们将返回相同的初始引用。这完全是一个误解,因为将创建一个新的 StringBuilder 实例,并且 toString() 将被称为“代码”(new StringBuilder(str1).append(str2)).toString()。而这个新实例的引用值将存储在 for 循环中的局部变量中。
标签: java arrays string foreach