int 与 Integer的区别

int和Integer对象的比较

(1).Integer是int的包装类;int是基本数据类型;Integer1和String一样都是别人封装的类,都是引用数据类型。

(2).Integer变量必须实例化后才能使用,int变量不需要;

    例:ArrayList<Integer> a = new ArrayList<>();

(3).Integer实际是对象的引用,指向new的Integer对象,int 是直接存储数据值;

(4).Integer的默认值是null;int的默认值是0。

Integer变量和Integer变量、Integer变量和int变量的比较:

  (1)由于Integer变量实际上是对一个Integer对象的引用,所以两个通过new生成的Integer变量永远是不相等的(因为new生成的是两个对象,其内存地址值不同)。

Integer i= new Integer(100);

Integer j = new Interger(100);

System.out.println(i == j);//false

Integer和Integer对象内存图解

(2)Integer变量和int变量比较时,只要两个变量的值是相等的,则结果为true(因为包装类和基本数据类型int比较时,java会自动拆包装为int,然后进行比较,实际上就变为两个变量值的比较);

Integer i = new Integer(100);

int j =100;

System.out.println(i ==j);//true

 

(3)非new生成的Integer变量和new Integer()生成的变量比较时,结果为fals。(因为非new生成的Integer变量指向的是java常量池中的对象,而new Integer()生成的变量执行堆中新建的对象,两者在内存中的地址值不同)

 

Integer i = new Integer(100);
Integer j = 100;
System.out.print(i == j); //false

 

(4)对于两个非new生成的Integer对象,进行比较时,如果两个变量的值在区间-128到127之间,则比较结果为true,如果两个变量的值不在此区间,则比较结果为false

Integer i = 100;

Integer j = 100;

System.out.print(i == j); //true

Integer在进行自动拆装箱(jdk1.5之后)的时候,编译器会使用Integer.valueOf()来构建Integer实例;在valueOf()构建Integer实例的过程中是通过IntegerCache来实现的,IntegerCache值的范围是-128到1237(byte)。在这个范围内是直接返回数值,这个数值是放置于java内存的栈区的,不需要生成对象。

Integer i = 128;

Integer j = 128;

System.out.print(i == j); //false

而当值大于127的时候就ew Integer(i)生成了新的对象,而生成的对象防止在堆区,也就是说指向了两个不同的内存地址。java API中对Integer类型的valueOf的定义如下,对于-128到127的数,会进行缓存,比如Integer i= 127时,会将127进行缓存,下次再写Integer j = 127是,就会直接从缓存中取值,就不会new了。

 

posted @ 2020-11-21 23:06  寒江雨  阅读(402)  评论(0编辑  收藏  举报