“==“和 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 方法。
相关推荐
疯狂打码的少年5 小时前
【数据库技术】关系模型基本概念(关系/属性/元组/键)
java·服务器·数据库·笔记
OPEN-F5 小时前
C++进阶教程:继承与多态
开发语言·c++
Mr数据杨7 小时前
【Codex】用学生入学评估模块建立新生能力画像
android·java·javascript·django·codex·项目开发
2601_962056237 小时前
Spring Boot 入门 与 无法解析符号 springframework 的解决
java·spring boot·后端
luj_17687 小时前
大律师考核应重能力与科技素养
c语言·开发语言·c++·经验分享·算法
Thomas21437 小时前
Java scala 数组 链表
java·链表·scala
亚历克斯神7 小时前
低代码与 AI 的融合趋势——从可视化搭建到自然语言生成应用
java·spring·微服务
学长毕业设计8 小时前
基于SpringBoot的瑜伽馆网站的设计与实现(源码+文档+讲解视频)
java·spring boot·后端
一嘴一个橘子8 小时前
nginx 常用命令(在 nginx 目录下执行)
java
leonkay8 小时前
C# 特性(Attribute)——【1】基础讲解
开发语言·青少年编程·面试·c#·.net·个人开发