欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 建筑 > 10 Java数据结构(下):集合进阶之Map(双列集合)系列:Map接口、HashMap实现类、LinkedHashMap实现类、TreeMap实现类

10 Java数据结构(下):集合进阶之Map(双列集合)系列:Map接口、HashMap实现类、LinkedHashMap实现类、TreeMap实现类

2024/10/25 7:20:56 来源:https://blog.csdn.net/smalltorch/article/details/141613006  浏览:    关键词:10 Java数据结构(下):集合进阶之Map(双列集合)系列:Map接口、HashMap实现类、LinkedHashMap实现类、TreeMap实现类

文章目录

  • 前言
  • 一、 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("韦小宝"));  // nullif (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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com