Map详解

Map详解,第1张

Map详解 Map接口的实现类的特点[很实用]

注意:这里讲的是JDK8的Map接口特点

  • Map集合用于保存具有映射关系的数据:Key-Value(双列元素)

  • Map中的 key 和 value 可以是任何引用类型的数据,会封装到HashMap$Node对象中

  • Map中的key不允许重复,原因和HashSet一样

  • Map中的value可以重复

  • Map中的key可以为null,value也可以为null,注意key只能有一个null,value可以有多个null

  • 常用String类作为Map的key

  • key 与 value 之间存在单向一对一的关系,即通过指定的 key 总能找到对应的 value


public class Demo01 {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("no1","韩顺平");
        map.put("no2","周杰伦");

        System.out.println("map="+map);
    }
}

  • Map中的 key 和 value 可以是任何引用类型的数据,会封装到HashMap$Node对象中

  • 当有相同的 k 时,就等价于替换

public class Demo01 {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("no1","韩顺平");
        map.put("no2","周杰伦");
        map.put("no1", "张三丰");

        System.out.println("map="+map);
    }
}

  • Map中的 value 可以重复

public class Demo01 {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("no1","韩顺平");
        map.put("no2","周杰伦");
        map.put("no1", "张三丰");
        map.put("no3", "张三丰");
        
        System.out.println("map="+map);
    }
}

  • key只能有一个null,value可以有多个null

public class Demo01 {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put(null,null);
        map.put(null, "abc"); //相当于替换
        map.put("no2", null);
        map.put("no3", null);
        
        System.out.println("map="+map);
    }
}

  • 通过 get() 方法,传入 key ,会返回对应的 value

public class Demo01 {
    public static void main(String[] args) {
        Map map = new HashMap();
        map.put("no1","韩顺平");
        map.put("no2","周杰伦");
        map.put("no1", "张三丰");
        map.put("no3", "张三丰");

        System.out.println(map.get("no2"));
    }
}

Map中的一对 k-v 是放在一个HashMap$Node中的,又因为Node实现了 Entry 接口,有些书上也说一对 k-y 就是一个Entry
  • k-v 会封装到 HashMap$Node对象中 ,通过 newNode(hash, key, value, null); 存放的

  • HashMap中的静态内部类 Node

//实现的是Map接口中的Entry接口
static class Node implements Map.Entry
  • k-v 为了方便程序员的遍历,还会创建 EntrySet集合,该集合存放的元素的类型是 Entry,而一个Entry对象就有k-v,EntrySet>

 //HashMap中的内部类
 final class EntrySet extends AbstractSet> {
  • entrySet中,定义的类型是Map.Entry,但是实际上存放的还是 HashMap$Node,这是因为 static class Node implements Map.Entry

transient Set> entrySet;
  • 当把 HashMap$Node 对象存放到 entrySet中,就方便了我们的遍历,因为 Map.Entry 提供了重要的方法:例如 K getKey();  V getValue();  V setValue(V value)

public class Demo01 {
    public static void main(String[] args) {
        Map map = new HashMap();

        map.put("no1","韩顺平");
        map.put("no2","周杰伦");

        Set set = map.entrySet();

        System.out.println(set.getClass());
        System.out.println("============");

        for (Object obj : set) {
            System.out.println(obj.getClass());

            //向下转型取出 k-v
            Map.Entry entry = (Map.Entry)obj;

            System.out.println(entry.getKey()+"-"+entry.getValue());
        }
    }
}

 

 

  • 执行 Set set = map.entrySet();

    public Set> entrySet() {
        Set> es;
        return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
    }

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/726200.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-26
下一篇 2022-04-26

发表评论

登录后才能评论

评论列表(0条)

保存