java int 比较问题_JAVA中Integer类型变量比较问题

今天在做实验的时候,发现了一个比较奇怪的问题:两个Integer型变量用==进行比较时,有时候能成功有时候不能成功。举个例子:

代码1:

Integer l1 = 122;

Integer l2 = 122;

if(l1 == l2)

System.out.println("Right");

else

System.out.println("Wrong");

运行这段代码时,程序会输出:Right。对于另一个例子:

代码2:

Integer l1 = 233;

Integer l2 = 233;

if(l1 == l2)

System.out.println("Right");

else

System.out.println("Wrong");

运行这段代码时,程序会输出Wrong。但当对代码2进行修改时:

代码3:

Integer l1 = 233;

int l2 = 233;

if(l1 == l2)

System.out.println("Right");

else

System.out.println("Wrong");

在运行这段代码时,程序会输出Right。如果换一种定义方式时:

代码4:

Integer l1 = 233;

Integer l2 = new Integer(233);

if(l1 == l2)

System.out.println("Right");

else

System.out.println("Wrong");

运行这段代码时,程序会输出Wrong。

关于这种现象,查了下资料,总结如下:

1.实际上Java中定义的Integer变量会通过Integer.valueOf()方法生成一个实例,即:

Integer l1 = 122 会被编译成 Integer l1 = Integer.valueOf(122),而关于valueOf()方法的源码:

public static Integer valueOf(int i) {

assert IntegerCache.high >= 127;

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

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

return new Integer(i);

}

看一下源码就会明白,对于-128到127之间的数,会进行缓存,Integer l1 = 122时,会将122进行缓存,下次再写Integer l2 = 122时,就会直接从缓存中取,就不会new了,相当于生成的为同一个对象,。所以代码1的运行结果是Right。

而对于这个范围之外的数值,valueOf()相会重新new一个对象,所以就不相等了,所以代码2的裕兴结果就是Wrong。

2.对于代码3,Integer型变量与int型变量进行比较时,实质上是把Integer类型变量拆箱成int类型,然后进行比较,相等则返回true,否则返回false。此处的拆箱调用的是intValue()方法。所以代码3的运行结果是Right。

3.对于代码4,就比较好解释了,因为new相当于重新定义了一个新的对象,

4.总之,要想比较两个Intger型变量的值最好用Integer.intValue()方法生成int型后再比较。

5.Integer型变量与int型变量之间可以直接比较,此时自动进行拆箱操作。

参考:

3.《JAVA核心技术》

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值