- ------<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,是接口指向实现类,运行的方法都是实现类重写后的方法
l add(Object o)将元素添加到集合,存储到集合
l addAll(Collection c)参数是一个集合,把一个集合存储到另一个集合
l void clear()清除集合中的所有对象,但是集合容器还在
l int size()返回集合中存储元素的个数
l boolean isEmpty()如果集合中元素个数是0,返回true
l 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集合转数组
l 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();
使用迭代器取出集合中存储元素的三个步骤:
l 调用集合方法iterator()获取迭代器接口的实现类对象
l 调用接口Iterator方法hasNext()判断集合中有没有下一个元素
l 调用接口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)
集合本身是允许重复的,自己写一个功能,重复的去掉
实现思路:借用一个集合实现功能
原始集合,新集合是空的
使用迭代器迭代原始集合
从原始集合中分别取出每一个对象,
获取出的对象,看看他包含不包含在新集合中,如果包含,什么也不用做,如果不包含就把这个对象,存储到新集合中。原始集合迭代完成,新集合中存储的就是原始集合去掉重复对象后的结果