2014-11-06 75 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