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
2). 不可修改的视图:
Collections.unModifiableCollection();
Collections.unModifiableList(); //用于ArrayList、LinkedList
Collections.unModifiableSet(); //用于HashSet、TreeSet、LinkedHashSet
Collections.unModifiableSortedSet();//用于TreeSet
Collections.unModifiableMap(); //用于HashMap、TreeMap、LinkedHashMap
Collections.unModifiableSortedMap();//用于TreeMap
如List
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
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
10 ArrayList
11 ArrayList rawList = safeStrings;
12 rawList.add(new Date()); //exception will be thrown here.
13 }
注:从集合框架的整体设计技巧、扩展性、效率等方面综合比较,Java在此方面和C++的stl相比还是存在一定的差距。特别是扩展性和效率方面,C++ 的标准库定义了更多更灵活的模参扩展。由于标准库都是通过模板的方式实现的,因此其执行效率要明显优于基于虚函数的虚指针和虚表的这种动态绑定的多态方式,其不足只是编译速度稍微慢罢了。
14. 算法: www.2cto.com
在C++中提供了一套泛型算法,主要涵盖排序、搜索和比较