《java程式設計思想——第十一章(持有物件)》
持有物件
11.1 泛型和型別安全的容器
使用泛型時,可以檢查放入物件的型別,在使用物件時可以有更清晰的語法。
11.2 基本概念
Java容器類庫的用途是儲存”物件”,並將其劃分為兩個不同概念:
1)Collection。一個獨立的元素序列,這些序列都服從一條或多條規則。
2)Map。一組成對的“鍵值對”物件,允許你通過鍵查詢值。
11.3 新增元素
public class AddingGroups {
public static void main(String[] args) {
Collection<Integer> c = new ArrayList<Integer>(
Arrays.asList(1,2,3,4,5));
Integer[] moreInts = {6,7,8,9,10};
c.addAll(Arrays.asList(moreInts));//新增list
Collections.addAll(c, 11,12,13,14,15);
Collections.addAll(c, moreInts); //新增一個集合
List<Integer> list = Arrays.asList(16 ,17,18,19,20); //陣列或元素轉化為list
list.set(1, 99);
System.out.println(list);
}
}
11.4 容器的列印
Java容器類中兩種主要型別區別在於容器中每個“槽”中儲存的元素個數。
Collection 在每個槽中只能儲存一個元素。其中包括:
List:它以特定的順序儲存一組元素(ArrayList,LinkedList)
Set:元素不能重複。(HashSet,TreeSet,LinkedHashSet)
Queue:只允許一端進去,另一端取出。
Map在每個槽內儲存了兩個物件,即鍵和與之相關的值。
HashMap:可以快速查詢
TreeMap:按照比較結果的升序儲存鍵。
LinkedhashMap:按照插入順序儲存鍵,還具有hashmap的查詢速度。
11.5 List
有兩種型別的List:
1. ArrayList ,隨機訪問速度快,但是中間插入和刪除慢。
2. LinkedList 隨機訪問比較慢,中間插入和刪除快。
retainAll():取交集
11.6 迭代器
迭代器的作用是:遍歷並選擇物件,Java 的Iterator只能單向移動,這個Iterator只能用來:
1)iterator()方法返回一個Iterator。
2)使用next()獲取序列中的下一個元素。
3)使用hasNext()檢查序列中是否還有元素。
4)使用remove()將新近返回的元素移除。
ListIterator是Iterator的子型別,它只適用於List的訪問。ListIterator可以雙向移動。
11.7 Linklist
getFirst()和element():返回第一個元素。list為空丟擲異常
peek():返回第一個元素。list為空返回null
remove()和removeFirst():移除並返回列表的頭。list為空丟擲異常
poll():移除並返回列表的頭。list為空返回null
addFirst()、add()、offer()、addLast():將某個元素插入到頭(尾)部。
11.8 Stack
棧通常指後進先出的容器。
pop():返回並移除棧頂元素。
peek():返回棧頂元素,不移除。
11.9 Set
Set不儲存重複元素。
HashSet使用了雜湊函式,TreeSet使用紅-黑樹結構。
11.10 Map
containsKey(key):查詢是否包含某個鍵
containsValue(value):查詢是否包含某個值。
11.11 Queue
佇列是典型的先進先出容器。佇列在併發程式設計中很重要那天,因為它可以安全地將物件從一個任務傳輸給另一個任務。
offer():在允許的情況下,將元素插入到隊尾,或者返回false。
peek()和element():在不移除情況下返回隊頭。
remove()和poll():移除並返回隊頭。
- PriorityQueue
優先順序佇列。下一個彈出的元素是最需要的元素(最高優先順序)。可以通過提供自己的Comparator修改排序規則。
11.12 Collection和Iterator
Collection是描述所有序列容器的共性介面。
AbstractCollection提供了Collection的預設實現。可以通過繼承AbstractCollection避免重複程式碼。
生成Iterator是將佇列與消費佇列的方法連線在一起耦合度最小的方式,並且與實現Collection相比,在序列上施加的約束也比較少。
/**
* 生成Iterator獲取迭代能力
* @author Administrator
*
*/
class PetSequence{
protected Pet[] pets = Pets.createArray(8);
}
public class NoCollectionSequence extends PetSequence {
public Iterator<Pet> iterator() {
return new Iterator<Pet>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < pets.length;
}
@Override
public Pet next() {
return pets[index++];
}
@Override
public void remove() {
throw new UnsupportedOperationException();
}
};
}
public static void main(String[] args) {
NoCollectionSequence nc = new NoCollectionSequence();
InterfaceVsIterator.display(nc.iterator());
}
}
11.13 Foreach與迭代器
foreach語法主要用於陣列,但是它也可以應用於任何Collection物件。
介面卡方法:提供特定的介面滿足foreach語句,可以新增一個產生Iterable物件的方法。
11.14 總結
Java提供了大量持有物件的方式:
- 陣列將數字與物件聯絡起來。
- Collection儲存單一的元素,而Map儲存相關聯的鍵值對。
- List也建立數字索引與物件的關聯。
- 如果要進行大量隨機訪問,就使用ArrayList,如果經常從中間插入或刪除元素,則應該使用LinkedList。
- 各種Queue以及棧行為,由LinkedList支援。
- Map是一種將物件與物件相關聯的設計。HashMap用來快速訪問,TreeMap保持“鍵”始終處於排序狀態。
- Set不接受重複元素。HashSet提供最快查詢速度,TreeSet保持元素處於排序狀態。LinkedSet以插入順序儲存元素。
- 新程式中不應使用過時的Vector,HashTable和Stack