Integer与int类型的关系,可以简单的回答,Integer是int的包装类,int的默认值是0,而Integer的默认值是null(jdk1.5的新特性 自动装箱和拆箱,Integer.valueOf() 和xx.intValue() ),需要注意的是Integer里面默认的缓存数字是
-128-127
,1、Integer与Integer相互比较,数据在-128-127
范围内,就会从缓存中拿去数据,比较就相等;如果不在这个范围,就会直接新创建一个Integer对象,使用 == 判断的是两个内存的应用地址,所以自然不相等。2、Integer和int类型相比,在jdk1.5,会自动拆箱,然后比较栈内存中的数据,所以没有不想等的情况
Integer函数查看
Integer的valueOf函数,在我们可以看到,会去判断这个值是否是在IntegerCache中,如果i在(-128到127)之间,就会返回缓存对象,如果不是就会重新new 一个Integer对象
这是非常有趣的地方。如果你查看Integer.java类,你会找到IntegerCache.java这个内部私有类,它为-128到127之间的所有整数对象提供缓存。
重点:
1.Java里面“==”与equals()的区别:前者比较的是地址,后者比较的是内容。
2.int 是在栈里创建的,Integer是在堆里创建的。栈里创建的变量要比在堆创建的速度快得多。
3.基本数据类型byte、short、int、long、float、double、boolean、char 都是不能在堆中创建内存
public static Integer valueOf(int i) {
assert IntegerCache.high >= 127;
if (i >= IntegerCache.low && i <= IntegerCache.high)
return IntegerCache.cache[i + (-IntegerCache.low)];
return new Integer(i);
}
获取Integer中缓存数字
在加法和减法中,计算后的结果会先看是否在Integer中是否有缓存,如果有,就返回索引的地址,如果没有,就会直接反悔new Integer()
对象
public static void main(String [] args) throws Exception{
//获取声明的对象
Class intClazz= Integer.class.getDeclaredClasses()[0];
//获取cache字段
Field myCache = intClazz.getDeclaredField("cache");
//设定可以修改cache字段
myCache.setAccessible(true);
//获取cache字段中缓存的数据
Integer[] newCache = (Integer[]) myCache.get(intClazz);
//cache 里面存储的就是-128 到127的字段
//打印Integer 中缓存的数字
System.out.println(Arrays.asList(newCache));
//修改4在缓存中的数据, 将4 改为 6666
newCache[132] = 6666;
//然后做加法
int a = 2;
int b = a + a;
//打印结果
System.out.printf("%d + %d = %d", a, a, b);
}
Integer和Integer比较
从下面一个例子,发现666的Integer相比较,不相等,而100的相比较,是相等的,这是由于Integer的缓存,在-128到127范围内,他们获取的是同一个对象,所以地址自然相同,而不在这个范围,就会直接返回new Integer对象,这样自然两个的引用地址不一样,自然会不同。
public static void main(String [] args) throws Exception{
Integer a =100,b = 100;
Integer c = 666,d = 666;
System.out.println(a == b);//true
//666不在 -127到128的范围内,所以反回的是new Integer 对象
System.out.println(c == d);//false
}
int 和int比较
int数据类型,都是在栈内存中存储,如果这个数字在栈内存中存在就会直接指向这个内存地址,如果不存在,就会重新开辟内存空间,所以int和int类型的比较,相同的值不会存在内存不等的情况
八个基本数据类型不能看作对象(这点很特殊),存放在栈中。栈内操作速度快,创建销毁很容易
public static void main(String [] args) throws Exception{
int a = 222;
int b = 222;
double c = 222;
System.out.println(b == a);//true
System.out.println(c == a);//true
}
Intege和int比较 & int和Integer比较
这两个数据的相互比较,无论是谁和谁比,都最终比较的是存在栈中的值,因为int是基本数据类型,不能在对中创建数据,所以无论咋比较,都是将堆中的Integer拆箱(xx.intValue)为int类型的数据,然后进行比较
int和integer(无论new否)比,都为true,因为会把Integer自动拆箱为int再去比
无论是a比较b,还是b比较a,都是栈内存中的拆箱后进行比较。
Integer a = 222;
double b = 222;
System.out.println(a == b); //true