Java面向对象系列[v1.0.0][MAP]

Map用于保存具有映射关系的数据,因此Map集合里保存着两组值,一组用于保存key,一组用于保存value,key和value都可以是任何引用类型的数据
Map的key不允许重复,即同一个Map对象的任何两个key通过equals方法比较总是返回false
Map的key和value之间是一对一关系,即通过指定的key一定找到唯一的value
在这里插入图片描述
如果把Map里的所有key放在一起,他们就组成了一个Set集合,即key没有顺序,且不可重复,实际上Map的确提供了keySet()方法,用于返回所有key组成的Set集合
如果把Map里的所有value放在一起,他们非常类似一个List,即元素与元素可以重复,每个元素可以根据索引来查找,只是在Map中是使用key,因此Map有时候也被称为字典或关联数组

Map接口常用方法

  • void clear():删除该Map对象中的所有键值对
  • boolean containsKey(Object key):查询Map中是否包含指定的key,如果包含则返回true
  • boolean containsValue(Object value):查询Map中是否包含一个或多个,如果包含则返回true
  • Set entrySet():返回Map中包含的键值对所组成的Set集合,每个集合元素都是Map.Entry(Entry是Map的内部类)对象
  • Object get(Object key):返回指定key所对应的value,如果Map中没有这个key,则返回null
  • boolean isEmpty():查询Map是否为空(无任何键值对),为空则返回true
  • Set keySet():返回该Map中所有key组成的Set集合
  • Object put(Object key, Object value):添加一个键值对,如果当前Map中已经存在相同的key,则直接覆盖其value
  • void putAll(Map m):将指定Map中的键值对复制到本Map中
  • Object remove(Object key):删除指定key所对应的键值对,返回被删除key所对应的value,如果该key不存在则返回null
  • boolean remove(Object key, Object value):删除指定key、value所对应的键值对,删除成功则返回true,否则返回false
  • int size():返回该Map里的键值对个数
  • Collection values():返回该Map里所有value组成的Collection

Map内部类Entry

该类封装了一个键值对,并提供了3个方法:
Object getKey():返回该Entry里包含的key值
Object getValue():返回该Entry里包含的value值
Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值

import java.util.*;
import static java.lang.Syatem.*;

public class MapTest
{
    public static void main(String[] args)
    {
        var map = new HashMap();
        // 成对放入多个key-value对
        map.put("我醉欲眠卿且去", 109);
        map.put("锄禾日当午", 10);
        map.put("汗滴禾下土", 79);
        // 多次放入的key-value对中value可以重复
        map.put("SpringBoot实战", 99);
        // 放入重复的key时,新的value会覆盖原有的value
        // 如果新的value覆盖了原有的value,该方法返回被覆盖的value
        // 输出10
        out.println(map.put("锄禾日当午", 99)); 
        // 输出的Map集合包含4个key-value对
        out.println(map); 
        // 判断是否包含指定key
        // 输出true
        out.println("是否包含值为 锄禾日当午 的key:" + map.containsKey("锄禾日当午")); 
        // 判断是否包含指定value
        // 输出true
        out.println("是否包含值为 99 的value:" + map.containsValue(99)); 
        // 获取Map集合的所有key组成的集合,通过遍历key来实现遍历所有key-value对
        for (var key : map.keySet())
        {
            // map.get(key)方法获取指定key对应的value
            out.println(key + "-->" + map.get(key));
        }
        // 根据key来删除key-value对。
        map.remove("汗滴禾下土"); 
        // 输出结果不再包含 汗滴禾下土=79 的key-value对
        out.println(map); 
    }
}

HashMap重写了toString()方法,实际上所有的Map实现类都重写了toString()方法,调用Map对象的toString()方法总是返回如下格式的字符串:{key1=value1, key2=value2…}

Java8为Map新增方法

除了为Map增加了remove(Object key, Object value)默认方法外,还增加了如下常用方法:

  • Object compute(Object key, BiFunction remappingFunction):该方法使用remappingFunction根据原键值对计算一个新的value,只要新的value不是null,就使用新的value覆盖原value;如果原value不是null,但新value为null,则删除原键值对;如果原value、新value同时为null,则该方法不改变任何键值对,直接返回null。
  • Object computeIfAbsent(Object key, Function mappingFunction):如果传给该方法的key在Map中对应的value为null,则使用mappingFunction根据key计算一个新的结果,如果计算结果不是null,则用计算结果覆盖原来的value;如果原Map原来不包括该key,那么该方法可能会添加一组键值对
  • Object computeIfPresent(Object key, BiFunction remappingFunction):如果传给该方法的key在Map中对应的value不是null,该方法将使用remappingFunction根据原key、value计算一个新的结果,如果结果不是null则使用该结果覆盖原来的value;如果结果为null则删除原键值对
  • void forEach(BiConsumer action):通过该方法可更简洁的遍历Map的键值对
  • Object getOrDefault(Object key, V defaultValue):获取指定key对应的value,如果该key不存在则返回defaultValue
  • Object merge(Object key, Object value, BiFunction remappingFunction):该方法先根据key获取该Map中对应的value,如果获取的value为null则直接用传入的value覆盖原有的value(这种情况下可能要添加一组键值对);如果获取的value不是null,则使用remappingFunction根据原value、新value计算一个新的结果,用得到的结果覆盖原value
  • Object putIfAbsent(Object key, Object value):该方法会自动检测指定key对应的value是否为null,如果该key对应的value是null,则用新的value代替原来的null
  • Object replace(K key, V oldValue, V newValue):将Map中指定key对应的value替换成新value,与传统的put()方法不同,该方法不可能添加新的键值对,如果尝试替换的key在原Map中不存在,该方法不会添加键值对,而是直接返回null
  • boolean replace(K key, V oldValue, V newValue):将Map中指定键值对的原value替换成新value,如果在Map中找到指定的键值对,则执行替换并返回true,否则返回false
  • replaceAll(BiFunction function):使用BiFunction对原键值对执行计算,并将结算结果作为该键值对的value值
import java.util.*;
import static java.lang.System.*;

public class MapTest2
{
    public static void main(String[] args)
    {
        var map = new HashMap();
        // 成对放入多个key-value对
        map.put("SpringBoot实战", 109);
        map.put("Spring实战", 99);
        map.put("SpringMVC实战", 79);
        // 尝试替换key为"SpringCloud实战"的value,由于原Map中没有对应的key,
        // 因此对Map没有改变,不会添加新的key-value对
        map.replace("SpringCloud实战", 66);
        out.println(map);
        // 使用原value与参数计算出来的结果覆盖原有的value
        map.merge("Spring实战", 10,
            (oldVal, param) -> (Integer) oldVal + (Integer) param);
        // "Spring实战"的value增大了10
        out.println(map); 
        // 当key为"Java"对应的value为null(或不存在时),使用计算的结果作为新value
        map.computeIfAbsent("Java", key -> ((String) key).length());
        // map中添加了 Java=4 这组key-value对
        out.println(map); 
        // 当key为"Java"对应的value存在时,使用计算的结果作为新value
        map.computeIfPresent("Java",
            (key, value) -> (Integer) value * (Integer) value);
        // map中 Java=4 变成 Java=16
        out.println(map); 
    }
}
发布了207 篇原创文章 · 获赞 124 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/dawei_yang000000/article/details/105190305