java中的 == 号判断,为什么基本数据类型就是比较内容,而对象则是比较地址?

1891 2020-08-22 11:42

 

java中的 == 号判断,为什么基本数据类型就是比较内容,而对象则是比较地址?

比如String 的 == 就是比较地址,Object的equals方法是利用 == String类重写了equals方法,才使得变成了比较内容,其实我想问的是JVM怎么实现这两种不同的机制的?不都是== 么?

 

与 c++对比一下就很好回答这个问题了。

java里根本没有直接暴露出来的对象,你看到的所谓对象,术语上都叫引用(Reference)。用c++的话来说,java里没有对象,只有指针。

用一段代码来解释,java里的
Object xxx = new Object();
换到c++里就是
Object *xxx = new Object();

但是java不像c#那样搞了万物皆对象,设计者出于性能考虑,做了一点trade off。常用的类型是直接以值方式呈现出来的,也就是所谓的primitive type了。

用代码来说,java的int,放到c++里,仍然是int。其包装类就不一样了,Integer放到c++里,应该是Integer*。

看到这里你应该发现了,object之间比较是比较引用是否相等,是一件非常自然的事情。用c++的语言来说,整数之间就比较值,指针就比较里面存的地址(实际上没有区别),在语义上是保持了一致性的。如果指针之间比较,反而还要解引用,然后再去调用引用对象上某个方法,你不觉得这才是割裂了==这个操作符吗?


作者:青铜
链接:https://www.zhihu.com/question/29451160/answer/294179406
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

全部评论

·