iis服务器助手广告广告
返回顶部
首页 > 资讯 > 移动开发 >Android中深入学习对象的四种引用类型
  • 599
分享到

Android中深入学习对象的四种引用类型

2024-04-02 19:04:59 599人浏览 八月长安
摘要

目录一、引用详解1、强引用 StrongReference2、弱引用3、软引用4、虚引用前言: Java中,一切被视为对象,引用则是用来操纵对象的;在jdk1.2就把对象引用分为四

前言:

Java中,一切被视为对象,引用则是用来操纵对象的;在jdk1.2就把对象引用分为四种级别,从而使程序能更灵活控制它的生命周期,级别由高到底依次为:强 > 软 > 弱 > 虚引用;而GC垃圾回收器(Garbage Collection)对不同的类型有着不同的处理方法,了解这些处理方式有助于我们写出更高质量的代码。今天我们就来学习

一、引用详解

1、强引用 StrongReference

强引用是使用最普遍的引用。如果一个对象具有强引用,那垃圾回收器绝不会回收它。当内存空间不足,Java 虚拟机宁愿抛出 OutOfMemoryError 错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足的问题。如代码 String s=”abc” 中变量 s 就是字符串对象”abc” 的一个强引用。只要你给强引用对象 s 赋空值 null, 该对象就可以被垃圾回收器回收;因为该对象此时不再含有其他强引用;


//str表示强引用,指向new String()这个对象 
String str = new String(); 

2、弱引用

弱引用(WeakReference)是弱于软引用的引用类型,与软引用类似,不同的是弱引用不能阻止垃圾回收,在垃圾回收机制运行时,如果一个对象的引用是弱引用的话,不管内存空间是否足够,对象都会被回收。弱引用常常被用于防止内存泄漏,最常见的是单例和Handler造成的内存泄漏;


//弱引用实例 
WeakReference weakReference = new WeakReference<>(context); 
//获取弱引用保存的引用 
Context ctx = weakReference.get(); 

3、软引用

SoftReference:软引用–>当虚拟机内存不足时,将会回收它指向的对象;需要获取对象时,可以调用get方法;

软引用对象不会很快被JVM回收,jvm 会根据当前堆的使用情况来判断何时回收,当堆的使用频率接近阀值时才会被回收;

基本用法:


MySoftReference msf = new MySoftReference(); 
  SoftReference sf = new SoftReference(msf); 
  MySoftReference mySoftReference =(MySoftReference) sf.get(); 


基本特点:

  • 如果内存足够,软引用是不会被jvm回收的;
  • 如果内存不够,会根据堆栈的使用情况来回收引用;
  • 未被回收的软引用是一直可被程序占有的;
  • 软引用可以和引用队列(ReferenceQueue)联合使用来实现内存紧张的高速缓存;
  • 如果软引用引用的对象被回收,Java虚拟机会把改软引用对象加到与之关联的引用队列中;

ReferenceQueue rq = new ReferenceQueue(); 
             SoftReference sf = new SoftReference(msf,rf); 


当软引用对象被回收后,ReferenceQueue队列中存储着强引用的Reference,然后可通过poll()来判断当前引用队列是否有失去软引用的对象,如果队列为空,将返回一个null,否则该方法返回队列中前面的一个Reference对象。可以检测出哪个软引用对象被回收,然后将其清除;


Reference reference =null; 
           while((reference==(EmployeeRef)rq.poll())){ 
                   //清除操作 
                   reference =null; 
                    System.gc(); 
               } 


4、虚引用

虚引用(PhantomReference)是最弱的引用,一个持有虚引用的对象和没有引用几乎是一样的,随时都可能被垃圾回收器回收。通过虚引用的get()方法获取到的引用都会失败(为null),虚引用必须和引用队列ReferenceQueue一起使用;

ReferenceQueue引用队列作用在于跟踪垃圾回收过程。当垃圾回收器回收对象时,如果发现它还有虚引用,就会在回收后销毁这个对象,并且将虚引用指向的对象加入到引用队列。只能通过虚引用是否被加入到ReferenceQueue来判断虚引用是否为GC回收,这也是判断对象是否为回收的唯一途径;

Java的Object类中有finalize()方法,原理:一旦垃圾回收器准备释放对象占用的内存空间,将首先调用finalize()方法,并且在下一次垃圾回收动作发生时,才会真正回收对象占用的内存,但是问题在于,虚拟机不能保证finalize()何时被调用,因为GC运行时间不是固定的;

使用虚引用就能解决这个问题,虚引用主要用于跟踪垃圾被回收的活动,主要用来实现比较精细的内存使用控制,这对Android来说很有意义;


//引用队列 
ReferenceQueue queue = new ReferenceQueue<>(); 
//虚引用 
PhantomReference phantomReference = new PhantomReference(new Object(), queue); 
Log.e(TAG, "虚引用:PhantomReference == " + phantomReference.get()); 
//系统垃圾回收 
System.gc(); 
System.runFinalization(); 


phantomReference.get()获取的引用一直为null,调用系统回收垃圾,queue.poll()获取保存的引用对象,并且把它在这个队列中移除;

虚引用无法通过get()方法获取目标的引用,一直都是返回null,源码


public T get() { 
    return null; 
} 

总结:

  • 强引用(StrongReference):不会自动回收,最难被GC回收的,宁可抛出异常也不回收强引用指向的对象;任何场景;
  • 软引用(SoftReference):内存不足时,GC会回收软引用指向的对象比较少使用,已被LruCache替代;
  • 弱引用(WeakReference):不管内存足不足,只要GC了都能回收弱引用指向的对象;常用于避免内存泄漏;
  • 虚引用(PhantomReference):随时都能回收,也称幽灵引用,相当于没有指向任何实例引用;跟踪对象是否被回收,很少使用;

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

--结束END--

本文标题: Android中深入学习对象的四种引用类型

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

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

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Android中深入学习对象的四种引用类型
    目录一、引用详解1、强引用 StrongReference2、弱引用3、软引用4、虚引用前言: Java中,一切被视为对象,引用则是用来操纵对象的;在JDK1.2就把对象引用分为四...
    99+
    2024-04-02
  • 简述Java中的四种引用类型
    目录简介 强引用 软引用 弱引用 虚引用 简介 从JDK1.2版本开始,把对象的引用分为四种级别,从而使程序能更加灵活的控制对象的生命周期。这四种级别由高到低依次为:强引用、软引用...
    99+
    2024-04-02
  • 深入学习Go语言中NumPy对象的使用方法
    Go语言作为一种高效、简洁、易于学习的编程语言,在近年来越来越受到程序员们的欢迎。在数据科学领域,NumPy是一个非常常用的Python库,它提供了一个高效的多维数组对象,以及用于处理这些数组的函数。虽然Go语言没有内置的NumPy库,但...
    99+
    2023-08-28
    numpy 对象 教程
  • 深入学习Python+Opencv常用四种图像处理操作
    目录改变色彩空间: cv.cvtColor()改变图像大小:cv.resize()二维卷积操作常用模糊opencv图像处理(深度学习中常用的) 改变色彩空间: cv.cvtColor...
    99+
    2024-04-02
  • 四种引用类型在JAVASpringboot中的使用详解
    目录概念介绍01.  强引用02.  软引用03.  弱引用04.  虚引用对象可达性Springboot源码中的使用总结概念介绍 不同的引用类型,主要体现的是对象不同的可达性(r...
    99+
    2024-04-02
  • PHP 类与对象:深入浅出,从零开始学习面向对象编程
    面向对象编程是一种基于对象的概念进行设计的编程思想,它将程序中的数据和操作数据的方法封装成一个独立的整体,称为对象。每个对象都有自己的数据和方法,这些数据和方法被封装起来,隐藏在对象的内部,对外界不可见。对象之间通过消息传递来进行通信,一...
    99+
    2024-02-25
    PHP 类与对象:PHP 对象 面向对象编程
  • 深入浅析Java中的对象与引用
    今天就跟大家聊聊有关深入浅析Java中的对象与引用,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。Java中的对象和引用详解 在Java中,有一组名词经常一起出现,它们就是“对象和对象...
    99+
    2023-05-31
    java 对象 引用
  • Java的引用类型常用的四种方法
    目录前言强引用FinalReference软引用SoftReference弱引用weakReference虚引用PhantomReference前言 今天看代码看到有牵扯到弱引用的东...
    99+
    2024-04-02
  • C++中对象&类的深入理解
    什么是对象 任何事物都是一个对象, 也就是传说中的万物皆为对象. 对象的组成: 数据: 描述对象的属性 函数: 描述对象的行为, 根据外界的信息进行相应操作的代码...
    99+
    2024-04-02
  • java对象转化成String类型的四种方法小结
    目录方法1:采用 Object#toString()方法 方法2:采用类型转换(String)object方法 方法3:采用 String.valueOf(Object) 方法 方法...
    99+
    2024-04-02
  • 深入了解Go语言中的引用类型
    引用类型在Go语言中是一种特殊的数据类型,它们的值并非直接存储数据本身,而是存储数据的地址。在Go语言中,引用类型包括slices、maps、channels和指针。深入了解引用类型对...
    99+
    2024-02-22
    数据结构 内存管理 指针 go语言 键值对
  • C++深入刨析类与对象的使用
    目录this指针this指针存放在哪nullptr与类类的默认成员函数构造函数意义析构函数拷贝构造运算符重载this指针 现在给出一段代码,实现一个普通的日期 date 的打印: c...
    99+
    2024-04-02
  • C++深入探究类与对象之对象模型与this指针使用方法
    目录C++对象模型和this指针1 成员变量和成员函数分开存储2 this指针概念3 空指针访问成员函数4 const修饰成员函数C++面向对象的三大特性为:封装、继承、多态 C++...
    99+
    2024-04-02
  • ONNX格式适用于哪些类型的深度学习模型
    ONNX格式适用于各种类型的深度学习模型,包括但不限于卷积神经网络(CNN)、循环神经网络(RNN)、长短时记忆网络(LSTM)、生...
    99+
    2024-04-02
  • JS中时间对象与引用类型的示例分析
    这篇文章将为大家详细讲解有关JS中时间对象与引用类型的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。基础类型有哪些?复杂类型有哪些?有什么特征?基础类型:Stri...
    99+
    2024-04-02
  • JS的时间对象与引用类型是什么
    这篇文章主要讲解了“JS的时间对象与引用类型是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS的时间对象与引用类型是什么”吧!   基础类型:Str...
    99+
    2024-04-02
  • 深入探究:ASP 对象和 Linux 的数据类型如何匹配?
    ASP 和 Linux 都是在不同领域中使用的技术。ASP 是一种 Web 开发框架,而 Linux 是一种操作系统。虽然它们在不同的领域中使用,但是在某些情况下需要相互通信。在这种情况下,需要了解 ASP 对象和 Linux 的数据类型如...
    99+
    2023-08-26
    对象 linux 数据类型
  • JavaScript中各种二进制对象关系的深入讲解
    目录前言各种对象的关系ArrayBufferTypedArrayUint8ClampedArray字符的相互转换DataViewBlobURL数据读取FileFileListFile...
    99+
    2024-04-02
  • 如何理解JVM中Java对象的大小与引用类型
    本篇文章为大家展示了如何理解JVM中Java对象的大小与引用类型,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。小编总结了JVM概念中的Java对象的大小,以及三种引用类型的定义与区分。基本数据的类型...
    99+
    2023-06-17
  • 剖析 Python 变量与数据类型:深入浅出的学习之旅
    变量是计算机程序中存储数据的容器,其类型决定了存储数据的格式和操作。在 Python 中,变量和数据类型密不可分,深入理解两者对于有效利用语言至关重要。 Python 变量 标识符:变量名称,由字母、数字或下划线组成,不能以数字开头。 ...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作