14

SunのLinkedHashMapsのソースコードを見ると、KeyIteratorというプライベートクラスがあることがわかります。これを使用したいと思います。どうすればアクセスできますか?

4

3 に答える 3

46

あなたは電話することによってそれを得る

myMap.keySet().iterator();

それが存在することを知る必要さえありません。これは、実装の成果物にすぎません。ご存知のとおり、彼らは空飛ぶ猿を使って鍵を繰り返している可能性があります。仕様に従って繰り返されている限り、どのように実行してもかまいません。

ちなみに、(、、、、、、、などのように)というプライベートクラスがあるHashMapことをご存知ですか? それはあなたがのキーを反復する方法に違いをもたらしますか?KeyIteratorConcurrentHashMapConcurrentSkipListMapEnumMapIdentityHashMapTreeMapWeakHashMap
HashMap


編集:コメントに応じて、のすべてのキーと値のペアを反復処理しようとしている場合Mapは、キーを反復処理してそれぞれを呼び出すよりも優れた方法があることに注意してくださいget。このentrySet()メソッドは、Setすべてのキーと値のペアを取得し、それを繰り返し処理できます。したがって、書く代わりに:

for (Key key : myMap.keySet()) {
    Value val = myMap.get(key);
    ...
}

あなたは書くべきです:

for (Map.Entry<Key, Value> entry : myMap.entrySet()) {
    doSomethingWithKey(entry.getKey());
    doSomethingWithValue(entry.getValue());
    ...
}

必要に応じて、で値を反復処理することもできvalues()ます。

、、、およびはインターフェイスで定義されているためkeySet、 。だけでなく、すべてのに対して機能することに注意してください。entrySetvaluesMapMapLinkedHashMap

于 2009-06-10T21:20:40.330 に答える
4

プライベートクラスなので、直接使用することはできません。

  private class KeyIterator extends LinkedHashIterator<K> {

通常のイテレータを使用すると、そのインスタンスが返されます。

myMap.keySet().iterator()
于 2009-06-10T21:21:30.593 に答える
3

LinkedHashMapの内部実装の一部として定義されているもの(つまり、ソースコードでは定義されているが、APIでは定義されていないもの)は使用しないでください。次のリリースで内部実装が変更された場合はどうなりますか?それを使用するすべてのコードが壊れます。

APIにコーディングして、次のようなことを行う必要があります

myMap.keySet().iterator()
于 2009-06-10T21:21:24.883 に答える