首页 > 解决方案 > 如何使用增强的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

标签: javaarraysstringforeach

解决方案


在 for-each 循环的每次迭代中,变量都会获得对数组相应元素的引用。在第一次迭代的情况下, StringBuilder 类型for(StringBuilder e:arrStringBuilder)的新变量e将指向与arrStringBuilder[0]. 然后调用appendusing this reference,它对引用earrStringBuilder[0]. 在下一次迭代e中将分配对 的引用arrStringBuilder[1],但所做的更改arrStringBuilder[0]将保留。

在第一次迭代的情况下,将创建一个指向for(String s:arrString)的新变量。但是,当您实际执行时,因此您为这个临时变量分配了对新 String 对象的引用,该对象将包含. 然而,这个新对象与原始对象没有任何关系,并且在下一次迭代开始时被丢弃。你的循环是这样工作的:sarrString[0]s += '!'s = s + '!'sHello1!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.
}

推荐阅读