`

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的实现。

 

分享到:
评论

相关推荐

    拓胜技术专家教你如何深入理解Java四种引用类型

    Java中的四种引用类型是Java内存管理的重要组成部分,它们分别是强引用(StrongReference)、软引用(SoftReference)、弱引用(WeakReference)和虚引用(PhantomReference)。每种引用类型具有不同的特点和用途,...

    jdk8和jdk17安装套件

    Java Development Kit(JDK)是Java编程语言的软件开发工具包,它包含了编译器、JRE(Java Runtime Environment)、调试器以及其他工具,使开发者能够编写、运行和调试Java应用程序。这里我们关注的是两个版本:JDK ...

    JDK1.5与1.4区别

    以下是JDK 1.5与JDK 1.4之间的一些主要区别: 1. **泛型(Generics)** - 泛型的引入极大地提高了代码的安全性和类型检查能力。在JDK 1.4中,集合存储的是Object对象,需要强制类型转换,这可能导致运行时错误。而...

    jdk1.6 和jdk1.8

    Java Development Kit (JDK) 是Java编程语言的核心组件,它包含了一套开发和运行Java应用程序所需的工具和库。本文将详细探讨JDK 1.6和JDK 1.8之间的主要差异,以及它们在开发过程中的应用。 JDK 1.6,也被称为Java...

    jdk1.6-jdk1.8

    2. 方法引用和构造器引用:进一步简化了Lambda表达式的使用,可以直接引用方法和构造器。 3. 接口默认方法:接口中可以定义默认实现的方法,允许接口扩展而不会破坏已有实现。 4. Date/Time API(JSR 310):提供了...

    jdk-8u25、jdk-8u111、jdk-8u131、jdk-8u181、jdk-8u201

    2. **方法引用和构造器引用**:与Lambda表达式紧密相关,方法引用允许直接引用已有方法,而构造器引用可以用来创建新对象。 3. **流(Stream API)**:这个新的API允许对集合进行更高效的操作,支持序列化和并行化...

    jdk8中文说明文档_CHM.zip jdk1.8文档 jdk1.8说明文档

    Java Development Kit (JDK) 1.8,通常被称为JDK 8,是Java编程语言的一个重要版本,由Oracle公司发布。这个版本引入了许多新特性、优化和改进,旨在提高开发人员的效率和代码的可维护性。 JDK 8中文说明文档提供了...

    jdk1.8.0_131与jdk-11.0.6_windows-x64_bin

    6. **动态类型语言支持**:JEP 335(Dynamic Language Support in the JDK)增强了对动态类型语言的支持。 从这两个版本的对比可以看出,Java的进化是一个持续的过程,每个新版本都在尝试优化性能、提升开发者体验...

    jdk8安装包rpm,jdk8安装包rpm

    **四、JDK 8的重要特性** 1. **Lambda表达式**:引入了函数式编程的概念,简化了多线程编程和事件处理。 2. **Stream API**:提供了一种处理集合的新方式,使代码更简洁、易读。 3. **方法引用和构造器引用**:允许...

    jdk8_api文档

    2. **方法引用和构造器引用**:除了lambda表达式,JDK 8还支持方法引用和构造器引用,可以直接引用已存在的方法或构造器,无需编写额外的代码块。 3. **Stream API**:Stream API是JDK 8的一大亮点,它提供了一种新...

    jdk1.7免安装+jdk1.8安装版

    JDK1.7是在2012年发布的,引入了许多新特性,如动态类型语言支持(invokedynamic字节码指令),Project Coin的小型语言改进,Fork/Join框架以提升多线程性能,以及对NIO.2的增强,提供更好的文件系统访问能力。...

    windows64位jdk6、jdk7、jdk8安装包

    方法引用和默认方法也是JDK8的重要特性,增强了接口的功能。 在Windows 64位环境下安装这些JDK时,需要注意以下几点: 1. **下载**:根据操作系统版本选择合适的安装包,这里是针对64位Windows的,所以下载对应的x...

    包含 jdk1.5免安装、jdk1.6免安装、jdk1.8(32和64)

    3. **枚举(Enums)**:提供了一种新的数据类型,用于创建固定的、不可变的值集合。 4. **Annotations(注解)**:提供了一种元数据机制,可以在源代码中添加元数据,用于编译时或运行时的检查和处理。 5. **变量...

    JDK- jdk1.8.0-211.zip

    JDK 8替换原有的`java.util.Date`和`java.util.Calendar`,引入了`java.time`包,包含`LocalDate`、`LocalTime`、`LocalDateTime`等新类型,提供了更加强大且易用的日期和时间操作。 ### 7. **Optional 类** `java....

    JDK1.8 官网版本jdk1.8

    10. **类型推断增强**:编译器在JDK1.8中的类型推断能力得到了增强,使得编译器能更好地理解代码意图,减少冗余的类型声明。 以上就是JDK1.8的主要知识点。这些特性不仅丰富了Java语言的功能,也极大地推动了Java...

    JDK8文档 jdk-1.8.0_221 jdk-8u221 API文档

    JDK8增强了注解的使用,允许在类型参数、类型变量、泛型实例化、数组类型、方法返回类型、抛出的异常类型等位置使用注解,增加了注解的适用范围。 9. **新的并发改进** 并发包`java.util.concurrent`中增加了Fork...

    jdk8官方文档

    4. **方法引用来代替lambda**:除了lambda,JDK 8还引入了方法引用,可以直接引用已有方法,如`Objects::equals`,这在某些情况下比lambda更简洁。 5. **Date和Time API的改进**:JDK 8对日期和时间处理进行了重构...

    jdk 8 免费下载 / jdk8.zip

    9. **Type Annotations**:类型注解提供了一种在类型层次上添加元数据的方式,主要用于静态分析工具和编译器插件。 10. ** Nashorn JavaScript引擎**:JDK 8内置了一个Nashorn JavaScript引擎,允许Java代码直接...

    jdk11 免费下载 / 版本号 jdk11.0.4.zip

    4. **动态类型推断增强(var关键字)**:在JDK 11中,局部变量类型推断得到了增强,可以用`var`关键字声明变量,编译器会自动推断类型。 5. **强引用的弱化**:引入了`WeakReferences`和`SoftReferences`的替代品`...

    jdk1.8 32位 jdk1.8 32位 jdk1.8 32位

    Java Development Kit (JDK) 是Java编程语言的核心组件,它为开发者提供了编译、调试和运行Java应用程序所需的所有工具和库。在这个特定的压缩包中,我们关注的是JDK的1.8版本,而且是针对32位操作系统的。这个版本...

Global site tag (gtag.js) - Google Analytics