Collection集合体系
其中蓝色框为接口,红色框为具体实现类
Collection集合概述和使用
Collection是单例集合的顶层接口,它表示一组对象,这些对象也称为Collection的元素
JDK不提供此接口的任何直接实现,它提供更具体的子接口(如list和set)实现
创建Collection集合的对象:多态的方式、具体的实现类为ArrayList
集合使用步骤:
//创建Colleciton集合对象
Collection<Student> = new ArrayList<Student>();
//创建学生对象
Student s1 = new ("小明");
Student s2 = new ("老王");
Student s3 = new ("张总");
//把学生添加到集合
s.add(s1);
s.add(s2);
s.add(s3);
//遍历集合(迭代器方式)
//通过集合对象获取迭代器
Iterator<Student> it = s.iterator();
while(it.hasNext()){
Student c = it.next();
//输出
System.out.println(c.getName());
}
List集合概述和特点
List集合:有序集合(也称为序列),用户可以精确控制列表中每个元素的插入位置。用户可以通过整数索引访问元素,并搜索列表中的元素。与Set集合不同,列表通常允许重复的元素。
特点:有序--存储和取出的元素顺序一致
可重复--存储的元素可以重复
因为List继承Collection类,所以List类由两种遍历方式(迭代器方式、for循环方式。迭代器方式和我们上边写的Collection中的大致是一样的)
并发修改异常
我们先了解一下两个变量:
modCount(实际修改集合的次数)和expectModCount(预期修改集合的次数)
出现该异常的原因:上边我们用到了迭代器来对集合进行白能力,当我们通过迭代器获取元素的时候,next()方法每次都会调用checkForComodification方法来比较modCount和expectModCount的值是否相同,如果不同就会报出并发异常。在迭代器遍历过程中,通过集合对象修改了集合中元素的长度(我们调用add方法后会对modCount的值进行增加),这就造成了迭代器获取元素中判断预期修改值和实际修改值不一致。
解决方法:通过for循环的方式进行遍历,get方法获取,add进行添加。(原因:虽然在add方法中还是会对modCount的值进行++,但是get方法不会对两个值进行比较)
列表迭代器
列表迭代器:通过list集合的listIterator方法得到,所以说它是list集合特有的迭代器
用于允许程序员沿任一方向遍历列表的列表迭代器。在迭代期间修改列表,并获取列表中迭代器的当前位置
常用方法:
E next():返回迭代中的下一个元素
Boolean hasNext():如果迭代具有风多元素,则返回true
E previous():返回列表中的上一个元素
Boolean hasPrevious():如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true
Void add(E e ):将指定的元素插入列表
上面我们了解到,通过迭代器方法不能向列表中添加元素,所以我们学习列表迭代器方法来添加。成功原理:在ListIterator中,add方法最终会将modCount赋值给expectModCount,所以即便调用next方法,两者值是相等的,就不会发生并发修改异常。
增强for循环
1、简化数组和Collection集合的遍历
2、实现Iterable接口的类允许其对象成为增强型for语句的目标
3、它是JDK5之后出现的,其内部原理是一个Iterator迭代器(也就是把通过集合对象获取迭代器那一步省略了)
格式:for(元素数据类型 变量名:数组或者Collection集合){
//在此处使用变量即可,该变量就是元素
}
上边我们列出了迭代器方式,下面接着写出for循环和增强for循环。
//利用for循环遍历集合
for(int i = 0 ; i<s.size();i++){
System.out.println(list.get(i));
}
//增强for循环
for(int i : s ){
System.out.println(i);
}