我是靠谱客的博主 开放红酒,最近开发中收集的这篇文章主要介绍java集合迭代器_JAVA基础——集合Iterator迭代器的实现,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、迭代器概述

1、什么是迭代器?

在Java中,有很多的数据容器,对于这些的操作有很多的共性。Java采用了迭代器来为各种容器提供了公共的操作接口。这样使得对容器的遍历操作与其具体的底层实现相隔离,达到解耦的效果。

在Iterator接口中定义了三个方法:

2d2d8282b457f07167b75ab5e3f72355.png

2、迭代器使用

48304ba5e6f9fe08f3fa1abda7d326ab.png

public static voidmain(String[] args)

{

List list=new ArrayList<>();

list.add("abc");

list.add("edf");

list.add("ghi");

for(Iterator it=list.iterator();it.hasNext();)

{

System.out.println(it.next());

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

执行结果:

881361b829b3aecf1e47abbdc04072fc.png

二、ArrayList的Iterator实现

48304ba5e6f9fe08f3fa1abda7d326ab.png

private class Itr implements Iterator{

int cursor; //index of next element to return

int lastRet = -1; //index of last element returned; -1 if no such

int expectedModCount =modCount;

...}

48304ba5e6f9fe08f3fa1abda7d326ab.png

在ArrayList内部定义了一个内部类Itr,该类实现了Iterator接口。

在Itr中,有三个变量分别是

cursor:表示下一个元素的索引位置

lastRet:表示上一个元素的索引位置

expectModCount:预期被修改的次数

下面看一下Itr类实现了Iterator接口的三个方法:

public booleanhasNext()

{

return cursor != size;//当cursor不等于size时,表示仍有索引元素

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

public E next() //返回下一个元素

{

checkForComodification();

int i =cursor;

if (i >=size)

throw newNoSuchElementException();

Object[] elementData = ArrayList.this.elementData;

if (i >=elementData.length)

throw newConcurrentModificationException();

cursor = i + 1;

return (E) elementData[lastRet =i];

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

在next()方法中有一个checkForComodification()方法,其实现为:

final voidcheckForComodification()

{

if (modCount !=expectedModCount)

throw newConcurrentModificationException();

}

可以看到,该函数是用来判断集合的修改次数是否合法。

在集合内部维护一个字段modCount用于记录集合被修改的次数,每当集合内部结构发生变化(add,remove,set)时,modCount+1。

在迭代器内部也维护一个字段expectedModCount,同样记录当前集合修改的次数,初始化为集合的modCount值。当我们在调用Iterator进行遍历操作时,如果有其他线程修改list会出现modCount!=expectedModCount的情况,就会报并发修改异常java.util.ConcurrentModificationException。下面为示例代码:

48304ba5e6f9fe08f3fa1abda7d326ab.png

public static voidmain(String[] args)

{

ArrayList aList=new ArrayList();

aList.add("bbc");

aList.add("abc");

aList.add("ysc");

aList.add("saa");

System.out.println("移除前:"+aList);

Iterator it=aList.iterator();

while(it.hasNext())

{

if("abc".equals(it.next()))

{

aList.remove("abc");

}

}

System.out.println("移除后:"+aList);

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

41e7076bcd9a9be12fa680da11a34c7e.png

上面的代码中,如果我们只使用迭代器来进行删除,则不会出现并发修改异常错误。

48304ba5e6f9fe08f3fa1abda7d326ab.png

public static voidmain(String[] args)

{

ArrayList aList=new ArrayList();

aList.add("bbc");

aList.add("abc");

aList.add("ysc");

aList.add("saa");

System.out.println("移除前:"+aList);

Iterator it=aList.iterator();

while(it.hasNext())

{

if("abc".equals(it.next()))

{

it.remove();

}

}

System.out.println("移除后:"+aList);

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

e9ffe0c7a42f49731d1cb04c3a3f44ba.png

48304ba5e6f9fe08f3fa1abda7d326ab.png

public voidremove()

{

if (lastRet < 0)

throw newIllegalStateException();

checkForComodification();

try{

ArrayList.this.remove(lastRet);

cursor =lastRet;

lastRet = -1;

expectedModCount =modCount;

} catch(IndexOutOfBoundsException ex) {

throw newConcurrentModificationException();

}

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

在执行remove操作时,同样先执行checkForComodification(),然后会执行ArrayList的remove()方法,该方法会将modCount值加1,这里我们将expectedModCount=modCount,使之保持统一。

三、ListIterator

上面可以看到,Iterator只提供了删除元素的方法remove,如果我们想要在遍历的时候添加元素怎么办?

ListIterator接口继承了Iterator接口,它允许程序员按照任一方向遍历列表,迭代期间修改列表,并获得迭代器在列表中的当前位置。

ListIterator接口定义了下面几个方法:

ed3defc3e6e1acf2f192e9c962750c52.png

下面使用ListIterator来对list进行边遍历边添加元素操作:

48304ba5e6f9fe08f3fa1abda7d326ab.png

public static voidmain(String[] args)

{

ArrayList aList = new ArrayList();

aList.add("bbc");

aList.add("abc");

aList.add("ysc");

aList.add("saa");

System.out.println("移除前:" +aList);

ListIterator listIt =aList.listIterator();

while(listIt.hasNext())

{

if ("abc".equals(listIt.next()))

{

listIt.add("haha");

}

}

System.out.println("移除后:" +aList);

}

48304ba5e6f9fe08f3fa1abda7d326ab.png

6b1c40f7af5d488d8f803007ac2a21da.png

最后

以上就是开放红酒为你收集整理的java集合迭代器_JAVA基础——集合Iterator迭代器的实现的全部内容,希望文章能够帮你解决java集合迭代器_JAVA基础——集合Iterator迭代器的实现所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部