1. 程式人生 > >《java程式設計思想——第十一章(持有物件)》

《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可以雙向移動。

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():移除並返回隊頭。

  1. 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提供了大量持有物件的方式:

  1. 陣列將數字與物件聯絡起來。
  2. Collection儲存單一的元素,而Map儲存相關聯的鍵值對。
  3. List也建立數字索引與物件的關聯。
  4. 如果要進行大量隨機訪問,就使用ArrayList,如果經常從中間插入或刪除元素,則應該使用LinkedList。
  5. 各種Queue以及棧行為,由LinkedList支援。
  6. Map是一種將物件與物件相關聯的設計。HashMap用來快速訪問,TreeMap保持“鍵”始終處於排序狀態。
  7. Set不接受重複元素。HashSet提供最快查詢速度,TreeSet保持元素處於排序狀態。LinkedSet以插入順序儲存元素。
  8. 新程式中不應使用過時的Vector,HashTable和Stack
    這裡寫圖片描述