泛型的引入
什么是泛型(Generic)?
- 泛型就相当于标签<>
- 集合容器类在设计阶段/声明阶段不能确定这个容器到底存的是什么类型的对象,所以在JDK1.5之前只能把元素类型设计为Object,因此,此时把元素设计成一个参数,这个类型参数就叫做泛型。
- Collection,List,ArrayList这个就是类型参数,称为泛型。
没有泛型时编写的集合
package zhai.Fx;
import java.util.ArrayList;
public class FxDemo1 {
public static void main(String[] args) {
// 创建一个 ArrayList 集合
ArrayList list = new ArrayList();
list.add(12);
list.add(23);
list.add(68);
list.add(90);
list.add("张三");
// 遍历集合
for (int i = 0; i < list.size(); i++) {
System.out.println(list); // 默认调用 ArrayList 中的 toString 方法
}
// 增强for循环遍历
for (Object o:list) {
System.out.println(o);
}
}
}
输出:
[12, 23, 68, 90, 张三]
[12, 23, 68, 90, 张三]
[12, 23, 68, 90, 张三]
[12, 23, 68, 90, 张三]
[12, 23, 68, 90, 张三]
12
23
68
90
张三
解析:可以看出上面list对象可以存储任意类型的数据,这样其实并不好,因为不好管理;一般我们会在集合中存储相同类型的数据,方便管理查询,但是现在什么类型都可以存入到集合中,这时候我们想对集合进行限制,只能存入一种数据类型时,这时候就需要泛型以参数的形式来定义到集合中从而实现只能存储一种数据类型的集合。
package zhai.Fx;
import java.util.ArrayList;
public class FxDemo1 {
public static void main(String[] args) {
// 创建一个 ArrayList 集合
ArrayList list = new ArrayList();
list.add(12);
list.add(23);
list.add(68);
list.add(90);
// list.add("张三");
// 增强for循环遍历,这时候的遍历这时对应的类型就可以设置为只遍历 Integer 类型
for (Integer i:list) {
System.out.println(i);
}
Integer integer = 123; // 装箱:将 int 类型转换为 Integer 类型
int i = integer; // 拆箱 :将 Integer 类型转换为 int 类型
System.out.println(integer);
}
}
输出:
12
23
68
90
123
注意:这时候 list 对象中只能存储 Integer 类型的数据,若放入其他类型的数据,就会报错。
泛型总结:
- JDK1.5后才开始使用
- 泛型其实就是要给<>引起来的参数类型,这个参数类型只要在使用集合时编写后,就表明该集合只能存放这个类型的数据。
- 使用了泛型以后,就可以确定集合中存放数据的类型,在编译时期(编写)时,就可以检查出来。
- 使用泛型后的集合,后续处理会很方便;泛型中不能存放基本数据类型,只能存放引用数据类型,因为集合中存储的都是引用类型,并没有进本数据类型,所以这时候就是用该基本数据类型对应的包装类。
泛型的编写格式:
JDK1.5之前:ArrayList<参数类型> list = new ArrayList<参数类型>;
JDK1.5以后:ArrayList<参数类型> list = new ArrayList<>;
<>:在 Java 中也称为钻石运算符
package zhai.Fx;
import java.sql.Array;
import java.util.ArrayList;
import java.util.Iterator;
public class FxDemo2 {
public static void main(String[] args) {
// JDK1.5 之前泛型的编写
ArrayList list = new ArrayList();
list.add(122222222);
list.add(123333);
// JDK 1.5 之后泛型的编写
ArrayList list1 = new ArrayList<>();
list1.add(123);
list1.add(1314);
// 使用增强 for 循环遍历 JDK 1.5 之前的集合
for (Integer i : list) {
System.out.println(i);
}
System.out.println("上面是JDK1.5之前的集合===============下面是JDK1.5之后的集合");
// 使用普通 for 循环遍历 JDK 1.5 之后的集合
for (int i = 0; i < list1.size(); i++) {
System.out.println(list1); // 普通 for 循环会默认调用 ArrayList 中的 toString 方法
}
System.out.println("========使用迭代器方法进行遍历集合========");
// 迭代器遍历
Iterator iterator = list.iterator();
while (iterator.hasNext()){
System.out.println(iterator.next());
}
}
}
输出:
122222222
123333
上面是JDK1.5之前的集合===============下面是JDK1.5之后的集合
[123, 1314]
[123, 1314]
========使用迭代器方法进行遍历集合========
122222222
123333



