【问题标题】:Performance: Creating an ArrayList from HashMap.values()性能:从 HashMap.values() 创建一个 ArrayList
【发布时间】:2011-05-14 09:28:10
【问题描述】:

问题是从 HashMap.values() 集合创建 ArrayList 需要多少成本?还是单独创建值集合? 假设 Map.size() > 100k。 对象也可以一直保存在 ArrayList(而不是 HashMap)中,这对其他部分有影响(元素的修改,很容易按键)。 ArrayList 用于迭代每个第 n 个元素。 (这就是为什么不能直接使用 values 集合的原因)。迭代期间不进行任何修改。

【问题讨论】:

  • 问题不清楚,没看懂。
  • 你说的“成本”是指时间还是内存?

标签: java performance collections arraylist hashmap


【解决方案1】:

您可以使用 Iterator 跳过元素 - 只需多次调用 next()

创建任何集合的列表具有线性复杂性。

【讨论】:

  • 有道理。所以我使用迭代器并在 for 循环中调用 it.next(),因为很多时候是一个参数。
【解决方案2】:

HashMap.values() 不返回 ArrayList 值,而是返回 Values 集合。

来源:

 public Collection<V> values() {
        Collection<V> vs = values;
        return (vs != null ? vs : (values = new Values()));
    }

Values 是一个AbstractCollection。 values的原因只是为了引用HashMap的迭代器。

你的问题:

问题是要花多少钱 从一个创建一个 ArrayList HashMap.values() 集合?

这是一个线性复杂性(正如 Bozho 所说),因为

ArrayList<V> valuesList = new ArrayList<V>(hashMap.values());

ArrayList,valuesList 调用集合 hashMap toArray() 方法,该方法本质上是从集合中的 0..N(大小)元素执行 for 循环。

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    要详细说明@Bozho 的解决方案,您可以这样做。

    int count = 0;
    for(Value value: map.values())
       if(count++ % 5 == 0)
         // do something.
    

    【讨论】:

      【解决方案4】:

      HashMap 在内部将值存储在集合values 中。看看AbstractMapsource codeHashMap 的父级。

      所以HashMap.values() 直接返回一个Collection。没有进行计算或数据复制。它尽可能快。

      只需获取值,然后执行 for 循环:

      int n = 5;  // every 5th element
      Object[] values = hashMap.values().toArray();
      int size = values.length;
      for (int i = 0; i < size; i += n){
         values[i];
         // do something
      )
      

      【讨论】:

        【解决方案5】:

        您可以创建自己的 HashMap,它直接保存 Arraylist 值集合(我不相信 HashMap 是免费的,它的数据结构不同)。但这需要您进行一些额外的编码。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-19
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多