返回顶部
首页 > 资讯 > 后端开发 > Python >Java的引用类型常用的四种方法
  • 286
分享到

Java的引用类型常用的四种方法

2024-04-02 19:04:59 286人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录前言强引用FinalReference软引用SoftReference弱引用weakReference虚引用PhantomReference前言 今天看代码看到有牵扯到弱引用的东

前言

今天看代码看到有牵扯到弱引用的东西,就先稍微补一补Java的四种引用类型吧。Java为引用类型专门定义了一个类Reference,它是引用对象的抽象基类。

这个类定义了所有引用对象共有的操作。 由于这个类和垃圾收集器是息息相关的,这个类不能直接子类化。

Reference有4个子类,分别为强引用FinalReference、软引用SoftReference、弱引用weakReference、虚引用PhantomReference。

意思就是这四种引用是在JVMGC用的,我们工作写代码根本用不着。

强引用FinalReference

Object obj = new Object();

上面我们new了一个Object对象,并将其赋值给obj,这个obj就是new Object()的强引用。
Java中的引用默认就是强引用。

强引用的特性是只要有强引用存在,被引用的对象就不会被垃圾回收。只有强引用不存在了,被引用的对象才会被垃圾回收。

写个demo吧,新建一个BeanA,重写finalize方法:

public class BeanA {
    @Override
    protected void finalize(){
        System.out.println("将对象从内存中清除出去");
    }
}

然后写个测试方法,将强引用置为空后,通知JVM垃圾回收。

    public static void main(String[] args) throws ioException {
        BeanA a = new BeanA();
        a=null;
        System.gc();
        //防止gc线程结束后还未执行finalize方法
        System.in.read();
    }

输出结果:将对象从内存中清除出去。

可以看到强引用不存在了,被引用的对象是可以被垃圾回收的。

软引用SoftReference

软引用是用于描述一些有用但非必需的引用。

SoftReference的实例保存一个Java对象的软引用,该软引用的存在不影响垃圾回收线程对该Java对象的回收。

意思就是只有在内存不足的情况下,被引用的对象才会被回收,内存够用是不会被回收的。

只要垃圾回收器没有回收它,该对象就可以被程序使用。和这个软引用是没有关系的(即没有将软引用置空),只和内存有关。

直接看demo:

public static void main(String[] args){
        SoftReference<byte[]> soft = new SoftReference<>(new byte[1024*1024*10]);
        System.out.println(soft.get());
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.gc();
        //注释掉下面这句两次get()方法都能获取到
        //byte[] bytes = new byte[1024 * 1024 * 15];
        System.out.println(soft.get());
    }

我们创建了一个SoftReference对象,其变量名soft强引用着这个SoftReference对象,而这个SoftReference对象则保存着一个软引用,这个软引用引用的是一个10M的数组

当然这个10M数组也可以替换成自己新建的对象:

A a=new A();
SoftReference<A> soft =new SoftReference<>(a);

这样的话SoftReference对象中保存的a就变成了软引用,如果内存足够的话,将a=null,GC后使用soft.get还是可以获取到该对象。

我们这里使用10M数组来测试,启动测试类设定VM内存20M,发现再新建一个15M数组后会将原来的10M数组给GC掉。

输出结果:

[B@2cfb4a64
[B@2cfb4a64

[B@2cfb4a64
null

总结一句话就是:创建强引用时内存不够就把软引用占的内存给回收掉。

总结一个词就是:欺软怕硬。

另外软引用非常适合缓存使用。

弱引用weakReference

弱引用和软引用很类似,不同的是弱引用引用的对象只要垃圾回收执行,就会被回收,而不管是否内存不足。

我demo没有设定vm:Xmx=20M,通知JVM进行垃圾回收后依然会将被引用对象回收掉。

    public static void main(String[] args){
       WeakReference<byte[]> soft = new WeakReference<>(new byte[1024*1024*10]);
        System.out.println(soft.get());
        //通知JVM进行垃圾回收
        System.gc();
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(soft.get());
    }

输出结果:

[B@2cfb4a64
null

虚引用PhantomReference

首先,虚引用是无法通过get方法来获取的。一个虚引用对象被回收时会被放在一个ReferenceQueue队列中,意思就是虚引用回收时会给出一个信号放在队列中。

        ReferenceQueue<Object> rq = new ReferenceQueue<>();
        Object obj = new Object();
        PhantomReference<Object> phantomReference = new PhantomReference<>(obj,rq);
        obj = null;
        System.out.println("Reference: "+phantomReference.get());
        System.gc();
        Reference<Object> r = (Reference<Object>)rq.poll();
        System.out.println("ReferenceQueue:  "+r);

输出结果两个null。只有VM内存不足时才会回收这个虚引用,才会将其放在队列中,才能通过poll()获取到队列中的PhantomReference对象,而这个引用对象需要程序员自己进行特殊处理。

那问题来了,甭管G不GC我都拿不到它,那它有啥用?

其实它一般用来管理直接内存,我们的垃圾回收器是在JVM中管理内存的,如果我们从网络中下载一个文件保存在os的内存中,而 新版JVM不需要copy一份到jvm内存中,通过引用可以直接访问操作系统管理的内存,当我们回收这个虚引用时,则会在队列中放入这个引入对象,方便用来特殊处理。

到此这篇关于Java的引用类型常用的四种方法的文章就介绍到这了,更多相关Java引用类型内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java的引用类型常用的四种方法

本文链接: https://lsjlt.com/news/153025.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Java的引用类型常用的四种方法
    目录前言强引用FinalReference软引用SoftReference弱引用weakReference虚引用PhantomReference前言 今天看代码看到有牵扯到弱引用的东...
    99+
    2024-04-02
  • 简述Java中的四种引用类型
    目录简介 强引用 软引用 弱引用 虚引用 简介 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用...
    99+
    2024-04-02
  • java四种引用类型是什么
    Java中有四种引用类型,它们分别是:1. 强引用(Strong Reference):最常见的引用类型,只要一个对象有强引用与之关...
    99+
    2023-09-28
    java
  • Java的四种引用方式
    目录1.强引用(StrongReference)2.软引用(SoftReference)3.弱引用(WeakReference)4.虚引用(PhantomReference)5.&n...
    99+
    2024-04-02
  • Java常见的四种引用是什么
    这篇文章主要讲解了“Java常见的四种引用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java常见的四种引用是什么”吧!从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能...
    99+
    2023-06-17
  • 四种引用类型在JAVASpringboot中的使用详解
    目录概念介绍01.  强引用02.  软引用03.  弱引用04.  虚引用对象可达性Springboot源码中的使用总结概念介绍 不同的引用类型,主要体现的是对象不同的可达性(r...
    99+
    2024-04-02
  • 利用JS判断数据类型的四种方法
    目录前言1、typeof 2、instanceof 3、constructor 细节问题:4、toString 总结前言 Javascript 中的数据类型判断其实是一个JavaSc...
    99+
    2024-04-02
  • Java的四种引用方式是什么
    本篇内容主要讲解“Java的四种引用方式是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Java的四种引用方式是什么”吧!1.强引用(StrongReference)使用最普遍的引用。只要引...
    99+
    2023-06-25
  • java8中的四种方法怎么引用
    这篇文章主要介绍“java8中的四种方法怎么引用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“java8中的四种方法怎么引用”文章能帮助大家解决问题。1、构造方法引用Test test&n...
    99+
    2023-06-30
  • Java的四种引用是什么
    这篇文章将为大家详细讲解有关Java的四种引用是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java的四种引用,用到的场景强引用:垃圾回收器不会回收软引用:如果内存...
    99+
    2024-04-02
  • Android中深入学习对象的四种引用类型
    目录一、引用详解1、强引用 StrongReference2、弱引用3、软引用4、虚引用前言: Java中,一切被视为对象,引用则是用来操纵对象的;在JDK1.2就把对象引用分为四...
    99+
    2024-04-02
  • java对象转化成String类型的四种方法小结
    目录方法1:采用 Object#toString()方法 方法2:采用类型转换(String)object方法 方法3:采用 String.valueOf(Object) 方法 方法...
    99+
    2024-04-02
  • java 引用传递的三种类型小结
    目录java引用传递的三种类型第一种第二种传递方式第三种传递方式对于三种引用传递的理解java引用传值问题问题起源,一个蠢到家的是失败案例两类参数传递基本数据类型引用数据类型引用传递...
    99+
    2024-04-02
  • Java中的四种引用是什么
    这篇文章主要讲解了“Java中的四种引用是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java中的四种引用是什么”吧!首先,从 JDK1.2  开始,对象的引用被划分为4种级...
    99+
    2023-06-16
  • java中引用类型的用法总结
    一、class作为成员变量在定义一个类Role(游戏角色)时,代码如下:使用 int 类型表示角色id和生命值,使用String类型表示姓名。此时,String 本身就是引用类型,由于使用的方式类似常量,所以往往忽略了它是引用类型的存在。如...
    99+
    2016-05-29
    java 引用类型 用法
  • Java引用类型interface的用法总结
    目录interface作为成员变量法术接口和实现英雄角色interface作为方法参数和返回值类型interface作为成员变量 接口是对方法的封装,对应游戏当中,可以看作是扩展游戏...
    99+
    2022-11-13
    Java引用类型interface Java引用 interface Java interface
  • JS中的四种数据类型判断方法
    目录1、typeof2、instanceof3、constructor4、toString() 本文总结了四种判断方法: 1、typeof typeof是一个运算符,其有两种使用方式...
    99+
    2024-04-02
  • JavaScript中检测数据类型的四种方法
    目录1. typeof2. instanceof3. constructor(构造函数)4. Object.prototype.toString.call()前言:在介绍检测数据类型...
    99+
    2024-04-02
  • Java几种常见的四舍五入的方法
    Java中常见的四舍五入的方法有以下几种:1. Math.round() 方法:该方法接收一个 float 或 double 类型的...
    99+
    2023-08-22
    Java
  • Java中四种引用详解
    目录强引用软引用弱引用虚引用总结java 中的 4 种引用方式,适用于不同的场景,重点需要理解虚引用,结合文字和代码 强引用 被强引用的对象,不会被垃圾回收器回收,JVM 宁愿抛出 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作