性能:从 HashMap.values() 创建 ArrayList
问题是从 HashMap.values() 集合创建 ArrayList 需要多少钱?还是单独创造价值集合? 假设 Map.size() > 10万。 对象也可以一直保存在 ArrayList(而不是 HashMap)中,这对其他部分有影响(元素的修改,通过键很容易)。 ArrayList 用于迭代每个第 n 个元素。 (这就是为什么不能直接使用值集合的原因)。迭代期间不进行任何修改。
Question is how much it costs to create an ArrayList from a HashMap.values() Collection? Or creating the values Collection alone?
Assuming Map.size() > 100k.
Objects could also be held in ArrayList (instead of HashMap) all the time which has implications in other parts (modifications of elements, easy by key).
The ArrayList is used to iterate over every n-th element. (That's why the values collection can't be used directly). No modifications are done during the iteration.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
HashMap.values()
不返回值的ArrayList
而是返回Values
集合。来源:
Values
是一个AbstractCollection
。 value 的原因只是为了引用 HashMap 的迭代器。你的问题:
这是一个线性复杂度(正如 Bozho 所说),因为
ArrayList、valuesList 调用集合
hashMap
toArray()
方法,该方法本质上执行一个for
从集合中的 0..N(大小)元素循环。希望这有帮助。
HashMap.values()
doesn't return anArrayList
of values but aValues
Collection.Source:
Values
is anAbstractCollection
. The reason for values is just to reference HashMap's iterator.Your question:
That's a linear complexity (as Bozho said) since
the ArrayList,
valuesList
calls the collectionhashMap
toArray()
method which essentially does afor
loop from 0..N (size) element in the collection.Hope this helps.
HashMap
在内部将值存储在 Collectionvalues
中。看一下AbstractMap源代码 >,
HashMap
的父级。所以
HashMap.values()
直接返回一个Collection
。没有完成任何计算或数据复制。它已经尽可能快了。只需获取值,然后执行 for 循环:
HashMap
internally stores values in a Collectionvalues
. Take a look at the source code ofAbstractMap
, the parent ofHashMap
.So
HashMap.values()
directly returns aCollection
. 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:
要详细说明@Bozho 的解决方案,您可以这样做。
To elaborate on @Bozho's solution you can just do.
您可以使用
Iterator
来跳过元素 - 只需多次调用next()
即可。创建任何集合的列表都具有线性复杂度。
You can use an
Iterator
to skip elements - just callnext()
many times.Creating a list of any collection has a linear complexity.
您可以创建自己的 HashMap,它直接保存值的 Arraylist 集合(我不相信 HashMap 是免费的,它的数据结构是不同的)。但这需要您进行一些额外的编码。
You can create Your own HashMap, that holds the Arraylist collection of values directly (i do not believe that HashMap does it for free, the data structure for it is different). But this requires some additional coding from Your side.