HashMap底层源码

HashMap 底层源码解读(一行一行读,有基础就能看懂) HashMap 源码解读,完全把底层原理搞懂 阅读详情

​

这里是修真院后端小课堂,每篇分享文从

本篇分享的是:【HashMap 】

(1)背景介绍:

不讲HashMap的使用方法,看一看底层的源码是什么?

思考:HashMap使用key,·value进行存储,使用的数据结构是什么?

我们知道数组和链表两种数据结构

数组:

优点:查询速度快

缺点:增加和删除慢

链表:

优点:增加和删除快

缺点:查询速度慢

那我们可不可以将两者的优点结合一下,达到查询、增加、删除效率都非常快呢?

所以我们猜测一下,HashMap能否源码底层数据结构是采用的链表+数组的形式呢?

(2)知识剖析:

1.HashMap数据底层具体存储的是什么?

Java是一门面向对象开发的语言,可以把所有东西可以看做是对象。

通过查看源码可知:map里面的key和value都保存在了这个Node对象里面。

class Node<K,V>{

private K key;   //用来定位数组索引位置

private V value;

private Node<K,V> next;  //链表的下一个node

}

2.数组怎么表示?

transient Node< K,V>[] table;

每个列表被称为桶,即哈希桶数组,是一个Node的数组。

HashMap使用哈希表进行存储。怎样得到表中对象的索引位置?

key.hashCode( )----->hashCode----->Hash算法的高位运算和取模运算----->得到存储位置

有时两个key会定位到相同的位置,就发生了Hash碰撞。Hash算法计算结果越分散均匀,Hash碰撞的概率就越小,map的存取效率就会越高。

如果哈希桶数组很大,即使较差的Hash算法也会比较分散,如果哈希桶数组数组很小,即使好的Hash算法也会出现较多碰撞。

3.数组要不要有一个大小呢?

学过数组都知道,要给数组一个初始化大小,那么HashMap有没有大小呢?

Defalutsize = … 初始大小???

Maxmumsize = … 上限大小???

肯定是要有的。

4.数组初始大小是多少呢?

从源码可以看到

static final int DEFAULT_INITIAL_CAPACITY = 1 << 4; // aka 16

初始大小是16

如果初始大小不够用,或者达到某个值,是不是要进行数组大小的扩容?

final Node<K,V>[] resize()

5.扩容是不是要有一个依据?

int threshold = 16; Node[] table的初始化长度

transient int size; HashMap中实际存在的键值对数量

size > threshold * 小于1的小数

实际使用的size肯定不可能达到16才进行扩容,那样会损失性能,一定要达到一个点就进行扩容,这个点是0.25 0.5 0.75哪一个呢?

源码中定义了一个扩容因子

static final float DEFAULT_LOAD_FACTOR = 0.75f

size = threshold * Load factor ----->16 * 0.75 =12

所以在12的时候就会进行扩容。

为什么要选择0.75?

默认的负载因子0.75是对空间和时间效率的一个平衡选择,建议大家不要修改,除非在时间和空间比较特殊的情况下,如果内存空间很多而又对时间效率要求很高,可以降低负载因子Load factor的值;相反,如果内存空间紧张而对时间效率要求不高,可以增加负载因子loadFactor的值,这个值可以大于1。

6.链表的是不是需要一个长度限制呢?

负载因子和Hash算法设计的再合理,也免不了会出现拉链过长的情况,一旦出现拉链过长,则会严重影响HashMap的性能。链表达到一个限制值后,是否需要进行一个改变?

在JDK1.8版本中,对数据结构做了进一步的优化,引入了红黑树。

当链表长度太长时,链表就转换为红黑树,利用红黑树快速增删改查的特点提高HashMap的性能

源码中定义,当链表超过8时,就转化为红黑树

static final int TREEIFY_THRESHOLD = 8;

7.Node节点到底存在哪里?

存在哪里要有一个位置,这个位置就是通过计算得来的。

利用这个key进行一个计算,计算出这个Node应该存在哪里。

想知道key,value存放在HashMap结构中的位置,使用hash函数,源码的实现(方法一+方法二):

方法一:

static final int hash(Object key) { //jdk1.8 & jdk1.7

 int h;

 // h = key.hashCode() 为第一步 取hashCode值

 // h ^ (h >>> 16)  为第二步 高位参与运算

 return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);

}

方法二:

static int indexFor(int h, int length) { //jdk1.7的源码,jdk1.8没有这个方法,但是实现原理一样的

 return h & (leng

(3)常见问题:

HashMap线程安全吗?

(4)解决方案:

HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全在多线程使用场景中,应该尽量避免使用线程不安全的HashMap,而使用线程安全ConcurrentHashMap。

(5)编码实战:

比如我的一个key的哈希值

h=hashCode():

11111111111111111111000011101010

h>>>16:

00000000000000001111111111111111

hash=h^(h>>>16):

11111111111111110000111100010101

(n-1)&hash:

11111111111111110000111100010101

最后取后四位0101转换成十进制就是5

(6)拓展思考:

JDK1.8与JDK1.7的性能对比?

JDK1.8引入红黑树大程度优化了HashMap的性能。

(7)参考文献:

Java 8系列之重新认识HashMap——美团技术团队

(8)更多讨论:

Q1.Map集合还有哪些实现类?

A1:LinkedHashMap、Hashtable和treeMap

Q2.HashMap为什么要保证hashmap的容量为2的幂次方?

A2:HashMap容量为2的幂次方,是为了减小哈希冲突,因为如果存在哈希冲突的时候,存储entry的时候,会出现一个位置上存在多个entry的情况,会造成读写速度的降低;使用2的幂次方的容量,存储的时候,会根据key的哈希值跟hashmap的(容量-1)进行位运算,这样的运算,当(容量-1)的二进制数全为1的时候,存储位置的计算结果是哈希冲突最小的。

Q3.HashMap优缺点?

A3:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最多只允许一条记录的键为null,允许多条记录的值为null。HashMap非线程安全,即任一时刻可以有多个线程同时写HashMap,可能会导致数据的不一致。如果需要满足线程安全,可以用 Collections的synchronizedMap方法使HashMap具有线程安全的能力,或者使用ConcurrentHashMap。

(9)鸣谢:

java集合之Map篇——HashMap(底层源码非常详细说明) 前面先做了红黑树的讲解,就是为了为了Map集合做铺垫,Map的几个实现集合底层都用到了红黑树。由于HashMap的东西有点多,HashTable和TreeMap下篇再说明。 阅读详情

相关推荐

一文读懂HashMap底层源码

![[Pasted image 20250122192925.png]]![[Pasted image 20250122170458.png]]![[Pasted image 20250122185610.png]]在 Java 中,数组的最大索引是 Integer.MAX_VALUE,其值为 2³¹ - 1(约 21 亿)![[Pasted image 20250122191056.png]]默认容量是 16,负载因子为 0.75,这个组合是在性能和空间之间找到的平衡。较高的负载因子(如 1.0)会减少空

2302_81141145的博客 779

HashMap底层源码解析下(超详细图解)

文章目录前言HashMap成员方法put(K key, V value)解读上述hash方法:resize扩容方法扩容机制resize源码remove源码get方法源码遍历HashMap集合的几种方式1.分别遍历key和Values2.使用iterator迭代器迭代3.通过get方式4.jdk8之后使用Map接口中的默认方法 前言 前情回顾 HashMap底层源码解析上 HashMap成员方法 put(K key, V value) put方法是比较复杂的,实现步骤大致如下 先通过hash值计算出ke

wenwenaier的博客 3161

Spring Boot Swagger未授权访问漏洞:原理、风险与修复方案详解

在微服务架构中,API文档管理是开发与运维的重要环节。Swagger作为RESTful API文档生成与调试的标准化工具,通过OpenAPI规范自动生成交互式接口文档,极大提升了开发效率。然而,其默认配置往往缺乏访问控制,导致文档端点直接暴露,形成未授权访问漏洞。从技术原理看,该漏洞源于Spring Boot等框架集成Swagger时,相关端点未纳入安全框架的拦截范围,攻击者可通过扫描常见路径获取完整的接口定义与数据结构。这不仅会造成敏感信息泄露,更可能成为越权操作、数据篡改等深度攻击的入口点。在工程实践中

weixin_42524171的博客 493

HashMap源码详解

看该篇文章之前先看看这篇基础文章先来看HashMap里面的一些参数。1.DEFAULT_INITIAL_CAPACITY 默认的数组初始容量2. DEFAULT_LOAD_FACTOR 默认的加载因子。(hashmap数组扩容机制: 扩容阈值 = 数组容量 * 加载因子)3. 你知道的,hashmap底层是数组+链表+红黑树,不知道就先看上面说的基础文章,table就是这里面的数组。4. size 集合中元素个数。

weixin_52136521的博客 934

ZYNQ千兆网UDP通信实战:从Vivado配置到LWIP优化全流程(附避坑指南)

本文详细介绍了在ZYNQ平台上实现千兆以太网UDP通信的全流程,包括Vivado硬件配置、LWIP协议栈优化及实战代码示例。通过关键参数调整和性能优化,系统吞吐量可提升至850Mbps以上,适用于高速网络通信场景。

weixin_29161785的博客 230

5种隐藏代码到图片的实用技巧:从Notepad++到Linux命令全解析

本文详细解析了5种将代码或文本隐藏到图片中的实用数据隐写技巧。从Notepad++尾部追加、Windows命令行合并,到编辑图像元数据、使用十六进制编辑器,再到Linux的cat/dd命令,全面覆盖了从图形界面到命令行的工程化实践方法,帮助开发者和安全研究人员掌握隐蔽信息传输与存储的核心技术。

hh234的博客 353

HashMap底层源码解析

HashMap基于哈希表的 `Map` 接口的实现。此实现提供所有可选的映射操作,并允许使用 `null` 值和 `null` 键。(除了非同步和允许使用 null 之外,`HashMap` 类与 `Hashtable` 大致相同。)此类不保证映射的顺序,特别是它不保证该顺序恒久不变。............

蔚蓝 340

【linux】linux 出现一个网卡绑定多个ip怎么处理

我的原因是我使用了dhcp,这个会自动分配ip, 将 BOOTPROTO 参数由 dhcp 改为 static,并移除或注释掉与动态分配地址 10.0.2.15 相关的配置行(如果存在)。执行后,您可以再次使用 ip -4 a 或 ifconfig 命令确认 IP 地址已被移除。输出可以看出,您的虚拟机(k8s003)中存在一个名为 enp0s3 的网卡绑定了多个 IPv4 地址。对于某些 Linux 发行版(如 Ubuntu、Debian),您可能需要编辑网络接口的配置文件来移除多余的 IP 地址。

九师兄 297

Hashmap底层源码实现

基本属性 // 默认容量16 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; // 链表节点转换红黑树节点的阈值, 9个节点转 static final int TREEIFY_

weixin_51749366的博客 187

使用 Simulink + Simscape Electrical 对锂电池储能系统的充放电管理策略进行建模与仿真

摘要:本文详细介绍了基于Simulink的锂电池储能系统充放电管理策略建模与仿真方法。重点阐述了系统结构设计、建模过程(包括锂电池模型、充放电控制器、热管理系统等模块搭建)以及仿真设置。通过分析荷电状态管理、温度控制和功率限制等核心要素,展示了如何实现安全高效的充放电策略。仿真结果可验证系统性能,为优化管理策略提供依据。该方法为新能源存储和智能电网应用提供了实用的仿真分析工具。

amy_mhd的博客 156

零基础学simulink仿真建模--基于Simulink进行近端策略优化(PPO)路径规划的仿真建模

特点高效性与稳定性:通过引入剪裁机制,在更新策略时限制步长,从而提高了训练过程的稳定性和效率。适用于多种动作空间:可以处理连续和离散的动作空间问题。无需模型:不需要预先知道环境的确切模型,适合复杂或未知环境。挑战收敛速度与稳定性:确保算法能够在合理的时间内找到近似最优解,并保持训练过程的稳定性。探索与利用平衡:在探索新路径和利用已知信息之间取得平衡。计算资源:对于大规模状态空间和动作空间,计算资源需求较高。首先明确要模拟的任务内容。目标(例如到达指定地点、避开障碍物等)。

amy_mhd的博客 249

HashMap底层源码超细分析

1.看源码前须知Node<K,V>[ ] table 哈希表结构中数组的名字DEFAULT_INITIAL_CAPACITY: 数组默认长度16DEFAULT_LOAD_FACTOR: 默认加载因子0.75HashMap里面每一个对象包含以下内容:1.1 链表中的键值对对象包含:int hash;//键的哈希值//键V value;//值//下一个节点的地址值1.2 红黑树中的键值对对象包含:int hash;//键的哈希值。

2401_86654548的博客 1299

深度学习工具包 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 和 TreeMap 的底层源码

因为HashMap数组必须是2的幂,1

m0_57463864的博客 954

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

hashMap底层源码浅析

hashmap是我们经常使用的一个工具类。那么知道它的一些原理和特性吗? 特性 HashMap是一种基于散列算法实现的快速查找的键值对结构。底层实现是链表数组。 允许空键和空值(但空键只有一个,且放在第一位) 元素是无序的(这里的无序是指的插入和读取的顺序不一致) JDK 8 后又加了底层加上了红黑树优化过长的链表以及并行遍历。 概述 HashMap可以分析的地方很多,网上也有许多文章,本文仅从以下几个方面进行分析: 基础变量 插入(动态扩容,延迟插入,红黑树转换,可以说的地方很多) 并行遍历(jdk

qq_35824590的博客 1万+

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

HashMap 底层源码分析

null,此时p的值是发生冲突时之前已经存在的值,此时分三种情况判断,判断要添加的hash是否等于冲突的hash值并且key是否相等,如果相等,说明两个对象是同一个对象,把p的值赋值给临时变量e,如果e不为空,先保留老的oldValue值,把之前的value值赋值为要添加的value,即覆盖已经存在的value值,返回老的value值。二是红黑树的情况下;这块的逻辑主要是处理链表桶(非红黑树)的情况,它的主要逻辑是对旧桶中的链表进行重新分配,将节点拆分到新的newTab数组中不同的桶位置。

m0_71749752的博客 1281

hashMap的底层机制和源码

主要就是HashMap的底层机制和put方法的简单剖析

xiaojiaxins的博客 280

HashMap部分底层源码解析

的Entry类型的数组table,数组的每一个索引位置被称为一个桶(bucket),你添加的映射关系(key,value)最终都被封装为一个Map.Entry类型的对象,放到某个table[index]桶中。红黑树出现的时机:当某个索引位置i上的链表的长度达到8,且数组的长度超过64时,此索引位置上的元素要从单向链表改为红黑树。而jdk7中的新的元素指向旧的元素。位置2和位置3:(key1,value1) 与现有的元素以链表的方式存储在table数组索引i的位置,新添加的元素指向旧添加的元素(头插法)。

Mr_Richard的博客 963

hashMap底层源码浅析转载

hashmap是我们经常使用的一个工具类。那么知道它的一些原理和特性吗? 特性 HashMap是一种基于散列算法实现的快速查找的键值对结构。底层实现是链表数组。 允许空键和空值(但空键只有一个,且放在第一位) 元素是无序的(这里的无序是指的插入和读取的顺序不一致) JDK 8 后又加了底层加上了红黑树优化过长的链表以及并行遍历。 概述 HashMap可以分析的地方很多,网上也有许多文章,本文仅从以下几个方面进行分析: 基础变量 插入(动态扩容,延迟插入,红黑树转换,可以说的地方很多) 并行

钟长森的博客 264

HashMap put方法底层源码简单分析

这里我只学习了hashmap底层的方法,掌握了主要的逻辑,这次我就将总结写到前面了,因为后面都是源码+注释的结构,每次想看的时候都得一直翻到最下面,太麻烦了啊!,如果没有这些数据结构的加持,理解源码是有点困难的。这里之所以选用put方法,是因为put方法基本考虑了所有的情况,无论是,这里都有涉及到,其余的也就是调用相应的方法或说是同样的思想来操作的。其余的知识点都在下边的源码处标出了…

ZHAOKAIYUR的博客 206

HashMap是如何实现键值对管理的?从底层源码入手,详细解读HashMap的具体实现

本文首先对集合、映射等相关知识进行介绍,对HashMap各个重要变量、常量、构造方法、核心方法、序列化原理等源码进行深入解析,并对:“Map是不是集合?”、“HashMap继承了AbstractMap,为什么还要实现Map接口?”、“为什么table用transient修饰?”、“为什么(e.hash & oldCap) == 0时扩容索引值不变?”等问题进行了分析和解答

种一棵树最好的时间是十年前,其次是现在 1129

Java-源码-HashMap-底层数据结构

HashMap 主要用来存放键值对,它基于哈希表的 Map 接口实现,是常用的 Java 集合之一,是非线程安全的。HashMap可以存储 null 的 key 和 value,但 null 作为键只能有一个,null 作为值可以有多个JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突)。JDK1.8 以后的HashMap。

Java程序员的知识博客 1237

HashMap之底层源码分析

HashMap之底层源码分析 1 HashMap简介 HashMap 主要用来存放键值对,它基于哈希表的Map接口实现,是常用的Java集合之一。 JDK1.8 之前 HashMap 由 数组+链表 组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的(“拉链法”解决冲突).JDK1.8 以后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)时,将链表转化为红黑树(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树),

hcyxsh的博客 186
上一篇: Python和Java该怎么选?
下一篇: JUnit单元测试详解
learning__java
博客等级 码龄8年 87粉丝 174原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值