1.同样的,话不多讲直接上代码
(1)认识了解下引用分类及其作用
package com.otherMapProduce; import java.lang.ref.WeakReference;
/*
* IdentityHashMap:键只以地址去重,而不是比较hashcode与equals,键是常量池中的字符串
* EnumMap:键必须为枚举的值,构造器:public EnumMap(指定枚举的class对象)
* 引用分类:
* 1.强引用:StrongReference:引用指向对象,gc(Garbage Collection)运行时不回收
* 2.软引用:SoftReference:gc运行时可能回收(jvm内存不够则无法回收)
* 3.弱引用:WeakReference:gc运行时立即回收
* 4.虚引用:PhantomReference类似于无引用,主要跟踪对象被回收的状态,不能单独使用,必须与引用队列(ReferenceQueue)联合使用
* 目的:
* 避免对象长期驻留在内存中,解决垃圾回收机制回收时机问题
*/
public class RefenenceTest { public static void main(String[] args) {
//常量池字符串,共享(不可回收)
String str="I like codes very much!";
//非常量池字符串
String str2=new String("I like codes very much!");
//弱引用管理对象
WeakReference<String> s=new WeakReference<String>(str);
WeakReference<String> s2=new WeakReference<String>(str2);
System.out.println("垃圾回收前str:"+s.get());
System.out.println("垃圾回收前str2:"+s.get());
//断开引用
str=null;
str2=null;
//通知回收
System.gc();
System.runFinalization();
System.out.println("垃圾回收后str:"+s.get());
System.out.println("垃圾回收后str2:"+s2.get());
}
}
效果截图:
2.WeakHashMap的简单使用:
package com.otherMapProduce; import java.util.Iterator;
import java.util.Map.Entry;
import java.util.Set;
import java.util.WeakHashMap;
//WeakHashMap:键为弱引用,回收键后自动删除key-value对象
public class WeakHashMapTest { public static void main(String[] args) { WeakHashMap<String,String> map=new WeakHashMap<String,String>();
//放入测试数据,分别放入常量池对象和非常量池对象,前者不会回收,后者会回收
//常量池对象
map.put("A", "葵花宝典");
map.put("B", "九阴真经");
//非常量池对象
map.put(new String("C"),"九阳神功");
map.put(new String("D"), "乾坤大挪移");
System.out.println("未经过垃圾回收前 : "+map.size());
//借助Set容器构造迭代器将它们读出来
Set<Entry<String, String>> set=map.entrySet();
Iterator it=set.iterator();
System.out.println("存放的数据为:");
while(it.hasNext()) {
System.out.print(it.next()+" ");
}
//通知回收
System.gc();
System.runFinalization();
System.out.println();
System.out.println("经过垃圾回收后: "+map.size());
} }
效果截图:
ps:这里只是简单了解一下引用及WeakHashMap的相关知识,仅供学习并未深入,如有不正之处欢迎大佬指正,必定虚心改正。