2013-01-03 59 views
5

我想详细了解Enhanced For循环如何在Java中工作(假设我知道该循环的基本用法以及它如何工作) 。Java增强For循环 - 编辑原始数组值

考虑下面的代码:

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

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

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

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

预先感谢

+3

字符串是不可变的。http://stackoverflow.com/a/8798424/112500 – Shashi

+0

's'是一个变量,它包含对容器元素的引用。 –

回答

10

不是 's' 到的 'A [1]' 相同的存储单元中的参考?

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

+0

非常感谢,这真的很有帮助。现在很清楚。 – jnardiello

+1

@Oliver,你的意思是当s = new String(“X”)时,引用s开始引用其他字符串对象而不是[i]? – Abhinav

+1

@Abhinav:是的.. –

4

s是一个局部变量,指向String实例。它与a[i]没有关联,它们恰好刚好具有相同的值。

3

你只能写

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

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

+0

你明确了最后一点仍然模糊不清。非常感谢! – jnardiello

+1

如果要删除()或更改列表的条目,则必须明确使用Iterator。 –

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 
} 
+1

非常感谢您的详细解答。我错过的是readLine返回一个新地址的事实。 – jnardiello

+0

如果您的问题已回答,请随时注册并接受答案;) – Averroes

1

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