Java集合中迭代器和枚举的比较系列十八
总结
这一章我们比较研究Iterator和Enumeration。内容包括:
第1部分迭代器和枚举的区别
第2部分迭代器和枚举示例
转载请注明出处:http://www.introzo.com/skywang12345/admin/EditPosts.aspx?postid=3311275
第1部分 迭代器和枚举的区别
在Java集合中,我们通常通过“迭代器”或“枚举”来遍历集合。今天我们就一起来了解一下它们之间有哪些区别。
我们先看一下www.introzo.com和www.introzo.com的源码,然后说说他们的区别。
枚举是一个接口,其源码如下:
包java.util; 公共 接口枚举{ boolean hasMoreElements(); E nextElement(); }
迭代器也是一个接口。其源码如下:
包java.util; 公共 接口迭代器{ boolean hasNext(); E 下一个(); void 删除(); }
看完代码,我们来说一下它们之间的区别。
(01)函数接口不同
枚举只有2个函数接口。 通过枚举,我们只能读取集合的数据,而不能修改数据。
迭代器只有3个函数接口。 迭代器不仅可以读取集合的数据,还可以删除数据。
(02) 迭代器支持快速失败机制,而枚举则不支持。
Enumeration是JDK 1.0添加的接口。使用它的函数包括 Vector、Hashtable 和其他类。这些类是在 JDK 1.0 中添加的。 Enumeration的目的是为它们提供遍历接口。 Enumeration本身不支持同步,但是当Vector和Hashtable实现Enumeration时,就添加了同步。
Iterator 是 JDK 1.2 中才添加的接口。它还提供了HashMap、ArrayList等集合的遍历接口。 Iterator支持fail-fast机制:当多个线程操作同一个集合的内容时,可能会发生fail-fast事件。
第 2 部分迭代器和枚举示例
下面,我们写一个Hashtable,然后分别通过Iterator和Enumeration来遍历,比较一下它们的效率。代码如下:
1 导入 java.util.Enumeration; 2 导入 java.util.Hashtable; 3 导入 java.util.Iterator; 4 导入 java.util.Map.Entry; 5 导入 java.util.Random; 6 7 /* 8 * 测试分别通过Iterator和Enumeration遍历Hashtable 9 * @author skywang 10 */ 11公共类迭代器枚举{ 12 13 public 静态 void main(String[] args) { 14 intval; 15随机 r = 新随机(); 16 哈希表 = new Hashtable(); 17 for (int i=0; i<100000; i++) { 18 // 随机获取[0,100)之间的数字 19 val = r.nextInt(100); 20 table.put(String.valueOf(i), val); 21 } 22 23 // 通过迭代器遍历 Hashtable 24 iterateHashtable(table); 25 26 // 通过枚举遍历哈希表27 enumHashtable(table); 28 } 29 30/* 31 * 通过Iterator遍历Hashtable 32 */ 33 private 静态 void iterateHashtable(哈希表){ 34 long startTime = System.currentTimeMillis(); 35 36 迭代器 iter = table.entrySet().iterator(); 37 while(iter.hasNext()) { 38 //System.out.println("iter:"+www.introzo.com()); 39 www.introzo.com(); 40 } 41 42 long endTime = System.currentTimeMillis(); 43 countTime(开始时间, 结束时间); 44 } 45 46/* 47 * 通过Enumeration遍历Hashtable 48 */ 49 private 静态 void enumHashtable(哈希表){50 long startTime = System.currentTimeMillis(); 51 52 枚举 enu = table.elements(); 53 while(enu.hasMoreElements()) { 54 //System.out.println("enu:"+enu.nextElement()); 55 enu.nextElement(); 56 } 57 58 long endTime = System.currentTimeMillis(); 59 countTime(开始时间, 结束时间); 60 } 61 62 私有 静态 void countTime() 长开始,长结束){ 63 System.out.println("时间:"+(结束-开始)+"ms"); 64 } 65 }
运行结果如下:
时间:9ms
时间:5ms
解决,我们可以看出。Enumeration比Iterator的遍历速度更快。为什么呢?
这是因为,Hashtable中Iterator是通过Enumeration去实现的,而且Iterator添加了对fail-fast机制的支持;所以,执行的操作自然要多一些。
更多内容
Java集合系列目录
Java宝典系列01——整体框架
Java合集系列04中fail-fast总结(用ArrayList讲解fail-fast原理及解决方案)
Java宝典系列10——HashMap详细介绍(源码分析)及使用示例
Java宝典系列11——Hashtable详细介绍(源码分析)及使用示例
Java宝典系列12-TreeMap详细介绍(源码分析)及使用示例
Java宝典系列13-WeakHashMap详细介绍(源码分析)及使用示例
Java宝典系列14 Map总结(HashMap、Hashtable、TreeMap、WeakHashMap等使用场景)
Java集合系列十八:迭代器与枚举的比较
相关文章
- 10-07 网络大战年终盘点
- 10-07 丁西坡:一淘、搜库相继上线对百度的影响
- 10-07 支付宝推出首个旅游保障交易,明年全国推广
- 10-07 如何让 Laravel API 始终返回 JSON
- 10-07 Rest Web Api 控制器返回 JSON 格
- 10-07 SpringBoot RESTful api
- 10-07 jar、vue一键自动化部署工具,界面友好,操作简
- 10-07 分不清阻塞 IO、非阻塞 IO 和 IO 复用之间
- 10-07 分不清阻塞 IO、非阻塞 IO 和 IO 复用之间
- 10-07 MySQL多表关联查询和多个单表查询,哪个效率更高
- 10-07 MySQL多表关联查询和多个单表查询,哪个效率更高
- 10-07 我们来谈谈分页列表缓存
- 10-07 建行数据恢复:故障、中断不影响资金安全(建行数据恢
- 10-07 数据丢失?不要恐慌!教你如何在30秒内恢复硬盘数据
- 10-07 硬盘分区会造成损坏吗? (分区会不会损坏硬盘)
- 10-07 unity 项目连接到 Steam 的 SDK
- 10-07 Steam32寄存器实现了运行灯
- 10-07 rust中文补丁steam_corrosion r
- 10-07 如何在keil5中创建stm32项目(在keil5
- 10-07 stm32驱动L2980调速(stm32驱动l29
- 最近发表