Integer和int类型值比较

今天复习时,遇到了Integer类型与int类型的值比较,就写了一段代码来测试一下结果:

public class Test9 {
    public static void main(String[] args) {
        Integer i01 = 12;  
        int i02 = 12;//基本数据类型
        Integer i03 = Integer.valueOf(12);//此处就相当于是Integer i03 =12;
        Integer i04 = new Integer(12);

        System.out.println(i01==i02);//true
        System.out.println(i03==i04);//false
        System.out.println(i01==i04);//false
        System.out.println(i02==i04);//true
        System.out.println(i01==i03);//true
        System.out.println(i02==i03);//true
    }
}

下面我们就来一一说下这些结果的原理吧:
(1)

 System.out.println(i01==i02);//true

Integer i01 = 12;
int i02 = 12;
Integer属于包装类,int属于基本数据类型;
只要Integer和int类型的值进行 == 比较,就会将Integer包装类拆箱为int类型,
所以当进行 i01==i02比较时,就相当于两个int类型的值进行比较;
基本数据类型与基本数据类型进行比较,就是比较值的内容;

(2)

System.out.println(i03==i04);//false

Integer i03 = Integer.valueOf(12); 此处就相当于是Integer i03 =12;
Integer i04 = new Integer(12);

首先,我们要先明确一件事:
对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象;
i03和i04都是Integer对象,两个Integer对象进行比较;
i03是一个Integer对象,因为i03是用直接赋值法产生的对象,它会将该对象放入IntegerCache.cache中,
i04是使用new产生的对象,会重新创建一个堆空间,不会复用IntegerCache.cache中的对象,与 String的直接赋值法创建对象和使用new创建对象一样的原理;

所以i03==i04的结果为false;
(3)

  System.out.println(i01==i04);//false

Integer i01 = 12;
Integer i04 = new Integer(12);
该原理与(2)一样;

(4)

 System.out.println(i02==i04);//true

int i02 = 12;
Integer i04 = new Integer(12);
只要Integer(不管是直接赋值法还是new的)和int类型的值进行 == 比较,就会将Integer包装类拆箱为int类型,与(1)一样;
(5)

 System.out.println(i01==i03);//true

Integer i01 = 12;
Integer i03 = Integer.valueOf(12);相当于 Integer i03=12;

两个Integer类型进行比较,当创建i01对象时,会将该对象放入IntegerCache.cache中,当创建i03时,因为不是new创建的,所以会引用IntegerCache.cache中的i01对象,所以i01和i03是指向堆中的同一个对象;
所以结果为true;
(6)

  System.out.println(i02==i03);//true

int i02 = 12;//基本数据类型
Integer i03 = Integer.valueOf(12);//此处就相当于是Integer i03 =12;
原理和(1)相同;

综上所述:
(1)对于 Integer var = ? 在-128 至 127 范围内的赋值,Integer 对象IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象;

(2)只要Integer(不管是直接赋值法还是new的)和int类型的值进行 == 比较,就会将Integer包装类拆箱为int类型;

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值