HashMap和ArrayList的自我总结

对于hashmap自己的总结如下:

首先hashmap是一个基于hash实现map接口的这么一个数据结构主要存储模式为键值对kv,对于hashmap在JDK1.7的时候主要是数组加链表,而1.8之后就变成了数组加链表加红黑树,我先通过他的put过程来讲解他们的区别,首先对于hashmap从建立时他不会有默认数组他是在你传递put发现没数组的时候调用了一个resize方法创建了一个默认长度为16的数组,此时他的扩容阈值就等于此时的数组长度乘以负载因子,负载因子默认为0.75所以当数组容量大于12的时候他会自动扩容,首先先讲一下他插入的过程,他插入后因为是基于hash的底层会调用一个hashcode方法来创建一个hash值,此时的hash值通过扰动函数,采用高地位或与来得到最后的索引值,那么为什么要采用高地位或与呢?因为如果不采用高地位或与或者是采用高位或与会造成索引坐标值不能平均分配在数组中,导致冗杂影响速率,那么此时值一多肯定会有最后索引相同的情况,此时就发生了哈希冲突,此时有三种情况,key值相同value值相同,此时就不用管,还有就是key相同value不同此时新的value会吧之前的给替代掉,还有就是key不同,此时又要分几种情况,此时可能此时索引的链表阈值没有超过8那么就直接插入在链表的后面,还有就是此时的数组长度超过64并且链表的阈值超过了8此时链表就会转化为红黑树,但此时也要考虑一点就是红黑树的结点要是小于6红黑树又会回退为链表。然后就是要是数组超过了扩容阈值此时就要对数组进行扩容,扩容的话首先就是创建一个新的数组长度的话就是旧数组的两倍,16就变成32,然后将旧数组的值重新计算哈希值获取新索引插入进扩容后的新数组,但是此时的插入是对新数组的长度减1进行位于计算来获取到新的索引值,对于链表又不一样,对于链表的话还要判断此时获得的hash值和旧数组长度的位于是不是为0如果为0则停在原始位置如果不为0则落在原始位置加增加的数组大小的这个位置上。红黑树的话就按照红黑树的添加即可,正因为计算索引时采用了位于的方式替代取余的方式,所以对于数组的大小必须满足2的幂次性来确保位于和取余的值相同。使用位于效率也比取余快得多。

对于arraylist理解如下:

arraylist底层主要是object数组,他和hashmap类型一开始底层都没有值,我们也从插入数据说起来,当arraylist有值插入的时候,他首先会给list一个默认长度为10的一个数组,然后就进行值得插入,既然是数组此时得插入又是直接插入尾部,所以此时的时间复杂度就是O(1),删除也一样,但是如果要在中间删除或者添加元素的话此时就就要循环整个数组然后找到此时的位置才能进行操作,而且不管是增加还是删除此时的位置后面的值位置全部都要发生变化,此时的时间复杂度也是O(n)就是因为位置会发生变化,要是数组长度一多,就会造成时间过慢,但是对比linlist虽然中途增删时间复杂度都相同,但是他的增和删只改变他旁边的值,所以一般在插入和增加较多的场景就用linklist,既然说到了区别,再补充一个就是相对于linklist arraylist的内存耗量更大,因为arraylist你不能确保它每次的数组都刚刚好装满吧,而linklist就不用担心这个,既然说到这里linklist这么好那么为什么还有arraylist呢,arraylist自然有好处,最大的一个好处就是他是索引访问,所以当你使用索引访问查找数据的时候他是非常快的,特别是在数据量很大的情况,他的速度会更快。所以当什么查询情况多的场景一般就可以考虑arraylist了。接下来还是插入,当数组满了之后他怎么扩容的呢?在以前老版本的java他是直接扩容为之前的两倍,但是现在都是扩容1.5倍。这些说完。那么arraylist和普通数组而言他有什么优点或者缺点呢?首先最明显的就是它更加的灵活,对于数组的限制没有这么拘束,它不会想数组那种被大小限制住,他也没有必要考虑数组越界的那些什么问题,还有就是因为他是基于集合的,它内部有更多的api方法来调用,就像什么增加删除查找,他都更加的便利,还有就是速度嘛。它可以根据索引查询,这么多好处哪数组有什么好的呢,对于对于基本类型数据,直接使用数组可能更节省空间,性能略高,因为避免了装箱拆箱操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值