Map详解

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);
    }
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP54y_6L-b5YyW54mI,size_16,color_FFFFFF,t_70,g_se,x_16

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

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP54y_6L-b5YyW54mI,size_18,color_FFFFFF,t_70,g_se,x_16

  • 当有相同的 key 时,就等价于将value替换,key不替换

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);
    }
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP54y_6L-b5YyW54mI,size_15,color_FFFFFF,t_70,g_se,x_16

  • 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);
    }
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP54y_6L-b5YyW54mI,size_15,color_FFFFFF,t_70,g_se,x_16

  • 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);
    }
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP54y_6L-b5YyW54mI,size_14,color_FFFFFF,t_70,g_se,x_16

  • 通过 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"));
    }
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP54y_6L-b5YyW54mI,size_14,color_FFFFFF,t_70,g_se,x_16

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<K,V> implements Map.Entry<K,V>
  • k-v 为了方便程序员的遍历,还会创建 EntrySet集合,该集合存放的元素的类型是 Entry,而一个Entry对象就有k-v,EntrySet<Entry<k,v>>

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

transient Set<Map.Entry<K,V>> 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());
        }
    }
}

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP54y_6L-b5YyW54mI,size_17,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP54y_6L-b5YyW54mI,size_18,color_FFFFFF,t_70,g_se,x_16

 watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA56iL5bqP54y_6L-b5YyW54mI,size_18,color_FFFFFF,t_70,g_se,x_16

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

    public Set<Map.Entry<K,V>> entrySet() {
        Set<Map.Entry<K,V>> es;
        return (es = entrySet) == null ? (entrySet = new EntrySet()) : es;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值