列表迭代器和增强for循环
1.列表迭代器
ListIterator:列表迭代器
- 通过List集合的listIterator()方法得到,所以说它是List集合特有的迭代器
- 用于允许程序员沿任一方向遍历列表的列表迭代器,在迭代期间修改列表,并获取列表中迭代器的当前位置
ListIterator中常用方法
-
E next():返回迭代中的下一个元素
-
boolean hasNext():如果迭代具有更多元素,则返回true
package com.gather.list; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListDemo04 { public static void main(String[] args) { List<String> list=new ArrayList<String>(); list.add("hello"); list.add("world"); list.add("java"); //通过list集合的listIterator()方法得到 ListIterator<String> lit = list.listIterator(); while (lit.hasNext()){ String s = lit.next(); System.out.println(s); } System.out.println(list); } }
-
E previous():返回列表中的上一个元素
-
boolean hasPrevious():如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回true
package com.gather.list; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListDemo04 { public static void main(String[] args) { List<String> list=new ArrayList<String>(); list.add("hello"); list.add("world"); list.add("java"); ListIterator<String> lit = list.listIterator(); while (lit.hasPrevious()){ String s = lit.previous(); System.out.println(s); } System.out.println(list); } }
-
void add(E e):将指定的元素插入列表
package com.gather.list; import java.util.ArrayList; import java.util.List; import java.util.ListIterator; public class ListDemo04 { public static void main(String[] args) { List<String> list=new ArrayList<String>(); list.add("hello"); list.add("world"); list.add("java"); ListIterator<String> lit = list.listIterator(); while (lit.hasNext()){ String s = lit.next(); if (s.equals("world")){ lit.add("javaee");//将实际修改值赋值给预期修改值,两个值是一致的不会触发并发修改异常 } } System.out.println(list); } }
遍历集合,得到每一个元素,看有没有"world"这个元素,如果有,就添加一个"javaee"元素,此代码中用的是ListIterator中的add()方法添加元素,用此方法不会触发并发修改异常,原因是查看JDK帮助文档中的源码得知,有一行代码表示的是将实际修改值赋值给预期修改值,两个值是一致的所以不会触发并发修改异常
2.增强for循环
增强for:简化数组和Collection集合的遍历
- 实现Iterable接口的类允许其对象称为增强型for语句的目标
- 它是JDK5之后出现的,其内部原理是一个Iterator迭代器
增强for的格式
-
格式:
for(元素数据类型 变量名:数组或者Collection集合){
//在此处使用变量即可,该变量就是元素
}
-
范例:
int[] arr={1,2,3,4,5};
for(int i:arr){
System.out.println(i)
}
(1)遍历数组
package com.gather.list; public class ForDemo { public static void main(String[] args) { int[] arr={1,2,3,4,5}; for(int i:arr){ System.out.println(i); } System.out.println("=========================="); String[] strArray={"hello","world","java"}; for (String s:strArray){ System.out.println(s); } } }
(2)遍历集合
package com.gather.list;
import java.util.ArrayList;
import java.util.List;
public class ForDemo {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("hello");
list.add("world");
list.add("java");
for(String s:list){
System.out.println(s);
}
}
}
3.验证:增强for循环其内部原理是一个Iterator迭代器
package com.gather.list;
import java.util.ArrayList;
import java.util.List;
public class ForDemo {
public static void main(String[] args) {
List<String> list=new ArrayList<String>();
list.add("hello");
list.add("world");
list.add("java");
for (String s:list){
if (s.equals("world")){
list.add("javaee");//ConcurrentModificationException
}
}
}
}
运行此代码会发现抛出一个并发修改异常ConcurrentModificationException,这个异常是在Iterator迭代器中修改了元素的长度导致预期修改值和实际修改值不一致,一旦出现这个异常就表明增强for循环内部是一个Iterator迭代器