int 和 Integer 的区别
Integer j = new Integer(0);
i == j.intValue() true;
在java1.4以及以前版本内 基本类型int double 等是不能直接放入List, Map等的,必须转换成Integer 或者 Double类型才可以
在java中,
1.int是基础数据类型,Integer是包装类型
2.int初始化值为0,Integer是null
3.int存储在栈中,Integer实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象,对象保存在堆中
4.Integer变量和int变量比较,见如下代码
int i = 100;
int j = 100;
// true,基础数据对比
System.out.println(i == j);
Integer i1 = new Integer(100);
Integer j1 = new Integer(100);
// false,新建对象,指针指向堆中不同的地方
System.out.println(i1 == j1);
Integer i2 = 100;
Integer j2 = 100;
// true,范围在-128~127之间,数据会被缓存,即不会new了
System.out.println(i2 == j2);
// true,int和Integer对比,会自动进行拆装箱操作,Integer自动拆箱为int,
System.out.println(i == i1);
System.out.println(i == i2);
// false,new Integer() 指向堆中对象,非new指向常量池中对象
System.out.println(i1 == i2);
Integer i3 = 128;
Integer j3 = 128;
// false,范围在-127~127之间,数据会被缓存,128超出范围
System.out.println(i3 == j3);
以上为何非new Integer 声明的变量在-128~127会被缓存,主要是因为创建对象的过程中java内部会自动调用Integer的valueOf()方法返回对象的整数,查看valueOf的源码发现,整数范围在-128~127会被缓存:
public static Integer valueOf(int i) {
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
IntegerCache.low=-128
IntegerCache.high=127