LinkedList 除了與 ArrayList 提供的鏈表常用的方法之外,還提供了對棧,隊列,以及雙端隊列的支持。所以 LinkedList 的方法比 ArrayList 豐富,并且將 LinkedList 向上轉型為 List 時,這些這棧,隊列,雙端隊列支持的方法也將不能使用。
Queue 接口 繼承了 Collection 接口,并在 COllection 接口的基礎上擴展了對容器元素的插入,提取,以及檢查操作。每種操作都提供了兩種不同的方法,當相應的操作失敗時,一種拋出異常而另一種返回一個特殊值(null 或者 false)。插入失敗的接口設計針對的是容量大小有限制的隊列,一般情況下不會失敗。
拋出異常 | 返回特殊值 |
---|---|
add(e) | offer(e) |
remove() | poll() |
element() | peek() |
在隊列的使用中,不應該插入 null 值,盡管它的實現 LinkedList 允許插入,但是也不應該這樣做,應為隊列 poll() 使用 null 作為隊列為空的標志。
拋出異常 | 返回特殊值 |
---|---|
addFirst(e)/addLast(e) | offerFirst(e)/offerLast(e) |
removeFirst()/removeLast() | pollFirst()/pollLast() |
getFirst()/getLast() | peekFirst()/peekLast() |
queue和deque 方法對比
queue | deque |
---|---|
add(e) | addFirst(e) |
offer(e) | offerFirst(e) |
remove() | removeFirst() |
poll() | pollFirst() |
element() | getFirst() |
peek() | peekFirst() |
雙端隊列的接口設計時提供了對棧的支持,即可以將雙端隊列作為棧來操作。而這種用法要優于舊的 Stack 類。
stack | deque |
---|---|
push(e) | addFirst(e) |
pop() | removeFirst() |
peek() | peekFirst() |
在優先隊列上調用 offer() 方法插入對象時,這個對象在隊列內會被排序。自己定義的類需要實現 comparable 或者提供自動的比較器。
Map 通過 keySet(),values() 可以返回 COllection ,從而與 Collection 建立聯系。
Collection 可以直接使用 foreach 語法,但是 Iterator 不能。但是兩者各有優缺點。Collection 接口可以通過繼承 AbstractColleciton 類因此有多繼承的限制,而使用 Iterator 只需要在類定義一個返回該接口實例的方法。
public class MyCollection extends AbstractCollection<String> { private String[] array; public MyCollection(){ super(); array = new String[]{"red","blue","black"}; } public Iterator<String> iterator() { return new Iterator<String>() { private int index = 0; public boolean hasNext() { return index < size(); } public String next() { return array[index++]; } }; } public int size() { return array.length; } public static void main(String[] args){ MyCollection myCollection = new MyCollection(); CollectionTest.display(myCollection); }}public class MyCollection { private String[] array; public MyCollection(){ super(); array = new String[]{"red","blue","black"}; } public Iterator<String> iterator() { return new Iterator<String>() { private int index = 0; public boolean hasNext() { return index < size(); } public String next() { return array[index++]; } }; } public int size() { return array.length; } public static void main(String[] args){ MyCollection myCollection = new MyCollection(); CollectionTest.display(myCollection.iterator()); }}Iterable 是 java SE5 之后添加的新接口,任何實現該接口的類都可以使用 foreach 語句,Colleciton 接口繼承了 Iterable 接口。但是數組雖然可以使用 foreach,但是數組并沒有實現 Iterable 接口。public class MyCollection implements Iterable<String> { private String[] array; public MyCollection(){ super(); array = new String[]{"red","blue","black"}; } public Iterator<String> iterator() { return new Iterator<String>() { private int index = 0; public boolean hasNext() { return index < size(); } public String next() { return array[index++]; } }; } public int size() { return array.length; } public static void main(String[] args){ MyCollection myCollection = new MyCollection(); for(String color : myCollection){ System.out.print(color + " "); } }}使用適配器模式顯式的調用 foreach 語法。通過上面的例子可以知道,當需要支持 foreach 語法時可以實現 Iterable 接口。但是假設我們希望有多個不同方式來進行迭代,這時可以采用適配器模式。
public Iterable<String> reversed(){ return new Iterable<String>() { public Iterator<String> iterator() { return new Iterator<String>() { private int i = size(); public boolean hasNext() { return i > 0; } public String next() { return array[--i]; } }; } };}MyCollection myCollection = new MyCollection();for(String color : myCollection){ System.out.print(color + " ");}System.out.println();for(String color : myCollection.reversed()){ System.out.print(color + " ");}新聞熱點
疑難解答