2016-11-30 11 views
-2

Ich bin verwirrt durch die Linie res.add(new ArrayList<Integer>(temp));. Könnten Sie mir bitte sagen, warum es falsch ist, wenn ich einfach res.add(temp) verwende?Verwirrt von ArrayList Initialisierung

public void dfs(int[] nums, int index, List<List<Integer>> res, List<Integer> temp) { 
    res.add(new ArrayList<Integer>(temp)); 
    for(int i = index; i < nums.length; i++) { 
     temp.add(nums[i]); 
     dfs(nums, i + 1, res, temp); 
     temp.remove(temp.size() - 1); 
    } 
} 
+0

Sie initialisieren eine 'ArrayList' um eine andere Liste, da ist nichts _wrong_ mit diesem an sich. Vielleicht wollten Sie 'addAll()' verwenden. –

+1

Java nicht verwirrt..Sie nur verwirrt – sasikumar

+0

Konnten Sie den aufrufenden Code für diese zwei Methoden auch zeigen? Es ist nicht klar, wie Sie "res" nach dem Aufruf der Methoden verwenden möchten. –

Antwort

0

Die Variablen temp ist ein Ziel Referenz auf ein Objekt in einem Speicher, in diesem Fall wird eine Liste von Integers. Indem Sie die Methode remove auf temp aufrufen, ändern Sie tatsächlich das Objekt list, das temp auf Speicher verweist. Nach der for-Schleife erhalten Sie möglicherweise eine leere Liste, während Sie versuchen, temp zu verwenden.

Mit new ArrayList<Integer>(temp) tatsächlich schafft ein neues list of Integers Objekt im Speicher, die die ursprüngliche temp Referenz mit keine Beziehungen haben, in anderen Worten, es verweist nicht auf dem neuen list of Integer Objekt. Also das ist im Grunde eine neue list of Integers.

+0

Schöne Erklärung! Ich danke dir sehr! –