Java ConcurrentHashMap的使用示例
作者:精灵王 发布时间:2023-02-04 09:04:29
标签:Java,ConcurrentHashMap
目录
构造方法
方法介绍
reduce归约
构造方法
// 1.无参数构造方法
new ConcurrentHashMap();
// 2.指定初始容量
new ConcurrentHashMap(initialCapacity)
// 3.指定初始容量和加载因子
new ConcurrentHashMap(initialCapacity,loadFactor)
// 4.指定初始容量和加载因子与并发级别(并发更新线程数)
new ConcurrentHashMap(initialCapacity, loadFactor, concurrencyLevel)
// 5.创建与给定映射具有相同映射的新映射
new ConcurrentHashMap(Map<? extends K, ? extends V> m)
方法介绍
新增元素
// 1.添加元素,不允许null
map.put(1,1);
// 2.添加一个map
map.putAll(map);
// 3.添加元素, 键不存在映射关系才添加成功
map.putIfAbsent(2,1);
删除元素
// 1.移除指定的key
map.remove(1);
// 2.移除指定的key,value
map.remove(2,2);
替换元素
// 1.替换指定key
map.replace(1,3);
// 2.替换指定key,value
map.replace(1,2,4);
// 3.替换所有,这里是把value都乘以2
map.replaceAll((key,value)->value << 1);
查找元素
// 1.返回到指定键所映射的值
map.get("精灵王");
// 2. 返回指定键映射到的值,如果此映射不包含该键的映射,则返回给定的默认值。
map.getOrDefault("精灵王","jinglingwang.cn");
// 指定搜素函数
// 1.通过在每个(键,值)上应用给定的搜索函数返回非空结果,如果没有则返回null。
// 成功后,进一步的元素处理被抑制,并且搜索功能的任何其他并行调用的结果被忽略。
Object a = map.search(5,(key,value)->{
return (value & 1) == 0 ? value : null; // 查找第一个偶数,如果是奇数返回null
});
// 2. 每个键上应用给定搜索函数的非null结果,如果没有则返回null。
String k = map.searchKeys(5,(key)->{
return "jinglingwang".equals(key) ? key : null;
});
System.out.println(k);
// 3. 对每个值应用给定的搜索函数,如果没有,返回null。
Integer v2 = map.searchValues(5,(value)->{
return value == 2 ? 520 : null;
});
System.out.println(v2);
// 4.从每个entry应用给定的搜索函数,如果没有,则返回null。
Integer a = map.searchEntries(5,(entry)->{
System.out.println("entry:"+entry.getKey() + " " + entry.getValue());
return "jinglingwang.cn".equals(entry.getKey()) ? 1 : null;
});
System.out.println(a);
包含
// 1. 验证值是否存在, 等同于map.containsValue()方法
map.contains(4)
// 2. 验证key是否存在
map.containsKey("精灵王")
// 3. 验证值是否存在,等同于map.contains()方法
map.containsValue(4)
遍历
// 1.返回此表中键的枚举
map.keys();
// 2.返回此地图中包含的键的Set视图
map.keySet();
// 3.返回此地图中键的Set视图,使用给定的映射值
map.keySet(100)
// 4. 返回此表中值的枚举。
map.elements();
// 5.返回此地图中包含的映射的Set视图。
map.entrySet().forEach((entry)->{
System.out.println(entry.getKey() + " " + entry.getValue());
});
// 6.1 同时遍历key,value
map.forEach((key,value)->{
System.out.println(key+ " " + value);
});
// 6.2 同时遍历key,value,找到满足条件的执行响应函数
map.forEach(5,(key,value)->{
System.out.println(key+ " " + value);
return (value & 1) == 0 ? "jinglingwang.cn" : null;
},aa->{
System.out.println(aa); // 条件中有偶数,每次就输出jinglingwang.cn
});
// 7.1遍历
map.forEachEntry(5,(entry)->{
System.out.println(entry.getKey() + " " + entry.getValue());
});
// 7.2遍历查找,满足条件执行响应的函数
map.forEachEntry(5,(entry)->{
System.out.println(entry.getKey() + " " + entry.getValue());
return (value & 1) == 0 ? "jinglingwang.cn" : null;
},aa->{
System.out.println(aa); // 条件中有偶数,每次就输出jinglingwang.cn
});
// 8.1遍历key
map.forEachKey(5,key->{
System.out.println("key: " + key);
});
// 8.2遍历key,满足条件的key执行响应的函数
map.forEachKey(5,key->{
System.out.println("key: " + key);
return !key.equals("jinglingwang") ? "jinglingwang.cn" : null;
},kk ->{
System.out.println(kk);
});
// 9.1 遍历value
map.forEachValue(5,value->{
System.out.println("value: " + value);
});
// 9.2 遍历value,满足条件的value执行响应的函数
map.forEachValue(5,value->{
System.out.println("value: " + value);
return (value & 1) == 0 ? "jinglingwang.cn" : null;
},vv ->{
System.out.println(vv);
});
reduce归约
reduce()
//新增元素
map.put("1",0);
map.put("2",4);
map.put("3",6);
map.put("4",8);
// 1. 返回使用给定的reducer组合值来累积所有(键,值)对的给定转换的结果,如果没有,则返回null
String res = map.reduce(5,(key,value)->{
System.out.println("transformer key:"+key+" value:"+value);
return value+"";
},(key,value)->{
System.out.println("reducer key:"+key+" value:"+value);
return key+value+"";
});
System.out.println("res:"+res);
以上示例输出如下:
transformer key:1 value:0
transformer key:2 value:4
reducer key:0 value:4
transformer key:3 value:6
reducer key:04 value:6
transformer key:4 value:8
reducer key:046 value:8
res:0468
第一个transformer函数遍历整个map,然后将返回值传递到reduce函数进行计算,之后reduce函数的返回值再次参与到下一次的reduce函数的计算中。
reduceToDouble()
double reduceToDouble = map.reduceToDouble(5,(key,value)->{
System.out.println("transformer key:"+key);
return value;
},100,(key,value)->{
System.out.println("reducer key:"+key+" value:"+value);
return key+value;
});
System.out.println("reduceToDouble:"+reduceToDouble);
// 输出结果
transformer key:1 value:0
reducer key:100.0 value:0.0
transformer key:2 value:4
reducer key:100.0 value:4.0
transformer key:3 value:6
reducer key:104.0 value:6.0
transformer key:4 value:8
reducer key:110.0 value:8.0
reduceToDouble:118.0
遍历归约所有的键值对,并把结果转换成double类型。
类似的方法还有reduceToInt()和reduceToLong()。
reduceEntries()
// 第一种,返回值为entry
Map.Entry reduceEntries = map.reduceEntries(5,entry->{
System.out.println("transformer key:"+entry.getKey()+" value:"+entry.getValue());
return entry;
},(key,value)->{
System.out.println("reducer key:"+key+" value:"+value);
return value;
});
System.out.println("reduceEntries:"+reduceEntries);
// 输出如下
transformer key:1 value:0
transformer key:2 value:4
reducer key:1=0 value:2=4
transformer key:3 value:6
reducer key:2=4 value:3=6
transformer key:4 value:8
reducer key:3=6 value:4=8
reduceEntries:4=8
// 第二种
String reduceEntries2 = map.reduceEntries(5,(entry)->{
System.out.println("transformer key:"+entry.getKey()+" value:"+entry.getValue());
return entry.getValue()+"";
},(key,value)->{
System.out.println("reducer key:"+key+" value:"+value);
return key+value+"";
});
System.out.println("reduceEntries2:"+reduceEntries2);
transformer key:1 value:0
transformer key:2 value:4
reducer key:0 value:4
transformer key:3 value:6
reducer key:04 value:6
transformer key:4 value:8
reducer key:046 value:8
reduceEntries2:0468
transformer 函数每次返回的是一个entry,然后会传入到reduce函数中,reduce的return值会继续传递到下一次的reduce计算。
reduceEntriesToDouble()
// 返回使用给定的reducer累加给定变换的结果,以组合值,给定基础作为一个标识值
Double reduceEntriesToDouble = map.reduceEntriesToDouble(5,entry->{
System.out.println("transformer key:"+entry.getKey()+" value:"+entry.getValue());
return Double.valueOf(entry.getValue());
},100,(l,r)->{
System.out.println("reducer key:"+l+" value:"+r);
return l+r;
});
System.out.println("reduceEntriesToDouble:"+reduceEntriesToDouble);
// 输出结果
transformer key:1 value:0
reducer key:100.0 value:0.0
transformer key:2 value:4
reducer key:100.0 value:4.0
transformer key:3 value:6
reducer key:104.0 value:6.0
transformer key:4 value:8
reducer key:110.0 value:8.0
reduceEntriesToDouble:118.0
其中transformer函数是以entry的形式来进行遍历的,第三个参数是一个归约的标识(初始默认值),功能和reduceEntriesToInt()和reduceEntriesToLong()两个方法非常相似。
reduceKeys()
// 1.第一种,只有reduce函数,遍历所有的键值对,reduce函数的返回值会作为下一次的key,如果没有则返回null。
String newKey = map.reduceKeys(5,(key,value)->{
System.out.println("reducer key:"+key+" value:"+value);
return key+value;
**}**);
System.out.println("newKey:"+newKey);
// 输出结果
reducer key:1 value:2
reducer key:12 value:3
reducer key:123 value:4
newKey:1234
// 2.第二种,有transformer和reducer
String newValue = map.reduceKeys(5,(key)->{
System.out.println("transformer key:"+key);
return key;
},(key,value)->{
System.out.println("reducer key:"+key+" value:"+value);
return key+value;
});
System.out.println("newValue:"+newValue);
// 输出结果
transformer key:1
transformer key:2
reducer key:1 value:2
transformer key:3
reducer key:12 value:3
transformer key:4
reducer key:123 value:4
newValue:1234
reduceKeysToDouble()
double reduceKeysToDouble = map.reduceKeysToDouble(5,(key)->{
System.out.println("transformer key:"+key);
return Double.parseDouble(key);
},100,(key,value)->{
System.out.println("reducer key:"+key+" value:"+value);
return key+value;
});
System.out.println("reduceKeysToDouble:"+reduceKeysToDouble);
遍历归约所有的key,并把结果转换成double类型。
类似的方法还有reduceKeysToInt()和reduceKeysToLong()。
reduceValues()
// 第一种:仅reducer函数
double reduceValues = map.reduceValues(5,(key,value)->{
System.out.println("reducer key:"+key+" value:"+value);
return key+value;
});
System.out.println("reduceValues:"+reduceValues);
//输出结果
reducer key:0 value:4
reducer key:4 value:6
reducer key:10 value:8
reduceValues:18.0
// 第二种,含有transformer
double reduceValues2 = map.reduceValues(5,(value)->{
System.out.println("transformer value:"+value);
return Double.valueOf(value);
},(key,value)->{
System.out.println("reducer key:"+key+" value:"+value);
return key+value;
});
System.out.println("reduceValues2:"+reduceValues2);
// 输出结果
transformer value:0
transformer value:4
reducer key:0.0 value:4.0
transformer value:6
reducer key:4.0 value:6.0
transformer value:8
reducer key:10.0 value:8.0
reduceValues2:18.0
reduceValuesToDouble()
double reduceValuesToDouble = map.reduceValuesToDouble(5,(value)->{
System.out.println("transformer value:"+value);
return Double.valueOf(value);
},100,(l,r)->{
System.out.println("reducer key:"+l+" value:"+r);
return l+r;
});
System.out.println("reduceValuesToDouble:"+reduceValuesToDouble);
// 输出结果
transformer value:0
reducer key:100.0 value:0.0
transformer value:4
reducer key:100.0 value:4.0
transformer value:6
reducer key:104.0 value:6.0
transformer value:8
reducer key:110.0 value:8.0
reduceValuesToDouble:118.0
遍历归约所有的value,并把结果转换成double类型。
类似的方法还有reduceValuesToInt()和reduceValuesToLong()。
来源:https://jinglingwang.cn/archives/cumap-example


猜你喜欢
- Metro UI For JavaFX!这是一个Windows设计风格的UI库,使用非常简单,只要一行代码就可以实现整体UI风格的替换!ne
- 一:父级pom.xml文件 resources目录下新建指定文件夹,存放Spring配置文件<profiles> &
- 在Java编程中,代码块就是指用“{}”括起来的代码。下面看一下这四种代码块。1、普通代码块就是指类中方法的方法体。public void
- 前言更新都写完了,但是要更新文件要怎么操作呢?连接服务器然后上传上去,修改下xml的版本号当然也是可以的,但是还是没有写个程序使用起来方便,
- C# 中有三种定时器,System.Windows.Forms 中的定时器和 System.Timers.Timer 的工作方式是完全一样的
- 使用注解开发在Spring4之后,要使用注解开发,必须要保证aop的包导入了使用注解需要导入context的约束,增加注解的支持<?x
- TCP/IP通信协议是一种可靠的网络协议,它在通信的两端各建立一个Socket,从而在通信的两端之间形成网络虚拟链路。一旦建立了虚拟的网络链
- 前言当初年少懵懂,那年夏天填志愿选专业,父母听其他长辈说选择计算机专业好。从那以后,我的身上就有了计院深深的烙印。从寝室到机房,从机房到图书
- 一. 前言最近我发现了一个事情,那就是在面试笔试中,好多公司都喜欢在String字符串上出问题,涉及到方方面面的知识,包括其中的一些常用方法
- 之前的一篇文章中的代码中有一个using的用法,刚开始查看了一些资料说是强制关闭对象的一个命令。今天又查了一些资料,才明白,原来using指
- 上篇文章给大家介绍了浅析C# 中的类型系统(值类型和引用类型),接下来通过本文给大家介绍下c# 泛型类型,说下C#中的泛型,熟练地使用泛型能
- 1. 准备工作首先我们创建一个 Spring Boot 工程,引入 Web 和 Redis 依赖,同时考虑到接口限流一般是通过注解来标记,而
- Java中的字符串常量池Java中字符串对象创建有两种形式,一种为字面量形式,如String str = "droid"
- 本文实例讲述了C#获取指定PDF文件页数的方法。分享给大家供大家参考。具体如下:using System;using System.IO;u
- 主要完成任务:1.read read 并行化2.read write 不允许3.write write 不允许public class Re
- 栈和队列:都是线性表,都是基于List基础上的实现线性表:数组,链表,字符串,栈,队列元素按照一条“直线&rdq
- 1、LongAdder由来LongAdder类是JDK1.8新增的一个原子性操作类。AtomicLong通过CAS算法提供了非阻塞的原子性操
- 在网站开发中经常遇到级联数据的展示,比如选择城市的时候弹出的省市县选择界面。很多前端制作人员习惯于从JSON中而不是从数据库中获
- 本文研究的主要是ConcurrentMap.putIfAbsent(key,value)用法的相关内容,具体如下。业务上经常会遇到有这种场景
- Java枚举类使用Lombok枚举类是一个特殊的常量类,由于其特殊的设计,具有简洁性、安全性以及便捷性,在开发中被普遍使用。本文简单介绍一下