7.迭代器
iterator
迭代器是一个对象,它的工作是遍历并选择序列中的对象,而客户端程序员不必知道或关心该序列底层的结构。此外,迭代器通常被称为轻量级对象:创建它的代价小。也因为如此,Java的Iterator只能单向移动。用法:
1)使用方法iterator()要求容器返回一个Iterator。Iterator将准备好返回序列的第一个元素。
2)使用next()获得序列中的下一个元素。
3)使用hasNext()检查序列中是否还有元素。
4)使用remove()将迭代器通过it.next()返回的元素删除。例如:it.next(); it.remove();
但是,如果只是想遍历List,不打算修改,那么foreach语法会更简洁。
List,Set都可以产生Iterator对象。并且,通过iterator操作对象的方式都一样,不能关心List或Set的具体实现。这也正是Iterator的真正威力:能够将遍历序列的操作与序列底层的结构分离。
ListIterator
ListIterator是一个更加强大的Iterator的子类型,它只能用于各种List类的访问。ListIterator可以双向移动。它还可以产生相对于迭代器在列表中指向的当前位置元素和后一个元素的索引。可以使用set()方法替换它访问过的最后一个元素。通过listIterator()方法产生一个指向List开始处的ListIterator,还可以通过调用listIterator(n)方法创建一个一开始就指向列表索引为n的元素处的ListIterator。
8.LinkedList
LinkedList也实现了List接口,它在list的中间插入和移除元素比ArrayList快,但查询比ArrayList慢。
LinkedList还添加了可以使其用作栈,队列,双端队列的方法。这些方法中有些只是名字有差异,或者只存在一点差异,以使得这些名字在特定用法的上下文环境中更加适用。例如:getFirst()和element()完全一样,都返回列表的第一个元素,如果List为空,则抛出NoSuchElementException。peek()方法与这两个方式一样,只是列表为空时返回null。
addFirst()与add()和addLast()相同,它们都将某个元素插入到列表的尾(端)部。
removeLast():移除并返回列表中的最后一个元素。
9.栈Stack
栈是指后进先出的容器。
LinkedList具有能够直接实现栈的所有功能的方法,因此可以直接将LinkedList作为栈使用。不过,有时一个真正的“栈”更能把事情讲清楚:
public class Stack<T> {
private LinkedList<T> storage = new LinkedList<T>();
public void push(T t){
storage.addFirst(t);
}
public T peek(){
return storage.getFirst();
}
public T pop(){
return storage.removeFirst();
}
public boolean empty(){
return storage.isEmpty();
}
public String toString(){
return storage.toString();
}
}