1. 程式人生 > >JAVA程式設計思想學習筆記(十一)容器類List

JAVA程式設計思想學習筆記(十一)容器類List

容器類

在《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]