ArrayList和LinkedList的区别
- ArrayList基于动态数组实现的非线程安全的集合;LinkedList基于链表实现的非线程安全的集合。
- 对于随机index访问的get和set方法,一般ArrayList的速度要优于LinkedList。因为ArrayList直接通过数组下标直接找到元素;LinkedList要移动指针遍历每个元素直到找到为止。
- 新增和删除元素,一般LinkedList的速度要优于ArrayList。因为ArrayList在新增和删除元素时,可能扩容和复制数组;LinkedList实例化对象需要时间外,只需要修改指针即可。
- LinkedList集合不支持 高效的随机随机访问(RandomAccess)
- ArrayList的空间浪费主要体现在在list列表的结尾预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗相当的空间
1.认识ArrayList
ArrayList是List的实现类,实现了List的方法,并自己新增了一些方法和属性
例如:
transient Object[] elementData; //数组 private int size;
表明ArrayList底层就是封装了一个数组,所以ArrayList的本质就是一个被封装的可自动扩容的动态数组,它能通过==.get()方法==并根据坐标值来获取特定的元素。
在物理意义上就是一连串的相邻的储存空间,即删除中间一个,必须要把后面的元素每一个都向前赋值
- 因为可以根据下标Index查找,所以查找快
- 因为每次删除或增加一个都要移动整个数组改变位置之后的所有元素,所以修改速率慢
2.认识LinkedList
LinkedList也实现了List的
但是LinkedList类里包含了Node节点类实例化的两个对象,其中指向前一个节点的地址,另外一个指向后一个节点的地址
transient Node<E> first; transient Node<E> last;
所以当删除一个元素时,只需要将这个节点的前一个节点的lastNode指向删除节点的后一个节点的地址,把删除节点的后一个节点的firstNode指向删除节点的前一个节点的地址
- 因此这就是LinkedList在删除和新增时刚高效的原因,因为它只需要改变前后节点Node的指向,而不是改变之后的所有节点