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