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

【面经总结】Java集合 - Map

Map 概述

Map 架构

img

HashMap

要点

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

Java7

数据结构

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

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

img

获取元素 get

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

img

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

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

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

(n - 1) & hash

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

添加元素 put

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

img

删除元素 remove

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

img

Java8

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

img

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

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

LinkedHashMap

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

img

TreeMap

  1. 实现机制:红黑树
  2. 有序(默认为升序)
  3. Key 需要定义比较逻辑
    1. 实现 Comparable 接口
    2. 重写 compareTo() 方法

相关文章:

  • JVM-GC-什么是垃圾
  • 【Python】数据处理:NumPy
  • ELasticSearch数据迁移方案-elasticdump
  • 算法排序之冒泡排序及优化
  • SolarLab - hackthebox
  • 【Android面试八股文】Android中操作多线程的方式有哪些?
  • AtCoder Beginner Contest 358 A~E(F,G更新中...)
  • CSS概述
  • web前端开发哪个城市:探索最佳发展地
  • 数据库面试
  • Docker 基础使用(5)Compose
  • 560. 和为 K 的子数组
  • RoCE网络架构在高性能计算的应用
  • [Golang] go-kit 介绍和使用 (微服务实现工具)
  • 【漏洞复现】飞企互联-FE企业运营管理平台 treeXml.jsp SQL注入漏洞
  • [分享]iOS开发 - 实现UITableView Plain SectionView和table不停留一起滑动
  • gf框架之分页模块(五) - 自定义分页
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Linux中的硬链接与软链接
  • Map集合、散列表、红黑树介绍
  • 使用Maven插件构建SpringBoot项目,生成Docker镜像push到DockerHub上
  • 手写一个CommonJS打包工具(一)
  • 小程序开发之路(一)
  • 小而合理的前端理论:rscss和rsjs
  • 一个JAVA程序员成长之路分享
  • ​DB-Engines 11月数据库排名:PostgreSQL坐稳同期涨幅榜冠军宝座
  • ​LeetCode解法汇总2670. 找出不同元素数目差数组
  • ​力扣解法汇总1802. 有界数组中指定下标处的最大值
  • #1015 : KMP算法
  • #我与Java虚拟机的故事#连载01:人在JVM,身不由己
  • #我与Java虚拟机的故事#连载09:面试大厂逃不过的JVM
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • (1)(1.19) TeraRanger One/EVO测距仪
  • (3)(3.2) MAVLink2数据包签名(安全)
  • (CVPRW,2024)可学习的提示:遥感领域小样本语义分割
  • (C语言)逆序输出字符串
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (附源码)node.js知识分享网站 毕业设计 202038
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)spring boot基于Java的电影院售票与管理系统毕业设计 011449
  • (使用vite搭建vue3项目(vite + vue3 + vue router + pinia + element plus))
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (一)Spring Cloud 直击微服务作用、架构应用、hystrix降级
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • (转) Face-Resources
  • (转)h264中avc和flv数据的解析
  • (转)人的集合论——移山之道
  • .Net中的设计模式——Factory Method模式
  • /etc/motd and /etc/issue
  • @RequestBody的使用
  • [3300万人的聊天室] 作为产品的上游公司该如何?
  • [383] 赎金信 js
  • [8-23]知识梳理:文件系统、Bash基础特性、目录管理、文件管理、文本查看编辑处理...
  • [BUUCTF]-PWN:[极客大挑战 2019]Not Bad解析
  • [BZOJ 4129]Haruna’s Breakfast(树上带修改莫队)