性能:从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())); }
Values
是AbstractCollection
。 值的原因只是引用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是免费的,它的数据结构是不同的)。 但这需要一些来自你方的额外编码。
- 使用属性在arraylist中创建新对象
- 将List作为ParcelableArrayList传递
- 如何使用递归函数返回ArrayList
- 如何对二维ArrayList进行排序
- 使用volley库,在onResponse方法中,ArrayList有一些数据,但在OnResponse方法之外,arraylist是空的
- Java ArrayList包含始终返回false,尽管它包含相同的值
- 从Objects的ArrayList创建JTable – Java
- 使用Dozer的自定义转换器将对象列表映射到另一个列表
- Firebase / Android:将检索到的值从Firebase添加到arraylist会返回空指针exception