在这一节中,讲详细探讨Java Collections Framework中的每一个接口。
1. Collection Interface
假如你有这样一个声明,Collection<String> c, 你可得到一个String对象的集合。这个集合可能是List,Set或其他的Collection类型。下面的这种用法会创建一个ArrayList,包含String对象。
List<String> list = new ArrayList<String>(c);
以下是Collection接口的声明:
以上的定义,包含了你对一个集合所期待的基本操作。像add这种方法的定义是及其一般的(没有方法体),因此,不管一个集合是否允许重复的数据出现,这个方法都是有意义的。因为你可以在具体实现中来处理重复元素。
2. 遍历集合
有两种方法可以遍历一个集合:a. for each结构 b. 使用迭代器Iterator
for each结构:
for each结构允许你使用简明的for循环来便利集合中的每一个元素:
Iterator:
迭代器对象允许你遍历一个集合,并且提供有选择地删除集合中元素的能力。你可以通过调用集合的iterator方法得到这样一个对象。一个迭代器的接口定义如下:
hasNext方法返回true,如果仍有为访问的元素。而next()方法则返回下一个元素。你可以通过remove来删除最后一个由next返回的元素。
[color=red]注意:[/color]remove方法是在遍历Collection时唯一安全的对集合作出更改的操作。当遍历进程进行时,其它对集合进行更改的操作会导致不可预料的结果。
当你有以下需要时,你需要使用迭代器而不是for each循环:
a. 移除一个元素。由于for each隐藏了迭代器,所以你不能通过for each移除一个元素。因此,如果你需要过滤集合中的数据,请使用迭代器。
b. 平行地处理多个集合。
3. 集合接口的整体操作(bulk operations.)
Bulk operations是在集合整体上进行的一些操作,这样的操作一般都是在基本操作的基础上实现的,尽管在大多数情况下,这些操作的效率都比较低。以下是一些bulk operations:
containsAll() 如果目标集合包含给定集合的全部元素,则返回true
addsAll() 将给定集合中的元素全部添加到目标集合中
removeAll() 从目标集合中移除所有被给定集合包含的元素,即移除两个集合的交集。
retainAll() 从目标集合中保留与给定集合相同的元素,即保留交集。
clear() 移除所有元素。
addAll, removeAll, and retainAll方法都会返回true,如果在处理过程中集合发生了更改。
为了展示bulk operations的威力,我们将编写一些简单的代码(这些都是习惯用法),来移除一个集合c中所有特定元素e的实例。
Collections.singleton 是一个静态工厂方法,会返回一个只包含给定元素的不可更改的集合。
4.集合接口的数组操作
数组操作允许我们集合中的元素导出到一个数组中。一个最简单的toArray()调用会生成一个Object[]数组,可以通过更多的限定条件来获得更详细的数组,如
这会生成新的string数组,长度和集合c的元素数一致。
(to be continued...)
1. Collection Interface
假如你有这样一个声明,Collection<String> c, 你可得到一个String对象的集合。这个集合可能是List,Set或其他的Collection类型。下面的这种用法会创建一个ArrayList,包含String对象。
List<String> list = new ArrayList<String>(c);
以下是Collection接口的声明:
public interface Collection<E> extends Iterable<E> {
// Basic operations(基本操作)
int size();
boolean isEmpty();
boolean contains(Object element);
boolean add(E element); //optional(可选的)
boolean remove(Object element); //optional
Iterator<E> iterator();
// Bulk operations
boolean containsAll(Collection<?> c);
boolean addAll(Collection<? extends E> c); //optional
boolean removeAll(Collection<?> c); //optional
boolean retainAll(Collection<?> c); //optional
void clear(); //optional
// Array operations
Object[] toArray();
<T> T[] toArray(T[] a);
}
以上的定义,包含了你对一个集合所期待的基本操作。像add这种方法的定义是及其一般的(没有方法体),因此,不管一个集合是否允许重复的数据出现,这个方法都是有意义的。因为你可以在具体实现中来处理重复元素。
2. 遍历集合
有两种方法可以遍历一个集合:a. for each结构 b. 使用迭代器Iterator
for each结构:
for each结构允许你使用简明的for循环来便利集合中的每一个元素:
for (Object o : collection)
System.out.println(o);
Iterator:
迭代器对象允许你遍历一个集合,并且提供有选择地删除集合中元素的能力。你可以通过调用集合的iterator方法得到这样一个对象。一个迭代器的接口定义如下:
public interface Iterator<E>{
boolean hasNext();
E next();
void remove(); //optional
}
hasNext方法返回true,如果仍有为访问的元素。而next()方法则返回下一个元素。你可以通过remove来删除最后一个由next返回的元素。
[color=red]注意:[/color]remove方法是在遍历Collection时唯一安全的对集合作出更改的操作。当遍历进程进行时,其它对集合进行更改的操作会导致不可预料的结果。
当你有以下需要时,你需要使用迭代器而不是for each循环:
a. 移除一个元素。由于for each隐藏了迭代器,所以你不能通过for each移除一个元素。因此,如果你需要过滤集合中的数据,请使用迭代器。
b. 平行地处理多个集合。
3. 集合接口的整体操作(bulk operations.)
Bulk operations是在集合整体上进行的一些操作,这样的操作一般都是在基本操作的基础上实现的,尽管在大多数情况下,这些操作的效率都比较低。以下是一些bulk operations:
containsAll() 如果目标集合包含给定集合的全部元素,则返回true
addsAll() 将给定集合中的元素全部添加到目标集合中
removeAll() 从目标集合中移除所有被给定集合包含的元素,即移除两个集合的交集。
retainAll() 从目标集合中保留与给定集合相同的元素,即保留交集。
clear() 移除所有元素。
addAll, removeAll, and retainAll方法都会返回true,如果在处理过程中集合发生了更改。
为了展示bulk operations的威力,我们将编写一些简单的代码(这些都是习惯用法),来移除一个集合c中所有特定元素e的实例。
//移除e元素
c.removeAll(Collections.singleton(e));
//移除所有的null元素
c.removeAll(Collections.singleton(null));
Collections.singleton 是一个静态工厂方法,会返回一个只包含给定元素的不可更改的集合。
4.集合接口的数组操作
数组操作允许我们集合中的元素导出到一个数组中。一个最简单的toArray()调用会生成一个Object[]数组,可以通过更多的限定条件来获得更详细的数组,如
String[] a = c.toArray(new String[0]);
这会生成新的string数组,长度和集合c的元素数一致。
(to be continued...)