Java Integer的数值比较

环境

  • Windows 11 专业版
  • Java 21

问题

下面这段代码的运行结果是什么?

        Integer i1 = 0;
        int i2 = 0;
        for (int n = 0; n < 200; n++) {
            if (i1 != i2) {
                System.out.println("i1 = " + i1 + ", i2 = " + i2);
                break;
            }
            i1++;
            i2++;
        }

        Integer i3 = 0, i4 = 0;
        for (int n = 0; n < 200; n++) {
            if (i3 != i4) {
                System.out.println("i3 = " + i3 + ", i4 = " + i4);
                break;
            }
            i3++;
            i4++;
        }

答案

运行结果如下:

i3 = 128, i4 = 128

说明

Integer 是一个引用类型,它包装了基本(primitive)数据类型 int 。对于Integer类型,在 -128127 这个区间的值,Java会将其缓存起来。

所以,当使用 == 比较两个Integer对象时:

  • 如果它们的值在这个缓存区间内,实际上比较的是缓存中的同一个对象,所以表现为比较数值。
  • 当Integer对象的值大于127或者小于-128时,每次创建Integer对象都是一个新的对象, == 比较的是对象的引用,而不是对象所包装的数值。

如果是Integer和int做数值比较,那么Integer会自动拆箱(unboxing)为int,所以可以直接用 == 来比较。

注:要留意Integer对象为null的情况。

解决办法

要对Integer做数值比较:

  • equals() :Integer类重写了Object类的equals()方法,用于比较两个Integer对象所包装的数值是否相等。
  • intValue() :直接转换为int类型

其它

需要注意的是,如果使用了 List 等数据结构,其中的元素都是对象,例如:

list1.add(1234);

它会自动装箱(boxing),实际存储的元素是Integer类型。如果要对List里面的元素做数值比较,别忘了转换为int类型。

总结

  • Integerint 做比较时,可以直接用 == 来判断
  • IntegerInteger 做比较时,最好用 equals() 方法做比较,或者转化为 intValue() 进行数值比较
  • 集合里存储的都是 Object ,对于 int 数值会自动装箱为 Integer ,在读取元素时,别忘了是 Integer 类型的,若要比较数值,最好转换为int类型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值