全文详见个人博客:https://www.coderli.com/string-compare-equals/
字节码分析-Java中String用==判断值相等一定是错的么经常听到有同学讨论,在Java中String判断值相等应该用equals()而不能用==,并且分析的信誓旦旦。那么真相真的是这样么?==就完全不能用么?Java内部的原理究竟是如何呢?这需要理解它们背后的原理。下面是详细的原理分析:https://www.coderli.com/string-compare-equals/加入群聊,大佬免费带飞:【Java学习交流(982860385)】
经常听到有同学讨论,在Java中String判断值相等应该用equals()而不能用==,并且分析的信誓旦旦。那么真相真的是这样么?==就完全不能用么?Java内部的原理究竟是如何呢?这需要理解它们背后的原理。下面是详细的原理分析:
一、Java中运算符含义
Java中== 运算符的含义
- 在 Java 中,== 操作符用于比较两个对象的引用,换句话说,它判断的是两个对象是否指向同一个内存地址。
- 如果 == 用于比较两个字符串,它实际上是比较这两个字符串对象是否是同一个对象。
Java中equals含义
在Java中,equals方法用于比较两个对象是否“相等”。默认情况下,equals方法由Object类提供,并且它比较的是对象的引用,即两个对象的内存地址是否相同。因此,除非被覆盖,equals方法的默认行为是检查两个对象是否是同一个实例。
二、Java中String对象的处理
用 == 比较字符串值是否相等
情况一:直接赋值
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2); // true
在这个例子中,str1 和 str2 是相同的字符串字面量,Java 编译器会把它们优化到字符串池中,因此它们指向同一个内存地址,所以 == 返回 true。 为了印证这个结论,我们查看编译后的字节码如下:
package com.coderli.jdk.basic;
public class StringEqualMain {
public static void main(String[] args) {
String str1 = "Hello";
String str2 = "Hello";
System.out.println(str1 == str2);
}
}
编译这段代码后,你可以使用javap命令来查看生成的字节码:
javap -c StringEqualMain
输出的字节码如下: