面试题解六 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

posted @ 2020-08-08 13:29  TidalCoast  阅读(323)  评论(0编辑  收藏  举报