2014-11-06 51 views
1

我莫名其妙地觉得自己很蠢,问这个问题的参考,但更改Java列表

为什么不能使用EnhancedForStatement手改变一个List引用一个对象?

private static List<String> list = new ArrayList<String>(); 

public static void main(String[] args) { 
    list.add("AAA"); 
    list.add("BBB"); 
    list.add("CCC"); 

    for(String s : list){ 
     if(s.equals("BBB")) s = "QQQ"; 
    } 

    System.out.println(list); 
} 

将打印[AAA, BBB, CCC]因为引用的第二个元素没有改变,作为一个可以预期。

但为什么我不允许(或者是List错误的类型?)手动更改列表条目的引用?这个例子中的字符串可以是任何复杂的类型,这个问题是关于改变List中的引用。

编辑:好的,也许它很清楚为什么它的工作方式,但我怎样才能完成参考改变?我无法相信List的任何子类型都无法更改任何元素的引用。

edit2:所以使用EnhancedForStatement时无法更改引用?

回答

5

s是一个字符串变量,分配给它不影响列表。

为了更改列表,请拨打list.set(1,"QQQ");,这会将新的字符串作为列表的第二个元素。

+1

但这样做在一个循环可能会导致ConcurrentModificationException的 – dkatzel 2014-11-06 15:24:56

+0

你必须用自己的指数做一个for循环,让你知道要设置的指标。由于您没有使用迭代器,因此不会有ConcurrentModificationException。 – user12722 2014-11-06 15:29:31

+0

我预计这种答案。这不是我所问的,看到编辑 – dasLort 2014-11-06 15:42:34

4

让我们深入了解增强型for循环如何在后台工作。

for (String s : list) { .. } 

居然被翻译成:

for (Iterator<String> iter = list.iterator(); iter.hasNext();) { 
    String s = iter.next(); 
    .. 
    s = "QQQ"; 
} 

正如你所看到的,通过一个新的参考变量s,只是改变了它的循环的范畴,不具有任何影响在列表条目上。

如果您需要修改多数民众赞成由迭代处理,与ListIterator工作使得它很容易当前元素:

for (ListIterator<String> iter = list.listIterator(); iter.hasNext();) { 
    String s = iter.next(); 
    .. 
    iter.set("QQQ"); 
} 

注意iter.set(...)之前,我们需要调用iter.next()

+0

和在迭代列表时如何更改引用?如果我不能为什么? Java是否仅仅缺乏这个构造? – dasLort 2014-11-06 15:46:51

+1

这并不是真的要与这是一个每个;在java中变量和引用的工作方式至关重要。 – 2014-11-06 17:23:08

+0

@dasLort,你可以用'list.set(index,newReference)'方法改变参考。 :) – 2014-11-07 07:18:02

0

您可以创建一个临时列表。

private static List<String> list = new ArrayList<String>(); 

public static void main(String[] args) { 
    list.add("AAA"); 
    list.add("BBB"); 
    list.add("CCC"); 

    List<String> templist = new ArrayList<String>(); 

    for(String s : list){ 
     if(s.equals("BBB")) s = "QQQ"; 

     templist.add(s); 
    } 
    list = templist; 

    System.out.println(list); 
} 
+0

我想知道如何更改引用。我不想创建一个新列表 – dasLort 2014-11-06 15:43:50

+0

@dasLort如果你注意到最后,它说'list = templist'。它确实改变了它。 'templist'只是一个临时的占位符,所以你可以编辑它。 – mirvine 2014-11-06 16:35:09

+0

此代码不起作用。它对变化的'''变量没有任何作用,它为该列表中的每个字符串添加'QQQ'。因此,结果将是“QQQ”,“QQQ”,“QQQ”而不是“AAA”,“QQQ”,“CCC”'。 – Tom 2014-11-12 14:16:23