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

发布于 2024-10-04 07:19:41 字数 204 浏览 2 评论 0原文

问题是从 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

失去的东西太少 2024-10-11 07:19:41

HashMap.values() 不返回值的 ArrayList 而是返回 Values 集合。

来源:

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

Values 是一个 AbstractCollection。 value 的原因只是为了引用 HashMap 的迭代器。

你的问题:

问题是要花多少钱
从 a 创建一个 ArrayList
HashMap.values() 集合?

这是一个线性复杂度(正如 Bozho 所说),因为

ArrayList<V> valuesList = new ArrayList<V>(hashMap.values());

ArrayList、valuesList 调用集合 hashMap toArray() 方法,该方法本质上执行一个 for 从集合中的 0..N(大小)元素循环。

希望这有帮助。

HashMap.values() doesn't return an ArrayList of values but a Values Collection.

Source:

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

Values is an AbstractCollection. The reason for values is just to reference HashMap's iterator.

Your question:

Question is how much it costs to
create an ArrayList from a
HashMap.values() Collection?

That's a linear complexity (as Bozho said) since

ArrayList<V> valuesList = new ArrayList<V>(hashMap.values());

the ArrayList, valuesList calls the collection hashMap toArray() method which essentially does a for loop from 0..N (size) element in the collection.

Hope this helps.

べ繥欢鉨o。 2024-10-11 07:19:41

HashMap 在内部将值存储在 Collection 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
)

HashMap internally stores values in a Collection values. Take a look at the source code of AbstractMap, the parent of 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
)
萌逼全场 2024-10-11 07:19:41

要详细说明@Bozho 的解决方案,您可以这样做。

int count = 0;
for(Value value: map.values())
   if(count++ % 5 == 0)
     // do something.

To elaborate on @Bozho's solution you can just do.

int count = 0;
for(Value value: map.values())
   if(count++ % 5 == 0)
     // do something.
§对你不离不弃 2024-10-11 07:19:41

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

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

You can use an Iterator to skip elements - just call next() many times.

Creating a list of any collection has a linear complexity.

南城追梦 2024-10-11 07:19:41

您可以创建自己的 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文