Map详解
2022年3月9日
Map详解
基本介绍
本文主要介绍jdk8的Map接口特点
- Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value
- Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node
- 对象中Map中的key不允许重复,Map中的value可以重复
- Map的key可以为null,value也可以为null,注意key为null,只能有一个
- value为null,可以多个
- 常用String类作为Map的key
- key和value之间存在单向一对一关系,即通过指定的key总能找到对应的value
Map接口的常用方法
public class MapTest {
public static void main(String[] args) {
Map map = new HashMap();
map.put("邓超", new Book("", 100));//OK
map.put("邓超", "孙俪");//替换-> 一会分析源码
map.put("刘令博", null);//OK
map.put(null, "刘亦菲");//OK
map.put("鹿晗", "关晓彤");//OK
map.put("kkrot", "kkrot");
System.out.println("map=" + map);
// remove:根据键删除映射关系
map.remove(null);
System.out.println("map=" + map);
// get:根据键获取值
Object val = map.get("鹿晗");
System.out.println("val=" + val);
// size:获取元素个数
System.out.println("k-v=" + map.size());
// isEmpty:判断个数是否为 0
System.out.println(map.isEmpty());//F
// clear:清除 k-v
//map.clear();
System.out.println("map=" + map);
// containsKey:查找键是否存在
System.out.println("结果=" + map.containsKey("kkrot"));//T
}
}
class Book {
private String name;
private int num;
public Book(String name, int num) {
this.name = name;
this.num = num;
}
}
Map接口常用遍历方式
- k-v实际封装在了HashMap$Node中
node=newNode(hash,key,valve,null)
- 为了方便程序员的遍历,还会创建EntrySet集合,该集合存放的元素的类型Entry,而一个Entry对象就有k,v。EntrySet<Entry<K,V>>即:
transient Set<Map.Entry<K,V>> entrySet;
- entrySet中,定义的类型是
Map.Entry
,但是实际上存放的还是HashMap$Node,这是因为static class Node<K,V>implements Map.Entry<K,V>
- 当把HashMap$Node对象存放到entrySet就方便我们的遍历,因为Map.Entry提供了重要方法:
K:getKey();V: getValue();
方式一:keySet
public class MapTra {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("admin", "110");
map.put("socct", "112");
map.put("kkrot", "113");
map.put("system", "114");
map.put("root", "115");
Set<String> set = map.keySet();
//foreach
for (String key : set) {
System.out.println(key + "=" + map.get(key));
}
System.out.println("--------------------------------");
//迭代器
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
String key = (String) iterator.next();
System.out.println(key + "=" + map.get(key));
}
}
}
方式二:values
public class MapValues {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("admin", "110");
map.put("socct", "112");
map.put("kkrot", "113");
map.put("system", "114");
map.put("root", "115");
Collection<String> values = map.values();
//foreach
for (String value : values) {
System.out.println(value);
}
System.out.println("--------------------------------");
//迭代器
Iterator<String> it = values.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
}
}
方式三:EntrySet
public class MapKeySet {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
map.put("admin", "110");
map.put("socct", "112");
map.put("kkrot", "113");
map.put("system", "114");
map.put("root", "115");
Set entrySet = map.entrySet();
//foreach
for(Object entry : entrySet){
//将 entry转换成Map.Entry
Map.Entry m = (Map.Entry)entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
System.out.println("--------------------------------");
//迭代器
Iterator it = entrySet.iterator();
while (it.hasNext()){
Object entry = it.next();
Map.Entry m = (Map.Entry) entry;
System.out.println(m.getKey() + "-" + m.getValue());
}
}
}