13.3.1 視圖與包裝器
視圖:從集合類通過映射關系擷取另一個集合類,而非直接建立新的集合類。優點是不占用額外空間,缺點是非真實集合,看上去不太直覺;另外,消耗了一定的棧存儲空間,不能做太多層的映射,會超出棧記憶體。
1 輕量級包裝器
典型例子1:數組轉集合 Arrays.asList(xx);
注意,這裡的 ArrayList 不是 java.util.ArrayList,而是靜态内部類 ArrayList
這個類實際上都是對數組的映射,是 java.util.ArrayList 的簡化版本。特别注意的是,這個類不能增删元素!
由于上述截圖中沒有重寫 add/remove 方法,最終調用這兩個類會按照父類處理抛出異常。
典型示例2:Collecitons.singleton(object), 可建立一個隻有一個對象的 Set 視圖映射
小總結:
👒 類、數組到集合類的映射,叫做視圖。
2 子範圍
典型示例1:list.subList(10, 20);//其中list為ArrayList類型
首先,大緻看一下注釋,就是說它傳回這個集合元素是包含fromIndex,不包含 toIndex,也就是 [fromIndex,toIndex)。
子集的總體思想: 父子兩者間存在索引映射,并将兩者的索引進行互相轉換
典型示例2:TreeMap的 subMap
注意,目前這個類處理的,基本都是再切分會怎麼樣,主要還是看它的父類 NavigableSubMap:
後面的也都類似,主要思想是利用原集合,同時檢查邊界範圍
小總結:
👒 子集映射大多是索引、邊界的映射,同時傳遞父類對象,是對子類進行調用時父類方法的傳遞
👒 子集映射是可嵌套的,注意盡量不要在使用時嵌套多層視圖,會造成棧的大量消耗。
3 不可修改視圖
Collections.unmodifiableXX 系列,發現更改集合時,則抛出異常,用于對于無需修改集合,隻需檢視集合時的保護。
如圖,對于不可修改的清單,set/add/remove/replaceAll/sort/addAll 這些操作會産生異常
小總結:
👒 不可修改的視圖相當于在類的基礎上添加新的檢查
總結:
- 可能是對象的直接映射、索引映射、邊界映射或者隻是包裝的基礎上加新的檢查
- 視圖可以嵌套
- Collections 提供了大量的集合相關的工具類
- 視圖能夠通過建立新舊集合的映射節省空間