Java中的四种引用:强、软、弱、虚引用

这篇具有很好参考价值的文章主要介绍了Java中的四种引用:强、软、弱、虚引用。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

引用在实际中基本使用的都是强引用,垃圾回收器判断对象是否存在可用的算法:引用计数器算法,可达性分析算法,

引用计数器算法:在对象中添加一个引用计数器,每当对象被引用时,计数器加1,反正计数器减去1,当计数器为0,则不存在引用,垃圾回收的时候就可以回收该对象,但是存在问题无法解决循环依赖的问题。

可达性分析算法:通过一个称为"GC roots"的根对象作为起始节点,从这些节点开始,根据引用关系向下搜索,路径称为引用链,某个对象到根对象没有任何引用链连接,咋这个对象不可达,则该对象不能在使用。

Java的四种引用:

  1. 强引用(Strong Reference)- 最强的引用类型,它们是默认的引用类型。如果一个对象具有强引用,那么垃圾回收器一定不会回收这个对象。

  2. 软引用(Soft Reference)- 当系统内存不够时,垃圾回收器会根据当前内存情况,判断是否回收软引用对象,如果仍然内存不够,才会回收软引用对象。

  3. 弱引用(Weak Reference)- 相对于软引用来说,弱引用关联的对象只能存活到下一次垃圾回收之前,即只要这个对象没有被强引用关联,垃圾回收器就有可能回收它。

  4. 虚引用(Phantom Reference)- 无法通过虚引用访问对象的任何属性或方法,它的作用仅仅是在该对象被回收时收到一个系统通知。

1.强引用

创建一个对象,并将它赋给一个强引用变量。只要该变量存在,对象就不会被垃圾回收。例如:

/**
 *
 * 测试强引用
 */
public class TestStrongReference {
    public static void main(String[] args) {
        String s = new String("hello");
        System.gc();
        System.out.println(s);
    }
}

2.软引用

创建一个对象,并将它赋给一个软引用变量。当系统内存不足时,可能会回收软引用变量指向的对象。例如:

/**
 * 测试软引用
 */
public class TestSoftReference {
    public static void main(String[] args) {
        //创建一个强引用
        String s = new String("hello");
        //添加到软引用
        SoftReference<String> softReference = new SoftReference<>(s);
        s=null;
        //执行垃圾回收
        System.gc();
        //再次获取
        if(softReference !=null ){
            System.out.println(softReference.get());
        }
    }
}

3.弱引用

创建一个对象,并将它赋给一个弱引用变量。只要系统执行完垃圾回收,无论内存是否足够,弱引用变量指向的对象都会被回收。例如:

/**
 * 弱引用
 */
public class TestWeakReference {
    public static void main(String[] args) {
        WeakReference<String> weakReference = new WeakReference<>(new String("hello"));
        //执行垃圾回收
        System.out.println("执行垃圾回收之前");
        System.out.println(weakReference.get());
        System.gc();
        System.out.println("执行垃圾回收之后:");
        System.out.println(weakReference.get());

    }
}

4.虚引用

创建一个对象,并将它赋给一个虚引用变量。当系统执行完垃圾回收时,无论内存是否足够,虚引用变量指向的对象都会被回收。例如:文章来源地址https://www.toymoban.com/news/detail-675858.html

/**
 * 虚引用
 */
public class TestPhantomReference {
    public static void main(String[] args) throws InterruptedException {
        ReferenceQueue<String> referenceQueue = new ReferenceQueue<>();
        PhantomReference<String> phantomReference = new PhantomReference<>(new String("hello"), referenceQueue);
        System.gc();
        System.out.println(referenceQueue.remove().get());
    }
}

到了这里,关于Java中的四种引用:强、软、弱、虚引用的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • JAVA 的四种访问权限

    在Java编程中,访问权限是非常重要的概念,因为它可以保证代码的安全性和封装性。访问权限有四种,分别是public、protected、default和private。 private :如果一个类的方法或者变量被 private 修饰,那么这个类的方法或者变量只能在该类本身中被访问,在类外以及其他类中都不能

    2024年02月09日
    浏览(50)
  • Java中switch的四种用法

    总共有四种不同形式的switch。两种是switch语句,两种是switch表达式,表达式会生成一个值。switch表达式没有“直通式”行为。 1.switch()括号内seasonName,应与case后常量类型保持一致,或者是可以自动转换成可以互相比较的类型。 2.case标签可以是:类型为char、byte、short或int的常

    2024年02月16日
    浏览(49)
  • java中数组的四种排序

    1.1数组的基本概念 数组(Array)是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量/12713827)。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计

    2024年02月15日
    浏览(52)
  • Java创建数组的四种方式

    1.使用默认值来初始化 语法: 数组元素类型 [] 数组名称 = new 数组元素类型 [数组长度] EG: int [] nums = new int [5]; //创建了一个类型为int,名字为nums ,长度为5的数组 2.先声明一个数组,再给值 语法: 数据元素类型 [] 数组名称; 数组名称 = new 数组元素类型[数组长度]; EG: int [] nums; num

    2024年02月09日
    浏览(64)
  • JAVA中取整数的四种方法

    1.向下取整 Math.floor(),向下取整就是取最小的整数,如1.9就返回值为1.0,-1.9就返回-2.0,返回的总是小于等于原数。 2.向上取整 Math.ceil(),向上取整顾名思义就是取最大的整数,如1.9就返回2.0,-1.9就返回-1.0,返回的总是大于等于原数,如图。 3.接近取整 Math.rint(),接近取整顾

    2024年02月12日
    浏览(42)
  • java对接webservice接口的四种方式

    这两天一直在做外系统对接,对方的接口是webservice的形式,调用起来有些蛋疼,于是在这里记录一下我尝试过的调用WebService的三种方式。 方式一:以HttpURLConnection的方式调用 方式二:使用apache-cxf生成java类调用 下载apache-cxf并配置环境变量(参照JAVA环境变量配置),配置成

    2024年02月09日
    浏览(43)
  • java基础Object转String的四种方式

    java中Object转String有以下几种方法: 1.object.toString()方法 这种方法要注意的是object不能为null,否则会报NullPointException,一般别用这种方法。 2.String.valueOf(object)方法 这种方法不必担心object为null的问题,若为null,会将其转换为”null”字符串,而不是null。这一点要特别注意。”

    2023年04月08日
    浏览(43)
  • Java 项目防止 SQL 注入的四种方案

    SQL注入即是指web应用程序对用户输入数据的合法性没有判断或过滤不严,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,在管理员不知情的情况下实现非法操作,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据

    2024年02月09日
    浏览(56)
  • java实战:Java处理XSS漏洞的四种方法及代码示例

    本文将介绍几种在Java中处理XSS(跨站脚本)漏洞的常用方法,并提供详细的代码示例。我们将探讨使用HTML实体编码、使用内容安全策略(CSP)、使用框架内置的XSS防护和自定义过滤器等方法。通过本文,可以了解到如何在Java应用程序中实施有效的安全措施,以防范XSS攻击。

    2024年03月16日
    浏览(68)
  • Java 四种引用类型(强引用、软引用、弱引用、虚引用)

    在 Java 中,基本类型和引用类型是两种不同的数据类型 基本类型直接表示数值、字符或布尔值,直接将值存储在内存,包括 byte、short、int 、long、float 、double、char、boolean 引用类似 C 语言中的指针,在内存中存储的是对象的引用而不是对象本身,通过这个引用可以操作对象

    2024年02月05日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包