SunのLinkedHashMapsのソースコードを見ると、KeyIteratorというプライベートクラスがあることがわかります。これを使用したいと思います。どうすればアクセスできますか?
3 に答える
あなたは電話することによってそれを得る
myMap.keySet().iterator();
それが存在することを知る必要さえありません。これは、実装の成果物にすぎません。ご存知のとおり、彼らは空飛ぶ猿を使って鍵を繰り返している可能性があります。仕様に従って繰り返されている限り、どのように実行してもかまいません。
ちなみに、(、、、、、、、などのように)というプライベートクラスがあるHashMap
ことをご存知ですか?
それはあなたがのキーを反復する方法に違いをもたらしますか?KeyIterator
ConcurrentHashMap
ConcurrentSkipListMap
EnumMap
IdentityHashMap
TreeMap
WeakHashMap
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
、 。だけでなく、すべてのに対して機能することに注意してください。entrySet
values
Map
Map
LinkedHashMap
プライベートクラスなので、直接使用することはできません。
private class KeyIterator extends LinkedHashIterator<K> {
通常のイテレータを使用すると、そのインスタンスが返されます。
myMap.keySet().iterator()
LinkedHashMapの内部実装の一部として定義されているもの(つまり、ソースコードでは定義されているが、APIでは定義されていないもの)は使用しないでください。次のリリースで内部実装が変更された場合はどうなりますか?それを使用するすべてのコードが壊れます。
APIにコーディングして、次のようなことを行う必要があります
myMap.keySet().iterator()