web-dev-qa-db-ja.com

パフォーマンス:HashMap.values()からのA​​rrayListの作成

問題は、HashMap.values()コレクションからArrayListを作成するのにいくらかかるかです。または、値のコレクションだけを作成しますか? Map.size()> 100kと仮定します。オブジェクトは、常にHashMapの代わりにArrayListに保持することもでき、他の部分(要素の変更、キーによる簡単な変更)に影響を与えます。 ArrayListは、すべてのn番目の要素を反復処理するために使用されます。 (これが、値コレクションを直接使用できない理由です)。反復中に変更は行われません。

21
beginner_

HashMap.values()は、値のArrayListではなくValuesコレクションを返します。

ソース:

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

ValuesAbstractCollectionです。値の理由は、HashMapの反復子を参照するためだけです。

あなたの質問:

問題は、HashMap.values()コレクションからArrayListを作成するのにいくらかかるかです。

(Bozhoが言ったように)それは線形の複雑さです

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

arrayList、valuesListは、コレクションhashMaptoArray()メソッドを呼び出します。このメソッドは、基本的にコレクション内の0..N(サイズ)要素からforループを実行します。

お役に立てれば。

40
Buhake Sindi

HashMapは、値をコレクション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
)
9
Peter Knego

@Bozhoのソリューションについて詳しく説明するために、あなたはただ行うことができます。

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

Iteratorを使用して要素をスキップできます-next()を何度も呼び出すだけです。

コレクションのリストの作成は、線形の複雑さを持っています。

2
Bozho

値のArraylistコレクションを直接保持する独自のHashMapを作成できます(私はHashMapが無料でそれを行うとは思わないため、データ構造が異なります)。しかし、これにはあなた側からの追加のコーディングが必要です。

0
luckyluke