1. ArrayList底层其实是动态数组,在jdk1.8中没有指定capacity默认为空数组,1.7直接默认为10个大小。
2. 数组add的时候如果已经长度是10了,那么它就会触发扩容,扩容部分为之前大小的一半,在1.7中是直接 10 + 10/2, 在1.8中优化了下使用位运算10 + (10 >> 1),在计算机种位运算比算术运算快。
3. 指定位置add和指定位置remove都会用到数组复制。
4. ArrayList的线程不安全,Vector才是线程安全的,Vector的一些操作方法都会加个synchronized,当然如果想ArrayList线程安全可以用Collections.synchronizedList把它包装成线程安全的。
5. ArrayList不适合用来做队列,因为队列是先进先出的,要经常在头部删除数据,尾部添加,会频繁的复制数组,比较耗费性能,如果非要用来做队列,有另外的ArrayBlockingQueue类,它是一个定长数组,环形队列。
6. ArrayList遍历比LinkedList快是因为数组是在内存中一片连续的地址,可以直接get到,时间复杂度是O(1),而LinkedList是链表,在内存中不是一片连续的地址,每个元素都存有下一个元素对地址,所以每次get起来要从首元素开始找,时间复杂度是O(n), 不过LinkedList的添加和删除元素的效率比ArrayList高,它不需要像ArrayList一样经常复制移动数据。