Step By Step(Java 集合篇) (九)

2014-11-24 03:19:39 · 作者: · 浏览: 16
Saturday);

9 System.out.println("es1 = " + es1);

10 System.out.println("es2 = " + es2);

11 System.out.println("es3 = " + es3);

12 System.out.println("es4 = " + es4);

13 }

14 /* 结果如下:

15 es1 = [Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday]

16 es2 = []

17 es3 = [Thursday, Friday, Saturday, Sunday]

18 es4 = [Monday, Saturday] */

13. 集合视图:顾名思义,所有的集合视图和数据库中的普通视图一样,并不存储真实是的容器元素,而只是建立一套针对原有底层集合数据的引用机制,针对所有视图的操作或底层集合的操作都会同时相互影响,如插入和删除等,但是对于视图而言,插入操作如果作用于其范围之外将会引发异常。对于不同类别的视图其操作也存在不同的限制。

1). subList:获取底层集合中某一范围的元素,如List group2 = staff.asList(10,20); 这第一个索引上的数据是被包含的,第二个索引的数据是不被包含的。如果执行了group2.clear()操作情况了视图中的数据,那么staff中这段范围内的数据也会被连同删除。对于有序集合和映射表(Map),可以使用排序顺序而不是元素位置建立子范围,如SortedSet接口声明的SortedSet subSet(E from,E to); SortedSet headSet(E to); SortedSet tailSet(E from); 注意这3个参数的类型均不是元素的索引,而是对象本身。SortedMap中也有类似的方法,如SortedMap subMap(K from,K to); SortedMap headMap(K to); SortedMap tailMap(K from)。在NavigableSet中提供更为丰富的接口,如NavigableSet subSet(E from,boolean fromInclusive,E to,boolean toInclusive); NavigableSet headSet(E to,boolean toInclusive); NavigableSet tailSet(E from,boolean fromInclusive);

2). 不可修改的视图:

Collections.unModifiableCollection();

Collections.unModifiableList(); //用于ArrayList、LinkedList

Collections.unModifiableSet(); //用于HashSet、TreeSet、LinkedHashSet

Collections.unModifiableSortedSet();//用于TreeSet

Collections.unModifiableMap(); //用于HashMap、TreeMap、LinkedHashMap

Collections.unModifiableSortedMap();//用于TreeMap

如List staff = new LinkedList(); List unmodifiableList = new Collections.unmodifiableList(staff); 这里unmodifiableList作为一个List对象,所有访问器的方法均可像普通List一样操作,但是对于更改器方法的调用将会引发UnsupportedOperationException异常。如果确实需要修改数据只能通过原始集合来完成。

3) 同步视图:

Collections.synchronizedList(); //用于ArrayList、LinkedList

Collections.synchronizedSet(); //用于HashSet、TreeSet、LinkedHashSet

Collections.synchronizedSortedMap();//用于TreeMap

Collections.synchronizedSortedSet();//用于TreeSet

Collections.synchronizedMap(); //用于HashMap、TreeMap、LinkedHashMap

之后所有通过同步视图访问底层集合的操作都将是线程安全的,即synchronized关键字就不需要在集合的外部添加了,但是对于底层集合的直接访问仍然是线程不安全。

4) 被检查视图:见以下两种情况,第一种情况将会在集合执行(String)rawList.get()操作时抛出ClassCastException异常,第一种情况则会在rawList.add()操作时就立即抛出ClassCastException。

1 public void uncheckedListTest() {

2 ArrayList strings = new ArrayList();

3 ArrayList rawList = strings;

4 rawList.add(new Date()); //no exception is raised here.

5 String ss = (String)rawList.get(0); //exception will be thrown here.

6 }

7

8 public void checkedListTest() {

9 ArrayList strings = new ArrayList();

10 ArrayList safeStrings = Collections.checkedList(strings,String.class);

11 ArrayList rawList = safeStrings;

12 rawList.add(new Date()); //exception will be thrown here.

13 }

注:从集合框架的整体设计技巧、扩展性、效率等方面综合比较,Java在此方面和C++的stl相比还是存在一定的差距。特别是扩展性和效率方面,C++ 的标准库定义了更多更灵活的模参扩展。由于标准库都是通过模板的方式实现的,因此其执行效率要明显优于基于虚函数的虚指针和虚表的这种动态绑定的多态方式,其不足只是编译速度稍微慢罢了。

14. 算法: www.2cto.com

在C++中提供了一套泛型算法,主要涵盖排序、搜索和比较