• Java学习----Map接口


    今日学习内容总结如下:

    Map接口

    哈希表就是一种以键-值(key-indexed) 存储数据的结构,只要输入待查找的值即key,即可查找到其对应的值。

    哈希的思路很简单,如果所有的键hashCode都是整数,那么就可以使用一个简单的无序数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。

    它提供了一组键值的映射。其中存储的每个数据对象都有一个相应的键key,键决定了值对象在Map中的存储位置。键应该是唯一的,不允许重复,每个key只能映射一个value。

    Map接口的定义

    public interface Map 

    表示存储数据时有2个部分key和value,key不允许重复

    int size(); 获取key-value个数

    boolean containsKey(Object key);判断集合中是否包含指定的key值
            要求key类型需要实现equals和hashCode发方法
                首先调用hashCode方法获取key对应的hash值,然后当key值和map中的key值相同时才会继续调用equals进行等值判断,否则是false

    boolean containsValue(Object value);判断集合中是否包含指定的value值
            要求value类型需要实现equals,对于hashCode没有要求;进行判断时是直接调用equals方法

    V get(Object key);根据key值获取对应的value值

    如果key不存在,则返回为null;即使key值不存在也不会抛异常

    获取数据返回为null有2种情形:没有对应的key,存储key对应的值为null

    V put(K key, V value);向map集合中添加key-value对,返回原始存储的value值

    如果key值已经存在则后盖前,同时返回被覆盖的数据

    要求针对key类型必须实现equals和hashCode两个方法

    Java的潜规则:要求当两个对象的equals为true时,hashCode值必须相等

    1. @Override
    2. public int hashCode() {
    3. return Objects.hash(id, name);
    4. }
    5. @Override
    6. public boolean equals(Object obj) {
    7. if (this == obj)
    8. return true;
    9. if (obj == null)
    10. return false;
    11. if (getClass() != obj.getClass())
    12. return false;
    13. A3 other = (A3) obj;
    14. return Objects.equals(id, other.id) && Objects.equals(name, other.name);
    15. }

    V remove(Object key); 根据key值删除对应的key-value对,返回对应的value值

    如果key值不存在,不会抛出异常,只是返回值为null;如果key值存在则返回对应的value

    获取数据返回为null有2种情形:没有对应的key,存储key对应的值为null

    void clear();清空集合中的所有元素key-value对

    遍历map集合有三种方式,map提供了三种不同的视图

    1、Iterator  2、.forEach(lambda)  3、for-each结构  for(Object tmp: map.keySet)

    Set keySet();获取所有的key所组成的Set集合

    Collection values();获取所有的value所组成的Collection集合

    Set> entrySet();获取所有的key-value对所构成的Set集合

    在Map中一个key-value被封装成一个Entry的对象

    1. interface Entry {
    2. K getKey(); 当前entry对象中存储的key值
    3. V getValue(); 当前entry对象中存储的value值
    4. V setValue(V value); 修改entry对象中所存储的value值
    5. public static extends Comparablesuper K>, V> Comparator> comparingByKey() {
    6. return (Comparator> & Serializable)
    7. (c1, c2) -> c1.getKey().compareTo(c2.getKey());
    8. }
    9. public static extends Comparablesuper V>> Comparator> comparingByValue() {
    10. return (Comparator> & Serializable)
    11. (c1, c2) -> c1.getValue().compareTo(c2.getValue());
    12. }
    13. public static Comparator> comparingByKey(Comparatorsuper K> cmp) {
    14. Objects.requireNonNull(cmp);
    15. return (Comparator> & Serializable)
    16. (c1, c2) -> cmp.compare(c1.getKey(), c2.getKey());
    17. }
    18. public static Comparator> comparingByValue(Comparatorsuper V> cmp) {
    19. Objects.requireNonNull(cmp);
    20. return (Comparator> & Serializable)
    21. (c1, c2) -> cmp.compare(c1.getValue(), c2.getValue());
    22. }
    23. }

    新增方法:

    按照key值获取key所对应的value值,如果key值不存在则返回defaultValue;
    如果key存在,即使值为null,也是返回value值,不是defaultValue

    1. default V getOrDefault(Object key, V defaultValue) {
    2. V v;
    3. return (((v = get(key)) != null) || containsKey(key))
    4. ? v
    5. : defaultValue;
    6. }

    遍历当前Map集合中的所有元素

    1. default void forEach(BiConsumersuper K, ? super V> action) {
    2. Objects.requireNonNull(action); //判断非action非空,如果action为null则抛出异常
    3. for (Map.Entry entry : entrySet()) { for-each结构
    4. K k;
    5. V v;
    6. try {
    7. k = entry.getKey();
    8. v = entry.getValue();
    9. } catch (IllegalStateException ise) {
    10. throw new ConcurrentModificationException(ise);
    11. }
    12. action.accept(k, v);
    13. }
    14. }

    对应的lambda表达式接口定义为

    1. @FunctionalInterface
    2. public interface BiConsumer {
    3. void accept(T t, U u);
    4. }

    可以使用lambda表达式修改Map中所有的value值

    1. default void replaceAll(BiFunctionsuper K, ? super V, ? extends V> function) {
    2. Objects.requireNonNull(function); 要求function参数非空,否则异常
    3. for (Map.Entry entry : entrySet()) {for-each结构用于遍历所有的key-value对
    4. K k;
    5. V v;
    6. try {
    7. k = entry.getKey(); 获取当前entry对象中的key值
    8. v = entry.getValue(); 获取当前entry对象中的value值
    9. } catch (IllegalStateException ise) {
    10. throw new ConcurrentModificationException(ise);
    11. }
    12. v = function.apply(k, v);调用BiFunction中的方法对key和value进行处理,并返回一个V类型的数据
    13. try {
    14. entry.setValue(v);将计算得到的新数据注入到entry对象中,实现数据的修改
    15. } catch (IllegalStateException ise) {
    16. throw new ConcurrentModificationException(ise);
    17. }
    18. }
    19. }
    1. @FunctionalInterface
    2. public interface BiFunction {
    3. R apply(T t, U u); //针对传入的t和u进行处理,可以返回一个新的类型数据
    4. }

    按照key值修改原始数据,如果key对应的值为空,则修改数据为value,否则返回旧有数据,不修改

    1. default V putIfAbsent(K key, V value) {
    2. V v = get(key); //首先按照key获取对应的value值
    3. if (v == null) { //如果获取的value为空,则修改key对应的值为参数value
    4. v = put(key, value);
    5. }
    6. return v; //返回v值,如果v非空则返回原始数据,如果v为空则返回value
    7. }

    按照key和value值执行删除操作

    1. default boolean remove(Object key, Object value) {
    2. Object curValue = get(key); //获取key对应的原始数据
    3. //如果原始存储的数据和value参数不相等或者不存在对应的key并且key对应存储的原始数据为null,//则不执行任何操作
    4. if (!Objects.equals(curValue, value) ||
    5. (curValue == null && !containsKey(key))) {
    6. return false;
    7. }
    8. remove(key); //删除key对应的数据
    9. return true;
    10. }

    按照指定的key和oldValue值执行替换操作,将key对应的值修改为newValue

    1. default boolean replace(K key, V oldValue, V newValue) {
    2. Object curValue = get(key); //按照key获取对应的当前存储的value值
    3. //如果当前存储的值和oldValue参数值不相等或者当前值为null并且不包含当前的key,则直接返回
    4. if (!Objects.equals(curValue, oldValue) ||
    5. (curValue == null && !containsKey(key))) {
    6. return false;
    7. }
    8. put(key, newValue); //修改key所对应的value为newValue
    9. return true;
    10. }

    按照指定的key进行修改,要求key对应的value非空或者包含对应的key 

    1. default V replace(K key, V value) {
    2. V curValue;
    3. if (((curValue = get(key)) != null) || containsKey(key)) {
    4. curValue = put(key, value);
    5. }
    6. return curValue;
    7. }

  • 相关阅读:
    无框折叠玻璃隔断,上下轨道自由折叠门,集美丽与实用一体,开启空间最大化
    2022牛客蔚来杯第一场
    风、光、柴油机、蓄电池、电网交互微电网经济调度优化问题研究附Matlab代码
    Service
    java计算机毕业设计健身俱乐部管理系统MyBatis+系统+LW文档+源码+调试部署
    3种在ArcGIS Pro中制作山体阴影的方法
    【2022】Nginx使用ngx_http_log_module模块定义日志
    TempoEM指标平台重磅发布,让管理更敏捷,业务更智能!
    关于cvxpy库安装过程中遇到的一些问题
    免费分享一套SpringBoot+Vue农产品在线销售(在线商城)管理系统【论文+源码+SQL脚本】,帅呆了~~
  • 原文地址:https://blog.csdn.net/hanxuya/article/details/126670127