由所有聚焦類構成,在java.util包中,包含三個重要接口:
* List列表:元素為單個對象,元素在列表中是有序、可重復
* Set集合:元素為單個對象,元素在集合中無序、不可重復
* Map映射:元素為成對對象(第一個對象是關鍵字,第二個對象是值),元素在映射中無序,關鍵字不可重復
注:JCF不能存儲基本數據類型。
17.2 List接口和ArrayList類
* ArrayList類
* LinkedList類
17.2.1 泛型(generics):允許設定存在在特定聚焦類對象中的對象類型。可以將一個或多個類型作為參數發送到一個類(或接口)中,亦被稱為參數化類型。
優點:允許編譯檢查類型;不必進行對象類型轉換;避免產生ClassCastException異常。
17.2.2 使用接口類型代替實現類型作為函數的形參
允許將來修改實現的方式而不必修改形參中對象的類型。
17.2.3 List接口的方法
操作:增加(add)?將元素插在列表的末尾;?將元素插入到列表中指定的位置。
注:使用索引插入參數到列表中時,必須保證索引是當前列表中的有效位置
修改(set)、刪除(delete)
列表:顯示(toString)、總數(size)、是否空(isEmpty)
元素:位置(indexOf)返回指定對象在列表中第一次出現時的索引。
獲取(get)、存在(contains)
17.3 增強的for循環:數組、List接口、Set接口
不能用于修改或刪除原始集合中的元素,因為編譯可以通過,但是有可能導致程序結果不可預測。
17.4 Set接口和HashSet類
* HashSet類
* TreeSet類
17.4.1 Set接口的方法
操作:增加和修改(add)、刪除(remove)
列表:顯示(toString)、總數(size)、是否空(isEmpty)
元素:獲取(get)、存在(contains)
17.4.3 Iterator接口:用于修改和刪除Set中的元素
使用Set對象中提供的Iterator對象。
17.5 Map接口和HashMap類
* HashMap類
* TreeMap類
Map接口的方法:
操作:增加和修改(put)、刪除(remove)
元素:關鍵字存在(containsKey)、值存在(containsValue)、值獲取(get)
17.6 JCF中使用自定義類
方法重寫:toString(); equals(); hashCode()
自測題:
1. 三種接口的區別:
* List列表:元素為單個對象,元素在列表中是有序、可重復
* Set集合:元素為單個對象,元素在集合中無序、不可重復
* Map映射:元素為成對對象(第一個對象是關鍵字,第二個對象是值),元素在映射中無序,關鍵字不可重復
2. Map<String, Student> javaStudents = new HashMap<String, Student>();
a) 允許將來修改實現的方式而不必修改形參中對象的類型。
b) 可以將一個或多個類型作為參數發送到一個類(或接口)中,亦被稱為參數化類型。
優點:允許編譯檢查類型;不必進行對象類型轉換;避免產生ClassCastException異常。
c) javaStudents.put("U0012345","Fadi");
javaStudents定義的是Student類型,不能接收String類型的數據。
3. StockItem類
a)
public String toString(){
return "("+stockNumber+","+name+","+price+","+totalStock+")\n";
}
b)
public boolean equals(Object objIn){
StockItem st = (StockItem) objIn;
return stockNumber.equals(st.stockNumber);
}
c)
public int hashCode(){
return stockNumber.hashCode();
}
4.
a)
String tmpString;
boolean first=true;
if (regNums.size()==0){
tmpString="{}";
} else {
StringBuilder sb = new StringBuilder();
for (String item: regNums){
if (first) {
sb.append("{"+item);
first = false;
} else {
sb.append(","+item);
}
}
sb.append("}");
System.out.println(sb);
b)
Iterator<String> elements = regNums.iterator();
while(elements.hasNext()){
String item = elements.next();
if (item.charAt(item.length()-1)=='S'
elements.remove();
}
編程練習:代碼附件
1. NameStack.java NameStackException.java NameStackTest.java
a) 因為需要可變大小的存儲空間,而存儲的對象必須是有序的,但是是可以重復的。
2. CarRegister.java CarRegisterException.java CarRegisterTest.java
a) 因為需要可變大小的存儲空間,而存儲的對象可以是無序的,但是必須惟一。
3. Book.java Library.java LibraryTest.java
4. Bank.java BankAccount.java BankTest.java
a) HashMap類適合代替數組實現Bank類。因為其可以滿足成對對象集合的需要,還可以確定關鍵字。