当前位置: 首页 > 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不推荐使用

相关文章:

  • 循环语句之for
  • 【系统架构设计师-2025上半年真题】综合知识-参考答案及部分详解(回忆版)
  • 数据挖掘是什么?数据挖掘技术有哪些?
  • 2025.06.09【读书笔记】|PromptBio:让生信分析更简单的AI平台
  • 一款用于react-native监听app[AppState]前后台的自定义Hooks开源插件
  • python读取SQLite表个并生成pdf文件
  • 芯科科技Tech Talks技术培训重磅回归:赋能物联网创新,共筑智能互联未来
  • 查找日志文件中​​最后一次出现某个关键词的上下 20 行​​
  • 河北对口计算机高考C#笔记(2026高考适用)---持续更新~~~~
  • [KCTF]CORE CrackMe v2.0
  • C# 表达式和运算符(求值顺序)
  • C# winform教程(二)----checkbox
  • Python----大模型(大模型基础)
  • 拉力测试cuda pytorch 把 4070显卡拉满
  • EasyRTC音视频实时通话功能在WebRTC与智能硬件整合中的应用与优势
  • Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
  • AI 边缘计算网关推动各行业的数字化转型和智能化升级
  • 十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建
  • 【OpenCV】相机标定之利用棋盘格信息标定
  • games101 hw1
  • 中国企业名录黄页/站长工具seo下载
  • 杭州认证网站建设/上海最专业的seo公司
  • wordpress js篡改/百度推广优化
  • 自动网站建设/湖南长沙疫情最新情况
  • 快速提升网站排名/建站平台哪家好
  • 类似酷家乐做庭院的网站/什么公司适合做seo优化