Java自学笔记—Map

Java自学笔记—Map

Map特点

  1. Map用于保存具有映射关系的数据:Key-Value(双列元素)
  2. Map中 key 和 value 可以是任意类型,会封装到HashMap$Node 对象中
  3. Map 中key不允许重复,key 只能一个为空,value 可以多个为空,key可以为任意对象
  4. key he value 单项一对一,指定的key有对于的value
/**
 * @author Lspero
 * @version 1.0
 */
public class Map_ {
    public static void main(String[] args) {        Map map = new HashMap();
        map.put("no1", "C++");
        map.put("no2", "java");
        map.put("no1", "php");//有相同的key,等价于替换
        map.put("no3", "php");//key值不一样,可以保存
        
        map.put(null, null);
        map.put(null, "C");//key只能一个为空
        map.put("no4", null);
        map.put("no5", null);//value可以多个为空
        map.put(1, null);
        map.put(new Object(), null);
        System.out.println("map = " + map);
        
        //通过get方法传入一个key,返回一个value
        System.out.println(map.get(1));
    }
}

Map常用方法

/**
 * @author Lspero
 * @version 1.0
 */
@SuppressWarnings("all")
public class MapMethod {
    public static void main(String[] args) {
        Map map = new HashMap();
        //
        map.put("no1", "C++");
        map.put("no2", "java");
        map.put("no1", "php");//有相同的key,等价于替换
        map.put("no3", "php");//key值不一样,可以保存
        System.out.println(map);
        Object no1 = map.get("no1");//根据key找value
        map.remove("no3");//删除
        boolean no11 = map.containsKey("no1");//判断key是否存在
        int size = map.size();//Map大小
        boolean empty = map.isEmpty();//判空
        System.out.println(map);
        map.clear();//清空
    }
}

Map数据结构

  1. k-v 最后以结点方式存储 HashMap$Node node = newNode(hash, key, value, null);
  2. 为了方便遍历,会创建 entrySet 集合,该集合元素类型为 Entry
    transient Set<Map.Entry<K,V>> entrySet;
  3. 在EntrySet中,定义的是Map.Entry, 但实际上存放的还是 HashMap$Node
    由于HashMap$Node implements Map.Entry,有继承关系,因此可以存放
  4. 把 HashMap$Node 对象存放到 EntrySet 中是为了方便遍历,提供getKey()getValue() 方法,可以单独获取keySet和Values,均为set子类,可以用Set接收
  5. 实际数据依然在HashMap$Node结点中,entrySet只是地址指向关系

以HashMap为例,数据结构如下图

在这里插入图片描述

遍历方式

  1. 先取出所有key,通过key取出对应valueSet keyset = map.keySet();
  2. 直接取出value值Collection values = map.values();
  3. 通过EntrySet来获取k-vSet entryset = map.entrySet();
    注意将 Node 转成 Entry Map.Entry m = (Map.Entry) next;
/**
 * @author Lspero
 * @version 1.0
 */
@SuppressWarnings("all")
public class MapFor {
    public static void main(String[] args) {
        // 遍历方式
        Map map = new HashMap();
        map.put("no1", "C+ +");
        map.put("no2", "java");
        map.put("no1", "php");//有相同的key,等价于替换
        map.put("no3", "php");//key值不一样,可以保存

        //1.先取出所有key,通过Key取出对应Value
        System.out.println("=====第一种=====");
        //(1)增强for
        Set keyset = map.keySet();
        for (Object key :keyset) {
            System.out.println(key + "-" + map.get(key));
        }
        System.out.println("=====第二种=====");
        //(2)迭代器
        Iterator iterator = keyset.iterator();
        while (iterator.hasNext()) {
            Object key =  iterator.next();
            System.out.println(key + "-" + map.get(key));
        }

        System.out.println("=====取出所有value=====");
        //2.取出所有value值
        Collection values = map.values();
        //(1)增强for
        for (Object o :values) {
            System.out.println("value = " + o);
        }
        //(2)迭代器,由于没有get()方法,因此不能用普通for循环
        Iterator iterator1 = values.iterator();
        while (iterator1.hasNext()) {
            Object next = iterator1.next();
            System.out.println("value = " + next);
        }


        //3. 通过EntrySet来获取k-v
        Set entryset = map.entrySet();
        //(1)增强for
        System.out.println("=====使用EntrySet的增强for=====");
        for (Object entry :entryset) {
            //将entry转成Map.Entry, entry 是 HashMap$Node 类型
            Map.Entry m = (Map.Entry) entry;
            System.out.println(m.getKey() + "-" + m.getValue());

        }
        //(2)
        Iterator iterator2 = entryset.iterator();
        while (iterator2.hasNext()) {
            Object next = iterator2.next();
            //next是 HashMap$Node 类型
            //System.out.println(next.getClass());//class java.util.HashMap$Node
            Map.Entry m = (Map.Entry) next;
            System.out.println(m.getKey() + "-" + m.getValue());
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值