List接口常见问题

ArrayList和LinkedList区别

ArrayList LinkedList
数据结构

ArrayList基于Object[ ]数组实现Object[ ] elementData

有序、值允许重复

LinkedList是基于双向链表实现,链表中的每个节点都是一个Node类型的对象,Node对象由item、prev、next三部分组成
初始化

public ArrayList():无参构造方法,将内部数组初始化为长度为0的空数组

public ArrayList(int 容量):有参构造方法,按照指定容量进行数组初始化

每次添加元素时会创建一个新的node节点并分配内存(无需主动初始化或扩容)
扩容

1.如果初始化时为一个空数组那么首次添加元素时容量默认为10

2.如果容量不足则按照原容量的1.5倍扩容

注:数组的最大容量在Integer.MAX_VALUE-8((2^31)-1)-8  2147483639至Integer.MAX_VALUE((2^31)-1) 2147483647之间,如果超出,则抛出OutOfMemoryError错误

适用场景 ArrayList 适合数据连续性遍历,读多写少的场景 适合数据频繁添加删除操作,写多读少的场景
效率

查找:可通过数组下标直接找到目标元素

增加或删除:可能需要对数组容量进行改变

查找:需要遍历每个元素

增加或删除:只需更改指针指向即可

ArrayList和Vector的区别

ArrayList不安全Vector安全

数组初始容量不同

扩容方式不同

Vector:
        1.基于Object[] elementData数组实现
        
        2.默认按照容量10进行初始化
public Vector() {
        this(10);
    }

        3.数组容量按照2倍或自定义扩容

扩容方式:

例:Vector v = new Vector(12,5);

        将类型为String的v数组扩容为初始容量12的5倍。

底层代码:

private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + ((capacityIncrement > 0) ?
                                         capacityIncrement : oldCapacity);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        if (newCapacity - MAX_ARRAY_SIZE > 0)
            newCapacity = hugeCapacity(minCapacity);
        elementData = Arrays.copyOf(elementData, newCapacity);
    }

//initialCapacity:指定Vector的初始容量

//capacityIncrement:指定Vector容量不足的扩容量,不指定的情况下默认翻倍

//MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8

ArrayList的扩容方式

底层代码:

private void grow(int minCapacity) {
        // overflow-conscious code
        int oldCapacity = elementData.length;
        int newCapacity = oldCapacity + (oldCapacity >> 1);
        if (newCapacity - minCapacity < 0)
            newCapacity = minCapacity;
        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);
    }

MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8

你可能感兴趣的:(list)