==,Object.equals(), Objects.equals(), Objects.deepEquals 使用注意

2023-11-10

相等判断时需注意

  • 基本数据类型之间,可使用==, 包装类型之间尽量不要使用==、!=,包装类数值超过-127~128, 引用类型地址不同,在-127~128之间时,翻阅底层源码发现,使用的是缓存的值
  • 使用Object.equals()做内容比较时, 把常量 或可不能为空的对象放在前面,未知的对象放在括号内
  • Objects.equals(a, b) 比较安全,底层对两个参数都进行了非空判断
  • Objects.deepEquals(a, b) 用来对数组 或反序列化成的未知对象 进行深度比较

 初始化值的不同

基本数据类型的初始化值为 0

short

int

long

double

boolean = false

包装类型初始化为 null

补充

public class Student {

    private String addr;
    private String name;
    private Integer age;

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    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 Student() {
    }

    public Student(String addr, String name, Integer age) {
        this.addr = addr;
        this.name = name;
        this.age = age;
    }
}


public class TestEqualAndHashCode  extends  Student{

    public static void main(String[] args) {
        Student stu1 = new Student("1楼", "test", 18);
        Student stu2 = new Student("1楼", "test", 18);
        System.out.println(">>>>>>>>>>>>>>equals>>>" + stu1.equals(stu1));
        System.out.println(">>>>>>>>>>>>>>equals>>>" + stu2.equals(stu2));
        System.out.println(">>>>>>>>>>>>>>stu1 hashcode>>> " + stu1.hashCode());
        System.out.println(">>>>>>>>>>>>>>stu2 hashcode>>> " + stu2.hashCode());
        System.out.println(stu1 == stu2);
        System.out.println("stu1 内存地址>>>>" + stu1);
        System.out.println("stu2 内存地址>>>>" + stu2);
                Map stus = new HashMap<>();
        stus.put(stu1, stu1);
        stus.put(stu2, stu2);
        System.out.println(stus);
        System.out.println("student 类信息" + stu1.getClass());

        Integer[] integers = {1, 2, 3};
        System.out.println("数组 " + integers.toString());
        System.out.println("数组 plus" + Arrays.toString(integers));
        Arrays.deepToString(integers);
        String[] strs = new String[2];
        String[] strArray = {"1", "2"};
        String[] strArray1 = {"1", "2"};
        System.out.println("比较数组" + Objects.equals(strArray, strArray1));
        System.out.println("深度比较数组" + Objects.deepEquals(strArray, strArray1));
        System.out.println("比较对象" + Objects.equals(stu1, stu2));

                Student[] student1 = {new Student("1楼", "test", 18), new Student("1楼", "test", 18)};
        Student[] student2 = {new Student("1楼", "test", 18), new Student("1楼", "test", 18)};
        System.out.println("对象数组比较" + Objects.equals(student1, student2));
        System.out.println("对象数组深度比较" + Objects.deepEquals(student1, student2));
    }
}




运行结果

>>>>>>>>>>>>>>equals>>>true
>>>>>>>>>>>>>>equals>>>true
>>>>>>>>>>>>>>stu1 hashcode>>> 231685785
>>>>>>>>>>>>>>stu2 hashcode>>> 114935352
false
stu1 内存地址>>>>com.qif.asuav.uav.Student@dcf3e99
stu2 内存地址>>>>com.qif.asuav.uav.Student@6d9c638
{com.qif.asuav.uav.Student@6d9c638=com.qif.asuav.uav.Student@6d9c638, com.qif.asuav.uav.Student@dcf3e99=com.qif.asuav.uav.Student@dcf3e99}
student 类信息class com.qif.asuav.uav.Student
数组 [Ljava.lang.Integer;@7dc5e7b4
数组 plus[1, 2, 3]
比较数组false
深度比较数组true
比较对象false
对象数组比较false
对象数组深度比较false

     小结

        1.数组的打印toString 是一个对象信息,因为数组没有重写Obeject 类的 toString 方法

·       2.相同内容的基础类型的数组Objects.equals 方法比较 放回的是false,数组没有重写Object equals 方法,这样用的还是 Object 的equals 方法 还是用 == 进行比较

         3.相同内容的基本类型的数组调用Objects.deepEquals 方法返回的是true 比较的是基本类型的内容

        4.相同内容的对象类型的数组 如果对象没有重写 equals 方法时候 Objects.equals  Objects.deepEquals 返回的都是false。 原因可以阅读源码。Objects.deepEquals 先第一层比较 最后比较到对象里面是调用的是equals 方法,因为没有重写Object 的 equals 的 方法,调用的还是 == 的比较所以返回的还是false。

public class Student {

    private String addr;
    private String name;
    private Integer age;

    public String getAddr() {
        return addr;
    }

    public void setAddr(String addr) {
        this.addr = addr;
    }

    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 Student() {
    }

    public Student(String addr, String name, Integer age) {
        this.addr = addr;
        this.name = name;
        this.age = age;
    }

        @Override
    public boolean equals(Object o) {
        if (this == o) {
            return true;
        }
        if (o == null || getClass() != o.getClass()) {
            return false;
        }
        Student student = (Student) o;
        return Objects.equals(addr, student.addr) && Objects.equals(name, student.name) && Objects.equals(age, student.age);
    }
}


public class TestEqualAndHashCode  extends  Student{

    public static void main(String[] args) {
        Student stu1 = new Student("1楼", "test", 18);
        Student stu2 = new Student("1楼", "test", 18);
        System.out.println(">>>>>>>>>>>>>>equals>>>" + stu1.equals(stu1));
        System.out.println(">>>>>>>>>>>>>>equals>>>" + stu2.equals(stu2));
        System.out.println(">>>>>>>>>>>>>>stu1 hashcode>>> " + stu1.hashCode());
        System.out.println(">>>>>>>>>>>>>>stu2 hashcode>>> " + stu2.hashCode());
        System.out.println(stu1 == stu2);
        System.out.println("stu1 内存地址>>>>" + stu1);
        System.out.println("stu2 内存地址>>>>" + stu2);
                Map stus = new HashMap<>();
        stus.put(stu1, stu1);
        stus.put(stu2, stu2);
        System.out.println(stus);
        System.out.println("student 类信息" + stu1.getClass());

        Integer[] integers = {1, 2, 3};
        System.out.println("数组 " + integers.toString());
        System.out.println("数组 plus" + Arrays.toString(integers));
        Arrays.deepToString(integers);
        String[] strs = new String[2];
        String[] strArray = {"1", "2"};
        String[] strArray1 = {"1", "2"};
        System.out.println("比较数组" + Objects.equals(strArray, strArray1));
        System.out.println("深度比较数组" + Objects.deepEquals(strArray, strArray1));
        System.out.println("比较对象" + Objects.equals(stu1, stu2));

                Student[] student1 = {new Student("1楼", "test", 18), new Student("1楼", "test", 18)};
        Student[] student2 = {new Student("1楼", "test", 18), new Student("1楼", "test", 18)};
        System.out.println("对象数组比较" + Objects.equals(student1, student2));
        System.out.println("对象数组深度比较" + Objects.deepEquals(student1, student2));
    }
}




运行结果

>>>>>>>>>>>>>>equals>>>true
>>>>>>>>>>>>>>equals>>>true
>>>>>>>>>>>>>>stu1 hashcode>>> 231685785
>>>>>>>>>>>>>>stu2 hashcode>>> 114935352
false
stu1 内存地址>>>>com.qif.asuav.uav.Student@dcf3e99
stu2 内存地址>>>>com.qif.asuav.uav.Student@6d9c638
{com.qif.asuav.uav.Student@6d9c638=com.qif.asuav.uav.Student@6d9c638, com.qif.asuav.uav.Student@dcf3e99=com.qif.asuav.uav.Student@dcf3e99}
student 类信息class com.qif.asuav.uav.Student
数组 [Ljava.lang.Integer;@7dc5e7b4
数组 plus[1, 2, 3]
比较数组false
深度比较数组true
比较对象true
对象数组比较false
对象数组深度比较true

小结

       student 类 重写了 equals 方法  深度比较返回的是true。

总结

        对象的深度比较要重写 equasl 方法。

 参考资料 

==,Object.equals(), Objects.equals(), Object.deepEquals 使用注意 - GooSune的个人空间 - OSCHINA - 中文开源技术交流社区      

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

==,Object.equals(), Objects.equals(), Objects.deepEquals 使用注意 的相关文章

  • 菜单未显示在应用程序中

    由于某种原因 我的操作菜单在我的 Android Studio 应用程序中消失了 我正在按照教程学习如何创建 Android 应用程序 但最终遇到了这个问题 我正在使用 atm 的教程 http www raywenderlich com
  • AES 加密 Java/plsql

    我需要在Java和plsql DBMS CRYPTO for Oracle 10g 上实现相同的加密 解密应用程序 两种实现都工作正常 但这里的问题是我对相同纯文本的加密得到了不同的输出 下面是用于加密 解密过程的代码 Java 和 PLS
  • Java程序中的数组奇怪的行为[重复]

    这个问题在这里已经有答案了 我遇到了这个 Java 程序及其以意想不到的方式运行 以下程序计算 int 数组中元素对之间的差异 import java util public class SetTest public static void
  • JNI 不满意链接错误

    我想创建一个简单的 JNI 层 我使用Visual studio 2008创建了一个dll Win 32控制台应用程序项目类型 带有DLL作为选项 当我调用本机方法时 出现此异常 Exception occurred during even
  • ExceptionConverter:java.io.IOException:文档没有页面。我正在使用 iText

    当我执行下面的代码时 File f new File c sample pdf PdfWriter getInstance document new FileOutputStream f document open System out p
  • java.io.IOException: %1 不是有效的 Win32 应用程序

    我正在尝试对 XML 文档进行数字签名 为此我有两个选择 有一个由爱沙尼亚认证中心为程序员创建的库 还有一个由银行制作的运行 Java 代码的脚本 如果使用官方 认证中心 库 那么一切都会像魅力一样进行一些调整 但是当涉及到银行脚本时 它会
  • 在数据流模板中调用 waitUntilFinish() 后可以运行代码吗?

    我有一个批处理 Apache Beam 作业 它从 GCS 获取文件作为输入 我的目标是根据执行后管道的状态将文件移动到两个 GCS 存储桶之一 如果管道执行成功 则将文件移动到存储桶 A 否则 如果管道在执行过程中出现任何未处理的异常 则
  • Microsoft Graph 身份验证 - 委派权限

    我可以使用 Microsoft Graph 访问资源无需用户即可访问 https developer microsoft com en us graph docs concepts auth v2 service 但是 此方法不允许我访问需
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • 在具有相同属性名称的不同数据类型上使用 ModelMapper

    我有两节课说Animal AnimalDto我想用ModelMapper将 Entity 转换为 DTO 反之亦然 但是对于具有相似名称的一些属性 这些类应该具有不同的数据类型 我该如何实现这一目标 动物 java public class
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • 检查 protobuf 消息 - 如何按名称获取字段值?

    我似乎无法找到一种方法来验证 protobuf 消息中字段的值 而无需显式调用其 getter 我看到周围的例子使用Descriptors FieldDescriptor实例到达消息映射内部 但它们要么基于迭代器 要么由字段号驱动 一旦我有
  • org.jdesktop.application 包不存在

    几天以来我一直在构建一个 Java 桌面应用程序 一切都很顺利 但是今天 当我打开Netbeans并编译文件时 出现以下编译错误 Compiling 9 source files to C Documents and Settings Ad
  • 如何在 Maven 中显示消息

    如何在 Maven 中显示消息 在ant中 我们确实有 echo 来显示消息 但是在maven中 我该怎么做呢 您可以使用 antrun 插件
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • 将2-3-4树转换为红黑树

    我正在尝试将 2 3 4 树转换为 java 中的红黑树 但我无法弄清楚它 我将这两个基本类编写如下 以使问题简单明了 但不知道从这里到哪里去 public class TwoThreeFour
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是
  • Swagger/Openapi-Annotations:如何使用 $ref 生成 allOf?

    我正在生成 Rest 端点 包括添加OpenAPI Swagger对生成的代码进行注释 虽然它对于基本类型运行得很好 但我在自定义类方面遇到了一些问题 现在我有很多自定义类的重复架构条目 使用 Schema 实现 MyClass class

随机推荐

  • SpringBoot 项目健康检查与监控

    转载 https www cnblogs com javanoob p springboot healthcheck html 前言 You build it You run it 当我们编写的项目上线后 为了能第一时间知晓该项目是否出现问
  • 程序员必知的 七 种软件架构模式!

    一种模式就是特定上下文的问题的一种解决方案 然而 很多开发者至今还对各种软件架构模式之间的差别搞不清 甚至对其所知甚少 大体上 主要有下面这7种架构模式 分层架构 多层架构 管道 过滤器架构 客户端 服务器架构 模型 视图 控制器架构 事件
  • 背包算法(贪婪算法)

    一 问题描述 有n 个物品 它们有各自的重量和价值 现有给定容量的背包 如何让背包里装入的物品具有最大的价值总和 二 总体思路 根据动态规划解题步骤 问题抽象化 建立模型 寻找约束条件 判断是否满足最优性原理 找大问题与小问题的递推关系式
  • PyQt界面:左右界面由于控件太多不协调

    问题 在编写软件时 有左右两个子界面 都设置为网格布局 左界面是菜单 右界面是每个菜单对应的内容 当右界面的空间太多时 导致左界面的空间缩小 不协调 正常显示应如下 如下图 右边的一行控件太多 导致子界面左边界面宽度变窄 影响整体协调性 解
  • python熵权法过程中,权重出现nan值问题

    最近在利用熵权法选取最优指标数据时 计算权重得到的是全为nan值的权重 经过分析过程 找到问题所在 数据展示 熵权法步骤 step 1 标准化处理 step 2 计算每个维度的信息熵 step 3 差异系数 step 4 计算权重 step
  • Altium Designer 21的使用(二):电阻电容模型的创建

    TIPS 元件符号是元件在原理图上的表现形式 主要由元件边框 管脚 包括管脚序号和管脚名称 元件名称及元件说明组成 通过放置的管脚来建立电气连接关系 元件符号中的管脚序号是和电子元件实物的管脚一一对应的 在创建元件时 图形不一定和实物完全一
  • java io流读取文件_java的几种IO流读取文件方式

    一 超类 字节流 InputStream 读入流 OutputStream 写出流 字符流 Reader 字符 读入流 Writer 字符写出流 二 文件操作流 字节流 FileInputStream FileOutputStream 字符
  • tensorflow码源-运行流程

    tensorflow码源 运行流程 简介 通过分析用户构建的计算是如何在tensorflow中运行的 了解tensorflow中的基本元素和op kernel和device之间的交互 用户程序 matrix1 tf constant 3 3
  • 如何实现‘请在微信客户端打开链接’

    想要实现请在微信客户端打开链接 在代码中加入以下代码即可 code style font family none display block line height 18px border none code
  • 【编程之路】面试必刷TOP101:动态规划(72-77,Python实现)

    面试必刷TOP101 动态规划 72 77 Python实现 72 连续子数组的最大和 小试牛刀 72 1 动态规划 因为数组中有正有负有0 因此每次遇到一个数 要不要将其加入我们所求的连续子数组里面 是个问题 有可能加入了会更大 有可能加
  • js阻止冒泡事件

    div class open div style width 50 margin 0 auto height 5rem div class open back img style width 2 25rem src image public
  • JAVA switch case 穿透问题

    1 前提 其实开发中很少会用到switch 一般更倾向于if else 但是最近接手的项目 前人写的代码都用switch 但是我一直以来对switch 的理解就跟if一样 然后项目运用的时候才发现这玩意居然还有穿透问题 2 实践 publi
  • 米家扩展程序初始化超时,GCC编译器警告:扩展初始化程序列表仅在c ++ 0x中可用...

    Using this member initialization StatsScreen StatsScreen GameState State level m Level level I get the following warning
  • Eclipse新版本注释的中文大小不一,缩进有问题. Eclipse新版本的坑

    notepad 可以关闭打开标签 左边所有 右边所有 而eclipse的旧版本却没有 就去找了新版本的Eclipse 来用 结果就踩坑了 Eclipse IDE 2020 09 需要jdk11 Eclipse IDE 2020 06 可以用
  • shiro多项目跳转用户身份失效问题排查

    shiro多项目跳转用户身份失效问题排查 1 身份失效问题 最近在项目中遇到过一个问题 统一登录系统中有各个子系统的模块 可点击子系统模块进行跳转 如下图所示 如上图 当用户点击子系统B新窗口打开时 实现跳转成功 当再回到原统一登录系统页面
  • iocrl如何从user space调用到 kernel space,

    iocrl如何从user space调用到 kernel space 还有调用的流程 图1 在上述的调用流程中 do vfs ioctl 会处理一些内核自定义的cmd type 如果我们自定义的cmd type和系统定义的重复 会导致 该自
  • SQL 测试

    您的回答 1 SQL 指的是 您的回答 Structured Query Language 2 哪个 SQL 语句用于从数据库中提取数据 您的回答 SELECT 3 哪条 SQL 语句用于更新数据库中的数据 您的回答 UPDATE 4 哪条
  • LintCode之128 哈希函数

    题目来源 哈希函数 题目描述 在数据结构中 哈希函数是用来将一个字符串 或任何其他类型 转化为小于哈希表大小且大于等于零的整数 一个好的哈希函数可以尽可能少地产生冲突 一种广泛使用的哈希函数算法是使用数值33 假设任何字符串都是基于33的一
  • 一文解释python中的实例方法,类方法和静态方法作用和区别是啥?该如何使用

    我们都知道 python类中有三种常见的方法 分别是实例方法 类方法和静态方法 那么这几个方法到底有什么作用 它们之间有什么区别 该如何使用 带着这些问题 下面我们就来了解下这三种方法 1 方法介绍 2 代码说明 若我们要实现一个学生的类
  • ==,Object.equals(), Objects.equals(), Objects.deepEquals 使用注意

    相等判断时需注意 基本数据类型之间 可使用 包装类型之间尽量不要使用 包装类数值超过 127 128 引用类型地址不同 在 127 128之间时 翻阅底层源码发现 使用的是缓存的值 使用Object equals 做内容比较时 把常量 或可