Java(7-4)

集合的最后一回了,这次要说说视图和包装器,说实话,视图还好说,我知道他们可以对进程的同步,映射部分内容的承接(keySet返回一个实现Set接口的包含键的类,方便我们从键的角度对原映射进行操作。),但是包装器能干什么呢?我们先看看这个。

Part1 轻量级集合包装器
实例:Arrays类的静态方法asList将返回一个包装了普通Java数组的List包装器。这个方法可以将数组转化成一个列表或集合参数,例如:

Card[] cardDeck() = new Card[52];
...
List<Card> cardList = Arrays.asList(cardDeck);

返回的对象是一个视图对象,带有底层数组的get和set方法。但是!注意,改变数组大小的任何方法,都会抛出一个UnsupportedException异常,例如:与迭代器相关的add和remove方法。

类似的,对于集合框架中的每一个接口,还有一些方法可以生成空集,列表,映射,等等。特别是,集的类型可以推导得出。

part2 子范围,同步视图和不可修改视图,受查视图

可以为很多集合建立子范围视图 。例如,我们有一个列表staff,现在想从中去除第10个到第19个元素。可以使用subList方法来获得一个列表的子范围视图。

List group2 = staff.subList(10,20);

第一个索引包含在内,第二个索引不包含在内。 可将原集合的任何操作用于子范围,并且能够自动地反映整个列表的情况,例如:

group2.clear();

现在元素自动的从staff列表中清楚了,并且group2为空。

对于有序集和映射,可以使用排序顺序而不是元素位置建立子范围。SortedSet接口声明了三个方法:

SortedSet<E> subSet(E from,E to);
SortedSet<E> headSet(E to);
SortedSer<E> tailSet(E from);

有序映射也有类似的方法:

SortedMap<K,V> subMap(K from,K to);
SortedMap<K,V> headMap(K to);
SortedMap<K,V> tailMao(K from);

不可修改视图 ,名字起的就好!这些视图对现有集合增加了一个运行时的检查,如果发现视图对集合进行修改,就抛出一个异常!可以用一下八种方法,获得不可修改视图:

Collections.unmodifiableCollection
Collections.unmodifiableList
Collections.unmodifiableSet
Collections.unmodifiableSortedSer
Collections.unmodifiableNavigableSet
Collections.unmodifiableMap
Collections.unmodifiableSortedMap
Collections.unmodifiableNavigableMap

每个放法都为了一个接口去定义的。例如Collections.unmodifiableList与ArrayList、LinkedList或者任何实现了List接口的其他类一起协同工作。
举个例子,我们想查看某部分代码,但又不触及某个集合的内容,就可以进行下列操作:

List<String> staff = new LinkedList<>();
...
lookAt(Collections.unmodifiableList(staff));

Collections.unmodifiabledList方法将返回一个实现List接口的类对象。其访问器方法将从staff集合中获取值。当然lookAt方法可以调用List接口中的所有方法,而不只是访问器。但是所有修改集合的方法都不可行,会抛出异常!由于视图只是包装了接口而不是实际的集合对象,所以只能访问接口中定义的方法。

同步视图
很关键的东西感觉,多线程肯定会用到的。

如果由多个线程访问集合,就必须确保集不会被意外的破坏。例如,如果一个线程视图将元素添加到散列表中,同时另一个线程正在对散列表进行再散列的操作,那结果将是不可预计的灾难!
同步视图,就是为了在多线程异步的情况下完成同步操作(当然还要考虑死锁,不过那是trylock的事情),我们可以调用Collections类的静态方法syschronizedMap来将任何一个映射表转换成聚友同步访问方法的Map!如下:

Map<String,Employee> map = Collection.synchronizedMap(new HashMap<String,Employee>());

现在,就可以多线程访问map对象了!像get,put这类方法都是同步操作的。

受查视图
受查视图的add方法有些特殊,他可以检测插入的对象是否属于给定的类(这是为了解决我们当初声明泛型时可能遇到的风险!),如果不是给定的类,就会抛出一个异常!
声明受查视图的方式如下:

ArrayList<String> = new ArrayList<>();
List<String> safeStrings = Coleections.checkedList(strings,String.class)
ArrayList rawList = safeStrings;
rawList.add(new Date);//这里将会进行检查
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章