【问题标题】:When does an enhanced for loop actually modify an Underlying Array?增强的 for 循环何时真正修改底层数组?
【发布时间】:2016-07-24 08:14:39
【问题描述】:

在增强的 for 循环中,例如:

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

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

这实际上何时会影响数组 A?我们在课堂上了解到增强型 For 循环实际上并不会修改底层数组,但存在一些特殊情况。我认为这与内存管理有关,但我不确定。有人可以帮我理解一下吗?

【问题讨论】:

    标签: java loops foreach


    【解决方案1】:

    当你可以在不修改reference的情况下修改值;例如,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
    }
    

    【讨论】:

    • 这根本不会修改a。事实上,你可以声明它final 并得到相同的结果。
    • 我知道,它会修改数组引用的StringBuilder(s) 中包含的值。 for-each loop 文档指定 它不适用于在遍历时需要替换列表或数组中的元素的循环。 我只是在描述可能的为 OP。
    【解决方案2】:

    这实际上何时会影响数组 A?

    从不

    您在代码的任何部分都没有对a 做任何事情。

    可能学到的是你可以改变容器的成员(数组或其他)。

    想象一下这意味着什么,假设您有一列火车在行驶,每辆车都是您数组中的一个元素。你不能“改变火车”(每个车站都会有相同的车厢),但你可以“改变车厢”(人们在每一站上下车)。

    【讨论】:

    • 我想我想问的是为什么 s = in.readLine("New String? ");不修改A中的对应项?您还介意进一步解释一下“您可以改变容器的成员”是什么意思吗?
    猜你喜欢
    • 1970-01-01
    • 2020-11-22
    • 1970-01-01
    • 2016-10-31
    • 2012-03-20
    • 1970-01-01
    • 2014-02-23
    相关资源
    最近更新 更多