目录
1 内容提要
- Java基本类型的包装类大部分都实现了常量池技术,
即Byte,Short,Integer,Long,Character,Boolean,这 6 种包装类默认创建了数值
[-128,127] 的相应类型的缓存数据, 但是超出此范围仍然会去创建新的对象。 - 两种浮点数类型的包装类 Float、Double 并没有实现常量池技术。
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)); //输出 i1=i2 true
System.out.println("i1=i2+i3 " + (i1 == i2 + i3)); //输出 i1=i2+i3 true
//i2+i3得到40,比较的是数值
System.out.println("i1=i4 " + (i1 == i4)); //输出 i1=i4 false
System.out.println("i4=i5 " + (i4 == i5)); //输出 i4=i5 false
//i5+i6得到40,比较的是数值
System.out.println("i4=i5+i6 " + (i4 == i5 + i6)); //输出 i4=i5+i6 true
System.out.println("40=i5+i6 " + (40 == i5 + i6)); //输出 40=i5+i6 true
2 注意事项
- 以上提到的几种基本类型包装类均实现了常量池技术,但他们维护的常量仅仅是【-128至127】这个范围内的常量,如果常量值超过这个范围,就会从堆中创建对象,不再从常量池中取。
比如,把上边例子改成Integer i1 = 400; Integer i2 = 400;,很明显超过了127,无法从常量池获取常量,就要从堆中new新的Integer对象,这时i1和i2就不相等了。