Java 源码阅读 - Collections (集合)

112 阅读2分钟

简介

image.png

Collections 是Java 集合框架中的根类, 所有我们熟知的 Java 集合类例如: ArrayList, HashMap 等都是他的实现类, Collections 中包含了很多集合类中通用的方法, 学习该类对于深入理解 Java 集合的方法和底层逻辑有很大的帮助

接口方法

方法名简介
size()返回集合中元素的数量
isEmpty()返回 true 如果集合中没有元素
contains()如果此集合包含指定元素,则返回 true
toArray()返回一个包含此集合中所有元素的数组
add()往集合中添加一个元素, 返回添加结果
remove()移除集合中的一个指定元素, 如果集合被更改了, 则返回 true
containsAll()如果此集合包含指定集合中的所有元素,则返回true
addAll()将指定集合中的所有元素添加到此集合中
removeAll()删除此集合中也包含在指定集合中的所有元素
removeIf()删除此集合中满足给定条件的所有元素
retainAll()仅保留此集合中包含在指定集合中的元素
clear()从该集合中删除所有元素
stream()返回一个以该集合为源的 Stream 流
parallelStream()返回一个以该集合为源的 parallelStream 并行流

大部分接口方法的具体实现都在 collection 的实现类中完成, 所以在本文中不会提及, 会放到之后具体的实现类中再做讨论

removeIf

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;
    }

这个方法是少数几个被 collection 实现的默认方法, 该方法主要是去删除集合中满足指定条件的元素, 常见的用法是:

// 创建一个动态数组
ArrayList<String> people = new ArrayList<>();

people.add("张三");
people.add("李四");
people.add("王五儿");

// 删除名称中带有 "张" 的元素
sites.removeIf(e -> e.contains("张"));;

// 删除集合中名字长度为 2 的人
sites.removeIf(p -> p.length() == 2);;

其实核心还是在于 lambda 表达式, 在上面的代码传参中, 可以分为箭头前面和后面两部分, 前面就是集合中每个元素你的命名, 可以是任何名字, 后面必须是一个可以返回 true / false 的布尔表达式, 这样该函数就会自动去移除所有满足你条件的元素了