== 和 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的碎碎念呀

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务