1.基本使用对比
int是基本数据类型,Integer是int的包装类;
int不需要实例化就可使用,Integer需要实例化才能使用;
int直接储存数据值,Integer是引用类型,是对象的地址;
int默认为0,integer默认为null。
int与Integer的深入对比
a.由于Integer变量是对象的引用,所以两个new出来的Integer变量是不相等的,因为其内存地址不同。
Integer i = new Integer(10);
Integer j = new Integer(10);
i==j;//false
b.Integer和int比较时,当两个变量值相等时,才输出true。(因为当Integer和基本数据类型int比较时,java会自动拆包装为int,实际上就是两个int比较。)
Integer i = new Integer(10);
int j = 10;
i==j;//true
c. new Integer()生成的变量和非new出来的Integer变量比较结果为不相等。(因为new Integer()生成的变量指向的是堆中新建的对象,而非new的Integer变量指向java常量池中的对象。内存中的地址不同)
Integer i = new Integer(10);
Integer j = 10;
i==j;//false
d.两个非new的Integer对象比较,若两变量值在-128到127之前则相等,若超出此范围则不相等。(因为java在编译Integer i = 127 时的翻译是 Integer i = Integer.valueOf(127)。而java API对Integer的valueOf的定义是,在-128到127之间的数会缓存,在第一次Integer i =127时缓存,第二次Integer j = 127时,直接从缓存中获取,两次的地址相当于一样。)
Integer i = 127;
Integer j = 127;
i==j;//true
Integer a = 128;
Integer b = 128;
a==b;//false
java为每个原始类提供了封装类(还有自动 装箱和拆箱 机制)
基本数据类型: boolean, char, byte, short, int, long, float, double。
封装类类型: Boolean, Character, Byte, Short, Integer, Long, Float, Double。
自动装箱:将基本数据类型重新转化为对象
public class test{
public static void main(String[] args){
Integer a = 9;
//上面的声明时就用到了自动装箱:解析 Integer a = new Integer(9); 如此一来a就可以调用对象所声明的所有方法了。
}
}
自动拆箱:将对象重新转化为基础数据类型
public class test{
public static void main(String[] args){
Integer a = 9;
a--;
//a-- 计算时就用到了自动拆箱。因为对象是不可以直接进行计算的,要先转化为基础数据类型。
//还有int b = a;也用到了自动拆箱
}
}
深入分析
例:
public class test{
public static void main(String[] args){
Integer i = 127; Integer j = 127; i==j;//true
Integer a = 128; Integer b = 128; a==b;//false
//java对Integer和int的自动装箱和拆箱有一种享元模式。 -128到127之间的值会被放入内存中可重用,最终这个范围的值只存一个对象,而超过该范围的值不会被重用,每次都会new一个新的。
}
}