Java 增强型for循环何时实际修改底层数组?

Java 增强型for循环何时实际修改底层数组?,java,loops,foreach,Java,Loops,Foreach,在增强的for循环中,类似于: String[] a = {"dog", "cat", "turtle"}; for (String s : a) { out.println("String: " + s); s = in.readLine("New String? "); } 这实际上什么时候会影响阵列A?我们在课堂上了解到,增强的For循环实际上并没有修改底层数组,而是存在一些特殊情况。我认为这与内存管理有关,但我不确定。有人能帮我理解吗?当您可以修改值而不修改引用时;例

在增强的for循环中,类似于:

String[] a = {"dog", "cat", "turtle"};

for (String s : a)
{
    out.println("String: " + s);
    s = in.readLine("New String? ");
}

这实际上什么时候会影响阵列A?我们在课堂上了解到,增强的For循环实际上并没有修改底层数组,而是存在一些特殊情况。我认为这与内存管理有关,但我不确定。有人能帮我理解吗?

当您可以修改值而不修改引用时;例如,
StringBuilder
是一个可变的字符序列,您可以执行以下操作

StringBuilder[] a = { new StringBuilder("dog"), new StringBuilder("cat"),
        new StringBuilder("turtle") };

for (StringBuilder s : a) {
    out.println("String: " + s);
    s.setLength(0); // <-- clear the contents
    s.append(in.readLine("New String? ")); // <-- add the new content
}
StringBuilder[]a={new StringBuilder(“狗”),new StringBuilder(“猫”),
新StringBuilder(“海龟”)};
用于(StringBuilders:a){
out.println(“字符串:+s”);
s、 设置长度(0);//
这实际上什么时候会影响阵列A

从不

您没有对代码的任何部分中的
a
执行任何操作

您可能学到的是,您可以对容器的成员进行变异(数组或其他)


想象一下这意味着什么,假设你有一列火车在走它的路线,每辆车都是你数组中的一个元素。你不能“变异火车”(它在每个车站都有相同的车),但你可以“变异汽车”(人们在每一站上下车).

这根本不会修改
a
。事实上,您可以声明它
final
,并获得相同的结果。我知道,它会修改
StringBuilder
中包含的值数组引用。文档指定它不适用于需要在遍历列表或数组时替换列表或数组中元素的循环。我只是描述OP的可能性。我想我想问的是,为什么s=in.readLine(“新字符串?”);不修改A中的相应项?您是否介意进一步解释一下“您可以对容器的成员进行变异”的含义?