Java 集合(二) List
ArrayList
ArrayList 底层是基于 数组
实现的,根据索引定位元素快,增删需要做元素的移位操作。
ArrayList 是一个动态数组,初始容量为 10,该容量代表了数组的大小。随着容器中的元素不断增加,容器的大小也会随着增加。
ArrayList擅长于随机访问。同时ArrayList是非同步的。
LinkedList
LinkedList 底层数据结构是 双链表
,查询慢,但首尾操作的速度是极快。
得益于链表具有良好的插入和删除操作,LinkedList 提供了一些 独有的 API
。
方法名称 | 说明 |
---|---|
public void addFirst(E e) | 在该列表开头插入指定的元素 |
public void addLast(E e) | 将指定的元素追加到此列表的末尾 |
public E getFirst() | 返回此列表中的第一个元素 |
public E getLast() | 返回此列表中的最后一个元素 |
public E removeFirst() | 从此列表中删除并返回第一个元素 |
public E removeLast() | 从此列表中删除并返回最后一个元素 |
从上表可以看出,这些方法都是聚焦于 首尾操作
,这也体现了双链表的特性,及双链表的增删改查效率都极高。
在数据结构中 栈
队列
的操作都是在最边处进行操作的,所以 LInkedList 可以实现栈和队列。
LinkedList 实现栈
栈的操作规则为:在栈顶进行出栈和入栈操作。即 先进后出
public class UseLinkedList {
public static void main(String[] args) {
LinkedList<Integer> numberList = new LinkedList<>();
// 栈的操作均在栈顶操作
// 从栈顶入栈: 1->2->3
numberList.addFirst(1);
numberList.addFirst(2);
numberList.addFirst(3);
System.out.println("当前栈中的元素为:" + numberList);
// 从栈顶出栈
int listSize = numberList.size();
for (int i = 0; i < listSize; i++) {
// 获取栈顶元素
System.out.println("元素:" + numberList.getFirst() + " 出栈");
// 移除栈顶元素
numberList.removeFirst();
}
}
}
输出结果为:
当前栈中的元素为:[3, 2, 1]
元素:3 出栈
元素:2 出栈
元素:1 出栈
栈的操作均是在 栈顶
进行,所以只需要调用关于链表首部操作的方法即可。
**注意:**LinkedList 为我们提供了栈的 API(pop
和 push
),但本质也是直接调用 addFirst 和 removeFirst。
返回值 | 方法名 | 描述 |
---|---|---|
E | pop() | 从当前栈中推出一个元素。 |
void | push(E e) | 放入一个元素至当前栈。 |
官方源码如下,可以看出就是 addFirst 和 removeFirst 换了一个名称而已。
使用 pop 和 push 进行栈的操作:
public class UseLinkedListForStack {
public static void main(String[] args) {
// 声明一个 LinkedList 对象
LinkedList<Integer> stack = new LinkedList<>();
// 元素入栈(使用 push )
stack.push(1);
stack.push(2);
stack.push(3);
System.out.println("当前栈中元素有:" + stack);
int stackSize = stack.size();
// 元素出栈(使用 pop)
for (int i = 0; i < stackSize; i++) {
System.out.println("元素:" + stack.pop() + " 出栈");
System.out.println("当前栈中元素有:" + stack);
}
}
}
输出结果:
当前栈中元素有:[3, 2, 1]
元素:3 出栈
当前栈中元素有:[2, 1]
元素:2 出栈
当前栈中元素有:[1]
元素:1 出栈
当前栈中元素有:[]
LinkedList 实现队列
队列的操作规则为:从队尾入队,从队首出队。即 先进先出
public class UseLinkedListForQueue {
public static void main(String[] args) {
LinkedList<Integer> queue = new LinkedList<>();
// 从队尾入队
queue.addLast(1);
queue.addLast(2);
queue.addLast(3);
System.out.println("当前队列中的元素为:" + queue);
int queueSize = queue.size();
for (int i = 0; i < queueSize; i++) {
// 取出队首元素
System.out.println("元素:" + queue.getFirst() + " 出队");
// 移除队首元素
queue.removeFirst();
System.out.println("当前队列中的元素为:" + queue);
}
}
}
与栈一样,LinkedList 也为队列提供了专有的 API,其实现也是 addFirst 和 addLast 换一个名字而已。
返回值 | 方法名 | 描述 |
---|---|---|
boolean | offerFirst(E e) | 将指定元素插入至头部 |
boolean | offerLast(E e) | 将指定元素插入至尾部 |
E | poll() | 获取并移除头部元素 |