Map

本文详细介绍了Java中的Map接口及其内部类Map.Entry,强调了Map的特性,如键值对的唯一性,以及如何通过key、value进行操作。还展示了TreeMap的使用,包括插入、获取、检查键值对存在性以及常用方法的示例。同时,自定义了一个简单的MyTreeMap实现,演示了put和get方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Map官方文档

关于Map的说明

Map是一个接口类,该类没有继承自Collection,该类中存储的是<K,V>结构的键值对,并且K一定是唯一的,不能重复。

关于Map.Entry<K, V>的说明

Map.Entry<K, V> 是Map内部实现的用来存放<key, value>键值对映射关系的内部类,该内部类中主要提供了<key, value>的获取,value的设置以及Key的比较方式。

注意:Map.Entry<K,V>并没有提供设置Key的方法

Map 的常用方法说明

在这里插入图片描述
注意:
1. Map是一个接口,不能直接实例化对象,如果要实例化对象只能实例化其实现类TreeMap或者HashMap
2. Map中存放键值对的Key是唯一的,value是可以重复的
3. 在Map中插入键值对时,key不能为空,否则就会抛NullPointerException异常,但是value可以为空
4. Map中的Key可以全部分离出来,存储到Set中来进行访问(因为Key不能重复)。
5. Map中的value可以全部分离出来,存储在Collection的任何一个子集合中(value可能有重复)。
6. Map中键值对的Key不能直接修改,value可以修改,如果要修改key,只能先将该key删除掉,然后再来进行重新插入。
7. TreeMap和HashMap的区别
在这里插入图片描述
TreeMap:


import java.util.Collection;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;

/**
 * @author 枳洛淮南
 * @version 1.0
 * @Description map 的使用
 * @Date 2021/4/2 下午 15:57
 */
public class mapDemo
{
    public static void main(String[] args)
    {
        Map<String, Integer> mailList = new TreeMap<>();

        mailList.put("火警", 119);
        mailList.put("警察", 110);
        mailList.put("天气", 114);
        mailList.put("查号", 114);

        //返回所有 key,set 会自动去重
        Set<String> keys = mailList.keySet();
        System.out.println(keys + "\n");

        //返回所有 value
        Collection<Integer> values = mailList.values();
        System.out.println(values + "\n");

        //返回键值对
        Set<Map.Entry<String, Integer>> entries = mailList.entrySet();
        System.out.println(entries + "\n");

        //是否含有该 key
        boolean flag = mailList.containsKey("火警");
        System.out.println(flag);
        flag = mailList.containsKey("匪警");
        System.out.println(flag + "\n");

        //是否含有该 value
        flag = mailList.containsValue(114);
        System.out.println(flag);
        flag = mailList.containsValue(222);
        System.out.println(flag);
    }

    public static void main1(String[] args)
    {
        Map<String, Integer> mailList = new TreeMap<>();
        mailList.put("ss", 888);

        //put 方法返回插入之前该 key 映射的值
        Integer v = mailList.put("sh", 123);
        System.out.println(v);
        System.out.println(mailList);
        v = mailList.put("sh", 456);
        System.out.println(v);
        System.out.println(mailList);
        System.out.println();

        //get 获取某 key 对应的值,如果没有该 key ,返回null
        v = mailList.get("sh");
        System.out.println(v);
        v = mailList.get("sh");
        System.out.println(v);
        v = mailList.get("jj");
        System.out.println(v);
        System.out.println();

        //getOrDefault(key value) 获取某 key 对应的值,如果没有该 key ,返回默认的 value
        //不会修改集合本身
        System.out.println(mailList);
        v = mailList.getOrDefault("jj", -1);
        System.out.println(v);
        System.out.println(mailList);
        System.out.println();

        //remove(key) 删除key - value 映射关系,返回value,没有 key 则返回 null
        v = mailList.remove("sh");
        System.out.println(v);
        System.out.println(mailList);
        System.out.println();


    }
}

自己实现的TreeMap:


/**
 * @author 枳洛淮南
 * @version 1.0
 * @Description 功能
 * @Date 2021/4/2 下午 16:14
 */
public class MyTreeMap
{
    private TreeNode root;

    @Override
    public String toString()
    {
        return "MyTreeMap{" +
                "root=" + root +
                '}';
    }

    public Integer put(String key, Integer value)
    {
        if (root == null)
        {
            root = new TreeNode(key, value);
            return null;
        }

        TreeNode cur = root;
        TreeNode parent = null;
        while (cur != null)
        {
            int cmp = key.compareTo(cur.key);
            if (0 == cmp)
            {
                Integer oldValue = cur.value;
                cur.value = value;
                return oldValue;
            } else if (cmp < 0)
            {
                parent = cur;
                cur = cur.left;
            } else
            {
                parent = cur;
                cur = cur.right;
            }
        }

        TreeNode node = new TreeNode(key, value);
        int cmp = key.compareTo(parent.key);
        if (cmp < 0)
        {
            parent.left = node;
        } else
        {
            parent.right = node;
        }
        return null;
    }

    public Integer get(String key)
    {
        TreeNode cur = root;
        while (cur != null)
        {
            int cmp = key.compareTo(cur.key);
            if (0 == cmp)
            {
                return cur.value;
            } else if (cmp < 0)
            {
                cur = cur.left;
            } else
            {
                cur = cur.right;
            }
        }
        return null;
    }

    public Integer getOrDefault(String key, Integer defaultValue)
    {
        Integer v = get(key);
        if (v != null)
        {
            return v;
        }

        return defaultValue;
    }

}

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枳洛淮南✘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值