概述
Collection
接口作为集合类的父类接口,继承于Iterable
。其位于java.util包下,定义了很多常用的集合类操作方法。因为对于不同的集合,如Set
不能重复而List
又允许,且存在有序又存在无序的集合,众口难调,所有Collection
作为接口只是提供了方法的约定,而没有提供任何具体的实现。且该接口没有任何成员变量。
其接口定义如下:
public interface Collection<E> extends Iterator<E> {
...
}
复制代码
方法
size():int
返回集合中的元素个数。
isEmpty():boolean
集合是否为空。
contains(Object):boolean
集合是否包含指定元素。
iterator():iterator
返回集合的迭代器
toArray():Object[] 和 toArray(T[]):T[]
Collection有两个重载的toArray方法,两个方法的相同点都是返回集合中元素组成的数组,且这个数组不保留对原始元素的引用,即这个数组的空间是重新分配的,因此返回的数组是可修改的。
不同的是,无参的toArray方法一般不直接用,因为即使采用类型强转也会出现编译错误:
List<Integer> numList = Arrays.asList(1, 2, 3);
// 错误:Inconvertible types; cannot cast 'java.lang.Object[]' to 'java.lang.Integer'
Integer[] nums = (Integer) numList.toArray();
复制代码
而有入参的toArray方法,返回数组的运行时类型是指定数组的运行时类型。且如果:
- 指定的数组大小等于该集合大小,则用集合填充该数组,并返回该数组;
- 指定的数组大小小于该集合大小,则返回一个具有和此集合大小相同的新数组;
- 指定的数组大小大于该集合大小,则返回的数组中紧接着集合尾部的那个元素会被设置为null。
public static void main(String[] args) {
List<Integer> list = new ArrayList<>(); // 只有两个元素
list.add(-1);
list.add(-2);
Integer[] oldArrays = new Integer[5]; // 入参数组大小为5,超过list大小
for (int i = 0; i < oldArrays.length; i++){
oldArrays[i] = i + 1; // 1,2,3,4,5
}
Integer[] newArrays = list.toArray(oldArrays);
// 判断入参的数组和返回的数组是同一个引用
System.out.println("oldArrays == oldArrays:"
+ (oldArrays == newArrays) + "\n");
for (Integer num: newArrays) {
System.out.println(num);
}
}
---------------output---------------
oldArrays == oldArrays:true // 入参和返回的数组是同一个
-1 // 更新为list中的元素
-2
null // 紧接着集合尾部的那个元素会被设置为null
4 // 保留原数组中的值
5
复制代码
add(E):boolean
集合添加元素,如果此集合由于调用而更改,则返回true。(如果此集合不允许重复,并且已包含指定的元素,则返回false。 ) 存在五种异常的情况:
UnsupportedOperationException
- 如果此 集合不支持add操作ClassCastException
- 如果指定元素的类阻止将其添加到此集合NullPointerException
- 如果指定的元素为空,并且该集合不允许空元素IllegalArgumentException
- 如果元素的某些属性阻止其添加到此集合IllegalStateException
- 如果由于插入限制,此时无法添加该元素
remove(Object):boolean
从集合中删除元素(如果存在),反回集合是否被更新。
containsAll(Collection<?>): boolean
如果此集合包含指定集合中的所有元素,则返回true。
addAll(Collection<? extends E>):boolean
将指定集合中的所有元素添加到此集合(可选操作),反回集合是否被更新。
removeAll(Collection<?>):boolean
删除指定集合中包含的所有此集合的元素(可选操作),反回集合是否被更新。
retainAll(Collection<?>):boolean
仅保留此集合中包含在指定集合中的元素(可选操作)。换句话说,从该集合中删除所有不包含在指定集合中的元素,返回集合是否被更新。
因此能够调用该方法的集合必须是可以实现元素的删除的,如使用Arrays.asList()
方法得到的List就不能够调用retainAll
方法,否则会抛出UnsupportedOperationException
异常。
List<Integer> nums1 = Arrays.asList(1, 2, 3);
List<Integer> nums2 = new ArrayList<>();
nums2.add(2);
nums1.retainAll(nums2);
System.out.println(Arrays.toString(nums1.toArray()));
-------------output---------
Exception in thread "main" java.lang.UnsupportedOperationException
复制代码
clear():void
从此集合中删除所有元素(可选操作)。此方法返回后,集合将为空,但不是null。
List<Integer> list = new ArrayList<>();
list.add(-1);
list.add(-2);
list.clear();
System.out.println(list == null);
System.out.println(list.isEmpty());
-----------output--------
false
true
复制代码
removeIf(Predicate<? super E>):boolean
removeIf
方法是JDK8引入的,用于删除满足条件的元素,返回集合中是否存在元素被删除。
默认实现使用其iterator()遍历集合的所有元素。 使用Iterator.remove()
删除每个匹配元素。 如果集合的迭代器不支持删除,那么UnsupportedOperationException
将在匹配第一个元素时被抛出。源码如下:
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;
}
复制代码