题目
String对象比较:==与equals()的区别
信息
- 类型:问答
- 难度:⭐
考点
字符串常量池,String不可变性,==操作符,equals方法
快速回答
在Java中比较字符串时:
==比较对象的内存地址是否相同equals()比较字符串的内容是否相同- 字符串字面量会存储在常量池中复用
- 使用
new String()会强制创建新对象
原理说明
Java中的字符串具有不可变性,且通过常量池优化内存使用:
- 字符串常量池:JVM维护的特殊内存区域,存储唯一的字符串字面量
- ==操作符:比较两个对象的内存地址是否相同
- equals()方法:String类重写该方法,比较字符串的字符序列内容
代码示例
String s1 = "abc"; // 常量池创建"abc"
String s2 = "abc"; // 复用常量池中的"abc"
String s3 = new String("abc"); // 强制在堆中创建新对象
System.out.println(s1 == s2); // true(地址相同)
System.out.println(s1 == s3); // false(地址不同)
System.out.println(s1.equals(s3)); // true(内容相同)最佳实践
- 比较字符串内容时必须使用equals()而非==
- 优先使用字面量赋值(
String s = "text")以利用常量池优化 - 避免不必要的
new String()创建额外对象
常见错误
- 误用==比较内容:
if (input == "exit")可能导致逻辑错误 - 忽略大小写比较:应使用
equalsIgnoreCase() - 未处理null:
str.equals("text")在str为null时抛出NullPointerException
扩展知识
- 字符串驻留(intern):
s3.intern()可将堆中字符串加入常量池 - 编译器优化:
String s = "a" + "b"会被编译为String s = "ab" - StringBuilder:频繁修改字符串时应使用StringBuilder避免创建中间对象