【面经总结】Java集合 - Map

Map 概述

Map 架构

HashMap

要点

  1. 散列(哈希表) 方式存储键值对,访问速度快
  2. 没有顺序性
  3. 允许使用空值和空键
  4. 有两个影响其性能的参数:初始容量和负载因子。
    1. 初始容量:哈希表创建时的容量
    2. 负载因子:其容量自动扩容之前被允许的最大饱和量
  5. 不是线程安全的

Java7

数据结构

实现机制:**数组 + 链表,**通过链表解决哈希冲突。

  1. table:存储 K-V 的数组
  2. size:容量,初始为 16
  3. loadFactor:负载因子,默认为 0.75(元素个数超过容量的 75% 会触发自动扩容,扩容为原始的 2 倍)

获取元素 get

  1. 通过 key 的哈希计算存储位置
  2. 遍历链表

计算 hash 方式:高16位不变,低16位和高16位做异或

java 复制代码
static final int hash(Object key) {
    int h;
    return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
}

计算下标的时候,是使用 & 位操作,而非求余

java 复制代码
(n - 1) & hash

优点:能使用32位计算哈希,避免因为高位没有参与下标的计算而碰撞

添加元素 put

  1. 通过 key 的哈希计算存储位置
  2. 查找 key 是否存在
    1. 存在:覆盖 Value
    2. 不存在:放到桶里 or 插入链表(头插法)

删除元素 remove

找到指定数据并修改链表引用

Java8

  • 实现机制:数组 + 链表 + 红黑树
  • 当容量达到 64 ,且元素达到 8 个时会将链表转为红黑树
  • 将链表插入方式改为尾插法(解决循环链表)

链表查询复杂度取决于链表长度,为 O(n)。为了降低开销,Java8 中当容量达到 64,且元素达到 8 个时会转为红黑树,降低复杂度为 O(logN)

Java7 使用 Entry 表示数据节点,Java8 使用 Node 和 TreeNode。

LinkedHashMap

在 HashMap 的基础上,维护一个双向链表,实现插入顺序

TreeMap

  1. 实现机制:红黑树
  2. 有序(默认为升序)
  3. Key 需要定义比较逻辑
    1. 实现 Comparable 接口
    2. 重写 compareTo() 方法
相关推荐
赤水无泪2 分钟前
qt中图标、名称的设置方式
开发语言·qt
王莎莎-MinerU8 分钟前
MCP 解决的是工具接入,科研 Agent 还缺的是科学证据接口标准化
开发语言·网络·人工智能·深度学习·pdf·c#·php
橘子海全栈攻城狮31 分钟前
【最新源码】基于SpringBoot + Vue的超市管理系统的设计与实现D002
java·开发语言·vue.js·spring boot·后端·spring
smartvxworks36 分钟前
Linux 实时内核(Linux Real-Time Kernel)详解:原理、实践与优化
java·linux·服务器
qizayaoshuap37 分钟前
# [特殊字符] 密码生成器 — 鸿蒙ArkTS安全算法与密码强度评估系统
java·算法·安全·华为·harmonyos
在水一缸38 分钟前
深入浅出 Catch2:现代 C++ 测试框架的优雅实践
开发语言·c++·单元测试·log4j·测试框架·catch2
AC赳赳老秦39 分钟前
OpenClaw 采集任务日志审计:全程记录采集行为,满足合规溯源与企业审计要求
java·大数据·python·数据挖掘·数据分析·php·openclaw
-银雾鸢尾-1 小时前
C#中Object类内的方法
开发语言·c#
浮江雾1 小时前
Flutter第十节-----Flutter布局与组件全解析
android·开发语言·前端·学习·flutter·入门
爱喝水的鱼丶1 小时前
SAP-ABAP:ALV跨版本兼容指南——适配ECC与S4 HANA系统的ALV开发注意事项
开发语言·性能优化·sap·abap·经验交流