Java_HashMap实现原理

四种数据存储结构

1、顺序存储:在计算机中用一组地址连续的存储单元依次存储线性表的各个数据元素,称作线性表的顺序存储结构。

如:内存中连继地址对应的存储着数据元素

连续内存地址数据元素
OX0001Jack
OX0010Rose
OX0011Petter
OX0100John
特点:
1、随机存取表中元素。
2、插入和删除操作需要移动元素。

2、链接存储:在计算机中用一组任意的存储单元存储线性表的数据元素(这组存储单元可以是连续的,也可以是不连续的)。

内存地址数据元素下个地址
OX0001JackOX0111
OX1010RoseOX0100
OX0111PetterOX1010
OX0100Johnnull
特点
1、比顺序存储结构的存储密度小 (每个节点都由数据域和指针域组成,所以相同空间内假设全存满的话顺序比链式存储更多)。
2、逻辑上相邻的节点物理上不必相邻。
3、插入、删除灵活 (不必移动节点,只要改变节点中的指针)。
4、查找结点时链式存储要比顺序存储慢。
5、每个结点是由数据域和指针域组成。

3、索引存储:除建立存储结点信息外,还建立附加的索引表来标识结点的地址。索引表由若干索引项组成。

内存地址数据元素下个地址
OX0001JackOX0111
OX1010RoseOX0100
OX0111PetterOX1010
OX0100Johnnull
地址顺序索引字母排序索引
OX0001 : JackOX0001 :Jack
OX0100 :JohnOX0100 :John
OX0111 :PetterOX0111 :Petter
OX1010 : RoseOX1010 : Rose
特点:索引存储结构是用结点的索引号来确定结点存储地址,其优点是检索速度快,缺点是增加了附加的索引表,会占用较多的存储空间。

4、散列存储:散列存储,又称hash存储,是一种力图将数据元素的存储位置与关键码之间建立确定对应关系的查找技术。

连续内存地址数据元素hashcode
OX0001Jack1212434
OX0010Rose122222434
OX0011Petter1210034
OX0100John124
特点:散列是数组存储方式的一种发展,相比数组,散列的数据访问速度要高于数组,因为可以依据存储数据的部分内容找到数据在数组中的存储位置,进而能够快速实现数据的访问,理想的散列访问速度是非常迅速的,而不像在数组中的遍历过程,采用存储数组中内容的部分元素作为映射函数的输入,映射函数的输出就是存储数据的位置,这样的访问速度就省去了遍历数组的实现,因此时间复杂度可以认为为O(1),而数组遍历的时间复杂度为O(n)。

HashMap源码中涉及基础知识

<< 左移

10(十进制)=1010(二进制)
10(十进制)<<2=101000(二进制)=40(十进制)=10*(2的2次方)

>> 右移

10>>2=0010=2
-10=10的模数=10的补码=10的反码+1=0101+1=10110(一位符号位)
-10>>2=11101=11100+1=0011的反码+1=3的反码+1=3的补码=3的模数=-3

>>> 无符号右移(无符号右移位,不管正数还是负数,高位都用0补齐(忽略符号位))

10>>>2=0010=2
-10=10的模数=10的补码=10的反码+1=0101+1=10110(一位符号位)
-10>>>2=00101=5

负数为啥要用补码

因为计算机只能做加法,所以引进模这个东西,比如一个负数与其正补数是一致的,so,计算机中负数就用补码表示

JDK1.8之前不含1.8_HashMap实现原理

数组+链表
在这里插入图片描述

并发的HashMap:ConcurrentHashMap

在这里插入图片描述

JDK1.8_HashMap实现原理

数组+链表+红黑树
(链表元素超过8个就转红黑树)
在这里插入图片描述
并发的HashMap:ConcurrentHashMap
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值