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的简单实现
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的简单实现
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