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 publicvoiduncheckedListTest() {
2 ArrayList
3 ArrayList rawList = strings;
4 rawList.add(newDate()); //no exception is raised here.
5 String ss = (String)rawList.get(0); //exception will be thrown here.
6 }
7
8 publicvoidcheckedListTest() {
9 ArrayList
10 ArrayList
11 ArrayList rawList = safeStrings;
12 rawList.add(newDate()); //exception will be thrown here.
13 }
注:从集合框架的整体设计技巧、扩展性、效率等方面综合比较,Java在此方面和C++的stl相比还是存在一定的差距。特别是扩展性和效率方面,C++的标准库定义了更多更灵活的模参扩展。由于标准库都是通过模板的方式实现的,因此其执行效率要明显优于基于虚函数的虚指针和虚表的这种动态绑定的多态方式,其不足只是编译速度稍微慢罢了。
14. 算法:
在C++中提供了一套泛型算法,主要涵盖排序、搜索和比较等通用操作,由于这些泛型算法完全基于各种集合提供的迭代器(iterator)统一接口,因此可以达到一种高度的泛型操作,以及算法函数和集合之间的完全松耦合。见如下C++代码:
1 #include
2 #include
3 #include
4 usingnamespacestd;
5 intmain()
6 {
7 vector
8 for(inti = 0; i < 10; ++i)
9 v1.push_back(i);
10 set
11 for(inti = 0; i < 20; ++i)
12 s1.insert(i);
13 sort(v1.begin(),v1.end());
14 binary_search(v1.begin(),v1.end(),5);
15 binary_search(s1.begin(),s1.end(),5);
16 return0;
17 }
在Java中同样提供了这样的泛型算法,不同的是这些算法函数都是Collections中静态方法。见如下Java代码:
1 publicstaticvoidmain(String[] args) {
2 List
3 for(inti = 0; i < 10; ++i)
4 v1.add(i);
5
6 List
7 for(inti = 0; i < 20; ++i)
8 l1.add(i);
9
10 Collections.sort(v1);
11 Collections.sort(l1);
12 Collections.binarySearch(v1, 5);
13 Collections.binarySearch(l1, 5);
14 }