把之前的学习笔记整理了一下。写在博客上面,好方便以后的查看,顺便也复习一下,里面有什么不对的地方,欢迎大家提出,萌萌哒~。
1.ArrayList是基于数组实现的,是一个动态数组,其容量能自动增长,类似于C语言中的动态申请内存,动态增长内存。
2. ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考虑用Collections.synchronizedList(List list)函数返回一个线程安全的ArrayList类,也可以使用concurrent并发包下的CopyOnWriteArrayList类。
3.ArrayList实现了Serializable接口,因此它支持序列化,能够通过序列化传输,实现了RandomAccess接口,支持快速随机访问,实际上就是通过下标序号进行快速访问,实现了Cloneable接口,能被克隆。
4.在使用ArrayList的时候最好估计存储的最大值。不然要按照Size>>1进行扩容。每次扩容就是通过Array.copyof()及里面调用的System.copyof()将原来的数组拷贝给一个新的数组。这样就很影响性能,下面是源代码:
/**
* Increases the capacity to ensure that it can hold at least the
* number of elements specified by the minimum capacity argument.
*
* @param minCapacity the desired minimum capacity
*/
private void grow(int minCapacity) {
// overflow-conscious code
int oldCapacity = elementData.length; //得到原来的大小
int newCapacity = oldCapacity + (oldCapacity >> 1); //讲原来的大小进行扩容
if (newCapacity - minCapacity < 0)
newCapacity = minCapacity;
//MAX_ARRAY_SIZE=Integer.MAX_VALUE - 8 ArrayList最大可分配的容量
if (newCapacity - MAX_ARRAY_SIZE > 0)
newCapacity = hugeCapacity(minCapacity);
// minCapacity is usually close to size, so this is a win:
//这里就是进行扩容的关键一步
elementData = Arrays.copyOf(elementData, newCapacity);
}
5、ArrayList基于数组实现,可以通过下标索引直接查找到指定位置的元素,因此查找效率高,时间复杂度为O(1),但每次插入或删除元素,就要大量地移动元素,插入删除元素的效率低,时间复杂度为O(n/2)和O( (n-1)/2 ),如果插入和删除操作很频繁的话,建议使用链表。