Java面试题 Integer与int的区别

339 阅读2分钟

int和Integer的区别

1、Integer是int的包装类,int则是java的一种基本数据类型。
2、Integer变量必须实例化后才能使用,而int变量不需要。
3、Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象;而int则是直接存储数据值。
4、Integer的默认值是null,int的默认值0;

关于Integer和int的比较

情况1

    Integer a = new Integer(127);
    Integer b = new Integer(127);
    System.out.println(a == b);//false

因为a和b是通过对Integer对象的引用,进行new操作产生了两个内存地址不同的对象,对象之间使用==实际上是在比较地址,所以是false。

情况2

   int a = 128;
   Integer b =new Integer(128);
   System.out.println(a == b);/true

因为Integer和int在进行比较时,java会将Integer自动拆包装为int类型,所以实际上是两个int变量进行比较,如果值相等的话,则结果为true。

情况3

    Integer a =127;
    Integer b =127;
    Integer c =128;
    Integer d =128;
    System.out.println(a == b);//true
    System.out.println(c == d);//false

因为当直接将基本类型赋值给包装类时,实际上使用了valueOf方法创建的对象Integer a=127;等价于Integer a = Integer.valueOf(127);而当java调用valueOf方法时如果整型大小在-128~127之间时会在缓存池生成一个整数,所以在第二次创建时,不会使用new去创建新的对象,而是将地址指向缓存池中整数所在的地址。所以如果值相等的话,即地址相同。

总结

别的情况跟上面三种类似。

Integer两种命名方法:1、使用new方法创建Integer对象

2、使用Integer的valueOf方法:如果在-128~127之间,只要创建的值相同则地址都指向缓存池中的同一区域。如果不在上述区间内则会使用方法一在堆中创建新的对象。

3、直接将整型赋值给Integer对象:与方法二相同。