以前一直听说ArrayList底层通过数组实现,没有去阅读过源代码,为了知其然也知其所以然,开始啃源代码,ArrayList的源代码其实蛮简单的,容易理解,
ArrayList是按照插入顺序放入其内部的ElementData数组中的,元素也是可以重复放入 ,他的查询操作是直接通过数组下标的形式实现,效率高,但是删除和插入操作效率较低,需要大量移动元素。并且不是线程安全的,因为add,remove的操作都不是在原子步内进行的,单一个线程改变了size值后不会马上对另外一个线程感知。
使用ArrayList的注意事项:
默认数组大小10,每次扩容1.5倍
subList()方法返回的是一个虚拟的List视图,所有的add,remove操作都是在原来集合上,
clone()是浅拷贝
toArray()是深拷贝
循环遍历过程中如果要删除元素,请使用Iterator迭代器的remove()方法删除元素。
1.8新增了forEach()方法和Spliterator,可以接受lambda表达式
|