一、總結
1. 所有Java集合類都位於java.util包中,與Java數組不同,Java集合中不能存放基礎資料型別 (Elementary Data Type),只能存放對象的引用。
2. Set、List、Map統稱為Java集合。
3. 在將Object Storage Service到集合類中時,為加快儲存速度,要求被在座對象的類中必須覆蓋equals()方法和hashCode()方法。即如果一個類重新實現了equals()方法,那麼也應該重新實現hashCode()方法,並且保證當兩個對象相等時,它們的雜湊碼也相同。
4. <? extends Object> 對集合類的範型設定了上限,表示接受Object類型及其子類型。
<? super String> 對集合類的範型設定了下限,表示接受String類型及其父類型。
5. 遍曆集合可使用“for(Type t : c){…}”文法,其中c表示需要遍曆的集合,Type表示集合內元素的類型,t引用每次從集合中取出的當前元素。
6. 對於Java集合,還有一個實用類,即java.util.Collections,它的一部分方法專門用於操縱List類型集合,還有一部分方法可用於操縱所有的Collection類型或Map類型集合。
二、Collection和Iterator介面
1. Collection介面的方法
方法 |
描述 |
boolean add(Object o) |
向集合中加入一個對象的引用 |
void clear() |
刪除集合中的所有對象,即不再持有這些對象的引用 |
boolean contains(Object o) |
判斷在集合中是否持有特定對象的引用 |
Iterator iterator() |
返回一個Iterator對象,可用它來遍曆集合中的元素 |
boolean remove(Object o) |
從集合中刪除一個對象的引用 |
int size() |
返回集合中元素的數目 |
Object[] toArray() |
返回一個數組,該數組包含集合中的所有元素 |
boolean isEmpty() |
判斷集合是否為空白 |
註:Set介面和List介面繼承了Collection介面,而Map介面沒有繼承Collection介面,所以Set對象和List對象可以調用以上方法,但Map對象不能調用以上方法。
2. Iterator介面中聲明了以下方法:
a) hasNext():判斷集合中的元素是否遍曆完畢,如果沒有,就返回true。
b) next():返回下一個元素。
c) remove():從集合中刪除上一個由next()方法返回的元素。
3. 如果集合中的元素沒有排序,Iterator遍曆集合中元素的順序是任意的,並不一定與向集合中加入元素的順序保持一致。
4. 當通過Collection集合的iterator()方法得到一個Iterator對象後,如果當前線程或其他線程接著又通過Collection集合的一些方法對集合進行了修改操作(調用當前Iterator對象的remove()方法來修改集合除外),接下來訪問這個Iterator對象的next()方法會導致java.util.ConcurrentModificationException運行時異常。
三、Set(集)
1. Set介面主要有兩個實作類別:HashSet和TreeSet。HashSet類有一個子類LinkedHashSet類,它不僅實現了雜湊演算法,而且實現了鏈表資料結構。TreeSet類實現了SortedSet介面,具有排序功能。此外還有一個以數組為基礎實現的Set類CopyOnWriteArraySet。
2. Set系列類的方法不支援插入和修改。同時Set集合中不能有重複的對象。
3. Set採用對象的equals()方法比較兩個對象是否相等,即判斷這個某個對象是否已經存在於集合中。
4. 當向集合中加入一個對象時,HashSet會調用對象的hashCode()方法來獲得雜湊碼,然後根據這個雜湊碼進一步計算出對象在集合中的存放位置。
5. TreeSet支援兩種排序方式:自然排序和客戶化排序。在預設情況下,TreeSet採用自然排序方式。
6. TreeSet調用對象的compareTo()方法比較集合中對象的大小 ,然後進行升序排列,這種排序方式稱為自然排序。使用自然排序時,只能向TreeSet集合中加入同類型的對象,並且這些對象的類必須實現了Comparable介面。
7. 最適合TreeSet排序的是不可變類。
8. TreeSet類支援客戶化排序,可以先建立一個實現java.util.Comparator<Type>介面的類,<Type>指定被比較的對象的類型,Comparator有個compare(Type x,Type y)方法,用於比較兩個對象的大小。當compare(x,y)的傳回值大於0時,表示x>y,傳回值小於0時,表示x<y,傳回值等於0時,表示x等於y。範例程式碼如下:
import java.util.Comparator; import java.util.Iterator; import java.util.Set; import java.util.TreeSet; public class CustomerComparator implements Comparator{ public int compare(Customer x,Customer y){ if(x.getName().compareTo(y.getName()) > 0) return -1; if(x.getName().compareTo(y.getName()) <0 ) return 1; return 0; } public static void main(String[] args) { Set<Customer> set = new TreeSet<Customer>(new CustomerComparator()); Customer customer1 = new Customer("Tom",15); Customer customer2 = new Customer("Jack",16); Customer customer3 = new Customer("Mary",26); set.add(customer1); set.add(customer2); set.add(customer3); Iterator<Customer> it = set.iterator(); while(it.hasNext()){ Customer customer = it.next(); System.out.println(customer.getName()+" "+customer.getAge()); } } } |
四、List(列表)
1. List中的元素以線性方式儲存,集合中允許存放重複對象。List介面的主要的實作類別有ArrayList(長度可變的數組)和LinkedList(鏈表)。並且LinkedList單獨具有addFirst()、addLast()、getFirst()、getLast()、removeFirst()、removeLast()方法,這些方法使得LinkedList可以作為堆棧、隊列和雙向隊列來使用。
2. List只能對集合中的對象按索引位置排序,如果想要對List中的對象按其他特定方式排序,可以藉助Comparator介面和Collections類中的sort方法。
3. List的listIterator()方法返回一個ListIterator對象,ListIterator介面繼承了Iterator介面,此外還提供了專門操縱列表的方法:
add() |
向列表中插入一個元素 |
hasNext() |
判斷列表中是否還有下一個元素 |
hasPrevious() |
判斷列表中是否還有上一個元素 |
next() |
返回列表中的下一個元素 |
previous() |
返回列表中的上一個元素 |
4. java.util.Arrays類的asList()方法能夠把一個java數組封裝為一個List對象,這個List對象代表固定長度的數組,所有對List對象的操作都會被作用到底層的java數組,因此不能調用這種List對象的add()和remove()方法。
五、Map(映射)
1. Map的entrySet()方法返回一個Set集合,在這個集合中存放了Map.Entry類型的元素,每個Map.Entry對象代表Map中的一對鍵與值。
2. Map有兩種比較常用的實現,HashMap和TreeMap,另外還有以鏈表和雜湊表為基礎實現的LinkedHashMap類。使用HashMap時,改寫了equals()方法時,同時要改寫hashCode()方法;TreeMap實現了SortedMap介面,能對鍵對象進行排序,支援自然排序和客戶化排序。如果要對鍵進行客戶化排序,可調用它的TreeMap(Comparator comparator)構造方法,參數comparator指定具體的排序方式。
3. Map的keySet()方法返回集合中所有鍵對象的集合。