面试题解六 int 和 Integer 的区别(基本数据类型和包装类)
int 和 Integer 的区别(基本数据类型和包装类)
int是基本数据类型,直接存储数值,Integer是引用类型,保存的是地址,而且int的初始值是0;Integer是引用类型的对象,保存的是对象的地址,Integer对象的默认值是null。java是面向对象的编程,为编程的方便才引入了不是对象的基本数据类型,但是为了将这些对象当做对象来操作,java引入了包装类类型,int的包装类就是Integer,每种基本类型都有对应的包装类。
包装类的关系图:
jdk1.5版本开始就引入了自动装箱和自动拆箱机制,使得基本数据类型和包装类类型二者之间可以相互转换,java为每个基本类都提供了包装类型
基本数据类型:boolean、char、byte、short、int、long、float、double
包装类类型:Boolean、Character、Byte、Short、Integer、Long、Float、Double
关于自动装箱和拆箱的例子:
public static void main(String[] args) {
Integer a1 = 10, a2 = 10;
Integer b1 = 150, b2 = 150;
System.out.println(a1 == a2);
System.out.println(b1 == b2);
}
运行结果为:
a1、a1、b1、b2四个变量都是Integer对象,所以用==运算符比较的不是值而是引用,当我们给Integer赋int类型的值时,就会发生自动装箱的现象,把基本类型包装成引用类型,然后会调用Integer类的静态方法valueOf,valueOf的源码如下:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache是Integer的内部类,其代码如下所示:
Integer内部实现了一个缓存机制,缓存机制的范围从-128~127之间(这是默认设置,可以进行设置),当被赋值的int值在这个范围内的时候,就直接从缓存池中取,也就是说,如果赋值的值在设置的范围内(-128,127),那么就不会new新的对象,直接从常量池中引用Integer对象,如果超过了就会创建新的对象,所以a1 == a2的值是true,b1 == b2的值是false