2013-11-21 9 views
5

ich auf dieses Beispiel aus wikipedia über schwache Referenz gekommen sind:WeakReference zu String und String-Konstanten

import java.lang.ref.WeakReference; 

public class ReferenceTest { 
     public static void main(String[] args) throws InterruptedException { 

      WeakReference r = new WeakReference(new String("I'm here")); 
      WeakReference sr = new WeakReference("I'm here"); 
      System.out.println("before gc: r=" + r.get() + ", static=" + sr.get()); 
      System.gc(); 
      Thread.sleep(100); 

      // only r.get() becomes null 
      System.out.println("after gc: r=" + r.get() + ", static=" + sr.get()); 

     } 
} 

ich in diesem Szenario nicht verstehen, warum nur r.get() den Wert null zurück, nicht aber die sr. bekommen(). Kann mir jemand den Grund sagen?

Vielen Dank.

Antwort

7

das Literal "I'm here" ist eine Kompilierzeitkonstante Zeichenfolge und als solche wird in der Konstanten String-Pool platziert, die (bis Java 7) wurde nie Müll gesammelt. das bedeutet, dass sr auf ein Objekt zeigt, das niemals Müll gesammelt wird. r verweist dagegen auf eine Kopie dieser Zeichenfolge, die sich nicht in einem const-Pool befindet und daher für die Erfassung in Frage kommt.

die documentation for String.intern() für einige weitere Details zu diesem String Pool

0

Wenn diese Referenzobjekt gelöscht worden, entweder durch das Programm oder durch den Garbage Collector, dann gibt diese Methode null zu sehen.

very well explained here

Verwandte Themen