Java by API/java.lang.ref/WeakReference

Материал из Java эксперт
Перейти к: навигация, поиск

new WeakHashMap()

   <source lang="java">
 

import java.lang.ref.WeakReference; import java.util.Iterator; import java.util.Map; import java.util.WeakHashMap; public class Main {

 public static void main(String[] argv) throws Exception {
   Object keyObject = "";
   Object valueObject = "";
   Map<Object, Object> weakMap = new WeakHashMap<Object, Object>();
   weakMap.put(keyObject, valueObject);
   WeakReference weakValue = new WeakReference<Object>(valueObject);
   weakMap.put(keyObject, weakValue);
   Iterator it = weakMap.keySet().iterator();
   while (it.hasNext()) {
     Object key = it.next();
     weakValue = (WeakReference) weakMap.get(key);
     if (weakValue == null) {
       System.out.println("Value has been garbage-collected");
     } else {
       System.out.println("Get value");
       valueObject = weakValue.get();
     }
   }
 }

}


 </source>
   
  
 
  



new WeakReference(Object referent)

   <source lang="java">
 

import java.lang.ref.WeakReference; import java.util.Iterator; import java.util.Map; import java.util.WeakHashMap; public class Main {

 public static void main(String[] argv) throws Exception {
   Object keyObject = "";
   Object valueObject = "";
   Map<Object, Object> weakMap = new WeakHashMap<Object, Object>();
   weakMap.put(keyObject, valueObject);
   WeakReference weakValue = new WeakReference<Object>(valueObject);
   weakMap.put(keyObject, weakValue);
   Iterator it = weakMap.keySet().iterator();
   while (it.hasNext()) {
     Object key = it.next();
     weakValue = (WeakReference) weakMap.get(key);
     if (weakValue == null) {
       System.out.println("Value has been garbage-collected");
     } else {
       System.out.println("Get value");
       valueObject = weakValue.get();
     }
   }
 }

}


 </source>
   
  
 
  



new WeakReference(String referent, ReferenceQueue<? super String> q)

   <source lang="java">
 

import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.WeakReference; public class Main {

 public static void main(String[] argv) throws Exception {
   ReferenceQueue rq = new ReferenceQueue();
   WeakReference<String> wr = new WeakReference<String>("string", rq);
   while (true) {
     Reference r = rq.remove();
     if (r == wr) {
       System.out.println("no longer referenced");
     }
   }
 }

}


 </source>
   
  
 
  



WeakReference: get()

   <source lang="java">
 

import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; import java.util.HashMap; public class Main {

 public static void main(String[] args) {
   ReferenceQueue referenceQueue = new ReferenceQueue();
   Object object = new Object() {
     public String toString() {
       return "Referenced Object";
     }
   };
   Object data = new Object() {
     public String toString() {
       return "Data";
     }
   };
   HashMap map = new HashMap();
   Reference reference = null;
   System.out.println("Testing WeakReference.");
   reference = new WeakReference(object, referenceQueue);
   map.put(reference, data);
   System.out.println(reference.get());
   System.out.println(map.get(reference));
   System.out.println(reference.isEnqueued());
   System.gc();
   System.out.println(reference.get());
   System.out.println(map.get(reference));
   System.out.println(reference.isEnqueued());
   object = null;
   data = null;
   System.gc();
   System.out.println(reference.get());
   System.out.println(map.get(reference));
   System.out.println(reference.isEnqueued());
 }

}


 </source>
   
  
 
  



WeakReference: isEnqueued()

   <source lang="java">
 

import java.lang.ref.PhantomReference; import java.lang.ref.Reference; import java.lang.ref.ReferenceQueue; import java.lang.ref.SoftReference; import java.lang.ref.WeakReference; import java.util.HashMap; public class Main {

 public static void main(String[] args) {
   ReferenceQueue referenceQueue = new ReferenceQueue();
   Object object = new Object() {
     public String toString() {
       return "Referenced Object";
     }
   };
   Object data = new Object() {
     public String toString() {
       return "Data";
     }
   };
   HashMap map = new HashMap();
   Reference reference = null;
   System.out.println("Testing WeakReference.");
   reference = new WeakReference(object, referenceQueue);
   map.put(reference, data);
   System.out.println(reference.get());
   System.out.println(map.get(reference));
   System.out.println(reference.isEnqueued());
   System.gc();
   System.out.println(reference.get());
   System.out.println(map.get(reference));
   System.out.println(reference.isEnqueued());
   object = null;
   data = null;
   System.gc();
   System.out.println(reference.get());
   System.out.println(map.get(reference));
   System.out.println(reference.isEnqueued());
 }

}


 </source>