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

Java Map实现类面试题

Java Map实现类面试题

HashMap

Q1: HashMap的实现原理是什么?

HashMap基于哈希表实现,使用数组+链表+红黑树(Java 8)的数据结构。

public class HashMapPrincipleExample {// 模拟HashMap的基本结构public class SimpleHashMap<K, V> {private static final int DEFAULT_CAPACITY = 16;private static final float LOAD_FACTOR = 0.75f;private Entry<K, V>[] table;private int size;private static class Entry<K, V> {K key;V value;Entry<K, V> next;Entry(K key, V value, Entry<K, V> next) {this.key = key;this.value = value;this.next = next;}}@SuppressWarnings("unchecked")public SimpleHashMap() {table = new Entry[DEFAULT_CAPACITY];}public V put(K key, V value) {int hash = hash(key);int index = indexFor(hash, table.length);// 遍历链表for (Entry<K, V> e = table[index]; e != null; e = e.next) {if (e.key.equals(key)) {V oldValue = e.value;e.value = value;return oldValue;}}// 添加新节点addEntry(hash, key, value, index);return null;}private void addEntry(int hash, K key, V value, int index) {Entry<K, V> e = table[index];table[index] = new Entry<>(key, value, e);if (++size > table.length * LOAD_FACTOR) {resize(2 * table.length);}}private int hash(K key) {return key == null ? 0 : key.hashCode();}private int indexFor(int hash, int length) {return hash & (length - 1);}}
}

Q2: HashMap的扩容机制是怎样的?

public class HashMapResizeExample {public void demonstrateResize() {HashMap<String, Integer> map = new HashMap<>();// 1. 默认初始容量16,负载因子0.75System.out.println("初始容量:" + 16);System.out.println("扩容阈值:" + (16 * 0.75));// 2. 指定初始容量HashMap<String, Integer> customMap = new HashMap<>(32);// 3. 模拟扩容过程for (int i = 0; i < 13; i++) {map.put("key" + i, i);System.out.println("当前大小:" + map.size());}}// 扩容时的数据迁移public void demonstrateRehash() {HashMap<String, Integer> map = new HashMap<>(4);map.put("A", 1); // index = hash("A") & (4-1)map.put("B", 2);map.put("C", 3);// 扩容后 index = hash("A") & (8-1)}
}

TreeMap

Q3: TreeMap的实现原理是什么?

TreeMap基于红黑树实现,可以保证键的有序性。

public class TreeMapPrincipleExample {// 1. 自然排序public void naturalOrdering() {TreeMap<String, Integer> map = new TreeMap<>();map.put("C", 3);map.put("A", 1);map.put("B", 2);// 按键的自然顺序排序for (Map.Entry<String, Integer> entry : map.entrySet()) {System.out.println(entry.getKey() + ": " + entry.getValue());}}// 2. 自定义排序public void customOrdering() {TreeMap<Person, String> map = new TreeMap<>((p1, p2) -> {int ageCompare = Integer.compare(p1.getAge(), p2.getAge());if (ageCompare != 0) return ageCompare;return p1.getName().compareTo(p2.getName());});map.put(new Person("Tom", 20), "Student");map.put(new Person("Jerry", 18), "Student");map.put(new Person("Bob", 20), "Teacher");}// 3. 范围操作public void rangeOperations() {TreeMap<Integer, String> map = new TreeMap<>();for (int i = 1; i <= 10; i++) {map.put(i, "Value" + i);}// 获取子MapMap<Integer, String> subMap = map.subMap(3, 7);// 获取小于等于key的EntryMap.Entry<Integer, String> floorEntry = map.floorEntry(5);// 获取大于等于key的EntryMap.Entry<Integer, String> ceilingEntry = map.ceilingEntry(5);}
}

LinkedHashMap

Q4: LinkedHashMap的特点是什么?

LinkedHashMap在HashMap的基础上维护了一个双向链表,可以保持插入顺序或访问顺序。

public class LinkedHashMapExample {// 1. 插入顺序public void insertionOrder() {LinkedHashMap<String, Integer> map = new LinkedHashMap<>();map.put("A", 1);map.put("B", 2);map.put("C", 3);// 遍历时保持插入顺序}// 2. 访问顺序public void accessOrder() {LinkedHashMap<String, Integer> map = new LinkedHashMap<>(16, 0.75f, true);  // accessOrder = truemap.put("A", 1);map.put("B", 2);map.put("C", 3);map.get("A");  // 访问A,A会移到链表末尾// 遍历时A会在最后}// 3. LRU缓存实现public class LRUCache<K, V> extends LinkedHashMap<K, V> {private final int capacity;public LRUCache(int capacity) {super(capacity, 0.75f, true);this.capacity = capacity;}@Overrideprotected boolean removeEldestEntry(Map.Entry<K, V> eldest) {return size() > capacity;}}
}

ConcurrentHashMap

Q5: ConcurrentHashMap的实现原理是什么?

ConcurrentHashMap在Java 8中使用CAS和synchronized来保证并发安全。

public class ConcurrentHashMapExample {// 1. 基本使用public void basicUsage() {ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();map.put("A", 1);map.putIfAbsent("B", 2);map.computeIfAbsent("C", key -> 3);}// 2. 原子操作public void atomicOperations() {ConcurrentHashMap<String, AtomicInteger> map = new ConcurrentHashMap<>();map.putIfAbsent("counter", new AtomicInteger(0));// 线程安全的计数器map.get("counter").incrementAndGet();}// 3. 并发迭代public void concurrentIteration() {ConcurrentHashMap<String, Integer> map = new ConcurrentHashMap<>();// 填充数据for (int i = 0; i < 100; i++) {map.put("key" + i, i);}// 并发遍历map.forEach(8, (key, value) -> System.out.println(key + ": " + value));}
}

Q6: 如何选择合适的Map实现类?

public class MapSelectionExample {public void demonstrateUsage() {// 1. 一般用途,非线程安全Map<String, Object> hashMap = new HashMap<>();// 2. 需要有序Map<String, Object> treeMap = new TreeMap<>();// 3. 需要记住插入顺序Map<String, Object> linkedHashMap = new LinkedHashMap<>();// 4. 需要线程安全Map<String, Object> concurrentMap = new ConcurrentHashMap<>();// 5. 需要同步Map<String, Object> synchronizedMap = Collections.synchronizedMap(new HashMap<>());// 6. 实现LRU缓存Map<String, Object> lruCache = new LinkedHashMap<>(16, 0.75f, true) {@Overrideprotected boolean removeEldestEntry(Map.Entry eldest) {return size() > 100; // 限制大小为100}};}// 使用场景示例public void usageScenarios() {// 1. 频繁插入删除HashMap<String, Object> hashMap = new HashMap<>();// 2. 需要排序TreeMap<String, Object> treeMap = new TreeMap<>();// 3. 需要保持插入顺序LinkedHashMap<String, Object> linkedHashMap = new LinkedHashMap<>();// 4. 高并发场景ConcurrentHashMap<String, Object> concurrentMap = new ConcurrentHashMap<>();}
}

面试关键点

  1. 理解HashMap的底层实现
  2. 掌握HashMap的扩容机制
  3. 了解TreeMap的排序原理
  4. 熟悉LinkedHashMap的特点
  5. 理解ConcurrentHashMap的并发机制
  6. 掌握Map的选择原则
  7. 注意线程安全问题
  8. 理解性能和内存消耗

相关文章:

Java Map实现类面试题

Java Map实现类面试题 HashMap Q1: HashMap的实现原理是什么&#xff1f; HashMap基于哈希表实现&#xff0c;使用数组链表红黑树&#xff08;Java 8&#xff09;的数据结构。 public class HashMapPrincipleExample {// 模拟HashMap的基本结构public class SimpleHashMap&…...

技术架构和工程架构区别

技术架构 技术架构‌是对某一技术问题解决方案的结构化描述&#xff0c;包括组件结构及其交互关系。它涵盖部署方案、存储方案、缓存方案、日志方案等多个方面&#xff0c;旨在通过组织人员和技术&#xff0c;以最低的成本满足需求和应对变化&#xff0c;保障软件的稳定高效运…...

简单介绍JVM

1.什么是JVM&#xff1f; JVM就是Java虚拟机【Java Virtual Machine】&#xff0c;简称JVM。主要部分包括类加载子系统&#xff0c;运行时数据区&#xff0c;执行引擎&#xff0c;本地方法库等&#xff0c;接下来我们一一介绍 2.类加载子系统 JVM中运行的就是我们日常写的JA…...

纷析云:赋能企业财务数字化转型的开源解决方案

在企业数字化转型的浪潮中&#xff0c;财务管理的高效与安全成为关键。纷析云凭借其开源、安全、灵活的财务软件解决方案&#xff0c;为企业提供了一条理想的转型路径。 一、开源的力量&#xff1a;自主、安全、高效 纷析云的核心优势在于其100%开源的财务软件源码。这意味着…...

DeepSeek开源周第二弹:DeepEP如何用RDMA+FP8让MoE模型飞起来?

一、引言&#xff1a;MoE模型的通信瓶颈与DeepEP的诞生 在混合专家&#xff08;MoE&#xff09;模型训练中&#xff0c;专家间的全对全&#xff08;All-to-All&#xff09;通信成为性能瓶颈。传统方案在跨节点传输时带宽利用率不足50%&#xff0c;延迟高达300μs以上。DeepSee…...

NLP学习记录十:多头注意力

一、单头注意力 单头注意力的大致流程如下&#xff1a; ① 查询编码向量、键编码向量和值编码向量分别经过自己的全连接层&#xff08;Wq、Wk、Wv&#xff09;后得到查询Q、键K和值V&#xff1b; ② 查询Q和键K经过注意力评分函数&#xff08;如&#xff1a;缩放点积运算&am…...

【MySql】EXPLAIN执行计划全解析:15个字段深度解读与调优指南

文章目录 一、执行计划核心字段总览二、关键字段深度拆解1. type&#xff08;访问类型&#xff09;——查询性能的晴雨表典型场景分析&#xff1a; 2. key_len&#xff08;索引使用长度&#xff09;——索引利用率的检测仪计算示例&#xff1a; 3. Extra&#xff08;附加信息&a…...

论文笔记(七十二)Reward Centering(五)

Reward Centering&#xff08;五&#xff09; 文章概括摘要附录B 理论细节C 实验细节D 相关方法的联系 文章概括 引用&#xff1a; article{naik2024reward,title{Reward Centering},author{Naik, Abhishek and Wan, Yi and Tomar, Manan and Sutton, Richard S},journal{arX…...

Linux内核自定义协议族开发指南:理解net_device_ops、proto_ops与net_proto_family

在Linux内核中开发自定义协议族需要深入理解网络协议栈的分层模型。net_device_ops、proto_ops和net_proto_family是三个关键结构体,分别作用于不同的层次。本文将详细解析它们的作用、交互关系及实现方法,并提供一个完整的开发框架。 一、核心结构体的作用与层级关系 struct…...

SOME/IP-SD -- 协议英文原文讲解6

前言 SOME/IP协议越来越多的用于汽车电子行业中&#xff0c;关于协议详细完全的中文资料却没有&#xff0c;所以我将结合工作经验并对照英文原版协议做一系列的文章。基本分三大块&#xff1a; 1. SOME/IP协议讲解 2. SOME/IP-SD协议讲解 3. python/C举例调试讲解 5.1.3.1 E…...

【数据处理】COCO 数据集掩码 Run-Length Encoding (RLE) 编码转二进制掩码

输入&#xff1a;结果.json 输出&#xff1a;mask.jpg json内容示例如下&#xff1a; {"labels":[ # class_id 1,2,3,...],"scores":[ # 置信度0.2,0.7,0.3,...],"bboxes":[[1244.0,161.0,1335.0,178.0],[1243.0,161.0,1336.0,178.0],[1242.0,1…...

Java中的缓存技术:Guava Cache vs Caffeine vs Redis

在Java中&#xff0c;缓存技术是提升应用性能的重要手段。常见的缓存技术包括Guava Cache、Caffeine和Redis。它们各有优缺点&#xff0c;适用于不同的场景。以下是对它们的详细对比&#xff1a; 1. Guava Cache 类型: 本地缓存 特点: 基于内存的缓存&#xff0c;适用于单机应…...

Day8 蓝桥杯acw讲解

首先先给大家看一道这个题&#xff0c; 我真的是太喜欢y总了&#xff0c;如果大家也是最近在准备蓝桥杯或者计算机相关的比赛&#xff0c;但是得加一个前提就是必须最好基础真的很好&#xff0c;要不然其实买了课&#xff0c;也没啥太大的用处&#xff0c;其实就可以以我本人举…...

《Operating System Concepts》阅读笔记:p147-p158

《Operating System Concepts》学习第 15 天&#xff0c;p147-p158 总结&#xff0c;总计 12 页。 一、技术总结 1.socket (1)定义 A socket is defined as an endpoint for communication(socket 是用于通信的端点&#xff0c;或者说socket 是通信端点的抽象表示。). A s…...

JSON Schema 入门指南:如何定义和验证 JSON 数据结构

文章目录 一、引言二、什么是 JSON Schema&#xff1f;三、JSON Schema 的基本结构3.1 基本关键字3.2 对象属性3.3 数组元素3.4 字符串约束3.5 数值约束 四、示例&#xff1a;定义一个简单的 JSON Schema五、使用 JSON Schema 进行验证六、实战效果6.1 如何使用 七、总结 一、引…...

java后端开发day20--面向对象进阶(一)--static继承

&#xff08;以下内容全部来自上述课程&#xff09; 1.static–静态–共享 static表示静态&#xff0c;是java中的一个修饰符&#xff0c;可以修饰成员方法&#xff0c;成员变量。 1.静态变量 被static修饰的成员变量&#xff0c;叫做静态变量。 特点&#xff1a; 被该类…...

FastJSON 默认行为:JSON.toJSONString 忽略 null 字段

完整的 FakeRegistrationController 代码&#xff0c;这让我可以全面分析后端逻辑&#xff0c;特别是为什么空的字段&#xff08;如 compareDate&#xff09;不返回给前端。我将详细分析代码的每个接口&#xff0c;尤其是与 list 请求和字段返回相关的部分&#xff0c;并解释原…...

数据结构:基数排序(c++实现)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》《C》《Linux》《网络》 《redis学习笔记》 文章目录 基数排序的定义和基本原理基本原理具体步骤 基数排序的优缺点&#xff1a;代码实现总结 基数排序的定义和基本原理 基数排序(Radix Sort)是一…...

DOM 事件 HTML 标签属性速查手册

以下是一份 DOM 事件 & HTML 标签属性速查手册&#xff0c;涵盖常用场景和示例&#xff0c;助你快速查阅和使用&#xff1a; 一、DOM 事件速查表 1. 鼠标事件 事件名触发时机适用元素示例代码click元素被点击任意可见元素button.addEventListener(click, () > { ... …...

PhotoShop学习01

了解Photoshop 这里省略了Photoshop的软件安装&#xff0c;请自行查找资源下载。 1.打开图片 下图为启动photoshop后出现的界面&#xff0c;我们可以通过创建新文件或打开已有文件来启用photoshop的工作界面。 可以通过左边的按钮进行新文件的创建或打开已有文件。 也可以点…...

云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?

大家好&#xff0c;欢迎来到《云原生核心技术》系列的第七篇&#xff01; 在上一篇&#xff0c;我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在&#xff0c;我们就像一个拥有了一块崭新数字土地的农场主&#xff0c;是时…...

Psychopy音频的使用

Psychopy音频的使用 本文主要解决以下问题&#xff1a; 指定音频引擎与设备&#xff1b;播放音频文件 本文所使用的环境&#xff1a; Python3.10 numpy2.2.6 psychopy2025.1.1 psychtoolbox3.0.19.14 一、音频配置 Psychopy文档链接为Sound - for audio playback — Psy…...

微服务商城-商品微服务

数据表 CREATE TABLE product (id bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT COMMENT 商品id,cateid smallint(6) UNSIGNED NOT NULL DEFAULT 0 COMMENT 类别Id,name varchar(100) NOT NULL DEFAULT COMMENT 商品名称,subtitle varchar(200) NOT NULL DEFAULT COMMENT 商…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

用docker来安装部署freeswitch记录

今天刚才测试一个callcenter的项目&#xff0c;所以尝试安装freeswitch 1、使用轩辕镜像 - 中国开发者首选的专业 Docker 镜像加速服务平台 编辑下面/etc/docker/daemon.json文件为 {"registry-mirrors": ["https://docker.xuanyuan.me"] }同时可以进入轩…...

基于matlab策略迭代和值迭代法的动态规划

经典的基于策略迭代和值迭代法的动态规划matlab代码&#xff0c;实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)

本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...

C++.OpenGL (20/64)混合(Blending)

混合(Blending) 透明效果核心原理 #mermaid-svg-SWG0UzVfJms7Sm3e {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-icon{fill:#552222;}#mermaid-svg-SWG0UzVfJms7Sm3e .error-text{fill…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...