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

来源:互联网 发布:机器视觉定位算法 编辑:程序博客网 时间:2024/06/05 22:44
基本类型都是存在栈里面的,Int a=3;当你int b=3的时候,jvm会干嘛呢?首先,它会去栈里面找是不是已经有一个数据为3了。如果不是的话新建一个地址,是的话,就把b指向这个地址,所以对于基本类型来说,当值相同的时候,地址也是相同的,所以当你对基本类型==的时候,内容相同的肯定返回的是true。。因为实质上,他们的地址也是相同的
但是对于其他类型,都是存在堆里面的动态分配内存,所以每一次新建一个数据都会动态分配一个内存地址,所以==的时候,当然内存地址是不一样的。
要记住,==永远是用来比较内存中的地址的,基本类型感觉上是在比较内容,实际上还是在比较地址!


作者:Mao Bravo
链接:https://www.zhihu.com/question/29451160/answer/45024115
来源:知乎



为什么基本数据类型就是比较内容,而对象则是比较地址?

这个问题可以参考享元模式,这个设计是为了避免大量拥有相同内容对象的内存开销。

比如下面这个例子

        Integer i1 = 20;        Integer i2 = 20 ;        System.out.println(i1 == i2);  // true        Integer i3 = 200;        Integer i4 = 200 ;        System.out.println(i3 == i4);  // false

Integer i1 = 20; 其实是一个自动装箱的过程,编译器会自动展开成Integer i = Integer.valueOf(20);详情可以看Integer.valueOf的源代码,可以看到参数的值在IntegerCache.low(默认-128) 到 IntegerCache.high(默认127)范围内时(比如20),会从IntegerCache.cache中直接取(此处参考Integer的内部类IntegerCache的源代码,如果不配置的话,默认是cache存储-128到127的Integer),所以取到的都是同一个Integer的对象,因此相同。而200不在-128到127范围内,所以会new 一个新的Integer,故不相同。

作者:于光荣
链接:https://www.zhihu.com/question/29451160/answer/44870700
来源:知乎


0 0