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 提供了大量的集合相关的工具类
- 视图能够通过创建新旧集合的映射节省空间
相关内容:选择 《Java核心技术 卷1》查找相关笔记
评论🌹点赞👍收藏✨关注👀,是送给作者最好的礼物,愿我们共同学习,一起进步
公众号 钰娘娘知识汇总