HashMap深入底层源码思考问题


下面我们结合Map源码讲解下Map的使用,比较简单的API方法我们就不在这里叙述了,下面开始我的的Map集合之旅。

getOrDefault

V getOrDefault(Object key, V defaultValue) 方法:

如果map集合存在该key,或者key对应的value不为空,就返回对应的value,否则返defaultValue

Map map = new HashMap();
map.put("1",11);
Object rs =  map.getOrDefault("2",22);
rs结果你认为是多少,上面我们已经说过了,显而易见结果是22,因为map里不存在key=2,所有 返回默认值。

forEach

void forEach(BiConsumer<? super K, ? super V> action)

map.forEach(new BiConsumer() {
     @Override
     public void accept(Object o, Object o2) {
         System.out.println("key:"+o+"  value:"+o2);
     }
 });

merge

参数说明   BigFunction的三个参数 分别是 olderVlaue newValue mergerValue类型
default V merge(K key, V value, BiFunction<? super V, ? super V, ? extends V> remappingFunction) {
    Objects.requireNonNull(remappingFunction);
    Objects.requireNonNull(value);
    V oldValue = get(key);
    V newValue = (oldValue == null) ? value :
               remappingFunction.apply(oldValue, value);
    if(newValue == null) {
        remove(key);
    } else {
        put(key, newValue);
    }
    return newValue;
}
方法说明: 该方法为合并key相同的value值,如果map里存在key,如果newValue不为空,两者可以合并求和等操作
如果map不存在key,newValue不为空也可以进行合并

示例:

Map<String, Integer> map = new HashMap();
map.put("1",11);
map.put("2",112);
map.put("12",1);

map.merge("12", 11   , (older,newvalue)->older+newvalue);
map.forEach((o, o2) -> System.out.println("key:"+o+"  value:"+o2));
输出结果为 1:11,2:112,12:12

putIfAbsent

@Override
public V putIfAbsent(K key, V value) {
    return putVal(hash(key), key, value, true, true);
}
方法说明:如果map里面key不存在,则可以put进去,如果map key存在,但是OlderValue是null,也可以将NewValue put进去

示例:

HashMap<Integer, String> map = new HashMap();
map.put(1, "121");
map.put(2, null);
map.putIfAbsent(2,"12");
此时 key=2会被替换为12

computeIfAbsent

default V computeIfAbsent(K key,  Function<? super K, ? extends V> mappingFunction) {
    Objects.requireNonNull(mappingFunction);
    V v;
    if ((v = get(key)) == null) {
        V newValue;
        if ((newValue = mappingFunction.apply(key)) != null) {
            put(key, newValue);
            return newValue;
        }
    }

    return v;
}
方法说明:
如果map不存在key或者map的key对应Value为null,如果newValue返回值不为null 将key对应value替换为newValue并返回NewValue结果
否则直接返回空值

示例:

  public static void main(String[] args) {
      HashMap<Integer, String> map = new HashMap();
      map.put(1, "121");
      map.put(2, null);
      String value = map.computeIfAbsent(2, new Function<Integer, String>() {
          @Override
          public String apply(Integer integer) {
              return "2";
          }
      });
      System.out.println(value);
      map.forEach((key, value1) -> System.out.println("key:" + key + "  value:" + value1));
  }
    
输出结果:
2
key:1  value:121
key:2  value:2

computeIfPresent

default V computeIfPresent(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
    Objects.requireNonNull(remappingFunction);
    V oldValue;
    if ((oldValue = get(key)) != null) {
        V newValue = remappingFunction.apply(key, oldValue);
        if (newValue != null) {
            put(key, newValue);
            return newValue;
        } else {
            remove(key);
            return null;
        }
    } else {
        return null;
    }
}
方法说明:
如果map里不存在key 或者map里的key对应的value为null 那么直接返回null
否则 如果mapping返回的newValue不为null,替换key对应的value并返回newValue,如果newValue为null,就会从map里剔除key并返回null

示例:

HashMap<Integer, String> map = new HashMap();
 map.put(1, "121");
 map.put(2, "222");
 map.put(3, null);
 String newValue =map.computeIfPresent(2, new BiFunction<Integer, String, String>() {
     @Override
     public String apply(Integer key, String olderValue) {
         //key=2存在 且value不为null 如果返回newValue是null 会剔除key=2
//                return null;
         return "wwww";
     }
 });
 System.out.println(newValue);

 map.computeIfPresent(3, new BiFunction<Integer, String, String>() {
     @Override
     public String apply(Integer key, String olderValue) {
         //key=3 存在 但是value是null 所以返回null
         return "22";
     }
 });
 map.forEach((key, value1) -> System.out.println("key:" + key + "  value:" + value1));

compute

default V compute(K key, BiFunction<? super K, ? super V, ? extends V> remappingFunction) {
    Objects.requireNonNull(remappingFunction);
    V oldValue = get(key);

    V newValue = remappingFunction.apply(key, oldValue);
    if (newValue == null) {
        // delete mapping
        if (oldValue != null || containsKey(key)) {
            // something to remove
            remove(key);
            return null;
        } else {
            // nothing to do. Leave things as they were.
            return null;
        }
    } else {
        // add or replace old mapping
        put(key, newValue);
        return newValue;
    }
}
方法说明:跟代码一样  首先根据olderValue key建立的Mapping返回的newValue如果为null  ,但是olderValue不为Null, 或者map里存在key,就会从map里剔除key并返回null,如果说map不存在key,直接返回null
如果计算得出的newValue不为null就替换key对应的Value并返回newValue

示例:

public static void main(String[] args) {
      HashMap<Integer, String> map = new HashMap();
      map.put(1, "121");
      map.put(2, "222");
      map.put(3, null);

      String newValue = map.compute(2, new BiFunction<Integer, String, String>() {
          @Override
          public String apply(Integer key, String olderValue) {
              //直接返回null 此时 map存在key=2,且OlderValue不为null 会剔除key=2
              return null;
          }
      });
      System.out.println(newValue);
      newValue = map.compute(1, new BiFunction<Integer, String, String>() {
          @Override
          public String apply(Integer key, String olderValue) {
              //返回值不为null 替换key=1 返回222
              return "222";
          }
      });
      System.out.println(newValue);

      newValue = map.compute(3, new BiFunction<Integer, String, String>() {
          @Override
          public String apply(Integer key, String olderValue) {
              //返回值不为null 替换key=3 返回333
              return "333";
          }
      });
      System.out.println(newValue);
      map.forEach((key, value1) -> System.out.println("key:" + key + "  value:" + value1));
  }
输出结果:
null
222
333
key:1  value:222
key:3  value:333

Map按照Value排序


   public static void main(String[] args) {
       HashMap<String, Integer> map = new HashMap();
       map.put("1", 22);
       map.put("4", 33);
       map.put("3", 44);
       map.put("5", 66);
       map.put("2", 11);

       Set<Map.Entry<String, Integer>> entry = map.entrySet();
       List<Map.Entry> mapList = entry.stream().sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue()))
               .collect(Collectors.toList());

       Map<String, Integer> map1 = entry.stream().sorted((o1, o2) -> o1.getValue().compareTo(o2.getValue())).collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue, (v1, v2) -> v1, LinkedHashMap::new));
       System.out.println(mapList);
       System.out.println(map1);

       ArrayList<Map.Entry<String, Integer>> arrayList = new ArrayList<Map.Entry<String, Integer>>(map.entrySet());
       Comparator comparator = new Comparator<Map.Entry<String, Integer>>() {
           @Override
           public int compare(Map.Entry<String, Integer> arg0,
                              Map.Entry<String, Integer> arg1) {
               return arg0.getValue().compareTo(arg1.getValue());
           }
       };
       Collections.sort(arrayList, comparator);
       System.out.println(arrayList);
   }
   备注:HashMap会自动按照key进行排序,如果需要对Value排序需要将排序好的map转为LinkHashMap来存储或者List

测试输出结果:

[2=11, 1=22, 4=33, 3=44, 5=66]
{2=11, 1=22, 4=33, 3=44, 5=66}
[2=11, 1=22, 4=33, 3=44, 5=66]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

程序员路同学

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

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

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

打赏作者

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

抵扣说明:

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

余额充值