2016-05-05 11 views
0

Das ist eine Art Duplikat von this question,, aber ich suche ein bisschen mehr ELI5 Erklärung der "veränderbaren Schlüssel" und "Eimer" in den Antworten.Wie ändert man Werte in HashSet?

Hier ist mein Code, dass ich nicht verstehen habe:

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); 

Ausgang:

FOUND 

1 

2 

3 

Warum aus 1337, 2, bedeutet dies nicht 3 drucken statt?

Die gleiche Frage gilt für das Entfernen von Objekten.

EDIT:

Das tut, was ich will, aber ich bin ziemlich sicher, es ist nicht der richtige Weg, um darüber zu gehen:

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

Es geht darum, keine Referenzzuweisungen innerhalb einer for-each-Schleife vornehmen zu können, und hat nichts mit veränderbaren vs. nicht veränderbaren Schlüsseln zu tun. Die i-Variable ist eine temporär begrenzte Bereichsvariable, und das Ändern ihrer Zuweisung hat keine Auswirkungen auf den Inhalt der Sammlung, über die iteriert wird. –

+0

@HovercraftFullOfEels dies zu realisieren war eine sehr dumme Frage ... –

Antwort

1

Sie behandeln hier Primitive. Was Sie in for Schleife tun, ist, Sie kopieren Wert von Set zu i und dann tun Sie einige Sachen damit. Jetzt ist i eine komplett neue Variable und Sie haben ihren Wert geändert, nicht in Set. Daher ist Set unverändert. So müssen Sie es aus Set entfernen und dann neue Wert setzen, um dieses OK machen:

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

Die gleiche Sache geschieht, wenn Sie Objekte haben, werden Sie neue Zeiger haben, nicht das gleiche Objekt, sondern zwei Zeiger zeigt auf Derselbe Ort, so dass Sie einen Zeiger löschen würden, aber einer in der Set wird bleiben, so GC wird das Objekt nicht löschen, bis Zeiger in Set gelöscht wird (daher keine Zeiger auf das Objekt zeigt).

0

Wenn Sie das tun ein set.remove(i) & set.add(i) es funktionieren würde da Sie die Operation am Set ausführen.

Aber wenn Sie i=1337 tun, weisen Sie nur der Variablen i einen Wert zu und führen keine Set-Operation durch.