目录
学习集合时,我们知道集合中是可以存放任意对象的,只要把对象存储集合后,那么这时他们都会被提升
成为Object类型。当我们在取出每一个对象,并且进行相应的操作,这时必须采用类型转换。
泛型:
是一种未知的数据类型,当我们不知道使用什么数据类型的时候,可以使用泛型
泛型也可以看作是一个变量,用来接收数据类型
E e: Element 元素
T t: Type 类型
ArrayList集合在定义的时候,不知道集合中会存储什么类型,所以类型使用泛型
E:未知的数据类型
public class ArrayList<E>{
public boolean add(E e){
}
public E get(int Index){
}
}
1.创建集合对象的时候,就会确定泛型的数据类型
ArrayList<String> list = new ArrayList<String>();
//会把数据类型作为参数传递,把String赋值给泛型E
public class ArrayList<String>{
public boolean add(String e){
}
public String get(int Index){
}
}
2.ArrayList<Student> list = new ArrayList<Student>();
//会把数据类型作为参数传递,把Student赋值给泛型E
public class ArrayList<Student>{
public boolean add(Student e){
}
public Student get(int Index){
}
}
实例:
import java.util.ArrayList;
import java.util.Iterator;
/**
* @Author: Jason
* @Date: 2019/9/11 9:37
* @Version 1.0
*/
public class Demo02Generic {
public static void main(String[] args) {
demo01();
demo02();
}
// 方法代码
}
2. 创建集合对象,不使用泛型
好处:
集合不使用泛型,默认的类型就是Object类型,可以存储任意类型的数据
弊端:
不安全,会引发异常
private static void demo01() {
ArrayList list = new ArrayList();
list.add("das");
list.add(1);
//使用迭代器遍历list集合
//获取迭代器
Iterator it = list.iterator();
//使用迭代器中的方法hasNext和next遍历集合
while (it.hasNext()){
//取出元素也是Object类型
Object obj = it.next();
System.out.println(obj);
//想要使用String类特有的方法,length获取字符串的长度;
//不能使用多态Object obj = "das"; java.lang.ClassCastException
//需要向下转型
String str = (String)obj;
System.out.println(str.length());
}
}
3.创建集合对象,使用泛型
好处:
1.避免了类型转换的麻烦,存储的是什么类型,取出来的就是什么类型
2.把运行期的异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候会报错)
弊端:
泛型是什么类型,只能存储什么类型的数据
private static void demo02() {
ArrayList<String> list = new ArrayList<>();
list.add("sas");
// list.add(1);
//使用迭代器遍历list集合
Iterator<String> it = list.iterator();
while (it.hasNext()){
String str = it.next();
System.out.println(str +" - > " + str.length());
}
}