廖雪峰Java5集合-3Map-1使用Map
廖雪峰的视频不全,以下是疯狂Java关于Map的讲解
1.Map定义
Map是一种键值映射表,可以通过key快速查找value,同python的dict。key不允许重复,value可以重复。
Map 集合里保存这两组值,一组值保存Map里的key,一组保存Map里的value,key和value都可以是任何引用类型的数据。

Map确实包含了一个keySet()方法,用于返回key组成的set集合。value类似于一个List,可以重复,通过key来查找。
常用方法:
- Object put(Object key, Object value):添加一个key-value对,如果当前Map中已有一个与该key相等的key-value对,则新的key-value对会覆盖原来的key-value对。
- void clear():删除该Map对象中的所有key-value对。
Map map = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", "0573");
map.put("宁波", "0574");
System.out.println(map);
map.clear();
System.out.println(map);

* boolean containsKey(Object key):查询Map中是否包含指定的key,如果包含返回true。
* boolean containsValue(Object value):查询Map是否包含一个或多个value,如果包含则返回true。
```#java
Map map = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", "0573");
map.put("宁波", "0574");
System.out.println("map.containsKey(\"宁波\"):"+map.containsKey("宁波"));
System.out.println("map.containsKey(\"厦门\"):"+map.containsKey("厦门"));
System.out.println("map.containsValue(\"0574\"):"+map.containsValue("0574"));
System.out.println("map.containsValue(\"0000\"):"+map.containsValue("0000"));
```

* Object get(Object key):返回指定key所对应的value;如果Map中不包含这个key,返回null。
* boolean isEmpty():查询该Map是否为空(即不包含任何key-value对),如果为空则返回true。
* void putAll(Map m):将指定Map中的key-value对复制到本Map中。
* int size():返回该Map里的key-value对的个数。
```#java
Map map = new HashMap();
Map map2 = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", "0573");
map.put("宁波", "0574");
System.out.println(map.get("宁波"));
System.out.println(map.get("厦门"));
System.out.println(map.isEmpty());
System.out.println(map2.isEmpty());
map2.putAll(map);
System.out.println(map2.toString()+"\t"+map2.size());
```

* Object remove(Object key):从Map中删除指定的key-value对,返回被删除key所关联的value,如果key不存在,返回null。
* boolean remove(Object key, Object value):Java8新增,删除指定key、value所对应的key-value对。如果从该Map中删除该key-value对,返回true;否则,返回false。
```#java
Map map = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", "0573");
map.put("宁波", "0574");
System.out.println(map.remove("宁波"));
System.out.println(map.remove("厦门"));
System.out.println(map.remove("湖州","0572"));
System.out.println(map.remove("嘉兴","1234"));
```

* Set keySet():返回该Map中所有key组成的集合。
* Collection values():返回该Map里所有value组成的Collection。
* Set entrySet():返回Map中包含的key-value对所组成的Set集合,每个集合元素都是Map.Entry对象(Entry是Map的内部类)。
```#java
Map map = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", "0573");
map.put("宁波", "0574");
/**
* 遍历Map:
* * 用for-each循环:
* * 循环key:keySet()
* * 循环key和value: entrySet()
*/
for(Object k:map.keySet()){
System.out.print(k+"=");
System.out.print(map.get(k)+"\t");
}
System.out.println();
System.out.println("value列表:"+map.values());
for(Object m:map.entrySet()){
System.out.print(m+"\t");
}
```

Map中包含一个内部类Entry,该类封装了一个key-value对。Entry包含如下三个方法:
* Object getKey():返回该Entry里包含的key值。
* Object getValue():返回该Entry里包含的value值。
* Object setValue(V value):设置该Entry里包含的value值,并返回新设置的value值。
```#java
Map map = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", "0573");
map.put("宁波", "0574");
Iterator> it = map.entrySet().iterator();
while (it.hasNext()){
Map.Entry entry = it.next();
if (entry.getKey().equals("宁波")){
entry.setValue("010");
}
System.out.println("key="+entry.getKey()+"\t value="+entry.getValue());
}
```

## 2.Java8为Map新增的方法
Java8除了为Map增加了remove(Object key,Object value)默认方法,还增加了如下方法:
### 2.1.Object compute(Object key, BiFunction remappingFunction)
该方法使用remappingFunction根据原key-value对计算一个新value。
* 新value不为null:如果存在key,就用新value覆盖覆盖原value;如果key不存在,就添加一个新的键值对。
* 新value为null,原value不为null:原键值对存在,就删除原键值对;
* 原value,新value同时为null,原键值对存在,就删除该键值对。
```#java
Map map = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", null);
map.put("宁波", "0574");
//key-宁波存在,覆盖
map.compute("宁波",(key,value) -> value+"hello world");
//key-广州不存在,添加
map.compute("广州",(key,value) -> "yangcheng");
System.out.println(map);
//删除key宁波
map.compute("宁波",(key,value) -> null);
System.out.println(map);
//删除key嘉兴
map.compute("嘉兴",(key,value)-> null);
System.out.println(map);
//key厦门不存在,不做操作
map.compute("厦门",(key,value) -> null);
System.out.println(map);
```
### 2.2.Object computeIfAbsent(Object key,Function mappingFunction)
* 如果key在map中不存在,就用mappingFunction根据key计算一个新的结果作为value,并添加该键值对。
* key在Map中存在,对应的value为null,则使用mappingFunction根据key计算一个新的结果作为value覆盖原有value。
* key在Map中存在,对应的value不为null,什么也不做。
```#hava
Map map = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", null);
map.put("宁波", "0574");
System.out.println(map);
//不存下key厦门,就添加该键值对
map.computeIfAbsent("厦门",(key)->((String)key).length());
System.out.println(map);
//存在key杭州,且value不为null,不做任何操作
map.computeIfAbsent("杭州",(key)->null);
System.out.println(map);
//存在key嘉兴,且value为null
map.computeIfAbsent("嘉兴",(key)->((String)key).length());
System.out.println(map);
```

### 2.3.Object computeIfPresent(Object key, BiFunction remappingFunction)
* 如果传给该方法的key对应的value不为null,就用remappingFunction根据(key,value)计算一个新的结果:
* 如果计算结果不为null,就覆盖原有的value
* 如果计算结果为null,就删除该键值对
* 如果key在map中不存在或key对应的value为null,会报java.lang.NullPointerException
```#java
Map map = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", null);
map.put("宁波", "0574");
System.out.println(map);
//删除原键值对
map.computeIfPresent("杭州",(key,value)->null);
System.out.println("删除杭州:"+map);
//覆盖原value
map.computeIfPresent("宁波",(key,value)->(String)key+(String)value).toString();
System.out.println("覆盖宁波:"+map);
//key对应的value为null
try {
map.computeIfPresent("厦门", (key, value) -> (String) key + (String) value).toString();
}catch (java.lang.NullPointerException e){
System.out.println("不存在厦门:"+map);
}
//key不存在
try {
map.computeIfPresent("嘉兴", (key, value) -> (String) key + (String) value).toString();
}catch (java.lang.NullPointerException e){
System.out.println("不存在嘉兴:"+map);
}
```

### 2.4void forEach(BiConsumer action)
该方法是Java8为Map新增的一个遍历key-value对的方法
```#java
Map map = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", null);
map.put("宁波", "0574");
map.forEach((key,value)-> System.out.println((String)key+(String)value));
```

### 2.5Object getOrDefault(Object key, V defaultValue)
获取指定key对应的value,如果key不存在,则返回defaultValue
```#java
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", null);
map.put("宁波", "0574");
System.out.println(map.getOrDefault("杭州","hello world"));
System.out.println(map.getOrDefault("广州","hello world"));
```
## 2.6Object merge(Object key, Object value, BiFunction remappingFunction)
注意:参数value不能null,否则会报java.lang.NullPointerException的错误
该方法中value和remappingFunction二选一使用,如果key对应的value为null或key不存在,使用value,否则使用remappingFunction
* key对应的value为null
* key存在,对应的value为null,将参数value覆盖原value
* 如果key不存在,新建key-value键值对
key存在,map对应的value不为为null,remappingFunction根据key、原value重新计算:
* 如果计算结果不为null,就用结算结果覆盖原value
* 如果计算结果为null,就删除原键值对
```#java
Map map = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", null);
map.put("宁波", "0574");
//key存在,对应的value不为null,将计算结果覆盖新value
map.merge("杭州","1234",(key,value)->((String)(key)+(String)value).length());
System.out.println(map);
//key存在,对应的value不为null,新value为null,删除键值对
map.merge("湖州","1234",(key,value)->null);
System.out.println(map);
//key不存在,新建键值对
map.merge("厦门","1234",(key,value)->((String)(key)+(String)value).length());
System.out.println(map);
//key存在,对应的value为null,用1234覆盖原value
map.merge("嘉兴","1234",(key,value)->((String)(key)+(String)value).length());
System.out.println(map);
//value参数不能为null,否则会报异常
map.merge("厦门", null, (key, value) -> ((String) (key) + (String) value).length());
System.out.println(map);
```

### 2.7Object putIfAbsent(Object key, Object value)
该方法检测key对应的value是否为null
* 如果key不存在,就添加一个新的键值对
* 如果key对应的value为null,使用参数value覆盖null
* 如果key对应的value不为null,什么都不做
```#java
Map map = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", null);
map.put("宁波", "0574");
System.out.println(map);
//key不存在
map.putIfAbsent("广州","021");
//key对应的value为null
map.putIfAbsent("嘉兴","1234");
System.out.println(map);
//key对应的value不为null
map.putIfAbsent("嘉兴","hello");
System.out.println(map);
```

### 2.8Object repalce(Object key,Object value)
将Map中指定的key对应的value替换为新value。如果key不存在,返回null,不会添加新的键值对。
```#java
Map map = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", null);
map.put("宁波", "0574");
System.out.println(map);
map.replace("广州","1234");
map.replace("嘉兴","5678");
System.out.println(map);
```

### 2.9boolean replace(K key, V oldValue, V newValue)
如果在Map中找到指定的key-oldValue对,则替换为newValue并返回true,否则返回false.
newValue为null,不会报错,但执行结果为false,不会执行替换
```#java
Map map = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", null);
map.put("宁波", "0574");
System.out.println(map.replace("杭州","0571","杭州0571"));
System.out.println(map.replace("湖州","0752",null));
System.out.println(map.replace("嘉兴",null,"嘉兴1234"));
System.out.println(map.replace("广州","010","羊城"));
```

### 2.10replaceAll(BiFunction function)
该方法使用BiFunction对原key-value对指定计算,并将结果作为该key-value对的value值。
```#java
Map map = new HashMap();
map.put("杭州", "0571");
map.put("湖州", "0572");
map.put("嘉兴", null);
map.put("宁波", "0574");
map.replaceAll((key,value)->((String)key+(String)value).toString());
System.out.println(map);
```

廖雪峰Java5集合-3Map-1使用Map的更多相关文章
- 廖雪峰Java5集合-4Set-1使用Set
集合 Set用于存储不重复的元素集合: boolean add(E e) boolean remove(Object o) boolean contains(Object o) int size() ...
- 廖雪峰Java5集合-1Java集合简介-1Java结合简介
1.集合 定义:集合就是一堆东西.集合里的东西,称为元素Element 数学中的集合: 有限集合: * 一个班所有的学生组成的集合 * 一个网站所有的商品组成的集合 无限集合: * 全体自然数集合 * ...
- 廖雪峰Java5集合-6Stack-1使用Stack
1.栈的定义 栈Stack是一种后进先出(LIFO: Last In First Out)的数据结构,可以看作一端封闭的容器,先进去的元素永远在底部,最后出来. 栈有2个重要的方法: push(E e ...
- 廖雪峰Java5集合-3Map-Properties的使用
Properties用于读取配置 properties文件只能使用ASCII码 #表示注释 可以从文件系统读取.properties文件 Properties props = new Properti ...
- 廖雪峰Java5集合-2List-2编写equals方法
List是一种有序链表: List内部按照放入元素的先后顺序存放 每个元素都可以通过索引确定自己的位置 boolean contains(Object o) 是否包含某个元素 int indexOf( ...
- 廖雪峰Java5集合-2List-1使用List
1.List定义 List是一种有序链表: List内部按照元素的先后顺序存放 每个元素都可以通过索引确定自己的位置 类似数组,但大小可变 //List<E>是一种有序链表: //* Li ...
- 廖雪峰教程笔记:js中map和reduce的用法
举例说明,比如我们有一个函数f(x)=x2,要把这个函数作用在一个数组[1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map实现如下: 由于map()方法定义在JavaScript的 ...
- 廖雪峰Java5Java集合-5Queue-1使用Queue
Queue特性和基本方法 Queue实现一个先进先出(FIFO, First In First Out)的队列.如收银台排队支付. Java中LinkedList实现了Queue接口,可以直接把Lin ...
- Python自学笔记-map和reduce函数(来自廖雪峰的官网Python3)
感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. Python内 ...
随机推荐
- webpack中hash、chunkhash、contenthash区别
webpack中对于输出文件名可以有三种hash值: 1. hash 2. chunkhash 3. contenthash 这三者有什么区别呢? hash 如果都使用hash的话,因为这是工程级别的 ...
- SpringMVC(二)高级
高级参数绑定 1.1. 绑定数组 1.1.1. 需求 在商品列表页面选中多个商品,然后删除. 1.1.2. 需求分析 功能要求商品列表页面中的每个商品前有一个checkbok,选中多个商品后点击删除按 ...
- django+uwsgi+nginx数据表过大引起"out of memory for query result"
昨天负责的一个项目突然爆“out of memory for query result”. 背景 项目的数据表是保存超过10m的文本数据,通过json方式保存进postgres中,上传一个13m的大文 ...
- spring 自己定义标签 学习二
在上篇中写的仅仅支持写属性,不支持标签property的写法,可是假设有时候我们还想做成支持 property的使用方法,则能够在xsd中添加spring 自带的xsd引用 改动xsd文件例如以下 ...
- 127.0.0.1 localhost 0.0.0.0 回环地址区别
127.0.0.1:一般认为是本机ip,这个没错.但是本机ip不只是 127.0.0.1 而是所有回环地址. 回环地址: 包括127.0.0.1在内的 所有 指向本机的地址.范围是 127.0.0. ...
- 利用pandas将numpy数组导出生成excel
代码 # -*- coding: utf- -*- """ Created on Sun Jun :: @author: Bruce Lau ""&q ...
- 到底什么是ES索引?
你会发现,其实在ES里面,索引扮演的角色其实并不是存储,而是“索引”,看起来有点傻,但是其实我之前一直理解索引是存储,其实从命名上可以看出来,索引其实是分片的索引,分片的字典,记录了每个分片的位置,索 ...
- linux curl 命令的使用
有时候需要内网访问接口地址,使用curl命令,带上-v参数 -v 参数可以显示一次 http 通信的整个过程,包括端口连接和 http request 头信息 curl -v http://172.9 ...
- 性能优化之永恒之道(实时sql优化vs业务字段冗余vs离线计算)
在项目中,随着时间的推移,数据量越来越大,程序的某些功能性能也可能会随之下降,那么此时我们不得不需要对之前的功能进行性能优化.如果优化方案不得当,或者说不优雅,那可能将对整个系统产生不可逆的严重影响. ...
- ML平台_Paddle参考
PaddlePaddle源自于 2013 年百度深度学习实验室创建的 “Paddle”.当时的深度学习框架大多只支持单 GPU 运算,对于百度这样需要对大规模数据进行处理的机构,这显然远远不够,极大拖 ...