欢迎访问宙启技术站
智能推送

equals()函数与==操作符有何不同?

发布时间:2023-06-13 15:14:03

equals()函数和==操作符都是用于比较对象的相等性,但它们在实现方式和使用场景上有一些差异。

1. 实现方式

==操作符实际上比较的是两个对象的引用地址是否相同,即比较这两个对象是否指向内存中相同的位置。如果指向的是同一个对象,则返回true,否则返回false。例如:

String str1 = "hello";
String str2 = "hello";
System.out.println(str1 == str2); // 返回true,因为str1和str2都指向内存中的同一个"hello"字符串对象

而equals()函数则需要对比对象的内容是否相同。在Java中,所有的类都默认继承了Object类,并继承了它的equals()函数。Object类的equals()函数实际上是用==操作符实现的,即只有两个对象的引用地址相同时才返回true。如果我们要对比我们自己定义的类的相等性,就需要覆盖Object类的equals()函数,并定义我们自己的相等性规则。例如,我们可以定义一个Person类,并根据Person对象的id属性确定两个Person对象是否相等:

public class Person {
    private String name;
    private int age;
    private String id;
    
    // 省略构造函数和getters/setters方法
    
    @Override
    public boolean equals(Object o) {
        if (this == o) { // 如果是同一个对象,直接返回true
            return true;
        }
        if (o == null || getClass() != o.getClass()) { // 如果o为null或者类型不匹配,返回false
            return false;
        }
        Person person = (Person) o;
        return Objects.equals(id, person.id); // 比较id属性是否相同
    }
}

2. 使用场景

使用==操作符比较对象的引用地址是否相同时,可以用于确定两个变量是否引用同一个对象。例如,如果我们定义了两个Person对象p1和p2,我们可以使用==操作符判断它们是否是同一个对象:

Person p1 = new Person("Tom", 18, "1");
Person p2 = p1;
System.out.println(p1 == p2); // 返回true,因为p2指向的是p1所指向的对象

equals()函数则更多地用于确定对象的内容是否相同。例如,我们可以使用equals()函数比较两个String对象的内容是否相同:

String str1 = "hello";
String str2 = new String("hello");
System.out.println(str1.equals(str2)); // 返回true,因为两个字符串的内容相同

同时,由于equals()函数可以被覆盖,所以在自定义类中使用equals()函数比较对象的相等性时,可以根据实际需求自己定义相等性规则。例如,上述Person类中,我们定义了两个Person对象相等的标准为它们的id属性相同,这样就可以比较两个Person对象的相等性了:

Person p1 = new Person("Tom", 18, "1");
Person p2 = new Person("Jack", 20, "1");
System.out.println(p1.equals(p2)); // 返回true,因为它们都具有相同的id属性

总结来说,==操作符适用于比较对象的引用地址,equals()函数适用于比较对象的内容。在自定义类中,我们可以根据实际需求覆盖equals()函数,自定义相等性规则。