【问题标题】:In Java, call set.iterator(), what is the internal process for this method?在Java中,调用set.iterator(),这个方法的内部流程是什么?
【发布时间】:2018-05-27 17:03:08
【问题描述】:

我刚刚注意到 Method Set.iterator() 的时间复杂度是恒定的。

如果是,则说明java生成一个set并往其中添加元素时,该元素已经和cursor连接上了。否则,调用 Set.iterator() 时,它必须迭代该集合中的所有元素,这会花费线性时间复杂度。

所以想知道Java中set是如何保存元素的,调用Set.iterator()时,set是如何返回一个迭代器的呢?

谢谢!

【问题讨论】:

  • 我不确定您所说的“保存元素”是什么意思。当您在一个集合上进行迭代时,您绝不会向其中添加元素。
  • 取决于 Set 实现。 jdk 实现是open source,所以你可以在那里看看——如果你对你找到的东西有特定的问题,那么这些将是这里的主题。上述问题过于宽泛。
  • 通常Set.iterator() 方法会为你返回集合中值的包装对象。它只会在您调用其next 方法时开始迭代值。
  • @yshavit 我想每个人都知道 Java 是开源的,但在 stackoverflow 中仍然存在大量问题。那是因为没有人能够理解或有时间了解每段源代码是如何实现的。我认为我的问题已经足够具体了。
  • @HanLi 恕我直言,我认为您得到了一个相当模糊的答案(“在某些情况下,它委托给 Map 的迭代器,其实现因 Map 类型而异” ) 说明这个问题太宽泛了。除非这是您正在寻找的特异性水平——在这种情况下,您可能应该接受答案。

标签: java iterator set


【解决方案1】:

Java 中有不同类型的集合。可用的主要两个是 HashSet 和 TreeSet。两者都使用映射来实现它们,HashMap 和 TreeMap。因此,当您添加一个项目时,它会通过执行地图查找来检查该项目是否已经存在,这对于 HashMap 来说接近于恒定时间,而对于 TreeMap 来说则是日志时间。

加入集合不是常数时间,取决于backing map,但一般HashMap接近常数时间,TreeMap是log时间。

要返回一个迭代器,该集合使用映射的键迭代器。后备映射使用集合元素作为键。迭代 hashmap 的键非常简单,您只需遍历数组和每个元素的 bin。可以使用各种已知的遍历算法来遍历二叉树。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-19
    • 2011-09-19
    • 2015-04-23
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2021-07-27
    • 1970-01-01
    相关资源
    最近更新 更多