持有对象-3

本文深入探讨了LinkedList在Java中的高效使用场景,特别是在插入、删除等操作上的优势,以及如何利用其特性实现栈、队列和双端队列的功能。文章详细对比了LinkedList与ArrayList在不同操作上的性能差异,并提供了具体的源码分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LinkedList

LinkedList也像ArrayList一样实现了基本的List接口,但是它执行某些操作(在List的中 间插入和移除)时比ArrayList更高效,但在随机访问操作方面却要逊色些。
LinkedList还添加了可以使其用作栈、队列或双端队列的方法。
这些方法中有些彼此之间只是名称有些差异,或者只存在些许差异,以使得这些名字在特定用法的上下文环境中更加适用(特别是在Queue中)。
1)返回第一个元素
getFirst和element完全一 样,它们都返回列表的头(第一个元素),而并不移除它,如果List为空,则拋出NoSuchElementException。
从源码来看:
public E element() {
        return getFirst();
    }

peek方法与这两个方式只是稍有差异,它在列表为空时返回null。

从源码来看
public E peek() {
        final Node<E> f = first;
        return (f == null) ? null : f.item;
    }

2)移除元素

removeFirst,remove,pop 也是完全一样的, 它们移除并返回列表的头,而在列表为空时抛出NoSuchElementException。
poll稍有差异,它在列表为空时返回null。removeLast移除并返回列表的最后一个元素;他们底层都用的是unlinkFirst()
来看源码:
public E removeFirst() {
        final Node<E> f = first;
        if (f == null)
            throw new NoSuchElementException();
        return unlinkFirst(f);
}

public E remove() {
        return removeFirst();
}

public E pop() {
        return removeFirst();
}

public E poll() {
        final Node<E> f = first;
        return (f == null) ? null : unlinkFirst(f);
}

3)增加元素

      addFirst与add和addLast相同,它们都将某个元素插入到列表的首(尾)部。
 

栈-Stack

LinkedList具有能够直接实现栈的所有功能的方法,因此可以直接将LinkedList作为栈使用。不过,有时一个真正的“栈”更能把事情讲清楚:

 
public class Stack<T> {
    private LinkedList<T> storage = new LinkedList<T>();

    public void push(T v) {
        storage.addFirst(v);
    }

    public T peek() {
        return storage.getFirst();
    }

    public T pop() {
        return storage.removeFirst();
    }

    public boolean empty() {
        return storage.isEmpty();
    }

    public String toString() {
        return storage.toString();
    }
}

这里通过使用范型,引入了在栈的类定义中最简单的可行示例。类名之后的<T>告诉编译器这将是一个参数化类型,而其中的类型参数,即在类被使用时将会被实际类型替换的参数,就是T。大体上,这个类是在声明 我们在定义一个可以持有T类型对象的Stack。 Stack是 用LinkedList实现的,而LinkedList也被 告知它将持有T类型对象。注意,push接受的是T类型的对象,而peek0和pop0将返回T类型的对象。peek方法将提供栈顶元素,但是并不将其从栈顶移除,而pop将移除并返回栈顶元素

 

 

转载于:https://www.cnblogs.com/QianYue111/p/10245127.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值