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对象。