在 Java 中,equals 方法和 ==

==

==

  1. 比较内存地址

==

  1. 比较的是操作符两端的操作数在堆内存中的地址,因此只有当两个引用指向同一个对象时,结果才为

true

  1. 类型要求:操作数必须是同一类型(可以是父类与子类之间)才能编译通过。
  2. 基本数据类型比较:对于基本数据类型(如

int

long

double

  1. ),

==

  1. 比较的是它们的值。如果值相等,则返回

true

  1. 。例如,

int a = 10

long b = 10L

double c = 10.0

  1. 的比较将返回

true

  1. ,因为它们在逻辑上等价于相同的值。

示例代码:

登录后复制

public class Main {
    public static void main(String[] args) {
        String str1 = new String("Hello");
        String str2 = new String("Hello");
        
        System.out.println(str1 == str2); // 输出: false,因为它们指向不同的对象
        int a = 10;
        long b = 10L;
        double c = 10.0;
        System.out.println(a == b); // 输出: true
        System.out.println(a == c); // 输出: true
    }
}
equals

equals 方法用于比较两个对象的内容是否相等。由于所有类都继承自 java.lang.Object,因此该方法适用于所有对象。然而,如果没有重写该方法,默认情况下调用的是 Object 类中的实现,这实际上等同于 ==

  1. 内容比较

equals

  1. 默认行为:如果没有重写,

Object

  1. 类中的

equals

  1. 方法返回的是对象引用的比较,类似于

==

  1. 空指针处理:在使用

equals

  1. 方法时,通常将常量放在前面,以避免可能的空指针异常。例如,

"Hello".equals(str)

  1. 总是安全的,即使

str

null

  1. ,而

str.equals("Hello")

  1. 可能会导致

NullPointerException

示例代码:

登录后复制

class Person {
    String name;

    Person(String name) {
         = name;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) return true; // 同一对象
        if (obj == null || getClass() != obj.getClass()) return false; // 空或不同类
        Person person = (Person) obj;
        return name.equals(); // 比较内容
    }
}

public class Main {
    public static void main(String[] args) {
        Person p1 = new Person("Alice");
        Person p2 = new Person("Alice");
        
        System.out.println(p1.equals(p2)); // 输出: true,因为内容相同
        System.out.println(p1 == p2); // 输出: false,因为它们是不同的对象
    }
}

总结来说,== 运算符用于比较对象在内存中的地址,而 equals 方法则用于比较对象的内容。在进行对象比较时,优先使用 equals,并在比较常量时,将常量放在前面以避免空指针异常。在自定义类时,建议重写 equals