【问题标题】:Time Complexity of keySet() for encapsulated Map<> values封装 Map<> 值的 keySet() 的时间复杂度
【发布时间】:2014-06-26 08:56:25
【问题描述】:

我需要一个带有签名的HashMap

HashMap<Integer, Double> map;

但我封装了两个值,例如:

class CustomKV
{
    Integer key;
    Double value;
}

因此,Map&lt;&gt; 变为

Set<CustomKV> customMap;

如果我要使用Map,当我想对键进行迭代时,map.keySet() 就足够了。 但是,如果我使用第二个,我必须迭代 CustomKV 的对象,然后添加所有 keys,将它们添加到一个集合中,然后返回它。

我的问题是:Java 是否对此进行了优化?或者每次我调用keySet() 时,它会迭代对象吗?

编辑:

这里,我写下两次迭代的区别:

for(Integer i : map.keySet())

for(CustomKV kv : customMap())

似乎它们是相同的。但我要问的是,如果我继续打电话

for(CustomKV kv : customMap)
    int key = kv.getKey();

它会减慢我的速度,还是 Java 会识别这一点并将customMap 视为地图?

【问题讨论】:

  • 您要访问哪些值?使用 CustomKV 类而不是 Map 的原因是什么?
  • 如果您使用自定义 Set,您会调用什么 keySet()
  • @shmosel 我也会写一个自定义的keySet() 方法。
  • @MKorsch 我正在使用它来建模图中顶点的邻接列表。
  • 为什么迭代 Set&lt;CustomKV&gt; 比迭代 Set&lt;Integer&gt; 效率更高或更低?

标签: java map set time-complexity


【解决方案1】:

如果您询问 Java 的实现,HashMap 会在第一次调用 keySet() 后缓存该集合。但即使是第一次调用也不需要任何迭代,因为它只返回底层条目集的视图或包装器。

所以,是的,Java 确实优化了它们的实现,但从技术上讲,您可以将相同的优化应用于您的自定义集。

【讨论】:

    【解决方案2】:

    keySet() 不会创建新的Set

    它只是提供地图中键的视图。它实际上只提供了一些操作,即迭代(带删除)、大小、空虚、清除和包含。你不能向它添加元素,否则它会抛出一个UnsupportedOperationException

    【讨论】:

      【解决方案3】:

      如果有两个以上的领域,我们应该去上课,就像你的前任一样。 Set&lt;CustomKV&gt; customMap;

      如果只有两个值,最好使用 Hashmap。

      在这两种情况下,我们都可以迭代。

      但在 Hashmap 的情况下,我们可以通过 get 方法使用 key 访问 value,我们可以避免迭代。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-12-23
        • 2018-10-19
        • 1970-01-01
        • 2012-04-15
        • 2022-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多