Java集合----MapインターフェースとMap.Entry学習
1、Map
Mapインターフェースは、要素ペア(キーと値)を記憶するために使用されます。Mapインターフェースでの方法
equals(Object o) hashCode clear() remove(Object key) put(Object key,Object value) putAll(Map t) イベントセット Mapに含まれるマッピングのSetビューを返します。Setの各要素は一つのMap.Entryオブジェクトであり、getKey()とgetValue()の方法(もう一つのsetValue(もう一つの方法)を使って、後者のキー要素と値要素にアクセスできます。 keySet()は、Mapに含まれるキーのセットビューを返します。Setの要素を削除すると、Mapの対応するマッピング(キーと値)も削除されます。 values()は、mapに含まれる値のCollectionビューを返す。Collectionの要素を削除すると、Mapの対応するマッピング(キーと値)も削除されます。 get(Object key)は指定キーに関連する値を返します。 containsKey(Object key)true or false; containsValue(Object value)true or false; isempty()
size()
2、hashMap
HashMapは、すべてのオプションのマッピング動作を提供し、null値とnullキーの使用を許可し、非同期およびnullの使用を許可する以外に、HashMapクラスとHashtableはほぼ同じです。 この実装は同期ではないことに注意してください。複数のスレッドが同時に1つのハッシュマッピングにアクセスする場合、少なくとも1つのスレッドが構造的にマッピングを修正すると、外部同期を維持しなければならない。これは、一般的に、このマッピングの対象を自然にカプセル化する同期動作によって行われる。このようなオブジェクトが存在しない場合、このマッピングはCollection.synchronized Map方法を使用して「包装」されるべきである。この操作を作成時に完了すると、マッピングに意外な非同期アクセスを防ぐことができます。
1.HashtableはDictoraryのサブクラスであり、HashMapはMapインターフェースの一つの実現類である。 2.Hashtableにおける方法は同期であり、HashMapにおける方法はデフォルトでは非同期である。つまり、マルチスレッドアプリケーションでは、専門的な操作をしなくても安全にHashtableが使えます。HashMapに対しては,追加の同期機構が必要である。しかし、HashMapの同期問題は、Collectionの静的方法によって解決され得る。
3.HashMapでnullはキーとして使用できます。このようなキーは一つだけです。1つ以上のキーに対応する値がnullであることができます。get()メソッドがnull値に戻ると、すなわちHashMapにこのキーがないことを示してもよく、このキーの対応する値がnullであることを示してもよい。したがって、hashMapではget()方法でHashMapにあるキーがあるかどうかを判断することはできず、containsKey()方法で判断すべきである。
Mapインターフェースは、要素ペア(キーと値)を記憶するために使用されます。Mapインターフェースでの方法
equals(Object o) hashCode clear() remove(Object key) put(Object key,Object value) putAll(Map t) イベントセット Mapに含まれるマッピングのSetビューを返します。Setの各要素は一つのMap.Entryオブジェクトであり、getKey()とgetValue()の方法(もう一つのsetValue(もう一つの方法)を使って、後者のキー要素と値要素にアクセスできます。 keySet()は、Mapに含まれるキーのセットビューを返します。Setの要素を削除すると、Mapの対応するマッピング(キーと値)も削除されます。 values()は、mapに含まれる値のCollectionビューを返す。Collectionの要素を削除すると、Mapの対応するマッピング(キーと値)も削除されます。 get(Object key)は指定キーに関連する値を返します。 containsKey(Object key)true or false; containsValue(Object value)true or false; isempty()
size()
2、hashMap
HashMapは、すべてのオプションのマッピング動作を提供し、null値とnullキーの使用を許可し、非同期およびnullの使用を許可する以外に、HashMapクラスとHashtableはほぼ同じです。 この実装は同期ではないことに注意してください。複数のスレッドが同時に1つのハッシュマッピングにアクセスする場合、少なくとも1つのスレッドが構造的にマッピングを修正すると、外部同期を維持しなければならない。これは、一般的に、このマッピングの対象を自然にカプセル化する同期動作によって行われる。このようなオブジェクトが存在しない場合、このマッピングはCollection.synchronized Map方法を使用して「包装」されるべきである。この操作を作成時に完了すると、マッピングに意外な非同期アクセスを防ぐことができます。
Map m = Collections.synchronizedMap(new HashMap(...));
2.1、HashMapを遍歴し、 entrySetインターフェースを使うMap<String,Integer> map=new HashMap<String,Integer>();
map.put("1", 1);
map.put("2", 2);
map.put("3", 3);
map.put("3", 3);
Iterator itor=map.entrySet().iterator();
while(itor.hasNext()){
Map.Entry<String,Integer> entry=(Map.Entry<String,Integer>)itor.next();
System.out.println("key="+entry.getKey().toString());
System.out.println("values="+entry.getValue().toString());
}
2.2、HashMapを巡回し、keySetとvaluesインターフェースを使用するSet<String> keys=map.keySet();
Iterator itor=keys.iterator();
while(itor.hasNext()){
Object key=itor.next();
System.out.println("key="+key.toString());
System.out.println("value="+map.get(key).toString());
}
Collection co=map.values();
Iterator itor=co.iterator();
while(itor.hasNext()){
System.out.println("value="+itor.next());
}
2.3、HashtableとHashMapの違い:1.HashtableはDictoraryのサブクラスであり、HashMapはMapインターフェースの一つの実現類である。 2.Hashtableにおける方法は同期であり、HashMapにおける方法はデフォルトでは非同期である。つまり、マルチスレッドアプリケーションでは、専門的な操作をしなくても安全にHashtableが使えます。HashMapに対しては,追加の同期機構が必要である。しかし、HashMapの同期問題は、Collectionの静的方法によって解決され得る。
Map Collections.synchronizedMap(Map m)
この方法は同期Mapを返します。このMapは下の層のHashMapをカプセル化しています。下の層のHashMapはマルチスレッドの環境においても安全です。3.HashMapでnullはキーとして使用できます。このようなキーは一つだけです。1つ以上のキーに対応する値がnullであることができます。get()メソッドがnull値に戻ると、すなわちHashMapにこのキーがないことを示してもよく、このキーの対応する値がnullであることを示してもよい。したがって、hashMapではget()方法でHashMapにあるキーがあるかどうかを判断することはできず、containsKey()方法で判断すべきである。