問題は、HashMap.values()コレクションからArrayListを作成するのにいくらかかるかです。または、値のコレクションだけを作成しますか? Map.size()> 100kと仮定します。オブジェクトは、常にHashMapの代わりにArrayListに保持することもでき、他の部分(要素の変更、キーによる簡単な変更)に影響を与えます。 ArrayListは、すべてのn番目の要素を反復処理するために使用されます。 (これが、値コレクションを直接使用できない理由です)。反復中に変更は行われません。
HashMap.values()
は、値のArrayList
ではなくValues
コレクションを返します。
ソース:
_ public Collection<V> values() {
Collection<V> vs = values;
return (vs != null ? vs : (values = new Values()));
}
_
Values
はAbstractCollection
です。値の理由は、HashMapの反復子を参照するためだけです。
あなたの質問:
問題は、HashMap.values()コレクションからArrayListを作成するのにいくらかかるかです。
(Bozhoが言ったように)それは線形の複雑さです
_ArrayList<V> valuesList = new ArrayList<V>(hashMap.values());
_
arrayList、valuesList
は、コレクションhashMap
toArray()
メソッドを呼び出します。このメソッドは、基本的にコレクション内の0..N(サイズ)要素からfor
ループを実行します。
お役に立てれば。
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
)
@Bozhoのソリューションについて詳しく説明するために、あなたはただ行うことができます。
int count = 0;
for(Value value: map.values())
if(count++ % 5 == 0)
// do something.
Iterator
を使用して要素をスキップできます-next()
を何度も呼び出すだけです。
コレクションのリストの作成は、線形の複雑さを持っています。
値のArraylistコレクションを直接保持する独自のHashMapを作成できます(私はHashMapが無料でそれを行うとは思わないため、データ構造が異なります)。しかし、これにはあなた側からの追加のコーディングが必要です。