面试头棒-Java如何判断两个对象是否相等

embedded/2024/10/22 2:43:36/

在Java中,判断两个对象是否相等通常涉及两个层面的比较:引用相等(也称为身份相等)和内容相等(也称为值相等)。

  1. 引用相等(Identity Equality)
    • 使用 == 运算符。
    • 如果两个引用指向内存中的同一个对象,则它们是相等的。
    • 例如,if (obj1 == obj2) 检查 obj1 和 obj2 是否指向同一个对象实例。
  2. 内容相等(Value Equality)
    • 使用 .equals() 方法。
    • 大多数Java类(如 StringIntegerDouble 等)都重写了 Object 类的 equals() 方法,以比较对象的内容而不是引用。
    • 自定义类通常也需要重写 equals() 方法,以定义其内容相等的逻辑。
    • 例如,if (obj1.equals(obj2)) 检查 obj1 和 obj2 的内容是否相等。

注意事项

  • equals() 方法
    • 必须是对称的:如果 a.equals(b) 为 true,则 b.equals(a) 也必须为 true
    • 必须是自反的:a.equals(a) 必须为 true
    • 必须具有传递性:如果 a.equals(b) 为 true 且 b.equals(c) 为 true,则 a.equals(c) 也必须为 true
    • 对于任何非空引用值 xx.equals(null) 必须为 false
  • 重写 equals() 方法时,通常也需要重写 hashCode() 方法
    • 如果两个对象是相等的(根据 equals() 方法),则它们的 hashCode() 值必须相同。
    • 这对于将对象用作哈希表(如 HashMap 或 HashSet)的键时尤其重要。

示例

public class Person {  private String name;  private int age;  // 构造函数、getter 和 setter 方法  @Override  public boolean equals(Object obj) {  if (this == obj) return true; // 检查引用是否相同  if (obj == null || getClass() != obj.getClass()) return false; // 检查类型是否相同  Person person = (Person) obj; // 类型转换  return age == person.age && name.equals(person.name); // 比较内容  }  @Override  public int hashCode() {  int result = name.hashCode();  result = 31 * result + age; // 使用一个质数(如31)来计算哈希码  return result;  }  
}

在这个例子中,Person 类重写了 equals() 和 hashCode() 方法,以比较两个 Person 对象的内容(姓名和年龄)。如果两个 Person 对象的姓名和年龄都相同,则它们是相等的。


http://www.ppmy.cn/embedded/129445.html

相关文章

React 高级阶段学习计划

React 高级阶段学习计划 目标 深入理解React的渲染机制和性能优化。学会代码分割和懒加载。掌握单元测试和集成测试。学习TypeScript与React的结合。 学习内容 性能优化 React.memo React.memo:用于优化函数组件的性能,避免不必要的重新渲染。示例…

【Linux】内存文件系统的I/O、重定向

文章目录 1. 系统中的文件2. 回顾C中的文件接口3. 文件类的系统调用3.1 open3.2 文件描述符 4. IO的基本过程5.重定向5.1 引入重定向5.2 系统中的重定向接口 6. 缓冲区问题7. 简单版shell的实现 1. 系统中的文件 在学习完Linux权限后,我们清楚的知道:文…

111 - Lecture 5

Decomposition,Abstraction and Functions 1. 编程中的基础语言机制(basic language mechanisms): 回顾我们已经学习的 Java 基本语法,包括: • Primitives 原始数据类型(byte, short, int, long, float, double, boolean, cha…

Unity3D模型消融方法(二)

系列文章目录 unity工具 文章目录 系列文章目录👉前言👉一、效果展示👉二、模型淡入淡出效果实现👉3-1、具体实现方法👉3-2、CrollerShader.cs👉3-3、ModelXR.cs👉3-4、交互脚本👉壁纸分享👉总结👉前言 上一篇写了模型消融的方法, 这一篇算是淡入淡出效…

php之is_null、empty 、isset 的区别

目录 1.isset(): 2.empty(): 3.is_null: 4.总结: 在PHP中,is_null、empty 和 isset 是三个用于检查变量状态的常用函数,它们各自有不同的用途和行为: 1.isset(): isset() 函数…

qt继承结构

一、 继承结构 所有的窗口类均继承自QWidget类,因此QWidget类本身包含窗口的特性。QWidget对象本身既可以作为独立窗口,又可以作为组件(子窗口)。 通过构造函数可以创建以上两种形态的QWidget: // 参数1:使…

基于SpringBoot+Vue+uniapp的海产品加工销售一体化管理系统的详细设计和实现(源码+lw+部署文档+讲解等)

详细视频演示 请联系我获取更详细的视频演示 项目运行截图 技术框架 后端采用SpringBoot框架 Spring Boot 是一个用于快速开发基于 Spring 框架的应用程序的开源框架。它采用约定大于配置的理念,提供了一套默认的配置,让开发者可以更专注于业务逻辑而不…

Git客户端使用之命令行

一、git客户端命令行的使用 1、创建本地用户并绑定ssh-key到gitlab #在本地注册用户,这个用户随便创建它就是与git仓库连接的一个用户,不过最好喝git仓库用户一样有利于区分。 git config --global user.name "wenqiang1" git config --global user.ema…