Java 集合(二) List

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(poppush),但本质也是直接调用 addFirst 和 removeFirst。

返回值方法名描述
Epop()从当前栈中推出一个元素。
voidpush(E e)放入一个元素至当前栈。

官方源码如下,可以看出就是 addFirst 和 removeFirst 换了一个名称而已。

image-20220605104050902

image-20220605104107442

使用 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 换一个名字而已。

返回值方法名描述
booleanofferFirst(E e)将指定元素插入至头部
booleanofferLast(E e)将指定元素插入至尾部
Epoll()获取并移除头部元素
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值