集合

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的更多相关文章

  1. java成神之——集合框架之队列,栈,集合并发

    集合 队列和双端队列 PriorityQueue Deque BlockingQueue Queue 栈 集合并发 线程锁 线程安全集合 结语 集合 队列和双端队列 PriorityQueue 此队列 ...

  2. java成神之——集合框架之ArrayList,Lists,Sets

    集合 集合种类 ArrayList 声明 增删改查元素 遍历几种方式 空集合 子集合 不可变集合 LinkedList Lists 排序 类型转换 取交集 移动元素 删除交集元素 Sets 集合特点 ...

  3. java成神之——集合框架之Array

    Array 初始化 填充元素的几种方式 数组转流 遍历 数组转成字符串 排序 查找 数组扩大 原始类型数组和包装类型数组转换 移除元素 比较数组是否相等 克隆 类型转换 过滤元素 结语 Array 初 ...

  4. Java成神路上之设计模式系列教程之一

    Java成神路上之设计模式系列教程之一 千锋-Feri 在Java工程师的日常中,是否遇到过如下问题: Java 中什么叫单例设计模式?请用Java 写出线程安全的单例模式? 什么是设计模式?你是否在 ...

  5. java成神之——文件IO

    文件I/O Path Files File类 File和Path的区别和联系 FileFilter FileOutputStream FileInputStream 利用FileOutputStrea ...

  6. java成神之——Stream和Optional

    Stream流 基本使用 流关闭 平行流 流重用 iterator转换成流 分组计数 无限流 流转集合 压缩流 统计数值流 集合转换流遍历 流拼接 reduce 使用流生成随机字符串 流的包装流 几种 ...

  7. java成神之——ImmutableClass,null检查,字符编码,defaultLogger,可变参数,JavaScriptEngine,2D图,类单例,克隆,修饰符基本操作

    ImmutableClass null检查 字符编码 default logger 函数可变参数 Nashorn JavaScript engine 执行脚本文件 改变js文件输出流 全局变量 2D图 ...

  8. 已看1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架、多线程(并发编程)、I/O(NIO)、Socket、JDBC、XML、反射等。[泛型]\

    1.熟练的使用Java语言进行面向对象程序设计,有良好的编程习惯,熟悉常用的Java API,包括集合框架.多线程(并发编程).I/O(NIO).Socket.JDBC.XML.反射等.[泛型]\1* ...

  9. 一份完整的 Java 成神路线图,值得收藏!

    Java,是现阶段中国互联网公司中,覆盖度最广的研发语言. 有不少朋友问,如何深入学习Java后端技术栈,今天分享一个,互联网牛人整理出来的完整的Java成神路线图. 一:常见模式与工具 学习Java ...

随机推荐

  1. 【Java】访问权限

    一.访问权限修饰词 关键字 名称 本类 同一包中的类 子类 其他包中的类 public  接口访问权限 √ √ √ √ protected 继承访问权限 √ √ √ x 默认 包访问权限  √ √ x ...

  2. 【辅助工具】Python实现微信跳一跳

    最近迷上了微信跳一跳小游戏,正好也看到知乎上有大神分享了技术贴,我也参考了好多资料,原理就是通过abd命令截取图片,python计算两个点距离,然后转化按压时间,让电脑来完成游戏.我花了很长时间才把程 ...

  3. react: redux-devTools

    import {composeWithDeTools} from 'redux-devtools-extension'; const bindMiddleware = middleware => ...

  4. canvas 创建渐变图形

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  5. AlexNet神经网络结构

    Alexnet是2014年Imagenet竞赛的冠军模型,准确率达到了57.1%, top-5识别率达到80.2%. AlexNet包含5个卷积层和3个全连接层,模型示意图: 精简版结构: conv1 ...

  6. 怎么把openrety 里边的 table 优雅的打印出来

    1.安装 loarocks 库以后 2.安装 Penlight 插件 3.如下图所示 4.利用dump 函数优雅的打印 table

  7. linux 下看所有用户 及所有组

    俺的centos vps上面不知道添加了多少个账户,今天想清理一下,但是以前还未查看过linux用户列表,google了一下,找到方便的放:一般情况下是 cat /etc/passwd 可以查看所有用 ...

  8. linux基础【文件夹含义】

    linux文件目录是一个树状的目录 bin -->可执行文件 boot-->操作系统引导文件,系统内核,启动信息 dev -->device,设备信息,计算机硬件设备信息 etc - ...

  9. rebar安装及创建项目

    rebar作为erlang开发中编译,构建,发布,打包,动态升级的常用工具,下面我记录下rebar工具的安装及使用 从源码安装rebar 1. 建立文件 install_rebar.sh 2. 拷贝如 ...

  10. SQLServer清空数据库中所有表的数据

    今早同事跟进客户反馈的问题时,提了个要求,要求清空数据库中所有表的数据. 记得之前用游标遍历所有的表名 + exec 动态语句 truncate table 表名 实现过这个功能. 网上搜了下,有更简 ...