Java 中 == 和 equals() 的区别
1. ==
运算符
==
是 Java 中的比较运算符,用于比较两个变量的值是否相等,但具体行为取决于变量的类型:
类型 | == 比较的内容 |
---|---|
基本类型 | 直接比较值是否相等(如 int a = 5; int b = 5; a == b 返回 true ) |
引用类型 | 比较内存地址(即是否指向同一个对象),而不是对象的内容是否相同。 |
示例代码
String str1 = "hello";
String str2 = "hello";
String str3 = new String("hello");System.out.println(str1 == str2); // true(字符串常量池,同一对象)
System.out.println(str1 == str3); // false(不同对象,地址不同)int num1 = 10;
int num2 = 10;
System.out.println(num1 == num2); // true(基本类型比较值)
2. equals()
方法
equals()
是 Object
类的方法,默认实现和 ==
一样(比较内存地址),但许多类(如 String
、Integer
)重写了该方法,改为比较内容是否相同。
类 | equals() 行为 |
---|---|
Object | 默认比较内存地址(和 == 一样) |
String | 比较字符串内容(字符序列是否相同) |
Integer | 比较包装的 int 值是否相同 |
自定义类 | 如果没有重写 equals() ,则默认比较地址;建议重写以实现有意义的相等性比较。 |
示例代码
String s1 = new String("Java");
String s2 = new String("Java");System.out.println(s1 == s2); // false(不同对象)
System.out.println(s1.equals(s2)); // true(内容相同)Integer a = 1000;
Integer b = 1000;
System.out.println(a == b); // false(不同对象)
System.out.println(a.equals(b)); // true(值相同)// 自定义类
class Person {String name;Person(String name) { this.name = name; }@Overridepublic boolean equals(Object obj) {if (obj instanceof Person) {return this.name.equals(((Person) obj).name);}return false;}
}Person p1 = new Person("Alice");
Person p2 = new Person("Alice");
System.out.println(p1 == p2); // false(不同对象)
System.out.println(p1.equals(p2)); // true(name 相同)
3. 关键区别总结
对比项 | == | equals() |
---|---|---|
比较内容 | 基本类型:值 引用类型:地址 | 默认比较地址,但可重写(如 String 比较内容) |
适用场景 | 判断基本类型或引用是否指向同一对象 | 判断对象逻辑上是否“相等”(如字符串内容相同) |
是否可自定义 | 否(语言内置) | 是(可重写 equals() ) |
4. 注意事项
-
字符串比较:
-
使用
equals()
而非==
(除非明确需要比较地址)。 -
常量字符串优化:
String s1 = "abc"
和String s2 = "abc"
可能指向同一对象(常量池)。
-
-
自动装箱陷阱:
Integer a = 127; Integer b = 127; System.out.println(a == b); // true(-128~127 缓存)Integer c = 128; Integer d = 128; System.out.println(c == d); // false(超出缓存范围)
-
重写
equals()
的规范:-
自反性:
x.equals(x)
必须为true
。 -
对称性:
x.equals(y)
和y.equals(x)
结果一致。 -
一致性:多次调用结果不变。
-
非空性:
x.equals(null)
必须为false
。
-
5. 如何正确使用?
-
基本类型:用
==
(如int
、double
)。 -
引用类型:
-
如果需要比较地址(如单例模式):用
==
。 -
如果需要比较内容(如字符串、集合):用
equals()
。
-
-
自定义类:重写
equals()
(通常需同时重写hashCode()
)。
示例:安全的字符串比较
String input = getUserInput();
if ("quit".equals(input)) { // 避免 input.equals("quit") 的 NPE 风险System.exit(0);
}
理解 ==
和 equals()
的区别是 Java 面试常见考点,也是避免逻辑错误的关键!