集合

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. spring boot MongoDB的集成和使用

    前言 上一章节,简单讲解了如何集成Spring-data-jpa.本章节,我们来看看如何集成NoSQL的Mongodb.mongodb是最早热门非关系数据库的之一,使用也比较普遍.最适合来存储一些非结 ...

  2. python tesseract-ocr 基础验证码识别功能(Windows)

    一.环境 windows 7 x64 Python 3 + 二.安装 1.tesseract-ocr安装 http://digi.bib.uni-mannheim.de/tesseract/ 2.py ...

  3. python迭代器与生成器(二)

      一.什么是迭代? 迭代通俗的讲就是一个遍历重复的过程. 维基百科中 迭代(Iteration) 的一个通用概念是:重复某个过程的行为,这个过程中的每次重复称为一次迭代.具体对应到Python编程中 ...

  4. angular js jquery中post请求的一点小区别

    这也是最近遇到的坑,还是之前那个项目,现在要实现登录功能. 背景:注册功能之前已经跑通了.前端用的是jquery后台是springMVC.鉴于注册和登录有些接口功能是类似的(比如注册确保邮箱是没有注册 ...

  5. 剑指offer--23.合并两个排序的链表

    时间限制:1秒 空间限制:32768K 热度指数:421239 本题知识点: 链表 题目描述 输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则. class ...

  6. PostgreSQL copy 时提示:ERROR: invalid byte sequence for encoding "UTF8": 0xb3

    测试时使用三种文件格式: ISO-8859 Netpbm PBM image ASCII if [ $(file $filename|grep -c "ISO-8859") -gt ...

  7. SpringMVC札集(01)——SpringMVC入门完整详细示例(上)

    自定义View系列教程00–推翻自己和过往,重学自定义View 自定义View系列教程01–常用工具介绍 自定义View系列教程02–onMeasure源码详尽分析 自定义View系列教程03–onL ...

  8. java网络编程客户端与服务端原理以及用URL解析HTTP协议

    常见客户端与服务端 客户端: 浏览器:IE 服务端: 服务器:web服务器(Tomcat),存储服务器,数据库服务器. (注:会用到Tomact服务器,在webapps下有一个自己创建的目录myweb ...

  9. 用ofstream/ifstream 读写Unicod的TXT

    使用的平台:vs2013 控制台 from: http://bbs.csdn.net/topics/360229403 xiayuanzhong: ofstream ofs( "test.t ...

  10. IntelliJ IDEA中使用Git

    IntelliJ IDEA下使用Git IntelliJ IDEA下配置Git:git clone.git checkout.git diff.git log.git commit.git push. ...