JDK源码阅读-Collection接口

本文深入解析了Java中Collection接口的功能和作用,包括其继承关系、常用方法及其应用场景,如size(), isEmpty(), contains(), add(), remove(), 和removeIf()等。同时,文章详细解释了toArray()方法的两种形式以及它们之间的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

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方法,返回数组的运行时类型是指定数组的运行时类型。且如果:

  1. 指定的数组大小等于该集合大小,则用集合填充该数组,并返回该数组;
  2. 指定的数组大小小于该集合大小,则返回一个具有和此集合大小相同的新数组;
  3. 指定的数组大小大于该集合大小,则返回的数组中紧接着集合尾部的那个元素会被设置为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。 ) 存在五种异常的情况:

  1. UnsupportedOperationException - 如果此 集合不支持add操作
  2. ClassCastException - 如果指定元素的类阻止将其添加到此集合
  3. NullPointerException - 如果指定的元素为空,并且该集合不允许空元素
  4. IllegalArgumentException - 如果元素的某些属性阻止其添加到此集合
  5. 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;
    }
复制代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值