== 和 equals() 的区别 -Java

在Java中,==equals() 是两个常用的比较操作符,它们用来比较对象,但它们的工作原理和适用场景有显著的不同。

1. == 运算符

== 是一个比较操作符,主要用于:

  • 基本数据类型的比较:它比较的是两个变量存储的值是否相等。
  • 对象的引用比较:它比较的是两个对象的引用(即内存地址)是否相同,即判断两个引用是否指向同一个对象。

基本数据类型的比较

对于基本数据类型(如intfloatchar等),==比较的是它们存储的实际值。

代码示例:

public class EqualOperatorExample {
    public static void main(String[] args) {
        int a = 10;
        int b = 10;
        
        System.out.println(a == b);  // true, 比较的是值,10 == 10
    }
}

对象引用的比较

对于对象,== 比较的是对象的引用地址,即判断两个对象是否是同一个对象。

代码示例:

public class EqualOperatorExample {
    public static void main(String[] args) {
        String str1 = new String("Hello");
        String str2 = new String("Hello");

        // 比较对象的引用地址,str1 和 str2 并不是同一个对象
        System.out.println(str1 == str2);  // false
    }
}

说明:

  • str1 == str2 返回 false,因为str1str2指向的是两个不同的对象,虽然它们的内容一样,但它们在内存中的地址不同。
  • == 只是比较对象的引用地址,而不是内容。

2. equals() 方法

equals()Object 类中定义的方法,用于比较两个对象的内容是否相同。大多数类(例如 StringInteger 等)会重写该方法,以便按对象的实际内容进行比较。

默认实现

默认情况下,equals() 方法比较的是对象的引用地址(即与 == 相同)。但许多类(如 StringList 等)重写了该方法,以便比较对象的内容而不是引用地址。

示例:String 类重写了 equals() 方法

String 类中,equals() 被重写为比较字符串内容是否相同。

代码示例:

public class EqualsMethodExample {
    public static void main(String[] args) {
        String str1 = new String("Hello");
        String str2 = new String("Hello");

        // 比较字符串的内容
        System.out.println(str1.equals(str2));  // true
    }
}

说明:

  • str1.equals(str2) 返回 true,因为 String 类重写了 equals() 方法,它会比较字符串的内容,而不是它们的引用地址。

3. 总结比较:==equals()

比较方式 == 运算符 equals() 方法
用途 比较基本数据类型的值,或者对象的引用地址 比较对象的内容(通过 equals() 重写时)
基本数据类型 比较值是否相等 不适用,基本类型不能调用 equals() 方法
对象 比较引用是否指向同一个对象 比较对象的内容(需类重写 equals() 方法)
默认行为 默认比较引用地址(对象的内存位置) 默认比较引用地址,除非类重写该方法进行内容比较
适用场景 适用于基本数据类型和对象引用比较 适用于对象的内容比较(字符串、集合等)

4. equals() 方法的重写

对于自定义类,如果希望 equals() 方法比较对象的内容而不是引用地址,需要重写 equals() 方法。常见的重写 equals() 方法的步骤如下:

  1. 使用 instanceof 检查类型:确保比较的对象类型相同。
  2. 比较属性:逐一比较对象的关键属性。

代码示例:

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 = (Person) obj;
        
        // 比较两个 Person 对象的属性
        return name.equals(person.name) && age == person.age;
    }
}

public class EqualsMethodOverrideExample {
    public static void main(String[] args) {
        Person person1 = new Person("Alice", 25);
        Person person2 = new Person("Alice", 25);
        
        // 通过重写的 equals() 方法比较对象内容
        System.out.println(person1.equals(person2));  // true
    }
}

说明:

  • equals() 方法首先判断是否为同一个对象,如果是,直接返回 true
  • 然后判断是否是相同类型的对象,再逐一比较每个属性,最后返回比较结果。

5. hashCode()equals() 的关系

在Java中,equals()hashCode() 方法是相互关联的。根据 Java 的合同规则,如果两个对象通过 equals() 方法比较相等,那么它们的 hashCode() 也必须相等。否则,可能会导致集合(如 HashMapHashSet)中的问题。

  • 如果两个对象相等(equals()true),那么它们的 hashCode() 必须相同。
  • 如果两个对象的 hashCode() 相同,并不一定意味着它们相等。

6. 总结

  • == 比较基本数据类型的值,或者对象的引用地址。
  • equals() 比较对象的内容,通常需要重写,尤其是在自定义类中。
  • 通过重写 equals() 方法,可以根据对象的实际内容来比较对象。
Java碎碎念 文章被收录于专栏

来一杯咖啡,聊聊Java的碎碎念呀

全部评论
mark
点赞 回复 分享
发布于 02-23 00:43 广东

相关推荐

随着三方协议的寄出,我的求职之旅终于画上了句号。回首从去年八月开始的求职征程,我经历了秋招的磨砺与彷徨,最终收获了一份各方面都令我心满意足的offer。这段历程,宛如一部起伏跌宕的小剧场,时间线大致如下:八月:满怀期待投出提前批简历,瞄准了拼多多、百度、腾讯等互联网巨头,却如石沉大海,杳无音讯。九月:大厂正式批如火如荼,我几乎每天都在题海中挣扎,笔试接连不断。除了美团让我看到一丝曙光,走到了二面,其余皆是铩羽而归。十月:清醒认识到自己与大厂尚有差距,战略转向中小企业以及央企国企。每周奔波于三四场面试之间,然而大部分中小企业依然是二面止步。十一月:面试重心转向国企银行,收获颇丰,多家银行发来了体检通知。然而理想与现实的差距依然存在——薪资未达预期,且传闻加班强度不小,最终放弃。十二月:在几家制造业公司中权衡利弊后,选择了某外企。薪资虽不令人惊喜,但胜在工作氛围不卷,只是通勤距离略长。本以为求职篇章就此落幕,未曾想,命运给我准备了意外惊喜。二月:去年十月投递的某央企突然发来面试通知。我抱着试一试的心态参与,没想到进展神速——一周内完成两轮面试,两周内便开始薪资洽谈。更令人欣喜的是,他们开出了与外企相当的薪资,而通勤距离仅为之前的三分之一。权衡再三,我决定支付一万元毁约金,选择这个更为理想的机会。至此,我的求职旅程终于尘埃落定。回望这段求职路,我曾焦虑不已,也曾迷失方向;面对无法攻克的笔试题时,我怀疑自己能力;久无面试音讯时,我担忧自己会"毕业即失业"。但如今回首,一切困难都已云淡风轻。或许人生就是如此,当你以为山重水复无路可走时,往往下一秒就会"柳暗花明又一村"。愿大家最后都能得到满意的offer。#牛客AI配图神器#
点赞 评论 收藏
分享
评论
2
1
分享

创作者周榜

更多
牛客网
牛客企业服务