List承諾可以將元素維護在特定的序列中。List接口在Collection的基礎上添加了大量的方法,使得可以在List的中間插入和刪除元素。List與 set 不同,列表通常允許重復的元素。並且存放的順序與插入的順序一致。
List接口的常用方法有:
add(int index, E element) :將對象加入到指定位置處。
addAll(Collection<? extends E> c) :追加指定 collection 中的所有元素到此列表的結尾,順序是指定 collection 的迭代器返回這些元素的順序(可選操作)。
addAll(int index, Collection<? extends E> c) :將指定 collection 中的所有元素都插入到列表中的指定位置(可選操作)。
remove(int index) :移除某個位置上的元素。
remove(Object o) : 移除列表中出現的首個指定元素。
set(int index, E element) :用指定元素替換列表中指定位置的元素。
size() :返回列表大小。
.......
常用的有兩種List類型:ArrayList和LinkedList。
一、ArrayList
ArrayList擅長於隨即訪問元素,因為它像數組一樣提供了下標,可以根據下標直接訪問,所以可以將ArrayList看作可擴充自身尺寸的數組。但是在ArrayList的中間插入和移除元素時較慢。
1 package com.list; 2 3 import java.util.ArrayList; 4 import java.util.Iterator; 5 import java.util.List; 6 7 public class ArrayListTest { 8 public static void main(String[] args) { 9 List<String> list = new ArrayList<String>(); 10 //添加元素 11 list.add("aaa"); 12 list.add("bbb"); 13 list.add("aaa"); 14 list.add("ddd"); 15 list.add("ccc"); 16 list.add(null); 17 //遍歷 18 for (String string : list) { 19 System.out.println(string); 20 } 21 System.out.println("---------------"); 22 //修改 23 list.set(1, "bbb2"); 24 //刪除 25 list.remove("ccc"); 26 //迭代器遍歷 27 Iterator<String> iterator = list.iterator(); 28 while(iterator.hasNext()){ 29 System.out.println(iterator.next()); 30 } 31 System.out.println("--------------"); 32 list.clear(); //清空列表 33 System.out.println("清空后list的大小"+list.size());//打印大小 34 List<String> list2 = new ArrayList<String>(); 35 list2.add("a"); 36 list2.add("b"); 37 //將list2添加到list中 38 list.addAll(list2); 39 //遍歷 40 for (String string : list) { 41 System.out.println(string); 42 } 43 } 44 }
輸出結果為:
1 aaa 2 bbb 3 aaa 4 ddd 5 ccc 6 null 7 --------------- 8 aaa 9 bbb2 10 aaa 11 ddd 12 null 13 -------------- 14 清空后list的大小0 15 a 16 b
由輸出結果的1-5行可以看出,list存放元素的順序與加入的順序一致。
二、LinkedList
LinkedList通過代價較低的在List中間進行插入和刪除操作,提供了優化的順序訪問。但是在隨即訪問方面相對比較慢。
下面舉個例子來演示LinkedList和ArrayList隨即訪問的速度:
1 package com.list; 2 3 import java.util.ArrayList; 4 import java.util.LinkedList; 5 import java.util.List; 6 import java.util.Random; 7 8 public class LinkedListTest { 9 public static void main(String[] args) { 10 List<Integer> arraylist = new ArrayList<Integer>(); 11 for (int i = 0; i < 5000; i++) { 12 arraylist.add(i); 13 } 14 List<Integer> linkedlist = new LinkedList<Integer>(); 15 for (int i = 0; i < 5000; i++) { 16 linkedlist.add(i); 17 } 18 Random rand = new Random(5000); 19 //隨機訪問arrayList 20 long start = System.currentTimeMillis(); 21 for (long i = 0; i < 500000; i++) { 22 arraylist.get(rand.nextInt(5000)); 23 } 24 long end = System.currentTimeMillis(); 25 System.out.println("arrayList隨機訪問時間:"+(end - start)); 26 //隨機訪問arrayList 27 start = System.currentTimeMillis(); 28 for (long i = 0; i < 500000; i++) { 29 linkedlist.get(rand.nextInt(5000)); 30 } 31 end = System.currentTimeMillis(); 32 System.out.println("linkedlist隨機訪問時間:"+(end - start)); 33 } 34 }
程序運行結果為:
1 arrayList隨機訪問時間:20 2 linkedlist隨機訪問時間:2282
很明顯ArrayList隨即訪問比LinkedList快的多,因為LinkedList是以鏈表的現實存儲的。
