ArrayList與LinkedList都繼承自List锄贷,有著相同的方法和特性缚窿,但也有著它們的不同之處番电。下面我們一起來探究一下乍恐。
ArrayList
定義
ArrayList 是 List 接口的大小可變數(shù)組的實現(xiàn)聚谁。實現(xiàn)了所有可選列表操作母剥,并允許包括 null 在內(nèi)的所有元素。除了實現(xiàn) List 接口外形导,此類還提供一些方法來操作內(nèi)部用來存儲列表的數(shù)組的大小环疼。
構造方法
ArrayList 的構造方法有三種:
- ArrayList() :構造一個初始容量為 10 的空列表。是最常用的一種朵耕。
2.ArrayList(Collection<? extends E> c) :構造一個包含指定 collection 的元素的列表炫隶,這些元素是按照該 collection 的迭代器返回它們的順序排列的。
3.ArrayList(int initialCapacity)構造一個具有指定初始容量的空列表阎曹。
我們在創(chuàng)建的時候可以指定泛型為指定的類型伪阶,這樣ArrayList就只能存入指定類型的對象了。
常用方法
我們先來創(chuàng)建 ArrayList 對象:
List list = new ArrayList();
添加和插入使用 add 方法:
添加:
list.add("a");
list.add("b");
list.add("c");
插入:
list.add(1,"d");// 在位置1(第2個位置插入“d”)
獲取使用get方法:
System.out.println(list.get(2));//
修改使用set方法:
list.set(1,"e");// 將位置1上的對象改為“e”
刪除使用remove方法:
list.remove(2);
迭代器遍歷:
我們先使用Iterator來進行遍歷处嫌,發(fā)現(xiàn)報錯栅贴,因為list及其子類在迭代期間是不可修改的。
// for (Iterator iterator = list.iterator(); iterator.hasNext() ; ) {
// System.out.println(iterator.next());
// Object object = iterator.next();
// if (object.equals("e")) {
// list.add(object);// 迭代期間不可修改
// }
// }
// System.out.println(list);
同過查看文檔熏迹,我們可以發(fā)現(xiàn)List有專門的迭代器ListIterator檐薯。使用它進行同樣的操作不會報錯。因為它是在符合條件的位置后面插入相同數(shù)據(jù)注暗。
for (ListIterator listIterator = list.listIterator(); listIterator.hasNext(); ) {
Object object = listIterator.next();
if (object.equals("e")) {
listIterator.add(object);// 在符合條件的位置后面插入相同數(shù)據(jù)
}
}
System.out.println(list);
LinkedList
定義
List 接口的鏈接列表實現(xiàn)坛缕。實現(xiàn)所有可選的列表操作墓猎,并且允許所有元素(包括 null)。除了實現(xiàn) List 接口外祷膳,LinkedList 類還為在列表的開頭及結尾 get、remove 和 insert 元素提供了統(tǒng)一的命名方法屡立。這些操作允許將鏈接列表用作堆棧直晨、隊列或雙端隊列。
我們通過簡單的代碼來看一下什么是鏈式膨俐。
public class Main {
public static void main(String[] args) {
MyElement a = new MyElement();
a.value = "a";
MyElement b = new MyElement();
a.value = "b";
MyElement c = new MyElement();
a.value = "c";
a.next = b;
b.next = c;
c.next = null;
}
}
class MyElement{
public Object value;
public MyElement next;
}
我們自定義了一個類 MyElement 勇皇,它存的是自身的內(nèi)容及下一個對象的位置,這樣我們的列表就可以通過位置進項連接焚刺,而不需要一個挨著一個敛摘。
這樣我們在刪除中間的 b 時,只需將a的next改為c即可乳愉,而不需要將后面所有的元素都往前提一位兄淫。所以鏈式在插入和刪除操作時有著很大的優(yōu)勢。但在查找上就有些差強人意了蔓姚。
方法
雖然 ArrayList 與 LinkedList 的方法在底層實現(xiàn)上有所差異捕虽,但是在使用上是一致的。LinkedList 的方法請參照 ArrayList坡脐。
兩者的區(qū)別
兩者最主要的區(qū)別就是泄私,ArrayList 是連續(xù)的空間存儲元素,LinkedList 是鏈式存儲备闲。假設同樣有100個元素晌端,我們要刪除第2個,ArrayList 需要將后面的98個元素依次往前提恬砂,而LinkedList只需要將第一個元素標明的下一個元素改為第3個就完成了刪除操作咧纠。同理皆尔, ArrayList 插入數(shù)據(jù)也比 LinkedList 麻煩的多载矿。但是在查找方面LinkedList就遠沒有ArrayList那么好用了。