Collection接口和迭代器
来源:互联网 发布:js 图片跟随鼠标移动 编辑:程序博客网 时间:2024/06/08 14:26
Collection接口和迭代器
1、Collection的常见方法:
1,添加。
boolean add(Object obj):
boolean addAll(Collection coll):
2,删除。
boolean remove(object obj):
boolean removeAll(Collection coll); //将两个集合中的相同元素从调用removeAll的集合中删除。(删除相同,保留不同)
void clear();
3,判断:
boolean contains(object obj):
boolean containsAll(Colllection coll);
boolean isEmpty():判断集合中是否有元素。
4,获取:
int size():
Iterator iterator():取出元素的方式:迭代器。
5,其他:
boolean retainAll(Collection coll);取交集。//取交集,保留和指定的集合相同的元素,而删除不同的元素。(删除不同,保留相同)和removeAll功能相反。
Object[] toArray():将集合转成数组。
2、Collection接口的继承接口(两大体系)
|--List:有序(存入和取出的顺序一致),元素都有索引(角标),元素可以重复。
|--Set:元素不能重复,无序。
3、迭代器Iterator(collection集合共有)
迭代器:就是实现了一个Iterator接口的每一个容器内部的内部对象
该对象必须依赖于具体容器,因为每一个容器的数据结构都不同。所以该迭代器对象是在容器中进行内部实现的。(依赖于容器的内部类)
对于使用容器者而言,具体的实现不重要,只要通过容器获取到该实现的迭代器的对象即可,也就是iterator方法。
Iterator接口就是对所有的Collection容器进行元素取出的公共接口。
其实就是抓娃娃游戏机中的夹子!
4、ListIterator接口(List集合特有)
5、迭代器演示:
5.1实例代码
public static void main(String[] args) { List list = new ArrayList(); list.add("abc1"); list.add("abc2"); list.add("abc3"); System.out.println("list:" + list); /* *//Iterator 迭代器遍历 Iterator it=list.iterator(); while(it.hasNext()){ *Object obj=it.next(); if(obj.equals("abc2")){ *list.add("abc9");//java.util.ConcurrentModificationException //某个线程在 *Collection 上进行迭代时,通常不允许另一个线性修改该 Collection * *//在迭代器过程中,不要使用集合操作元素,容易出现异常。 *//可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作。 } else *System.out.println("next:"+obj); }System.out.println("list:"+list); */ // ListIterator迭代器遍历 ListIterator lit = list.listIterator();// 它可以实现在迭代过程中完成对元素的增删改查。 // 注意:只有list集合具备该迭代功能. while (lit.hasNext()) { Object obj = lit.next(); if ("abc2".equals(obj)) { lit.set("abc99"); } else { System.out.println("next:" + obj); } } System.out.println("修改后list:" + list); }}
5.2迭代器Iterator和ListIterator比较
Iterator:
(1)Collection集合共有
(2)可以遍历集合中的元素,但是只能单向遍历
(3)可以删除元素
(4)不可以修改元素
(5)不能定位当前索引的位置
ListIterator:
(1)List集合特有
(2)可以遍历集合中的元素,可以双向遍历
(3)可以删除元素
(4)可以修改元素,在遍历的同时实现对象的添加(add方法)或者对象的修改(set方法)
(5)可以定位当前索引的位置(nextIndex方法和previousIndex方法)
5.3迭代器错误使用案例与解析
5.3.1错误使用案例
(1)Iterator使用
【1】代码
packagecollection; importjava.util.ArrayList;importjava.util.Iterator;importjava.util.List;import java.util.ListIterator; public class IteratorFirst { public static void main(String[] args) { List list = new ArrayList(); list.add("abc1"); list.add("abc2"); list.add("abc3"); System.out.println("list:" + list); // Iterator 迭代器遍历 Iterator it = list.iterator(); while (it.hasNext()) { Object obj = it.next(); if (obj.equals("abc2")) { list.add("abc9");// java.util.ConcurrentModificationException //某个线程在Collection 上进行迭代时,通常不允许另一个线性修改该 Collection // 在迭代器过程中,不要使用集合操作元素,容易出现异常。 // 可以使用Iterator接口的子接口ListIterator来完成在迭代中对元素进行更多的操作。 } else System.out.println("next:" + obj); } } System.out.println("list:" + list); } }
【2】结果
list:[abc1,abc2, abc3]
next:abc2
Exceptionin thread "main" java.util.ConcurrentModificationException
atjava.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at collection.IteratorFirst.main(IteratorFirst.java:21)
(2)ListIterator使用
【1】代码
packagecollection; importjava.util.ArrayList;import java.util.Iterator;importjava.util.List;importjava.util.ListIterator; public class IteratorTest { public static void main(String[] args) { List list = new ArrayList(); list.add("abc1"); list.add("abc2"); list.add("abc3"); System.out.println("list:" + list); // ListIterator迭代器遍历 ListIterator lit = list.listIterator();// 它可以实现在迭代过程中完成对元素的增删改查。 // 注意:只有list集合具备该迭代功能. while (lit.hasNext()) { Object obj = lit.next(); if ("abc2".equals(obj)) {// lit.set("abc99");//ListIterator方法修改元素,没有问题 list.add("abc88");//在迭代器便利时,利用list集合的方法添加或修改元素,会抛出异常 //java.util.ConcurrentModificationException } else { System.out.println("next:" + obj); } } } }
【2】结果
list:[abc1,abc2, abc3]
next:abc1
Exceptionin thread "main" java.util.ConcurrentModificationException
atjava.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
at java.util.ArrayList$Itr.next(ArrayList.java:851)
at collection.IteratorTest.main(IteratorTest.java:22)
5.3.2解析
(1)在利用迭代器进行遍历集合a时,不能利用集合a的方法,去修改或者添加元素。否则会抛出异常:ConcurrentModificationException
备注:ConcurrentModificationException---------某个线程在Collection上进行迭代时,通常不允许另一个线性修改该 Collection。通常在这些情况下,迭代的结果是不确定的。如果检测到这种行为,一些迭代器实现(包括 JRE提供的所有通用collection 实现)可能选择抛出此异常
(2)只能利用迭代器自身的方法去修改,当前正在遍历的集合a。其中Iterator只能删除元素,不能修改集合元素;
而ListIterator不但可以删除元素,而且可以在遍历的同时,给集合添加元素或者修改集合中的元素内容
5.4 Iterator和ListIterator比较参考文章
CSDN博文:JAVA中ListIterator和Iterator详解与辨析
地址:http://blog.csdn.net/longshengguoji/article/details/41551491
- Collection接口和迭代器
- Collection和Map接口
- 接口Collection和List
- Collection和Iterator接口
- Collection接口和Iterator接口
- Collection接口 和 Map接口
- collection中的方法和接口
- Collection接口和AbstractCollection接口的用法
- Collection接口、List接口及迭代器
- Collection和List接口的remove方法
- JAVA集合详解(Collection和Map接口)
- Collection接口和Collections集合工具类
- JAVA集合详解(Collection和Map接口)
- 浅析Comparable接口和collection的排序
- Java中Collection和Iterator接口
- Collection接口的栈和队列
- Collection接口和Collections类的区别
- JAVA集合详解(Collection和Map接口)
- RSA AES 前端JS与后台JAVA的加密解密的是实现
- springMVC 的工作原理和机制
- 75. Sort Colors
- VIP视频解析
- Android 透明状态栏
- Collection接口和迭代器
- CS231n学习笔记--14. Reinforcement Learning
- 约瑟夫问题
- Spring工程,测试类编写demo
- IE9下MP3音频倍速播放及调整音量存在延迟的可能原因
- HttpClient实现远程调用
- 使用jenkins完成参数化构建-集成git和ssh-未完待续
- HDOJ2072 单词数
- JS 里为什么会有 this