Java集合视图

一.什么是集合视图

  • 集合视图并没有一个明确的定义。拿映射类keySet方法类比,初看起来,好像这个方法创建了一个新集,并将映射中的所有键都填进去,然后返回这个集。但是情况并非如此。取而代之的是,keySet方法返回一个实现Set接口的类对象,这个类的方法对原映射进行操作。这种集合称为视图。

二.创建视图的方法

  • 可以通过轻量级集合包装器创建视图
List strings = Arrays.asList("whz", "pyy");
List whz = Collections.nCopies(100, "whz");
  • 可以为集合建立子范围视图
//第一个索引包含在内,第二个索引则不包含在内。
List group2 = staff.subList(10,20);

SortedSet subSet(E fromElement, E toElement);
SortedSet tailSet(E fromElement);
SortedSet headSet(E toElement);

  • Collections还有几个方法,用于产生集合的不可修改视图。
Collections.unmodifiableCollection();
Collections.unmodifiableList();
Collections.unmodifiableSet();
Collections.unmodifiableSortedSet();
Collections.unmodifiableNavigableSet();
Collections.unmodifiableMap();
Collections.unmodifiableSortedSet();
Collections.unmodifiableNavigableMap();

三.同步视图

  • 如果多个线程访问集合,就必须确保集合不会被意外地破坏。
  • 类库的设计者使用视图机制来确保常规集合的线程安全,而不是实现线程安全的集合类。例如,Collections类的静态synchronizedMap方法可以将任何一个映射表转换成同步方法访问的Map。
Map employeeMap = 
                Collections.synchronizedMap(new HashMap());

四.受查视图

  • 受查视图用来对泛型类型发生问题时提供调试支持。例如:
ArrayList strings = new ArrayList<>();
ArrayList rawList = strings;
rawList.add(new Date());
  • 这个错误的add命令在运行时检测不到。相反,只有在稍后的另一部分代码中调用get方法,将结果转化为String时,这个类才会抛出异常。
  • 受查视图可以探测到这个类问题,下面定义了一个安全列表
ArrayList strings = new ArrayList<>();
List stringList = Collections.checkedList(strings, String.class);
ArrayList rawList = (ArrayList) stringList;
rawList.add(new Date());
  • 抛出java.lang.ClassCastException

你可能感兴趣的:(Java基础知识)