Java中的LinkedList addAll()方法
简介
LinkedList是Java Collections Framework中的一个双向链表实现类,它提供了许多用于操作链表的方法,其中包括addAll()方法,本文将对它进行详细介绍。
addAll()方法概述
addAll()方法是java.util.LinkedList类中的一个方法,它用于将另一个集合中的元素全部添加到当前LinkedList的末尾。其语法如下:
public boolean addAll(Collection<? extends E> c)
其中,Collection是一个接口类型,表示集合,E表示泛型类型,? extends E表示限定了集合的元素类型,可以是E或E的子类。
addAll()方法会将指定集合中的所有元素添加到LinkedList的末尾,如果添加成功,则返回true,否则返回false。当指定集合为null或该集合不包含任何元素时,addAll()方法不会对LinkedList造成任何影响并返回false。
下面是一个使用addAll()方法的示例代码:
import java.util.LinkedList;
import java.util.ArrayList;
import java.util.List;
public class LinkedListDemo {
public static void main(String[] args) {
LinkedList<String> linkedList = new LinkedList<>();
List<String> list = new ArrayList<>();
list.add("apple");
list.add("banana");
list.add("orange");
boolean flag = linkedList.addAll(list);
if (flag) {
System.out.println("addAll success, linkedList: " + linkedList);
} else {
System.out.println("addAll failure");
}
}
}
在上述示例代码中,我们创建了一个LinkedList对象和一个ArrayList对象,使用addAll()方法将ArrayList中的元素全部添加到LinkedList末尾,并判断是否添加成功,最后打印LinkedList对象。运行结果如下:
addAll success, linkedList: [apple, banana, orange]
addAll()方法原理
在LinkedList类中,addAll()方法的实现主要依赖于双向链表结构和Iterator迭代器。
LinkedList的每个节点都有一个prev指针和一个next指针,分别指向该节点的前一个节点和后一个节点。因此,只需要找到末尾节点并将其next指针指向待添加集合的第一个节点,再将待添加集合的最后一个节点的next指针置为null,就可以将该集合全部添加到LinkedList的末尾了。
在这个过程中,我们需要用到Java的Iterator迭代器,通过next()方法依次遍历待添加集合中的元素,并将它们一个个地添加到LinkedList的末尾。
下面是LinkedList类中addAll()方法的源代码:
public boolean addAll(Collection<? extends E> c) {
return addAll(size, c);
}
public boolean addAll(int index, Collection<? extends E> c) {
checkPositionIndex(index);
Object[] a = c.toArray();
int numNew = a.length;
if (numNew == 0)
return false;
Node<E> pred, succ;
if (index == size) {
succ = null;
pred = last;
} else {
succ = node(index);
pred = succ.prev;
}
for (Object o : a) {
@SuppressWarnings("unchecked") E e = (E) o;
Node<E> newNode = new Node<>(pred, e, null);
if (pred == null)
first = newNode;
else
pred.next = newNode;
pred = newNode;
}
if (succ == null) {
last = pred;
} else {
pred.next = succ;
succ.prev = pred;
}
size += numNew;
modCount++;
return true;
}
在上述代码中,第一个addAll()方法调用了第二个addAll()方法,其中指定了insertion point为LinkedList的末尾,实际上就是size。在第二个addAll()方法中,我们首先检查了指定的insertion point是否合法,然后调用了待添加集合的toArray()方法,将该集合转换为数组类型。接下来,我们根据insertion point以及当前LinkedList中的大小,来确定添加的起始位置和结束位置。
接着,我们使用for循环遍历待添加集合中的元素,并将它们一个个地添加到LinkedList的末尾。在for循环中,我们首先将集合元素转换为泛型类型,然后创建一个新的节点对象,将其prev指针指向前一个节点,将其next指针暂时置为空。接着,我们将新节点添加到LinkedList中,更新prev和next指针。在添加最后一个节点时,我们需要将last指针指向它。
最后,我们更新size和modCount值,并返回true表示添加成功。
addAll()方法使用注意事项
在使用Java中的LinkedList addAll()方法时,需要注意以下几点:
- addAll()方法修改了当前LinkedList对象,如果你不希望原LinkedList对象被改变,则需要先创建一个新对象。
- 集合中的元素必须是LinkedList中元素类型的子类。
- 如果添加的集合中包含null元素,则addAll()方法将抛出NullPointerException异常。
- 如果指定的集合不包含元素或者为null,则addAll()方法不会造成任何影响并返回false。
结论
在Java中,LinkedList是一个非常有用的类,它提供了许多操作链表的方法,其中包括addAll()方法。addAll()方法可以将另一个集合中的元素全部添加到当前LinkedList的末尾。在addAll()方法的实现中,我们需要用到Java的Iterator迭代器和双向链表结构。在使用addAll()方法时,需要注意添加前后LinkedList对象的变化,并确保集合中的元素类型是LinkedList中元素类型的子类。
极客笔记