讲明白 == 和 equals 的区别
java 面试和笔试中经常会问到 == 和 equals 的区别,
== 判断是否为同一引用
equals 判断值相等
是这样吗?表面上貌似没问题,但是不能只看表象,知其然要知其所以然。
小测验:
结果:
这样的结果有没有想到呢?
最近有一个小文章带着我探入根源,我也就自己验证一下,毕竟没有实践就没有发言权
将编译后的class文件反编译了一下发现
编译器将所有的值都进行了 valueOf()处理
valueOf() 方法到底是什么鬼?
由此可见,传入的参数 和 IntegerCatch.low Integer.high 进行比较,在这个区间的返回一个计算过的值,越界的就重新 new 了一个对象
如果重新 new 了,就说明是两个对象,分别指向两个引用, == 比较肯定是 false
由示例可以看出 100 在区间内, 1000 越界了。
那么IntegerCatch.low 和 Integer.high 又是什么鬼?
代码只看这么多,由此可见,IntegerCatch.low = -128 , Integer.high = 127.
这也就是 1000 比较为 false 的真相
那么equals 是如何对比的呢?
由源码可以看出,equals 比较的时候,会先判断是否为同一引用,如果是则返回 true ;
如果不是,会判断数据类型是否为String ,然后进行字符比对;字符相同返回 true;
由此可见,相同引用内容一定相同,内容相同不一定是同一引用
这也是 == 与 equals 的比较方式与区别。
难得糊涂,努力明白