2016-05-05 55 views
0

這是一種this question,的重複,但是我正在尋找更多的ELI5在答案中的「可變鍵」和「桶」的解釋。如何更改HashSet中的值?

這裏是我的代碼,我無法理解:

HashSet<Object> set = new HashSet<Object>(); 
    set.add(1); set.add(2); set.add(3); 

    for(Object i : set) 
     if(i.equals(1)) { 
      i = 1337; 
      System.out.println("FOUND"); 
     } 

    for(Object i : set) System.out.println(i); 

輸出:

FOUND 

1 

2 

3 

爲什麼這個沒有打印出1337,2,3呢?

同樣的問題去除對象。

編輯:

此我想要做什麼,但我敢肯定它不是正確的方法去做:

for(Object i : set) 
     if(i.equals(1)) { 
      set.remove(i); 
      set.add(1337); 
      break; 
     } 
+0

這是所有關於不能在for-each循環內進行引用賦值,並且與可變與不可變鍵無關。我的變量是一個臨時的有限範圍變量,改變它的賦值對正在迭代的集合的內容沒有影響。 –

+0

@HovercraftFullOfEels意識到這是一個非常愚蠢的問題... –

回答

1

您正在處理基元。您在for循環中所做的工作是將Set的值複製到i,然後使用它做一些事情。現在,i是完全新的變量,您已更改其值,而不是Set。因此,Set不變。所以,你必須從Set刪除它,然後把新的價值,使這OK:

for(Object i : set) 
     if(i.equals(1)) { 
      set.remove(i); 
      set.add(1337); 
      break; 
     } 
如果你有對象

同樣的事情會發生,你會有新的指針,不是同一個對象,但兩個指針指向因此您將刪除一個指針,但Set中的一個將保留,因此GC將不會刪除該對象,直到Set中的指針被刪除(因此,沒有指針指向該對象)。

0

當你做一個set.remove(i) & set.add(i)它會工作因爲您正在執行該操作。

但是當你做i=1337你只是分配一個值給變量i,而不是執行任何設置操作。