讲明白 == 和 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 的比较方式与区别。

 

 

 难得糊涂,努力明白

 

posted @ 2017-07-13 18:00  江湖一笑  阅读(443)  评论(0编辑  收藏  举报