深入理解Collections API

http://tech.ddvip.com   2006年11月23日    社区交流

本文详细介绍深入理解Collections API

  这是一个简单但实用的Set惯用程序。 假设你有一个Collection, c, 并且你要创建另一个包含相同元素的Collection,但是所有重复元素已被清除。下面的程序给出了一个小技巧:

  Collection noDups = new HashSet(c);

  它是通过创建一个Set(按定义,Set不能包含重复元素)来达到目的的,这个Set初始包含c中的所有元素。

  基本操作

  size操作返回Set中元素的数量(它的集的势(cardinality))。 isEmpty方法所完成的工作正如你从字面上理解的一样。add方法将特定元素添加到Set中(如果该元素不在Set之中), 并返回一个表示该元素是否已被添加的布尔值。 类似地, remove方法从Set中删除特定元素(如果该元素存在于Set之中), 并返回表示该元素是否存在的布尔值。iterator方法返回一个在Set上的Iterator 。

  以下是一个小程序, 它从它的参数列表中获得词汇并打印出任何重复词汇、不同词汇的数量以及删除了重复词汇的词汇列表:

import java.util.*;
public class FindDups {
public static void main(String args[]) {
Set s = new HashSet();
for (int i=0; i$#@60; args.length; i++)
if (!s.add(args[i]))
System.out.println("Duplicate detected: "+args[i]);
System.out.println(s.size()+" distinct words detected: "+s);
}
}

   现在让我们来运行这个程序:

% java FindDups i came i saw i left
Duplicate detected: i
Duplicate detected: i

  4 distinct words detected: [came, left, saw, i]

  请注意, 该例子中的代码总是通过它的接口类型(Set )来引用对象集 , 而不是通过它的实现类型(HashSet)。这是一种被极力推荐的编程方法, 因为它给了你仅仅通过改变构造函数就可以改变实现的灵活性。如果用来存储一个对象集 的变量, 或用来传递对象集 的参数被声明为是对象集 的实现类型而不是它的接口类型的, 那么所有这样的变量和参数必须被改变以改变对象集 的实现类型。 进一步来讲, 如果程序中使用了任何在原始实现类型中存在而新的实现中没有的非标准操作, 那么将不能保证程序的正常运行。仅仅通过对象集的接口来引用对象集使你保持了诚实的作风, 因为从某种意义上讲, 它使你不能使用任何非标准操作。

责编:豆豆技术应用

正在加载评论...