美文网首页
int和Integer的区别

int和Integer的区别

作者: Simple_a | 来源:发表于2019-03-12 23:08 被阅读0次

1、int是java中的一种的基本数据类型,Integer是int的包装类;

2、int直接存储数据,而Integer则是存储的指向对象的地址;

3、int的初始值为0,Integer的初始值为null。

场景分析

1、由于Integer是实例化一个对象的引用,所以通过new关键字实例化的两个Integer对象,一定不同(存储的地址不一样)

Integer i1 = new Integer(100);

Integer i2 = new Integer(100);

false

2、当Integer变量和int变量进行比较时,只要值相同,一定返回true。(因为包装类Integer和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个int变量的比较)

Integer i1 = new Integer(999);

int i2 =  999;

ture

3、非new生成的Integer变量和new生成的Integer对象进行比较,一定不相等。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向堆中新建的对象,两者在内存中的地址不同)

Integer i1 = 100;

Integer i2 = new Integer(100);

false

4、当对Integer变量直接赋值时(Integer i = 100;),如果int类型值和他相同,且在[-128, 127]内,那么进行比较会返回true

Integer i1 = 100;
 
int i2 = 100;

true

关于第四种情况,下面给出解释:

java在编译 Integer i = 100 ; 时,会翻译成为 Integer i = Integer.valueOf(100);,而java API中对Integer类型的valueOf的定义如下:
至于为什么会出现这种情况,可以看看下面的代码:

public static Integer valueOf(int i){
    assert IntegerCache.high >= 127;
    if (i >= IntegerCache.low && i <= IntegerCache.high){  // 如果范围在[-128, 127]内
        return IntegerCache.cache[i + (-IntegerCache.low)];  
    }
    return new Integer(i); // 不在那个范围则在堆中创建一个Integer对象
}

java对于[-128, 127]内的数,会进行缓存(放在常量池,这就是基本数据类型的原理),如执行Integer i1 = 100语句时,会将100进行缓存,下次再写Integer i2 = 127时,就会直接从缓存中取。

相关文章

网友评论

      本文标题:int和Integer的区别

      本文链接:https://www.haomeiwen.com/subject/fxfapqtx.html