Java LinkedList add() 方法
LinkedList 类提供了多个 add() 方法的重载版本,用于向列表中添加元素。
1、boolean add(E e)
这是最基本的添加方法,将指定元素追加到列表末尾。
实例
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add("Cherry");
list.add("Apple");
list.add("Banana");
list.add("Cherry");
方法特点:
- 总是返回 true(因为 LinkedList 允许重复元素)
- 时间复杂度为 O(1)
- 等效于 addLast() 方法
2、void add(int index, E element)
在列表的指定位置插入指定元素。
实例
LinkedList<String> list = new LinkedList<>();
list.add("Apple");
list.add("Banana");
list.add(1, "Orange"); // 在索引1处插入
list.add("Apple");
list.add("Banana");
list.add(1, "Orange"); // 在索引1处插入
方法特点:
- 如果索引等于列表大小,则相当于 add(E e)
- 需要遍历到指定位置,平均时间复杂度为 O(n)
- 可能抛出 IndexOutOfBoundsException
3、boolean addAll(Collection<? extends E> c)
将指定集合中的所有元素按迭代器返回的顺序追加到列表末尾。
实例
LinkedList<String> fruits = new LinkedList<>();
fruits.add("Apple");
fruits.add("Banana");
List<String> moreFruits = Arrays.asList("Orange", "Grape");
fruits.addAll(moreFruits);
fruits.add("Apple");
fruits.add("Banana");
List<String> moreFruits = Arrays.asList("Orange", "Grape");
fruits.addAll(moreFruits);
方法特点:
- 返回 true 如果列表因调用而改变
- 时间复杂度为 O(m),m 是参数集合的大小
4、boolean addAll(int index, Collection<? extends E> c)
从指定位置开始,将指定集合中的所有元素插入此列表。
实例
LinkedList<String> fruits = new LinkedList<>();
fruits.add("Apple");
fruits.add("Banana");
List<String> moreFruits = Arrays.asList("Orange", "Grape");
fruits.addAll(1, moreFruits); // 在索引1处插入集合
fruits.add("Apple");
fruits.add("Banana");
List<String> moreFruits = Arrays.asList("Orange", "Grape");
fruits.addAll(1, moreFruits); // 在索引1处插入集合
方法特点:
- 需要先遍历到指定位置
- 时间复杂度为 O(n + m),n 是列表大小,m 是集合大小
与其他方法的比较
add() vs addLast()
add(E e)
和addLast(E e)
完全等效- 都用于在列表末尾添加元素
add() vs offer()
add(E e)
在容量受限的队列中可能抛出异常offer(E e)
在容量受限的队列中会返回 false 而不是抛出异常
add() vs push()
push(E e)
实际上调用了addFirst(E e)
- 将元素添加到列表开头而非末尾
性能考虑
添加操作的效率
- 末尾添加:O(1) 时间复杂度
- 开头添加:O(1) 时间复杂度(使用 addFirst())
- 中间添加:O(n) 时间复杂度(需要遍历到指定位置)
与 ArrayList 的比较
操作 | LinkedList | ArrayList |
---|---|---|
末尾添加 | O(1) | O(1) 平摊 |
开头添加 | O(1) | O(n) |
中间添加 | O(n) | O(n) |
随机访问 | O(n) | O(1) |
实际应用示例
创建待办事项列表
实例
LinkedList<String> todoList = new LinkedList<>();
// 添加任务
todoList.add("Buy groceries");
todoList.addFirst("Check emails"); // 高优先级任务
todoList.add(1, "Call mom"); // 中等优先级
System.out.println(todoList);
// 输出: [Check emails, Call mom, Buy groceries]
// 添加任务
todoList.add("Buy groceries");
todoList.addFirst("Check emails"); // 高优先级任务
todoList.add(1, "Call mom"); // 中等优先级
System.out.println(todoList);
// 输出: [Check emails, Call mom, Buy groceries]
实现简单队列
实例
LinkedList<String> queue = new LinkedList<>();
// 入队操作
queue.add("First");
queue.add("Second");
queue.add("Third");
// 出队操作
while(!queue.isEmpty()) {
System.out.println(queue.removeFirst());
}
// 入队操作
queue.add("First");
queue.add("Second");
queue.add("Third");
// 出队操作
while(!queue.isEmpty()) {
System.out.println(queue.removeFirst());
}
合并两个列表
实例
LinkedList<String> list1 = new LinkedList<>(Arrays.asList("A", "B", "C"));
LinkedList<String> list2 = new LinkedList<>(Arrays.asList("D", "E", "F"));
list1.addAll(list2);
System.out.println(list1); // 输出: [A, B, C, D, E, F]
LinkedList<String> list2 = new LinkedList<>(Arrays.asList("D", "E", "F"));
list1.addAll(list2);
System.out.println(list1); // 输出: [A, B, C, D, E, F]
注意事项
- 线程安全:LinkedList 不是线程安全的,多线程环境下需要外部同步
- 空元素:允许添加 null 元素
- 索引检查:使用带索引的 add 方法时要注意边界条件
- 并发修改:在使用迭代器时修改列表会抛出 ConcurrentModificationException
点我分享笔记