说一下ArrayList和LinkedList的区别【整理中】

阿里面试官:说一下ArrayList和LinkedList的区别?_沉默王二-CSDN博客

看到上面的内容?讲解很透彻,但是针对的是jdk14.  
这里针对jdk8.来说明下

1. ArrayList 和 LinkList 是 List 接口的两种不同实现,并且两者都不是线程安全的

jdk8下:


ArrayList 内部使用的动态数组来存储元素,LinkedList 内部使用的双向链表来存储元素,这也是 ArrayList 和 LinkedList 最本质的区别 

2.  ArrayList

get操作直接取下标【复杂度O(1)】 

public E get(int index) {
        checkElementIndex(index);
        return node(index).item;
    }

直接取下标。复杂度O(1)

 add操作。不然容量够用,那么可以直接存放,否则需要扩容

    public boolean add(E e) {
        ensureCapacityInternal(size + 1);  // Increments modCount!!
        elementData[size++] = e;
        return true;
    }
private void ensureCapacityInternal(int minCapacity) {
        ensureExplicitCapacity(calculateCapacity(elementData, minCapacity));
    }
    private static int calculateCapacity(Object[] elementData, int minCapacity) {
        if (elementData == DEFAULTCAPACITY_EMPTY_ELEMENTDATA) {
            return Math.max(DEFAULT_CAPACITY, minCapacity);
        }
        return minCapacity;
    }

如果没有元素的话,使用默认的容量10

    private void ensureExplicitCapacity(int minCapacity) {
        modCount++;

        // overflow-conscious code
        if (minCapacity - elementData.length > 0)
            grow(minCapacity);
    }
    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);
    }

会执行Arrays.copyOf()    需要把原有数组中的元素复制到扩容后的新数组当中

同理:growth这里也需要注意一下。
第一次默认会分配一个10空间

那如果接下来不够存储的话,比如需要存储第11个元素的时候,会重新进行grow扩容

解析来的容量是之前的1.5倍。

newCapacity = oldCapacity + (oldCapacity >> 1);

说一下ArrayList和LinkedList的区别【整理中】_第1张图片

 

你可能感兴趣的:(基础java,java,开发语言,后端)