2

大量のデータ (約 1 GB) を持つ Hashtable の値を繰り返し処理したいと考えています。そのために、私は使用しています:

Hashtable<String,Object> myHashtable = new Hashtable<String,Object>;

// Fill the Hashtable here...

// Get the values as a Collection:
Collection<Object> myValues = myHashtable.values();

// Get the values as an array:
ArrayList<Object> myArray = myValues.toArray();

// Iterate through the values here...

だから、私の質問は次のとおりです。保存されたデータを乗算していますか? 同じ値の 3 つのコピーが RAM に保存されていますか (Hashtable に 1 つのコピー、Collection に 1 つのコピー、ArrayList に 1 つのコピー)。

答えが「はい」の場合、データをコピーしました。データを複製せずに Hashtable の値を反復処理する方法はありますか?

答えが「いいえ」の場合、それは Collection がポインタを格納するということですか? その場合、コレクションを作成した後に Hashtable のデータを変更すると、コレクションはその変更を反映しますか? (ArrayList についても同じ質問)。

ありがとう!

4

2 に答える 2

2

ドキュメントのように、このvalues()メソッドはデータを複製せ、マップ内の値のビューを返します。つまり、で要素を変更すると、変更は元のマップに反映されます。myValues

一方、データを複製します(そして、コードで示されているようにではなく、配列を返しtoArray() ますArrayListこれは、の要素の浅いコピーを使用して新しい配列を作成するためmyValuesです。また、配列は元のマップの要素への参照を保持しているため、オブジェクトが変更可能である場合、それらの変更はマップに反映されますが、配列自体を変更すると(たとえば、要素の1つをnullに設定すると)、変更されますマップには反映されません。

マップの値を追加コピーせずに反復する最も簡単な方法は、値に対してイテレータを使用することです。

for (Object val : myHashtable.values()) {
    // do something with each value
}

また、マップ内の値、の内容、myValuesおよびの内容myArrayはすべて同じオブジェクトへの参照であるため、それらに加えた変更は他のオブジェクトにも反映されることを忘れないでください(変更可能であると想定)。

于 2012-06-05T02:39:13.830 に答える
2

Hashtable.values()のドキュメントをご覧ください。

コレクションはマップによってサポートされているため、マップへの変更はコレクションに反映され、その逆も同様です。

返さCollectionれるには、に保存されている同じオブジェクトへの参照が含まれているHashtableため、データは「複製」されません。それは単にあなたのビューHashtableです。Hashtable保存されたオブジェクトの1つを変更すると、との両方の変更が観察されますCollection(同じオブジェクトであるため)。

于 2012-06-05T02:39:21.530 に答える