Performance: Creating an ArrayList from HashMap.values()

后端 未结 5 701
爱一瞬间的悲伤
爱一瞬间的悲伤 2021-02-12 10:58

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

相关标签:
5条回答
  • 2021-02-12 11:12

    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.

    0 讨论(0)
  • 2021-02-12 11:13

    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
    )
    
    0 讨论(0)
  • 2021-02-12 11:16

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

    int count = 0;
    for(Value value: map.values())
       if(count++ % 5 == 0)
         // do something.
    
    0 讨论(0)
  • 2021-02-12 11:16

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

    Creating a list of any collection has a linear complexity.

    0 讨论(0)
  • 2021-02-12 11:21

    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.

    0 讨论(0)
提交回复
热议问题