java - 如何使用增强的for循环更改字符串数组中的字符串内容?
问题描述
我是 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
PS:我已将打印线作为新的 for 循环取出,它仍然适用于 StringBuilder 但不适用于 String
解决方案
在 for-each 循环的每次迭代中,变量都会获得对数组相应元素的引用。在第一次迭代的情况下, StringBuilder 类型for(StringBuilder e:arrStringBuilder)
的新变量e
将指向与arrStringBuilder[0]
. 然后调用append
using this reference,它对引用e
和arrStringBuilder[0]
. 在下一次迭代e
中将分配对 的引用arrStringBuilder[1]
,但所做的更改arrStringBuilder[0]
将保留。
在第一次迭代的情况下,将创建一个指向for(String s:arrString)
的新变量。但是,当您实际执行时,因此您为这个临时变量分配了对新 String 对象的引用,该对象将包含. 然而,这个新对象与原始对象没有任何关系,并且在下一次迭代开始时被丢弃。你的循环是这样工作的:s
arrString[0]
s += '!'
s = s + '!'
s
Hello1!
arrString[0]
for(int i = 0; i < 3; i++) {
// Create a temporary variable which points to the same object as arrString[i]
String s = arrString[i];
// Create a temporary object which keeps the result of concatenation of s and '!'
String temporary = s + '!';
// Replace the reference stored in s with the reference to the temporary object
s = temporary;
// Now there is no connection between s and arrString[i]
// And here we just discard both temporary objects 's' and 'temporary'
// arrString[i] object remains unchanged.
}
推荐阅读
- cmake - 尝试在 Windows 10 上使用 Visual Studio 2005 时“无法打开文件 'user32.lib'”
- javascript - 在页面加载时淡入弹出窗口
- python - 获取当前 InvocationId 或 operation_Id
- r - 当 lhs 放置在 !() 中时,magrittr 管道的 rhs 返回 FALSE
- google-kubernetes-engine - 模棱两可的警告:“WARN[0064] 图像 [gcr.io/wired-benefit-XXXXX/demoapp] 未被部署使用”
- browser - 如何在不安全的上下文中启用 SubtleCrypto 进行测试?
- angular - 角度材料日期选择器限制范围选择
- javascript - 饼图未显示动态数据。我正在使用 Highchart
- docker - 带有主机网络的 Docker Swarm 更新服务
- python - 使用python求解三角函数时出错