一、引用分类
强引用:StrongReference:引用指向对象,gc(Garbage collection)运行时不回收
软引用:SoftReference gc运行时可能回收(jvm内存不够)
弱引用:WeakReference gc运行时立即回收
虚引用:PhantomReference 类似于无引用,主要跟踪对象被回收的状态,不能单独使用,必须与引用队列(ReferenceQueue)联合使用
import java.lang.ref.WeakReference;
/**
* 引用分类:强、软、弱、虚
* 强与弱的引用
*/
public class RefTest {
public static void main(String[] args){
String str="zhangrui";//常量池对象不会被回收
WeakReference weakReference=new WeakReference(str);
System.out.println("回收前:"+weakReference.get());
//断开引用
str=null;
System.gc();
System.runFinalization();
System.out.println("回收后:"+weakReference.get());
System.out.println("***************************");
String str1=new String("zhangrui");
WeakReference weakReference2=new WeakReference(str1);
System.out.println("回收前:"+weakReference2.get());
//断开引用
str1=null;
System.gc();
System.runFinalization();
System.out.println("回收后:"+weakReference2.get());
}
}
二、三个Map接口实现
WeakHashMap
键为弱引用
/**
* WeakHashMap的key为弱引用
*/
import java.util.WeakHashMap;
public class WeakHashMap1 {
public static void main(String[] args){
WeakHashMap<String,String> map=new WeakHashMap<>();
//常量池对象,不会回收
map.put("a","zhang");
map.put("b","z");
//gc运行,已被回收
map.put(new String("ss"),"s");
map.put(new String("dd"),"d");
System.out.println(map.size());
//准备回收
System.gc();
System.runFinalization();
System.out.println(map.size());
}
}
IdentityHashMap
键比较地址去重,注意常量池的对象
import java.util.IdentityHashMap;
/**
* IdentityHashMap 键比较地址去重
* 而HashMap比较key的hashcode和equals
*/
public class IdentityHashMap1 {
public static void main(String[] args){
IdentityHashMap<String,String> map=new IdentityHashMap<>();
map.put("a","a1");
map.put("a","a2");
System.out.println(map.size());//IdentityHashMap只比较key的地址
map.put(new String("a2"),"aa");
map.put(new String("a2"),"bb");
System.out.println(map.size());
}
}
EnumMap
枚举Map,要求键为枚举的值
import java.util.EnumMap;
/**
* EnumMap要求键为枚举
*/
public class EnumMap1 {
public static void main(String[] args){
EnumMap<Season,String> map=new EnumMap<Season, String>(Season.class);
map.put(Season.SPRING,"春困");
map.put(Season.SUMMER,"夏天");
map.put(Season.AUTUMN,"秋乏");
map.put(Season.WINTER,"冬天");
System.out.println(map.size());
}
}
enum Season{
SPRING,SUMMER,AUTUMN,WINTER
}