对象的相等和引用相等的区别

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

首发博客地址[1]

面试题手册[2]

系列文章地址[3]


1. 什么是对象的相等和引用相等?

  • 对象的相等:当两个对象的内容相同或满足某种特定条件时,我们称这两个对象是相等的。在 Java 中,可以通过重写 equals()方法来判断对象的相等性。
  • 引用的相等:当两个对象引用指向内存中的同一个对象时,我们称这两个对象是引用相等的。在 Java 中,使用 ==运算符来比较两个对象的引用是否相等。

2. 为什么需要区分对象的相等和引用相等?

在编程过程中,我们经常需要比较对象的相等性。有时候我们只关心对象的内容是否相等,而不关心它们是否引用同一个对象。例如,在集合类中,我们需要根据对象的内容进行查找、删除等操作,此时就需要判断对象的相等性。另外,对于基本数据类型(如 int、char 等),直接使用==运算符即可判断相等性,但对于对象则需要使用equals()方法来判断相等性。

3. 对象的相等和引用相等的实现原理?

  • 对象的相等:默认情况下,Java 中的对象比较是基于引用相等的,即使用==运算符比较两个对象的引用是否相等。如果要比较对象的内容是否相等,需要重写equals()方法。在重写equals()方法时,通常需要满足以下几个条件:

    • 自反性:对于任何非空引用 x, x.equals(x)应该返回 true。
    • 对称性:对于任何非空引用 x 和 y,如果 x.equals(y)返回 true,则 y.equals(x)也应该返回 true。
    • 传递性:对于任何非空引用 x、y 和 z,如果 x.equals(y)返回 true,并且 y.equals(z)返回 true,则 x.equals(z)也应该返回 true。
    • 一致性:对于任何非空引用 x 和 y,多次调用 x.equals(y)的结果应该保持一致。
    • 非空性:对于任何非空引用 x, x.equals(null)应该返回 false。
  • 引用的相等:使用==运算符比较两个对象的引用是否相等。当两个对象引用指向内存中的同一个对象时,它们是引用相等的。

4. 对象的相等和引用相等的使用示例

public class Person {
    private String name;
    private int age;

    // 构造方法、getter和setter省略

    @Override
    public boolean equals(Object obj) {
        if (this == obj) { // 引用相等
            return true;
        }
        if (obj == null || getClass() != obj.getClass()) { // 类型不同或为null
            return false;
        }
        Person person = (Person) obj;
        return age == person.age && Objects.equals(name, person.name); // 内容相等
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("Alice"20);
        Person p2 = new Person("Bob"30);
        Person p3 = new Person("Alice"20);

        System.out.println(p1.equals(p2)); // false,内容不相等
        System.out.println(p1.equals(p3)); // true,内容相等
        System.out.println(p1 == p3); // false,引用不相等
    }
}

5. 对象的相等和引用相等的优点

  • 对象的相等:通过重写 equals()方法,可以根据对象的内容来判断相等性,而不仅仅是引用是否相等。这样可以更灵活地比较对象的相等性。
  • 引用的相等:使用 ==运算符比较两个对象的引用是否相等,效率高。

6. 对象的相等和引用相等的缺点

  • 对象的相等:需要重写 equals()方法,并满足一定的条件,才能正确判断对象的相等性。如果没有正确实现 equals()方法,可能会导致错误的结果。
  • 引用的相等:只能判断两个对象的引用是否相等,无法判断对象的内容是否相等。

7. 对象的相等和引用相等的使用注意事项

  • 在重写 equals()方法时,需要满足自反性、对称性、传递性、一致性和非空性等条件,以确保正确判断对象的相等性。
  • 在使用 ==运算符比较两个对象的引用时,需要注意是否真正需要比较对象的引用相等,而不是内容相等。

8. 总结

对象的相等和引用相等是编程中常用的概念。对象的相等通过重写equals()方法来实现,可以根据对象的内容来判断相等性;引用的相等通过==运算符来比较两个对象的引用是否相等。在使用时需要注意区分二者,并根据具体需求选择合适的方式进行比较。

参考资料

[1]

首发博客地址: https://blog.zysicyj.top/

[2]

面试题手册: https://store.amazingmemo.com/chapterDetail/1685324709017001

[3]

系列文章地址: https://blog.zysicyj.top/categories/技术文章/后端技术/系列文章/面试题精讲/

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/150295.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

树上游走最优策略问题:Cf1725J

https://codeforces.com/contest/1725/problem/J 首先要转化题目 发现题目本质是什么 不用回去 少走一条路径 传送 少走另一条路径 一开始猜的结论是这样 但这并不完整 传送本质是让我们把某些路径少走一遍 考虑这种情况&#xff0c;交于1点 #include<bits/stdc.…

gitgitHub

在git中复制CtrlInsert、粘贴CtrlShif 一、用户名和邮箱的配置 查看用户名 &#xff1a;git config user.name 查看密码&#xff1a; git config user.password 查看邮箱&#xff1a;git config user.email 查看配置信息&#xff1a; $ git config --list 修改用户名 git co…

Puppeteer基础知识(一)

Puppeteer基础知识&#xff08;一&#xff09; Puppeteer基础知识&#xff08;一&#xff09;一、简介二、其他一些自动化测试工具三、Puppeteer常用命令四、常见问题解决&#xff1a; 一、简介 Puppeteer 是一个强大而灵活的工具&#xff0c;可以用于网页爬虫、自动化测试、性…

不死马的利用与克制(基于条件竞争)及变种不死马

不死马即内存马&#xff0c;它会写进进程里&#xff0c;并且无限地在指定目录中生成木马文件 这里以PHP不死马为例 测试代码&#xff1a; <?phpignore_user_abort(true);set_time_limit(0);unlink(__FILE__);$file .test.php;$code <?php if(md5($_GET["pass…

Vue中如何进行数据可视化雷达图展示

在Vue中进行数据可视化雷达图展示 数据可视化是将数据以图形方式呈现的过程&#xff0c;雷达图是其中一种常用的图表类型&#xff0c;用于可视化多个维度的数据。Vue.js作为一个流行的JavaScript框架&#xff0c;提供了许多工具和库来实现数据可视化。本文将介绍如何使用Vue来…

华为云云耀云服务器L实例评测|SpringCloud相关组件——nacos和sentinel的安装和配置 运行内存情况 服务器被非法登陆尝试的解决

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到各种问题&#xff0c;在解决问题的过程中学到不少和运维相关的知识。 本篇博客介绍SpringCloud相关组件——nacos和sentinel的安装和配置&#xff0c;并分析了运行内存情况&#xff0c;此…

【ARM】(1)架构简介

前言 ARM既可以认为是一个公司的名字&#xff0c;也可以认为是对一类微处理器的通称&#xff0c;还可以认为是一种技术的名字。 ARM公司是专门从事基于RISC技术芯片设计开发的公司&#xff0c;作为知识产权&#xff08;IP&#xff09;供应商&#xff0c;本身不直接从事芯片生产…

Hive 【Hive(七)窗口函数练习】

窗口函数案例 数据准备 1&#xff09;建表语句 create table order_info (order_id string, --订单iduser_id string, -- 用户iduser_name string, -- 用户姓名order_date string, -- 下单日期order_amount int -- 订单金额 ); 2&#xff09;装载语句 i…

C++设计模式-装饰器(Decorator)

目录 C设计模式-装饰器&#xff08;Decorator&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-装饰器&#xff08;Decorator&#xff09; 一、意图 动态地给一个对象添加一些额外的职责。就增加功能来说&#xff0c;Decorator模式相比生成子…

C++设计模式-工厂模式(Factory Method)

目录 C设计模式-工厂模式&#xff08;Factory Method&#xff09; 一、意图 二、适用性 三、结构 四、参与者 五、代码 C设计模式-工厂模式&#xff08;Factory Method&#xff09; 一、意图 定义一个用于创建对象的接口&#xff0c;让子类决定实例化哪一个类。Factory…

R实现数据分布特征的视觉化——多笔数据之间的比较

大家好&#xff0c;我是带我去滑雪&#xff01; 如果要对两笔数据或者多笔数据的分布情况进行比较&#xff0c;Q-Q图、柱状图、星形图都是非常好的选择&#xff0c;下面开始实战。 &#xff08;1&#xff09;绘制Q-Q图 首先导入数据bankwage.csv文件&#xff0c;该数据集…

【深蓝学院】手写VIO第2章--IMU传感器--作业

这次作业坑很多&#xff0c;作业说明的不清楚&#xff0c;摸索了很长时间才将此次作业完成&#xff0c;在这里进行记录。 1. T1 1.1 题干 1.2 解答 1.2.1 法1&#xff0c;ros related方法 不知道为什么我的launch不了&#xff0c;在imu_utils目录下面建立build后&#xff0…

【redis学习笔记】缓存

redis主要的三个应用场景 存储数据缓存消息队列&#xff08;redis本来是设计用来作为消息队列的&#xff09; redis常用作mysql的缓存 因为MySQL等数据库&#xff0c;效率比较低&#xff0c;所以承担的并发量就有限。一旦请求数量多了&#xff0c;数据库的压力就会很大&#…

代码随想录第36天 | 1049. 最后一块石头的重量 II ● 494. 目标和 ● 474.一和零

1049. 最后一块石头的重量 第一想法 /*** param {number[]} stones* return {number}*/ var lastStoneWeightII function (nums) {// 和分割两个和相等的子数组一样//dp[j]表示 背包总容量&#xff08;所能装的总重量&#xff09;是j&#xff0c;放进物品后&#xff0c;背的…

数据科学最佳实践:Kedro 的工程化解决方案 | 开源日报 No.47

leonardomso/33-js-concepts Stars: 58.4k License: MIT 这个项目是一个帮助开发者掌握 JavaScript 概念的资源库。该项目基于 Stephen Curtis 撰写的一篇文章&#xff0c;包含了对 33 个重要 JavaScript 概念全面深入地讲解&#xff0c;并被 GitHub 评为 2018 年最佳开源项目…

前端项目nginx部署

进入nginx下载地址:https://nginx.org/ 下载完安装包以后,解压在D盘中 双击进去> 将前端打包好的文件放在nginx的html文件夹中 可能80端口会被系统所占用 我们可以在nginx的conf文件夹中的nginx.conf文件中修改80为90 之后我们就可以在任务管理器中看到了 然后 localhost:…

JavaEE 网络原理——TCP的工作机制(中篇 三次握手和四次挥手)

文章目录 一、TCP 内部工作机制——连接管理1. 连接(三次握手)(1).有连接和确认应答之间的关系(2). 通过客户端和服务器详细描述三次握手 2. 断开连接(四次挥手)(1)讨论“四次握手”中间步骤的合并问题。(2) 根据简单的 TCP 代码解释断开连接(3) 四次挥手中的两个重要的 TCP 状…

【C语言】什么是宏定义?(#define详解)

&#x1f984;个人主页:修修修也 &#x1f38f;所属专栏:C语言 ⚙️操作环境:Visual Studio 2022 ​ 目录 一.什么是宏定义 二.宏定义的组成 第1部分 第2部分 第3部分 三.宏定义的应用 &#x1f38f;类对象宏 &#x1f38f;类函数宏 1.求两个数中的较大值 2.求一个数的…

测试时间不够,你会如何处理?

工作中经常会遇到测试时间不够充分的情况&#xff0c;当测试时间不足的情况下&#xff0c;如何做到不延误测试进度&#xff0c;又能保证测试质量&#xff1f; 1、根据测试目标和需求&#xff0c;确定测试的优先级&#xff0c;首先测试最重要和核心的功能和场景。 确保关键功能…

一文搞懂时间序列ARIMA模型

文章目录 1 ARIMA的定义2 差分(differencing)2.1 Order&#xff1a;差分的阶数2.2 Lag&#xff1a;差分的滞后2.3 滞后运算/滞后算子/延迟算子2.4 关于差分的两个误解 3 ARIMA的平稳性4 ACF与PACF5 时序模型的选择与评估5.1 超参数p、q、d的确定5.2 时间序列的评估指标 1 ARIMA…