== 和 equals 的区别是什么?

Java 基础面试题发布于

一、== 的作用

== 是 Java 的运算符,它的比较规则取决于两边的类型:

  • 基本数据类型(byte、short、int、long、float、double、char、boolean):比较的是字面值是否相等。
  • 引用数据类型:比较的是两个引用是否指向堆中的同一个对象(即内存地址是否相同)。
int a = 10;
int b = 10;
System.out.println(a == b); // true,基本类型比较值

String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1 == s2); // false,两个不同对象

二、equals 的作用

equals 是 Object 类定义的方法,源码如下:

public boolean equals(Object obj) {
    return (this == obj);
}

可以看到,Object 的默认实现仍然是用 == 比较地址。但很多类(典型如 String、Integer)重写了 equals,改为比较内容:

String s1 = new String("hello");
String s2 = new String("hello");
System.out.println(s1.equals(s2)); // true,String 重写后比较内容

三、总结

对比项 == equals
基本类型 比较值 不适用
引用类型 比较内存地址 默认比较地址,重写后可比较内容
是否可重写 运算符,不可重写 方法,可以按业务规则重写

小提示:重写 equals 时务必同时重写 hashCode,否则在 HashMap、HashSet 等基于哈希的集合中会出现行为异常。