Javaにおける4つのMapオブジェクトの遍歴方法

3889 ワード

方法1:for-eachサイクルでentryを用いて遍歴し、keyとvalueをMap.entrySetで遍歴することが最も一般的であり、多くの場合最も望ましい遍歴方法である.キー値が必要な場合に使用します.
Map map = new HashMap();        
for(Map.Entry entry:map.entrySet()){    
  System.out.println("key="+entry.getKey()+",value = "+entry.getValue());    
}

注意:Map.Entryメソッドの説明:Map.Entryは、汎用でEntryとして定義されるMap宣言の内部インタフェースです.Mapのエンティティ(key-valueペア)を表します. 
方法2:for-eachサイクルでkeysまたはvaluesを遍歴し、mapのキーまたは値のみが必要な場合はentrySetではなくkeySetまたはvaluesで遍歴を実現できます.この方法はentrySet遍歴よりも性能がやや良く(10%速く)、コードがよりきれいである.
Map map = new HashMap();    
//  map     
for(Integer key:map.keySet()){  
  System.out.println("key="+key);
}  
//  map     
for(Integer value:map.values()){  
  System.out.println("value ="+value);
}

方法3:Iteratorを使用して遍歴する
Map map = new HashMap();  
Iterator> entries = map.entrySet().iterator();  
while(entries.hasNext()){
  Map.Entry entry = entries.next();  
  System.out.println("key="+entry.getKey()+"value = "+entry.getValue());  
}

汎用を使用しない
Map map = new HashMap();  
Iterator entries = map.entrySet().iterator();  
while(entries.hasNext()){  
  Map.Entry entry = (Map.Entry)entries.next();  
  Integer key = (Integer)entry.getKey();  
  Integer value = (Integer)entry.getValue();  
  System.out.println("key = "+key+",value = "+value);
}

keySetやvaluesにも同様の方法を適用することができます.
この方法は冗長に見えるが、利点がある.まず、古いバージョンjavaではmapを巡る唯一の方法です.もう1つの利点は、iterator.remove()を呼び出してentriesを削除できることです.他の2つの方法ではできません.Javadocの説明によれば、for-eachループでこの方法を使用しようとすると、結果は予測できません.
性能の面から見ると,この方法はfor−each遍歴(すなわち方法2)の性能に類する.
方法4:キーで値を探すことで、このコードはもっときれいに見えます.しかし、実際にはかなり遅く、非効率です.
Map map = new HashMap();
for (Integer key : map.keySet()) {
  Integer value = map.get(key);
  System.out.println("Key = " + key + ", Value = " + value);

結論:
一般にentrySetを用いた遍歴は最も効率的である.hashMap内部の記憶構造はEntryの配列に基づいているため、このような方法で遍歴を行うには、一度だけ遍歴すればよい.他の方法を使用する時間の複雑さは、例えば、keySet方式では、毎回key値で対応するhashを計算し、hashで対応する結果値を取得する必要があるため、効率が低い.