侧边栏壁纸
博主头像
colo

欲买桂花同载酒

  • 累计撰写 1823 篇文章
  • 累计收到 0 条评论

String对象比较:==与equals()的区别

2025-12-13 / 0 评论 / 4 阅读

题目

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避免创建中间对象