2009-06-10 19 views

答えて

42

あなたは、あなたもそれが存在を知っている必要はありません

myMap.keySet().iterator(); 

を呼び出すことによって、それを得ます。実装の成果物に過ぎません。あなたが知っている限り、彼らは飛んでいる猿を使ってキーを反復することができます。彼らが仕様に従って反復されている限り、どのようにそれを行うかは関係ありません。ところで

は、あなたがHashMapは(ConcurrentHashMapConcurrentSkipListMapEnumMapIdentityHashMapTreeMap、およびWeakHashMapがそうであるように)KeyIteratorと呼ばれるプライベートクラスを持っていることをご存知でしたか?
HashMapのキーを反復処理する方法に違いはありますか?


編集:あなたのコメントへのREPONSEで、あなたがMap内のすべてのキーと値のペアを反復処理しようとしている場合は、キーを反復処理し、呼び出すより良い方法があることに注意してくださいそれぞれについてgetentrySet()メソッドはすべてのキーと値のペアのうち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()で値を反復処理することができます。 keySetentrySet、およびvaluesMap interfaceで定義されているので、彼らは任意のMapだけでなく、LinkedHashMapのために働くことを

は注意してください。

+1

内部プライベートクラスが見えるまで、LinkedHashMapで繰り返し処理できることはありませんでした。しかし、答えをありがとう。 –

+0

私はentrySet()の使用方法がわかりませんでした。しかし、そのほとんどすべての場所で私はハッシュマップを使用して本当に便利です。 ありがとう@Michael – sravanreddy001

3

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

あなたはAPIにコーディングし

myMap.keySet().iterator() 
3

あなたはそれを直接使用することはできませんので、それは、プライベートクラスのような何かを行う必要があります。

private class KeyIterator extends LinkedHashIterator<K> { 

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

myMap.keySet().iterator() 
関連する問題