下图为List核心数据结构
实现上的差异
1.ArrayList和Vector采用数组实现,两类封装的操作都是对内部数组的操作,比如向数组动态添加、删除元素等;两者几乎使用了相同算法,只是ArrayList未对方法设置同步,Vector是使用了线程同步方法,而且性能差异很小。
2.LinkedList采用了双向链表实现,由一系列的表项组成。一个表项包括:元素内容、前驱表项、后驱表项,无论LinkedList是否为空,都有一个header表项,即是开始也是结尾,header的后驱就是链表的第一个元素,前驱就是最后一个元素。
适用场景
1.末尾追加元素:
如果是在末尾追加元素操作,ArrayList是很快的,但是有可能会涉及到扩容并进行数组复制调用System.arrayCopy(),所以效率还是相当高的;LinkedList由于是数组加双向链表,直接将header元素指向新元素即可,但是由于数组里存的Entry,所以会额外增加内存消耗
2.添加元素到任意位置
由于ArrayList是数组,所以会进行数组复制,而且越靠前,要复制的数组元素就越多,当往一个元素个数很多的ArrayList添加到任意位置时,很比较慢;而LinkedList不存在这个问题,和在尾部插入是一样的时间消耗
3.删除某位置元素
同2
4.遍历元素
ArrayList基于数组实现,随机访问的速度很快,在遍历List时可以优先考虑使用随机访问,但对于linkedList基于链表实现的,随机访问性能非常差,要避免。