Java(7-4)

集合的最後一回了,這次要說說視圖和包裝器,說實話,視圖還好說,我知道他們可以對進程的同步,映射部分內容的承接(keySet返回一個實現Set接口的包含鍵的類,方便我們從鍵的角度對原映射進行操作。),但是包裝器能幹什麼呢?我們先看看這個。

Part1 輕量級集合包裝器
實例:Arrays類的靜態方法asList將返回一個包裝了普通Java數組的List包裝器。這個方法可以將數組轉化成一個列表或集合參數,例如:

Card[] cardDeck() = new Card[52];
...
List<Card> cardList = Arrays.asList(cardDeck);

返回的對象是一個視圖對象,帶有底層數組的get和set方法。但是!注意,改變數組大小的任何方法,都會拋出一個UnsupportedException異常,例如:與迭代器相關的add和remove方法。

類似的,對於集合框架中的每一個接口,還有一些方法可以生成空集,列表,映射,等等。特別是,集的類型可以推導得出。

part2 子範圍,同步視圖和不可修改視圖,受查視圖

可以爲很多集合建立子範圍視圖 。例如,我們有一個列表staff,現在想從中去除第10個到第19個元素。可以使用subList方法來獲得一個列表的子範圍視圖。

List group2 = staff.subList(10,20);

第一個索引包含在內,第二個索引不包含在內。 可將原集合的任何操作用於子範圍,並且能夠自動地反映整個列表的情況,例如:

group2.clear();

現在元素自動的從staff列表中清楚了,並且group2爲空。

對於有序集和映射,可以使用排序順序而不是元素位置建立子範圍。SortedSet接口聲明瞭三個方法:

SortedSet<E> subSet(E from,E to);
SortedSet<E> headSet(E to);
SortedSer<E> tailSet(E from);

有序映射也有類似的方法:

SortedMap<K,V> subMap(K from,K to);
SortedMap<K,V> headMap(K to);
SortedMap<K,V> tailMao(K from);

不可修改視圖 ,名字起的就好!這些視圖對現有集合增加了一個運行時的檢查,如果發現視圖對集合進行修改,就拋出一個異常!可以用一下八種方法,獲得不可修改視圖:

Collections.unmodifiableCollection
Collections.unmodifiableList
Collections.unmodifiableSet
Collections.unmodifiableSortedSer
Collections.unmodifiableNavigableSet
Collections.unmodifiableMap
Collections.unmodifiableSortedMap
Collections.unmodifiableNavigableMap

每個放法都爲了一個接口去定義的。例如Collections.unmodifiableList與ArrayList、LinkedList或者任何實現了List接口的其他類一起協同工作。
舉個例子,我們想查看某部分代碼,但又不觸及某個集合的內容,就可以進行下列操作:

List<String> staff = new LinkedList<>();
...
lookAt(Collections.unmodifiableList(staff));

Collections.unmodifiabledList方法將返回一個實現List接口的類對象。其訪問器方法將從staff集合中獲取值。當然lookAt方法可以調用List接口中的所有方法,而不只是訪問器。但是所有修改集合的方法都不可行,會拋出異常!由於視圖只是包裝了接口而不是實際的集合對象,所以只能訪問接口中定義的方法。

同步視圖
很關鍵的東西感覺,多線程肯定會用到的。

如果由多個線程訪問集合,就必須確保集不會被意外的破壞。例如,如果一個線程視圖將元素添加到散列表中,同時另一個線程正在對散列表進行再散列的操作,那結果將是不可預計的災難!
同步視圖,就是爲了在多線程異步的情況下完成同步操作(當然還要考慮死鎖,不過那是trylock的事情),我們可以調用Collections類的靜態方法syschronizedMap來將任何一個映射錶轉換成聚友同步訪問方法的Map!如下:

Map<String,Employee> map = Collection.synchronizedMap(new HashMap<String,Employee>());

現在,就可以多線程訪問map對象了!像get,put這類方法都是同步操作的。

受查視圖
受查視圖的add方法有些特殊,他可以檢測插入的對象是否屬於給定的類(這是爲了解決我們當初聲明泛型時可能遇到的風險!),如果不是給定的類,就會拋出一個異常!
聲明受查視圖的方式如下:

ArrayList<String> = new ArrayList<>();
List<String> safeStrings = Coleections.checkedList(strings,String.class)
ArrayList rawList = safeStrings;
rawList.add(new Date);//這裏將會進行檢查
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章