JAVA面试|常用的List集合(java常见集合面试题)
在Java中,List是常用的集合接口,它的核心实现类有 ArrayList、LinkedList和Vector。以下是通俗易懂的解释和应用场景分析:
一、ArrayList
特点:
底层基于数组:内存连续,类似一排座位。
查询快:可以通过下标直接定位元素(时间复杂度 O(1))。
增删慢:插入或删除元素时,可能需要移动后续元素(比如在中间插入数据,后面的元素都要往后挪)。
应用场景:
频繁读取,很少增删:比如从数据库查出的数据列表,只需要遍历展示。
需要随机访问:比如通过索引快速获取第5个元素。
元素数量相对固定:不需要频繁扩容(ArrayList 默认容量是 10,扩容时会创建新数组并复制数据)。
示例代码:
List<String> list = new ArrayList<>();
list.add("苹果");
list.add("香蕉");
String fruit = list.get(0); // 快速获取
二、LinkedList
特点:
底层基于双向链表:元素通过“节点”连接,类似手拉手的人。
增删快:插入或删除只需修改相邻节点的引用(时间复杂度 O(1))。
查询慢:要查找某个元素需要从头或尾遍历(时间复杂度 O(n))。
应用场景:
频繁插入或删除:比如实现一个撤销操作队列,每次在头部添加新操作。
实现栈或队列:LinkedList 实现了Deque接口,可以直接当队列或栈使用。
元素数量变化大:不需要扩容,按需动态分配内存。
示例代码:
List<Integer> list = new LinkedList<>();
list.add(1);
list.addFirst(0); // 在头部插入
list.removeLast(); // 删除尾部元素
三、Vector
特点:
线程安全:所有方法都加了synchronized锁,保证多线程安全。
性能较差:加锁导致效率低,单线程环境下不如ArrayList。
扩容机制:默认扩容为原来的2倍(ArrayList是1.5 倍)。
应用场景:
多线程环境:需要线程安全的List(但更推荐用 CopyOnWriteArrayList)。
遗留系统兼容:旧代码中可能还在使用Vector。
示例代码:
List<String> list = new Vector<>();
list.add("A");
list.add("B");
四、如何选择?
大多数情况下用ArrayList(90%场景)。
需要频繁增删或实现队列/栈时用LinkedList。
多线程环境优先考虑CopyOnWriteArrayList或
Collections.synchronizedList(),而不是Vector。