2016-05-14 46 views
-2
import java.util.ArrayList; 

public class bugs 
{ 
    public ArrayList<Integer> elements1; 
    public ArrayList<Integer> elements2; 

    public bugs(ArrayList<Integer> args) 
    { 
     elements1 = args; 
     elements2 = args; 
    } 

    public void change(int index, int value) 
    { 
     elements1.set(index, value); 
    } 

    public void reset() 
    { 
     elements1 = elements2; 
    } 

    public static void main(String[] a) 
    { 
     ArrayList<Integer> stuff = new ArrayList<Integer>(); 
     stuff.add(1); 
     stuff.add(1); 
     stuff.add(1); 
     stuff.add(1); 

     bugs b = new bugs(stuff); 
     b.change(2, 999); 
     b.reset(); 

     System.out.println(b.elements2); 
    } 
} 

Diese Ausgänge:Arraylisten nicht wie erwartet funktioniert

[1, 1, 999, 1]

Der zweite Array elements2 gibt es die Array elements1 in seine ursprüngliche Position zurückzusetzen, . Doch aus irgendeinem Grund elements1-elements2 kopiert wird, Druck

[1, 1, 999, 1]

und nicht

[1, 1, 1, 1 ]

+2

Warum denken Sie, es sollte '[1,1,1,1]' werden Druck? Beachten Sie, dass 'elements2',' elements1' und 'stuff' während der gesamten Laufzeit Ihres Programms das *** gleiche *** Objekt sind. Wenn Sie den Inhalt von eins ändern, ändert sich auch der Inhalt der anderen beiden. – luk2302

+0

lesen Sie dies, bevor Sie sich bewegen http://docs.oracle.com/javase/tutorial/collections/interfaces/list.html – emotionlessbananas

+0

und für [1,1,1,1] müssen Sie zurücksetzen, bevor Sie 999 hinzufügen (eine Kopie erstellen) – emotionlessbananas

Antwort

2

Sie übergeben den gleichen ArrayList-Verweis an beide Variablen.

Was Sie tun gemeint ist:

public bugs(ArrayList<Integer> args) 
{ 
    elements1 = new ArrayList<Integer>(args); 
    elements2 = new ArrayList<Integer>(args); 
} 

EDIT:

Beachten Sie, dass dies nur eine temporäre Lösung ist. Wenn Sie reset() aufrufen, wird die Referenz von elements2 an elements1 übergeben und Sie haben die gleiche Situation. Wenn Sie eine neue Arraylist erstellen und eine andere Liste als Argument übergeben, erstellen Sie eine neue Referenz mit demselben Inhalt. Das bedeutet, dass Sie auch Ihre reset() -Methode anpassen müssen, um eine neue Liste zu erstellen und elements2 als Argument zu übergeben.

0

In Java können Sie als Referenz oder nach Wert übergeben. Wenn Sie primitive Datentypen verwenden, übergeben Sie den Wert. Also:

public void method(int num) 
{ 
    int num1 = num; 
    int num2 = num; 
} 

Diese Methode Pass num Wert zu primitiven Datentypen num1 und num2. Wenn Sie num1 etwas hinzufügen, wird num2 nicht auf denselben Wert geändert. Aber wenn Sie nicht primitive Datentypen wie Arraylist verwenden:

public bugs(ArrayList<Integer> args) 
{ 
    elements1 = args; 
    elements2 = args; 
} 

sollten Sie erwarten, dass der Wandel in elements1 Array wird auch elements2 Array ändern. In diesem Beispiel übergeben Sie dieselbe ArrayList-Referenz an beide Variablen.

Die Lösung für Ihr Problem ist Kopie Ihrer Arrays erstellen:

public bugs(ArrayList<Integer> args) 
{ 
    elements1 = new ArrayList<>(args); 
    elements2 = new ArrayList<>(args); 
} 

public void reset() 
{ 
    elements1 = new ArrayList<>(elements2); 
} 
Verwandte Themen