剖析JDK源码-Collection-(1)
一、简述
集合层次结构中的根界面。 集合表示一组被称为其元素的对象。 一些集合允许重复元素,而其他集合不允许。 有些被命令和其他无序。 JDK不提供此接口的任何直接实现:它提供了更具体的子接口的实现,如Set和List 。 该界面通常用于传递集合,并在需要最大的通用性的情况下对其进行操作。
包或多重集 (可能包含重复元素的无序集合)应直接实现此接口。
所有通用的Collection实现类(通常通过其子接口间接实现Collection )应该提供两个“标准”构造函数:一个void(无参数)构造函数,它创建一个空集合,以及一个具有单个参数类型的构造函数Collection ,它创建一个与其参数相同的元素的新集合。 实际上,后一个构造函数允许用户复制任何集合,生成所需实现类型的等效集合。 没有办法强制执行这个约定(因为接口不能包含构造函数),而是Java平台库中的所有通用的Collection实现。
如果此集合不支持该操作,则此接口中包含的“破坏性”方法(即修改其操作的集合的方法)将被指定为抛出UnsupportedOperationException 。 如果是这种情况,如果调用对集合没有影响,这些方法可能会但不是必须抛出一个UnsupportedOperationException 。 例如,如果要添加的集合为空,则可以在不可修改的集合上调用addAll(Collection)方法,但不是必须抛出异常。
Some collection implementations have restrictions on the elements that they may contain.例如,一些实现禁止空元素,一些实现方式对其元素的类型有限制。 尝试添加不合格元素会引发未经检查的异常,通常为NullPointerException或ClassCastException 。 尝试查询不合格元素的存在可能会引发异常,或者可能只是返回false; 一些实现将展现出前者的行为,一些实现将展现出后者。 更一般来说,尝试对不符合条件的元素进行操作时,其完成不会导致将不合格元素插入到集合中,可能会导致异常,或者可能会成功执行该选项。 此异常在此接口的规范中标记为“可选”。
每个集合决定自己的同步策略。 在没有实现的更强保证的情况下,未定义的行为可能是由于对由另一个线程进行突变的集合的任何方法的调用而导致的; 这包括直接调用,将集合传递给可能执行调用的方法,并使用现有的迭代器来检查集合。
Collections Framework接口中的许多方法都是按照equals方法进行定义的。 例如,对于在本说明书contains(Object o)方法表示:“返回true当且仅当这个集合包含至少一个元素e使得(onull ? enull : o.equals(e)) ”。 该规范不应该被解释为意味着调用Collection.contains与非空参数o会导致o.equals(e)被调用任何元素e 。 实现可以自由地实现优化,从而避免equals调用,例如,首先比较两个元素的哈希码。 ( Object.hashCode()规范保证具有不等的哈希码的两个对象不能相等。)更一般地说,各种Collections框架接口的实现可以随意利用底层的Object方法的指定行为,无论执行者认为是合适的。
执行递归遍历集合的一些集合操作可能会失败,而自引用实例的异常会导致集合直接或间接包含其自身。 这包括clone() , equals() , hashCode()和toString()方法。 实现可以可选地处理自引用场景,然而大多数当前实现不这样做。
Collection的子类以及实现类
二、接口类的声明
public interface Collection<E> extends Iterable<E> {
}
- interface 接口类;
- Collection 泛型接口;
- extends Iterable 继承迭代器接口;
三、方法声明
1、int size(); 返回此集合中的元素数。
int size();
2、boolean isEmpty(); 判断此集合是否存在元素,如果此集合不包含元素,则返回 true 。
boolean isEmpty();
3、 boolean contains(Object o);判断此集合是否包含指定元素,如果此集合包含指定的元素,则返回 true 。
boolean contains(Object o);
4、Iterator iterator(); 重写Iterable的方法,返回此集合中元素的迭代器。
Iterator<E> iterator();
5、Object[] toArray();返回一个包含此集合中所有元素的数组。
Object[] toArray();
6、 T[] toArray(T[] a); 返回一个包含此集合中所有元素的数组; 返回的数组的运行时类型是指定数组的运行时类型。
<T> T[] toArray(T[] a);
7、boolean add(E e); 确保此集合包含指定的元素
boolean add(E e);
8、boolean remove(Object o); 从该集合中删除指定元素的单个实例(如果该元素存在的话)
boolean remove(Object o);
9、boolean containsAll(Collection<?> c); 如果此集合包含指定集合中的所有元素,则返回 true 。
boolean containsAll(Collection<?> c);
10、boolean addAll(Collection<? extends E> c); 将指定集合中的所有元素添加到此集合。
boolean addAll(Collection<? extends E> c);
11、boolean removeAll(Collection<?> c);删除指定集合中包含的所有此集合的元素。
boolean removeAll(Collection<?> c);
12、boolean retainAll(Collection<?> c); 仅保留此集合中包含在指定集合中的元素。
boolean retainAll(Collection<?> c);
13、void clear(); 从此集合中删除所有元素,清空此集合。
void clear();
14、boolean equals(Object o); 将指定的对象与此集合进行比较以获得相等性。
boolean equals(Object o);
15、int hashCode(); 返回此集合的哈希码值。
int hashCode();
四、内部方法
1、返回一个包含此集合中的所有元素的数组,使用提供的生成器函数分配返回的数组。子类需重写此方法。
default <T> T[] toArray(IntFunction<T[]> generator) {
return toArray(generator.apply(0));
}
2、删除此集合中满足给定谓词的所有元素。迭代期间或由谓词引发的错误或运行时异常将中继给调用者。子类需重写此方法。
default boolean removeIf(Predicate<? super E> filter) {
Objects.requireNonNull(filter);
boolean removed = false;
final Iterator<E> each = iterator();
while (each.hasNext()) {
if (filter.test(each.next())) {
each.remove();
removed = true;
}
}
return removed;
}
3、在此集合中的元素上创建Spliterator。实现应该记录由分裂器报告的特征值。如果分裂器报告了spliterator,则不需要报告这些特征值。该集合不包含任何元素。该方法是重写了Iterable中的方法。子类需重写此方法。
@Override
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
4、以此集合作为源返回一个连续的Stream。子类需重写此方法。
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
5、以此集合作为源返回一个可能的并行流。允许此方法返回一个顺序流。子类需重写此方法。
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}