Immer wenn Collection#addAll
aufgerufen wird, erstellt es eine Kopie der Argumentliste und hängt es dann an die Sammlung an, auf der addAll
aufgerufen wurde.Problem mit addAll-Methode
Unten ist der Code für Fall I:
if (parentData != 0) {
if (nodeParentMap.get(parentData) != null) {
nodeParentMap.put(newNodeData, parentData);
//Creates new Nodes' parent and assigns its next to its parent, in that way I get the parents' linked list
Node parent = Node.build(parentData);
parent.next = parentListMap.get(parentData);
parentListMap.put(newNodeData, parent);
}
} else {
//Code for root
nodeParentMap.put(newNodeData, parentData);
parentListMap.put(newNodeData, null);
}
Hier seine N
Iterationen nimmt Nth parent
zu finden.
Unten ist der Code für Fall II:
if (parentData != 0) {
if (nodeParentMap.get(parentData) != null) {
nodeParentMap.put(newNodeData, parentData);
//Here all the parents of a node are present in arrayList #parents,
//so that I can fetch parent in O(1) as I know the index
ArrayList<Integer> parents = new ArrayList<>();
parents.add(parentData);
parents.addAll(parentListMap.get(parentData));
parentListMap.put(newNodeData, parents);
}
} else {
//Code for root
nodeParentMap.put(newNodeData, parentData);
parentListMap.put(newNodeData, new ArrayList<>());
}
Aber im Fall II, wenn Arraylist # addAll genannt wird, es Kopie der Liste erstellt geführt und dann attatches es. Also, gibt es eine Möglichkeit, ArrayList#addAll
mit dem Aufruf System#arrayCopy
auszuführen?
Vielen Dank.
Warum denkst du mit 'addAll' eine Kopie der Argumentliste? – Mureinik
@Mureinik In Oracle JDK tut es wirklich. Die Implementierung der ArrayList konvertiert zuerst die angegebene Auflistung in ein Array und hängt dann die Array-Elemente an ihren eigenen internen Speicher an. –