关于使用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进行操作。
相关文章推荐
- 关于session过期返回主页解决方案之一以及js中的“和'使用问题
- 关于Microsoft ASP.NET 2.0 AJAX Extensions UpdatePanel 中使用 javascript 产生错误的问题
- 关于Sybase ASE数据库的license以及试用版过期的问题的解决方案
- 关于"使用注册为 allowDefinition='MachineToApplication' 的节是错误的"的解决方案
- 关于使用System.out.println()向控制台输出数据和使用out.println()向页面输出数据效率的问题
- 关于以前应用程序运行出现配置错误的问题的解决方案
- 关于ArrayList的初始容量以及扩容的效率问题
- 关于php服务器代理上网的时候使用file_get_contents函数取不到内容的问题的解决方案
- 关于使用<ajax:CascadingDropDown>控件出现的500错误和ScriptManager出现的注册表冲突错误解决方案
- 关于"使用注册为 allowDefinition='MachineToApplication' 的节是错误的"的解决方案
- vc6 Unicode 使用时遇到的问题以及解决方案
- 关于HP-UX中出现无法使用历史命令的问题的解决方案
- 关于jquery.AutoComplete插件的一些使用心得(编码问题,效率问题)
- C#中DES加密解密问题、压缩解压缩文件、进度条以及WinForm中使用控制台的解决方案
- 关于DateTime在远程服务器使用以及日期与时间格式的问题
- C++Builder中关于INDY库的使用 以及一些问题的解决(E2238 Multiple declaration for 'fd_set')
- 关于apache使用CustomLog 记录日志以及错乱的问题
- 使用Linux过程中遇到的问题以及解决方案
- 关于RMS中使用RecordEnumeration遍历顺序乱的问题
- [错误记录]关于指针传递获得数据使用错误问题....