ArrayList源码分析

 把之前的学习笔记整理了一下。写在博客上面,好方便以后的查看,顺便也复习一下,里面有什么不对的地方,欢迎大家提出,萌萌哒~大笑

 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);
    }

上面的代码就是ArrayList进行扩容的关键代码。

5ArrayList基于数组实现,可以通过下标索引直接查找到指定位置的元素,因此查找效率高,时间复杂度为O(1),但每次插入或删除元素,就要大量地移动元素,插入删除元素的效率低,时间复杂度为O(n/2)和O( (n-1)/2 ),如果插入和删除操作很频繁的话,建议使用链表。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章