“==“和 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 方法。
相关推荐
Yang-Never2 分钟前
Kotlin -> object声明和object表达式
android·java·开发语言·kotlin·android studio
风萧萧19993 分钟前
Java 实现poi方式读取word文件内容
java·开发语言·word
喵手13 分钟前
如何实现一个简单的基于Spring Boot的用户权限管理系统?
java·spring boot·后端
啊阿狸不会拉杆25 分钟前
《算法导论》第 3 章 - 函数的增长
开发语言·数据结构·c++·算法
C4程序员33 分钟前
北京JAVA基础面试30天打卡01
java·开发语言·面试
Aczone281 小时前
数据结构(三)双向链表
java·数据结构·链表
菜菜的后端私房菜1 小时前
Dubbo2到Dubbo3服务发现机制的优化
java·后端·dubbo
33255_40857_280591 小时前
RocketMQ实战指南:Java开发者的分布式消息中间件全解析
java·rocketmq
Seven971 小时前
剑指offer-19、顺时针打印矩阵
java
SimonKing1 小时前
PostMan不香了,IDEA因为Apipost插件这一功能轻松取代
java·后端·程序员