1. 程式人生 > >黑馬程式設計師----List,Set集合

黑馬程式設計師----List,Set集合

集合與陣列同屬於容器範圍內,但是二者有明顯不同,最顯著不同是,集合儲存的元素,不必為同一種類型,而且集合儲存元素的數量是可變的。

Collection介面在java.util包下,其子介面有List何Set兩個。

List介面有三個常用實現類——ArrayList、LinkedList、Vector,Set介面有兩個常用實現類——HashSet、TreeSet。

遍歷一個Collection的最佳方式是使用Iterator介面,這個藉口有三個方法,hasNext(),next,remove()。其子介面ListIterator有更多實用方法,專門用於List實現類的遍歷和操作。

一、List

List的特點是向這個容器中新增元素是有序的,而且允許新增多個相同的元素。

凡是可以操作角標的方法,都是List中所區別於Set的方法。

包括add(index, element)、addAll (index,Collection)、remove(index)、set (index, element)、get(index)、subList(from, to).、listIterator();

(1)ArrayList

ArrayList底層實現為陣列,但是其內部實現的陣列大小是可變的,並且選擇性的實現了List介面中的方法。可以儲存任意型別的元素,甚至包括null型別。除了實現List介面中的方法外,還提供了操作其用來儲存List資料的內部Array大小的方法。

ArrayList的特點是向這個容器中新增元素是有序的,而且允許新增多個相同的元素。

ArrayList中常見方法有add ,clear,size,remove等方法。

ArrayList的遍歷:

ArrayList al1 = new ArrayList();
al1.add("abc");
al1.add("789");
al1.add("ddd");

如果只是取值操作,可以用對容器共用的Iterator遍歷,如下,

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

但是共用的Iterator只提供hasNext(),next()和remove()方法。

對於List介面的實現類,有一個繼承自Iterator的子類ListIterator提供更多的操作方法,例如add(E),hasPrevious(),nextIndex(),previous(),previousIndex(),set(E)。

只需要用

(2)LinkedList

底層實現為連結串列結構,增刪速度很快,但是查詢慢。

LinkedList中獨有的方法有addFirst(),addLast(),getFirst(),getLast(),removeFirst(),removeLast(),在以上方法中,帶有First的方法,都是在表頭進行操作,而帶有Last的方法,都是從尾部進行操作。

例如,addFirst(),是在連結串列的頭部插入一個元素:

LinkedList al2 = new LinkedList();
al2.add("111");
al2.add("222");
al2.add("333");
al2.addFirst("000");
System.out.println(al2);

便可以在“111”前邊加上“000”這個元素。

對LinkedList的遍歷,基本與ArrayList相同。

(3)Vector

Vector類在出現在jdk1.0版本,底層實現為陣列。由於該類操作效率低,已經被ArrayList所取代。

List介面下三個實現類的比較:

ArrayList:底層實現為陣列結構,查詢速度很快,但是增刪慢

LinkedList:底層實現為連結串列結構,增刪速度很快,但是查詢慢

Vector:與ArrayList一樣,底層實現是陣列,該類出現比ArrayList早,現在基本已經被ArrayList取代。相比ArrayList,Vector是執行緒同步的的,而ArrayList執行緒不同步,但是由於Vector增刪改查太慢,現在已經基本不再需要Vector了。

對Vector的遍歷,除了有共用的Iterator外,還有另外一種Vector特有的方法:

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

但是,由於這種方法的名稱太長了,所以,這種方法也基本不再使用。
二、Set

Set容器的特點是,元素的存入和取出的順序不一致,且不能出現重複元素。

其常用實現類包括HashSet、TreeSet.

(1)HashSet

HashSet是執行緒不同步的容器,底層實現方式是Hash表,所以在該類的很多方法中,底層都掉用了HashCode()方法的返回值,除此之外,還用到了equals()方法。

例如在向一個HashSet例項中,新增一個元素,會首先看該物件的HashCode,如果HashCode與該HashSet例項中的任何元素都不同,則認為是不同元素,則新增進來;若HashCode相同,則繼續判斷equals返回值,若返回值為true,則認為二者是同一物件,否則認為是不同物件,而新增進來。

因此,在向該類例項化物件中新增自定義類的時候,必須複寫該類的HashCode()和equals()方法,來實現自己的規則。

(2)TreeSet

該類的底層實現為二叉樹。

可以對該集合中的元素排序,這就要求其元素的類必須實現Comparable介面或者在例項化TreeSet的時候,傳入一個實現Comparator介面的類的例項。

當被傳入Comparator時候,就不再用元素類中的Comparable中提供的排序方法。

List與Set的區別:

有序的 collection(也稱為序列)。此介面的使用者可以對列表中每個元素的插入位置進行精確地控制。使用者可以根據元素的整數索引(在列表中的位置)訪問元素,並搜尋列表中的元素。

與 set 不同,列表通常允許重複的元素。更正式地說,列表通常允許滿足 e1.equals(e2) 的元素對 e1 和 e2,並且如果列表本身允許 null 元素的話,通常它們允許多個 null 元素。

一個不包含重複元素的 collection。更正式地說,set 不包含滿足 e1.equals(e2) 的元素對 e1 和 e2,並且最多包含一個 null 元素。

List判斷元素是否存在,依賴equals方法,而HashSet先判斷HashCode後判斷equals方法。