Java中有四种引用类型:强引用、软引用、弱引用、虚引用。--应该是从1.2版本开始添加的。
这个概念是与垃圾回收有关的。
如果你不知道这几个概念,那你用的肯定都是强引用。例如String str = new String(); 这个str到 new String() 的引用类型就是强引用。
那什么是弱引用呢?先看一段代码:
1 package cn.larry.pojo; 2 3 public final class Product { 4 private String name; 5 6 public String getName() { 7 return name; 8 } 9 10 public void setName(String name) { 11 this.name = name; 12 } 13 14 }
1 package cn.larry.test; 2 3 import java.util.HashMap; 4 import java.util.Set; 5 6 import org.junit.Test; 7 8 import cn.larry.pojo.Product; 9 10 public class WeakrefTest { 11 12 @Test 13 public void run1(){ 14 Product product =new Product(); 15 product.setName("abc"); 16 17 HashMap<Product,Integer> map=new HashMap<>(); 18 map.put(product, 1231231); 19 20 product=null; 21 22 Set<Product> keySet = map.keySet(); 23 for (Product p : keySet) { 24 System.out.println(p.getName()); 25 } 26 } 27 }
在上面的代码中,虽然在第20行已经将product引用置空(null),但是第24行的代码仍然可以访问到该引用最初指向的对象!
当然,我们可以手动的从HashMap中移除该对象,但我们更希望有一种机制来帮我们完成这个操作(从内存中移除对象而不导致问题)。弱引用就是这样的机制。
弱引用,就是引用与对象之间的联系很弱,弱到垃圾回收器会无视这个引用,直接回收对象。
软引用与弱引用类似,但只在内存不足时才会被回收。
虚引用最差,甚至不能通过引用获取对象,虚引用的目的仅仅是为了在对象被回收时将引用加入到引用队列中。
这里我们只讨论弱引用。JDK中提供了创建弱引用的方法,如下:
未完待续
时间: 2024-10-25 11:37:40