更改Java列表中的引用

时间:2014-11-06 15:21:50

标签: java list

我在某种程度上感到愚蠢地问这个问题,但是

为什么无法使用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时无法更改引用?

3 个答案:

答案 0 :(得分:5)

s是一个String变量,分配给它不会影响列表。

要更改列表,请调用list.set(1,"QQQ");,这会将新的String作为列表的第二个元素。

答案 1 :(得分: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()

答案 2 :(得分: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);
}