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

基本类型都是存在栈里面的,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
来源:知乎


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值