ArrayList是如何插入、删除数据的?
image.png
1.当插入一个data的时候会先检查数组是否需要扩容。
扩容的机制并不是说我需要添加N个数据 我就扩N个位置,而是有默认大小10个长度,当位置不够时通过位运算扩大1.5倍。因此当存放大量数据时,每次扩容都会消耗很多资源。
具体请参考(https://www.cnblogs.com/baichunyu/p/12965241.html)
扩容代码.png
2.数据复制与赋值
System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
将data后面的数据G、H、I进行复制并赋值到后面一位并将data赋值到指定位置
image.png
这样就完成了一次add,当我们插入的数据后面数据越多就会越消耗性能,越慢。删除也是同理。
LinkedList是如何插入、删除数据的?
LinkedList是典型的链表设计(双向链表)
链表设计图.png
每个数据都包含了本数据和上一个数据的指针与下一个数据的指针。
- LinkedList.Node.class
private static class Node<E> {
E item;
Node<E> next;
Node<E> prev;
Node(Node<E> prev, E element, Node<E> next) {
this.item = element;
this.next = next;
this.prev = prev;
}
}
当你需要添加数据时,只需要将数据填入链表,并修改对应数据的指针既可以实现。
总结
由此可见,当需要插入数据时,LinkedList的性能是优于ArrayList的。
相反,当你需要查询数据的时候,ArrayList是更快的,因为ArrayList是数组,直接通过下标就可以访问到,而链表需要你循环找到位置。