迭代器
ArrayList<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
//迭代器遍历:
Iterator it = list.iterator();
while (it.hasNext()){
System.out.println(it.next());
}
iterator(),Iterator,Iterable关系
- ArrayList集合--->(implements)List接口--->(extends)Collection接口--->(extends)Iterable接口--->(抽象方法)iterator()
- 抽象方法要在具体的实现类中得到实现(此实现类是ArrayList)
- iterator()方法返回类型是Iterator接口
- Iterator接口中有两个经典方法:hasNext(),next()-->抽象方法----那么抽象方法在哪里具体实现呢?--->返回值的实现类
- 在Itr这个类中得到具体实现(而该类是ArrayList的内部类)
hasNext(),next()的具体实现
- Itr是ArrayList的内部类
- Itr中实现了接口Iterator接口中定义的经典方法hasNext(),next()
增强for循环
- 增强for循环 底层也是通过迭代器实现的
ListIterator迭代器
- 加入字符串
ArrayList<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
//在“cc”之后添加一个字符串“kk”
Iterator<String> it = list.iterator();
while (it.hasNext()){
if("cc".equals(it.next())){
list.add("kk");
}
}
//发现报错:
Exception in thread "main" java.util.ConcurrentModificationException
//并发修改异常
- 出错原因:迭代器和list同时对集合进行操作
- 解决办法:事情让一个"人"做--->引入新的迭代器:ListIterator
- 迭代和添加操作都是靠ListIterator来完成
public static void main(String[] args) {
ArrayList<String> list = new ArrayList<>();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
//在“cc”之后添加一个字符串“kk”
ListIterator<String> it = list.listIterator();
while (it.hasNext()){
if("cc".equals(it.next())){
it.add("kk");//通过迭代器进行添加(只让一个“人”操作)
}
}
System.out.println(list);//查看输出
System.out.println(it.hasNext());//是否还有下一元素--false
System.out.println(it.hasPrevious());//看前面是否还有元素--true
//逆向遍历
while (it.hasPrevious()){
System.out.println(it.previous());
}
System.out.println(it.hasNext());//true---逆向遍历完后指针指向第一个元素
System.out.println(it.hasPrevious());//false---此时指针在第一个元素,前面没有元素了
System.out.println(list);
//输出:
[aa, bb, cc, kk, dd, ee]
false
true
ee
dd
kk
cc
bb
aa
true
false
[aa, bb, cc, kk, dd, ee]
标签:迭代,cc,ArrayList,list,add,println
From: https://www.cnblogs.com/Mc9r4dy/p/18402940