迭代器:迭代器是java中用来遍历集合的一种设计模式,并且需要依赖集合而存在
在Java中存在迭代器Iterator接口,由于迭代器是依赖于集合而存在的,所以我们创建迭代器的实例化对象就需要通过集合中的iterator()方法
//创建集合对象
ArrayList<String> list = new ArrayList<String>();
//添加元素
list.add("hello");
list.add("java");
list.add("world");
//获取
Iterator<String> it = list.iterator();
通过这种方法我们就可以获取到迭代器的实例化对象了,也可以理解为吧集合的元素放入到了迭代器中了
在迭代器中,是存在指针的,这个指针是用来指向数据的,该指针需先判断数据是否存在,然后再获取到这个数据
那么我们如何控制这个指针呢,迭代器中提供了两个方法供我们使用
boolean hasNext():判断是否存在下一个元素
E next():返回下一个元素,并将指针指向下一个元素
通过上面两个方法我们就可以去控制迭代器中的指针,那么我们就通过这个两个方法来遍历集合中的元素
//创建集合对象
ArrayList<String> list = new ArrayList<String>();
//添加元素
list.add("hello");
list.add("java");
list.add("world");
//获取
Iterator<String> it = list.iterator();
//遍历集合
//通过hasNext()方法判断是否存在下一个元素
while(it.hasNext()) {
//存在元素时,吧下一个元素返回回来并打印
System.out.println(it.next());
}
//打印结果为:
//hello
//java
//world
通过上述的循环就可以遍历集合中的所有元素了;
注意:如果在集合遍历过程中,使用集合的方法去增加或者删除集合中的元素,修改了集合长度,导致迭代器获取元素中判断预期修改值和实际修改值不一致,就会报出迭代器的并发修改异常;所以需要增加或者删除数据的操作,在迭代器遍历之前或者之后进行
//创建集合对象
ArrayList<String> list = new ArrayList<String>();
//添加元素
list.add("hello");
list.add("java");
list.add("world");
//获取
Iterator<String> it = list.iterator();
//遍历集合
//通过hasNext()方法判断是否存在下一个元素
while(it.hasNext()) {
//存在元素时,吧下一个元素返回回来并打印
System.out.println(it.next());
//迭代过程中使用集合的方法删除集合元素
list.remove(1);//报出了ConcurrentModificationException异常
}
通过上述测试,知道在迭代器遍历过程中,我们使用集合的方法去增删数据,就会报出ConcurrentModificationException并发修改异常
除了Iterator这种迭代器外,在List集合中存在另一种列表迭代器ListIterator接口,此接口是迭代器的一个子接口,该迭代器可以顺序遍历集合,也可以反序遍历集合;要获取实例化对象和迭代器一样需要依赖于集合,通过集合的listIterator()方法获取实例化对象
对于顺序遍历集合的方法和上述遍历集合的方式相同
反序遍历一样存在控制指针的方法,不过这次指针是从集合元素的最后开始向前进行判断
boolean hasPrevious():判断上一个元素是否存在
E previous():返回上一个元素,并且指针会指向上一个元素
//创建集合对象
List<String> list = new ArrayList<String>();
//添加元素
list.add("hello");
list.add("java");
list.add("world");
//获取列表迭代器
ListIterator<String> it = list.listIterator();
//遍历集合
//通过hasPrevious()方法判断上一个元素是否存在
while(it.hasPrevious()) {
//存在元素时,吧上一个元素返回回来并打印
System.out.println(it.previous());
}
//打印结果为:
//world
//java
//hello
通过上述两种方法我们就可以反序遍历List集合中的元素了
最后还有一种可以遍历集合的方式:增强for循环
//增强for循环的格式
//for(用于接收的数据类型 局部变量名:需要遍历的集合或数组) {
// 代码块
//}
增强for循环底层的实现也是通过迭代器来实现,我们可以通过这种方式来对集合和数组进行遍历
1.对集合进行遍历
//创建集合对象
List<String> list = new ArrayList<String>();
//添加元素
list.add("hello");
list.add("java");
list.add("world");
//通过增强for循环遍历集合
for(String s:list) {
System.out.println(s);
}
//打印结果:
//hello
//java
//world
2.对数据进行遍历
//创建数组
String[] str = {
"hello","java","world"};
//通过增强for循环遍历数组
for(String s:str) {
System.out.println(s);
}
//打印结果:
//hello
//java
//world
通过增强for循环我们就可以很快的遍历集合和数组的元素,由于增强for循环底层实现也是迭代器,所以使用的时候也要注意并发修改异常
今天的分享就到这里了,如果有错误的地方,欢迎大家来指点!