程序员必备知识:Map的常用方法使用

coding-程序员必备知识:Map的常用方法使用-

一、Map的说明

 Map没有像List、Queue、Set一样继承Collection,它是独立于它们存在的。
Map是一个接口类,实现的类有HashMap和TreeMap。
Map在现实生活中对什么进行抽象的呢?--------姓名--个人资料,就是key-value,
但还是以key为准。

coding-程序员必备知识:Map的常用方法使用-

二、Map的常用方法说明

1.Map.Entry<k,v>的说明

1.关于Map.Entry<k,v>,他其实是Map内部实现的用来存放<key,value>键值对映射关系的内部类,所以调用的时候才采用Map.Entry方式进行调用;
2.该内部类里边还提供了<key,value>的获取,value的设置以及key的比较方式:方框里的三个方法比较重要coding-程序员必备知识:Map的常用方法使用-
注意:Map.Entry<K,V>中没有提供设置Key的方法----------------那是因为再HashMap在排序比较的时候,就像一棵搜索二叉树,其key是唯一不变的,key的改变会影响树的结构,所以不能key不能改变。

2.常用方法

方法解释
V get(Object key)返回key所对应的value
V getOrDefault(Object key,V defaultValue)返回key对应的value,key不存在,则返回默认设置(jdk1.8以后才有的)
V put(K key,V value)设置key对应的value
V remove(Object key)删除key对应的映射关系
Set keySet()返回所有key的不重复的集合
Collection values()返回所有value的可重复集合
Set<Map.Entry<K,V>> entrySet()返回所有的key-value的映射关系
boolean containsKey返回是否包含key
boolean containsValue(Object value)判断是否包含value

3.TreeMap和HashMap的区别

TreeMapHashMap
底层结构为红黑树底层结构为哈希桶
插入/删除/查找时间复杂度O(log(n))O(1)
关于key有序无序
线程不安全线程不安全
插入/删除/查找时:需要进行元素的比较通过哈希函数计算哈希地址
应用场景:需要ley有序的场景下key是否有序不关心,而是需要更高的时间性能

4.注意的一些小概念

(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删除掉,然后再来进行重新插入。

5.代码

主要就是对Map的一些方法进行调用,具体的是如何调用的以及要注意的一些问题进行了补充:代码如下

import java.util.Map;
import java.util.TreeMap;

public class Map1 {
    public static void main(String[] args) {
        
        Map<String,String> m=new TreeMap<>();
        
        //put(key,value):插入key-value的键值对
        m.put("林冲","豹子头");
        m.put("鲁智深","花和尚");
        m.put("武松","行者");
        m.put("宋江","及时雨");
        
        
        String str=m.put("李逵","黑旋风");
        System.out.println(m.size());
        System.out.println(m);

        //put(key,value):注意key不能为空,但是value可以为空,key如果为空,会抛空指针异常
        str=m.put("无名",null);
        System.out.println(m.size());

        //如果key存在,put(key,value)则会替换掉原来的value,返回旧的value
        str=m.put("李逵","铁牛");

        //get(key),返回key所对应的value
        //如果key存在,则返回key对应的value,如果key不存在,则返回null
        System.out.println(m.get("鲁智深"));
        System.out.println(m.get("史进"));

        //containKey(key):检查key是否包含在Map中,时间复杂度O(log(n))
        //按照红黑树的主性质进行查找
        //找到返回true,找不到,则返回false
        System.out.println(m.containsKey("林冲"));
        System.out.println(m.containsKey("史进"));

        //containValue(value):检测value是否包含在Map中,时间复杂度O(n)
        //因为TreeMap是按照key进行组织的,因此查找value时候就需要整体遍历
        //找到返回true,找不到返回false
        System.out.println(m.containsValue("豹子头"));
        System.out.println(m.containsValue("九纹龙"));

        //打印所有的key
        for(String s:m.keySet()){
            System.out.println(s+" ");
        }
        System.out.println();

        //打印所有的value
        for(String s:m.values()){
            System.out.println(s+" ");
        }
        System.out.println();

        //打印所有的键值对
        //entrySet():将Map中的键值对放在Set中返回了
        for(Map.Entry<String,String> entry:m.entrySet()){
            System.out.println(entry.getKey()+"---->"+entry.getValue());
        }
        System.out.println();

三、总结

1.了解了Map这个概念,知道了可以用Map存取对象之间的映射,做题的时候,例如:找出现次数最多的单词,<次数,单词>就可以使用TreeMap来进行求解,凡是有关两个属性,并且之间是一对一关系的就可以使用Map;
2.要熟知Map的一些常用方法,做题的时候会更加方便的。

匿名

发表评论

匿名网友