“==“和 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 方法。
相关推荐
..空空的人9 分钟前
C++基于websocket的多用户网页五子棋 ---- 模块介绍1
开发语言·c++·websocket
代码不停14 分钟前
Java模拟算法题目练习
java·开发语言·算法
百***266314 分钟前
Tomcat的server.xml配置详解
xml·java·tomcat
彡皮22 分钟前
基于Qt,调用千问7B大模型,实现智能对话
开发语言·qt·大模型·千问7b
朝新_25 分钟前
【统一功能处理】SpringBoot 统一功能专题:拦截器、数据封装、异常处理及 DispatcherServlet 源码初探
java·spring boot·后端·spring·javaee
恸流失37 分钟前
集合练习1
java
LiLiYuan.38 分钟前
Arrays类和List接口的关联
java·开发语言·windows·python
stay_awake__38 分钟前
Maven+mybatis
java·maven
武子康1 小时前
Java-170 Neo4j 事务、索引与约束实战:语法、并发陷阱与速修清单
java·开发语言·数据库·sql·nosql·neo4j·索引
q***23571 小时前
在2023idea中如何创建SpringBoot
java·spring boot·后端