泛型的概念:
用来灵活的将数据类型应用到不同的类,方法和接口中,将数据类型作为参数进行传递。
定义格式:修饰符 class 类名<代表泛型的变量> { }
定义格式:修饰符 interface接口名<代表泛型的变量> { }
1: 当创建对象对象时,确定泛型的类型。
ArrayList<String> list = new ArrayList<String>(); 此时,变量E的值就是String类型,也就是说集合里的方法也必须是string类型。
2:子类继承的时候明确。public final class Scanner implements Iterator<String> {} 当继承或类实现接口的时候定义泛型,如果始终定义成<E>类型,可以创建对象时候的定义类型。
ArrayList<String> list = new ArrayList<String>();
Iterator<String> it = list.iterator();
不加泛型的问题:
当ArrayList集合中存储了不同的数据类型,只能用Object接,实际上就是将所有的数据类型进行向上转型(自动转型,自动装箱,则包装类成了Object的子类),也就是说不指定泛型,则泛型就成为了Object类型,只要规定了泛型,不必进行向下转型,不会出现类型转换异常。
使用泛型的好处:
将运行时期的ClassCastException,转移到了编译时期变成了编译失败,避免了类型强转的麻烦。
泛型通配符与泛型限定:
泛型通配符 ? (传谁都行),也就是当用for循环增强遍历时,传的类型只能是Object类型,
泛型限定符 : 1: 限定上限 ?extends 父类 泛型必须是父类或父类的子类 2: 限定下限 ? super 子类 泛型必须是子类或者子类的父类
public static void get(ArrayList<? > arr){
public static void get(ArrayList<? extends Person> arr){
public static void get(ArrayList<? super Person> arr){
for(Object obj:arr){
System.out.println(obj);
}
}
当使用泛型类或者接口时,传递的数据中,泛型类型不确定,可以通过通配符<?>表示。但是一旦使用泛型的通配符后,只能使用Object类中的共性方法,集合中元素自身方法无法使用。
代码体现:
public class Demo02 {
public static void main(String[] args) {
ArrayList<Student> arr=new ArrayList<Student>();
arr.add(new Student("小红帽",18));
arr.add(new Student("大灰狼",20));
ArrayList<Worker> brr=new ArrayList<Worker>();
brr.add(new Worker("tom",19));
brr.add(new Worker("jerry",20));
ArrayList<Teacher> crr=new ArrayList<Teacher>();
crr.add(new Teacher());
crr.add(new Teacher());
get(arr);
get(brr);
}
public static void get(ArrayList<? extends Person> arr){ 传arr,brr,crr的类型,ArrayList,只有泛型不一样,同时只有定义类或类中的方法时才可以使用E,使用泛型不可以用E,
for(Object obj:arr){ 泛型里没有多态的概念,类才认泛型,
System.out.println(obj);
}
}
}
List接口:
特点:
1:是一个元素存取有序的集合。
2:是一个带索引的集合。
3:集合中可以有重复的元素。
List接口常用方法:
在迭代时,不要使用集合的方法操作元素,也就是不要改变集合长度,在迭代时对元素操作可以通过ListIterator迭代器操作元素。
ArrayList集合:
ArrayList集合数据存储的结构是数组结构。元素增删慢,查找快。
LinkedList集合:
LinkedList集合数据存储的结构是链表结构。方便元素添加、删除的集合。
常用方法:
java中(List集合中)的数据存储的四种结构:
1:堆栈:先进后出
2:队列:先进先出
3:数组结构:有下标,查询快,增删慢,因为数组长度不可变,所有要重新创建一个数组
4:链表结构:查询慢,无下标(从头开始查),增删快,不需要创建新的链表。
内存中的存储结构 :方法和数据共享区,栈内存,堆内存。