一.先来说说常问的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搞不好
网友评论