“==”比较值或地址,“equals()”默认与“==”相同,重写后才比较内容;基本类型只能用“==”;引用类型“==”判同一对象,equals()需重写才有效;调用equals()前应防null。
“==”比的是值,“equals()”比的是内容,但前提是这个类重写了equals方法。 说白了,==看的是“是不是同一个东西”,equals()看的是“长得一模一样不”。可别一上来就以为equals()天然就比内容——它默认干的活儿,跟==完全一样。
基本类型用 ==,别碰 equals()
int、char、boolean 这些基本类型没有对象概念,不能调用方法。所以 equals() 根本不能用于基本类型,编译直接报错。这时候只能用 == 比较数值是否相等:
-
int a = 5; int b = 5;→a == b是 true -
boolean x = true; boolean y = false;→x == y是 false
引用类型用 ==:只认“同一个对象”
对 String、Integer、自定义类等引用类型,== 比较的是两个变量是否指向堆中同一块内存地址:
-
String s1 = "abc"; String s2 = "abc";→s1 == s2可能为 true(字符串常量池优化) -
String s3 = new String("abc"); String s4 = new String("abc");→s3 == s4一定为 false(两个独立堆对象) - 哪怕内容、字段、状态一模一样,只要不是同一个实例,== 就返回 false
equals() 要看有没有被重写
Object 类里的 equals() 底层就是 this == obj,所以没重写时它和 == 完全等价。真正起作用的是重写后的版本:
-
String重写了:比较字符序列是否一致 →s3.equals(s4)返回 true -
Integer重写了:先拆箱再比 int 值 →new Integer(100).equals(new Integer(100))是 true - 你自己的
Person类如果不重写 equals(),两个同名同龄对象调用 equals() 仍是 false
安全使用 equals() 的习惯
避免空指针是日常高频坑:
- 错:
str.equals("hello")—— str 为 null 时抛 NullPointerException - 对:
"hello".equals(str)—— 字符串字面量不会为 null,更健壮 - 或用 Objects.equals(a, b),它内部已做 null 判断

















