为什么java中的集合没有只读迭代器概念?

时间:2013-03-06 10:27:33

标签: java design-patterns collections

java的Enumeration接口有2个方法

  1. hasNext()
  2. 下()
  3. 为什么Iterator不扩展Enumeration并添加remove方法()?

    另外,如果我想要做的就是遍历我的集合,我可以使用枚举(或者如果它扩展枚举的迭代器),因为循环语句只需要枚举。我不必担心收藏品会被修改

3 个答案:

答案 0 :(得分:6)

  

为什么Iterator不延长Enumeration并添加remove()方法?

来自documentation

  

Iterator取代了Java Collections Framework中的Enumeration。迭代器在两个方面与枚举不同:

     
      
  • 迭代器允许调用者在迭代期间使用明确定义的语义从底层集合中删除元素。
  •   
  • 方法名称已得到改进。
  •   

我怀疑后者是引入全新界面而不是扩展现有界面的真正原因。

  

另外,如果我想要做的就是遍历我的集合,我可以使用枚举(或者如果它扩展枚举的迭代器),因为循环语句只需要枚举。我不必担心收藏品会被修改

好吧,如果您不想修改集合,请不要调用remove()。如果你真的,真的不相信自己,你可以使用Collections.unmodifiableCollection()等来创建一个只读的包装器。

最后,值得注意的是,如果使用for-each循环迭代集合,则无论如何都无法访问remove()方法:

for (String s : str_list) {
   ...
}

这里,我们使用Iterator接口,但无法访问实际的迭代器对象。

答案 1 :(得分:3)

您可以通过java.util.Collections.enumeration()方法从集合中获取java.util.Enumerator。

无论如何,如果你不想通过迭代器修改你的集合,那只是不调用remove()方法。

答案 2 :(得分:-1)

根据http://www.journaldev.com/1330/java-collections-interview-questions-and-answers#iterator-vs-enumeration,“枚举的速度是迭代器的两倍,并且使用的内存非常少。枚举非常基本,符合基本需求。”

所以,我想如果你不需要remove(),那么使用Enumeration比使用Iterator更有效。