前言

基本类型的包装类

基本类型的包装类也叫类型包容器,也叫打包类型(Wrapper Types),其包括10种,分别为:
Integer 、Long、Short、Byte、Character、Double、Float、Boolean、BigInteger、BigDecmail.其中BigInteger、BigDecimal没有相对应的基本类型,主要应用于高精度的运算,BigInteger 支持任意精度的整数,BigDecimal支持任意精度带小数点的运算。除此之外还有Number类,Number类是作为抽象类实现的,它是整数、长整数、浮点数和双精度的类型包容器。

由于Java被设计成为一种面向对象的编程语言,但是八种基本数据类型却不是一个对象。所以Java引入类型包装类的方式,来将基本数据类型封装起来,使其可以进一步地面向对象。

JDK 1.5版本中,Java引入了自动拆箱和装箱的机制,这个机制可以保证对象和基本数据类型之间很容易地转换,例如:

Integer num = 10;
Integer num = new Integer(10);

上面这两句话是等价的,第一句会在编译的时候,由Java编译器自动转换为下面的这句话,这个过程就是自动装箱(autoboxing).自动装箱自动实现了由基本数据类型向对象转化的过程。
同样地,还有自动拆箱(unboxing)过程,如下所示:

Integer num = 10;
num++;

Java在自动装箱和自动拆箱的过程中,使用了一种叫做享元模式(flyweight)的设计模式,所谓的享元模式就是指使用共享物件,用来尽可能减少内存使用量以及分享资源给尽可能多的相似物件,例如下面这个例子:

Integer num1 = 297;
  Integer num2 = 297;
  Integer num3 = 1;
  Integer num4 = 1;
  System.out.println(num1==num2);
  System.out.println(num3==num4);

输出结果为:

false
true

这是因为,为了加大对简单数字的重复利用。在自动装箱时对于值从-128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象,不同的Integer变量实际上是对同一个对象的引用。
而如果不在-128到127这个区间中,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都实例化一个 Integer对象。
类似地,String类也是可以实现自动装箱和拆箱的,例如:

String str = "ssssss";
//常被代替下面的声明方式
String str = new String("ssssss");

这些类型的包装类有很多比较常用的方法,例如:

public Class Type()

返回包装类中的具体值的类型,返回结果是Class类型的。

public type typeValue()

返回包装类中具体类型的值,这里的type代指类型。

public boolean equals(Object obj)

除Character,其他类型包容器都实现了该成员函数,用来比较两个数据类型对象的值是否相等。