文章目录
- 前言
- 一、 Map(双列集合)接口
-
- 1 常用方法
- 2 遍历方式
-
- (1)使用map.keySet()方法
- (2)使用map.entrySet()方法
- (3)lambda表达式遍历(这个最简单)
- 3 实现类:HashMap、LinkedHashMap、TreeMap
-
- (1)HashMap
-
- ---- HashMap的特点
- ---- HashMap的底层原理
- ---- 特别注意:自定义类作为键的处理方案
- ---- 练习
- (2)LinkedHashMap
-
- ---- LinkedHashMap的特点
- ---- 底层原理
- ---- 特别注意:自定义类作为键的处理方案
- (3)TreeMap
-
- ---- TreeMap的特点
- ---- TreeMap的两种排序规则
- ---- 自定义对象作为TreeMap的键的处理
- ---- 练习
- 二、 源码详解
-
- 1 HashMap源码
- 2 TreeMap源码
前言
- 双列集合的特点
(1)双列集合一次需要存一对数据,分别为键和值
(2)键不能重复,值可以重复
(3)键和值是一一对应的,每一个键只能找到自己对应的值
(4)键+值这个整体我们称之为“键值对”或者“键值对对象”,在Java中叫做“Entry对象”
在双列集合的体现中,一个接口、三个实现类
一、 Map(双列集合)接口
Map系列的常用方法,我们只要学习这个最顶层的接口里面有的。底下的实现类里面没有什么特殊方法。
1 常用方法
Map是双列集合的顶层接口,它的功能是全部双列集合都可以继承使用的
方法名 | 说明 |
---|---|
v put(K key,v value) | 添加元素(添加) 或者 根据指定已经存在的键修改对应的值(修改覆盖) |
v remove(object key) | 根据键删除键值对元素 |
void clear() | 移除所有的键值对元素 |
boolean containsKey(object key) | 判断集合是否包含指定的键 |
boolean containsvalue(object value) | 判断集合是否包含指定的值 |
boolean isEmpty() | 判断集合是否为空 |
int size() | 集合的长度,也就是集合中键值对的个数 |
v get(Object key) | 返回指定键映射到的值,如果此map不包含键的映射,则返回 null。 |
关于put方法需要单独讲一下,其有添加元素和修改元素两个功能
-
put方法的细节:添加、覆盖
(1)在添加数据的时候,如果键不存在,那么直接把键值对对象添加到map集合当中,方法返回null
(2)在添加数据的时候,如果键是存在的,那么会把原有的键值对对象覆盖,会把被覆盖的值进行返回。 -
关于get方法我喜欢和Objects工具类里面的判null方法Objects.isNull(obj)一起用。
Map<String,String> map = new HashMap<>();
// put方法
map.put("郭靖","黄蓉");
map.put("韦小宝","沐剑屏");
map.put("张无忌","周芷若");
map.put("杨过","小龙女");
map.put("令狐冲","任盈盈");
System.out.println(map); // {韦小宝=沐剑屏, 令狐冲=任盈盈, 张无忌=周芷若, 杨过=小龙女, 郭靖=黄蓉}
map.put("韦小宝","双儿"); // key相同,value覆盖
System.out.println(map); // {韦小宝=双儿, 令狐冲=任盈盈, 张无忌=周芷若, 杨过=小龙女, 郭靖=黄蓉}
// remove方法
map.remove("韦小宝"); // 删除key为韦小宝的键值对
System.out.println(map); // {令狐冲=任盈盈, 张无忌=周芷若, 杨过=小龙女, 郭靖=黄蓉}
// get方法
System.out.println(map.get("郭靖")); // 黄蓉
System.out.println(map.get("韦小宝")); // null
if (Objects.isNull(map.get("韦小宝"))) {
System.out.println("韦小宝不存在"); // 韦小宝不存在
} else {
System.out.println("韦小宝存在");
}
2 遍历方式
(1)使用map.keySet()方法
- Set <K> keySet() : 返回此map中包含的所有键组成的Set单列集合。
Map<String,String> map = new HashMap<>();
// put方法
map.put("郭靖","黄蓉");
map.put("韦小宝","沐剑屏");
map.put("张无忌","周芷若");
map.put("杨过","小龙女");
map.put("令狐冲","任盈盈");
System.out.println(map); // {令狐冲=任盈盈, 韦小宝=沐剑屏, 杨过=小龙女, 郭靖=黄蓉, 张无忌=周芷若}
// 遍历
// 1. keySet()方法
/*
Set<String> keySet = map.keySet();
for (String key : keySet) {
System.out.println(key + " : " + map.get(key));
}
*/
// 快捷键: 集合对象.keySet().for
for (String s : map.keySet()) {
System.out.println(s + " : " + map.get(s));
}
/*// 快捷键: map.keySet().forEach
map.keySet().forEach(s -> System.out.println(s + " : " + map.get(s)));*/
// 迭代器版本就不写了
/*
令狐冲 : 任盈盈
韦小宝 : 沐剑屏
杨过 : 小龙女
郭靖 : 黄蓉
张无忌 : 周芷若 */
(2)使用map.entrySet()方法
- Set<Map.Entry<K,V>> entrySet() :返回此map中包含的所有键值对(Entry对象)组成的Set单列集合。
- Entry.getKey() : 获取键
- Entry.getValue() : 获取值
Map<String,String> map = new HashMap<>();
// put方法
map.put("郭靖","黄蓉");
map.put("韦小宝","沐剑屏");
map.put("张无忌","周芷若");
map.put("杨过","小龙女");
map.put("令狐冲","任盈盈");
System.out.println(map); // {令狐冲=任盈盈, 韦小宝=沐剑屏, 杨过=小龙女, 郭靖=黄蓉, 张无忌=周芷若}
// 遍历
/*
// entrySet()方法
Set<Map.Entry<String, String>> entries = map.entrySet();
for (Map.Entry<String