java成神之——集合框架之Maps,Hashtable
集合
Maps
HashMap
Map<KeyType, ValueType> myMap = new HashMap<KeyType, ValueType>();
myMap.put("key1", 1);
myMap.get("key1");
map.replace("key1",2);
map.remove("key1",2);
myMap.containsKey(varKey);
myMap.containsValue(varValue);
map.replaceAll((key,value)->value+1); // 遍历
map.putIfAbsent("kelly", 50); // 不重复才添加
map.computeIfAbsent("d", k -> map.get("a")); // 键没重复,添加
map.computeIfPresent("d", k -> map.get("a")); // 键出现,修改键值
map.compute("peter", (k,v)->v+50);
map.containsKey("one");
map.clear();
// 如果"kelly"不存在则,直接添加键值对 kelly:50
// 如果"kelly"存在,并且action计算的值不为null,则使用50替换原来kelly的值
// 如果"kelly"存在,并且action计算的值为null,则直接删除"kelly"
map.merge("kelly", 50 , (k,v)->map.get("john")+10);
创建和初始化map
第一种
Map map = new HashMap();
第二种
Map<String, Object> map = new HashMap<>();
第三种
Map<String, Object> map = new HashMap<String, Object>(){{
put("name", "A");
put("address", "Malviya-Nagar");
put("city", "Jaipur");
}};
第四种
Map<String, Object> map = new TreeMap<String, Object>();
第五种
Map<String, String> map = Arrays.stream(new String[][] {
{ "name", "A" },
{ "address", "Malviya-Nagar" },
{ "city", "jaipur" },
}).collect(Collectors.toMap(m -> m[0], m -> m[1]));
第六种
Map<String, String> singletonMap = Collections.singletonMap("key", "value");
遍历方式
Maps 存放键值对,不能包含重复的键
Map<String, Integer> map = new HashMap<>();
map.put("a", 1);
map.put("b", 2);
map.put("c", 3);
第一种
Iterator<Map.Entry<String, Integer>> it = map.entrySet().iterator();
StringJoiner sj = new StringJoiner(", ", "[", "]");
while (it.hasNext()) {
Map.Entry<String, Integer> pair = it.next();
sj.add("{" + pair.getKey() + ": "+ pair.getValue() + "}");
} // [{a: 1}, {b: 2}, {c: 3}]
第二种
StringJoiner sj = new StringJoiner(", ", "[", "]");
for (Map.Entry<String, Integer> pair : map.entrySet()) {
sj.add("{" + pair.getKey() + ": "+ pair.getValue() + "}");
}
第三种
StringJoiner sj = new StringJoiner(", ", "[", "]");
map.forEach((k, v) -> sj.add("{" + k + ": "+ v + "}"));
第四种
StringJoiner sj = new StringJoiner(", ", "[", "]");
for (String key : map.keySet()) {
sj.add("{" + key + ": "+ map.get(key) + "}");
}
第五种
Iterator<String> it = map.keySet().iterator();
StringJoiner sj = new StringJoiner(", ", "[", "]");
while (it.hasNext()) {
String key = it.next();
sj.add("{" + key + ": "+ map.get(key) + "}");
}
第六种
StringJoiner sj = new StringJoiner(", ", "[", "]");
for (Iterator<Map.Entry<String, Integer>> entries = map.entrySet().iterator(); entries.hasNext(); ) {
Map.Entry<String, Integer> entry = entries.next();
sj.add("{" + entry.getKey() + ": "+ entry.getValue() + "}");
}
第七种
StringJoiner sj = new StringJoiner(", ", "[", "]");
map.entrySet().stream().forEach(e -> sj.add("{" + e.getKey() + ": "+ e.getValue() + "}"));
第八种
StringJoiner sj = new StringJoiner(", ", "[", "]");
map.entrySet().stream().parallel().forEach(e -> sj.add("{" + e.getKey() + ": "+ e.getValue() + "}"));
性能排序 3 > 6 > 1 > 2 > 7 > 4 > 5 > 8
LinkedHashMap
保留插入顺序,不允许重复键
LinkedHashMap<String, String> lhm = new LinkedHashMap<String, String>();
WeakHashMap
Map weakHashMap = new WeakHashMap(); // gc会自动删除弱引用键值对
TreeMap
TreeMap tm = new TreeMap(); // 自动根据键升序排序
线程锁
TreeMap和TreeSet都是线程不安全的,所以开发多线程程序需要上锁
方式一
SortedSet<Integer> set = Collections.synchronizedSortedSet(new TreeSet<Integer>());
SortedMap<Integer,String> map = Collections.synchronizedSortedMap(new TreeMap<Integer,String>());
方式二
synchronized (set) {
set.add(4);
}
方式三
TreeSet<Integer> set = new TreeSet<>();
ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
lock.writeLock().lock();
set.add(4);
lock.writeLock().unlock();
Hashtable
存储唯一值,并且线程安全
Hashtable<Integer, String> map = new Hashtable<Integer, String>();
map.put(1,"ONE");
结语
本文章是java成神的系列文章之一
如果你想知道,但是本文没有的,请下方留言
我会第一时间总结出来并发布填充到本文
java成神之——集合框架之Maps,Hashtable的更多相关文章
- java成神之——集合框架之队列,栈,集合并发
集合 队列和双端队列 PriorityQueue Deque BlockingQueue Queue 栈 集合并发 线程锁 线程安全集合 结语 集合 队列和双端队列 PriorityQueue 此队列 ...
- java成神之——集合框架之ArrayList,Lists,Sets
集合 集合种类 ArrayList 声明 增删改查元素 遍历几种方式 空集合 子集合 不可变集合 LinkedList Lists 排序 类型转换 取交集 移动元素 删除交集元素 Sets 集合特点 ...
- java成神之——集合框架之Array
Array 初始化 填充元素的几种方式 数组转流 遍历 数组转成字符串 排序 查找 数组扩大 原始类型数组和包装类型数组转换 移除元素 比较数组是否相等 克隆 类型转换 过滤元素 结语 Array 初 ...
- Java成神路上之设计模式系列教程之一
Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在 ...
- java成神之——文件IO
文件I/O Path Files File类 File和Path的区别和联系 FileFilter FileOutputStream FileInputStream 利用FileOutputStrea ...
- java成神之——Stream和Optional
Stream流 基本使用 流关闭 平行流 流重用 iterator转换成流 分组计数 无限流 流转集合 压缩流 统计数值流 集合转换流遍历 流拼接 reduce 使用流生成随机字符串 流的包装流 几种 ...
- java成神之——ImmutableClass,null检查,字符编码,defaultLogger,可变参数,JavaScriptEngine,2D图,类单例,克隆,修饰符基本操作
ImmutableClass null检查 字符编码 default logger 函数可变参数 Nashorn JavaScript engine 执行脚本文件 改变js文件输出流 全局变量 2D图 ...
- 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\
1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...
- 一份完整的 Java 成神路线图,值得收藏!
Java,是现阶段中国互联网公司中,覆盖度最广的研发语言. 有不少朋友问,如何深入学习Java后端技术栈,今天分享一个,互联网牛人整理出来的完整的Java成神路线图. 一:常见模式与工具 学习Java ...
随机推荐
- python中的set类型
一. 定义 set是一个无序且不重复的元素集合 set和dict类似,是一组key的集合,但不存储value set有以下特性: 1. 由于key不能重复,所有set中没有重复的key 2. 元素为不 ...
- Chrome浏览器导入数字证书
1.打开 chrome ,点击 右上角的选项图标,在下拉列表中找到 设置 . 2.在设置页面中,滚动到页面的最底部,找到,并点击显示高级设置,找到 HTTPS/SSL 这一项,点击 管理证书 按键.
- saltstack笔记
Saltstack类似于puppet salt的核心功能使用命令 发送到远程系统是并行的而不是串行的使用安全加密的协议使用最小最快的网络载荷提供简单的编程接口 Python编写,相当轻量级通讯层采用z ...
- iptables(四)iptables匹配条件总结之一
经过前文的总结,我们已经能够熟练的管理规则了,但是我们使用过的"匹配条件"少得可怜,之前的示例中,我们只使用过一种匹配条件,就是将"源地址"作为匹配条件. 那么 ...
- 013——VUE中多种方式使用VUE控制style样式属性
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- MVC 框架中的缓存
在程序中加入缓存的目的很多是为了提高程序的性能,提高数据的查找效率,在MVC框架中也引入了非常多的缓存,比如Controller的匹配查找,Controller,ControllerDescripto ...
- 条款16:成对使用new以及delete的时候应该采取相同的形式
首先思考下面的代码: ]; ... delete stringArray; 这是最常见的错误之一了,new与delete不配对,但是仔细想想new与delete为什么一定要配对呢? 可以想到一种可能就 ...
- Python label for _ 用法
Python label for _ 用法 Python label for _ 用法 >>> label_data = [iter([3,4]),iter([4,9]), iter ...
- C++纯虚函数实现
纯虚函数就是一个在基类中的虚函数,差别只是在一般的虚函数声明的后面加了"=0",虚函数允许函数通过与函数体之间的联系在运行时才建立,也就是在运行时才决定如何动作,称为运行时的多态性 ...
- js 函数里的 this
1,当作为纯粹的函数调用时, this指向调用出的环境的上下文,看下面的例子 var x = 1; function test(){ var x = 0; alert( alert(x); } tes ...