==,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 使用注意 的相关文章

随机推荐

  • 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 做内容比较时 把常量 或可