總述
ArrayList和LinkedList都是直接實現List的接口,List的特點是有序集合(有序集合的意思是可直接通過索引直接訪問,Set可以自動排序,元素不可重複,如果要對自定義的Object去重,那需要重寫equals和hashCode方法,詳情請看我的另一個博文),元素可重複,因此ArrayList和LinkedList也繼承了這個特點。ArrayList是基於基礎的對象數組動態實現的數據結構,它對於隨機訪問(random access)get和set,速度要比LinkedList速度要快。LinkedList是基於鏈表的數據結構,它使用get方法時是按照順序從列表的一段開始檢查,移動指針,直到另一端,但對於添加add和刪除remove操作,LinkedList速度要佔優勢。
附錄API
ArrayList
Return | method | explain |
---|---|---|
boolean | add(E e) | 將指定的元素添加到此列表的尾部 |
void | add(int index,E e) | 在此列表中指定的位置插入指定的元素 |
boolean | contains(Object o) | 如果此列表中包含指定的元素,則返回 true |
E | get(int index) | 返回此列表中指定位置上的元素 |
boolean | isEmpty() | 如果此列表中沒有元素,則返回 true |
E | remove(int index) | 移除此列表中指定位置上的元素 |
int | size() | 返回此列表中的元素數 |
Object[] | toArray() | 按適當順序(從第一個到最後一個元素)返回包含此列表中所有元素的數組 |
void | clear() | 移除此列表中的所有元素 |
LinkedList
Return | method | explain |
---|---|---|
boolean | add(E e) | 將指定的元素添加到此列表的尾部 |
void | add(int index, E element) | 在此列表中指定的位置插入指定的元素 |
void | clear() | 從此列表中移除所有元素 |
boolean | contains(Object o) | 如果此列表包含指定元素,則返回 true |
E | get(int index) | 返回此列表中指定位置處的元素 |
E | remove(int index) | 移除此列表中指定位置處的元素 |
int | size() | 返回此列表的元素數 |
E | set(int index, E element) | 將此列表中指定位置的元素替換爲指定的元素 |
Object[] | toArray() | 返回以適當順序(從第一個元素到最後一個元素)包含此列表中所有元素的數組 |
boolean | isEmpty() | 如果此列表中沒有元素,則返回 true |
從API中看一看出:ArrayList和LinkedList方法基本相同,插入一個元素到集合中,兩個集合都提供了add(int index,E element):void方法,並且LinkedList又提供set(int index,E element):E方法,它們的差別主要是效率問題,有興趣可以自己測試一下
代碼實現
ArrayList
// 測試add方法
List<Integer> arrayList = new ArrayList<>();
// 添加6數據
arrayList.add(20);
arrayList.add(25);
arrayList.add(8);
arrayList.add(35);
arrayList.add(38);
arrayList.add(2, 100);
for (Integer integer : arrayList) {
System.out.print(integer + " ");
}
// 測試contains方法
if (arrayList.contains(25)) {
System.out.println("\r\ntrue");
}
// 測試get方法
System.out.println(arrayList.get(2));
// 測試isEmpty方法
if (!arrayList.isEmpty()) {
System.out.println("is not empty");
}
// 測試remove方法
arrayList.remove(2);
for (Integer integer : arrayList) {
System.out.print(integer + " ");
}
// 測試size方法
System.out.println("\r\n" + arrayList.size());
// 測試toArray方法
Object[] ig = arrayList.toArray();
for (Object obj : ig) {
System.out.print((Integer) obj + " ");
}
// 測試clear方法
arrayList.clear();
System.out.println("\r\n" + arrayList.size());
運行結果
20 25 100 8 35 38
true
100
is not empty
20 25 8 35 38
5
20 25 8 35 38
0
LinkedList
List<Integer> linkedList = new java.util.LinkedList<>();
// 測試add方法
linkedList.add(56);
linkedList.add(78);
linkedList.add(59);
linkedList.add(77);
linkedList.add(2, 100);
for (Integer integer : linkedList) {
System.out.print(integer + " ");
}
// 測試contains方法
if (linkedList.contains(78)) {
System.out.println("\r\ntrue");
}
// 測試get方法
System.out.println(linkedList.get(1));
// 測試remove方法
System.out.println(linkedList.remove(2));
// 測試size方法
System.out.println(linkedList.size());
// 測試set方法
linkedList.set(2, 200);
for (Integer integer : linkedList) {
System.out.print(integer + " ");
}
// 測試isEmpty方法
if (!linkedList.isEmpty()) {
System.out.println("\r\ntrue");
}
// 測試toArray()方法
Object obj = linkedList.toArray();
for (Integer integer : linkedList) {
System.out.print(integer + " ");
}
運行結果
56 78 100 59 77
true
78
100
4
56 78 200 77
true
56 78 200 77
應用場景
如果對集合的增刪改的操作頻繁,那就使用LinkedList,如果對集合進行頻繁的隨機訪問,就使用ArrayList。