Java筆記 - List集合常用子類

在List集合中,有三個重要的常用子類:Vector,ArrayList,LinkedList。
1. Vector:內部是數組數據結構,線程安全。增刪,查詢都很慢。
2. ArrayList:內部是數組數據結構,線程不安全,替代Vector,查詢速度快,增刪速度慢。如果需要使用多線程,我們可以給ArrayList加鎖,或者使用其他的方法,Vector已經不再使用了。
3. LinkedList:內部是鏈表數據結構,線程不安全,增刪速度快,查詢速度慢。
* 如果要猜集合是否線程安全,只要不是Vector,都猜線程不安全,概率大

Vector
Vector在JDK1.0版本就已經出現了,在1.2版本後出現了Collection集合,開始有集合框架,Vector改進爲可以實現List接口,納入集合框架。構造函數Vector()構造一個空向量,內部數組默認初始化大小爲10。Vector中的方法都是從Collection和List繼承來的。但Vector有一些特有的方法
void addElement(E obj)
E firstElement()
E lastElement()
boolean removeElement(Object obj)
void setElementAt(E obj, int index)等…這些方法和對應不帶Element的方法功能相同。

Vector特有的取出方法:enumeration elements():返回此向量的組件的枚舉
Enumeration是一個接口,與Iterator類似。它有兩個方法:
boolean hasMoreElements():是否還包含元素
E nextElement():返回此枚舉的下一個元素
接口Enumeration的功能與Iterator接口功能是重複的。此外,Iterator 接口添加了一個可選的移除操作(void remove()),並使用較短的方法名。新的實現應該優先考慮使用 Iterator 接口而不是 Enumeration 接口。

Vector v = new Vector();

v.addElement("abc1");
v.addElement("abc2");
v.addElement("abc3");
v.addElement("abc4");

Enumeration en = v.elements();
while(en.hasMoreElements()){
    System.out.println(en.nextElement());
}

輸出結果:
abc1
abc2
abc3
abc4

LinkedList
LinkedList是鏈接列表數據存儲格式的,簡稱鏈表格式。鏈表內存示意圖如下:
LinkedList
鏈表中每個元素都有自己的地址,第一個元素記住第二個元素的地址,第二個元素記住第三個元素的地址,以此類推…如果想要查詢其中的某一個元素,要從第一個元素挨個做判斷,因爲這些元素不是連續的,所以很慢。如果要增加一個元素,讓這個元素把地址給前一個元素,再記住後一個元素的位置即可;如果要刪除一個元素,只要它前一個元素記住它後一個元素的地址即可,所以增刪的速度很快。
LinkedList也有角標,因爲它是List集合的子類,List接口最大的特點就是可以操作角標。

一般方法:

void addFirst(E e):將指定元素插入此列表的開頭
void addLast(E e):將指定元素添加到此列表的結尾
Object getFirst():返回此列表的第一個元素
Object getLast():返回此列表的最後一個元素
Object removeFirst():移除並返回此列表的第一個元素,remove會改變集合的長度,所以第二個元素就變成了第一個元素

LinkedList link = new LinkedList();

link.addFirst("abc1");
link.addFirst("abc2");
link.addFirst("abc3");
link.addFirst("abc4");

Iterator it = link.iterator();
while(it.hasNext()){
    System.out.println(it.next());
}
System.out.println("-----------------------");
System.out.println(link.getFirst());
System.out.println(link.getFirst());//getFirst獲取第一個元素但是不會刪除
System.out.println("-----------------------");

System.out.println(link.removeFirst());
System.out.println(link.removeFirst());//remove改變集合長度,第二個元素變成第一個
System.out.println("-----------------------");
link.addFirst("abc3");
link.addFirst("abc4");
while (!link.isEmpty()) {
    System.out.println(link.removeFirst());//可以用這種方法來取集合中的元素,不過取完集合就變成空的了
}

輸出結果:
abc4
abc3
abc2
abc1


abc4
abc4


abc4
abc3


abc4
abc3
abc2
abc1

在JDK1.6版本後新增了一些方法
addFirst();
addLast():
jdk1.6
offerFirst();
offetLast();

getFirst();.//獲取但不移除,如果鏈表爲空,拋出NoSuchElementException.
getLast();
jdk1.6
peekFirst();//獲取但不移除,如果鏈表爲空,返回null.
peekLast():

removeFirst();//獲取並移除,如果鏈表爲空,拋出NoSuchElementException.
removeLast();
jdk1.6
pollFirst();//獲取並移除,如果鏈表爲空,返回null.
pollLast();

ArrayList
ArrayList是大小可變的數組,ArrayList()構造函數默認初始化一個容量爲10的空列表
ArrayList內存示意圖如下:
ArrayList
ArrayList中每一個元素都有自己的地址值,數組中存儲着這些元素的地址值,因爲數組是一片連續的空間,所以在查詢某一元素的時候速度很快。但是如果刪除1角標的元素,因爲remove會改變集合的長度,刪除後如下
這裏寫圖片描述
角標1後所以的元素位置都需要做改變,所以ArrayList增刪元素的速度相對較慢。

ArrayList al = new ArrayList();

al.add(new Person("lisi1",21));
al.add(new Person("lisi2",22));
al.add(new Person("lisi3",23));
al.add(new Person("lisi4",24));
al.add(5);//JDK1.5版本以後自動裝箱
al.add(new Integer(10));//JDK1.4版本前

Iterator it = al.iterator();
while(it.hasNext()){
    System.out.println(it.next());
}

輸出結果:
lisi1:21
lisi2:22
lisi3:23
lisi4:24
5
10

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章