文章目录
1、继承抽象父类 Number
数值类型(byte、short、int、long、float、double)的包装类都继承抽象父类 Number 类,它实现了 Serializable
接口,并定义了将包装类返回为任意基本数值类型的 xxxValue() 方法,供子类重写。
2、实现 Comparable 接口
包装类都实现 Comparable
接口。包装类之间的比较就是根据基本类型值(成员变量value)进行比较。
- 整数类型和字符类型:直接比较大小
- 布尔类型:谁为
true
谁大 - 浮点数:通过静态方法
floatToIntBits
或DoubleToLongBits
将浮点数的二进制表示看做int
或long
后,再按int
或long
比较大小
3、不可变性
包装类都是不可变的。即实例一旦创建就无法再被修改。这样使得程序更为简单安全,尤其是在多线程环境下。
其实现不可变的方式如下:
- 类声明为 final
- 内部基本类型值声明为 private final
- 不提供 setter 方法
4、创建包装类对象
使用 valueOf
方法,而不是通过 new
来创建包装类对象。因为除了浮点类型的包装类外,其他数值类型的包装类内部都会缓存 ~128-127 这 256 个包装类对象。通过 valueOf
有可能会走缓冲,一旦缓冲命中,就直接返回缓存的对象,否则再执行和 new
一样的创建逻辑。
其中,Integer
还可以通过设置 JVM 的配置项来改变缓存的上限,但不能超过 Integer
的最大值。
Character
缓存了 0~127,所有用到 char
对象。
5、类变量
布尔类型包装类定义了用作 “缓存” 的两个布尔变量 FLASE 和 TRUE
public static final Boolean FALSE = new Boolean(false);
public static final Boolean TRUE = new Boolean(true);
整数类型包装类定义了最大值(MAX_VALUE)和最小值(MIN_VALUE)
浮点类型包装类除了定义了最大值和最小值外,还定义了正无穷、负无穷和非数值,以及最大/小指数值
6、equals
包装类都重写了 equals
方法,和 compare
一样,实际比较时是用的包装类的基本类型值。
整数
public boolean equals(Object obj) {
if (obj instanceof Integer) {
return value == ((Integer)obj).intValue();
}
return false;
}
浮点数
// 两个浮点数的二进制表示形式完全相同时才为true
public boolean equals(Object obj) {
return (obj instanceof Float)
&& (floatToIntBits(((Float)obj).value) == floatToIntBits(value));
}
7、hashCode
包装类都重写了 hashCode
方法。根据包装类的基本类型值来计算 hashCode。
- Byte、Short、Character、Integer:直接返回其基本类型值(需要强制转换的强转后返回)
- Long:将高 32 位于低 32 位进行异或后返回
- Float:返回其二进制表示形式的 int 值
- Double:先将其二进制表示形式转换为 long 值,再进行高 32 为与低 32 的异或操作
- Boolean:true 为 1231 ,false 为 1237
8、包装类与基本类型的转换
基本类型转包装类:每种包装类都有一个静态方法 valueOf(),接受基本类型,返回对应的包装类
数值型包装类转基本数值类型:每种数值型包装类都重写了父类 Number 的 xxxValue() 方法,通过该方法转换成对应的基本数值类型。
int a = 11;
// 基本类型转包装类
Integer A = Integer.valueOf(a);
// 包装类转基本类型
int s = A.intValue();
Integer B = 20; // 会被编译成替换为 Integer B = Integer.valueOf(20);
int b = B; // 会被编译成替换为 int b = B.intValue();
9、字符串、包装类、基本类型之间的转换
除 Character
外,包装类都提供了:
- 静态方法
valueOf(String)
将字符串转换成相应的包装类对象。 - 静态方法
parseXXX(String)
将字符串转换成相应的基本类型值。 - 静态方法
toString
将基本类型转换成字符串
对于整数类型,还可以转换成其他进制的字符串形式。