首页 > 编程知识 正文

redis数据结构底层实现,arraylist是什么数据结构

时间:2023-05-03 16:29:22 阅读:129415 作者:718

二、HashMap集合基础数据结构2.1存储数据的过程示例代码:

HashMapString,Integer map=new HashMap (; 图. put (柳岩),18 ); map.put (杨幂),28 ); map.put (刘德华),40 ); map.put (柳岩),20 ); 输出结果:

(杨幂=28、柳岩=20、刘德华=40 )分析:

创建HashMap集合对象时,jdk1.8或更早版本创建了一个长度为16的Entry[] table,用于在构造方法中存储键值对数据。 从jdk1.8开始,数组并不是在如何构建HashMap的基础上创建的。是在第一次调用 put 方法时创建的数组 Node[] table 用来存储键值对数据。

假设哈希表中存储吕岩、18个数据,用吕岩调用String类改写后的hashCode ) )方法计算出值,采用某种算法配合数组长度将数据存储到Node数组中的空间索引如果计算出的索引空间中没有数据,则将柳岩、18直接存储在数组中。 (例如:计算的索引为3 )

散列表中存储数据的刘德华,40,假设计算出的hashCode (如果方法结合数祖长计算出的索引值也为3,则此时数组空间不是null,此时基底层柳枝和刘德华的hash值一致

假设散列表中存储数据柳岩,20,则拉链法必须为3,而首先根据柳岩调用 hashCode() 方法结合数组长度计算出索引,如果hash值相等,则http://www.com 那么,底边是柳岩所属的等级String的比较后存储的数据柳岩和已经存在的数据的 hash 值是否相等

等于:用上一个值复盖随后添加的数据的值。

不等于:继续与其他数据的密钥进行比较。 如果都不相等,则创建一个存储数据的节点。 如果作为节点长度的链表长度大于阈值8,数组长度大于64,则链表为红黑色树。

在添加数据的过程中,会出现容量扩展问题。 如果超出阈值,并且存储位置不为空,则会发生容量扩展。 默认扩展方式:哈希碰撞,复制原始数据。

综上所述,在一个表中的要素多的情况下,即散列值相等但内容不相等的要素多的情况下,用key值依次检索效率低。 另一方面,在jdk1.8中,哈希表的存储是使用数组链表的红黑树实现的。 如果链表长度(阈值)超过8,当前数组长度超过64,则将链表转换为红黑树将大大缩短搜索时间。

简单来说,哈希表是通过数组链表中的红黑树(JDK1.8中添加了红黑树部分)实现的。 如下图所示。

equals() 方法比较两个内容是否相等

jdk1.8之前的HashMap实现是一个数组链表,无论散列函数获取多好,都很难实现元素的100%均匀分布。 如果HashMap中有大量元素存储在同一时段中,则此时段下有一个长链表。 在这种情况下,HashMap相当于单链表。 如果单链表中有n个元素,则遍历的时间复杂度为o(n ),完全失去了其优点。

针对这种情况,jdk1.8引入了红黑树(查找时间复杂性为o(logn ) )来优化此问题。 如果链表长度较小,遍历速度也会非常快,但如果链表长度增加,则会影响查询性能。 因此,需要将其转换为树。

总结:

说明:

size表示HashMap中键-值对的实时数量。 请注意,这不等于数组的长度。 阈值=容量) *加载因子)。 此值是当前占用的数组长度的最大值。 如果size超过此值,则重新扩展。 扩展后的HashMap容量是以前容量的两倍。 2.3面试问题扩容为原来容量的 2 倍:根据数组长度,按无符号右移()、按位异或(^ )、按位和()计算索引。 平方上也可以采用中法、伪随机数法、剩余法。 这三个效率都很低。 无符号右移16位异或运算效率最高。jdk1.8 中引入红黑树的进一步原因::发生哈希崩溃。 如果key值的内容相同,则替换旧值。 否则,如果连接到链表后面,当链表长度超过阈值8时,它将转换为红黑树存储。HashMap 中 hash 函数是怎么实现的?还有哪些hash函数的实现方式?

a )如果两个元素的key计算的哈希代码值相同,则会发生哈希冲突。 在jdk8之前,使用链表解决散列冲突。 在jdk8之后,使用链表中的红黑树解决散列冲突。

当两个对象的 hashCode 相等时会怎么样?

在equals中比较内容是否相同。 相同:新值覆盖上一个值。 不一样。 将新的键值对添加到哈希表中。 http://www.Sina.com/http://www.Sina.com/hashtable的方法是Synchronize,但HashMap不是。 当多个线程访问Hashtable时,HashMap必须为其提供外部同步,而无需自己同步该方法。什么是哈希碰撞,如何解决哈希碰撞?继承的父类不同。 HashMap从AbstractMap类继承,HashTable从Dictionary类继承。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。