java Herumlungern und garbage collection
Ich habe dieses Stück code, der für den Stack die pop-Methode und ich ' m versucht herauszufinden, wie man es vermeidet, Herumlungern, während noch der Rückkehr das element, das unsere index momentan zeigt:
public String pop()
{ //Remove item from top of stack.
String item = a[--N];
a[N] = null; //Avoid loitering (see text).
if (N > 0 && N == a.length/4) resize(a.length/2);
return item;
}
Aus, was ich verstehen kann, zeigen wir das Referenz-Element von unser String-Objekt, das indizierte element(wir beginnen mit dem letzten element mit seiner aktuellen Größe N-1 also die dekrementiert) unser array ein. Dann, wenn wir der Rückgabe der Referenz, warum setzen wir das indizierte element, das die Referenz zeigt auf null vor, das zu tun? Nicht, die machen das Element, zeigen Sie auf nichts und nichts zurück?
- Referenzen in Java werden immer kopiert, so dass durch ändern, was in dem array, bist du nicht ändern, was Sie stieg aus.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann ein Objekt nicht von der garbage Collection freigegeben wird, solange es erreichbar ist. Wenn Sie ändern Sie einfach Ihre index mit
--N
aber nicht zunichte machena[N]
Sie halten eine Referenz auf das Objekt, die verhindern, dass der garbage-collection, auch wenn der client-code enthält keine Referenz auf das Objekt mehr.Ist einer der wenigen Fälle, wo Sie brauchen, um zu bewirken, dass Variablen in Java.
Sie scheinen auch falsch, was die Referenzen sind.
a[N]
enthält einen Wert, der Punkte auf ein Objekt im Speicher. Wenn Ihr schreibenString item = a[N]
kopieren Sie diesen Wert in die variableitem
. Beide Variablen (item
unda[N]
) nun auf das gleiche Objekt beziehen. Wenn Sie dann schreibena[N] = null
, Sie zu entfernen, dass die Referenz aus dem array aberitem
noch einen Wert enthält, verweist auf das ursprüngliche Objekt.a[N]
verweist. Dieser Beitrag könnte machen Dinge klarer: stackoverflow.com/questions/40480/is-java-pass-by-referenceString[] a = new String[N]
,a
enthält eine Referenz verweist auf ein Objekt, in diesem Fall ein array. Jedes array-Element, wiea[0]
enthält eine Referenz, die Punkte zu String.item
Referenz in diesem Fall dann?!Diese Kopien die Referenz im array. Es nicht auf die array-Mitglied.
Nun haben Sie zwei Referenzen auf das gleiche Objekt, eine in der lokalen Variablen, und eine in das array. Dies entfernt die Kopie in das array:
Wenn es nicht aus dem array entfernt, dann eine unnötige Referenz würde weiter bestehen, verhindern, dass die garbage collection.