黑马程序员---集合体系的继承关系图。顶层接口Collection中的方法,迭代器Iterator使用和原理,List派系特点

时间:2022-06-17 21:09:24

  1. ------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! ------

1.      第十六天学习内容,对象数组,集合由来,集合数组的区别。集合体系的继承关系图。顶层接口Collection中的方法,迭代器Iterator使用和原理,List派系特点,List派系的特有内容,特有方法,特有迭代器,ArrayList类的特点和使用。

 

2.      对象数组

  学生对象,姓名和成绩,存储起来,把学生对象存储到数组中。

  数组中存储基本数据类型,数组中存储的是引用类型,学生对象

  其中的弊端!长度

 

3.      集合的由来,特点

  由于对象数组弱点就是长度的固定。为了解决问题,Java从JDK1.2版本开始,开发出来集合框架,处理掉对象数组的问题。集合长度是可变的。

  数组可以存储基本类型,存储对象

  但是,集合只存储对象,不收基本数据类型

  数组和集合都是容器:基本数据多了存数组,对象太多存集合

 

4.      数组和集合的区别

  数组定长

  集合变长

  数组存储类型单一

  集合存储任意对象

  数组存储基本类型,对象

  集合只存储对象

 

5.      学习集合框架,学习的是什么

  学习的集合中每一个容器的特点,怎么存储对象,怎么取出来

  如果你掌握了每一个容器自身特点,会存储存储对象,会把对象从集合中取出来

 

6.      顶层接口Collection的方法

  集合中的顶层接口,所有的抽象方法,下面的子类,或者子接口都是具备的

  接口方法都是抽象的,找实现类ArrayList,是接口指向实现类,运行的方法都是实现类重写后的方法

add(Object o)将元素添加到集合,存储到集合

l  addAll(Collection c)参数是一个集合,把一个集合存储到另一个集合

l  void clear()清除集合中的所有对象,但是集合容器还在

int size()返回集合中存储元素的个数

l  boolean isEmpty()如果集合中元素个数是0,返回true

boolean contains(Object o)判断集合中是不是包含这个对象,如果包含返回true

l  boolean containsAll(Collection c)一个集合是否完全包含另一个集合,是集合中存储的对象,如果完全包含,返回true

l  boolean remove(Object o)移除集合中的元素,移除成功返回true

l  boolean removeAll(Collection c)移除两个集合中相同的元素

l  booean retainAll(Collection c)获取两个集合的交集

l  toArray()集合转成数组,Arrays  asList集合转数组

Iterator iterator()获取迭代器对象

 

7.      迭代器

  迭代器就是从集合中取出元素的方式

  但是每种集合子类存储对象的方式不同,造成获取对象的方式也不同,因此规定了一个接口(Iterator)所有子类的迭代器必须满足接口的规则

 

  Iterator iterator()方法是获取迭代器对象的方法,返回值是一个接口,返回的是这个接口的实现类的对象

  Iterator接口---图,就是摇杆

  iterator()--投币

  夹子,或者是铲子,--就是接口的实现类,实现类其实是容器中的内部类.

  每一个集合子类中,都有个方法 iterator(),返回的就是自己内部类的对象,但是这个内部类实现了Iterator接口

  Iterator接口中的方法

      boolean hasNext()判断集合中有没有下一个被取出的元素,有返回true

      Object next()获取集合中班的下一个元素

      void remove()移除元素,是迭代过程中移除

 

  迭代器的实现源码--ArrayList为演示

  public classArrayList extends XXX implements List{

          publicIterator iterator(){

             returnnew Itr();

          }

          privateclass Itr implements Iterator{

              publicboolean hasNext(){}

              publicObject next(){}

              publicvoid remove(){}

           }

  }

  使用内部类对象,直接调用不行,内部类是私有修饰,通过iterator方法获取接口Iterator的实现类的对象

   Iterator it = ArrayList对象.iterator();

 

 使用迭代器取出集合中存储元素的三个步骤:

调用集合方法iterator()获取迭代器接口的实现类对象

调用接口Iterator方法hasNext()判断集合中有没有下一个元素

调用接口Iterator方法next()获取集合中的元素

 

8.      迭代器获取集合元素的注意事项

l  如果hasNext()判断为false,还用next()获取,出现没有元素被取出异常

l  在迭代的过程中,不允许使用集合的方法改变集合长度,出现并发修改异常

l  迭代器创建好以后,只能迭代一次

l  一次迭代中,不允许出现多次next方法

 

9.      迭代器方法remove

  迭代过程中,删除元素,方法是迭代器方法,不是集合方法,因此不会出现并发修改异常

  void remove()删除的是谁,next()方法获取到的是谁,remove删除的就是谁

 

10.  List接口派系

  List接口继承Collection接口,自己成立一个派系

  List列表,清单,派系特点:有序,重复,下标

l  存储有序的。顺序:怎么存储的,怎么取出来

l  允许存储重复元素

l  List集合中的元素都是有下标的

 

11.  List接口特有方法

l  void add(int index,Object o)在列表的指定位置上插入元素

l  boolean addAll(int index,Collection c)在列表的指定位置上插入另一个集合

l  Object get(int index)返回指定索引上的元素!

l  Object remove(int index)移除指定下标上的元素,返回移除前的对象

l  Object set(int index,Object o)修改指定下标上的元素,返回修改前的元素

l  List subList(int start,int end)获取集合中的一部分,包含头,不包含尾,返回新集合

 

12.  List派系特有迭代器

  迭代器只能应用于List集合,其他集合不能用

  List特有迭代器接口ListIterator,这个接口是Iterator的子接口

  List的派系的每一个子类,都有一个方法listIterator,返回ListIterator接口的实现类对象,这个实现类,就是集合的内部类。

  特点:迭代中,可以使用迭代器方法,进行添加,修改,删除集合中的元素,两个方向遍历

  ListIterator接口方法

     add(Object)添加,迭代到哪个对象,添加到这个对象的后面

     set(Object)修改,迭代到哪个对象,修改的就是哪个对象

     remove()删除

     hasPrevious() == hasNext() 逆向使用

     previous() == next() 逆向使用

 

13.  ArrayList类

  容器的底层实现方式,可变长度数组(扩容,自动复制数组),数组默认大小10个长度。

  线程不安全集合,运行速度快。查询速度快,增删慢

  每次增长50%。

  ArrayList使用的频率最高,速度快,查询也快

 

14.  ArrayList练习

  去掉ArrayList中的重复对象

  array.add(123);array.add(123)

  集合本身是允许重复的,自己写一个功能,重复的去掉

  实现思路:借用一个集合实现功能

  原始集合,新集合是空的

  使用迭代器迭代原始集合

  从原始集合中分别取出每一个对象,

  获取出的对象,看看他包含不包含在新集合中,如果包含,什么也不用做,如果不包含就把这个对象,存储到新集合中。原始集合迭代完成,新集合中存储的就是原始集合去掉重复对象后的结果