ArrayList、LinkedList、Hashmap原理和区别

你若盛开,清风自来,我是顽童,一个活在底层的3C搬砖工程师!

ArrayList

原理:底层实现的是一个连续的数组,所以它具备数组的一些特性,如下图
在这里插入图片描述

特性
 查询快,因为数组存储在的是内存,所以查询操作直接的内存的操作。而且数组对应的是有下标的,查询可以根据下标查,可以快速查询到
 插入慢,因为插入的时候,为了保证数组的连续性,插入后面的值都需要相应变更,就比如100个人排队在一起,你插入到第三,对应的后面的所有的人都要逐级移动一位

LinkedList

原理:底层是双向链表结构,如下图,每个node里面存在first,last这样的元素,然后前一个node的last关联到后一个node的first。
在这里插入图片描述

特性:查询慢,因为查询每次都要一个一个的遍历过去,不是下标查询,所以查询慢
插入快,插入的时候,只要将node的first和last相互指向对应的节点就块了。就比如100个人手拉手围成一圈,这个时候要加一个人进来,只要把新加入的人和另外两个人的手连接起来就好了,不需要全部都变动起来

Hashmap

原理
哈希算法:通过字符传你的ASCIl码,然后进行取模,算出哈希表的下标。如下图,当模相等的时候,就以链表的形式插入一条对应的值,通过next相互指引
在这里插入图片描述

ps:为什么要取模?因为假如每个值都取具体值这样会太占空间了,但是取模的话,就只需要固定的一组就够了,比如“lies”通过ASCII码计算出来的是429,假如取模下来是9,这样就直接放在9这一列下面就可以了
ps:哈希碰撞,比如“lies”和“foes”通过ASCII码计算出来的都是429,这就会覆盖
ps:HashMap往链表里插入节点的方式?
jdk1.7以前是头插法,jdk1.8以后是尾插法,因为引入红黑树之后,就需要判断单链表的节点个数(超过8个后要转换成红黑树),所以干脆使用尾插法,正好遍历单链表,读取节点个数。也正是因为尾插法,使得HashMap在插入节点时,可以判断是否有重复节点。
ps:HashMap由什么组成?
数组+单链表,jdk1.8以后又加了红黑树,当链表节点个数超过8个(m默认值)以后,开始使用红黑树,使用红黑树一个综合取优的选择,相对于其他数据结构,红黑树的查询和插入效率都比较高。而当红黑树的节点个数小于6个(默认值)以后,又开始使用链表。这两个阈值为什么不相同呢?主要是为了防止出现节点个数频繁在一个相同的数值来回切换,举个极端例子,现在单链表的节点个数是9,开始变成红黑树,然后红黑树节点个数又变成8,就又得变成单链表,然后节点个数又变成9,就又得变成红黑树,这样的情况消耗严重浪费,因此干脆错开两个阈值的大小,使得变成红黑树后“不那么容易”就需要变回单链表,同样,使得变成单链表后,“不那么容易”就需要变回红黑树。
ps:什么是红黑树?
如下图所示,数值进行左小右大的存储,这样比如查询7,第一次查询比2大,然后和4比较,然后发现比6大,和7相等,找到对应的值,这样只需要找四次,如果是链表的话,就需要遍历7次,这样大大提高了性能
在这里插入图片描述

ps:HashMap初始化时,如果指定容量大小为10,那么实际大小是多少?
16,因为HashMap的初始化函数中规定容量大小要是2的指数倍,即2,4,8,16,所以当指定容量为10时,实际容量为16

最后欢迎各位大大大大…牛指点!!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值