本文最后更新于53 天前,其中的信息可能已经过时,如有错误请发送邮件到big_fw@foxmail.com
List接口时Collection的子接口,表示有序集合,允许存储重复的元素,常见的List实现类又ArrayList、LinkedList、Vector
ArrayList基于动态数组实现,存在容量限制,但有自动扩容机制,在内存中连续存储,适合随机访问,适用于频繁访问元素的场景。随机访问O(1),尾部插入和删除O(1),扩容O(n),其他位置插入和删除O(n),排序O(n logn),查询是否含某个元素O(n)
ArrayList创建时容量为0,当第一次添加元素时初始容量变为10,后续每次扩容1.5倍,扩容逻辑是,当判断添加元素后,所需链表长度大于容量,则扩容,本质上是计算出新的扩容数组的size之后实例化,将原来数组内容复制到新数组。
ArrayList的Fail-Fast:使用modCount记录结构发生变化的次数(包括添加、删除元素,调整内部数组大小等),在序列化或者迭代等操作的时候,会必较操作前后的modCount是否改变,如果发生改变则报错ConcurrentModificationException。
LinkedList基于双向链表实现,不存在容量限制,在内存中不连续,适用于需要频繁进行插入和删除的操作场景,不支持随机访问,遍历查询O(n),头尾插入删除O(1),其他位置插入删除O(n)
LinkedList也可以当作队列(Queue)使用
ArrayList和LinkedList都不是线程安全的。
Vector和ArrayList类似,但主要方法都是synchronized方法,通过互斥同步方式保证线程安全
Stack继承于Vector类,后进先出,有特定的使用场景