您的位置:首页 > 编程语言 > Java开发

关于使用Iterator时报NoSuchElementException错误的解决方案以及遍历容器的效率问题

2018-01-14 23:21 441 查看
package com.itcast.cn;

import java.util.ArrayList;
import java.util.Iterator;

public class Test {
public static void main(String[] args) {
Plant p1=new Plant();
Plant p2=new Plant();
Plant p3=new Plant();
p1.setName("多肉");
p1.setPrice(20);
p2.setName("百合");
p2.setPrice(30);
p3.setName("玫瑰");
p3.setPrice(50);

ArrayList<Plant> plist=new ArrayList<>();
plist.add(p1);
plist.add(p2);
plist.add(p3);
Iterator<Plant> it=plist.iterator();
while(it.hasNext())
{
if("玫瑰".equals(it.next().getName()))
{

{it.next().setPrice(it.next().getPrice()+50);
it.next().showInfo();}
}

}
}

}

如代码所示  通过对集合plist的遍历来完成对象修改属性值(price)这一操作,对象类略去。
在运行之后出现了下面的异常

Exception in thread "main" java.util.NoSuchElementException
at java.util.ArrayList$Itr.next(ArrayList.java:834)
at com.itcast.cn.Test.main(Test.java:30)

其原因是因为多次使用it.next ,每调用一次it.next都会使迭代器继续前进,从而导致了索引超出集合长度,不能找到索引所指定的元素
修改为如下代码后正常
package com.itcast.cn;

import java.util.ArrayList;
import java.util.Iterator;

public class Test {
public static void main(String[] args) {
Plant p1=new Plant();
Plant p2=new Plant();
Plant p3=new Plant();
p1.setName("多肉");
p1.setPrice(20);
p2.setName("百合");
p2.setPrice(30);
p3.setName("玫瑰");
p3.setPrice(50);

ArrayList<Plant> plist=new ArrayList<>();
plist.add(p1);
plist.add(p2);
plist.add(p3);
Iterator<Plant> it=plist.iterator();
while(it.hasNext())
{   Plant p=it.next();
if("玫瑰".equals(p.getName()))
{

{p.setPrice(p.getPrice()+50);
p.showInfo();}
}

}
}

}


运行结果为
玫瑰的价格100

顺便提一下 for循环,增强for循环(for each),Iterator 的遍历效率差异,对于Arraylist来说,for循环的遍历效率比Iterator略快,原因是因为对于声明了RandomAccessList的Arraylist来说,for循环依靠下标更适合对底层是数组(顺序表)的结构(ArrayList)进行遍历,而对于Linklist(底层为链表实现)和Treeset(底层用红黑树实现)来说,Iterator的效率远高于for循环,
而增强for循环(for each)其实是基于Iterator实现的,在使用增强for循环时 系统会生成一个Iterator对象。然后对Iterator进行操作。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  java 集合
相关文章推荐