Java对象的比较,仔细读一下会发现不一样的世界呦!

版权声明:本文为HCG原创文章,未经博主允许不得转载。请联系[email protected] https://blog.csdn.net/qq_39455116/article/details/86743124
package neicun;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
public class TestHeap {
		//猜一猜打印的结果
    public static void main(String[] args) {
       TestHeap t1 =new TestHeap();
       TestHeap t2 =new TestHeap();
     
        System.out.println(t1==(t1=t2));
        System.out.println((t1=t2)==t1);
   
    }
}

答案是:
false
true

为什么

//判断换内存地址之前的t1,是不是全等于一个换了内存地址的t1,答案是:false
System.out.println(t1==(t1=t2));  
//把t1的内存地址换过之后,
// 判断换过地址之后的t1是否等于换过内存地址之后的t1
//答案是:两个都是换过的,true
System.out.println((t1=t2)==t1);

本质问题?

1.其实就是道脑筋急转弯问题
2.但是透过现象看本质,其实是出现了三个问题
	3.1 内存指针的分配,当指向t1 =t2的时候,会把t1的内存地址指向t2
	3.2 ==比较的是内存地址
	3.3 == 和括号优先级的问题,也是本题中最重要的
		t1==(t1=t2) ,虽然括号的优先级要高于==,但是别要忘记代码执行的顺序:从左向右
		也就是说在括号执行前t1已经取出来了,放在了那里,然后再执行括号里面的,最后才进行比较

t1==(t1=t2) 执行顺序总结

顺序总结:
  (1) 取 t1
   (2) 执行括号里面的,换t1地址
 (3)比较换地址之前的t1和换地址之后的t1
*/
哈哈哈,一个小问题,如果关注不到其中任意一个点,都会出现问题,哈哈哈哈哈哈哈哈哈
。。。。。。。。。。。。。。

猜你喜欢

转载自blog.csdn.net/qq_39455116/article/details/86743124