非原创:引自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了