本篇博客主要介绍Java泛型相关的知识和包装类的相关知识的简单认识。
泛型
- Java中的泛型和C++的泛型大概是相似的;
- Java泛型参数只可以代表类,不能代表个别对象;
- Java编译器在编译泛型时会自动加入类型转换的编码,故运行速度不会因为使用泛型而加快;
- 泛型是作用在编译期间的一种机制,即运行期间没有泛型概念;
泛型的简单使用
Java的集合类就是泛型的一个产物,我们通过演示一些简单集合类的用法,来理解一下泛型:
- 使用ArrayList存放int类型元素。
- 使用ArrayList存放double类型元素。
- 使用ArrayList存放String类型元素。
包装类
通过前面的了解,我们知道Java中的泛型参数只能是类,而我们又知道Java中有八种基本数据类型,这八种基本数据类型并不是类,显然是不能作为泛型参数的。我们来看一下:
为了解决上述泛型参数问题,Java中引入了包装类。
八种基本类型和其包装类之间的对应关系如下:
基本数据类型 | 包装类 |
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
装箱(boxing)和拆箱(unboxing)
名词很高大上,其实操作很简单,我们来简单使用一下就知道了。
- 装箱(boxing)。
- 拆箱(unboxing)。
自动装箱(autoboxing)和自动拆箱(autounboxing)
前面我们可以看到装箱和拆箱虽然不是很复杂,但是还是需要手动操作,这显然是很麻烦的,于是Java提供了自动装箱和自动拆箱。顾名思义,自动装箱和自动拆箱就是编译器来完成装箱和拆箱操作,不需要程序猿来手动完成。
- 自动装箱(autoboxing)。
- 自动拆箱(autounboxing)。
我们使用javap反编译工具来看一下自动装箱和自动拆箱的过程。
- 自动装箱:
- 自动拆箱:
我们再来看一个应用场景,可以使用包装类来处理:
假如现在我们写一个函数来获取指定下标的元素,返回值类型为int,首先,我们需要在函数中判断传入的下标是否合法,如果不合法,我们该如何处理呢?
- 我们可以使用Java中的异常机制来处理,如果下标不合法,则抛出异常;
- 我们也可以使用包装类来处理,返回值类型改为Integer,如果下标不合法,返回值为null。
注意:包装类是不可变对象。