持有对象-3

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将移除并返回栈顶元素

 

 

posted @ 2019-01-09 16:20  墨冰心  阅读(120)  评论(0编辑  收藏  举报