Java和C++中的引用概念

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

Java中的引用
在Java中,所有的对象都是通过引用来访问的。这些引用类似于C++中的指针。当你创建一个对象时,Java会在堆内存中为该对象分配空间,并返回一个指向该对象的引用。你可以使用这个引用来访问和操作对象。
例如:
java
Person person = new Person("John");

在这个例子中,new Person("John")在堆内存中创建了一个新的Person对象,并返回了一个指向该对象的引用。这个引用被存储在person变量中,你可以使用person来访问和操作Person对象。
然而,Java中的引用与C++中的引用有一个重要的区别:在Java中,引用是可以重新指向其他对象的,而在C++中,引用一旦被初始化就不能改变,它将永远引用同一个对象。
此外,Java中的引用有四种类型:强引用、软引用、弱引用和虚引用,它们在垃圾回收方面有不同的行为。强引用是最常见的引用类型,如果一个对象有强引用,那么垃圾收集器就不会回收它。软引用、弱引用和虚引用允许你在内存紧张时回收对象,它们主要用于实现缓存和其他内存敏感的数据结构。
C++中的引用
在C++中,引用是一个已存在对象的别名。一旦引用被初始化为一个对象,它就不能被重新指向其他对象。换句话说,引用必须在创建时被初始化,并且一旦被初始化,就不能改变。
例如:
cpp
int x = 10;
int& ref = x;  // ref是x的引用,ref和x指向同一块内存

在这个例子中,ref是x的引用,ref和x指向同一块内存。你可以通过ref来访问和修改x的值。
C++中的引用主要用于函数参数传递和函数返回值。通过使用引用,你可以在函数中修改传递的参数的值,或者返回一个函数内部创建的对象。

强引用:这是使用最普遍的引用。如果一个对象具有强引用,那么垃圾回收器绝不会回收它。当内存空间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。
java
Person person = new Person("John"); // person就是一个强引用

软引用:如果一个对象只具有软引用,那么在系统将要发生内存溢出异常之前,将会把这些对象列进回收范围进行第二次回收。如果这次回收还没有足够的内存,才会抛出内存溢出异常。在Java中,我们可以通过java.lang.ref.SoftReference类来实现软引用。
java
Person person = new Person("John");
SoftReference<Person> softReference = new SoftReference<>(person);

弱引用:如果一个对象只具有弱引用,那么在垃圾回收器线程扫描它所管辖的内存区域的过程中,只要发现弱引用关联的对象,不管当前内存空间足够与否,都会回收它的内存。在Java中,我们可以通过java.lang.ref.WeakReference类来实现弱引用。
java
Person person = new Person("John");
WeakReference<Person> weakReference = new WeakReference<>(person);

虚引用:也称为幽灵引用或者幻影引用,它是最弱的一种引用关系。一个对象是否有虚引用的存在,完全不会对其生存时间构成影响,也无法通过虚引用来取得一个对象实例。为一个对象设置虚引用关联的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。在Java中,我们可以通过java.lang.ref.PhantomReference类来实现虚引用。
java

Person person = new Person("John");
PhantomReference<Person> phantomReference = new PhantomReference<>(person, new ReferenceQueue<>());

 

垃圾回收和引用类型
Java的垃圾回收器主要负责回收堆内存中的对象。当一个对象没有任何引用指向它时,垃圾回收器就可以安全地回收这个对象的内存。然而,对于软引用、弱引用和虚引用指向的对象,垃圾回收器的行为就会有所不同。
软引用:垃圾回收器在内存不足时才会回收软引用指向的对象。这使得软引用非常适合用于实现内存敏感的缓存。如果内存充足,那么缓存中的对象就可以保留,如果内存不足,那么垃圾回收器就会回收这些对象,释放内存。
弱引用:垃圾回收器在扫描内存区域时,只要发现弱引用关联的对象,不管当前内存空间足够与否,都会回收它的内存。这使得弱引用适合用于实现一种特殊的数据结构——弱哈希映射(WeakHashMap),在这个映射中,当键不再被其他地方引用时,键值对就可以被垃圾回收。
虚引用:虚引用的存在不会阻止垃圾回收器回收它指向的对象。虚引用主要用于跟踪对象被垃圾回收的活动,当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到引用队列中。
引用队列
Java提供了一个叫做引用队列(ReferenceQueue)的类,它可以和软引用、弱引用、虚引用一起使用,用于跟踪垃圾回收过程。当垃圾回收器准备回收一个对象,如果发现它还有软引用、弱引用或虚引用,并且这个引用关联了一个引用队列,那么垃圾回收器就会把这个引用加入到引用队列中。应用程序可以通过检查引用队列来了解哪些对象已经被垃圾回收。

强引用的使用场景
强引用是最常见的引用类型,我们在编程时经常使用。只要对象有强引用指向,垃圾回收器就不会回收它。因此,强引用是我们在编程时最常用的引用类型。
软引用的使用场景
软引用通常用于实现内存敏感的缓存。软引用可以让缓存的对象在内存充足时保留,而在内存不足时被回收。Java的SoftReference类就是用来实现软引用的。
例如,你可以使用软引用来实现一个图片缓存。当程序需要加载一张图片时,首先查看图片是否在缓存中。如果在,就直接使用缓存的图片;如果不在,就从磁盘或网络加载图片,并把图片添加到缓存中。由于缓存使用软引用,所以当内存不足时,垃圾回收器可以自动回收缓存中的图片。
弱引用的使用场景
弱引用可以用于实现一种特殊的数据结构——弱哈希映射(WeakHashMap)。在WeakHashMap中,当键不再被其他地方引用时,键值对就可以被垃圾回收。这对于需要自动释放值的场景非常有用。
例如,你可以使用WeakHashMap来实现一个监听器列表。当监听器对象不再被其他地方引用时,它就可以自动从监听器列表中移除。
虚引用的使用场景
虚引用主要用于跟踪对象被垃圾回收的活动。虚引用的存在不会阻止其引用的对象被垃圾回收,它在对象被垃圾回收器回收前会被加入到引用队列中。虚引用常常用于检测对象何时被自动清理。
例如,你可以使用虚引用来检测一个大型图像已经被完全加载,并且已经开始被使用。当图像对象被垃圾回收时,虚引用会被加入到引用队列,你的程序可以检查这个队列,知道何时图像对象已经被垃圾回收。文章来源地址https://www.toymoban.com/news/detail-743482.html

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

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

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

相关文章

  • 【JAVA】数组的概念;数组的使用;引用;内存分区;数组练习题

    🍉内容专栏:【JAVA从0到入门】 🍉本文脉络:数组的概念;数组的使用;引用;内存分区;数组练习题 🍉本文作者:Melon_西西 🍉发布时间 :2023.7.20 目录 1. 数组的基本概念 2数组的创建及初始化 2.1 数组的创建: T [ ] 数组名 = new T[N]; 2.2 数组的初始化 : 动态初始化和静态初

    2024年02月16日
    浏览(52)
  • 【Java高级语法】(十六)方法引用:掌握Java中的方法引用,简化代码的实用指南~

    方法引用是Java编程语言中的一个重要特性,它首次出现在Java 8版本中。这一特性旨在简化函数式编程中使用Lambda表达式的代码,使代码更加清晰、简洁。 方法引用是通过名称引用一个现有的方法来代替Lambda表达式的一种方式 。它允许将方法本身作为一个对象传递或存储,并

    2024年02月16日
    浏览(47)
  • Java中的四种引用:强、软、弱、虚引用

    引用在实际中基本使用的都是强引用,垃圾回收器判断对象是否存在可用的算法: 引用计数器算法,可达性分析算法 , 引用计数器算法 :在对象中添加一个引用计数器,每当对象被引用时,计数器加1,反正计数器减去1,当计数器为0,则不存在引用,垃圾回收的时候就可以回

    2024年02月11日
    浏览(48)
  • Java中的各种引用类型以及部分引用的相关例子

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

    2024年04月13日
    浏览(42)
  • Java 中的值传递和引用传递 ?

    一. 介绍 值传递: 值传递(Pass-by-Value)当我们向方法传递参数时,实际上是将该参数的值进行拷贝,并将拷贝后的值传递给方法内部。在方法内部对参数进行修改不会影响原始变量的值。 引用传递: 引用传递(Pass by reference)是指方法调用时实参(即传入方法的参数)是一

    2024年02月13日
    浏览(34)
  • Java中的方法引用--【基本使用详解】

    🎉博客首页:痛而不言笑而不语的浅伤 📢欢迎关注🥳点赞 👍 收藏 ⭐留言 📝 欢迎讨论! 🔮本文由痛而不言笑而不语的浅伤原创,CSDN首发! 🌋系列专栏:《JavaSE系列详解》 🧿首发时间:2022年5月27日 ❤:热爱Java学习,期待一起交流! 🙏🏻作者水平有限,如果发现错

    2024年02月06日
    浏览(48)
  • 什么是Java中的JVM(Java虚拟机)?

    JVM(Java虚拟机)是Java平台的核心组件之一,是一个用于执行Java字节码的虚拟计算机。Java源代码经过编译器编译,生成字节码文件(.class文件),然后由JVM来解释和执行这些字节码。JVM负责将字节码翻译成特定操作系统和硬件平台的机器码,从而实现跨平台的能力。   JVM具

    2024年02月15日
    浏览(47)
  • Java中的四种引用类型及其使用方式

    Java中有四种引用类型,分别是强引用(Strong Reference)、软引用(Soft Reference)、弱引用(WeakReference)、虚引用(PhantomReference)。 这要从Java管理内存的方式说起。Java为了将程序员从内存管理中解救出来,即不让程序员自己申请堆内存(比如C语言程序员需要通过malloc请求操作系统分配一

    2023年04月09日
    浏览(51)
  • 【C++】C++ 引用详解 ⑧ ( 普通引用与常量引用 | 常量引用概念与语法 )

    之前的 【C++】C++ 引用详解 ① ~ ⑦ 博客中 , 讲解的都是 普通引用 , 也就是 将 普通变量 赋值给 引用 , 过程如下 : 先定义 普通变量 a , 然后定义 已存在变量 a 的引用 b ; 这里的 引用 b 就是 普通引用 ; 普通引用代码示例 : 执行结果 : 与 变量引用 相对的就是 常量引用 ; 通过 普

    2024年02月11日
    浏览(36)
  • Java JVM中的GC机制详解

    垃圾回收(Garbage Collection,简称GC)机制是JVM中最重要的部分之一。在Java程序运行的过程中,运行时数据区域(包括堆和栈等内存区域)一直都需要使用和回收内存空间。由于Java中的内存分配方式是动态的,所以在程序运行期间,其内存空间的占用量会不断变化。 如果Java程

    2024年02月14日
    浏览(42)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包