Java增强的循环 – 编辑原始数组值

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

给出以下代码:

String[] a = {"dog", "cat", "turtle"}; for (String s : a) { out.println("String: " + s); s = in.readLine("New String? "); } 

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

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

提前致谢

这不是’a [i]’的同一个存储单元的引用吗?

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

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

你只能写

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

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

想象一下对象的地址 。 这里的事情是,当使用for循环时, s指向数组的某个值。 当你在循环中重新生成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 } 

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