首页 > 代码库 > Java的四种引用类型

Java的四种引用类型

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 }
View Code
 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     @Test13     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中提供了创建弱引用的方法,如下:

 

 

 

未完待续

 

Java的四种引用类型