2012-01-28 7 views
0

JavaのHashTableは、同期化されたハッシュテーブルです(かなり長い間存在します)。HashMapは非同期です。Javaのハッシュマップ:keys()は実際にはありませんか?

Keys

キー
パブリック列挙キー() このハッシュテーブルにあるキーのリストを返しますHashTable

は、ハッシュテーブルのキーを取得するための2つの方法があります。

公衆セットのkeySet()
この Hashtableに格納されているキーのSetビューを返します。 SetはHashtableによってサポートされているため、 ハッシュテーブルへの変更はSetに反映され、その逆もあります。 Setは要素の削除ではなく、 の要素の削除をサポートします(対応するエントリを ハッシュテーブルから削除します)。

後者では、キーがハッシュテーブルへの直接参照であることが明示的に述べられています(変更などに注意してください)。

しかし、keys()のような言及はありません。

だから私の質問は次のとおりです。

列挙子を使用してkeys()が(実際のキーを返すkeyset()とは違って)、キーのコピーを返却していますか?
もしそうなら、HashMapにそのような方法がないのですが、keyset()だけが提供されますか?非同期のコレクションの一般的なイテレータに

答えて

1

looking at the source code for Hashtableことで

、あなたはキーセットの反復子とキー()列挙があることがわかります(彼らはConcurrentModificationExceptionを投げたり、不特定の方法で行動する傾向がある)、特によく動作しません。実際には同じ内部クラスによって実装されます。内部クラスは、Hashtableが変更された場合にConcurrentModificationExceptionをスローしようとします。それで、いいえ、それは鍵のコピーを作るつもりはありません。

+0

それで、実装が同じですか?それでは、Enumeratorというオファーが付いたAPIは利用できますか? – Cratylus

+3

HashtableとEnumerator APIはこの時点で廃止予定です。新しいコードでは使用しないでください。 –

2

Hashtable.keysは、実際のキーへの参照を返します。それらはコピーされません。

keySetがすでにジョブを実行しているため、このメソッドはHashMapに存在しません。このクラスはJava 1.0以来存在していたため、ハッシュテーブルに存在します。 keySetメソッドを定義するコレクションフレームワークは1.2まで追加されませんでした。

関連する問題