集合进阶版 作者:一衡 今日学习的集合框架、迭代器、for循环的加强方法(foreach)、数据结构、判断元素的值。主要是对基础班的扩展和延伸。多理解。 一、集合体系框架 1、集合概述 由于不同数据结构(数据的组织、存储方式),Java就为我们提供了不同集合,又由于不同的集合他们的功能相似,不断向上提取,共性抽取出来。 2、关系图解 接口——————————》Collection -----》(顶层父接口) 接口——————》 List←--------⊥--------------→ Set(继承关系) 实现类:ArrayList<E> ←」 ﹂→HashSet<E>(实现关系) 其中List的特点是:有序、有整数索引值、元素值可重复 其中Set的特点是:无序、无索引值、不可重复 3、Collection中常用的功能 boolean add(Object o):向集合中添加元素 void clear();清空所有元素的值 Boolean contains(Object o);判断是否包含某元素 Boolean isEmpty();判断集合是否为空 Boolean remove(Object o);是否删除某元素,返回boolean类型值 Int size();返回集合长度 Object[] o toArray[] 将集合转换成一个Object类的集合例如; Collection<String> c = new ArrayList<String>(); Object[] obj = c.toArray();//主要用于遍历集合 4、迭代器(Iterator)(也可用于遍历集合)代码例子 Collection<String > c = new ArrayList<>(); ListIterator<String> lit = c.listiterator(); while(lit.hasNext()){//判断是否还有元素 String s = (String)lit.next(); System.out.println(s) } 注意: 当使用迭代器遍历集合的时候,使用了集合中的 增加/删除 方法,导致并发修改异常产生。 解决方法: A:不使用迭代器遍历集合,就可以在遍历的时候使用集合的方法进行增加或删除 B:依然使用迭代器遍历,那么就需要使用Iterator的子接口ListIterator来实现向集合中添加。 5、泛型 A、 反应概述 由于集合可以存储任意类型的对象,当我们存储了不同类型的对象,就有可能在转换的时候出现类型转换异常, 所以java为了解决这个问题,给我们提供了一种机制,叫做泛型 B、泛型的使用 当类上定义<>的时候就可以使用泛型,例如ArrayList类的定义: class ArrayList<E>,那么我们在创建ArrayList对象的时候就可以指定<>中E的类型 ArrayList<String> al=new ArrayList<String>(),那么String就把E替换掉了 6、foreach(加强版for循环) 增强for循环是JDK1.5以后出来的一个高级for循环,专门用来遍历数组和集合的。它的内部原理其实是个Iterator迭代器,所以在遍历的过程中,不能对集合中的元素进行增删操作。 格式: for(元素的数据类型 变量 : Collection集合or数组){ } 它用于遍历Collection和数组。通常只进行遍历元素,不要在遍历的过程中对集合元素进行增删操作。(底层为迭代器) 二、数据结构 常见的数据结构 1、数组:特点:查找快、增删慢 2、链表;特点:增删快、查找慢 3、栈&队列 栈:先进后出 队列:先进先出 三、List子体系特点 1、List的特有功能 void add(int index, E element) :将元素添加到index索引位置上 E get(int index) :根据index索引获取元素 E remove(int index) :根据index索引删除元素 E set(int index, E element):将index索引位置的的元素设置为element 四、LinkedList特有功能 LinkedList底层使用的是链表结构,因此增删快,查询相对ArrayList较慢 void addFirst(E e) :向链表的头部添加元素 void addLast(E e):向链表的尾部添加元素 E getFirst():获取链头的元素,不删除元素 E getLast():获取链尾的元素,不删除元素 E removeFirst():返回链头的元素并删除链头的元素 E removeLast():返回链尾的元素并删除链尾的元素 五、自定义变量注意事项 equals注意事项 如过比较(equals)两个自定义变量时候,或者判断是否包含(contains)时候,必须要进行equals方法的重写,如果不重写只会比较其中的地址值。
|