需要知道,Java集合类库将接口与实现分离。
下面的图片展示了Java集合框架的接口:
本文中我们来了解Iterable接口和Conllection接口的基本功能。
Collection接口:
Collection接口是集合类库的基本接口。 这个接口有两个基本方法:
public interface Collection<E>{
boolean add(E element);
Iterator<E> iterator();
……
}
iterator 方法会返回一个实现了Iterator接口的对象,可以使用这个迭代器对象依次访问集合中的元素。 大致步骤为:
Collection<String> strings = new ArrayList<>();
//new ArrayList<>()可以用任意实现了Collection接口的集合类代替
//向集合对象中添加元素
strings.add("qwer");
strings.add("asdf");
strings.add("zxcv");
Iterator iterator = strings.iterator();
//获得此集合对象的迭代器对象
//借助迭代器对象遍历这个集合对象
while (iterator.hasNext()){
String element = (String) iterator.next();
//对元素进行操作
}
Iterable接口:
事实上,Collection接口继承自Iterable接口。
Iterable接口中有一个抽象方法,两个默认方法:
Iterator<T> iterator();
default void forEach(Consumer<? super T> action) {
......
}
default Spliterator<T> spliterator() {
......
}
我们不用过分在意这些方法的含义是什么,重点是要清楚:凡是实现了Iterable接口的对象,都可以用for each循环进行遍历。
就如上面的例子中,我们先是获得集合对象的迭代器,然后通过while循环和迭代器进行遍历,步骤较繁琐;但如果使用for each循环,代码就会更为简洁。
可以将用while循环遍历部分改为:
for (String element: strings) {
//对元素进行操作
}
很明显这种方法更加简洁、方便。
因为Collection接口继承自Iterable接口,这也就代表着:标准类库中的任何集合都可以使用for each循环遍历。
从上面的图中可以看出,List、Set、Queue 这三个接口都继承自Collection接口。
List接口是一个有序集合,元素会增加到容器中的特定位置。可以通过两种方式访问元素:
- 使用迭代器访问,使用这种方式时,必须顺序的访问元素。
- 使用一个整数索引来访问,这种方法可以按任意顺序访问元素,被称为随机访问。
Set(集)接口等同于Collection接口,不过其方法的行为有更严谨的定义。Set(集)的add方法不允许增加重复的元素。需要适当的定义Set(集)的equals方法:只要两个集包含的元素相同就认为它们是相等的,而不要求这些元素有同样的顺序。hashCode方法的定义要保证包含元素相同的两个集会得到相同的散列码。
Queue接口指出可以在队尾添加元素,在队头删除元素,并且可以查找队列中元素的个数。当需要收集对象并按照“先进先出”的方式获取对象时,就应该使用队列。