int 与Integer的区别

非原创:引自https://www.cnblogs.com/guodongdidi/p/6953217.htmlhtml

1.Integer是int的包装类,int是java的一种数据类型java

2.Integer的变量必须实例化后才能使用,而int变量不须要缓存

3.Integer实际是对象的引用,当new一个Integer时,其实是生成一个指针指向此对象;而int 是直接存储数据值翻译

4.Integer的默认值是null,int的默认值是0指针

关于Integer和int的比较htm

1.因为Integer变量其实是对一个Integer对象的引用,因此两个经过new生成的Integer变量永远不相等(由于new生成的是两个对象,其内存地址不一样)对象

Integer i= new Integer(100);blog

Integer j= new Integer(100);内存

System.out.print(i==j);//false编译

2.Integer 与int 变量进行比较时,只要两个变量的值是相等的,则结果为true,这是由于包装类Integer与基本数据类型int比较时,java会自动拆包装为int,而后进行比较,实际上就变为两个int的比较。

int i= 100;

Integer j= new Integer(100);

System.out.print(i==j);//true

3.非new生成的Integer变量和new Integer()生成的变量比较时,结果为false。这是由于非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量指向的堆中新建的对象,二者在内存中的地址不一样。

Integer i = new Integer(100);

Integer j = 100;

System.out.print(i==j);//false

4.对于两个非new生成的Integer对象,进行比较时,若是两个变量的值在区间-128到127之间,则比较结果为true,若是两个变量不在此区间,则结果为false。

Integer i=100;

Integer j=100;

System.out.print(i==j);//true

 

Integer i=128;

Integer j=128;

System.out.print(i==j);//false

这是由于java在编译Integer i= 100;时会翻译为Integer i=Integer.valueOf(100);

而javaApI中对Integer类型的valueOf的定义以下:

public static  Integer valueOf(int i){

    assert IntegerCache.high >=127;

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

return IntegerCaahe.Cache[i + (-IntegerCache.Low)];

}

return new Integer(i);

}

java对-128到127之间的数会进行缓存,Integer i=127时,会将127进行缓存,下次再写Integer j = 127时,会直接从缓存中读取,就不须要new了

相关文章
相关标签/搜索