>[success] # java.util.Map
![](https://img.kancloud.cn/11/85/11851ea349624a042fc85d13c9f78c72_675x312.png)
1. `java.util.Map<K,V>`集合中存取元素的基本单位是:单对元素,其中类型参数如下:
* **K** - 此映射所维护的键(Key)的类型,相当于目录。
* **V** - 映射值(Value)的类型,相当于内容。
2. 该集合中**key是不允许重复**的,而且**一个key只能对应一个value**
3. **主要实现**类有:`HashMap`类、`TreeMap`类、`LinkedHashMap`类、`Hashtable`类、`Properties`类
* **HashMap类**的底层是采用**哈希表进行数据管理**的
* **TreeMap类**的底层是采用**红黑树进行数据管理**的
* **LinkedHashMap类**内部维护了一个**双向链表**,链表中记录了元素的迭代顺序,也就是元素插入集合中的先后顺序,因此便于迭代
* **Hashtable类**与**HashMap类**相比属于**线程安全**的类,且**不允许null作为key或者value的数值**
* **Properties类是Hashtable类的子类**,该对象用于处理属性文件,key和value都是String类型的
4. **Map集合是面向查询优化的数据结构, 在大数据量情况下有着优良的查询性能**
5. 经常用于根据**key检索value**的业务场景
>[danger] ##### 常用方法
|方法声明 |功能介绍|
| -- |--|
|V put(K key, V value)| 将Key-Value对存入Map,若集合中已经包含该Key,则替换该Key所对应的Value,返回值为该Key原来所对应的Value,若没有则返回null|
|V get(Object key) |返回与参数Key所对应的Value对象,如果不存在则返回null|
|boolean containsKey(Object key);|判断集合中是否包含指定的Key|
|boolean containsValue (Object value);|判断集合中是否包含指定的Value|
|V remove(Object key) |根据参数指定的key进行删除|
|Set keySet() |返回此映射中包含的键的Set视图|
|Collection values()| 返回此映射中包含的值的Set视图|
|Set<Map.Entry<K,V>> entrySet()| 返回此映射中包含的映射的Set视图|
~~~
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapTest {
public static void main(String[] args) {
Map<String, String> map = new HashMap<>();
// put 添加元素
String str = map.put("1", "11");
System.out.println(str); // null 如果添加key 不存在怎返回null
map.put("2", "22");
map.put("3", "33");
System.out.println(map); // {1=11, 2=22, 3=33} 自动调用toString 方法
// 修改元素
str = map.put("2", "6666"); // 如果key 存在则修改
System.out.println(str); // 22 key 存在获取修改前的对应value 值
System.out.println(map); // {1=11, 2=6666, 3=33} 自动调用toString 方法
// containsKey 查找map中 key 是否存在
boolean b1 = map.containsKey("1");
System.out.println(b1); // true
// containsValue 查找map中 value 是否存在
b1 = map.containsValue("1");
System.out.println(b1);// false
// get 根据key 获取value
String val = map.get("1");
System.out.println(val); // 11
val = map.get("123");
System.out.println(val); // null 查找的值不存在
// 删除元素
str = map.remove("1");
System.out.println("被删除的value是:" + str); // 被删除的value是:11
System.out.println("map = " + map); // map = {2=6666, 3=33}
// keySet 获取所有key - 遍历所有key
Set<String> keys = map.keySet();
for (String key : keys) {
System.out.println(key); // 2 3
}
// 获取所有value - 打印所有value
Collection<String> co = map.values();
for (String ts : co) {
System.out.println("ts = " + ts); // ts = 6666 ts = 33
}
// entrySet 获取键值对
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String, String> me : entries) {
System.out.println(me); // 2=6666 3=33
}
}
}
~~~
>[danger] ##### 原理
1. 使用元素的**key调用hashCode方法获取对应的哈希码值**,再由某种哈希算法计算在数组中的索引位置。
2. 若该位置**没有元素**,则将该键值对直接放入即可。
3. 若该位置**有元素**,则使用key与已有元素依次比较哈希值,若哈希值不相同,则将该元素直接放入。
4. 若key与**已有元素的哈希值相同**,则使用key调用equals方法与已有元素依次比较。
5. 若**相等**则将对应的value修改,否则将键值对直接放入即可
- windows -- 环境变量
- Vscode -- 编写java
- 初始java
- java -- 关键字
- 编写第一个java程序
- java -- 注释
- 计算机存储 -- 进制
- java -- 类型
- java -- 变量
- 数字类型
- 布尔类型
- 字符类型
- 类型转换
- 双等比较是什么
- java -- 运算符
- 算数运算符
- 字符串拼接
- 关系/比较运算符
- 自增减运算符
- 逻辑运算符
- 三目运算
- 赋值运算符
- 移位运算符
- 位运算符
- 运算符优先级
- java -- 流程控制语句
- if /else if /if -- 判断
- switch case分支结构
- for -- 循环
- 用双重for循环
- while -- 循环
- do while -- 循环
- 案例练习
- java -- 数组
- 数组的存储
- 数组的增删改查
- 数组的特点
- 数组案例
- 二维数组
- 数组的工具方法
- java -- 方法
- java -- 方法的重载
- java -- 方法的调用流程
- java -- 类方法传参注意事项
- java -- 方法练习案例
- 对比 return break continue
- for each循环
- java -- 基础练习
- java -- 面向对象
- java -- 创建类和对象
- java -- 访问控制符
- java -- 类成员方法
- java -- 构造方法
- java -- this
- java -- 封装
- java -- 对象内存图
- java -- 创建对象案例
- java -- static
- java -- 继承
- super -- 关键字
- java -- 构造块和静态代码块
- java -- 重写
- java -- final
- java -- 多态
- java -- 抽象类
- java -- 接口
- 引用类型数据转换
- 综合案例
- java -- 内部类
- java -- 回调模式
- java -- 枚举类型
- java -- switch 使用枚举
- java -- 枚举方法使用
- java -- 枚举类实现接口
- java -- javaBean
- java -- package 包
- java -- import
- java -- 递归练习
- java -- 设计模式
- 单例模式
- java -- 注解
- java -- 元注解
- Java -- 核心类库
- java -- 处理字符串
- Java -- String
- String -- 常用方法
- String -- 正则
- Java -- StringBuilder 和 StringBuffer
- 知识点
- Java -- StringJoiner 字符串拼接
- 练习题
- 字符串的总结
- Java -- 包装类
- Integer
- Double
- Boolean
- Character
- java -- 集合类
- java -- util.Collection
- Iterator接口
- java -- util.List
- java -- ArrayList
- java -- util.Queue
- java -- util.Set
- java -- util.Map
- java -- util.Collections
- Java -- Math
- Java -- java.lang
- Java -- Object
- Java -- 获取当前时间戳
- Java -- 异常
- Java -- java.util
- java -- Date
- java -- Calender
- Java -- java.text
- Java -- SimpleDateFormat
- Java -- java.time
- Java -- java.io
- java -- io.File
- java -- 泛型
- IDEA -- 用法