JAVA程式設計思想學習筆記(十一)容器類List
阿新 • • 發佈:2019-01-12
容器類
在《java程式設計思想》一書中,容器類本是在持有物件那一章節裡面的,這裡我特意給提出來了,因為內容程式碼比較多,與其放一起顯得太臃腫,倒不如這樣來的清爽些。
List
List承諾可以將元素維護在特定的序列中,List介面在Collection的基礎上添加了大量的方法,使得可以在List中插入和移除元素。
有兩種型別的List:
- 基本的ArrayList,它擅長於隨機訪問元素,但是在中間插入和移除元素時比較慢。
- LinkedList,它通過代價比較低的在List中間進行插入和刪除操作,提供了優化的順序訪問。但是它在隨機訪問方面比較差。
下面先介紹
ArrayList
對於ArrayList的方法可以先看下程式碼:
class Word{ String w; Word(String w){ this.w=w; } public String toString(){ return w; } } class WordD extends Word{ WordD(String w) { super(w); // TODO Auto-generated constructor stub } public String toString(){ return w+"D"; } } public class ListTest { public static void main(String[] args) { // TODO Auto-generated method stub List<Word> ws = new ArrayList<Word>(); Word a = new Word("A"); Word b = new Word("B"); Word c = new Word("C"); Word d = new WordD("D"); Word e = new Word("E"); //增 ws.add(a); ws.add(b); ws.add(c); ws.add(d); System.out.println("1:"+ws); //刪 System.out.println("2:"+"e:"+ws.remove(e)+" b:"+ws.remove(b)); System.out.println("3:"+ws); //插 ws.add(2, e); System.out.println("4:"+ws); //查 System.out.println("5:"+ws.get(0)+":"+ws.indexOf(ws.get(0))); //擷取 List<Word> sub = ws.subList(1, 3); System.out.println("6:"+sub); System.out.println("7:"+ws.containsAll(sub)); //清空 ws.clear(); System.out.println("8:"+ws); } }
執行結果:
1:[A, B, C, DD]
2:e:false b:true
3:[A, C, DD]
4:[A, C, E, DD]
5:A:0
6:[C, E]
7:true
8:[]
看了程式碼應該對ArrayList有一個大致的瞭解,下面仔細說下:
- add方法:在list中新增物件,可以是子類的物件。可以在引數中設定新增的位置,作為插入來使用。
- remove方法:將要移除的物件的引用傳遞給remove方法,就可以在List中移除該物件。刪除成功返回true,要是想刪除的物件不在List中,則返回false。
- get方法:根據索引獲得對應的在List中的物件。
- indexOf方法:獲得物件在List中的索引位置。
- sublist方法:在List中擷取一段,有兩個引數,一個起始位置的索引,另一個是結束位置的索引,需要注意的是,截取出來的內容包括起始位置,但是不包括結束位置。
- clear方法,清空List。
常用的方法基本就這些,還有一些其他的方法,在瞭解基本的這些後,也很容易看出來怎麼用,比如addAll方法,顯然就是add方法的變形,引數為一組物件就可以了。
接下來介紹
LinkedList
LinkedList也像ArrayList一樣實現了基本的List介面,但是它執行某些操作時比ArrayList更高效,但是在隨機訪問方面更遜一籌。
Linked還添加了可以使其用作棧、佇列或雙端佇列的方法。
這些方法中有些彼此之間只是名稱的差異,或者存在些許差異。例如,getFirst和element完全一樣,都是返回表頭,而不移除它,如果為空,則跑出異常,而peek只是稍有差異,為空時返回null。
下面展示各方法的差異性:
class Word{
String w;
Word(String w){
this.w=w;
}
public String toString(){
return w;
}
}
class WordD extends Word{
WordD(String w) {
super(w);
// TODO Auto-generated constructor stub
}
public String toString(){
return w+"D";
}
}
public class ListTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
LinkedList<Word> ws = new LinkedList<Word>();
Word a = new Word("A");
Word b = new Word("B");
Word c = new Word("C");
Word d = new WordD("D");
Word e = new Word("E");
ws.add(a);
ws.add(b);
ws.add(c);
ws.add(d);
System.out.println("getFirst:"+ws.getFirst());
System.out.println("element:"+ws.element());
System.out.println("peek:"+ws.peek());
System.out.println("remove:"+ws.remove());
System.out.println("removeFirst:"+ws.removeFirst());
System.out.println("poll:"+ws.poll());
System.out.println("ws:"+ws);
ws.addFirst(e);
System.out.println("addFirst:"+ws);
ws.offer(a);
System.out.println("offer:"+ws);
ws.add(c);
System.out.println("add:"+ws);
}
}
輸出結果:
getFirst:A
element:A
peek:A
remove:A
removeFirst:B
poll:C
ws:[DD]
addFirst:[E, DD]
offer:[E, DD, A]
add:[E, DD, A, C]