c语言integer和int,Integer和int基本类型的比较

先看几行代码

Integer a1 = 100;

Integer a2 = 100;

System.out.println("a1==a2:" + (a1 == a2));

Integer b1 = 200;

Integer b2 = 200;

System.out.println("b1==b2:" + (b1 == b2));

Integer c1 = new Integer(100);

Integer c2 = new Integer(100);

System.out.println("c1==c2:" + (c1 == c2));

int d1 = 100;

Integer d2 = new Integer(100);

System.out.println("d1==d2:" + (d1 == d2));

a1==a2:true

b1==b2:false

c1==c2:false

d1==d2:true

大家的答案是否和显示的相同呢,如果和你想象的不同,那又是为什么会产生这种情况呢?

包装类型

这里我们重复什么是包装类型,什么是基本类型了。

包装类型的解释:

当我们对两个基本类型进行比较时,JVM是直接比较他们的他们的值

int a = 10;

int b = 10;

System.out.println(a == b);//true

当我们对两个包装类型比较时,JVM通过比较他们的地址来判断是否是同一个对象。例如下面的而例子,c1和c2都是new出来的新对象,因此c1==c2的值肯定不同,他们只是拥有相同value值的Integer对象。

Integer c1 = new Integer(100);

Integer c2 = new Integer(100);

System.out.println("c1==c2:" + (c1 == c2));//false

当我们对两个包装类型比较时,还有一种情况,就是不通过new来创建Integer,而是通过JVM自动把int基础类型转换成Integer对象(下面称为封包)。如以下例子:

Integer a1 = 100;

Integer a2 = 100;

System.out.println("a1==a2:" + (a1 == a2));//true

Integer b1 = 200;

Integer b2 = 200;

System.out.println("b1==b2:" + (b1 == b2));//false

为什么两个几乎一样的代码结果不同呢?让我们来看下JVM的指令操作:

46f669907b7c

In1.png

从上图可以看出,在封包的过程中其实就是调用了Integer.valueOf()方法把int基本类型转换成了Integer对象。

public static Integer valueOf(int i) {

//IntegerCache.low=-128,IntegerCache.high=127

if (i >= IntegerCache.low && i <= IntegerCache.high)

return IntegerCache.cache[i + (-IntegerCache.low)];

return new Integer(i);

}

在valueOf方法中对i进行了判断,如果在[-128,127]之间会从缓存中取出相应的Integer对象,而不是重新new一个Integer对象,所以当我们比较100的时候是返回的true,而200则是返回的是false。

当我们把一个Integer和一个int对象比较时,是通过从Integer取出value和int值比较

int d1 = 100;

Integer d2 = new Integer(100);

System.out.println("d1==d2:" + (d1 == d2));

46f669907b7c

int2.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值