1. 概述
在这个简短的教程中,我们将展示如何从List中删除第一个元素。
我们将为List接口的两个常见实现-ArrayList和LinkedList执行此操作。
2. 创建List
首先,让我们填充我们的List:
@Before
public void init() {
list.add("cat");
list.add("dog");
list.add("pig");
list.add("cow");
list.add("goat");
linkedList.add("cat");
linkedList.add("dog");
linkedList.add("pig");
linkedList.add("cow");
linkedList.add("goat");
}
3. ArrayList
其次,让我们从ArrayList中删除第一个元素,并确保我们的列表不再包含它:
@Test
public void givenList_whenRemoveFirst_thenRemoved() {
list.remove(0);
assertThat(list, hasSize(4));
assertThat(list, not(contains("cat")));
}
如上所示,我们使用remove(index)方法删除第一个元素-这也适用于List接口的任何实现。
4. LinkedList
LinkedList也实现了remove(index)方法(以它自己的方式),但它也有removeFirst()方法。
让我们确保它按预期工作:
@Test
public void givenLinkedList_whenRemoveFirst_thenRemoved() {
linkedList.removeFirst();
assertThat(linkedList, hasSize(4));
assertThat(linkedList, not(contains("cat")));
}
5. 时间复杂度
尽管这些方法看起来相似,但它们的效率不同。ArrayList的remove()方法需要O(n)时间,而LinkedList的removeFirst()方法需要O(1)时间。
这是因为ArrayList在底层使用数组,而remove()操作需要将数组的其余部分复制到开头。数组越大,需要移动的元素就越多。
与此不同,LinkedList使用指针,这意味着每个元素都指向下一个和前一个元素。
因此,删除第一个元素意味着只是更改指向第一个元素的指针。此操作始终需要相同的时间,而不取决于列表的大小。
6. 总结
在本文中,我们介绍了如何从List中删除第一个元素,并比较了此操作对于ArrayList和LinkedList实现的效率。
与往常一样,本教程的完整源代码可在GitHub上获得。
Show Disqus Comments
Post Directory
扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章