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()方法前后的区别。
一般我们比较对象的时候,不会去比较引用地址,都是直观的来比较对象的值。

总结

  • == 为运算符;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方法详解:比较方法

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

关于企微群聊天工具功能的开发---PHP+JS+CSS+layui (手把手教学)

文章目录 前言准备工作PHP代码示例前端代码示例 主要是js踩的小坑&笔记最终达成的效果总结 前言 公司要求开发企微群聊天工具。首先一个客户一个群,其余群成员都是公司销售、设计师、工长、售后等人员。要求开发一个群聊天工具,工长点击进来以后就可…

ReentrantLock源码分析

文章目录 一、AQS1、state属性2、等待队列3、条件变量 二、ReentrantLock1、非公平锁实现原理1.1 获取锁1.2 释放锁1.3 可重入原理1.4 可打断原理不可打断可打断 1.5 公平锁实现原理1.6 条件变量原理awaitsignal 一、AQS AQS全称是 AbstractQueuedSynchronizer,是阻…

Python面试宝典第27题:全排列

题目 给定一个不含重复数字的数组nums,返回其所有可能的全排列 。备注:可以按任意顺序返回答案。 示例 1: 输入:nums [1,2,3] 输出:[[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2], [3,2,1]] 示例 2: 输…

FPGA开发——数码管的使用(二)

一、概述 在上一篇文章中我们针对单个数码管的静态显示和动态显示进行了一个设计和实现,这篇文章中我们针对多个数码管同时显示进行一个设计。这里和上一篇文章唯一不同的是就是数码管位选进行了一个改变,原来是单个数码管的显示,所以位选就直…

详细说明Java中Map和Set接口的使用方法

Map与Set的基本概念与场景 Map和set是一种专门用来进行搜索的容器或者数据结构,其搜索的效率与其具体的实例化子类有关。以前常见的搜索方式有: 1. 直接遍历,时间复杂度为O(N),元素如果比较多效率会非常慢。 2. 二分查找&#x…

WordPress网站被入侵,劫持收录事件分析

7.15,网站被入侵,但是直到7月17日,我才发现被入侵。 16日,17日正常更新文章,17日查询网站收录数据时,在站长资源平台【流量与关键词】查询上,我发现了比较奇怪的关键词。 乱码关键词排名 起初…

JavaDS —— AVL树

前言 本文章将介绍 AVL 树的概念,重点介绍AVL 树的插入代码是如何实现的,如果大家对 AVL 树的删除(还是和二叉搜索树一样使用的是替换删除法,然后需要判断是否进行旋转调整)感兴趣的话,可以自行去翻阅其他…

关于Unity转微信小程序的流程记录

1.准备工作 1.unity微信小程序转换工具,minigame插件,导入后工具栏出现“微信小游戏" 2.微信开发者工具稳定版 3.MP微信公众平台申请微信小游戏,获得游戏appid 4.unity转webgl开发平台,Player Setting->Other Setting…

市场主流 AI 视频生成技术的迭代路径

AI视频生成技术的迭代路径经历了从GANVAE、Transformer、Diffusion Model到Sora采用的DiT架构(TransformerDiffusion)等多个阶段,每个阶段的技术升级都在视频处理质量上带来了飞跃性的提升。这些技术进步不仅推动了AI视频生成领域的快速发展&…

评估生成分子/对接分子的物理合理性工具 PoseBusters 评测

最近在一些分子生成或者对接模型中,出现了新的评估方法 PoseBusters,用于评估生成的分子或者对接的分子是否符合化学有效性和物理合理性。以往的分子生成,经常以生成分子的有效性、新颖性、化学空间分布,与口袋的结合力等方面进行…

微软蓝屏事件揭示的网络安全深层问题与未来应对策略

目录 微软蓝屏事件揭示的网络安全深层问题与未来应对策略 一、事件背景 二、事件影响 2.1、跨行业连锁反应 2.2、经济损失和社会混乱 三、揭示的网络安全问题 3.2、软件更新管理与风险评估 3.2、系统复杂性与依赖关系 3.3、网络安全意识与培训 四、未来的网络安全方向…

网络云相册实现--nodejs后端+vue3前端

目录 主页面 功能简介 系统简介 api 数据库表结构 代码目录 运行命令 主要代码 server apis.js encry.js mysql.js upload.js client3 index.js 完整代码 主页面 功能简介 多用户系统,用户可以在系统中注册、登录及管理自己的账号、相册及照片。 每…

众人帮蚂蚁帮任务平台修复版源码,含搭建教程。

全修复运营版本的任务平台,支持垂直领域细分,定向导流,带有排行榜功能,任务发布上传审核,用户信用等级,充值接口等等均完美可用。支付对接Z支付免签接口,环境配置及安装教程都已经打包。 搭建环…

C语言调试宏全面总结(六大板块)

C语言调试宏进阶篇:实用指南与案例解析C语言调试宏高级技巧与最佳实践C语言调试宏的深度探索与性能考量C语言调试宏在嵌入式系统中的应用与挑战C语言调试宏在多线程环境中的应用与策略C语言调试宏在并发编程中的高级应用 C语言调试宏进阶篇:实用指南与案…

【Linux】网络基础_4

文章目录 十、网络基础5. socket编程网络翻译服务 未完待续 十、网络基础 5. socket编程 网络翻译服务 基于UDP&#xff0c;我们实现一个简单的翻译。 我们导入之前写的代码&#xff1a; InetAddr.hpp&#xff1a; #pragma once#include <iostream> #include <sys…

开源智能低代码自动化助手:Obsei

**Obsei&#xff1a;**低代码&#xff0c;高效率&#xff0c;Obsei让AI自动化触手可及。- 精选真开源&#xff0c;释放新价值。 概览 Obsei是一款开源的低代码人工智能自动化工具&#xff0c;它为企业提供了一套灵活的解决方案&#xff0c;以应对日益增长的数据处理需求。该工…

uvm_config_db 和 uvm_resource_db :

uvm_config_db class my_driver extends uvm_driver;int my_param;function new(string name, uvm_component parent);super.new(name, parent);endfunctionvirtual task run_phase(uvm_phase phase);// 在组件内部获取配置值if (!uvm_config_db#(int)::get(this, ""…

[Git][远程操作]详细讲解

1.理解分布式版本控制系统 形象理解&#xff1a;每个⼈的电脑上都是⼀个完整的版本库 这样⼯作的时候&#xff0c;就不需要联⽹了&#xff0c; 因为版本库就在⾃⼰的电脑上 既然每个⼈电脑上都有⼀个完整的版本库&#xff0c;那多个⼈如何协作呢&#xff1f; 例如&#xff1a;…

ajax图书管理项目

bootstrap弹框 不离开当前页面&#xff0c;显示单独内容&#xff0c;让用户操作 功能&#xff1a;不离开当前页面&#xff0c;显示单独内容&#xff0c;供用户操作步骤&#xff1a; 1.引入bootstrap.css和bootstrap.js …

Stegdetect教程:如何用Stegdetect检测和破解JPG图像隐写信息

一、Stegdetect简介 Stegdetect 是一个开源工具&#xff0c;专门设计用于检测图像文件&#xff08;JPG格式&#xff09;中的隐写信息。Stegdetect 可以检测多种常见的隐写方法&#xff0c;比如 JSteg、JPHide 和 OutGuess 等。 二、使用Stegdetect检测图像隐写 官方描述&#…