性能:从 HashMap.values() 创建 ArrayList
2022-09-02 00:22:50
问题是从HashMap.values()集合创建ArrayList需要多少钱?还是单独创建值集合?假设 Map.size() > 100k。对象也可以一直保存在ArrayList中(而不是HashMap),这对其他部分有影响(元素的修改,通过键轻松)。ArrayList 用于循环访问每个第 n 个元素。(这就是不能直接使用值集合的原因)。在迭代期间不进行任何修改。
问题是从HashMap.values()集合创建ArrayList需要多少钱?还是单独创建值集合?假设 Map.size() > 100k。对象也可以一直保存在ArrayList中(而不是HashMap),这对其他部分有影响(元素的修改,通过键轻松)。ArrayList 用于循环访问每个第 n 个元素。(这就是不能直接使用值集合的原因)。在迭代期间不进行任何修改。
HashMap.values()
不返回一个值,而是返回一个集合。ArrayList
Values
源:
public Collection<V> values() {
Collection<V> vs = values;
return (vs != null ? vs : (values = new Values()));
}
Values
是一个 .值的原因只是为了引用HashMap的迭代器。AbstractCollection
您的问题:
问题是从HashMap.values()集合创建ArrayList需要多少钱?
这是一个线性的复杂性(正如Bozho所说),因为
ArrayList<V> valuesList = new ArrayList<V>(hashMap.values());
ArrayList 调用集合方法,该方法实质上是从集合中的 0..N(大小)元素执行循环。valuesList
hashMap
toArray()
for
希望这有帮助。
HashMap
在内部将值存储在集合 中。查看 的源代码,的父级 。values
AbstractMap
HashMap
所以直接返回一个 .无需执行任何计算或数据复制。它尽可能快。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
)