当前位置: 首页 > news >正文

Map相关知识

数据结构

二叉树

二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有右子节点。 二叉树每个节点的左子树和右子树也分别满足二叉树的定义。

二叉搜索树

二叉搜索树(Binary Search Tree,BST)又名二叉查找树,有序二叉树或者排序二叉 树,是二叉树中比较常用的一种类型 二叉查找树要求,在树中的任意一个节点,其左子树中的每个节点的值,都要小 于这个节点的值,而右子树节点的值都大于这个节点的值

红黑树

红黑树(Red Black Tree):也是一种自平衡的二叉搜索树(BST),之前叫做平 衡二叉B树(Symmetric Binary B-Tree)

红黑树的特点

  • 节点要么是红色,要么是黑色

  • 根节点是黑色

  • 叶子节点都是黑色的空节点

  • 红黑树中红色节点的子节点都是黑色

  • 从任一节点到叶子节点的所有路径都包含相同数目的黑色节点

在添加或删除节点的时候,如果不符合这些性质会发生旋转,以达到所有的性 质,保证红黑树的平衡

散列表

散列表(Hash Table)又名哈希表/Hash表,是根据键(Key)直接访问在内存存储 位置值(Value)的数据结构,它是由数组演化而来的,利用了数组支持按照下 标进行随机访问数据的特性

散列表中元素的存储以key-value的形式进行存储,所以获取元素的时候时间复杂度为O(1)

散列函数

将键(key)映射为数组下标的函数叫做散列函数。可以表示为:hashValue = hash(key)

散列函数的基本要求:

散列函数计算得到的散列值必须是大于等于0的正整数,因为hashValue需要 作为数组的下标。 如果key1==key2,那么经过hash后得到的哈希值也必相同即:hash(key1) == hash(key2)

如果key1!=key2,那么经过hash后得到的哈希值也必不相同即:

hash(key1)!=hash(key2)

实际的情况下想找一个散列函数能够做到对于不同的key计算得到的散列值都不 同几乎是不可能的,即便像著名的MD5,SHA等哈希算法也无法避免这一情况,这 就是散列冲突(或者哈希冲突,哈希碰撞,就是指多个key映射到同一个数组下 标位置)

散列冲突

散列冲突指对于不同的元素通过散列函数计算后可能出现相同的哈希值。

在散列表中通常以数组+链表/红黑树的方式实现,而数组对应的下标我们统称为或者,每个桶(槽)会对应一条链表,所有散列值相同的元素我们都放到相同 槽位对应的链表中。

简单就是,如果有多个key最终的hash值是一样的,就会存入数组的同一个下标 中,下标中挂一个链表存入多个数据

所以当出现散列冲突的时候我们会先比对散列函数的哈希值,然后进入桶对应的元素去比对元素的值是否相同以此解决哈希冲突。

HashMap

底层实现

  • 数据结构:数组 + 链表 + 红黑树(JDK8之后)

  • Node<K,V>[] table 是主要的存储结构,每个元素是一个链表或红黑树的头节点

  • 哈希冲突时:

    • JDK7 及之前使用链表存储冲突节点

    • JDK8 之后:链表长度超过 8 且数组长度 ≥ 64 时,会转为 红黑树

特点

  • 非线程安全:多线程环境使用时会有数据不一致问题

  • 允许一个 null 键多个 null 值

  • 按 key 的 hashCode() 计算 hash 后定位数组下标

  • 查询效率在理想情况下是 O(1),最坏情况下(哈希冲突严重)为 O(n) 或 O(log n)

扩容机制

  • 初始容量:默认 16,必须为 2 的幂次方

  • 负载因子(Load Factor):默认 0.75,控制扩容频率

  • 触发条件:当元素个数 > 容量 * 负载因子 时,触发扩容(resize)

  • 扩容过程

  • 新建容量为原来 2 倍的数组

  • 将原数据重新 hash 分配到新数组中(链表或红黑树节点迁移)

常用方法

put(K key, V value)       // 插入键值对
get(Object key)           // 根据 key 获取值
remove(Object key)        // 移除指定 key 的键值对
containsKey(Object key)   // 判断 key 是否存在
containsValue(Object value) // 判断 value 是否存在
keySet()                  // 获取所有 key 的 Set
values()                  // 获取所有 value 的 Collection
entrySet()                // 获取所有键值对的 Set
Map<String,Object> map = new HashMap<>();//添加元素map.put("name", "hyh");map.put("sex", "男");map.put("age", 18);map.put("address", "北京");map.put("isMarried", false);map.put("height", 1.75);
​//遍历元素for (Map.Entry<String, Object> stringObjectEntry : map.entrySet()) {String key = stringObjectEntry.getKey();Object value = stringObjectEntry.getValue();System.out.println("键: " + key + ", 值: " + value);}
​System.out.println("所有的value值集合"+map.values());

与HashTable的区别

区别点HashMapHashtable
线程安全是(通过 synchronized)
null 键/值支持允许一个 null 键,多个 null 值不允许任何 null 键或值
性能高(无锁)较低(加锁影响性能)
引入版本JDK 1.2JDK 1.0
替代建议推荐使用 ConcurrentHashMap不推荐使用
http://www.xdnf.cn/news/954451.html

相关文章:

  • 中小企业碳账本管理指南
  • SpringAI实战:ChatModel智能对话全解
  • 对比一下blender快捷键:p和alt+p
  • 基于Flask前后端分离智慧安防小区系统
  • 定位触发DMA2_Stream1_IRQHandler中断的具体原因简述
  • Spring类型转换融入IOC生命周期
  • 字符串哈希+KMP
  • 五.建造者模式
  • SQLAlchemy的子查询subquery()
  • 日本本社企业直招|Java /cobol/C#/PM/PL/Salesforce/AWS/SAP 等,正社员/個人事業主,高度人才+20 分
  • Spring状态机
  • 苍穹外卖-day02
  • 机器人模仿学习调研(二)
  • MySQL 8.0 OCP 英文题库解析(十三)
  • Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
  • fpga系列 HDL : Microchip FlashPro 导出与烧录FPGA
  • 6.9本日总结
  • 网络安全A模块专项练习任务六解析
  • python打卡day49@浙大疏锦行
  • 欢乐熊大话蓝牙知识17:多连接 BLE 怎么设计服务不会乱?分层思维来救场!
  • C#中用于控制自定义特性(Attribute)
  • 【Dify】基于 Agent 实现热门新闻生成助手
  • 【教程】矩形重叠检测 -- 分离轴定理的应用
  • Vue 插槽(Slot)用法详解
  • UFW防火墙安全指南
  • 【算法-BFS实现FloodFill算法】使用BFS实现FloodFill算法:高效识别连通块并进行图像填充
  • 时间复杂度和算法选择
  • WinUI3开发_使用mica效果
  • vitepress添加图片放大功能
  • 基于2.4G功能的使用