學習Java的同學注意了!!!
學習進程中遇到甚么問題或想獲得學習資源的話,歡迎加入Java學習交換群,群號碼:183993990 我們1起學Java!
List集合代表1個有序集合,集合中每一個元素都有其對應的順序索引。List集合允許使用重復元素,可以通過索引來訪問指定位置的集合元素。
List作為Collection接口的子接口,可使用Collection接口里的全部方法。List是有序集合,所以List集合里增加了1些根據索引來操作集合元素的方法:
List集合可以根據索引來插入、替換和刪除集合元素。
示例程序:
public class TestList
{
public static void main(String[] args)
{
List books = new ArrayList();
//向books集合中添加3個元素
books.add(new String("輕量級J2EE企業利用實戰"));
books.add(new String("Struts2權威指南"));
books.add(new String("基于J2EE的Ajax寶典"));
System.out.println(books);
//將新字符串對象插入在第2個位置
books.add(1 , new String("ROR敏捷開發最好實踐")); //已添加的對象,和下面語句做對照
for (int i = 0 ; i < books.size() ; i++ )
{
System.out.println(books.get(i));
}
//刪除第3個元素
books.remove(2);
System.out.println(books);
//判斷指定元素在List集合中位置:輸出1,表明位于第2位
System.out.println(books.indexOf(new String("ROR敏捷開發最好實踐"))); //新創建的對象
//將第2個元素替換成新的字符串對象
books.set(1, new String("Struts2權威指南"));
System.out.println(books);
//將books集合的第2個元素(包括)到第3個元素(不包括)截取稱子集合
System.out.println(books.subList(1 , 2));
}
}
程序運行結果:
[輕量級J2EE企業利用實戰, Struts2權威指南, 基于J2EE的Ajax寶典]
輕量級J2EE企業利用實戰
ROR敏捷開發最好實踐
Struts2權威指南
基于J2EE的Ajax寶典
[輕量級J2EE企業利用實戰, ROR敏捷開發最好實踐, 基于J2EE的Ajax寶典]
1
[輕量級J2EE企業利用實戰, Struts2權威指南, 基于J2EE的Ajax寶典]
[Struts2權威指南]
程序說明:List集合可使用普通for循環來遍歷集合元素。List判斷兩個對象相等只要通過equals方法比較返回true便可。如在判斷“ROR敏捷開發最好實踐”字符串的位置是,新創建了1個新字符串對象,但是程序仍返回第1次創建字符串對象的位置。當調用List的set(int index, Object element)方法來改變List集合指定索引處元素時,指定的索引必須是List集合的有效索引。
與set只提供了1個iterator()方法不同,List還額外提供了1個listIteratro()方法,該方法返回1個ListIterator對象,ListIterator接口繼承了Iterator接口,提供了專門操作List的方法。
ListIterator接口在Iterator接口基礎上增加了以下方法:
程序示例:
public static void main(String[] args)
{
String[] books = {
"Struts2權威指南",
"輕量級J2EE企業利用實戰"
};
List bookList = new ArrayList();
for (int i = 0; i < books.length ; i++ )
{
bookList.add(books[i]);
}
ListIterator lit = bookList.listIterator();
while (lit.hasNext())
{
System.out.println(lit.next());
lit.add("-------分隔符-------");
}
System.out.println("==========下面開始反向迭代===========");
while(lit.hasPrevious())
{
System.out.println(lit.previous());
}
}
}
程序運行結果:
Struts2權威指南
輕量級J2EE企業利用實戰
==========下面開始反向迭代===========
-------分隔符-------
輕量級J2EE企業利用實戰
-------分隔符-------
Struts2權威指南
程序說明:List通過ListTterator迭代集合時,便可采取next()方法進行正向迭代,迭代進程中可使用add()方法向上1次迭代元素的后面添加1個新元素。同時程序演示了向前迭代。
ArrayList和Vector作為List類的兩個典型實現,完全支持前面介紹的List接口全部功能。
ArrayList和Vector類都是基于數組實現的List類,他們封裝了1個動態再分配的Object[]數組。每一個ArrayList或Vector對象有1個capacity屬性,表示它們所封裝的Object[]數組的長度。capacity會添加元素的個數而自動增加。當向集合中添加大量元素時,可使用ensureCapacity方法1次性地增加capacity。這可以減少增加重分配次數,從而提供性能。capacity大小也能夠在創建時就指定,該屬性默許為10.
ArrayList和Vector提供以下兩個方法來操作capacity屬性:
ArrayList和Vector用法幾近相同,Vector是1個古老的集合(從JDK1.0),起初Java還沒有提供系統的集合框架,所以Vector里提供了1些方法名很長的方法:例如addElement(Object obj), 同等于add()方法。從JDK1.2以后,Java提供了系統的集合框架,就將Vector改成實習List接口,作為List的實習之1,從而致使Vector里有1些功能重復的方法。Vector具有很多缺點,通常盡可能少用Vector實現類。
ArrayList和Vector的區分:ArrayList是線程不安全的,多個線程訪問同1個ArrayList集合時,如果有超過1條線程修改了ArrayList集合,則程序必須手動保證該集合的同步性。Vector集合則是線程安全的,無線程序保證該集合的同步性。由于Vector是線程安全的,所以Vector的性能比ArrayList的性能要低。實際上,即便保證List集合線程安全,一樣不推薦使用Vector實現類。Collections工具類,可以將1個ArrayList變成線程安全的。
Vector還提供了1個Stack子類,它用于摹擬了”棧“這類數據結構,”棧“通常是指”落后先出“(LIFO)的容器。最后”push“進棧的元素,將最早被”pop“出棧。與Java中其他集合1樣,進棧出棧的都是Object,因此從棧中取出元素后必須做類型轉換,除非你只是使用Object具有的操作。所以stack類提供了以下幾個方法:
程序示例:
public class TestVector
{
public static void main(String[] args)
{
Stack v = new Stack();
//順次將3個元素push入"棧"
v.push("Struts2權威指南");
v.push("輕量級J2EE企業利用實戰");
v.push("ROR敏捷開發最好實踐");
//輸出:[Struts2權威指南, 輕量級J2EE企業利用實戰, ROR敏捷開發最好實踐]
System.out.println(v);
//訪問第1個元素,但其實不將其pop出"棧",輸出:ROR敏捷開發最好實踐
System.out.println(v.peek());
//仍然輸出:[Struts2權威指南, 輕量級J2EE企業利用實戰, ROR敏捷開發最好實踐]
System.out.println(v);
//pop出第1個元素,輸出:ROR敏捷開發最好實踐
System.out.println(v.pop());
//仍然輸出:[Struts2權威指南, 輕量級J2EE企業利用實戰]
System.out.println(v);
}
}
程序運行結果:
[Struts2權威指南, 輕量級J2EE企業利用實戰, ROR敏捷開發最好實踐]
ROR敏捷開發最好實踐
[Struts2權威指南, 輕量級J2EE企業利用實戰, ROR敏捷開發最好實踐]
ROR敏捷開發最好實踐
[Struts2權威指南, 輕量級J2EE企業利用實戰]
List還有1個LinkedList的實現,它是1個基于鏈表實現的List類,對順序訪問集合中的元素進行了優化,特別是當插入、刪除元素時速度非常快。由于LinkedList即實現了List接口,也實現了Deque接口(雙向隊列),Deque接口是Queue接口的子接口,它代表1個雙向列表,Deque接口里定義了1些可以雙向操作隊列的方法:
從上面方法中可以看出,LinkedList不但可以當做雙向隊列使用,也能夠當做“棧”使用。同時,LinkedList實現了List接口,所以還被當做List使用。
程序示例:
public class TestLinkedList
{
public static void main(String[] args)
{
LinkedList books = new LinkedList();
//將字符串元素加入隊列的尾部
books.offer("Struts2權威指南");
//將1個字符串元素入棧
books.push("輕量級J2EE企業利用實戰");
//將字符串元素添加到隊列的頭部
books.offerFirst("ROR敏捷開發最好實踐");
for (int i = 0; i < books.size() ; i++ )
{
System.out.println(books.get(i));
}
//訪問、其實不刪除隊列的第1個元素
System.out.println(books.peekFirst());
//訪問、其實不刪除隊列的最后1個元素
System.out.println(books.peekLast());
//采取出棧的方式將第1個元素pop出隊列
System.out.println(books.pop());
//下面輸出將看到隊列中第1個元素被刪除
System.out.println(books);
//訪問、并刪除隊列的最后1個元素
System.out.println(books.pollLast());
//下面輸出將看到隊列中只剩下中間1個元素:輕量級J2EE企業利用實戰
System.out.println(books);
}
}
程序運行結果:
ROR敏捷開發最好實踐
輕量級J2EE企業利用實戰
Struts2權威指南
ROR敏捷開發最好實踐
Struts2權威指南
ROR敏捷開發最好實踐
[輕量級J2EE企業利用實戰, Struts2權威指南]
Struts2權威指南
[輕量級J2EE企業利用實戰]
說明:程序中示范了LinkedList作為雙向隊列、棧和List集合的用法。LinkedList與ArrayList、Vector的實現機制完全不同,ArrayList、Vector內部以數組的情勢來保存集合中的元素,因此隨機訪問集合元素上有較好的性能;而LinkedList內部以鏈表的情勢來保存集合中的元素,因此隨機訪問集合時性能較差,但在插入、刪除元素時性能非常出色(只需改變指針所指的地址便可)。Vector因實現了線程同步功能,所以各方面性能有所降落。
關于使用List集合的幾點建議:
學習Java的同學注意了!!!
學習進程中遇到甚么問題或想獲得學習資源的話,歡迎加入Java學習交換群,群號碼:183993990 我們1起學Java!