== 和 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 广东

相关推荐

07-02 22:21
门头沟学院 Java
继续出第四期,对前几期感兴趣的朋友,可以直接去主页看,这位同学没有发在校经历和学历相关的内容,那我就没有要打码的东西了先看专业技能部分,写的6点,有些偏少了,描述的内容也偏少,可以参考图二进行优化然后看项目经历部分,一眼看去,没什么大问题,只是项目太大众化了,如果有时间可以尝试去找一些冷门的项目,没时间的话,就专注于优化技术亮点吧。第一个项目没有明显问题看第二个,首先,第二个项目的,技术亮点的样式和第一个不一样,这个你是怎么想的,是故意的吗,我觉得还是改成一样的好,这样整个简历会有一个统一的风格,然后感觉出你想把侧重点放在第一个项目上,然后第二个项目写的亮点就简单了很多,简单一些是正常的,但也不用反差这么大,建议改出两点左右向第一个项目中那样用比较好的技术,实现了某个功能之后,再加一些数字指标上去,我看你也是会测试的,而且这两个项目貌似都是购物类的,你可以尝试一下魔改第二个项目,改成其他类型,比如加一个电商订单导出模块,尝试导出千万级数据,然后再优化它,或者优化它的索引,这样的话两个项目都很好,并且功能上不冲突😎总的来说,这个简历很不错,如果学历好的话,有望冲一下大厂下面是我个人的话,暑假实习已经开始了,有的朋友没有及时找,现在很着急,或者说正在准备今年的秋招,如果你为自己的学历,或者因为没有高含金量的项目而发愁的话,我这里有大厂,最近做过的实习项目是可以包装到简历中的,可以助你找到更好的工作,感兴趣可以看简介中项目地址
点赞 评论 收藏
分享
评论
4
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务