廖雪峰的视频不全,以下是疯狂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的更多相关文章

  1. 廖雪峰Java5集合-4Set-1使用Set

    集合 Set用于存储不重复的元素集合: boolean add(E e) boolean remove(Object o) boolean contains(Object o) int size() ...

  2. 廖雪峰Java5集合-1Java集合简介-1Java结合简介

    1.集合 定义:集合就是一堆东西.集合里的东西,称为元素Element 数学中的集合: 有限集合: * 一个班所有的学生组成的集合 * 一个网站所有的商品组成的集合 无限集合: * 全体自然数集合 * ...

  3. 廖雪峰Java5集合-6Stack-1使用Stack

    1.栈的定义 栈Stack是一种后进先出(LIFO: Last In First Out)的数据结构,可以看作一端封闭的容器,先进去的元素永远在底部,最后出来. 栈有2个重要的方法: push(E e ...

  4. 廖雪峰Java5集合-3Map-Properties的使用

    Properties用于读取配置 properties文件只能使用ASCII码 #表示注释 可以从文件系统读取.properties文件 Properties props = new Properti ...

  5. 廖雪峰Java5集合-2List-2编写equals方法

    List是一种有序链表: List内部按照放入元素的先后顺序存放 每个元素都可以通过索引确定自己的位置 boolean contains(Object o) 是否包含某个元素 int indexOf( ...

  6. 廖雪峰Java5集合-2List-1使用List

    1.List定义 List是一种有序链表: List内部按照元素的先后顺序存放 每个元素都可以通过索引确定自己的位置 类似数组,但大小可变 //List<E>是一种有序链表: //* Li ...

  7. 廖雪峰教程笔记:js中map和reduce的用法

    举例说明,比如我们有一个函数f(x)=x2,要把这个函数作用在一个数组[1, 2, 3, 4, 5, 6, 7, 8, 9]上,就可以用map实现如下: 由于map()方法定义在JavaScript的 ...

  8. 廖雪峰Java5Java集合-5Queue-1使用Queue

    Queue特性和基本方法 Queue实现一个先进先出(FIFO, First In First Out)的队列.如收银台排队支付. Java中LinkedList实现了Queue接口,可以直接把Lin ...

  9. Python自学笔记-map和reduce函数(来自廖雪峰的官网Python3)

    感觉廖雪峰的官网http://www.liaoxuefeng.com/里面的教程不错,所以学习一下,把需要复习的摘抄一下. 以下内容主要为了自己复习用,详细内容请登录廖雪峰的官网查看. Python内 ...

随机推荐

  1. c++中的stl

    String Vector Set List Map 1.string char* s1 = "Hello SYSU!"; //创建指针指向字符串常量,这段字符串我们是不能修改的 ...

  2. 《DSP using MATLAB》Problem 5.38

    代码: %% ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ %% Output In ...

  3. 【java多线程】java8的流操作api和fork/join框架

    原文:https://blog.csdn.net/u011001723/article/details/52794455/ 一.测试一个案例,说明java8的流操作是并行操作 1.代码 package ...

  4. centos7部署phpipam(ip管理系统)

    安装必要的软件 yum install httpd mariadb-server php php-cli php-gd php-common php-ldap php-pdo php-pear php ...

  5. nginx实现nginx/tomcat负载均衡

    准备三台centos7虚拟机,全部安装nginx或者tomcat 虚拟机A 10.0.3.46        在index.html 中添加10.0.3.46作为标志 虚拟机B 10.0.3.66   ...

  6. Hasura GraphQL schema 生成是如何工作的

    不像大部分的graphql 引擎,使用标准的graphql 规范的处理模型,Hasura graphql 不存在resolver 的概念(实际上是有的,只是转换为了sql语法) 以下是Hasura g ...

  7. 二分查找法(binary_search,lower_bound,upper_bound,equal_range)

    binary_search(二分查找) //版本一:调用operator<进行比较 template <class ForwardIterator,class StrictWeaklyCo ...

  8. 当 1117 遇到 MLCC 后

    当 1117 遇到 MLCC 后 AMS1117 很多人用过吧,但是当大容量的 MLCC 时会出现什么呢? 会出现问题,而且严重的问题,输出纹波会变大,会自激,会有声音出来. 这是很多工程师没有注意的 ...

  9. AIX系统日志

    1.系统错误日志 存放路径:/var/adm/ras/errlog 说明:该日志记录了系统所检测到的软硬件故障和错误,尤其对系统的硬件故障有很大的参考价值,是AIX提供的最有价值的日志之一, errl ...

  10. get_client_ip() 获取IP地址

    get_client_ip()获取ip地址,在开启IPv6协议的主机上会全部返回0.0.0.0原因是他会把ipv6地址认为是非法地址而转换成0.0.0.0,而ipv4地址在ipv6主机上用get_cl ...