文章目录
概述
基本类型与包装类型,存在相互转化的关系。
- 基本类型转为包装类型这个过程,被称之为装箱
- 包装类型转为基本类型这个过程,被称之为拆箱
Boolean 与 boolean
- 装箱操作通过
Boolean.valueOf()
来完成 - 拆箱操作通过
Boolean.booleanValue()
来完成
注意,Boolean
只有两个取值,所以通过装箱操作得到的值,都是 Boolean
中的静态变量 TRUE
或者 FALSE
。
Character 与 char
- 装箱操作通过
Character.valueOf()
来完成 - 拆箱操作通过
Character.charValue()
来完成
注意,Character
中存在一个内部缓存类 CharacterCache
,缓存范围是 Ascii
码小于 127
的所有字符,即包含了所有的英文字母与半角符号。示例如下:
Character c = '@';
Character c1 = '@';
//因为有缓存,输出 true
System.out.println(c == c1);
Character c2 = '二';
Character c3 = '二';
//中文字符不在缓存范围内,所以输出 false
System.out.println(c2 == c3);
Byte 与 byte
- 装箱操作通过
Byte.valueOf()
来完成 - 拆箱操作通过
Byte.byteValue()
来完成
注意,Byte
类中存在一个内部缓存类 ByteCache
,缓存范围正好是 byte
类型的取值范围: -128~127
。当遇到装箱操作时,将自动从此内部缓存类中获取,示例如下:
Byte b = 10;
Byte b2 = 10;
//因为有缓存,所以这里输出 true
System.out.println(b == b2);
Short 与 short
- 装箱操作通过
Short.valueOf()
来完成 - 拆箱操作通过
Short.shortValue()
来完成
与 Byte
类似,Short
类中也存在内部缓存类 ShortCache
,缓存范围也是 -128~127
。当遇到此缓存范围中的装箱操作时,将自动从此内部缓存类中获取,示例如下:
Short s0 = 127;
Short s1 = 127;
//因为有缓存,所以这里输出 true
System.out.println(s0 == s1);
Short s2 = 128;
Short s3 = 128;
//这里超出了缓存范围,所以都去创建了新的对象,故输出 false
System.out.println(s2 == s3);
Integer 与 int
- 装箱操作通过
Integer.valueOf()
来完成 - 拆箱操作通过
Integer.intValue()
来完成
注意,Integer
中也存在内部缓存类,用法也与上面类似,但不同的是,Integer
的缓存范围可以自定义,通过指定参数来进行设置。
Float 与 float
- 装箱操作通过
Float.valueOf()
来完成 - 拆箱操作通过
Float.floatValue()
来完成
Double 与 double
- 装箱操作通过
Double.valueOf()
来完成 - 拆箱操作通过
Double.doubleValue()
来完成
Long 与 long
- 装箱操作通过
Long.valueOf()
来完成 - 拆箱操作通过
Long.longValue()
来完成
注意,Long
中也存在内部缓存类,用法与 Byte
类似。
总结
- 装箱操作,一般都是调用包装类的
valueOf()
方法来实现的,例如Double.valueOf()
- 拆箱操作,一般都是调用包装类的
xxxVluae()
方法来实现的,例如Long.longValue()
Boolean
、Character
、Byte
、Short
、Integer
、Long
类型内部都有缓存机制来对一定范围内的值进行缓存操作Boolean
类通过TRUE
和FALSE
两个静态变量来实现装箱时的缓存读取操作Character
、Byte
、Short
、Integer
、Long
都是通过内部的缓存类来实现装箱时的缓存读取操作的Character
的缓存范围是Ascii
码小于 127 的字符Byte
、Short
、Integer
、Long
的缓存范围都是-128~127
Integer
可以通过修改指定参数来修改缓存范围