说明
Collection是集合层次结构中的根接口。一个集合代表一组对象,称他们为集合的元素。一些集合允许重复元素,而另外一些则不允许。有些是有序的,有些是无序的。JDK不提供此接口的任何实现,他提供了更具体的子接口的实现,例如Set和List。此接口通常用于传递集合并在需要最大通用性的地方操作他们。
可能包含重复元素的无序集合应该直接实现这个接口。
所有通用(Collection)实现类(通常通过其子接口之一间接实现Collection)应该提供两个标准构造函数:一个void(无参数)构造函数,他创建了空集合和一个带有Collection类型参数的构造函数,他创建了一个与它的参数具有相同元素的新集合。实际上,后一个构造函数允许用户复制任何集合,生成所需要实现类型的等效集合。没有办法强制执行此约定(因为接口不能包含构造函数),但java平台库中所有通用collection实现都符合。
此接口中包含的“破坏性”方法,即修改它们操作的集合的方法,如果此集合不支持该操作,则指定抛出UnsupportedOperationException。在这种情况下,如果调用对集合没有影响,则这些方法可能(但不是必需)抛出UnsupportedOperationException。例如,如果要添加的集合为空,则在不可修改的集合上调用 addAll(Collection 方法可能(但不是必须)抛出异常。
有些集合实现对它们可能包含的元素有限制。例如,有些实现禁止空元素,有些实现对其元素的类型有限制。尝试添加不合格的元素会引发未经检查的异常,通常是 NullPointerException 或 ClassCastException。尝试查询不合格元素的存在可能会引发异常,或者可能只是返回 false;一些实现会表现出前一种行为,而另一些会表现出后者。更一般地,尝试对不合格元素执行操作,其完成不会导致将不合格元素插入到集合中,这可能会引发异常,或者可能会成功,具体取决于实现的选择。
由每个集合决定自己的同步策略。在没有更强大的实现保证的情况下,未定义的行为可能是由于在另一个线程正在改变的集合上调用任何方法;这包括直接调用、将集合传递给可能执行调用的方法以及使用现有迭代器检查集合。 Collections Framework 接口中的许多方法都是根据 Objectequals(Object) equals方法定义的。例如, contains(Object o)方法的规范说:“返回 true当且仅当此集合包含至少一个元素e这样 (onull ? enull : o.equals(e))。
源码解析说明
int size(); //返回集合中元素的数量
boolean isEmpty(); //判断集合是否为空,true表示没有元素,false表示不为空。
boolean contains(Object o);//如果集合中包含元素o,则返回true。
Iterator<E> iterator();//返回此集合中元素的迭代器。没有关于元素返回顺序的保证(除非此集合是提供保证的某个类的实例
Object[] toArray();//返回一个包含此集合中所有元素的数组。如果此集合对其迭代器返回其元素的顺序做出任何保证,则此方法必须以相同的顺序返回元素。返回的数组将是“安全的”,因为此集合不维护对它的引用。 (换句话说,即使此集合由数组支持,此方法也必须分配一个新数组)。因此调用者可以自由地修改返回的数组。此方法充当基于数组和基于集合的 API 之间的桥梁。
<T> T[] toArray(T[] a);//返回一个包含此集合中所有元素的数组;返回数组的运行时类型是指定数组的类型。如果集合适合指定的数组,则在其中返回。否则,将使用指定数组的运行时类型和此集合的大小分配一个新数组。
boolean add(E e);//确保此集合包含指定的元素(可选操作)。如果此集合因调用而更改,则返回 true。 (如果此集合不允许重复且已包含指定元素,则返回false。) 支持此操作的集合可能会限制可以添加到此集合中的元素。特别是,一些集合会拒绝添加 null 元素,而其他集合会对可能添加的元素类型施加限制。集合类应该在他们的文档中明确指定对可以添加哪些元素的任何限制。如果集合由于任何原因拒绝添加特定元素,除了它已经包含该元素,它必须抛出异常(而不是返回false)。这保留了在此调用返回后集合始终包含指定元素的不变性。
boolean remove(Object o);//从此集合中移除指定元素的单个实例(如果存在)(可选操作)
boolean containsAll(Collection<?> c);//如果此集合包含指定集合中的所有元素,则返回 true。
boolean addAll(Collection<? extends E> c);//将指定集合中的所有元素添加到此集合(可选操作)。如果在操作进行时修改了指定的集合,则此操作的行为未定义。 (这意味着如果指定的集合是这个集合,并且这个集合是非空的,那么这个调用的行为是未定义的。)
boolean removeAll(Collection<?> c);//删除也包含在指定集合中的所有此集合的元素(可选操作)。此调用返回后,此集合将不包含与指定集合相同的元素。
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;
}
boolean retainAll(Collection<?> c);//仅保留此集合中包含在指定集合中的元素(可选操作)。换句话说,从该集合中移除所有未包含在指定集合中的元素。
void clear();//从此集合中删除所有元素(可选操作)。此方法返回后,集合将为空。
boolean equals(Object o);//比较指定对象与此集合是否相等
int hashCode();//返回此集合的哈希码值。
@Override
/*
*/
default Spliterator<E> spliterator() {
return Spliterators.spliterator(this, 0);
}
default Stream<E> stream() {
return StreamSupport.stream(spliterator(), false);
}
default Stream<E> parallelStream() {
return StreamSupport.stream(spliterator(), true);
}
}
简单使用
/*
对于Collection的使用,添加add()与遍历和迭代器使用。
*/
public class Main {
public static void main(String[] args){
Collection<Student> collection = new ArrayList<>();
Student s1 = new Student("z",12);
Student s2 = new Student("c",14);
Student s3 = new Student("f",10);
collection.add(s1);
collection.add(s2);
collection.add(s3);
System.out.println(collection.size());
//遍历
for (Object object: collection) {
Student s = (Student) object;
System.out.println(s);
}
//迭代器遍历
Iterator it = collection.iterator();
while( it.hasNext()){
Student s = (Student) it.next();
System.out.println(s);
}
}
}
class Student{
private String name;
private int age;
Student(String name,int age){
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}