“==“和 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 方法。
相关推荐
wht65874 分钟前
Linux--基本指令
linux·运维·服务器·c语言·开发语言·jvm·c++
无名小小卒5 分钟前
三小时快速上手TypeScript,TS速通教程(上篇、中篇、下篇、附加篇)
开发语言·前端·typescript
VaporGas7 分钟前
Spring-bean实例化的方式
java·数据库·spring
R_1878191153412 分钟前
电商系统之链动2+1模式开发
java·大数据·intellij-idea
秋雨凉人心18 分钟前
Webpack和GuIp打包原理以及不同
开发语言·前端·javascript·webpack·gulp
john_hjy19 分钟前
4. 数据结构: 对象和数组
java·开发语言·前端
一颗去去20 分钟前
【JavaScript】数组函数汇总
开发语言·javascript
代码吐槽菌23 分钟前
基于SSM的校园自助洗衣系统【附源码】
java·数据库·毕业设计·ssm·计算机专业
我不爱机器学习24 分钟前
python环境配置问题(个人经验)
开发语言·python
BYSJMG26 分钟前
基于Java的停车场管理微信小程序 停车场预约系统【源码+文档+讲解】
java·开发语言·spring boot·微信小程序·小程序·课程设计·毕设