目录
一、使用
使用这几个类时要注意如下两点:
1、类型转换
原则:宽化类型转换(即小范围类型向大范围类型的转换),可自动转换;窄化类型转换(大范围类型向大范围类型的转换),需强制转换。
实例:Short n = 127; n = n + 1; 在编译时不会通过,因为byte、short、char等类型相加时都是用iadd指令,即将操作数当成int型处理,计算的结果是int型,将int型的结果赋值给Short型的变量n,虽然要进行装箱处理,但还是属于窄化类型转换,JVM不能自动转换。但Long m = 127L; m = m + 1; 却能通过编译,因为编译m + 1时,会将1当成long型处理,并用ladd指令执行加操作,计算结果是long型,再将这个结果装箱并赋值给Long类型的变量m,不存在窄化类型转换的问题。
2、对象比较
正常情况下,-128~127对应的包装类型都缓存了相应的对象,获取时都是从缓存中获取对象,所以针对同一数值多次获取到的是同一实例,比较的结果也就相等了。
如:Short s1 = 100; Short s2 = 100; println(s1 == s2); 输出的结果是true,因为s1和s2中存放的是同一个Short类型的实例。
二、实现机制
将一个数值赋值给Byte、Short、Integer、Long等类型的变量时,会用对应类的静态成员方法valueOf进行处理(不建议用这些类的构造方法进行实例),核心valueOf方法的源代码如下(下面以Short类的源代码为例):
public static Short valueOf(short s) { } |
从上面的代码可以看出,当数值等于-128、127或之间的值时,将从cache中获取实例,因此,当值介于-129~128之间时,总是从cache中获取实例,得到的是总是同一实例。cache的源代码如下:
private static class ShortCache { static final Short[] cache; static { // Load and use the archived cache if it exists |
即当没有缓存时,新建一个Short类型的有256个元素的数组,并依次存放-129~128之间的整数,然后将其缓存