Collection類之詳解(二)
阿新 • • 發佈:2018-12-15
Collection類之詳解(二)
六、List集合
1.概述
有序的 collection(也稱為序列)。此介面的使用者可以對列表中每個元素的插入位置進行精確地控制。使用者可以根據元素的整數索引(在列表中的位置)訪問元素,並搜尋列表中的元素。
List 介面提供了 4 種對列表元素進行定位(索引)訪問方法。
List 介面提供了特殊的迭代器。
2.特有函式
void
add(int index, E element)
在列表的指定位置插入指定元素(可選操作)。
E
remove(int index)
移除列表中指定位置的元素(可選操作)。
E
get(int index)
返回列表中指定位置的元素。
Eset(int index, E element)
用指定元素替換列表中指定位置的元素(可選操作)。
3.案例
List list = new ArrayList(); list.add(111); list.add(222); list.add(333); //list.add(10, "000"); //java.lang.IndexOutOfBoundsException越界異常 //Object obj = list.remove(1); //通過索引刪除元素,將被刪除的元素返回 //list.remove(111); //刪除的時候不會自動裝箱,把111當作索引,產生越界異常 //通過索引遍歷List集合 for(int i = 0;i < list.size(); i++) { System.out.println(list.get(i)); } list.set(1, "444"); //將指定位置的元素修改
注:遍歷時,如果需要使用子類方法,和Collection遍歷一樣需要向下轉型
4.迭代器ListIterator
(1)概述
系列表迭代器,允許程式設計師按任一方向遍歷列表、迭代期間修改列表,並獲得迭代器在列表中的當前位置。
(2)案例
問題:
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("world");
list.add("c");
list.add("d");
list.add("e");
Iterator it = list.iterator(); //獲取迭代器
while(it.hasNext()) { //判斷集合中是否有元素
String str = (String)it.next(); //向下轉型
//在遍歷的同時修改集合內元素,產生併發異常ConcurrentModificationException
if("world".equals(str)) {
list.add("javaee");
}
}
解決:
ListIterator lit = list.listIterator(); //獲取迭代器(List集合特有的)
while(lit.hasNext()) {
String str = (String)lit.next(); //向下轉型
if("world".equals(str)) {
//此時同樣產生併發修改ConcurrentModificationException
//list.add("javaee");
lit.add("javaee");
}
}
(3)常用方法
boolean
hasNext()
以正向遍歷列表時,如果列表迭代器有多個元素,則返回 true(換句話說,如果 next 返回一個元素而不是丟擲異常,則返回 true)。boolean
hasPrevious()
如果以逆向遍歷列表,列表迭代器有多個元素,則返回 true。
E
next()
返回列表中的下一個元素。E
previous()
返回列表中的前一個元素。
案例:
public static void main(String[] args) {
List list = new ArrayList();
list.add("a");
list.add("b");
list.add("c");
list.add("d");
list.add("e");
ListIterator lit = list.listIterator(); //獲取迭代器
while(lit.hasNext()) {
System.out.print(lit.next()); //獲取元素並將指標向後移動
}
System.out.println("\n-----------------");
while(lit.hasPrevious()) {
System.out.print(lit.previous()); //獲取元素並將指標向前移動
}
}
/*
abcde
-----------------
edcba
*/
七、Vector類
1.概述
Vector
類可以實現可增長的物件陣列。與陣列一樣,它包含可以使用整數索引進行訪問的元件。但是,Vector
的大小可以根據需要增大或縮小,以適應建立 Vector
後進行新增或移除項的操作。
2.特有方法
void
addElement(E obj)
將指定的元件新增到此向量的末尾,將其大小增加 1。
E
elementAt(int index)
返回指定索引處的元件。
Enumeration<E>
elements()
返回此向量的元件的列舉。
3.案例
public static void main(String[] args) {
Vector v = new Vector();
v.addElement("a");
v.addElement("b");
v.addElement("c");
v.addElement("d");
Enumeration en = v.elements(); //獲取列舉
while(en.hasMoreElements()) { //判斷集合中是否有元素
System.out.println(en.nextElement()); //獲取集合中的元素
}
}
注:Vector是JAVA早期版本中的類,目前大多數都使用ArrayList代替。
八、List的三個子類的特點
ArrayList:
底層資料結構是陣列,查詢快,增刪慢。
執行緒不安全,效率高。
Vector:
底層資料結構是陣列,查詢快,增刪慢。
執行緒安全,效率低。
Vector相對ArrayList查詢慢(執行緒安全的)
Vector相對LinkedList增刪慢(陣列結構)
LinkedList:
底層資料結構是連結串列,查詢慢,增刪快。
執行緒不安全,效率高。
Vector和ArrayList的區別:
Vector是執行緒安全的,效率低
ArrayList是執行緒不安全的,效率高
共同點:都是陣列實現的
ArrayList和LinkedList的區別
ArrayList底層是陣列結果,查詢和修改快
LinkedList底層是連結串列結構的,增和刪比較快,查詢和修改比較慢
共同點:都是執行緒不安全的