`

jdk四种引用类型的作用及区别

    博客分类:
  • java
阅读更多

一,简介

       在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-1.60.jar中文文档.zip

    bcprov-jdk15on-***.jar中文文档.zip,java,bcprov-jdk15on-***.jar,org.bouncycastle,bcprov-jdk15on,***,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,bouncycastle,bcprov,jdk15on,中文API文档,手册,...

    jdk1.7_新特性

    jdk1.7_新特性1、对集合的支持 1、创建List / Set / Map 时写法更简单了 2、对资源的自动回收管理 3、泛型实例创建过程中类型引用的简化

    国内常用jdk资源,jdk8资源

    Lambda可以引用类的成员变量与局部变量(如果这些变量不是final的话,它们会被隐含的转为final,这样效率更高)。Lambda可能会返回一个值。返回值的类型也是由编译器推测出来的。如果lambda的函数体只有一行的话,...

    jdk 1.8 中文高清版

    例如,一个 Double 类型的对象包含了一个类型为 double 的字段,这表示如果引用某个值,则可以将该值存储在引用类型的变量中。这些类还提供了大量用于转换基值的方法,并支持一些标准方法,比如 equals 和 hashCode...

    JAVA基础——JAVA的五种引用类型及引用队列

    JAVA 的五种引用类型及引用队列 ​ 在介绍 JAVA 的五种引用之前,先介绍一下什么是引用,以及引用和对象之间的关系 什么是引用 ​ 众所周知,JAVA 是一种面向对象的语言,在 JAVA 程序运行时,对象是存储在堆内存...

    jdk-12_osx-x64_bin.tar.gz

    有些类可以作为自己的符号引用(例如 String),而对于可链接常量,定义了一系列符号引用类型(ClassDesc、MethodTypeDesc、MethodHandleDesc 和 DynamicConstantDesc),它们包含描述这些常量的 nominal 信息。

    java虚拟机规范 jdk8.

    第2章概述Java虚拟机的整体架构,包括class文件格式、数据类型、原始类型、引用类型、运行时数据区、栈帧、浮点算法、异常等,这对理解本书后面的内容有重要帮助;第3章详述如何将Java语言编写的程序转换为Java...

    无法解析类型 java.util.Map$Entry。从必需的 .class 文件间接引用了它

    这是我在编写struts2中遇到的问题,整理出来,包括截图,希望可以帮到大家

    涵盖了90%以上的面试题

    请说出作用域public,private,protected,以及不写时的区别 为什么java中有些接口没有任何方法 java中的clone方法有什么作用 面向对象有哪些特征 面向对象的开发方式有什么优点 组合和继承有什么区别 多态的实现...

    java8源码-jdk8:jdk8源码阅读理解

    java.lang.ref和jdk.internal.ref下的各种引用:软引用/弱引用/虚引用 Unsafe的实现(JDK9之后有两个同名类,一个引用了另一个,建议放在一起阅读) java.util.stream下的流式编程的实现(很难) Thread和...

    jdk8-api-中文.zip

    另一方面,Java丢弃了C++中很少使用的、很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地,Java语言不使用指针,而是引用。并提供了自动的废料收集,使得程序员不必为内存管理而...

    Java最全面试题200道

    2.对于引用类型,==比较的是地址; 3.equals不能用于基本类型的比较; 4.如果没有重写equals,equals就相当于==; 5.如果重写了equals方法,equals比较的是对象的内容; 3、final 在 java 中有什么作用? (1)用来...

    最全java面试题及答案

    对于基本类型和引用类型 == 的作用效果是不同的,如下所示: 基本类型:比较的是值是否相同; 引用类型:比较的是引用是否相同; 代码示例: String x = "string"; String y = "string"; String z = new String(...

    jdk1.8.0_181(64位).7z

    JDK 8中的新功能 1.Java编程语言 Lambda Expressions是一种新的语言功能,已在此版本中引入。它们使您可以将功能视为方法参数,或将代码视为数据。Lambda表达式允许您更紧凑地表达单方法接口(称为功能接口)的实例...

    javabiginteger源码-read-jdk-source:阅读jdk

    java biginteger 源码 阅读JDK源码项目 2020.07.14创建该项目,目的...java.lang.ref和jdk.internal.ref下的各种引用:软引用/弱引用/虚引用 Unsafe的实现(JDK9之后有两个同名类,一个引用了另一个,建议放在一起阅读

    java接口方法概述集合详解.docx

    1、接口是Java语言中的一种引用类型,是方法的"集合",所以接口的内部主要就是定义方法,包含常量,抽象方法(JDK 7及以前),额外增加默认方法和静态方法(JDK 8),额外增加私有方法(jdk9)。 接口的定义,它与定义类...

    jdk7.0新特性

    对集合的支持 对资源的自动回收管理 泛型实例创建过程中类型引用的简化当声明你的对象的接口是,你肯定是不想重复指明泛型类型 在数字中使用下划线

    Java面试题和解题答案

    JDK 和 JRE 有什么区别? JDK(Java Development Kit)...对于引用类型,==比较的是地址; equals不能用于基本类型的比较; 如果没有重写equals,equals就相当于==; 如果重写了equals方法,equals比较的是对象的内容;

    java8源码-jdk8:Java8(又称为jdk1.8)是Java语言开发的一个主要版本。Oracle公司于2014年3月18日发布Java

    接口:从jdk8开始,接口可以定义为函数式接口,并新增了两种类型的方法,【静态方法和默认方法】打破了接口以前的定义“实现这个接口就一定要实现接口中的所有方法”,具体请看示例。 Stream API:新添加的Stream ...

    jdk1.8-source:JDK1.8源码分析包

    JDK1.8源码分析 相关的原始码分析结果会以注解的形式体现到原始码中 已完成部分: ReentrantLock CountDownLatch Semaphore HashMap ... 参考引用类型 ThreadLocal 线程 Proxy ClassLoader

Global site tag (gtag.js) - Google Analytics