Collection 是Java数据结构接口最重要的接口之一。我们常用的数据结构 List, Set 和 Queue 都是继承自这个接口的。以下内容均参考 openjdk11 的源码
1 Collection 接口的关系图.
Collection继承自顶级接口 Iterable。 其下主要有三员大将 Set List 和 Queue.
2 接口详解
2.1 Iterable
实现Iterable接口的类,其对象就可以作为 for-each 循环的作用目标。
首先我们随便写一个类, 使用这个类实现 Iterable 接口
import java.util.Iterator;
public class Person implements Iterable<Object> {
private String name;
private String address;
private Integer age;
public Person(String name, String address, Integer age) {
this.name = name;
this.address = address;
this.age = age;
}
@Override
public Iterator<Object> iterator() {
return new Iterator<Object>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < 3;
}
@Override
public Object next() {
Object obj = null;
if (index == 0) obj = name;
if (index == 1) obj = address;
if (index == 2) obj = age;
index ++;
return obj;
}
};
}
然后把这个类作为for-each循环的作用对象
Person person = new Person("小明", "中国台湾", 25);
for (Object object: person) {
System.out.println(object);
}
// 以上代码跟直接调用 Iterable 接口的默认方法 forEach(Consumer<Object>)效果是一样的
// Consumer 是函数式接口 有空细说, 只有accept()一个抽象方法
person.forEach(System.out::println);
输出
你甚至可以对Iterable做毫无意义的实现,修改iterator()方法, 再运行上面的代码就会打印1-100了
@Override
public Iterator<Object> iterator() {
return new Iterator<Object>() {
private int index = 0;
@Override
public boolean hasNext() {
return index < 100;
}
@Override
public Object next() {
Object obj = index;
index ++;
return obj;
}
};
}
2.2 Collection
- int size() 返回容器内包含的元素总数,若总数比Integer.MAX_VALUE最大值还大,则返回 Integer.MAX_VALUE
- boolean isEmpty() 容器内没有元素,返回true,否则返回false
- boolean contains(Object o) 容器中包含该元素返回true, 否则返回false
- Object[] toArray() 返回一个包含容器中所有元素的数组,元素的数组应该与迭代器有相同的顺序,并且应该返回一个安全的数组,即不能有相同的引用(因为一旦用了引用,修改数组元素相当于修改容器内的元素)
- T[] toArray(T[] a) 返回一个包含容器中所有元素的数组,必须是安全的。当输入的数组长度大于容器的size时,使用null填充,当输入的数组小于容器size时,重新构建一个长度为size的数组。
- boolean add(E e) 向容器中添加一个元素,添加成功则返回true,否则返回false
- boolean remove(Object o) 移除元素 o, 移除成功返回ture,否则返回false
- boolean addAll(Collection< ? extends E> c) 将容器c中的所有元素添加到容器中,如果 容器因此发生改变,返回true
- removeAll(Collection<?> c) 移除容器中所有包含在容器c中元素,如果容器因此发生改变,返回true
- retainAll(Collection<?> c) 只保留容器c中存在的元素,相当于并集
- void clear() 移除容器内所有元素
2.3 List
2.3.1 List的特征
- 有序
- 可重复
- 可按位置索引
- 可在指定位置插入新元素
2.3.2 List的接口
继承自Collection的接口就不说了
- boolean addAll(int index, Collection<? extends E> c) 将容器c中的所有元素从指定位置插入,位于index及其后面的元素通通后移
- void sort(Comparator<? super E> c) 对容器内的元素进行排序
- E get(int index) 返回指定位置的元素
- E set(int index, E element) 将指定位置的元素替换并返回该元素
- void add(int index, E element) 在指定位置插入元素,并将原来的元素及其后面的兄弟全部后移
- E remove(int index) 移除并返回指定位置的元素,将后面的元素前移
- int indexOf(Object o) 返回匹配o的第一个元素的位置,如果没有匹配的元素,返回 -1
- int lastIndexOf(Object o) 返回匹配o的最后一个元素的位置,如果没有匹配的元素,返回 -1
- List
subList(int fromIndex, int toIndex) 返回List的一个子集
2.4 Set
- 无序
- 不可重复
- 最多只能有一个null值
- 不可按位置索引
- 没有新增的接口,全部继承自 Collection
2.5 Queue
Queue 被定义为一组待处理的元素, 并且定义了元素被处理的优先级。
常见的规则:
- FIFO 先进先出
- LILO 后进先出
接口
boolean offer(E e) 添加一个元素
E remove() 移除并返回head元素, 如果queue为空,抛出 NoSuchElementException 异常
E poll() 移除并返回head元素, 如果queue为空,返回null
E element() 返回head元素但不移除,如果queue为空,抛出 NoSuchElementException 异常
E peek() 返回head元素但不移除,如果queue为空,返回null
3 总结
- 由于Collection继承自Iterable,所有继承自Collection的接口都可以使用for-each循环
- List 有序可重复, Set无序去重
- Queue持有访问顺序规则