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

beg*_*er_ 20 java collections performance arraylist hashmap

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

Buh*_*ndi 40

HashMap.values()不返回ArrayList值,而是返回ValuesCollection.

资源:

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

Values是一个AbstractCollection.值的原因只是引用HashMap的迭代器.

你的问题:

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

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

ArrayList<V> valuesList = new ArrayList<V>(hashMap.values());
Run Code Online (Sandbox Code Playgroud)

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

希望这可以帮助.


Pet*_*ego 9

HashMap在内部存储集合中的值values.看看的源代码AbstractMap,父HashMap.

So HashMap.values() directly returns a Collection. There is no computation or data copying done. It's as fast as it can be.

Just get the values and then do a for loop:

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
)
Run Code Online (Sandbox Code Playgroud)


Boz*_*zho 3

您可以使用 anIterator来跳过元素 - 只需next()多次调用即可。

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