Java迭代器Iterator和ListIterator的使用 1

一, 概述

  • 迭代器与集合类的关系:

在这里插入图片描述

  • 由图可知, Iterator是Collection接口的父类, 所以对于Collection的子类List和Set接口, 它俩的具体实现类都可以使用迭代器进行遍历.

二,Iterator接口的使用

Iterator接口也是Java集合框架中的一员,但是Collection和Map接口主要是用于存储元素.而Iterator接口主要用于遍历Collection中的元素.因此Iterator对象也被称为迭代器.


迭代器的使用示例-1:
迭代遍历

//使用集合类对象调用Iterator()去得到迭代器对象
Iterator iterator = arrayList.Iterator();
//使用hasNext()判断集合中是否存在下一个元素
while(iterator.hasNext()){
//使用next()返回集合中的下一个元素
    Object obj = iterator.next();
    sout(obj);
}  

注意: 当通过迭代器获取List或是Set中的元素时,都会将这些元素当做Object类型对待,所以如果我们想得到特定类型的元素时,需要进行强制类型转换(或者使用泛型)

查看迭代器和泛型的结合使用


迭代器的使用示例-2
Iterator类中 remove()的使用
-先看一段代码:

import java.util.*;

public class IteratorTest {
    public static void main(String[] args) {
        List arrayList = new ArrayList();
        arrayList.add("Jack");
        arrayList.add("Annie");
        arrayList.add("Rose");
        arrayList.add("Tome");

        ///初始化迭代器并遍历集合
        ///如果找到"Annie",就是用arrayList的remove()将其删除
        Iterator iterator = arrayList.iterator();
        while(iterator.hasNext()){
            Object obj = iterator.next();
            if(obj.equals("Annie")){
                arrayList.remove(obj);
            }
        }

    }
}
  • 运行结果:

  • 分析:
    在使用迭代器对集合中的对象进行遍历时,如果使用集合类的remove()方法删除集合中的元素时,会发生这种异常.出现异常的原因是集合中删除了元素后会使得迭代器预期的迭代次数发生改变,导致迭代的结果不准确;

  • 解决方法:

    • 方法1. 使用Iterator自带的remove方法, 上述代码中的 arrayList.remove(obj); 换成 iterator.remove(); 即可;
    • 方法2.删除这个元素之后立马退出循环,即在删除语句之后加上break.

此类问题的解决办法同样适用于在foreach循环中删除集合中元素

三, ListIterator

  • 我们知道Iterator提供了next()和hasNext()方法,通过这两个方法完成对集合中元素的迭代, Iterator的迭代方向是正向迭代(从集合中的第一个元素到对最后一个元素).
  • JDK为了使迭代更加多元化,提供了ListIterator迭代器用于反向迭代;
  • ListIterator是Iterator的子类,除了包含父类Iterator的方法外,还有一些特有的方法:
ListIterator特有方法功能描述
void add(Object o)将指定的元素插入列表(可选操作)
boolean hasPrevious如果以逆序遍历列表,列表迭代器有多个元素,则返回true
Object previous()返回列表的前一个元素
void remove从列表移除由next 或 previous返回的最后一个元素(可选操作)
  • 示例代码:
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;
///演示ListIterator从后向前遍历集合
public class ListIteratorTest {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		List arrayList = new ArrayList();
		
		arrayList.add("难用");
		arrayList.add("他妈");
		arrayList.add("真");
		arrayList.add("Idea");		
///在使用listIterator(int index)方法获得ListIterator迭代器对象时,需要指定一个int类型的参数去指定迭代开始的起始位置.		
//此处我们是从后往前逆序迭代
		ListIterator listIterator = arrayList.listIterator(arrayList.size());
		
		while(listIterator.hasPrevious()) {
			System.out.println(""+listIterator.previous());
		}
	}
}
posted @   青松城  阅读(189)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示