泛型:是一种未知的数据类型,当我们不知道使用什么数据类型的时候,可以使用泛型。
泛型也可以看出是一个变量,用来接收数据类型
E e :Element元素
T t :Type 类型
ArratList集合在定义的时候,不知道集合中会存储什么类型的数据,所以类型使用泛型
E : 未知的数据类型
public class ArrayList<E>{
public boolean add(E e) {}
public E get(int index) {}
}
创建集合对象的时候,就会确定泛型的数据类型
ArrayList list = new ArrayList();
会把数据类型作为参数传递,赋值给泛型E,所以就都变成String
public class ArrayList<String>{
public boolean add(String e) { }
public String get(int index) { }
}
package demo01Iterator;
import java.util.ArrayList;
import java.util.Iterator;
/*
*/
public class Demo03Generic {
public static void main(String[] args) {
show01();
show02();
}
//----------------------------------------------------
/*
创建集合对象,使用泛型
好处:
1.避免了类型转换的麻烦,存储的是什么类型,取出的就是什么类型
2.把运行期异常(代码运行之后会抛出的异常),提升到了编译期(写代码的时候就会报错)
弊端:
泛型是什么类型,就只能存储什么类型的数据
*/
private static void show02() {
ArrayList<String> list1 = new ArrayList<>();
list1.add("aaa");
// list1.add(11);//因为泛型的类型是字符串,所以只能使用字符串进行添加
//使用迭代器遍历list集合
Iterator<String> it = list1.iterator();
while(it.hasNext()) {
//由于是字符串泛型,所以用字符串变量进行接收
String s = it.next();
System.out.println(s + "- >" +s.length());
}
}
/*
创建集合对象,不使用泛型
好处:
集合不使用泛型,默认的类型就是Object类型,可以存储任意类型的数据
弊端:
不安全,会引发异常
*/
//---------------------------------------------
private static void show01() {
// //不写类型,默认就是Object类型
// ArrayList list = new ArrayList();
// list.add("abc");
// list.add(1);
//
// //使用迭代器遍历List集合
// //获取迭代器
// Iterator it = list.iterator();
// //使用迭代器中的方法hasNext和next遍历集合
// while (it.hasNext()) {
// //取出元素也是Object类型
// //使用Object类型变量接收
// Object obj = it.next();
// System.out.println(obj);
//
// //想要使用String类特有的方法,length获取字符串的长度,不能使用 多态 Object obj= "abc";
// //需要向下转型
// //会抛出ClassCastException类型转换异常,不能把Integer类型转换为String类型
// String s = (String) obj;
// System.out.println(s.length());
// }
}
}