2012-06-27 10 views
6

Próbuję utworzyć konstruktora kopiowania dla obiektu, a jednym z parametrów jest ArrayList.konstruktor kopii z parametrem ArrayList

podczas tworzenia obiektu ArrayList, miałem na myśli użycie konstruktora ArrayList, w którym można przekazać kolekcję jako parametr, ale nie jestem pewien, czy będzie to działać jako "wskaźnik" do listy tablic stworzy zupełnie nowy obiekt ArrayList

jest to kod mam

public MyObject(MyObject other) 
{ 
    this.brands= other.brands; 
    this.count = other.count; 
    this.list = new ArrayList<Integer>(other.list); // will this create a new array list with no pointers to other.list's elements? 

} 
+0

Nie będzie wykonywać kopii elementów. (I imho opionion, co byłoby dziwne.) – esej

+2

Możesz samodzielnie sprawdzić kod źródłowy ArrayList. Jest on dołączony do twojego JDK. –

Odpowiedz

17

nie jestem pewien, czy to będzie działać jako „wskaźnik” do ArrayList czy to stworzy cały nowy obiekt listy danych

Gdy użyjesz new, to będzie stworzyć markę nową instancję z ArrayList (o to właśnie prosiłeś). Ale będzie to , a nie również automatycznie tworzyć kopie jego elementów (co moim zdaniem jest tym, czego szukasz). Oznacza to, że jeśli zmienisz zmienny obiekt na nowej liście, zmieni się on również na oryginalnej liście, jeśli nadal jest w pobliżu. Dzieje się tak, ponieważ na liście znajdują się tylko odniesienia (rodzaj, ale nie dokładnie wskaźniki) do Object w nich samych, a nie same rzeczywiste Object.

Na przykład:

Person person = new Person("Rob"); // create a new Object 

List<Person> myList = new ArrayList<Person>(); 
myList.add(person); 

// Create another list accepting the first one 
List<Person> myList2 = new ArrayList<Person>(myList); 

for(Person p : myList2) { 
    p.setName("John"); // Update mutable object in myList2 
} 

person = new Person("Mary"); // stick another object into myList2 
myList2.add(person); 

for(Person p : myList2) { 
    System.out.println(p.getName()); // prints John and Mary as expected 
} 

for(Person p : myList) { 
    System.out.println(p.getName()); // prints only one result, John. 
} 

Więc widać, że dwie same Listy mogą być modyfikowane niezależnie, ale kiedy użyć konstruktora zaakceptowaniem innego List, jak będzie zawierać odniesienia do tych samych Person przypadkach, kiedy stan tych obiektów zmienia się na jednej Liście, zmienią się również w drugiej (podobnie jak wskaźniki).

+0

Więc co można powiedzieć, że najlepszą praktyką jest stworzenie zupełnie nowej listy w konstruktorze kopii? Utworzenie nowej listy, powtórzenie starej listy i dodanie nowych obiektów do nowej listy? – ashishduh

+0

Dość dużo. Spróbuj tego linku: http://stackoverflow.com/a/715660/473637 – Jeshurun