Map は、マッピング関係を含むデータを保存するために使用されます: Key - Value
Set の場合、最下層は実際には依然として Map ですが、Set はマップを選択しません。 Value を使用します。つまり、Set の Value 値は常に定数です。
Map の Key と Value は任意のタイプのデータであり、HashMap$Node オブジェクトにカプセル化されます。
Map の Key は繰り返しできませんが、Value は繰り返し可能です同じ Key がある場合、等価性と置換操作
Map の Key-Valueペアは HashMap$Node
tab[i] = newNode(hash, key, value, null); -- Node<K,V> newNode(int hash, K key, V value, Node<K,V> next) { return new Node<>(hash, key, value, next); }
それでは、この Node ノードのデータ型は何でしょうか?
ソース コードを見てみましょう: (これは Entry インターフェイスも実装しています)
static class Node<K,V> implements Map.Entry<K,V> { final int hash; // 存放hash值 final K key; // 存放key值 V value; // 存放Value值 Node<K,V> next; // 存放下一个个节点,以形成链表结构 }
k-v プログラマーの探索を容易にするために、EntrySet コレクションも作成されます。このコレクションに格納されているのは Entry で、Entry オブジェクトには k、v が含まれていますが、基本的に、ここでの k-v 値は引き続き Node ノード内のデータを指します。つまり、ここでの k-v は依然としてアドレス データ
// k-v存在有EntrySet的一个指向 Set set = map.entrySet(); System.out.println(set.getClass());
を格納します。出力:
class java.util.HashMap$EntrySet
それでは、プログラマのトラバーサルを容易にするこの機能はどのように反映されるのでしょうか?
その理由は、Map.Entry が 2 つの非常に重要なメソッド、K getKey(); V getValue(); を提供しているためです。したがって、次の方法でマップをトラバースできます:
Set set = map.entrySet(); System.out.println(set.getClass()); for (Object obj : set) { Map.Entry entry = (Map.Entry) obj; System.out.println(entry.getKey()); System.out.println(entry.getValue()); }
それでは、Entry に格納されている k-v が単なるアドレスへのポインタであることをどのように証明するのでしょうか。非常に単純な
デバッグを通じて、まずマップに保存されているデータを見てみましょう。no2 キーのアドレスは @727
で、次にセットを見てください no2 キーのアドレスはまったく同じです:
##3.Map インターフェイス メソッドコード例:Map map = new HashMap(); // 添加键值对 map.put("no1","dahe"); map.put("no2","zhangsan"); // Key重复会进行替换 map.put("no1","lisi"); System.out.println(map); // 根据键删除映射关系 map.remove("no1"); System.out.println(map); // 根据key得到值 Object no2 = map.get("no2"); System.out.println(no2); // 获取键值对数量 System.out.println(map.size()); // 判空 System.out.println(map.isEmpty()); // 清空 // map.clear(); // 查找键是否存在 System.out.println(map.containsKey("ok"));4.マップトラバーサルメソッド最初の式: すべてのキーを取り出し、そのキーを通じて対応する値を取得します
// 取出所有的key,通过key取出对应的value Set keySet = map.keySet(); for (Object o : keySet) { System.out.println(o); System.out.println(map.get(o)); }2 番目の式: すべての値の値を取り出します
// 把所有的value值取出 Collection values = map.values(); for (Object value : values) { System.out.println(value); }3 番目の式: EntrySet を使用して k-v
// 通过EntrySet来获取 k-v Set entrySet1 = map.entrySet(); for (Object o : entrySet1) { // 将entry 转成 Map.Entry Map.Entry m = (Map.Entry) o; System.out.println(m.getKey()); System.out.println(m.getValue()); }を取得します
以上がJavaコレクションクラスでMapを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。