對Java 中List的理解
現在在實際開發工作中經常用到各種集合類資料,有必要好好總結下
1.基本知識點
(1)形式上為一個集合介面,因為List介面實現了Collection介面,所以List介面擁有Collection介面提供的所有常用方法 。
只要是集合類介面都會有個“迭代子”( Iterator ),利用這個迭代子,就可以對list記憶體的一組物件進行操作。 所有要想操作這個list記憶體的東西,就首先要得到此迭代子的例項:Iterator
it=l.iterator(); 用add()方法即可新增新的成員物件,他可以新增的僅僅只能為物件,不能新增基本資料型別;容器還對應get(),remove()方法來獲取和刪除資料成員;
(2)最大特點: 有序、可重複;
(3)常用實現類有ArrayList和LinkedList
ArrayList:底層資料結構的實現方式採用的是陣列結構,其特點是查詢快,增刪較慢,執行緒不同步;
LinkedList:底層資料結構的實現是連結串列結構,其特點是查詢較慢,增刪較快
Vector:底層是陣列資料結構 執行緒同步(無論查詢還是增刪都很慢,被ArrayList替代了)
注意:
需要快速插入,刪除元素,應該使用LinkedList;
需要快速隨機訪問元素,應該使用ArrayList;
對於“單執行緒環境” 或者 “多執行緒環境,但List僅僅只會被單個執行緒操作”,此時應該使用非同步的類(如ArrayList);
對於“多執行緒環境,且List可能同時被多個執行緒操作”,此時,應該使用同步的類(如Vector);
2. 常用方法和功能
(1)實現方式:
List<String> list1 = new ArrayList<String>();
List<String> list2 = new LinkedList<String>();
(2)常用方法:
add(int index, Object obj)方法和set(int index, Object obj)方法,前者是向指定索引位置新增物件,而後者是修改指定索引位置的物件
list1.add(0, "JAVA");
list1.add(1, "C++");
list1.add(2, "C");
list1.add(3, "Phython");
list1.set(3, "改過了");
(3)遍歷方式有三種:a.用迭代器Iterator ,在大量資料情況,用迭代器遍歷是最快的(也可以用List集合特有的迭代器:ListIterator(是Iterator的子介面))
Iterator<String> it = list1.iterator();
while (it.hasNext()) {
System.out.println(it.next());
}
注意:
在迭代時,是不可以通過集合物件的方法操作集合中的元素
因為會發生ConcurrentModificationException異常(併發異常)
所以,在迭代器時,只能用迭代器的方法操作元素
因為Iterator方法是有限的所以只能對元素進行判斷,取出,刪除的操作
如果想要其他的操作如新增,修改等,就需要使用其子介面,ListIterator
該介面只能通過List集合的listIterator方法獲取
ListIterator<String> it2 = list2.listIterator();
while (it2.hasNext()) {
if (it2.next().equals("C++")) {
it2.add("新加一個");
//it2.set("修改你");
}
}
b.
for (String data : list1) {
System.out.println(data);
}
c.
for (int i = 0; i < list1.size(); i++) {
System.err.println(list1.get(i));
}
(4)LinkedList特有方法:
addFirst();在頭部新增元素 addLast();在尾部新增元素
getFirst(); getLast(); 獲取元素但不刪除元素。如果集合中沒有元素,會出現NoSuchElementException
removeFirst(); removeLast(); 獲取元素但是刪除元素。如果集合中沒有元素,會出現NoSuchElementException
在JDK1.6出現了替代方法
offerFirst(); offerLast();
peekFirst(); peekLast(); 獲取元素,但是元素不被刪除。如果集合中沒有元素,會返回null
pollFirst(); pollLast(); 獲取元素,但是元素被刪除。如果集合中沒有元素,會返回null