你真的懂Java中的equals和==吗?看完这篇文章你就知道了

news2024/9/20 8:46:52

== 和 equals() 是 Java 中两个用于比较对象是否相等的操作符和方法。它们的区别主要有以下几点:

一、类型

== 是一个运算符,而 equals() 是一个方法。

二、比较对象

Java数据对象类型分为两大类:基本类型和引用类型。== 比较的对象可以是基本类型也可以是引用类型。

而 equals()不能用于判断基本数据类型的变量,比较的是引用类型的对象。可以看到x变量为基本的int类型,是不能使用equals的。
Java 数据类型分为两大类:基本类型和引用类型。

1)基本类型

基本类型是 Java 语言中内置的类型,包括整数类型、浮点类型、字符类型、布尔类型等。基本类型的对象是原始的,不能被修改。

2)引用类型

引用类型是 Java 语言中用户自定义的类型,包括类、接口、数组等。引用类型的对象是可变的,可以被修改。

三、比较内容:

1)==针对基本类型时比较的是对象的值,针对引用类型比较的是对象的指向的内存地址是否相等。

2)equals针对的比较对象是引用类型, 在Java中Object对象是所有对象的父类,所以每个类都会有个equals的方法,如果你没有重写它那些它与==的效果是一样的,可以通过源代码查看。

如果你重写了它,那么就是你自己定义的比较逻辑。比如String类型它就重写了equals方法(也就是判断对象的值是否相等而不是内存地址)。

String中的equals先用==判断是否相等,相等直接返回true->再判断是否为string类型,否直接返回false->是则继续判断对象length->循环判断char是否相等(jdk8使用的是char,高版本的jdk已使用效率更高的byte

以下是一些例子:

int x = 10;
int y = 10;

// 比较基本类型
System.out.println(x == y); // true
System.out.println(x.equals(y)); //代码会报错,不能使用equals

// 比较引用类型
String str1 = new String("Hello");
String str2 = new String("Hello");

// 默认情况下,equals() 比较引用
System.out.println(str1 == str2); // false
System.out.println(str1.equals(str2)); // true

// 重写 equals() 方法
class MyObject {
    private int id;

    public MyObject(int id) {
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj instanceof MyObject) {
            MyObject other = (MyObject) obj;
            return this.id == other.id;
        }
        return false;
    }
}

MyObject object1 = new MyObject(1);
MyObject object2 = new MyObject(1);

// 重写 equals() 方法后,equals() 比较内容
System.out.println(object1 == object2); // false
System.out.println(object1.equals(object2)); // true

在实际开发中,应该根据实际需求来选择 == 还是 equals() 来比较对象是否相等。如果需要比较对象的引用,则可以使用 ==。如果需要比较对象的内容,则可以使用 equals()。

四、相关面试题

问题1:equals 和 == 之间的主要区别是什么?

答案:

  • == 是一个运算符,用于比较两个对象的引用是否相同,即它们是否指向内存中的相同位置。
  • equals 是一个方法,通常在Object类中定义,它用于比较两个对象的内容是否相等。默认情况下,equals方法执行与==相同的引用比较,但它可以被子类重写以提供自定义的相等性逻辑。

问题2: 如何自定义一个类的equals方法?

答案: 要自定义一个类的equals方法,可以按照以下步骤进行:

  1. 在类中创建一个equals方法的覆盖(override)。
  2. 确保方法签名为public boolean equals(Object obj),并且参数类型是Object。
  3. 在equals方法中,首先使用==运算符比较对象的引用,如果引用相同,返回true。
  4. 如果引用不同,检查传递给方法的对象是否属于相同的类。
  5. 如果属于相同的类,将传递的对象强制转换为相同类型,然后比较对象的字段,以确定它们是否相等。
  6. 最后,返回比较结果,通常是true或false。

问题3:equals 和 hashCode 之间有什么关系?

答案:

  • equals 和 hashCode 在Java中通常一起使用,以维护对象在散列集合(如HashMap和HashSet)中的正确行为。
  • 如果两个对象相等(根据equals方法的定义),那么它们的hashCode值应该相同。
  • 也就是说,如果重写了一个类的equals方法,通常也需要重写hashCode方法,以便它们保持一致。
  • 这是因为散列集合使用对象的hashCode值来确定它们在内部存储结构中的位置。

问题4:== 在哪些情况下比较的是对象内容而不是引用?

答案:

  • 在Java中,== 运算符通常比较的是对象的引用。但在以下情况下,== 可以比较对象的内容而不是引用:
    1. 对于基本数据类型(如int、char等),== 比较的是它们的值,而不是引用。
    2. 字符串常量池:对于字符串字面值,Java使用常量池来存储它们,因此相同的字符串字面值使用==比较通常会返回true。

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

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

相关文章

Navicat Premium 16 安装教程

一、下载地址 网址:https://pan.baidu.com/s/1jGISrlLGjAUYSIfLbm8IBw?pwd0i90 提取码:0i90 二、安装步骤 1.双击运行安装包 2.下一步 3.选择我同意,下一步 4.自定义安装路径,下一步 5.创建快捷方式,下一步 6.安装…

嵌入式学习笔记(61)位操作寄存器时的特殊作用

2.2.1寄存器操作的要求(特定位改变而不影响其他位) (1)ARM是内存与IO统一编址的,ARM中有很多内部外设,SoC中CPU通过向这些内部外设的寄存器写入一些特定的值来操控这个内部外设,进而操控硬件动作。所以可以说&#xf…

服务器中了mkp勒索病毒怎么解决,勒索病毒解密,数据恢复

自从九月份以来,云天数据恢复中心陆续接到很多企业的求助,企业的服务器数据库遭到了mkp勒索病毒的攻击,导致企业的所有业务工作中断无法开展,严重影响了企业的正常运行。经过云天数据恢复中心对其该病毒的详细了解与解密&#xff…

论坛议程 | COSCon'23 开源操作系统(O)

众多开源爱好者翘首期盼的开源盛会:第八届中国开源年会(COSCon23)将于 10月28-29日在四川成都市高新区菁蓉汇举办。本次大会的主题是:“开源:川流不息、山海相映”!各位新老朋友们,欢迎到成都&a…

项目管理中的变数:从不同角度洞悉团队管理的重要性

在项目管理中,人是最重要的变数。每个成员的能力、特长、处事方式和思考方法,以及价值观和沟通方式都各不相同。因此,团队管理是项目管理过程中至关重要的环节。尽管成功的团队管理并不一定能保证项目的成功,但失败的团队管理却必…

台灯显色指数多少好?推荐显色指数优秀的护眼台灯

台灯的显色指数是其非常重要的指标,它可以表示灯光照射到物体身上,物体颜色的真实程度,一般用平均显色指数Ra来表示,Ra值越高,灯光显色能力越强。常见的台灯显色指数最低要求一般是在Ra80以上即可,比较好的…

第十五章 I/O(输入/输出)流

15.1 输入/输出流 流是一组有序的数据序列,可分为输入流和输出流两种。 程序从指向源的输入流中读取源中数据,源可以是文件、网络、压缩包或者其他数据源 输出流的指向是数据要到达的目的地,输出流的目标可以是文件、网络、压缩包、控制台和…

宁波市:做大做强跨境电商 赋能外贸创新发展

近日,全国政协第十四届常委会第二次会议专题研究“构建新发展格局,推进中国式现代化”议题,市政协主席徐宇宁参加“推动高水平对外开放”专题小组讨论,全国政协副主席蒋作君到会听取发言,国家发改委、商务部相关司局负…

AI的Prompt是什么

一.AI的Prompt的作用 在人工智能(AI)中,"Prompt"通常指的是向AI系统提供的输入或指令,用于引导AI进行特定的操作或生成特定的输出。例如,在一个对话型AI系统中,用户输入的问题就是一个prompt&…

设计模式:观察者模式(C#、JAVA、JavaScript、C++、Python、Go、PHP)

简介: 观察者模式,它是一种行为型设计模式,它允许一个对象自动通知其依赖者(观察者)状态的变化。当被观察者的状态发生改变时,它会通知所有的观察者对象,使他们能够及时做出响应。在观察者模式…

c++ json 库的调用报错 “value, object or array expected“

表示输入的json 文件,写的格式有点不正确例如 双引号 逗号 字符串 列表等 aa.json 出现了一些问题,不是代码问题

Kubernetes概述及其组件/核心组件

Kubernetes 概述: 1、K8S 是什么? K8S 的全称为 Kubernetes (K12345678S),PS:“嘛,写全称也太累了吧,不如整个缩写”。 作用: 用于自动部署、扩展和管理“容器化(containerized&…

文章发表丨求臻医学发布病理AI模型,实现肿瘤精准分型

近日,求臻医学科研团队研发一款基于数字病理图像的肿瘤分型深度学习模型—TMG(The Transformer-based Multiple instance learning with Global average pooling)。该模型可有效消除对病理图像细粒度标记的依赖,实现高准确率的分型,将用于原发…

武汉凯迪正大—线圈匝间耐压测试仪

产品概述 KDYD2830绕组匝间冲击耐压试验仪适用于试验电压30kV及以下高压电机、中小型电机、直流电机的绕组匝间绝缘检测;也可用于变压器绕组、电器线圈绕组的匝间绝缘检测。因电机、变压器绕组由于绝缘结构和绝缘材料的不一致,特别是操作者工艺水平的不…

全志R128适配 ST7789v LCD

适配 ST7789v LCD R128 平台提供了 SPI DBI 的 SPI TFT 接口,具有如下特点: Supports DBI Type C 3 Line/4 Line Interface ModeSupports 2 Data Lane Interface ModeSupports data source from CPU or DMASupports RGB111/444/565/666/888 video form…

华为bug汇报:华为NPU竟成“遥遥领先”?

华为bug汇报:华为NPU竟成“遥遥领先”? 本文为我汇报在Ascend / pytorch 社区的一个bug,其中对NPU的实际算力进行了测试,并发现了华为NPU实际显存与销售宣传时存在着较大差差距的问题(算力问题见问题一、显存问题见问…

数据分析和机器学习的11个高级可视化图表介绍

可视化是一种强大的工具,用于以直观和可理解的方式传达复杂的数据模式和关系。它们在数据分析中发挥着至关重要的作用,提供了通常难以从原始数据或传统数字表示中辨别出来的见解。 可视化对于理解复杂的数据模式和关系至关重要,我们将介绍11…

【软考】12.3 质量管理/风险管理

《质量管理》 影响质量:范围、进度、成本质量规划 ——> 质量保证(阶段性评审) ——> 质量控制(实时监控) 质量特性 功能性、可靠性、可用性、效率、可维护性、可移植性 McCall质量模型 产品修正、产品转移、…

CPU和GPU有什么区别?

CPU:叫做中央处理器(central processing unit)作为计算机系统的运算和控制核心,是信息处理、程序运行的最终执行单元。 GPU:叫做图形处理器。图形处理器(英语:Graphics Processing Unit&#x…

快来get策略模式,告别编程困惑,轻松变身编程高手✨

🎬 江城开朗的豌豆:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 📝 个人网站 :《 江城开朗的豌豆🫛 》 ⛺️ 生活的理想,就是为了理想的生活 ! ​ 目录 ⭐ 专栏简介 📘 文章引言 一…