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的大小。