java基础 之 equals和==的区别
文章目录
- 浅谈“==”
- 特点
- 比较基本类型
- 比较引用类型
- 浅谈“equals”
- 背景和使用
- 重写equals
- 自定义类为什么需要重写equals方法
- 总结
- 附录代码及文章推荐
前言:
1、8大基本数据类型,它们的值直接代表了某种数据,不是对象的实例,不能使用new来为基本数据类型创建对象
2、引用地址相同,值一定相同;值相同,引用地址不一定相同。即相同内容的对象地址不一定相同,但是相同地址的对象内容一定相同
本文主要以Person类为例,完整的类代码放在了文章末尾【附录代码】处了
浅谈“==”
特点
- == 为运算符,比较的是两个对象的引用,如果一致,返回为true
- == 可以比较基本类型(基本类型指向的是其值本身),比较的是值,但是需要注意float和double的比较
比较基本类型
- int、short、long、double、float的比较
// 比较的如果是基本类型,指向的都是地址为300的堆 // 在Java中,300和300.0是等价的。这是因为Java支持自动类型转换,包括从整数类型到浮点类型的转换。 // 当整数300被赋值给一个浮点类型的变量时,Java会自动将其转换为浮点数300.0。 int a = 300; short b = 300; long c = 300L; double d = 300.00d; // System.out.println(aa):300.0 float f = 300.0f; // System.out.println(bb):300.0 System.out.println(a==b); // true System.out.println(a==c); // true System.out.println(b==c); // true System.out.println(d==f); // true System.out.println(a==d); // double与long类型比较:true// 对于double和float类型来说,小数点后有数值,其实他们的精度是不同的,所以虽然数值显示一样,但其实是不一样的 double aaa = 300.01d; // System.out.println(aaa):300.01 double bbb = 300.01f; // System.out.println(bbb):300.010009765625 System.out.println(aaa==bbb); // false
- 如果是基本类型的包装类使用,要注意戳这里 → java的128陷阱
比较引用类型
- 比较的是两个对象的地址。即使是值相等,但是引用地址不同,同样返回false
// Person类内容可以看文章最后的【附录代码】部分
Person person1 =new Person("abc",12,"181");
Person person2 = new Person("abc",12,"181");
Person person3 = person1;
System.out.println(person1==person2); // false
System.out.println(person1==person3); // true
1、person1 和person2都是在堆中新建的对象,即使内容一样,但是他们地址不同;
2、person3的引用跟person1的引用是同一个,所以地址相同,内容自然也想通
3、如果我们想要让person1和person2相等,那么这时候需要的是equals了~~
浅谈“equals”
背景和使用
- 在Java中,equals方法是Object类的一个方法,用于比较两个对象是否相等。源码如下
- 由上边可以看到Object类使用的equals功能同**==**。在java中,想正确使用equals方法,需要对该方法覆盖重写。
- 所以我们想要实现person1和person2一样需要重写Person类中的equals方法
重写equals
-
重写equals的注意事项
1、自反性原则。对于任何非空引用A,A.equals(A)应该返回true。
2、对称性原则:如果A.equals(B)返回true,那么B.equals(A)也应该返回true。即equals方法的比较应该是双向的
3、传递性原则:如果A.equals(B)和B.equals©返回true,那么A.equals©也应该返回true。
4、一致性原则:对于任何非空引用A,只要对象的不变属性没有改变,多次调用A.equals(B)应该始终返回相同的值。
5、非空性原则:对于任何非null的引用值A,A.equals(null)应该返回false
6、HashCode的重写:建议重写equals方法的类同时也重写Object类的GetHashCode方法。这是因为如果两个对象根据equals方法是相等的,那么它们的哈希码(HashCode)也应该相同。 -
java中已经重写equals的类
String类、Integer类
-
自定义类重写equals
- 未重写equals前(以Person类为例)
public static void main(String[] args) {Person person1 =new Person("abc",12,"181");Person person2 = new Person("abc",12,"181");Person person3 = person1;System.out.println(person1.equals(person2)); // falseSystem.out.println(person1.equals(person3)); // true }
- 对Person类重写equals()方法
// 以Person类为例,完整的Person类代码可参看文章最后的【附录代码】 @Overridepublic boolean equals(Object o) {if (this == o) return true;if (!(o instanceof Person)) return false;Person person = (Person) o;return Objects.equals(getName(), person.getName()) && Objects.equals(getAge(), person.getAge()) && Objects.equals(getPhone(), person.getPhone());}
- 重写equals后
public static void main(String[] args) {Person person1 =new Person("abc",12,"181");Person person2 = new Person("abc",12,"181");Person person3 = person1;System.out.println(person1.equals(person2)); // trueSystem.out.println(person1.equals(person3)); // true }
- 未重写equals前(以Person类为例)
自定义类为什么需要重写equals方法
通过上边Person类的演示,我们可以看到重写equals()方法前后的区别。
一般我们比较对象的时候,不会去比较引用地址,都是直观的来比较对象的值。
总结
- == 为运算符;equals为引用类型的比较方法,继承自Object类,未重写前功能同 ==;
- == 可以比较基本类型和引用类型,equals只能比较引用类型
- 比较值相等时,建议使用equals,但是需要注意自定义类需要重写equals方法
- == 比 equals 运行速度快,因为 == 比较的是引用地址而不是值。
附录代码及文章推荐
- Person类
import java.util.Comparator; import java.util.Objects;public class Person{String name; // 姓名Integer age; // 年龄String phone; // 性别// get()和set()方法public String getName() {return name;}public void setName(String name) {this.name = name;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}public String getPhone() {return phone;}public void setPhone(String sex) {this.phone = phone;}// 构造方法public Person() {}public Person(String name, Integer age, String phone) {this.name = name;this.age = age;this.phone = phone;}@Override// 重写equals()方法public boolean equals(Object o) {// 引用地址相等,直接返回trueif (this == o) return true;// Object o类型不是Person,直接返回false;if (!(o instanceof Person)) return false;Person person = (Person) o;// 依次判断属性的值是否相等。String为引用类型,使用equals;int为基本类型,使用 == return Objects.equals(getName(), person.getName()) && Objects.equals(getAge(), person.getAge()) && Objects.equals(getPhone(), person.getPhone());}// 重写hashCode()方法@Overridepublic int hashCode() {return Objects.hash(getName(), getAge(), getPhone());}@Override// 重写toString()方法,方便打印public String toString() {return "Person{" +"name='" + name + '\'' +", age=" + age +", phone='" + phone + '\'' +'}';} }
- 文章推荐:
Java中的equals方法详解:比较方法
相关文章:
java基础 之 equals和==的区别
文章目录 浅谈“”特点比较基本类型比较引用类型 浅谈“equals”背景和使用重写equals自定义类为什么需要重写equals方法 总结附录代码及文章推荐 前言: 1、8大基本数据类型,它们的值直接代表了某种数据,不是对象的实例,不能使用n…...
学习STM32(1)--Keil软件安装与基本操作和Keil 软件高级应用
目录 1 引 言 2 实验目的 3 实验内容 3.1 认识单片机和STM32 3.2 安装、认识软件Keil和硬件STM32F103开发板 3.3 学习调试工程 3.4 Keil工程软件的配置 4 深入解析 思考一 1.以项目“12-GPIO输出—使用固件库点亮LED”为例子,认识本地工程文件夹…...
独立开发者系列(37)——理解async和await
1.理解同步与异步 同步就是执行某个任务A-B-C-D,就是严格按照顺序执行,可以理解为正常的代码逻辑,如果运行的代码都不是很消耗时间的情况系啊,同步可以减少编程的复杂度。但是对于请求远程服务结果的这种服务,如果同步…...
在C#中为图片添加数字水印的几种办法
最近在写个人项目时,有遇到需要将图片加上水印防止被盗取的需求。这里找了几种实现方式,可供有需要的朋友参考。 本身我不是搞算法这块的,所以这里只是找了一些实现,也没有继续深究下去。 以前在学校的时候从书上了解过可以将一…...
Vue的学习(二)
目录 一、class及style的绑定 1.v-bind:class绑定类名 绑定class为对象 编辑2. v-bind:class绑定类名 绑定class为对象 3.v-bind:class绑定类名 绑定class为数组 1) v-bind:class绑定类名 绑定class为数组 方法一: 2) v-bind:class绑定类名 绑定class为数组…...
PointNet和PointNet++论文解读
目录 一、导言 二、PointNet介绍 三、PointNet网络结构 1、损失函数 2、正则化 四、PointNet 1、分层次的点集抽象层 一、导言 PointNet来自CVPR2017,是最早直接处理点云数据用于计算机视觉的模型,并运用于分割、检测、场景理解任务,P…...
Pytest测试报告生成专题
在 pytest 中,你可以使用多个选项生成不同格式的测试报告。以下是几种常用的生成测试报告的方法: 1. 生成简单的测试结果文件 你可以使用 pytest 的 --junitxml 选项生成一个 XML 格式的测试报告,这个报告可以与 CI/CD 工具集成。 pytest --junitxml=report.xml这将在当前…...
【在Python中读取Excel文件内容】
在Python中读取Excel文件内容,常用的库有xlrd(主要用于读取.xls文件,但不支持.xlsx的较新版本),以及openpyxl(专门用于读取和写入.xlsx文件)和pandas(提供了一个更高级别的接口来处理…...
尚品汇-首页三级分类实现-nginx静态代理生成的静态页面(二十六)
目录: (1)问题详解 (2)首页商品分类实现 (3)修改web-all模块 (4)页面渲染 (1)问题详解 (2)首页商品分类实现 前面做了…...
HTML 段落
HTML 段落 概述 HTML(超文本标记语言)是构建网页的标准语言,而段落是构成网页内容的基本单元。在HTML中,段落是通过<p>标签来定义的。本文将详细介绍HTML段落的相关知识,包括段落的基本结构、样式设置、以及在…...
Http自定义Header导致的跨域问题
最近写一个小项目,前后端分离,在调试过程中访问远程接口,出现了CORS问题,接口使用的laravel框架,于是添加了解决跨域的中间件,但是前端显示仍存在跨域问题,以为自己写的有问题,检查了…...
20240805 每日AI必读资讯
世界首例!AI机器人做牙科手术,8倍速诊疗比人类医生更精准 - Perceptive:让人工智能控制的自主机器人,首次对人类患者进行了全过程的牙科手术,速度大约是人类牙医的8倍。 - 两项新技术 1、OCT 3D成像系统:…...
COMSOL金属氢化物-放氢过程
在此记录下放氢过程的软件设置思路 1、采用的是"达西定律""层流" 物理场,其中"层流"物理场选择了”弱可压缩流动“,这里主要是选择”可压缩流动“的话,算出来的瞬时流量值跟实测差距太大了。 2、设置"达西…...
Unity2D在处理精灵表过程中出现不清晰的解决方法
问题阐述 在我们拿到一张精灵表的时候,我们通常要进行切割。但这样往往导致切割的效果不是很好,这里举一个简单的例子。 这是举例子用到的精灵表 我们先对他进行切割处理。 将single改为Multiope 进入精灵编辑器后,我们选择切割方式 此时我…...
C语言第13篇
1.下面程序是计算n个数的平均值,请填空.______ #include<stdio.h> void main( ) { int i,n; float x,avg0.0; scanf("%d",&n); for(i0;i<n;i) { scanf("%f",&x); avgavg______; } avg________; printf("avg%f\n",avg); } A) …...
Meta Reality Labs:巨额亏损背后的挑战与展望
一、财务概况 自2020年以来,Meta的Reality Labs部门累计亏损已超过450亿美元,其中2023年的亏损达到160亿美元,2024年第一季度亏损38亿美元,分析师预计第二季度亏损可能接近50亿美元。尽管投入巨大,Reality Labs的收入却呈现下降趋势,与不断增加的支出形成鲜明对比。 二…...
linux安装docker(实操教程)
一、安装前准备工作 1.查看服务器操作系统版本 2.查看服务器的操作系统内核版本 3.安装依赖包 yum install -y yum-utils device-mapper-persistent-data lvm2如果不是root用户登陆的系统,需要手动输入sudo -i切换到root帐户 4.设置阿里云docker-ce镜像源 yum-c…...
隐写工具steghide linux编译安装
1、git clone https://github.com/StefanoDeVuono/steghide.git 2、autoreconf -i 3、./configure 4、make 编译完成后再src目录下又steghide执行下程序 报错:configure: error: cannot find required auxiliary files: compile时需要执行autoreconf 如果往j…...
山寨手机 老手机 山寨平板 提高速度 cpu超频的方法360超级root和setup
第一,挂机 ,按音量键 ,看机器的配置,注意,山寨机器的 安卓版本不可信啊,安卓4.4.2会标注安卓10 第二 ,下载360超级root, http://2012rs.mysxl.cn/ https://xdaforums.com/t/setcpu-for-root-us…...
【两整数之和】python刷题记录
R3-位运算专题。 仲夏之约,留尺一寸,小记一事,算是了结。 无进位和 与 异或运算 规律相同,进位 和 与运算 规律相同(并需左移一位) 牛啊牛啊 class Solution:def getSum(self, a: int, b: int) -> int…...
常见cms漏洞之dedecms
DedeCMS是织梦团队开发PHP 网站管理系统,它以简单、易用、高效为特色,组建出各种各样各具特色的网站,如地方门户、行业门户、政府及企事业站点等。 下载地址请网上自行寻找 搭建方式选择php study 首先搭建环境 #前台http://localhost/dedecm…...
基于微信小程序的微课堂笔记的设计与实现(源码+论文+部署讲解等)
博主介绍:✌全网粉丝10W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和学生毕业项目实战,高校老师/讲师/同行前辈交流✌ 技术栈介绍:我是程序员阿龙ÿ…...
如何构建AI产品:OpenAI与前Shopify产品负责人Miqdad Jaffer的经验分享
一、引言 构建AI产品是一项复杂且充满挑战的任务,尤其是当涉及到面向消费者的解决方案时。在最近的一期播客节目中,OpenAI 和前Shopify产品负责人 Miqdad Jaffer 分享了他在构建AI产品的经验和策略。下面我们将探讨构建AI产品的最佳实践,以及…...
C++的结构体、联合体、枚举类型(一)
1.C++的结构体 2.C++的联合体 3.C++的枚举类型 1.C++的结构体 (1)C++中定义结构体变量,可以省略struct关键字 struct XX{…}; XX x;//定义结构体变量直接省略struct(2)C++结构体中可以直接定义函数,谓之成员函数(又叫方法)(3)在成员函数中可以直接访问该结构体的成员变…...
白骑士的PyCharm教学高级篇 3.5 团队协作与集成开发
系列目录 上一篇:白骑士的PyCharm教学高级篇 3.4 服务器部署与配置 在现代软件开发中,团队协作和集成开发环境(IDE)的使用至关重要。PyCharm不仅提供了强大的个人开发支持,还为团队协作和集成开发提供了丰富的功能和工…...
c++ 21 指针
*像一把钥匙 通过钥匙去找内存空间 间接修改内存空间的值 不停的给指针赋值 等于不停的更改指针的指向 指针也是一种数据类型 指针做函数参数怎么看都不可以 指针也是一个数据类型 是指它指向空间的数据类习惯 作业 野指针 向null空间地址copy数据 不断改变指针指向 …...
书籍将整数字符串转成整数值(5)0804
题目 给定一个字符串str,如果str符合日常书写的整数形式,并且属于32位整数的范围,返回str所代表的整数值,否则返回0。 举例 str“123” 返回 123 str“023” 因为023 不符合日常的书写习惯,所以返回0 str“A13” …...
计网:从输入URL到网页显示期间发生了什么
1、URL包含的信息 我们输入的url中包含着一些信息: http:表示的此次我们使用的什么协议/www.baidu.com:表示的是我们想要访问的服务器名称,也就是域名dir3/home.html:表示我们所要访问的资源 2、通过DNS解析URL获得I…...
pg数据库存储过程
一、存储过程 CREATE OR REPLACE PROCEDURE public.p_dm_stock_fx_hangye_d(IN dt_date character varying) LANGUAGE plpgsql AS $procedure$ begin delete from dm_stock_fx_hangye_d where stock_date dt_date; commit; insert into dm_stock_fx_hangye_d select t…...
Arduino PID库 (2) –微分导致的过冲
Arduino PID库 (2) – Derivative Kick 参考:手把手教你看懂并理解Arduino PID控制库——微分冲击 pid内容索引-CSDN博客 Arduino PID库 (1)– 简介 问题 此修改将稍微调整derivative term。目标是消除一种称为“…...
基于Tensorflow.js的花卉识别编程实践
使用TensorFlow.js进行编程有许多优点,特别适合开发机器学习和深度学习的应用。TensorFlow.js可以直接在浏览器中运行,无需服务器或特殊环境配置。这使得开发者可以轻松地创建和部署基于Web的机器学习应用。TensorFlow.js提供了许多预训练模型࿰…...
繁简之争:为什么手机芯片都是 ARM
RISC 和 CISC 指令集 之前的文章《揭秘 CPU 是如何执行计算机指令的》中说到,如果从软件的角度来讲,CPU 就是一个执行各种计算机指令(Instruction Code)的逻辑机器。 计算机指令集是计算机指令的集合,包括各种类型的…...
《机器人SLAM导航核心技术与实战》第1季:第8章_激光SLAM系统
视频讲解 【第1季】8.第8章_激光SLAM系统-视频讲解【第1季】8.1.第8章_激光SLAM系统_Gmapping算法-视频讲解【第1季】8.2.第8章_激光SLAM系统_Cartographer算法-视频讲解【第1季】8.3.第8章_激光SLAM系统_LOAM算法-视频讲解 第1季:第8章_激光SLAM系统 先 导 课第…...
Qt之Gui
组件依赖关系 应用 #mermaid-svg-GADicZtZJRVVUeiF {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GADicZtZJRVVUeiF .error-icon{fill:#552222;}#mermaid-svg-GADicZtZJRVVUeiF .error-text{fill:#552222;stroke:#…...
Redis的回收策略(淘汰策略)
volatile-lru :从已设置过期时间的数据集( server.db[i].expires )中挑选最近最少使用的数据淘汰 volatile-ttl : 从已设置过期时间的数据集( server.db[i].expires ) 中挑选将要过期的数据淘汰 volatile…...
基于Springboot的个人博客系统
文章目录 介绍访问地址一、功能展示1.前台首页归档相册留言关于我登陆注册 2.后台管理系统登陆页面首页文章管理相册管理写博客访客统计 介绍 基于Java(Springboot)可以用做毕业设计的个人博客系统,包括网站前台和后台管理系统两部分。网站前…...
J030_TCP通信
一、需求描述 使用TCP协议进行通信 1.1 一发一收 1.1.1 Client package com.itheima.tcp1;import java.io.DataOutputStream; import java.io.OutputStream; import java.net.Socket;public class Client {public static void main(String[] args) throws Exception {//1、…...
单片机复习题
第1章 思考题及习题 一、填空 1. 除了单片机这一名称之外,单片机还可称为 或 。 2.单片机与普通微型计算机的不同之处在于其将 、 、和 三部分,通过内部 连接在一起,集成于一块芯片上。 …...
Java | Leetcode Java题解之第322题零钱兑换
题目: 题解: public class Solution {public int coinChange(int[] coins, int amount) {int max amount 1;int[] dp new int[amount 1];Arrays.fill(dp, max);dp[0] 0;for (int i 1; i < amount; i) {for (int j 0; j < coins.length; j)…...
【MYSQL】MYSQL逻辑架构
mysql逻辑架构分为3层 mysql逻辑架构分为3层 1). 连接层:主要完成一些类似连接处理,授权认证及相关的安全方案。 2). 服务层:在 MySQL据库系统处理底层数据之前的所有工作都是在这一层完成的,包括权限判断,SQL接口&…...
SQL Server数据库的清洁工:垃圾回收机制解析
SQL Server数据库的清洁工:垃圾回收机制解析 在SQL Server的复杂而精密的数据库管理系统中,垃圾回收机制扮演着至关重要的角色。它负责清理不再需要的数据,释放空间供新数据使用。本文将深入探讨SQL Server中数据库垃圾回收机制的工作原理&a…...
使用MailKit在.NET Core中收发邮件的完整示例
在.NET Core中处理邮件收发操作时,MailKit是一个非常强大的库。它支持SMTP、POP3、IMAP等多种协议,可以轻松实现发送、接收、以及管理邮件的功能。下面我们将通过一个详细的示例,展示如何在.NET Core项目中使用MailKit来收发邮件,…...
flask高频面试题
目录 高频面试题及答案1. 如何在Flask中处理数据库迁移?2. Flask如何处理文件上传?3. 如何在Flask中处理跨域请求(CORS)?4. 如何在Flask中实现用户认证?5. Flask如何处理会话?6. Flask如何处理表…...
【算法模板】图论:Tarjan算法求割边割点
概念 割边(Bridge 或 Cut Edge) 定义: 在一个无向连通图中,如果删除某条边后,图不再连通(即任意两点之间不能相互到达),则称该边为割边。割边也被称为桥,因为它像桥梁…...
python——joblib进行缓存记忆化-对计算结果缓存
问题场景 在前端多选框需要选取多个数据进行后端计算。 传入后端是多个数据包的对应路径。 这些数据包需要按一定顺序运行,通过一个Bag(path).get_start_time() 可以获得一个float时间值进行排序,但由于数据包的特性,这一操作很占用性能和时…...
01 计算机系统基础-2
操作系统 进程管理 进程管理是操作系统的核心,但如果设计不当,就会出现死锁的问题。如果一个进程在等待一件不可能发生的事,则进程就死锁了。而如果一个或多个进程产生死锁,就会造成系统死锁。基于死锁产生机制及解决方案&#…...
2024死磕小红书,一定能赚到钱!
2024死磕小红书,一定能赚到钱!在文末领取小红书运营完全指南电子书 从2023年起,小红书这股热乎劲儿就像开了挂,突然间就成了人人想蹭的“显学”。大伙儿都想趁着平台红利期,分一杯羹。说来惭愧,我从2020年…...
关于JS中的AO对象
在JavaScript中,AO对象(Activation Object,激活对象)是与函数执行上下文相关的概念。每当一个函数被调用时,都会创建一个新的执行上下文,这个执行上下文包含一个AO对象,用于存储在函数执行期间创…...
49 序列解包的多种形式和用法
序列解包(Sequence Unpacking)是 Python 中非常重要和常用的一个功能,可以使用非常简洁的形式完成复杂的功能,提高了代码的可读性,减少了程序员的代码输入量。 x, y, z 1, 2, 3 # 多个变量同时赋值 v_tuple (False…...
2-55 基于matlab的 永磁同步电机滑膜观测器估算电机转速
基于matlab的 永磁同步电机滑膜观测器估算电机转速。精度比传统观测器精度高。分别输出电机转速估计值与实际值、电机转速估计误差、电机转子位置估计值与实际值、电机转子位置估计误差。程序已调通,可直接运行。 2-55滑膜观测器估算电机转速 - 小红书 (xiaohongsh…...