java中的'=='和'equals'有什么区别

62 阅读3分钟

在Java中,“==”和“equals()”方法用于比较两个对象,但是它们之间存在一些区别。

“==”操作符用于比较两个基本数据类型或两个对象的引用。当用于基本数据类型时,“==”比较的是值是否相等。当用于对象引用时,“==”比较的是两个引用是否指向内存中的同一对象。换句话说,它检查两个引用是否真的是同一个对象的两个引用。

而“equals()”方法用于比较两个对象的内容是否相等。这个方法是从Object类中继承过来的,所有的类都继承了这个方法。它在Object类中的默认行为是和“==”一样的,也就是比较引用。但是,许多类(如String、Integer等)重写了这个方法,改为比较对象的内容。例如,在String类中,“equals()”方法比较的是两个字符串是否有相同的字符构成。

总结一下

  1. 比较方式不同

    • “==”操作符用于比较基本数据类型时,比较的是值是否相等;用于比较对象时,比较的是两个对象的引用是否相等,即是否指向内存中的同一位置。
    • “equals()”方法默认行为(在Object类中)也是比较两个对象的引用是否相等,但很多类(例如String、Integer等)重写了这个方法。在这些类中,“equals()”方法比较的是对象的内容或值是否相等。
  2. 使用建议

    • 对于基本数据类型,只能使用“==”进行比较。
    • 对于对象类型的比较,一般建议使用“equals()”,除非你明确知道需要比较的是对象的引用。

下面是一个简单的实例代码:

首先,我们先创建一个Person类,这个类重写了equals()方法以比较对象的内容:

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);  
    }  
}

然后,我们在主函数中创建两个Person对象,并使用“=”和“equals()”方法进行比较:

public class Main {  
    public static void main(String[] args) {  
        Person p1 = new Person("Alice", 20);  
        Person p2 = new Person("Alice", 20);  
  
        // 使用“=”比较  
        System.out.println(p1 == p2);  // 输出:false,因为p1和p2指向的是不同的对象  
  
        // 使用“equals()”比较  
        System.out.println(p1.equals(p2));  // 输出:true,因为p1和p2的内容相同  
    }  
}

以上代码中,我们创建了两个名字和年龄都相同的Person对象,当我们使用“==”进行比较时,由于它们指向的是不同的对象,所以结果为false。而当我们使用equals()方法进行比较时,由于它们的内容相同,所以结果为true。这就是“==”和“equals()”在Java中的主要区别。

关于‘==’和equals的一些小建议:

  1. 理解两者的区别:首先,最重要的是理解“==”和“equals()”之间的区别,并知道在什么情况下应该使用哪一个。
  2. 对于对象比较,优先使用equals() :当你需要比较两个对象的内容是否相等时,应该使用equals()方法,而不是“==”。
  3. 小心使用“==”来比较对象:“==”操作符在比较对象时,实际上是比较两个引用是否指向同一个对象,这在大多数情况下可能不是你想要的。因此,除非你有特殊的需求,否则最好避免使用“==”来比较对象。
  4. 重写equals()方法时需谨慎:如果你在自己的类中重写了equals()方法,一定要小心。首先,确保你理解了这个方法的默认行为以及它的预期行为。其次,当你重写这个方法时,通常也需要重写hashCode()方法,以维护equals()方法和hashCode()方法之间的契约。
  5. 注意null值:当使用equals()方法时,要注意可能会遇到null值的情况。因为如果一个对象为null,调用它的任何方法都会抛出NullPointerException。所以,通常我们会在调用equals()方法之前,先进行null检查。