今天无意中看到一个奇怪的问题,特意写篇简书记录一下
1.如题,返回值竟然是false
public static void main(String[] args) {
String a = "123";
String b = "345";
System.out.println(a.equals(a = b));
}
2.利用反汇编解密
java -c -l .class文件路径

3.a=(a==b)的执行过程
首先,要明白局部变量表和虚拟机栈是不同的位置
- a("123"的引用)入栈
- b("345"的引用)入栈
- b的拷贝("345"的引用)入栈
- 栈顶元素(b的拷贝)赋值给局部变量表中的a(不是栈中的a)
- b的拷贝出栈
- 比较栈顶两元素(a和b)
虽然局部变量表中的a已经更新为b了,但是虚拟机栈中的a还是a,所以,栈顶两元素a和b的比较结果是false。
网友评论