Java核心技术读书笔记9-2 Java集合视图与包装器


4.视图与包装器

视图(view)即对原数据结构的数据根据不同方式映射成一个新集合(如HashMap的keySet),其特点是对视图进行操作,也会对原数据结构产生影响。

4.1 轻量级集合包装器
通过Arrays的asList方法将返回一个包装了普通Java数组的List包装器返回一个视图。该视图可以使用get和set方法,但改变数组大小的所有方法都会引发异常
同样,Arrays.asList(parameters); //可以接受可变参,实际上仍然是为用数组接收,返回一个不可变长的集合视图。
Collections.nCopies(n, anObject); //返回一个包含n个元素每个元素都是anObject的不可修改集合

4.2 子范围视图
可以通过subList方法返回一个指定范围的子集合视图。可以对这个子集合视图做任何操作,操作结果也将影响原集合。
List subList = staff.subList(10, 20); //返回staff[10, 19]范围内的子集合视图

对于实现了SortedSet与SortedMap接口的有序集和映射,可以使用排序顺序而不是元素位置建立子范围。

而对于Java 6的NavigableSet接口可以赋予更多的子范围控制能力。可以指定是否包含边界。

4.3 不可修改视图
Collections有一些方法可以对相应的数据结构对象返回其不可修改视图。若对这些视图进行修改则会抛出一个异常。

4.4 同步视图
类库的设计者确保访问常规集合的线程安全是通过使用同步视图来完成的,如synchronizedMap方法可以将任何一个映射表转换成具有同步方法的Map,之后不同线程对于该Map视图的操作都是同步的。

4.5 受查视图
受查视图将会对插入不合法类型的对象操作抛出异常。但是对于泛型会受限于JVM的擦除问题,例如JVM对于ArrayList>会将元素擦除成Pair,所以无法阻止插入Pair

4.6 可选操作
对于视图的操作可能会有一些局限性,例如不能改变大小或完全不可变等等,否则会抛出异常。在定义相应接口时,还会提供说明一些方法是可选操作。这种与接口是一种规范,实现类必须实现所有方法的理念产生了冲突,但这确实带来了没必要单独额外的定义接口简单性。所以在自己编写类库时可以避免类似的出现接口中“可选”方法的定义。