Map详解

Mr.LR2022年3月9日
大约 2 分钟

Map详解

基本介绍

本文主要介绍jdk8的Map接口特点

  1. Map与Collection并列存在。用于保存具有映射关系的数据:Key-Value
  2. Map中的key和value可以是任何引用类型的数据,会封装到HashMap$Node
  3. 对象中Map中的key不允许重复,Map中的value可以重复
  4. Map的key可以为null,value也可以为null,注意key为null,只能有一个
  5. value为null,可以多个
  6. 常用String类作为Map的key
  7. 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接口常用遍历方式

  1. k-v实际封装在了HashMap$Node中 node=newNode(hash,key,valve,null)
  2. 为了方便程序员的遍历,还会创建EntrySet集合,该集合存放的元素的类型Entry,而一个Entry对象就有k,v。EntrySet<Entry<K,V>>即:transient Set<Map.Entry<K,V>> entrySet;
  3. entrySet中,定义的类型是Map.Entry,但是实际上存放的还是HashMap$Node,这是因为static class Node<K,V>implements Map.Entry<K,V>
  4. 当把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());
        }
    }
}
上次编辑于: 2022/9/26 18:02:00
贡献者: liurui-60837