《面试1v1》Map

news2024/11/24 20:05:32

我是 javapub,一名 Markdown 程序员从👨‍💻,八股文种子选手。


《面试1v1》 连载中…


面试官: 小伙子,又来挑战你了。听说你对Java集合中的Map也很在行?

候选人: 谢谢夸奖,Map这个接口的确非常重要且强大。但和List一样,它有许多实现类,而我对它们的理解还远未充分,只能算入门。我仍需不断学习与总结。

面试官: 那好,简单介绍下Map这个接口及常用实现类。它在开发中有何作用?

候选人: Map接口表示一个键值对集合,它的主要作用是根据键快速获取值。常用实现类有:

  1. HashMap:基于哈希表实现,支持快速查找、插入和删除,但迭代顺序不定。
HashMap<String, Integer> map = new HashMap<>();
  1. LinkedHashMap:保留插入顺序,除了查找效率高于LinkedHashMap外,其他方面与HashMap相同。
LinkedHashMap<String, Integer> map = new LinkedHashMap<>();
  1. TreeMap:基于红黑树实现,键有序,增删慢但查找快,特别适合排序需求。
TreeMap<String, Integer> map = new TreeMap<>(); 
  1. Hashtable:和HashMap类似,但它是线程安全的,效率略低。
Hashtable<String, Integer> map = new Hashtable<>();  

Map在日常开发中用途广泛,例如缓存、查询表等。我最常用的当属HashMap,由于其查询效率高且适用于大容量场景。但我对其扩容、碰撞处理等机制还需进一步理解。

面试官: 不错,你对Map有比较扎实的认知基础。那么你对HashMap的源码熟悉吗?能否解析一下?

候选人: HashMap的源码实现较复杂,我这里仅解析其基本结构与重要流程。主要包括:

  1. HashMap底层采用数组+链表实现,数组是主干,链表在碰撞场景下使用。
  2. 字段包括:数组table,容量capacity,加载因子loadFactor等。
// 默认初始容量16,必须是2的n次方
static final int DEFAULT_INITIAL_CAPACITY = 1 << 4;   

// 最大容量
static final int MAXIMUM_CAPACITY = 1 << 30;

// 默认加载因子0.75
static final float DEFAULT_LOAD_FACTOR = 0.75f;

  1. put方法将键值对添加到表中。先计算键的hash值得到数组下标,然后将新键值对添加到该位置或链表中。
  2. 如果键所在的链表过长或超过加载因子,则触发rehash,即扩容与重新哈希,容量加倍。
void addEntry(int hash, K key, V value, int bucketIndex) {
    // 保存旧表
    Entry<K,V> old = table[bucketIndex];
    
    // 创建新键值对,next指向旧表
    Entry<K,V> newEntry = new Entry<>(hash, key, value, old);
    
    // 更新数组对应位置
    table[bucketIndex] = newEntry;
    
    // 如果旧表不为空且旧表的键与新键hash值相同,则发生哈希碰撞
    if (old != null && hash == old.hash && 
        (old.getKey() == key || old.getKey().equals(key))) 
        old = newEntry;
            
    if (size++ >= threshold) 
        resize(2 * table.length);   // 扩容
}

HashMap的源码实现还有很多精妙的地方,我还需要继续学习。但总体来说,它通过拉链法处理碰撞,并提供动态扩容机制来保证高效插入与查询。这也是它成为我最爱的Map实现类的原因。

面试官: HashMap的源码解析得不错,你理解得比较透彻。的确,它的实现机制相当精巧,需要深入学习与理解。你之前提到也有些不太理解的地方,想加深学习的内容,能否简单提一下?

候选人: 关于HashMap,我还希望进一步学习的内容如下:

  1. 树化过程:何时进行树化,如何选择红黑树还是二叉查找树。
  2. 扩容的全过程:扩容时,旧键值对的重新映射策略与性能影响。
  3. 哈希函数:不同的哈希函数对HashMap性能的影响。
  4. 链表转红黑树的条件:何时应选择链表还是红黑树来解决哈希冲突。
  5. ConcurrentHashMap:它的实现原理与代理模式。
  6. IdentityHashMap:键比较使用==而非equals,其典型应用场景。
  7. WeakHashMap:其释放键值对的条件与实现原理。
  8. ** serialization**:不同Map实现类的序列化方式与注意事项。
  9. Null键值处理:不同Map中null键与null值的处理方式。

这些都是我想继续学习与理解的Map相关内容,我会根据这份清单进一步深入阅读源码、分析案例并实践,以便全面掌握Map及各实现类。这需要投入大量时间与精力,但我相信这会让我的Java基础更加扎实。

面试官: Wonderful!你对Map及其实现类一定有比较深入的理解和认知,才能准确地指出自己还需加深学习的知识点。这份学习清单也同样具有针对性,只要能够逐项进行深入学习,定会有很大的提高。

我很欣赏你的学习热情与主动性,这些都是成为一名优秀工程师必不可少的素质。继续保持,深入学习,你的Java基础会更加牢固,技术生涯也会更上一层楼。

最近我在更新《面试1v1》系列文章,主要以场景化的方式,讲解我们在面试中遇到的问题,致力于让每一位工程师拿到自己心仪的offer,感兴趣可以关注JavaPub追更!


《面试1v1》 连载中…


🎁目录合集:

Gitee:https://gitee.com/rodert/JavaPub

GitHub:https://github.com/Rodert/JavaPub

http://javapub.net.cn

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/644515.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringMVC原理分析 | JSON、Jackson、FastJson

&#x1f497;wei_shuo的个人主页 &#x1f4ab;wei_shuo的学习社区 &#x1f310;Hello World &#xff01; JSON JSON&#xff08;JavaScriptObject Notation&#xff0c;JS对象简谱&#xff09;是一种轻量级的数据交换格式。它基于 ECMAScript&#xff08;European Computer…

无自注意力照样高效!RIFormer开启无需token mixer的Transformer结构新篇章

©PaperWeekly 原创 作者 | 岳廷 研究方向 | 计算机视觉 引言 论文地址&#xff1a; https://openaccess.thecvf.com/content/CVPR2023/papers/Wang_RIFormer_Keep_Your_Vision_Backbone_Effective_but_Removing_Token_Mixer_CVPR_2023_paper.pdf 问题&#xff1a;Vision …

如何将代码中的相关调试信息输出到对应的日志文件中

一、将调试信息输出到屏幕中 1.1 一般写法 我们平常在写代码时&#xff0c;肯定会有一些调试信息的输出&#xff1a; #include <stdio.h> #include <stdlib.h>int main() {char szFileName[] "test.txt";FILE *fp fopen(szFileName, "r")…

R语言 tidyverse系列学习笔记(系列5)dplyr 数据分析之across

成绩单 score install.packages("dplyr") library(dplyr)install.packages("tibble") library(tibble)install.packages("stringr") library(stringr)score tibble(IDc("1222-1","2001-0","3321-1","4898-…

MySQL(八):排序与分页

排序与分页 前言一、排序数据1、排序规则2、单列排序3、多列排序 二、分页1、背景2、实现规则3、拓展 前言 本博主将用CSDN记录软件开发求学之路上亲身所得与所学的心得与知识&#xff0c;有兴趣的小伙伴可以关注博主&#xff01;也许一个人独行&#xff0c;可以走的很快&…

从零开始Vue项目中使用MapboxGL开发三维地图教程(三)添加全屏,缩放旋转和比例控制面板以及自定义图标、标记点击弹窗、地图平移等功能

文章目录 1、添加各种控制面板1.1、添加全屏1.2、缩放旋转控制1.3、比例尺 2、获取并显示鼠标移动位置的经纬度坐标3、添加图标3.1、添加图片图层的图标3.2、添加带有标记的自定义图标3.3、悬停时显示弹出窗口 1、添加各种控制面板 1.1、添加全屏 //添加全屏控制this.map.addC…

管理类联考——逻辑——知识篇——第一章 性质命题

第一章 性质命题&#xff08;最基础&#xff0c;最难*****&#xff09; 一、性质命题定义&#xff08;必考&#xff09; 判断事物具有或不具有某种性质的命题。 二、性质命题的四种基本形式 全称肯定&#xff1a;①所有的A都是B 全称否定&#xff1a;②所有的A不是B 特称肯…

Nature子刊:光遗传在绒猴执行检测任务中的行为效应

狨猴体型小&#xff0c;具有巨大的基因修饰潜力&#xff0c;并可表现复杂的行为&#xff0c;已经成为神经科学领域的一个关键模型。 德国恩斯特斯特朗格曼神经科学研究所与马克斯普朗克学会的研究人员设计了一种轻质的、3D打印的植入物&#xff0c;利用高密度硅基微电极阵列&am…

Monorepo vs. Microrepo: 选择适合你的代码仓库策略

简介 在软件开发领域&#xff0c;选择合适的代码仓库策略对于优化协作、可扩展性和代码质量至关重要。Monorepo和Microrepo是两种流行的方法&#xff0c;它们提供了各自的优势和考虑因素。本文将探讨这两种策略的特点&#xff0c;解释为何不同的公司选择不同的选项&#xff0c;…

基于Hexo和Butterfly创建个人技术博客,(5) 使用Hexo的Tags Plugin插件增强博客文章内容和视觉表现力

Hexo官司网查看 这里 注意&#xff1a; Tags语法是Hexo插件提供的&#xff0c;是非标准语言&#xff0c;写文章时要注意以下几点&#xff1a; 用于在文章中快速插入特定的内容&#xff0c;作用等同于其它语言&#xff0c;可理解为一种增强版本的markdown&#xff1b;可混合Mark…

Linux系统编程学习 NO.7 ——sudo配置、编译器的使用

引言&#xff1a; 现在是北京时间2023年6月14日8点16分&#xff0c;期末考试在即&#xff0c;重心可能得转移到考试上了。不过想到马上就可以回家陪家人过端午节&#xff0c;还是非常开心的。放暑假了就可以好好陪家人了。尝试一下换个环境复习吧&#xff0c;洗漱一下就去图书…

智见|比亚迪廉玉波:2023年销量目标300万辆

营收4240亿元&#xff0c;同比增长96%&#xff1b;归属上市公司股东净利润166亿元&#xff0c;同比增长445.86%&#xff1b;累计销售186.85万辆&#xff0c;同比增长152.5%……这是2022年比亚迪的成绩单。 据比亚迪披露&#xff0c;仅2022年一年新能源汽车的销量&#xff0c;就…

【重要】MThings V0.5.0更新要点

再见了BUG&#xff0c;为了改善质量&#xff0c;我们已修正了一些问题&#xff0c;以便您能继续富有成效且令人敬畏。 下载地址&#xff1a; http://gulink.cn/download 01. [新增]支持数据网关功能。 数据网关功能提供协议转换和数据汇聚功能&#xff0c;可实现不同的通道类型…

1--Gradle入门 - 简介、安装、目录结构、创建项目

1--Gradle入门 - 简介、安装、目录结构、创建项目 Gradle 官网 Gradle官网地址&#xff1a;Gradle Build Tool Gradle官方下载安装教程页面&#xff1a;https://gradle.org/install/ Gradle官方用户手册&#xff1a;https://docs.gradle.org/current/userguide/userguide.html …

4--Gradle入门 - 创建普通的web工程

4--Gradle入门 - 创建普通的web工程 前言 上一篇&#xff0c;我们已经创建了java工程&#xff0c;本篇章再来创建web工程。 “ 其实没啥用&#xff0c;还是研究如何部署 Springboot 环境就好了 ” 创建普通的web工程 1. 新建 gradle 管理的工程项目 1685862847224 2. 设置项目使…

前端构建工具的未来

本文作者系360奇舞团前端开发工程师 本文为翻译 原文标题&#xff1a;The Future Of Frontend Build Tools 原文作者&#xff1a;Alexander Joseph 原文链接&#xff1a;https://www.smashingmagazine.com/2022/06/future-frontend-build-tools/ 前端构建工具对现代前端开发者的…

基于SpringCloud+Vue房产销售平台的设计与实现

博主介绍&#xff1a; 大家好&#xff0c;我是一名在Java圈混迹十余年的程序员&#xff0c;精通Java编程语言&#xff0c;同时也熟练掌握微信小程序、Python和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架下…

数据库从业者在行业的变革下------越来越难

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

有趣的数学 依靠想象力的微积分

1、无限分割计算圆的面积 考虑将圆切成若干等份&#xff0c;下图为4等份。 下图为8等份。 下图为16等份。 下图为最终想象出来的极限矩形&#xff0c;据此分割为无穷等份的圆拼接为一个矩形。 矩形的面积 r * C / 2。 r为半径&#xff0c;C为周长。 2、夹逼法计算圆周率 借助…

使用SwinTransformer进行图片分类

SwinTransformer 是微软亚洲研究院在2021年提出的适用于CV领域的一种基于Tranformer的backbone结构。 它是 Shift Window Transformer 的缩写&#xff0c;主要创新点如下。 1&#xff0c;分Window进行Transformer计算&#xff0c;将自注意力计算量从输入尺寸的平方量级降低为线…