《从0到1常用Map集合核心摘要 + 不深不浅底层核心》

《从0到1常用Map集合核心摘要+不深不浅底层核心》

在这里插入图片描述

前置知识

什么是键值对

​ 键值对是一种数据结构,是唯一标识,是对应数据,用来快速查找信息。例:

{"name": "Alice"},键是name,值是Alice

这听起来有些抽象, 为什么不能值就是数据呢? 还要多一个键

​ 实际上, 键可能只是一个用于 ‘描述/标识’ 值的信息, 它的值可能是一个对象, 或一 个数组, 甚至更多复杂的东西,

​ 但是无论有多复杂, 都可以通过一个 找到
​ 而你的键, 可能连 5 个字母都没有

补充:并且直接存储值时,每个值的含义会很模糊。键则提供信息,比如
name: "Alice" 更直观,而不是单独存 "Alice"

map 集合是干嘛用的?

​ map集合就是用来存储一组或多组键值对的, 为了方便我们使用键值对, 其中封装了很多 方法, 供我们操作键值对

所有Map集合的接口 “Map”

  • 一个接口, 其中包含的所有实现类都是 同一套数据结构(键值对)

介绍

  • Map 集合是一种双列集合, 每个元素包含两个数据, 一个是键一个是值

    • 特点

      • 键唯一 每个键唯一, 值可重复
      • 易查 通过键定位值, 提高访问效率及便利性
      • 灵活 通过泛型可存储各类数据, 无论是键或值
    • 每个元素的格式

      • key = value : 键值对

      • key (键) : 非重

      • value (值) : 可重

      • 关联性 : 键绑值, 哪怕不同键同值, 地址也不一样

      • 一键多值 : 结合使用双列集合和单列集合, 来完成一键多值

    • 键值对

      • 一个整体, 在 JAVA 中使用 Entry 对象来表示

      • 使用场景 :
        购物车 -> 选择商品 -> 结算 …

               *每个店铺对应一个商品,  有时候一个有时候多个,  每个商品使用一个商品封装成一个对象来进行维护,  多个商品应当使用多个商品对象的单列集合装起来,  这样一个结算订单就有了多个商品*
        
      • 总结 : 遇到键对值 (一个对多个), 就使用双列集合

常用公共方法、实现关系

V put(K key,V value) : // 添加键值对, 返回被覆盖的值 (没有覆盖则null)
V remove(Object key) : // 根据键删除键值对, 返回被删除的键对应的值

boolean containsKey(Object key) : //判断集合指定键, 返回是或否
boolean containsValue(Object value) : //判断集合指定值, 返回是或否
     
void Clear() : // 清空所有的键值对
boolean isEmpty() : //判断集合是否为空
int size() : //集合的长度 (键值对个数)

常用双列集合

TreeMap (红黑树)
HashMap (哈希表)
LinkedHashMap (哈希表 + 双向链表)

使用介绍

HashMap 的底层逻辑

  • put 方法 : 双列集合中的添加
    • put 方法执行中, 键和值会封装为一个 Entry(键值对) 对象
    • 但实际在计算应存入索引时, 是拿着键进行计算的, 和值没有关系
      (先调用对象计算原始哈希值, 再使用原始哈希值做一次哈希扰动, 然后再使用扰动过的哈希值做一次异或操作进行二次哈希, 最后再取余底层数组长度(16))…

方法演示

添加 : put(K key, V value)

/*  Map是接口, 接口不能直接用, 所以通过多态一个子类或实现类  */
Map<String, String> map = new HashMap<>(); 

// 对HashMap 进行操作
map.put("张三","北京"); //put: 添加一个键值对 一是键二是值
map.put("李四","北京"); // 键重复时警告, 右边重复则没事, 说明键的不可重, 值的可重
map.put("王五","北京");

//  北京 -> 仅一个
//  张三, 李四, 王五 -> 对应多个
System.out.println(map);// 打印成乱序, 是因为底层是哈希表

// **put方法的返回值 被替换掉的旧值
String str = map.put("lala", "北京");
String str2 = map.put("lala", "喵");
System.out.println(str);
// 返回被覆盖掉的旧值, 没有重复就直接存
System.out.println(str2);
// -- 该返回值一般不接收 --

put方法的细节 (修改)( 条件 : 如果出现重键, 保留新键替换旧键 )

删除 : remove(Object key)

/* Remove 根据键删除 */
Map<String,String> map = new HashMap<>();
map.put("张三","南宁");
map.put("李四","上海");
map.put("王五","南宁");
System.out.println(map);

map
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值