Java Integer和int的区别

int 是基础类型,Integer是引用类型,是int的包装类型。
int使用的是值传递。Integer使用的是引用传递。

java的基础类型都有对应的包装类型。

因为int是基础类型,所以int是分配在常量区。Integer是引用类型,所以它是分配在堆里面的。

类装载的时候,在类加载阶段。会将int类型的变量赋值为0 ,如果初始化阶段没有赋值的话,那么int类型的变量的初始值就是0 。 对于对象类型,在类加载阶段,会赋值为null, 所以在初始化阶段如果没有指定值的话,那么Integer类型的变量初始的值就是null。

使用int类型有3种方式

//直接声明变量赋值。
int i = 1;  

//这里由于自动装箱拆箱,所以可以直接将值赋值给对象。
//这里编译过后会变成 Integer i1 = Integer.valueOf(1);
Integer  i1 = 1; 

//使用new创建对象。
Integer i2 = new Integer(1);

int和Integer的对比如下



    public static void main(String[] args) {

        int i1= 1;
        Integer i2 = 1;
        Integer i3 = new Integer(1);


        //true 因为i2会被自己拆箱成1
        System.out.println( i1 == i2);

        //true 因为i3会被自己拆箱成1
        System.out.println( i1 == i3);

        //false 因为Integer会自动在类加载的时候,自动生成一个Integer数组,保存着 -128 ~ 127 的对象
        //i2 会被编译成 i2= Integer.valueOf(1); valueOf方法会去获取预先缓存的 -128 ~ 127 对象。
        // 所以这里判断的是 i2(这个在加载阶段就创建的Integer对象) 和 i3(在执行阶段才创建的对象) 是否同一个对象,当然不是同一个对象。
        System.out.println( i2 == i3);


        Integer i4 = 2;
        Integer i5 = 2;

        //true 因为i4 和 i5 都是Integer类缓存的对象。
        System.out.println(i4 == i5);


        Integer i6 = 128;
        Integer i7 = 128;

        //false ,因为i6 和 i7都大于127。所以是new出来的对象,而不是缓存的对象。
        System.out.println(i6 == i7 );


        Integer i8 = new Integer(3);
        Integer i9 = new Integer(3);
        //false i8 和 i9都是new出来的对象,是不同的引用。所以是false
        System.out.println(i6 == i7 );

        //true  equals方法是获取int值进行对比。 他们的值都是3 所以是true
        System.out.println(i8.equals(i9));


    }

需要增加的理解: 自动装箱和拆箱

你可能感兴趣的:(Java Integer和int的区别)