美文网首页
二.ArrayList和LinkedList和hashmap

二.ArrayList和LinkedList和hashmap

作者: 最深的爱最沉默_a447 | 来源:发表于2018-06-07 15:19 被阅读6次

    一.先来说说常问的ArrayList和LinkedList的大致区别

    ArrayList是基于数组的,一个key对应一个value,所以在查询,set,get上会比较快.

    LinkedList是基于链表的,所以在增删上会比较快

    所以,看情况使用

    二.重要的hashMap

    这是基于数组加链表的结构的,具体的实现我也不想多说看图.

    重要的就是它的负载因子是0.75,就是存储数据多余75%就会重新生成一个原先2倍的数组,从新存储上面的数据.(有的面试官会问为什么是2倍,mmp,这个我也不知道,有时间查查).

    来,先说hashmap的负载因子为你什么是0.75.先说问什么不能是0.5,你想想比如开始默认容量是16,他存了8个的时候就变成了32,之间差了24个,当存16个时,变成了64,存的和没存的之间差的更多了,所以最终使用空间和未使用空间的差值会逐渐增加,空间利用率低下.而是一的肯定也不好,在存满时,突然put会增加增加的时间,时间慢了,所以取了他们中间的只0.75,也就是默认负载因子(0.75)在时间和空间成本上提供了很好的折衷

    好,然后再来说说为什么是2倍,其实默认hashmap的内存一定的2的次幂.说白了基于优化的考虑,就下面的原因,为了Entry数组每个位置都只有一个元素.这样查询效率最高.

    和下面的图片接着

    至于为什么是大小要是2的次幂呢?

    能看懂就看看下面,看不懂就说因为基于位运算的,位运算的效率非常高

    下面的K应该是数组长度

                            下面的那个源代码给的不对,是这个

    首先算得key得hashcode值(就是里面的h),然后跟数组的长度-1做一次“与”运算(&)

    https://blog.csdn.net/a_long_/article/details/51594159(这是网址) https://blog.csdn.net/u010558660/article/details/50926227?winzoom=1

    上面的是网址

    对还有重要的就是说hashmap线程不安全,所以可以用ConcurrentHashMap来替换它.

    还有就是haspmap在jdk1.8中内部用到了红黑树(不用数组加链表了).要去看看(直接百度:hashmap红黑树实现,有不少好文章)

    详细的网上讲的太多了.复制个地址自己看(是讲的好的哦)

    http://www.importnew.com/7099.html

    对了关于集合还有一个非常重要的点就是它的遍历,对于key-value的集合的遍历,比如说我刚删除了一个1,集合数据的位置会发生变化,就是可能会迁移或不动,忘了,什么时候测试下,反正就记住这里有个坑,面试时问道记住点.对还有就是遍历输出时不能删除不然也就报错了,解决方法就是用遍历器.

    下面是hashmap和hashtable的区别

    还有就是一个要测试的就是各个集合对iterator的使用.有时间测一下.

    主要我现在工程不想动,麻烦,不然Git搞不好

    相关文章

      网友评论

          本文标题:二.ArrayList和LinkedList和hashmap

          本文链接:https://www.haomeiwen.com/subject/mlnbsftx.html