2013-11-21 3 views
5

Mi sono imbattuto in questo esempio da wikipedia per quanto riguarda riferimento debole:WeakReference a String e costanti stringa

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()); 

     } 
} 

Non capisco in questo scenario perché solo r.get() restituisce NULL, ma non la sr. ottenere(). Qualcuno può farmi sapere il motivo?

Molte grazie.

risposta

7

il valore letterale "I'm here" è una stringa costante di tempo di compilazione e come tale viene inserito nel lotto di stringhe costanti, che (fino a java 7) non è mai stato raccolto. questo significa che sr punta a un oggetto che non sarà mai raccolto. r, d'altra parte, punta a una copia di quella stringa, che non è in alcun pool di cost, pertanto è idonea per la raccolta.

vedere la documentation for String.intern() per alcuni dettagli su questo pool di stringa

0

Se questo oggetto di riferimento è stata cancellata, sia dal programma o dal garbage collector, questo metodo restituisce null.

very well explained here