一,简介
在java中提供了四种引用的类型。分别为StrongReference、WeakReference 、SoftReference以及 PhantomReference。
二,四种引用类型的作用及区别
StrongReference:强引用类型。是java 的默认引用实现,如果不特别指定,代码中使用的都是强引用。只要对象存在强引用,则gc的时候都不会清理掉该对象。
WeakReference:弱引用类型。通过WeakReference引用的对象,如果没有该对象的强引用。则gc的时候会清理掉该对象。
SoftReference:软引用类型。通过SoftReference引用的对象,即使没有该对象的强引用。gc时也不会回收该对象。只有当jvm内存不足时才会被回收, 这一特性使得 SoftReference 非常适合缓存应用数据。
PhantomReference:虚引用类型。由于使用场景极少,不做解释。
三,应用举例
static class User implements Serializable{ private static final long serialVersionUID = 1L; private String name = null; public User(String name){ this.name=name; } public String getName() { return name; } public void setName(String name) { this.name = name; } } public static void main(String[] args) { //強引用类型:变量strongReference对对象的引用为强引用 User strongReference = new User("strongReference"); System.out.println(strongReference.getName()); //弱引用类型: 变量weakReference对对象的引用为弱引用 WeakReference<User> weakReference = new WeakReference<User>(new User("weakReference")); System.out.println(weakReference.get().getName()); //软引用类型: 变量softReference对对象的引用为软引用 SoftReference<User> softReference = new SoftReference<User>(new User("softReference")); System.out.println(softReference.get().getName()); User user = weakReference.get();//user对对象的強引用 System.out.println(user.getName()); user = null;//清除強引用 weakReference.clear();//清除弱引用 softReference.clear();//清除软引用 } //弱引用测试 WeakReference<User> weakReference = new WeakReference<User>(new User("weakReference")); System.out.println(weakReference.get());//user对象 System.gc();//调用jvm 垃圾回收器(不一定立即执行) Thread.sleep(10000);//阻塞线程10秒,等待gc执行 System.out.println(weakReference.get()); //null
具体JDK案例,可参考WeakHashMap的实现。
相关推荐
bcprov-jdk15on-***.jar中文文档.zip,java,bcprov-jdk15on-***.jar,org.bouncycastle,bcprov-jdk15on,***,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bouncycastle,bcprov,jdk15on,中文API文档,手册,...
jdk1.7_新特性1、对集合的支持 1、创建List / Set / Map 时写法更简单了 2、对资源的自动回收管理 3、泛型实例创建过程中类型引用的简化
Lambda可以引用类的成员变量与局部变量(如果这些变量不是final的话,它们会被隐含的转为final,这样效率更高)。Lambda可能会返回一个值。返回值的类型也是由编译器推测出来的。如果lambda的函数体只有一行的话,...
例如,一个 Double 类型的对象包含了一个类型为 double 的字段,这表示如果引用某个值,则可以将该值存储在引用类型的变量中。这些类还提供了大量用于转换基值的方法,并支持一些标准方法,比如 equals 和 hashCode...
JAVA 的五种引用类型及引用队列 在介绍 JAVA 的五种引用之前,先介绍一下什么是引用,以及引用和对象之间的关系 什么是引用 众所周知,JAVA 是一种面向对象的语言,在 JAVA 程序运行时,对象是存储在堆内存...
有些类可以作为自己的符号引用(例如 String),而对于可链接常量,定义了一系列符号引用类型(ClassDesc、MethodTypeDesc、MethodHandleDesc 和 DynamicConstantDesc),它们包含描述这些常量的 nominal 信息。
第2章概述Java虚拟机的整体架构,包括class文件格式、数据类型、原始类型、引用类型、运行时数据区、栈帧、浮点算法、异常等,这对理解本书后面的内容有重要帮助;第3章详述如何将Java语言编写的程序转换为Java...
这是我在编写struts2中遇到的问题,整理出来,包括截图,希望可以帮到大家
请说出作用域public,private,protected,以及不写时的区别 为什么java中有些接口没有任何方法 java中的clone方法有什么作用 面向对象有哪些特征 面向对象的开发方式有什么优点 组合和继承有什么区别 多态的实现...
java.lang.ref和jdk.internal.ref下的各种引用:软引用/弱引用/虚引用 Unsafe的实现(JDK9之后有两个同名类,一个引用了另一个,建议放在一起阅读) java.util.stream下的流式编程的实现(很难) Thread和...
另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,而是引用。并提供了自动的废料收集,使得程序员不必为内存管理而...
2.对于引用类型,==比较的是地址; 3.equals不能用于基本类型的比较; 4.如果没有重写equals,equals就相当于==; 5.如果重写了equals方法,equals比较的是对象的内容; 3、final 在 java 中有什么作用? (1)用来...
对于基本类型和引用类型 == 的作用效果是不同的,如下所示: 基本类型:比较的是值是否相同; 引用类型:比较的是引用是否相同; 代码示例: String x = "string"; String y = "string"; String z = new String(...
JDK 8中的新功能 1.Java编程语言 Lambda Expressions是一种新的语言功能,已在此版本中引入。它们使您可以将功能视为方法参数,或将代码视为数据。Lambda表达式允许您更紧凑地表达单方法接口(称为功能接口)的实例...
java biginteger 源码 阅读JDK源码项目 2020.07.14创建该项目,目的...java.lang.ref和jdk.internal.ref下的各种引用:软引用/弱引用/虚引用 Unsafe的实现(JDK9之后有两个同名类,一个引用了另一个,建议放在一起阅读
1、接口是Java语言中的一种引用类型,是方法的"集合",所以接口的内部主要就是定义方法,包含常量,抽象方法(JDK 7及以前),额外增加默认方法和静态方法(JDK 8),额外增加私有方法(jdk9)。 接口的定义,它与定义类...
对集合的支持 对资源的自动回收管理 泛型实例创建过程中类型引用的简化当声明你的对象的接口是,你肯定是不想重复指明泛型类型 在数字中使用下划线
JDK 和 JRE 有什么区别? JDK(Java Development Kit)...对于引用类型,==比较的是地址; equals不能用于基本类型的比较; 如果没有重写equals,equals就相当于==; 如果重写了equals方法,equals比较的是对象的内容;
接口:从jdk8开始,接口可以定义为函数式接口,并新增了两种类型的方法,【静态方法和默认方法】打破了接口以前的定义“实现这个接口就一定要实现接口中的所有方法”,具体请看示例。 Stream API:新添加的Stream ...
JDK1.8源码分析 相关的原始码分析结果会以注解的形式体现到原始码中 已完成部分: ReentrantLock CountDownLatch Semaphore HashMap ... 参考引用类型 ThreadLocal 线程 Proxy ClassLoader