为什么HashMap没有实现Iterable接口?

29

有没有人可以告诉我为什么 HashMap 没有实现 Iterable 接口


迭代什么?键?值?还是Map.Entry项? - user207421
1
可能是[为什么不能在Map(Java)上使用迭代器?]的重复问题(https://dev59.com/EWbWa4cB1Zd3GeqPTyzf) - RAS
@GaborSch 的意思是这并不是唯一的选择。楼主可能有另外的看法。 - user207421
2
“由于主要基于个人意见,已被... Boann 暂停处理。” [不是我这么做的。] (http://meta.stackexchange.com/questions/54917/distinguish-votes-to-close-by-reason) - Boann
显然,默认情况下应该迭代条目;Java不使Map可迭代的事实是完全愚蠢的,除了Sun/Oracle中决定这一点的人之外,没有冒犯任何人。 - Alexander Mills
6个回答

33
坦率地说,通常的 Map(特别是 HashMap)并不实现 Iterator,因为不清楚应该迭代什么。有三种选择:
  • 键(Keys)
  • 值(Values)
  • 条目(Entries)
以上这三种选择都看起来不完全无理:可以辩护每种方法。最终,库设计者决定不为您做出这个选择,让程序员显式地选择要迭代的内容。

14

Map并没有实现此方法,但是你可以使用keySet()values()或者entrySet()来获取迭代器。由于它们本质上是集合(set),所以都实现了迭代器。请参见Map的Java文档这里


4
这个答案没有提到为什么不实施它。 - SpaceTrucker
2
没错,但它确实告诉了如何解决这个问题,这很有用。 - Freedom_Ben

3

哈希映射包含两个数据结构,键和值,每个数据结构都有一个迭代器。HashMap作为一个整体不是应该被迭代的数据结构。


3

不能直接迭代它。您需要一个一维结构来迭代。

hashMap.entrySet().iterator()可以完成这项工作。


1
太阳公司本可以让Map扩展Iterable,但这将需要Map本身拥有iterator()方法。想象一下所有自定义的Map实现都会出现问题。他们在java.sql接口中这样做已经够糟糕了。
此外,您可以使用keySet()、entrySet()或values()来迭代地遍历Map——这是额外的8、10或8个字符。

9、11、9实际上需要那个额外的点呢 :P - Adrian Shum

1

Map接口没有实现Collection接口,因为它不包含元素,而是包含键和对应值的条目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接