《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_java

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_嵌套_02

 13.3.1 视图与包装器

视图:从集合类通过映射关系获取另一个集合类,而非直接创建新的集合类优点是不占用额外空间,缺点是非真实集合,看上去不太直观;另外,消耗了一定的栈存储空间,不能做太多层的映射,会超出栈内存。

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_集合类_03

 1 轻量级包装器

典型例子1数组转集合 Arrays.asList(xx);

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_idea_04

注意,这里的 ArrayList 不是 java.util.ArrayList,而是静态内部类 ArrayList

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_idea_05

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_嵌套_06

这个类实际上都是对数组的映射,是 java.util.ArrayList 的简化版本。特别注意的是,这个类不能增删元素!

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_idea_07

由于上述截图中没有重写  add/remove 方法,最终调用这两个类会按照父类处理抛出异常。

典型示例2Collecitons.singleton(object), 可创建一个只有一个对象的 Set 视图映射

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_集合类_08

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_java_09

小总结:

👒 类、数组到集合类的映射,叫做视图。

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_父类_10

 2 子范围

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

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_嵌套_11

首先,大致看一下注释,就是说它返回这个集合元素是包含fromIndex,不包含 toIndex,也就是 [fromIndex,toIndex)。

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_嵌套_12

子集的总体思想: 父子两者间存在索引映射,并将两者的索引进行相互转换

典型示例2TreeMap的 subMap

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_java_13

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_集合类_14

注意,当前这个类处理的,基本都是再切分会怎么样,主要还是看它的父类 NavigableSubMap:

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_java_15

后面的也都类似,主要思想是利用原集合,同时检查边界范围

小总结:

👒 子集映射大多是索引、边界的映射,同时传递父类对象,是对子类进行调用时父类方法的传递

👒 子集映射是可嵌套的,注意尽量不要在使用时嵌套多层视图,会造成栈的大量消耗。

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_java_16

 3 不可修改视图

Collections.unmodifiableXX 系列,发现更改集合时,则抛出异常,用于对于无需修改集合,只需查看集合时的保护。

如图,对于不可修改的列表,set/add/remove/replaceAll/sort/addAll 这些操作会产生异常

《Java 核心技术 卷1》 笔记 第13章 集合(8)视图(一)_父类_17

小总结:

👒 不可修改的视图相当于在类的基础上添加新的检查

总结:

  1. 可能是对象的直接映射、索引映射、边界映射或者只是包装的基础上加新的检查
  2. 视图可以嵌套
  3. Collections 提供了大量的集合相关的工具类
  4. 视图能够通过创建新旧集合的映射节省空间

 相关内容:选择 《Java核心技术 卷1》查找相关笔记

评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步

公众号 钰娘娘知识汇总