天天看點

《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)

《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)
《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)

 13.3.1 視圖與包裝器

視圖:從集合類通過映射關系擷取另一個集合類,而非直接建立新的集合類。優點是不占用額外空間,缺點是非真實集合,看上去不太直覺;另外,消耗了一定的棧存儲空間,不能做太多層的映射,會超出棧記憶體。

《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)

 1 輕量級包裝器

典型例子1:數組轉集合 Arrays.asList(xx);

《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)

注意,這裡的 ArrayList 不是 java.util.ArrayList,而是靜态内部類 ArrayList

《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)
《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)

這個類實際上都是對數組的映射,是 java.util.ArrayList 的簡化版本。特别注意的是,這個類不能增删元素!

《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)

由于上述截圖中沒有重寫  add/remove 方法,最終調用這兩個類會按照父類處理抛出異常。

典型示例2:Collecitons.singleton(object), 可建立一個隻有一個對象的 Set 視圖映射

《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)
《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)

小總結:

👒 類、數組到集合類的映射,叫做視圖。

《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)

 2 子範圍

典型示例1:list.subList(10, 20);//其中list為ArrayList類型

《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)

首先,大緻看一下注釋,就是說它傳回這個集合元素是包含fromIndex,不包含 toIndex,也就是 [fromIndex,toIndex)。

《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)

子集的總體思想: 父子兩者間存在索引映射,并将兩者的索引進行互相轉換

典型示例2:TreeMap的 subMap

《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)
《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)

注意,目前這個類處理的,基本都是再切分會怎麼樣,主要還是看它的父類 NavigableSubMap:

《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)

後面的也都類似,主要思想是利用原集合,同時檢查邊界範圍

小總結:

👒 子集映射大多是索引、邊界的映射,同時傳遞父類對象,是對子類進行調用時父類方法的傳遞

👒 子集映射是可嵌套的,注意盡量不要在使用時嵌套多層視圖,會造成棧的大量消耗。

《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)

 3 不可修改視圖

Collections.unmodifiableXX 系列,發現更改集合時,則抛出異常,用于對于無需修改集合,隻需檢視集合時的保護。

如圖,對于不可修改的清單,set/add/remove/replaceAll/sort/addAll 這些操作會産生異常

《Java 核心技術 卷1》 筆記 第13章 集合(8)視圖(一)

小總結:

👒 不可修改的視圖相當于在類的基礎上添加新的檢查

總結:

  1. 可能是對象的直接映射、索引映射、邊界映射或者隻是包裝的基礎上加新的檢查
  2. 視圖可以嵌套
  3. Collections 提供了大量的集合相關的工具類
  4. 視圖能夠通過建立新舊集合的映射節省空間