Java集合框架中Iterable接口和Collection接口

147 阅读2分钟

需要知道,Java集合类库将接口与实现分离

下面的图片展示了Java集合框架的接口:

b003a5aa717e6b58b2b390d869976c7.png

本文中我们来了解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接口是一个有序集合,元素会增加到容器中的特定位置。可以通过两种方式访问元素:

  1. 使用迭代器访问,使用这种方式时,必须顺序的访问元素。
  2. 使用一个整数索引来访问,这种方法可以按任意顺序访问元素,被称为随机访问。

Set(集)接口等同于Collection接口,不过其方法的行为有更严谨的定义。Set(集)的add方法不允许增加重复的元素。需要适当的定义Set(集)的equals方法:只要两个集包含的元素相同就认为它们是相等的,而不要求这些元素有同样的顺序。hashCode方法的定义要保证包含元素相同的两个集会得到相同的散列码。

Queue接口指出可以在队尾添加元素,在队头删除元素,并且可以查找队列中元素的个数。当需要收集对象并按照“先进先出”的方式获取对象时,就应该使用队列。