首页 > 编程语言 >Java中的各种引用类型以及部分引用的相关例子

Java中的各种引用类型以及部分引用的相关例子

时间:2024-04-13 16:45:09浏览次数:22  
标签:Java Reference 对象 回收 例子 引用 new

在Java中,引用类型主要有四种,分别是:强引用(Strong Reference)、软引用(Soft Reference)、弱引用(Weak Reference)和虚引用(Phantom Reference)。这些类型通常与垃圾回收机制有关,用来描述对象的生命周期和可达性。下面详细介绍每一种引用类型:

  1. 强引用(Strong Reference)
    强引用是最常见的引用类型,当在代码中创建一个对象并赋值给一个引用变量时,这个引用就是强引用。例如:

    String str = new String("Java");
    

    只要强引用还存在,垃圾回收器永远不会回收被引用的对象。强引用可能导致内存泄漏,因为即使对象已经不再需要了,只要强引用还在,对象就不会被回收。

  2. 软引用(Soft Reference)
    软引用是为了解决内存敏感的缓存问题而设计的。通过java.lang.ref.SoftReference类可以创建软引用。垃圾回收器在系统内存不足时会回收这些对象。软引用通常用于实现内存敏感的高速缓存,例如,图片缓存。软引用可以让缓存的对象在内存充足时被保留,而在内存不足时被回收。

    SoftReference<String> softReference = new SoftReference<>(new String("Java"));
    
  3. 弱引用(Weak Reference)
    弱引用通过java.lang.ref.WeakReference类实现。弱引用不阻止它的对象被垃圾回收器回收。垃圾回收器一旦发现只有弱引用指向的对象,不管当前内存空间足够与否,都会回收它。弱引用比软引用更弱,它主要用于实现没有阻止垃圾收集的引用链,例如,常见于元数据、查找大型结构的关键等。

    WeakReference<String> weakReference = new WeakReference<>(new String("Java"));
    
  4. 虚引用(Phantom Reference)
    虚引用是最弱的一种引用类型,通过java.lang.ref.PhantomReference类实现。一个具有虚引用的对象,跟没有引用一样,在任何时候都可能被垃圾回收器回收。设置虚引用的唯一目的是在这个对象被回收时收到一个系统通知。虚引用必须和引用队列(ReferenceQueue)联合使用。虚引用主要用于跟踪对象被垃圾回收的活动,例如,确保对象完全销毁后进行某些特定资源的清理。

    PhantomReference<String> phantomReference = new PhantomReference<>(new String("Java"), new ReferenceQueue<>());
    

强引用、软引用、弱引用和虚引用每种类型都有各自特定的使用场景和目的,开发者可以根据不同的需求选用不同的引用类型来管理内存使用和优化应用性能。在处理大对象或缓存时,合理运用不同的引用类型可以有效预防内存泄露和过早回收。

标签:Java,Reference,对象,回收,例子,引用,new
From: https://www.cnblogs.com/megumi-miyabi/p/18133042

相关文章

  • React状态与引用(Refs)- 差异和使用场景
    在本文中,我们将深入比较React的state和refs,探讨它们在特定场景下的适用性。当需要在React应用程序中存储数据时,首先要考虑的问题是:“数据是否在组件的生命周期内的某个时刻发生变化?”如果不会,那么普通的const变量非常适合。然而,如果数据会发生变化,那么就需要使用useState和useR......
  • 记录协助Javaer硬件快速开发过程之Web技术栈对接施耐德网络IO网关
    前一段时间有个Java技术栈的朋友联系到我,需要快速对接现有的无人值守称重系统,这里的对接是指替代现有系统,而非软件层面的对接,也就是利用现有的硬件开发一套替代现有软件的自动化系统。主要设备包括地磅秤、道闸、红外对射传感器、摄像头、小票打印、LED显示屏等等,全程使用LED显示......
  • java的两个bean之间复制属性,所有属性中替换某几个字符
    以下是实现代码:importjava.beans.PropertyDescriptor;importjava.lang.reflect.InvocationTargetException;importjava.util.ArrayList;importjava.util.List;importorg.springframework.beans.BeanUtils;publicclassBeanCopyUtil{/***复制bean属性......
  • 在Windows安装javaSE8
    1.下载安装官网Java1.8_31.zip2.配置环境变量创建.bat文件,写入以下内容后执行。自动配置环境变量@echooff%1mshtavbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c%~s0::","","runas",1)(window.close)&&exit......
  • C++ 解引用与函数基础:内存地址、调用方法及声明
    C++解引用获取内存地址和值在上一页的示例中,我们使用了指针变量来获取变量的内存地址(与引用运算符&一起使用)。但是,你也可以使用指针来获取变量的值,这可以通过使用*运算符(解引用运算符)来实现:stringfood="Pizza";//变量声明string*ptr=&food;//指针声明//引用......
  • JAVA 板子
    代码片段1importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;importjava.io.PrintWriter;importjava.io.StreamTokenizer;publicclassMain{stati......
  • java代码审计-sqli
    Java代码审计-sqli0x01漏洞挖掘jdbc在上古时期,人们往往这么从数据库获取数据。publicUsergetUserById(Stringid)throwsSQLException{Connectionconnection=JDBCTOOLS.getConnection(); Stringsql="selectid,usernamefromuserwhereid="+id; State......
  • java代码审计-反序列化
    Java代码审计-反序列化0x00漏洞挖掘业务代码简单来说,找readObject/readUnshared就好了protectedvoiddoPost(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{StringbaseStr=request.getParameter("str");b......
  • Java基础知识篇02——封装
    大家好,我是白夜,今天给大家聊聊面向对象的三大特征——封装一、包(package)1.1、包的引入先来看看我们之前写的代码结构以上代码存在的问题所有类写在一个目录下面,非常难管理,因为以后项目不可能只有这么几个类,当类数量很大的时候,就不容易管理了。不能写同名但是不同需求的类......
  • Java如何自行实现正向地理编码算法(不依赖api,不联网)
    政务场景中经常会遇到地址落图,或者三维挂接的场景。如何将文本地址转化为gps坐标是实现要解决的核心问题。addresstool为正向地理编码提供了非常简单、高效的算法。如何实现正向地理编码,只需要3步就行:第一步:带有坐标的标准地址加载到addresstool中。第二部:以业务地址作为参数,使......