Java容器中的视图
Java中的视图主要用于对Java容器的操作, 视图实现了容器对应的接口,返回原容器对象进行操作.
Collections类包含了很多实用的方法,这些方法的参数和返回值都是集合;不要与Collection接口混淆。
视图主要有一下几种:
轻量级集合包装器
Arrays.asList(T ...t)
提供一个实现有List
接口的对象,对象内部使用数组实现,可以使用get()
和set()
方法,但是不能使用add()
和remove()
方法.
Collections.nCopys(int n, T o)
提供一个只读的List
接口对象,n个重复对象o的数组.
Collections.singleton(name)
提供一个只有一个固定元素的Set
集合.
子集视图
List.subList(fr, to)
提供一个原集合的子列表,对子列表的操作会修改原列表.
SortedSet.subSet(fr, to)
提供一个>=fr
且<to
的子集.
SortedMap.subMap(fr, to)
提供一个k>=fr&&k<to
的子Map.
只读视图
只读视图有一下一些接口
Collections.unmodifiedCollection
Collections.unmodifiedList
Collections.unmodifiedSet
Collections.unmodifiedSortedSet
Collections.unmodifiedNavigableSet
Collections.unmodifiedMap
Collections.unmodifiedSortedMap
Collections.unmodifiedNavigableMap
同步视图
把原集合映射成为线程同步安全的集合.
Collections.synchronizedMap(new HashMap())
受查视图
public static void main(String[] args) {
ArrayList<String> str = new ArrayList<String>();
ArrayList string = str;
string.add(new Date());// 到这里并没有发现添加的类型不符
Date date = (Date) string.get(0);
System.out.println(date);
/*
* String s = (String) string.get(0);//这里检测到类型不匹配 System.out.println(s);
*/
System.out.println("----------我是分割线----------");
ArrayList<String> str2 = new ArrayList<String>();
List<String> safe = Collections.checkedList(str2, String.class);
List string02 = safe;
string02.add(new Date());// 编译器检测到这里的add异常
// 上面句编译会报错 java.lang.ClassCastException: Attempt to insert class java.util.Date element into collection with element type class java.lang.String
System.out.println("ok");
}