引用分类,WeakHashMap,IdentityHashMap,EnumMap

引用分类

  • 强引用:StrongReference,引用指向对象,gc(Garbage Collection)运行时不会回收
  • 软引用:SoftReference,gc运行时可能回收(jvm内存不够时)软引用可用于制作缓存
  • 弱引用:WeakReference,gc运行时立即回收
  • 虚引用:PhantomReference,类似于不引用,主要跟踪对象被回收的状态,不能单独使用,必须与引用队列(ReferenceQueue)联合使用

目的:避免对象长期驻留在内存中,解决垃圾回收机制回收时机问题。

强弱比较示例程序
强引用示例

public class Demo04 {
    public static void main(String[] args) {
        //字符串常量池共享,不能回收
        String str="You Are My Sunshine!";
        //用弱引用来管理该字符串
        WeakReference wek=new WeakReference(str);
        System.out.println("gc运行前:"+wek.get());
        str=null;
        //通知gc运行
        System.gc();
        //开始回收
        System.runFinalization();
        System.out.println("gc运行后:"+wek.get());
    }
}
输出结果:
gc运行前:You Are My Sunshine!
gc运行后:You Are My Sunshine!

弱引用示例

public class Demo04 {
    public static void main(String[] args) {
        //这里下面这一句产生了两个对象,指向常量池里那个是强的。这个只是指向那个指向常量池对象的对象
        String str=new String("You Are My Sunshine!");
        //用弱引用来管理该字符串
        WeakReference wek=new WeakReference(str);
        System.out.println("gc运行前:"+wek.get());
        str=null;
        //通知gc运行
        System.gc();
        //开始回收
        System.runFinalization();
        System.out.println("gc运行后:"+wek.get());
    }
}
输出结果:
gc运行前:You Are My Sunshine!
gc运行后:null

WeakHashMap

键为弱类型管理的,gc运行时立即回收
作用:数据很多时,占用大量内存,可以清除弱引用,减少内存占用

public class Demo05 {

    public static void main(String[] args) {
        
        Map map=new WeakHashMap<>();
        map.put("a", "ab");
        map.put("c", "dd");
        map.put("a", "ab");
        //添加弱引用的元素
        map.put(new String("d"), "ad");
        map.put(new String("e"), "add");
        System.out.println(map.size());
        //调用gc
        System.gc();
        System.runFinalization();
        System.out.println(map.size());
    }
}
输出结果:
4
2

IdentityHashMap

该Map容器键只以地址去重,而不是比较hashcode与equals

public class Demo06 {

    public static void main(String[] args) {
        
        IdentityHashMap map=new IdentityHashMap<>();
        //常量池中的存在即获取
        map.put("a", "a1");
        map.put("a", "a2");
        System.out.println(map.size());
        map.put(new String("a"), "a3");
        map.put(new String("a"), "a4");
        System.out.println(map.size());
    }
}

EnumMap

键必须为枚举的值,值随意
构造器:public EnumMap(指定枚举的class对象);

public class Demo06 {

    public static void main(String[] args) {
        EnumMap enumMap=new EnumMap<>(Size.class);
        enumMap.put(Size.Small,"165-170");
        enumMap.put(Size.Midum,"170-175");
        enumMap.put(Size.Large,"175-180");
        
        System.out.println(enumMap.size());
    }
}
//枚举类,EnumMap需要键为枚举的值
enum Size{
    Small,Midum,Large
}

你可能感兴趣的:(引用分类,WeakHashMap,IdentityHashMap,EnumMap)