1. 泛型
1.1 泛型的引入
在我们之前的学习中,我们所实现的代码,类型都写死了。如果我们需要实现其他类型,就需要重新写个类。
那么我们能否只写一份代码,实现任意类型都可以存储呢?
在Java中,Object是所有类的基类,如果将底层数组的类型设置成Object[],那么所有的类型都可以存储。但是,我们在后面获取元素的时候,必须要向下转型,用户使用起来要非常小心,很可能导致代码崩溃。本该在编译期间报的错误却推到了运行时,用户将会承担很大的风险。
因此,Java中引入了泛型编程的思想。
1.2 泛型的概念
泛型:类型参数化。即写代码的时候,将类型设置一个特定格式的参数,编译器在编译代码时自动推导。
泛型分类:泛型方法和泛型类。
1.3 泛型的使用
public class MyArray <E>{
private E[] array;
private int size;
public MyArray(int initCap){
array=(E[])new Object[initCap];
size=0;
}
public void add(E p){
if(size==array.length){
System.out.println("元素已经存满了,无法再添加元素");
}
array[size++]=p;
}
public E get(int index){
if(index>=size){
throw new IndexOutOfBoundsException("数组下标越界");
}
return array[index];
}
public int size(){
return size;
}
public static void main(String[] args) {
MyArray<Person>myArray=new MyArray<>(10);
myArray.add(new Person("hanmei",13));
System.out.println(myArray.size());
}
}
注意:
- 泛型是作用在编译期间的一种机制。
- 泛型代码在运行期间,会将类型擦除掉,底层实际使用的也是Object实现的。但是用户不需要在代码中进行强制类型转换,让编译器在编译阶段检查。
2. 包装类
在Java中,由于基本类型不是继承自Object,为了在泛型代码中可以支持基本类型,Java给每个基本类型都对应了一个包装类型。
2.1 基本数据类型及其对应的包装类
基本数据类型 | 包装类 |
---|---|
byte | Byte |
short | Short |
int | Integer |
long | Long |
float | Float |
double | Double |
char | Character |
boolean | Boolean |
除了Integer和Character,其余基本类型的包装都是首字母大写。
2.2 装箱和拆箱
public class Test {
int i=10;
//装箱操作,新建一个Integer类型对象,将i的值放入对象的某个属性中
Integer ii=Integer.valueOf(i);
Integer ij=new Integer(i);
//拆箱操作,将Integer对象的值取出,放到一个基本数据类型中
int j=ii.intValue();
}
2.3 自动装箱和自动拆箱
可以看到在使用过程中,装箱和拆箱带来了不少的工作量,所以为了减少开发者的负担,Java提供了自动机制。
int i=10;
Integer ii=i;//自动装箱
Integer ij=(Integer) i;//自动装箱
int j=ii;//自动拆箱
int k=(int)ii;//自动拆箱
自动拆箱习题:
1.在jdk1.5之后,下列 java 程序输出结果为______。
int i=0;
Integer j = new Integer(0);
System.out.println(i==j);
System.out.println(j.equals(i));
正确答案:true,true
解析:
1、基本型和基本型封装型进行“==”运算符的比较,基本型封装型将会自动拆箱变为基本型后再进行比较,因此Integer(0)会自动拆箱为int类型再进行比较,显然返回true;
2、两个Integer类型进行“= =”比较,如果其值在-128至127,那么返回true,否则返回false, 这跟Integer.valueOf()的缓冲对象有关,这里不进行赘述。
3、两个基本型的封装型进行equals()比较,首先equals()会比较类型,如果类型相同,则继续比较值,如果值也相同,返回true
4、基本型封装类型调用equals(),但是参数是基本类型,这时候,先会进行自动装箱,基本型转换为其封装类型,再进行3中的比较。