集合---视图与包装器

  • 实现了Collection/Map接口的类不只有我们熟悉的(ArrayList,LinkedList,HashSet,TreeSet,PriorityQueue,HashMap等类)类,还有好多别的类也实现了这些接口。通过使用视图可以获得其他实现了Collection/Map接口的对象。映射类的keySet方法就是这样的示例。
  • 映射类的keySet方法看起来是重新创建一个集合并将映射中所有的键填充进去;实际上并非如此:keySet方法返回一个实现了Set接口的类对象,这个类的方法对原映射进行操作。这种集合称为视图。


    • 轻量级集合包装器
      • Arrays类的asList()方法返回一个包装了Java数组的List包装器。返回的对象不是ArrayList,它是一个视图对象。参数为可变数目的参数/数组。
public static <T> List<T> asList(T... a)
返回一个受指定数组支持的固定大小的列表。(对返回列表的更改会“直接写”到数组。)此方法同 Collection.toArray() 一起,充当了基于数组的 API 与基于 collection 的 API 之间的桥梁。返回的列表是可序列化的,并且实现了 RandomAccess。
      • public class Collections  extends Object
      • Collections是个类,它的方法返回值和参数都是集合。不要将其与Collection接口混淆。
public static <T> List<T> nCopies(int n,
                                  T o)
返回由指定对象的 n 个副本组成的不可变列表 。新分配的数据对象非常小(它只包含一个对该数据对象的引用)。在通过与 List.addAll 方法组合来增大列表时,此方法很有用。返回的列表是可序列化的。
      • 返回的List接口对象是不可修改的,每个元素都是指定的对象的副本。


    • 子范围
      • 使用列表的subList()方法获得列表的子范围视图。
List<E> subList(int fromIndex,
                int toIndex)
返回列表中指定的 fromIndex(包括 )和 toIndex(不包括)之间的部分视图。(如果 fromIndex 和 toIndex 相等,则返回的列表为空)。返回的列表由此列表支持,因此返回列表中的非结构性更改将反映在此列表中,反之亦然。返回的列表支持此列表支持的所有可选列表操作。
      • 可以将任何操作应用于子范围,并且能够自动地作用于整个列表。
      • 对于有序集和有序映射,可以使用排序顺序建立子范围。
public SortedSet<E> subSet(E fromElement,
                          E toElement)
从接口 NavigableSet 复制的描述
返回此 set 的部分视图,其元素从 fromElement(包括)到 toElement(不包括)。(如果 fromElement 和 toElement 相等,则返回空的 set)。返回的 set 受此 set 支持,所以在返回 set 中的更改将反映在此 set 中,反之亦然。返回的 set 支持此 set 支持的所有可选 set 操作。
如果试图在返回 set 的范围之外插入元素,则返回的 set 将抛出 IllegalArgumentException。
等效于 subSet(fromElement, true, toElement, false)。

public SortedSet<E> tailSet(E fromElement)
从接口 NavigableSet 复制的描述
返回此 set 的部分视图,其元素大于等于 fromElement。返回的 set 受此 set 支持,所以在返回 set 中的更改将反映在此 set 中,反之亦然。返回的 set 支持此 set 支持的所有可选 set 操作。
如果试图在返回 set 的范围之外插入元素,则返回的 set 将抛出 IllegalArgumentException。
等效于 tailSet(fromElement, true)。

public SortedSet<E> headSet(E toElement)
从接口 NavigableSet 复制的描述
返回此 set 的部分视图,其元素严格小于 toElement。返回的 set 受此 set 支持,所以在返回 set 中的更改将反映在此 set 中,反之亦然。返回的 set 支持此 set 支持的所有可选 set 操作。
如果试图在返回 set 的范围之外插入元素,则返回的 set 将抛出 IllegalArgumentException。


    • 不可修改视图
      • Collections类还有几个方法用于产生不可修改视图。这些视图增加了运行时检查,如果发现尝试对视图进行修改,就会抛出异常,并将集合保持未修改状态。
      • 不可修改视图并不是集合本身不能修改。仍然可以通过集合的原始引用对集合进行修改,并且仍可以让集合的元素调用更改器的方法
      • 由于视图只包装了接口而不是实际的对象,所以只能访问接口定义的方法。
public static <T> Set<T> unmodifiableSet(Set<? extends T> s)
返回指定 set 的不可修改视图。此方法允许模块为用户提供对内部 set 的“只读”访问。在返回的 set 上执行的查询操作将“读完”指定的 set。试图修改返回的 set(不管是直接修改还是通过其迭代器进行修改)将导致抛出 UnsupportedOperationException。

public static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s)
返回指定有序 set 的不可修改视图。此方法允许模块为用户提供对内部有序 set 的“只读”访问。在返回的有序 set 上执行的查询操作将“读完”指定的有序 set。试图修改返回的有序 set(无论是直接修改、通过其迭代器修改,还是通过其 subSet、headSet 或 tailSet 视图修改)将导致抛出

public static <T> List<T> unmodifiableList(List<? extends T> list)
返回指定列表的不可修改视图。此方法允许模块为用户提供对内部列表的“只读”访问。在返回的列表上执行的查询操作将“读完”指定的列表。试图修改返回的列表(不管是直接修改还是通过其迭代器进行修改)将导致抛出 UnsupportedOperationException。

public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V> m)
返回指定映射的不可修改视图。此方法允许模块为用户提供对内部映射的“只读”访问。在返回的映射上执行的查询操作将“读完”指定的映射。试图修改返回的映射(不管是直接修改还是通过其 collection 视图进行修改)将导致抛出 UnsupportedOperationException。


    • 受检查视图
      • 该视图用来对泛型问题提供调试支持。


    • 同步视图
      • Java设计者使用视图机制来确保常规集合的线程安全,而不是实现线程安全的集合类。
public static <T> Collection<T> synchronizedCollection(Collection<T> c)
返回指定 collection 支持的同步(线程安全的)collection。为了保证按顺序访问,必须通过返回的 collection 完成所有对底层实现 collection 的访问

public static <T> Set<T> synchronizedSet(Set<T> s)
返回指定 set 支持的同步(线程安全的)set。为了保证按顺序访问,必须通过返回的 set 完成对所有底层实现 set 的访问。

public static <T> List<T> synchronizedList(List<T> list)
返回指定列表支持的同步(线程安全的)列表。为了保证按顺序访问,必须通过返回的列表完成所有对底层实现列表的访问。

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
返回由指定映射支持的同步(线程安全的)映射。为了保证按顺序访问,必须通过返回的映射完成所有对底层实现映射的访问。














































































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值