阿里面试官:说一下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);