La carte est utilisée pour enregistrer des données avec des relations de cartographie : Clé - Valeur
Pour Set, la couche inférieure est en fait toujours une carte, mais Set Choisissez de ne pas utiliser Value, c'est-à-dire que la valeur Value de Set est toujours une constante
La clé et la valeur dans Map peuvent être n'importe quel type de données et seront encapsulées dans l'objet HashMap$Node
#🎜 🎜#La clé dans la carte ne peut pas être répétée, mais la valeur peut être répétée Lorsqu'il y a la même clé, les opérations d'équivalent et de remplacement sont effectuées2.Interface de la carte. analyseClés de la carte de stockage La paire de valeurs est dans HashMap$Nodetab[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); }Alors, quel est le type de données de ce nœud Node ? Regardons le code source : (Il implémente également l'interface 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 Afin de faciliter le parcours du programmeur, une collection EntrySet sera également créée , qui stocke Le type d'élément est Entry et un objet Entry contient k, v, mais essentiellement la valeur k-v ici pointe toujours vers les données dans un nœud Node, c'est-à-dire que le k-v ici stocke toujours les données d'adresse
// k-v存在有EntrySet的一个指向 Set set = map.entrySet(); System.out.println(set.getClass());# 🎜🎜 #Output : class java.util.HashMap$EntrySet
Alors, comment cette fonctionnalité qui facilite la traversée du programmeur est-elle reflétée ?
La raison est que Map.Entry fournit deux méthodes très importantes : K getKey(); V getValue();. On peut donc parcourir la Map de la manière suivante :
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()); }
Alors comment prouver que le k-v stocké dans Entry n'est que le pointeur vers l'adresse ? Très simple
Grâce au débogage, jetons d'abord un œil aux données stockées dans la Map L'adresse de la clé no2 est @727
#🎜🎜. ## 🎜🎜# Jetons un coup d'oeil à l'adresse de la clé n°2 dans le set, qui est exactement la même : 3.Interface cartographique MéthodeExemple de code:
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"));
La première formule : retirez toutes les clés et obtenez la valeur correspondante via le key
// 取出所有的key,通过key取出对应的value Set keySet = map.keySet(); for (Object o : keySet) { System.out.println(o); System.out.println(map.get(o)); }
// 把所有的value值取出 Collection values = map.values(); for (Object value : values) { System.out.println(value); }
La troisième formule : obtenir k-v via EntrySet
// 通过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()); }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!