题目
Java中字符串比较:== 和 equals() 的区别
信息
- 类型:问答
- 难度:⭐
考点
字符串比较,==运算符,equals方法
快速回答
在Java中比较字符串时:
- == 运算符:比较两个对象的内存地址是否相同(是否同一个对象)
- equals() 方法:比较两个字符串的内容是否相同(字符序列是否一致)
- 最佳实践:比较字符串内容时必须使用 equals(),避免使用 ==
原理说明
Java中字符串是对象类型:
- == 运算符:比较两个对象的内存地址(引用是否指向堆中同一对象)
- equals() 方法:String类重写了Object的equals(),改为逐个比较字符串的字符内容
- 字符串常量池机制:字面量字符串(如"hello")会被放入常量池复用,影响 == 的结果
代码示例
String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
System.out.println(s1 == s2); // true(常量池同一对象)
System.out.println(s1 == s3); // false(s3是新对象)
System.out.println(s1.equals(s2)); // true(内容相同)
System.out.println(s1.equals(s3)); // true(内容相同)最佳实践
- 比较字符串内容时必须使用 equals()
- 使用equalsIgnoreCase()忽略大小写比较
- 处理可能为null的字符串时:
"hello".equals(str)优于str.equals("hello")(避免NullPointerException)
常见错误
- 错误使用 == 比较内容:
if (input == "exit")// 可能返回false - 未考虑大小写:
"Hello".equals("hello")// 返回false - 未处理null导致崩溃:
str.equals("text")当str为null时抛出异常
扩展知识
- 字符串常量池:JVM为字面量字符串设计的特殊内存区域,减少重复对象
- intern() 方法:手动将字符串加入常量池(如
s3.intern() == s1返回true) - StringBuilder/StringBuffer:可变字符串类,比较时需先
toString()再equals()