引用分类
- 强引用: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<String> wek=new WeakReference<String>(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<String> wek=new WeakReference<String>(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<String,String> 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<String, String> 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<Size, String> 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
}
网友评论