JAVA中的ITERATOR和LISTITERATOR
在学习Java的时候,仅仅是只知道iterrator的,在面试的时候见到了listiterator,虽然明知道他们都是迭代器,但是对于他们之间的联系和区别却懵逼了,现在来记录下
迭代器是一种设计模式,它是一个对象,它可以遍历并选择序列中的对象,而开发人员不需要了解该序列的底层结构。迭代器通常被称为“轻量级”对象,因为创建它的代价小
凡是实现了Collection接口的集合类,都有一个Iterator方法,用于返回一个实现了Iterator接口的对象,用于遍历集合;(Iterator接口定义了3个方法分别是hasNext(),next(),remove();)
我们在使用List,Set的时候,为了实现对其数据的遍历,我们经常使用到了Iterator(迭代器)。使用迭代器,你不需要干涉其遍历的过程,只需要每次取出一个你想要的数据进行处理就可以了
集合分为两类,一类如list、set是按照单个元素存储的collection,一类是如map是以key—value存储的,两类集合体系,无论数据的存储和遍历都存在非常大的差异,所以我们在讨论iterrator和listiterator是指的list和set的中的应用
但是在使用的时候也是有不同的。List和Set都有iterator()来取得其迭代器。对List来说,你也可以通过listIterator()取得其迭代器,两种迭代器在有些时候是不能通用的,Iterator和ListIterator主要区别在以下方面
- iterator()方法在set和list接口中都有定义(即iterator()是通用的,但是ListIterator()仅存在于list接口中(或实现类中);
- Iterator容易引起并发修改异常问题,而ListIterator可以避免线程安全问题的发生,因为其有内置的add()等修改集合的方法
- ListIterator和Iterator都有hasNext()和next()方法,可以实现顺序向后遍历,但是ListIterator有hasPrevious()和previous()方法,可以实现逆向(顺序向前)遍历。Iterator就不可以
- ListIterator可以定位当前的索引位置,nextIndex()和previousIndex()可以实现。Iterator没有此功能
- 都可实现删除对象,但是ListIterator可以实现对象的修改,set()方法可以实现。Iierator仅能遍历,不能修改
Iterator的简单实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | public class TestIterator { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); list.add( "我" ); list.add( "爱" ); list.add( "你" ); list.add( "哈哈哈" ); System.out.println( "修改之前的集合" + list); //以集合的方式打印 for (Iterator iter = list.iterator();iter.hasNext(); ) { String str = (String) iter.next(); System.out.println(str); } Iterator iter = list.iterator(); while (iter.hasNext()) { String str = (String) iter.next(); //不能直接进行修改,会报java.util.ConcurrentModificationException异常 if (str.equals( "哈哈哈" )){ list.add( "嘿嘿嘿" ); } System.out.println(str); } } } |
方法 | 功能 |
hasNext() | 判断集合列表中是否还有可以迭代的元素 |
next() | 返回下一个元素 |
remove() | 移除最近返回的一个元素 |
ListIterator的简单实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public class TestIterator { public static void main(String[] args) { ArrayList<String> list = new ArrayList<String>(); list.add( "我" ); list.add( "爱" ); list.add( "你" ); list.add( "哈哈哈" ); System.out.println( "修改之前的集合" + list); ListIterator liter = list.listIterator(); ; while (liter.hasNext()) { String str = (String) liter.next(); if (str.equals( "哈哈哈" )) { int i = liter.nextIndex(); System.out.println(i); //可以直接删除在添加,也可以用set方法 liter.remove(); liter.add( "嘿嘿嘿" ); } System.out.println(list); } } } |
方法 | 功能 |
hasNext() | 判断是否还有下一个元素可以迭代 |
next() | 返回下一个元素 |
hasPrevious() | 判断是否还有上一个元素可以迭代 |
previous() | 返回上一个元素 |
add() | 返回上一个元素 |
set(E e) | 用指定的元素替换最近返回的元素 |
remove() | 移除最近返回的元素 |
参考资料1:http://www.cnblogs.com/tjudzj/p/4459443.html
参考资料2:https://blog.csdn.net/u011277123/article/details/80110405
参考资料3:https://www.cnblogs.com/lxqiaoyixuan/p/7156944.html
参考资料4:https://blog.csdn.net/huaairen/article/details/86687514
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 智能桌面机器人:用.NET IoT库控制舵机并多方法播放表情
· Linux glibc自带哈希表的用例及性能测试
· 深入理解 Mybatis 分库分表执行原理
· 如何打造一个高并发系统?
· .NET Core GC压缩(compact_phase)底层原理浅谈
· 手把手教你在本地部署DeepSeek R1,搭建web-ui ,建议收藏!
· 新年开篇:在本地部署DeepSeek大模型实现联网增强的AI应用
· Janus Pro:DeepSeek 开源革新,多模态 AI 的未来
· 互联网不景气了那就玩玩嵌入式吧,用纯.NET开发并制作一个智能桌面机器人(三):用.NET IoT库
· 【非技术】说说2024年我都干了些啥