java.util.Collection 集合层次的根接口
  java.util.List extends Collection
    ArrayList implements List
      常用方法
        boolean add(E e)//添加元素
        boolean remove(Object o)//删除元素
        void clear()//清空元素
        boolean contains(Object o)//判断是否包含某元素
        boolean isEmpty()//判断是否为空
        int size()//获取集合长度

Collection集合的迭代
Iterator<E> iterator()//获取集合专属的迭代器
    抽象方法,但是Collection集合的实现类一定会重写此方法
    方法返回的是一个接口,重写后的方法,返回的肯定是这个接口的实现类对象
Iterator接口
    1.抽象方法
      boolean hasNaxt()判断有没有下一个元素
      E next()获取元素,使用一次指针向下移动一次
    2.实现类
      通过Collection的iterator()方法可以获取Iterator的实现类
      Iterator it = c.iterator();

    并发修改异常
    java.util.ConcurrentModificationException
    当迭代器正在迭代集合时,集合对象改变了集合的长度就会报此异常(迭代器本身的方法对元素长度进行操作就不会,但不建议使用)

增强for循环;底层是一个迭代器
只能用来迭代数组和集合
    for(集合中存储的数据类型 变量名 : 要遍历的集合名){
      System.out.println(变量名);    //不用索引了,所以如果要用到索引进行操作的还是用以前的循环
    }

泛型:
  不指定泛型
  容易报类型转换异常(ClassCastException)
  加入泛型的好处
    1.可以将运行时异常提前到编译期
    2.避免了使用向下转型

  定义泛型类
    public class 类名<接收泛型的变量(自定义名)>
    创建对象时确定下来泛型的数据类型

  定义泛型的方法
    public static <E> void method(E e){

    }
    在调用方法确定数据类型

  定义泛型接口
    public interface MyInterface<E>{  
    }
    A:定义实现类的时候确定
    B:定义实现类的时候继续使用泛型,创建对象的时候确定数据类型

  数据类型 = 类名 + 泛型
    方法使用泛型:
    在没有确定数据类型的时候:
      public static <E> void method(E e){

      }
    在没有确定泛型的时候,确定了类名
      public static void method(ArrayList<?> list){

      }

  泛型通配符:
   ? extends 父类 //只能是父类及其子类
   ? super 子类 //只能是子类和其父类

05-27 08:24