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
(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了。