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

时间:2013-01-03 10:41:19

标签: java memory-management for-loop

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

给出以下代码:

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

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

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

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

提前致谢

5 个答案:

答案 0 :(得分:10)

  

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

原来,是的。但是in.readLine生成对新String对象的引用,然后用它来覆盖s。但只覆盖s,而不是基础字符串,也不覆盖数组中的引用。

答案 1 :(得分:4)

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

答案 2 :(得分:3)

你只能写

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

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

答案 3 :(得分:1)

s中将地址视为对象。这里的事情是s在使用for循环时指向数组的某个值。当您在循环中重新s时,s指向另一个值,但未修改数组的原始值,因为您只更改了地址 { {1}}指向。

s

答案 4 :(得分:1)

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