特殊集合的实现
介绍
为保持“集合框架”简单性,添加的功能是由包装程序实现(也称“装饰者”设计模式 ― 有关模式的更多信息,请参阅设计模式(Design Patterns)一书)提供的。这些包装程序让底层实现类处理集合部分,但它们给集合添加了功能性。这些包装程序都通过 Collections 类提供。该 Collections 类还支持创建特殊大小写的集合。
回页首
只读集合
把所有必要的元素都添加到集合后,为避免意外的修改集合,以只读方式处理该集合会比较方便。Collections 类提供了六种工厂方法支持该功能,Collection、List、Map、Set、SortedMap 和 SortedSet 每个一种。
Collection unmodifiableCollection(Collection collection)
List unmodifiableList(List list)
Map unmodifiableMap(Map map)
Set unmodifiableSet(Set set)
SortedMap unmodifiableSortedMap(SortedMap map)
SortedSet unmodifiableSortedSet(SortedSet set)
一旦您填充完集合,用只读引用替代原始引用。如果不替代原始引用,那么集合就不是只读的,因为您仍然可以使用原始引用修改集合。以下程序演示了把集合设置成只读的正确方法。此外,程序还展示了当您设法修改只读集合时出现的情况。
import java.util.*;
public class ReadOnlyExample {
public static void main(String args[]) {
Set set = new HashSet();
set.add("Bernadine");
set.add("Elizabeth");
set.add("Gene");
set.add("Elizabeth");
set = Collections.unmodifiableSet(set);
set.add("Clara");
}
}
当程序运行时,最后一个 add() 操作试图作用于该只读集时,一个 UnsupportedOperationException 被抛出。
回页首
线程安全集合
历史集合类和“集合框架”中新的实现的差别在于新类不是线程安全的。设计者采用这种线程安全方法是让您只在需要时才使用同步,使每项工作快得多。但如果,您正将集合用于多个线程能够同步修改集合的多线程环境,修改就必须同步进行。Collections 类有能力用另一组的六个方法把现有的集合包装程序成同步集合:
Collection synchronizedCollection(Collection collection)
List synchronizedList(List list)
Map synchronizedMap(Map map)
Set synchronizedSet(Set set)
SortedMap synchronizedSortedMap(SortedMap map)
SortedSet synchronizedSortedSet(SortedSet set)
创建完集合后立刻让它同步。而且,您决不能保留原始集合的引用,否则,您就可以不同步的访问集合了。确保您没有保留引用的最简单方法是永远不要创建引用:
Set set = Collection.synchronizedSet(new HashSet());
让集合不可修改还促成了集合的线程安全,因为集合不能被修改了。这就避免了同步的开销。
回页首
单元素集合
Collections 类有能力相当轻松的创建单个元素集。您不必先创建 Set 然后再分步对它进行填充,而可以一次性完成全部工作。这样产生的 Set 是不变的。
Set set = Collection.singleton("Hello");
Java 2 SDK,标准版,版本 1.3 也添加了创建单子列表和映射的能力:
List singletonList(Object element)
Map singletonMap(Object key, Object value)
回页首
多副本集合
如果您需要一张由相同元素的多个副本组成的不变的列表,Collections 类的 nCopies(int n, Object element) 方法返回的正好是这样的 List:
List fullOfNullList = Collection.nCopies(10, null);
对于它自身来说,似乎没有太多用处。但是,将它传递给另一个列表后就可以使它成为可修改的:
List anotherList = new ArrayList(fullOfNullList);
现在我们创建了一个 10 个元素的 ArrayList,其中每个元素都是 null。 您现在可以任意的修改每个元素了,因为这已是恰当的了。
回页首
空集合
Collections 类还提供表示空集合的常数:
List EMPTY_LIST
Set EMPTY_SET
Java 2 SDK,标准版,版本 1.3 包含一个预定义的空映射常数:
Map EMPTY_MAP