5

我想详细了解增强型 For 循环在 Java 中是如何工作的(假设我确实了解了这个循环的基本用法以及它一般是如何工作的)。

给定以下代码:

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

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

它实际上并没有修改原始列表“a”。为什么不?内存管理如何工作?'s' 不是对'a[i]' 的同一个内存单元的引用吗?

我在 oracle 文档中阅读了增强的 for 循环不能用于从原始数组中删除元素,这是有道理的。修改值是否相同?

提前致谢

4

5 回答 5

11

's' 不是对'a[i]' 的同一个内存单元的引用吗?

本来,是的。但随后in.readLine会产生对新 String 对象的引用,然后您可以使用它来覆盖s. 但只有s被覆盖,而不是底层字符串,也不是数组中的引用。

于 2013-01-03T10:43:09.350 回答
5

s是指向String实例的局部变量。它与 无关a[i],它们只是碰巧最初具有相同的值。

于 2013-01-03T10:43:49.150 回答
3

你只能写

for (int i = 0; i < a.length; i++) {
  out.println("String: " + a[i]);
  a[i] = in.readLine("New String? ");
}

您不能使用 for-each 循环来修改原始集合或数组。

于 2013-01-03T10:50:45.487 回答
1

s像一个对象的地址一样思考。这里的事情是s在使用 for 循环时指出数组的某个值。当您s在循环内重新评估时,它会s指向另一个值,但数组的原始值不会被修改,因为您只是更改了指向的地址。 s

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

for (String s : a) {
  //s --> "dog"
  out.println("String: " + s);
  s = in.readLine("New String? ");
  //s --> the new string the user inputs
}
于 2013-01-03T10:53:39.880 回答
1

对于每一次迭代,String s 最初都会引用 String a[] 中对应的 String 对象。但它随后被 in.readLine() 返回的另一个 String 对象引用。

于 2013-01-03T11:27:10.190 回答