美团太细了,HashMap可以存null,ConcurrentHashMap不可以,为什么?

Java面试高频考点深度解析:HashMap、并发、JVM与MySQL索引 在Java技术体系中,数据结构与算法是构建高效应用的基石。以HashMap为例,其底层通过数组与链表(或红黑树)的组合实现键值对存储,并利用哈希函数与位运算快速定位元素,核心原理在于平衡哈希冲突与查询效率。理解这一机制对于设计高并发、低延迟的系统至关重要,尤其在缓存、会话管理等场景中广泛应用。ConcurrentHashMap则在此基础上,通过分段锁或CAS+synchronized的精细化锁策略,解决了HashMap的线程安全问题,体现了Java并发编程中安全与性能的权衡。同时,JVM的内存模型与垃圾回收 阅读详情

点击上方“芋道源码”,选择“设为星标”

管她前浪,还是后浪?

能浪的浪,才是好浪!

每天 10:33 更新文章,每天掉亿点点头发...

源码精品专栏

 

来源:Hollis


5817fbcf633bf2be06939cee584a605f.jpeg

我们知道,ConcurrentHashMap在使用时,和HashMap有一个比较大的区别,那就是HashMap中,null可以作为键或者值都可以。而在ConcurrentHashMap中,key和value都不允许为null。

那么,为什么呢?为啥ConcurrentHashMap要设计成这样的呢?

关于这个问题,其实最有发言权的就是ConcurrentHashMap的作者——Doug Lea。

他自己曾经出面解释过这个问题,内容如下(原文地址已经打不开了,大家将就着看一下截图吧) :

9c93d7842237ccbc4daec37c72265ec0.png


基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/ruoyi-vue-pro

  • 视频教程:https://doc.iocoder.cn/video/

主要意思就是说:

ConcurrentMap(如ConcurrentHashMap、ConcurrentSkipListMap)不允许使用null值的主要原因是,在非并发的Map中(如HashMap),是可以容忍模糊性(二义性)的,而在并发Map中是无法容忍的。

假如说,所有的Map都支持null的话,那么map.get(key)就可以返回null,但是,这时候就会存在一个不确定性,当你拿到null的时候,你是不知道他是因为本来就存了一个null进去还是说就是因为没找到而返回了null。

在HashMap中,因为它的设计就是给单线程用的,所以当我们map.get(key)返回null的时候,我们是可以通过map.contains(key)检查来进行检测的,如果它返回true,则认为是存了一个null,否则就是因为没找到而返回了null。

但是,像ConcurrentHashMap,它是为并发而生的,它是要用在并发场景中的,当我们map.get(key)返回null的时候,是没办法通过通过map.contains(key)检查来准确的检测,因为在检测过程中可能会被其他线程锁修改,而导致检测结果并不可靠。

所以,为了让ConcurrentHashMap的语义更加准确,不存在二义性的问题,他就不支持null。

基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

  • 项目地址:https://github.com/YunaiV/yudao-cloud

  • 视频教程:https://doc.iocoder.cn/video/



欢迎加入我的知识星球,一起探讨架构,交流源码。加入方式,长按下方二维码噢:

da088e37cdacb75c0866e1ec64179552.png

已在知识星球更新源码解析如下:

b0d14c221b8a318c7190e697334ed36a.jpeg

0ea061ecaa02b8cc7b16168c9d959412.jpeg

7d968970ed25e4a2ac0900bfabcc4cce.jpeg

85f6715e368b6c9bb8a891a5c7755b7b.jpeg

最近更新《芋道 SpringBoot 2.X 入门》系列,已经 101 余篇,覆盖了 MyBatis、Redis、MongoDB、ES、分库分表、读写分离、SpringMVC、Webflux、权限、WebSocket、Dubbo、RabbitMQ、RocketMQ、Kafka、性能测试等等内容。

提供近 3W 行代码的 SpringBoot 示例,以及超 4W 行代码的电商微服务项目。

获取方式:点“在看”,关注公众号并回复 666 领取,更多内容陆续奉上。

文章有帮助的话,在看,转发吧。
谢谢支持哟 (*^__^*)
美团面试拷打:ConcurrentHashMap 为何不能插入 null?HashMap 为何可以? 周末的时候,有一位小伙伴提了一些关于的问题,都是他最近面试遇到的。原提问如下(星球原贴地址:https://t.zsxq.com/11jcuezQs ):下面我会以此提供这两个问题的详细答案,希望对你有帮助。 阅读详情

相关推荐

阿里P5初级Android面经:Java集合源码、ArrayList扩容、HashMap原理、线程安全集合

本文总结了阿里巴巴Java面试的核心考点,重点剖析了Java集合框架的底层实现原理。文章对比了阿里与腾讯的面试风格差异,指出阿里更注重技术深度挖掘。核心内容包括:ArrayList扩容机制(1.5倍增长、数组拷贝)、LinkedList与ArrayList的性能对比、HashMap在JDK1.8的优化(红黑树、扰动函数)、线程安全集合的实现差异(ConcurrentHashMap的CAS+synchronized机制)等。特别强调阿里面试要求源码级理解,如HashMap的put过程、扩容策略等实现细节。

郑伟强dev的专栏 41

HashMap详解

https://www.bilibili.com/video/BV1vE411v7cR(b站视频参考) https://blog.youkuaiyun.com/zs319428/article/details/81982770(HashMap的长度为什么要是2的n次方) https://blog.youkuaiyun.com/ThinkWon/article/details/104588551(Java集合容器面试题(2020最新版)) https://blog.youkuaiyun.com/h1458280799/article/de

qq_40278997的博客 243

手把手教你用AppsFlyer SDK实现延迟深度链接(附Android/iOS代码示例)

本文详细介绍了如何使用AppsFlyer SDK实现延迟深度链接,提供Android和iOS双平台代码示例,帮助开发者解决跨平台精准跳转与用户归因问题。通过实战案例和高级场景分析,提升应用的用户转化率和广告投放效果。

sre5engineer的博客 704

【HashMap】key和value能否为null

这就出现了一个问题:当A线程使用containsKey()进行判断时,发现有这个元素,当他调用get()取这个元素时,B线程加入了进来,B线程将这个元素移除掉了,此时A线程取得的值为null,A线程会以为自己取到了这个值,但实际上此时的null是未找到的null。发现没有,如果value值能为null,那么我传入对应的key值,他找到了返回的是value值,也就是null,当找不到时,他也返回的是null。key值不能重复,若添加key相同的键值对,后面的value会自动覆盖前面的value,但不会报错。

weixin_44823875的博客 1万+

解决鸿蒙/荣耀设备GMS应用调试中的“Play保护机制认证”报错

本文详细解析了在鸿蒙或荣耀设备上调试GMS应用时,遇到“Play保护机制认证”报错的根本原因与解决方案。核心在于获取设备的GMS Device ID,并通过Google官方渠道完成临时注册,从而绕过认证限制。文章提供了无需Root和ADB查询两种具体方法,并分享了授权后的故障排查与实战经验,帮助开发者高效解决问题。

weixin_29288313的博客 301

Linux内核4.14版本——drm框架分析(1)——drm简介

drm框架分析

yangguoyu8023的博客 1万+

Map集合的学习

1 概念 Collection 中的集合,元素是孤立存在的(理解为单身),向集合中存储元素采用一个个元素的方式存储。 Map 中的集合,元素是成对存在的(理解为夫妻)。每个元素由键与值两部分组成,通过键可以找对所对应的 值。 Collection 中的集合称为单列集合, Map 中的集合称为双列集合。 注意: Map 中的集合不能包含重复的键,值可以重复;每个键只能对应一个值。 特点: 1,Map集合是一个双列集合,一个元素包含两个值(一个key,一个value) 2,Map集合中的元素,ke

qq_29479019的博客 894

嵌入式AI实战:基于RK3588部署YOLOv11并集成OpenCV实现实时推理(全流程详解)

本文详细介绍了在RK3588芯片上部署YOLOv11目标检测模型的全流程,包括环境搭建、模型转换和实时推理实现。主要内容为:1)通过YOLOv11官方工具将PyTorch模型转为ONNX格式;2)使用RKNN Toolkit2将ONNX模型转换为适配RK3588的RKNN格式;3)在RK3588上结合OpenCV实现实时视频推理功能。教程提供了完整的代码示例和详细步骤说明,帮助开发者快速在边缘设备上部署目标检测模型,实现AI视觉应用的落地。

LXY_LOVE36的博客 214

hashMap

hashMap基于hashing原理,通过put()和get()方法储存和获取数据。 当我们将键值对传递给put()方法时,它会调用hashcode()方法获取hashcode,找到链表的bucket位置储存键值对对象。 当我们获取值对象时,get()方法会调用keys.hashcode()获取hashcode,找到链表的bucket位置,然后调用keys.equals()方法找到键值对对象,然后获取值对象。 当发生碰撞问题时,对象会存储到链表的下一个节点中,hashMap是在链表节点中存储键值对对象。 h

weixin_43325098的博客 1860

C#上位机与西门子PLC全链路通信实战教程:数据采集+SQL存储+数据库报表查询+报警历史完整实现

在工业自动化领域,西门子PLC(S7-200Smart/1200/1500)凭借稳定的性能、强大的功能、完善的生态,稳居工业控制器的主流地位;而凭借开发效率高、界面美观、兼容性强、数据库操作便捷的优势,成为工业上位机开发的首选编程语言。二者的组合,是目前制造业、自动化产线、智能仓储、暖通自控等场景的绝对主流方案,也是工业上位机工程师必须吃透的核心技术栈。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 1865

执行HDevelop项目

这一节,我们讲述的是如何用HDevEngine加载和执行一个HDevelop项目。代码部分来源于示例程序exec_program(源文件exec_program.cpp),检测塑料零件边界上的毛刺。1.Step 1:初始化首先,我们包含HALCON/C++和HDevEngine头文件以及命名空间。注意到在这个示例程序中,HDevEngine头文件已经包含在my_hdevoperatorimpl中,所

Z's Palace 2997

ConcurrentHashMap为什么不能添加null值

首先看hashMap为什么能为null: 首先hashMap的设计是为单线程设计的,我们知道hashMap的get方法中传入的参数如果hashMap中不存在的话就会返回null,假设hashMap中有一个key是null 1存在返回的是null,2不存在返回的也是null,这样不就有两重含义了吗 但是hashMap可以解决这个问题,hashMap中有一个方法containsKey 这样是不是就可以区分了。 然后看ConcurrentHashMap: 有人想问了,ConcurrentH

qq_55768596的博客 2323

Nvidia Jetson 编解码开发(3)解决H265解码报错“PPS id out of range”

基于之前的开发程序通过Jetson Xavier NX 硬编码的H265发出后,上位机断点播放发出来的H265码流,会报“PPS id out of range” 错误。

jzwjzw19900922的博客 3812

每日一面系列之美团面试拷打:ConcurrentHashMap 为何不能插入 null?HashMap 为何可以

可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个。关于ConcurrentHashMap的key,value设计为不能是null的原因_concurrenthashmap key不能为null。如果你确实需要在 ConcurrentHashMap 中使用 null 的话,可以使用一个特殊的静态空对象来代替 null。也就是说,多线程下无法正确判定键值对是否存在(存在其他线程修改的情况),单线程是可以的(不存在其他线程修改的情况)。

u013452335的博客 1242

lammps案例:聚乙烯和石墨烯界面pull out模拟

大家好,我是小马老师。 本文介绍lammps模拟计算界面结合力的一个案例。 本案例参考论文《The interfacial mechanical properties of functionalized graphene- polymer nanocomposites》,对论文作者表示感谢。 模型共分2层,上层为聚乙烯模型,下次为单层石墨烯,模拟过程共分3部分:建模、弛豫、拉伸。 (1)建模 使用MS建立聚乙烯和石墨烯模型,具体方法可参考之前的推文,使用build layer方法建立聚乙烯和石墨烯组合模型,

lammps_jiayou的博客 3496

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

HashMap与ConcurrentHashMap核心原理及面试实战解析

哈希表作为基础数据结构,通过键值映射实现高效数据存取。其核心原理包括哈希函数设计、冲突解决策略(链表+红黑树)和动态扩容机制。在并发场景下,ConcurrentHashMap采用分段锁和CAS优化实现线程安全,相比HashMap显著提升多线程性能。实际工程中,合理设置初始容量和负载因子可避免性能陷阱,这在电商、金融等高并发系统尤为重要。本文通过大厂面试真题,深入解析HashMap与ConcurrentHashMap的底层实现差异,并分享性能调优实战经验,帮助开发者掌握这一Java集合框架的核心组件。

weixin_30675247的博客 289

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

美团面试题:Hashmap的结构,1.7和1.8有哪些区别,深入的分析

JDK1.7与1.8的HashMap核心区别: 数据结构:1.7为数组+链表,1.8引入红黑树(链表长度≥8时树化); 插入方式:1.7头插法易导致环形链表,1.8改为尾插法; 扩容机制:1.7先扩容后插入,1.8先插入后扩容; 哈希计算:1.7扰动9次,1.8优化为2次; 线程安全:均非线程安全,1.8减少死循环风险但仍有数据覆盖问题。 面试要点: 默认负载因子0.75平衡空间与时间效率; 树化阈值8基于泊松分布概率极低,退化阈值6避免频繁转换; 推荐结合源码分析resize()、putVal()等关键方

ywl470812087的博客 11万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Java大厂面试核心:HashMap与线程池深度解析

Java集合框架与并发编程是面试中的高频考点,其中HashMap和线程池的实现原理尤为重要。HashMap采用数组+链表+红黑树结构,通过哈希计算优化和扩容机制保证高效查找,但需注意线程安全问题如环形链表。线程池通过corePoolSize、maximumPoolSize等参数配置实现资源管理,合理设置可避免死锁并提升系统吞吐量。理解这些底层机制不仅能应对大厂面试,更能帮助开发者编写高性能、高可用的Java应用。在实际开发中,HashMap常用于缓存实现,线程池则广泛用于异步任务处理等场景。

weixin_30263073的博客 496

Java HashMap核心原理与高频面试题解析

哈希表作为基础数据结构,通过键值对存储实现高效数据访问。其核心原理是通过哈希函数将键映射到数组索引,采用链地址法解决哈希冲突。在Java中,HashMap经过多版本迭代,JDK1.8引入红黑树优化,将最坏时间复杂度从O(n)降至O(logn)。这种数据结构优化对系统性能提升显著,特别适用于高频查询场景如缓存实现、数据库分片等。面试中常考察其线程安全问题和扩容机制,理解ConcurrentHashMap的分段锁与CAS优化差异是进阶关键。通过合理设置初始容量和负载因子,能有效避免HashMap在实战中的性能瓶

weixin_30325487的博客 453

Hashmap

(1)美团面试题:Hashmap的结构,1.7和1.8有哪些区别,史上最深入的分析 HashMap, ConcurrentHashMap 原理及源码,一次性讲清楚! JDK1.7的时候使用的是数组+ 单链表的数据结构。 JDK1.8及之后时,使用的是数组+链表+红黑树的数据结构。 注: 当链表的深度达到8的时候,也就是默认阈值,就会自动扩容把链表转成红黑树的数据结构, 把时间复杂度从O(n)变成O(nlogN)提高了效率 ...

静__嘘的博客 264

从2012年美团笔试看技术基本功:算法、并发与系统设计

在技术面试中,算法与数据结构、Java并发、数据库索引与缓存设计始终是衡量工程师基本功的核心标尺。理解这些底层原理,不仅是应对笔试的关键,更是工程实践中解决性能瓶颈与系统稳定性的基础。从TopK问题的最小堆解法、HashMap的线程安全演变,到B+树索引优化与缓存穿透的应对策略,每一个经典考点都对应着真实业务场景中的技术取舍。本文以2012年美团笔试题型为切入点,系统梳理这些高频知识点的原理与工程应用,剖析从海量数据处理到订单系统设计的完整思维链路,帮助开发者建立以底层能力驱动的技术成长路径,从而更从容地应

weixin_33762130的博客 315

Java面试深度解析:HashMap线程安全与Spring Boot自动配置

在Java开发中,HashMap作为核心数据结构,其线程安全问题是并发编程的经典议题。从JUC包的ConcurrentHashMap分段锁设计,到JDK8引入的CAS优化,反映了Java并发模型向细粒度锁发展的趋势。Spring Boot的自动配置机制通过@Conditional系列注解实现条件化装配,其背后的Starter规范与自动配置类加载流程,体现了约定优于配置的设计哲学。这些技术不仅关系到系统的高并发能力,也直接影响着微服务架构下的组件集成效率。通过分析HashMap死循环问题与Spring Boo

weixin_34152820的博客 334
上一篇: 分布式中灰度方案就该这样设计!
下一篇: 让 GPT-4 帮我设计一个分布式缓存系统,从尝试到被我逼疯!
公众号-芋道源码
博客等级 码龄10年 1634粉丝 377原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值