我在某种程度上感到愚蠢地问这个问题,但是
为什么无法使用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时无法更改引用?
答案 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);
}