“==“和 equals 方法究竟有什么区别?

== 操作符

== 操作符用于比较两个变量的值是否相等。在比较基本数据类型时,== 比较的是它们的值是否相同。在比较引用类型时,== 比较的是它们在内存中的地址是否相同,即两个引用是否指向同一个对象。

基本数据类型示例:
java 复制代码
int a = 5;
int b = 5;
System.out.println(a == b); // 输出 true
引用类型示例:
java 复制代码
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1 == str2); // 输出 false,因为 str1 和 str2 指向不同的对象

equals 方法

equals 方法用于比较两个对象的内容是否相同。equals 方法是 Object 类中的一个方法,所有的 Java 对象都继承了这个方法。默认情况下,equals 方法和 == 操作符的行为是一样的,即比较的是对象的引用是否相同。不过,很多类(如 StringInteger 等)覆盖了这个方法,用于比较对象的内容是否相同。

String 类的示例:
java 复制代码
String str1 = new String("hello");
String str2 = new String("hello");
System.out.println(str1.equals(str2)); // 输出 true,因为 str1 和 str2 的内容相同

覆盖 equals 方法的示例

假设我们有一个简单的类 Person,它有两个属性:nameage。我们希望比较两个 Person 对象时,不仅仅是比较它们的引用是否相同,而是比较它们的 nameage 是否相同。我们可以通过覆盖 equals 方法来实现。

Person 类代码:
java 复制代码
public class Person {
    private String name;
    private int age;

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @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);
    }

    public static void main(String[] args) {
        Person person1 = new Person("John", 25);
        Person person2 = new Person("John", 25);
        Person person3 = new Person("Jane", 30);

        System.out.println(person1 == person2); // 输出 false,因为 person1 和 person2 指向不同的对象
        System.out.println(person1.equals(person2)); // 输出 true,因为 person1 和 person2 的内容相同
        System.out.println(person1.equals(person3)); // 输出 false,因为 person1 和 person3 的内容不同
    }
}

总结

  • == 操作符用于比较两个变量是否指向同一个对象,即比较它们的内存地址是否相同。
  • equals 方法用于比较两个对象的内容是否相同。String 等类覆盖了 equals 方法以实现内容比较。
  • 如果一个类没有覆盖 equals 方法,那么它默认的实现是和 == 操作符一样的,比较的是对象的引用是否相同。要实现内容比较,需要覆盖 equals 方法。
相关推荐
狼爷8 小时前
吃透 Java Function 接口,搞定 99% 的 Stream 场景
java·函数式编程
祎雪双十Gy12 小时前
从 DataX 的配置加载说起:我用 FastJson2 做了一个轻量级动态配置管理库
java·后端
小锋java123412 小时前
分享一套锋哥原创的SpringBoot4+Vue3宠物领养网站系统
java
考虑考虑15 小时前
Java实现hmacsha1加密算法
java·后端·java ee
掉鱼的猫16 小时前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·spring boot
plainGeekDev16 小时前
广播接收器 → Flow + Lifecycle
android·java·kotlin
plainGeekDev16 小时前
EventBus → SharedFlow
android·java·kotlin
带刺的坐椅16 小时前
Spring Boot → Solon 注解迁移实战指南:一张对照表说清楚
java·springboot·web·solon
用户37215742613517 小时前
Java 将一个 PPT 文档拆分为多个文件
java
人活一口气1 天前
Spring Boot与AIGC的完美结合:从零搭建智能内容生成平台
java·spring boot·aigc