1. 缓存池介绍
基本数据类型包装类除了Float和Double之外,其他六个包装类都有常量缓存池,拿Integer来举例子,Integer类内部中内置了 256个Integer类型数据,当使用的数据范围在 -128~127之间时,会直接返回常量池中数据的引用,而不是创建对象,超过这个范围则会创建对象。
2. Integer
2.1 测试代码
12345678910111213 public static void main(String args[]){Integer i1 = 40;Integer i2 = 40;Integer i3 = 0;Integer i4 = new Integer(40);Integer i5 = new Integer(40);Integer i6 = new Integer(0);System.out.println("i1 == i2,"+(i1==i2));//40在常量池中,两个引用地址一样,trueSystem.out.println("i1 == (i2+i3),"+(i1 == i2+i3));//数学运算是在栈中进行,此时比较的是数值,trueSystem.out.println("i1 == i4,"+(i1==i4));//i4是新建对象的引用,i1是40的引用,两者不一样,falseSystem.out.println("i4 == i5,"+(i4==i5));//两个新建对象,falseSystem.out.println("i4 == (i5+i6),"+(i4==i5+i6));//此时比较的是数值,true}
2.2 class字节码
|
|
2.3 valueOf()
|
|
|
|
2.4 总结
由上面的代码可得知,用Integer来声明变量时,会调用其内部的valueOf()方法,而此时valueOf()内部是会判断赋值的数值是否在Integer的IntegerCache(内部类)的cache中,假若有则直接返回IntegerCache中对应cache的引用即可,否则要创建Integer对象,并返回引用。