更改Java列表中的引用

更改Java列表中的引用,java,list,Java,List,我不知怎的觉得问这个问题很愚蠢,但是 为什么不能使用增强的FORSTATION手动更改对列表中对象的引用 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 :

我不知怎的觉得问这个问题很愚蠢,但是

为什么不能使用增强的FORSTATION手动更改对
列表中对象的引用

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);
}
private static List=new ArrayList();
公共静态void main(字符串[]args){
列表。添加(“AAA”);
列表。添加(“BBB”);
列表。添加(“CCC”);
用于(字符串s:列表){
如果(s.equals(“BBB”))s=“QQQ”;
}
系统输出打印项次(列表);
}
将打印
[AAA、BBB、CCC]
,因为对第二个元素的引用没有更改,这是意料之中的

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

编辑:好的,也许很清楚为什么它会这样工作,但是我如何才能完成引用更改?我不敢相信
List
的任何子类型都无法更改任何元素的引用


edit2:因此在使用增强语句时无法更改引用?

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


要更改列表,请调用
list.set(1,“QQQ”)
,它将把一个新字符串作为列表的第二个元素。

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


要更改列表,请调用
list.set(1,“QQQ”),这将把一个新字符串作为列表的第二个元素。

让我们深入了解增强for循环在后台的工作方式

for (String s : list) { .. }
实际上被翻译成:

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

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

让我们深入了解增强for循环在后台的工作方式

for (String s : list) { .. }
实际上被翻译成:

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

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

您可以创建一个临时列表

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);
}
private static List=new ArrayList();
公共静态void main(字符串[]args){
列表。添加(“AAA”);
列表。添加(“BBB”);
列表。添加(“CCC”);
List templast=new ArrayList();
用于(字符串s:列表){
如果(s.equals(“BBB”))s=“QQQ”;
圣殿骑士;
}
列表=圣殿骑士;
系统输出打印项次(列表);
}

您可以创建一个临时列表

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);
}
private static List=new ArrayList();
公共静态void main(字符串[]args){
列表。添加(“AAA”);
列表。添加(“BBB”);
列表。添加(“CCC”);
List templast=new ArrayList();
用于(字符串s:列表){
如果(s.equals(“BBB”))s=“QQQ”;
圣殿骑士;
}
列表=圣殿骑士;
系统输出打印项次(列表);
}


但是,在循环中这样做可能会导致ConcurrentModificationException。您必须使用自己的索引在for循环中这样做,以便知道要设置哪个索引。因为您没有使用迭代器,所以不会出现ConcurrentModificationException。我希望得到这种答案。这不是我要问的,请参阅编辑,因为在EnhancedForStatement中我没有索引,请告诉我如何在迭代时更改引用(不考虑ConcurrentModificationException)请尽管在循环中这样做可能会导致ConcurrentModificationException,但您必须使用自己的索引在for循环中这样做,以便知道要设置哪个索引。因为您没有使用迭代器,所以不会出现ConcurrentModificationException。我希望得到这种答案。这不是我要问的,请参阅编辑,因为在EnhancedForStatement中我没有索引,请告诉我如何在迭代时更改引用(撇开ConcurrentModificationExceptions不谈)。我想知道如何更改引用。我不想创建一个新的list@dasLort如果您注意到末尾,它会显示
list=templast
。它确实改变了它<代码>模板列表
只是一个临时占位符,您可以对其进行编辑。此代码无效。它对
s
变量的更改不做任何操作,并为该列表中的每个字符串添加
QQQ
。因此,结果将是
“QQQ”、“QQQ”、“QQQ”
,而不是
“AAA”、“QQQ”、“CCC”
@Tom抱歉,我做这件事时把自己弄糊涂了。更改了,所以现在更好了。我想知道如何更改引用。我不想创建一个新的list@dasLort如果您注意到末尾,它会显示
list=templast
。它确实改变了它<代码>模板列表
只是一个临时占位符,您可以对其进行编辑。此代码无效。它对
s
变量的更改不做任何操作,并为该列表中的每个字符串添加
QQQ
。因此,结果将是
“QQQ”、“QQQ”、“QQQ”
,而不是
“AAA”、“QQQ”、“CCC”
@Tom抱歉,我做这件事时把自己弄糊涂了。更改了它,所以现在更好了。在迭代列表时如何更改引用?如果我不能,为什么?Java只是缺少这种结构吗?这与它是一个for-each无关;这是java中变量和引用如何工作的基础。@dasLort,您可以使用
list.set(index,newReference)
方法更改引用。:)另请参见我对另一个答案的评论:因为在增强型For陈述中我没有索引,请告诉我如何在迭代时更改引用(撇开ConcurrentModificationExceptions不谈)哈哈,好吧,但这不是增强型For陈述,而是常规陈述;)在遍历列表时如何更改引用?如果我不能,为什么?Java只是缺少这种结构吗?这与它是一个for-each无关;这是java中变量和引用如何工作的基础。@dasLort,您可以使用
list.set(index,newReference)
方法更改引用。:)另见我对另一个答案的评论:sinc