ArrayList,LinkedList,HashMap,LinkedHashMap,ConcurrentHashMap的底层实现原理

ArrayList:

  参考的优秀博客:https://www.cnblogs.com/ITtangtang/p/3948555.html

  重要的几个点:Arrays.copyOf(elementData, size),这个函数调用的是System.arraycopy

         (elementData, 0, a, 0, size)这个native函数,进行的是浅复制(对对象引用的复制);

LinkedList:

  参考的优秀博客:https://www.cnblogs.com/ITtangtang/p/3948610.html

  重要的几个点:LinkedList是个双向列表,可以从头遍历到尾,也可从尾遍历到头;get()方法会先判断index在前

         半部分,还是后半部分,然后采用哪种遍历;

HashMap:

  参考的优秀博客:https://www.cnblogs.com/ITtangtang/p/3948406.html

  重要的几个点:容量为什么必须是2的整数次幂,是因为为了保证hashcode取length模时散列均匀,取模运算为

         hashcode&(length-1),由此可知(length-1)转化为二进制右边位必须全为1,才能保证

         没有空位被浪费掉;

         HashMap中相同位维护的是单项列表;

         key为null时,hashcode定义为0,所以会被放置在table[0];

         ConcurrentModificationException这个异常几乎所有集合实现都有,是使用Iterator修改集合时,

         有别的线程也修改了,导致修改集合的操作数不一样,就会抛出此错;

         相同key的equels方法和hashcode都必须相等;

         要想提升HashMap的查找性能,可以调小loadFactor(加载因子),因为集合容量越大,hash

         冲突越小,查找就会越快;

ConcurrentHashMap:

  参考的优秀博客:https://www.cnblogs.com/ITtangtang/p/3948786.html

  重要的几个点:运用了锁分段技术,由多个哈希表组成,取key的hashcode进行一次再hash算法,确定其分配

         所在的Segment,然后在存在此Segment的hash表里面;

         调用size()方法时,ConcurrentHashMap的做法是先尝试2次通过不锁住Segment的方式来统计

         各个Segment大小,如果统计的过程中,容器的count发生了变化,则再采用加锁的方式来统计

         所有Segment的大小。

         

 

posted @ 2019-05-29 16:45  从心丨开始  阅读(1179)  评论(0编辑  收藏  举报