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

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


答案 1

HashMap.values()不返回一个值,而是返回一个集合。ArrayListValues

源:

 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(大小)元素执行循环。valuesListhashMaptoArray()for

希望这有帮助。


答案 2

HashMap在内部将值存储在集合 中。查看 的源代码,的父级 。valuesAbstractMapHashMap

所以直接返回一个 .无需执行任何计算或数据复制。它尽可能快。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
)

推荐