Java equals()方法与==运算符有何不同?

简介: 【4月更文挑战第13天】

Java中的equals()方法和==运算符都用于比较对象之间的相等性,但它们之间有一些重要的区别。本文将深入探讨这两者的不同之处。

equals()方法

定义

equals()方法是Object类的一个实例方法,用于比较两个对象是否在逻辑上相等。

默认行为

在Object类中,equals()方法的默认实现与==运算符相同,即比较两个对象的引用是否相同。

重写

许多Java类(如String、Integer等)都重写了equals()方法,以便按照对象的内容进行比较而不是引用。

示例

String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2)); // 输出 true,因为内容相同

自定义类中的实现

如果自定义类需要根据对象的内容进行比较,就需要重写equals()方法。以下是一个简单的示例:

public class MyClass {
   
   
    private int value;

    public MyClass(int value) {
   
   
        this.value = value;
    }

    @Override
    public boolean equals(Object obj) {
   
   
        if (obj == this) {
   
   
            return true;
        }
        if (!(obj instanceof MyClass)) {
   
   
            return false;
        }
        MyClass other = (MyClass) obj;
        return this.value == other.value;
    }
}

==运算符

定义

==运算符用于比较两个对象的引用是否相同。

行为

当使用==运算符比较基本数据类型时,比较的是它们的值。但是,当用于比较对象时,比较的是对象的引用地址。

示例

String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // 输出 false,因为它们引用了不同的对象

更多的Java代码示例

示例1:equals()方法示例

public class Student {
   
   
    private String name;
    private int id;

    public Student(String name, int id) {
   
   
        this.name = name;
        this.id = id;
    }

    @Override
    public boolean equals(Object obj) {
   
   
        if (obj == this) {
   
   
            return true;
        }
        if (!(obj instanceof Student)) {
   
   
            return false;
        }
        Student other = (Student) obj;
        return this.name.equals(other.name) && this.id == other.id;
    }

    public static void main(String[] args) {
   
   
        Student s1 = new Student("Alice", 1);
        Student s2 = new Student("Alice", 1);
        System.out.println(s1.equals(s2)); // 输出 true,因为内容相同
    }
}

示例2:==运算符示例

public class Example {
   
   
    public static void main(String[] args) {
   
   
        String str1 = "hello";
        String str2 = "hello";
        String str3 = new String("hello");

        System.out.println(str1 == str2); // 输出 true,因为在字符串常量池中,引用相同
        System.out.println(str1 == str3); // 输出 false,因为str3在堆中创建了新对象
    }
}

示例3:自定义类中的equals()方法

public class Point {
   
   
    private int x;
    private int y;

    public Point(int x, int y) {
   
   
        this.x = x;
        this.y = y;
    }

    @Override
    public boolean equals(Object obj) {
   
   
        if (obj == this) {
   
   
            return true;
        }
        if (!(obj instanceof Point)) {
   
   
            return false;
        }
        Point other = (Point) obj;
        return this.x == other.x && this.y == other.y;
    }

    public static void main(String[] args) {
   
   
        Point p1 = new Point(1, 2);
        Point p2 = new Point(1, 2);
        System.out.println(p1.equals(p2)); // 输出 true,因为内容相同
    }
}

区别总结

  • equals()方法用于比较对象的内容是否相等,而==运算符用于比较对象的引用是否相同。
  • equals()方法可以被重写,以便根据对象的内容进行比较,而==运算符无法被重写。
  • 默认情况下,equals()方法比较的是引用,除非被重写。
  • 在比较基本数据类型时,==比较的是值,而在比较对象时,==比较的是引用地址。
目录
相关文章
|
30天前
|
存储 Java 索引
Java快速入门之数组、方法
### Java快速入门之数组与方法简介 #### 一、数组 数组是一种容器,用于存储同种数据类型的多个值。定义数组时需指定数据类型,如`int[]`只能存储整数。数组的初始化分为静态和动态两种: - **静态初始化**:直接指定元素,系统自动计算长度,如`int[] arr = {1, 2, 3};` - **动态初始化**:手动指定长度,系统给定默认值,如`int[] arr = new int[3];` 数组访问通过索引完成,索引从0开始,最大索引为`数组.length - 1`。遍历数组常用`for`循环。常见操作包括求和、找最值、统计特定条件元素等。
|
3天前
|
存储 安全 算法
Java容器及其常用方法汇总
Java Collections框架提供了丰富的接口和实现类,用于管理和操作集合数据。
Java容器及其常用方法汇总
|
5天前
|
存储 缓存 Java
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
20 3
java语言后台管理ruoyi后台管理框架-登录提示“无效的会话,或者会话已过期,请重新登录。”-扩展知识数据库中密码加密的方法-问题如何解决-以及如何重置若依后台管理框架admin密码-优雅草卓伊凡
|
3天前
|
Java API
java.time常用方法汇总
`java.time` API 是从 Java 8 开始引入的时间日期处理库,旨在替代老旧的 `java.util.Date` 和 `Calendar`。它提供了更简洁、强大和灵活的方式处理日期、时间、时区及时间间隔,支持全球化和时间计算需求。API 包含获取当前时间、创建指定时间、解析和格式化字符串、进行加减运算、比较时间、获取年月日时分秒、计算时间间隔、时区转换以及判断闰年等功能。示例代码展示了如何使用这些功能,极大简化了开发中的时间处理任务。
|
26天前
|
Java
Java快速入门之类、对象、方法
本文简要介绍了Java快速入门中的类、对象和方法。首先,解释了类和对象的概念,类是对象的抽象,对象是类的具体实例。接着,阐述了类的定义和组成,包括属性和行为,并展示了如何创建和使用对象。然后,讨论了成员变量与局部变量的区别,强调了封装的重要性,通过`private`关键字隐藏数据并提供`get/set`方法访问。最后,介绍了构造方法的定义和重载,以及标准类的制作规范,帮助初学者理解如何构建完整的Java类。
|
22天前
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
55 9
|
28天前
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
60 12
|
28天前
|
算法 Java API
Java 方法注释:规范、实用和高质量的写法
本文深入探讨了如何编写高质量的 Java 方法注释
50 11
|
2月前
|
存储 Java
java中的常见运算符的计算方式
本文介绍了计算机中二进制数的原码、反码和补码的概念及其转换方式。原码是符号位加真值的绝对值;反码中正数不变,负数其余位取反;补码在反码基础上加1。文章还详细解释了Java中的常见运算符(如按位与、或、异或、移位等)如何基于二进制进行计算,并探讨了使用补码的原因,包括统一符号位处理和扩展表示范围。通过具体代码示例帮助理解这些概念。
java中的常见运算符的计算方式
|
28天前
|
SQL Java 数据库连接
【潜意识Java】Java中JDBC过时方法的替代方案以及JDBC为什么过时详细分析
本文介绍了JDBC中一些常见过时方法及其替代方案。
41 5