性能:从HashMap.values()创建一个ArrayList

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

HashMap.values()不返回值的ArrayList ,而是返回Values Collection。

资源:

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

ValuesAbstractCollection 。 值的原因只是引用HashMap的迭代器。

你的问题:

问题是从HashMap.values()集合创建ArrayList的成本是多少?

这是线性的复杂性(如Bozho所说)

 ArrayList valuesList = new ArrayList(hashMap.values()); 

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

希望这可以帮助。

HashMap内部将值存储在Collection values 。 看一下HashMap的父级AbstractMap的源代码 。

所以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 ) 

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

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

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

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

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