在Java里如何使用containsAll判断集合包含关系

来源:站长查询作者:上海SEO公司头衔:草根站长
导读:本期聚焦于小伙伴创作的《在Java里如何使用containsAll判断集合包含关系》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《在Java里如何使用containsAll判断集合包含关系》有用,将其分享出去将是对创作者最好的鼓励。

在Java的集合框架中,containsAllCollection接口定义的一个常用方法,主要用来判断当前集合是否包含指定集合中的所有元素,在处理集合包含关系判断的场景中应用十分广泛。

在Java里如何使用containsAll判断集合包含关系

containsAll方法的基本定义

containsAll方法的完整定义如下,它是Collection接口的抽象方法,所有实现了Collection接口的集合类,比如ArrayListHashSetLinkedList等,都需要实现这个方法。

// Collection接口中的方法定义
public boolean containsAll(Collection<?> c);

该方法的参数是另一个集合对象,返回值是一个布尔类型:如果当前集合包含了参数集合中的所有元素,就返回true,否则返回false

containsAll的基本使用示例

下面通过一个简单的示例来展示containsAll的基本使用方式,这里使用ArrayList作为集合类型进行演示。

import java.util.ArrayList;
import java.util.List;

public class ContainsAllDemo {
    public static void main(String[] args) {
        // 创建第一个集合,包含三个元素
        List<String> list1 = new ArrayList<>();
        list1.add("Java");
        list1.add("Python");
        list1.add("C++");

        // 创建第二个集合,包含两个元素,都在list1中
        List<String> list2 = new ArrayList<>();
        list2.add("Java");
        list2.add("Python");

        // 创建第三个集合,包含一个不在list1中的元素
        List<String> list3 = new ArrayList<>();
        list3.add("Java");
        list3.add("Go");

        // 判断list1是否包含list2的所有元素
        boolean result1 = list1.containsAll(list2);
        System.out.println("list1是否包含list2的所有元素:" + result1); // 输出true

        // 判断list1是否包含list3的所有元素
        boolean result2 = list1.containsAll(list3);
        System.out.println("list1是否包含list3的所有元素:" + result2); // 输出false
    }
}

不同集合类型下的使用差异

List集合的使用

List集合是有序可重复的,containsAll判断时只关注元素是否存在,和顺序、重复次数无关。比如当前List有1个元素"a",参数List有2个"a",只要当前List存在"a"元素,就会返回true

import java.util.ArrayList;
import java.util.List;

public class ListContainsAllDemo {
    public static void main(String[] args) {
        List<Integer> listA = new ArrayList<>();
        listA.add(1);
        listA.add(2);
        listA.add(3);

        List<Integer> listB = new ArrayList<>();
        listB.add(2);
        listB.add(2); // 重复元素
        listB.add(3);

        // 即使listB有重复元素2,只要listA存在2,就返回true
        System.out.println(listA.containsAll(listB)); // 输出true
    }
}

Set集合的使用

Set集合是无序不可重复的,containsAll的判断逻辑和List一致,因为Set本身不允许重复元素,所以参数集合的重复元素不会影响判断结果。

import java.util.HashSet;
import java.util.Set;

public class SetContainsAllDemo {
    public static void main(String[] args) {
        Set<String> setA = new HashSet<>();
        setA.add("apple");
        setA.add("banana");
        setA.add("orange");

        Set<String> setB = new HashSet<>();
        setB.add("apple");
        setB.add("banana");

        System.out.println(setA.containsAll(setB)); // 输出true

        Set<String> setC = new HashSet<>();
        setC.add("apple");
        setC.add("grape");
        System.out.println(setA.containsAll(setC)); // 输出false
    }
}

使用containsAll的注意事项

  • 参数集合不能为null,如果传入null,会抛出NullPointerException,使用前需要做好非空校验。
  • 元素判断依赖equals方法,如果是自定义对象,需要重写equalshashCode方法,否则会按照对象地址判断,导致结果不符合预期。
  • 如果参数集合是空集合,无论当前集合是什么,containsAll都会返回true,因为空集合没有需要判断的元素。

下面展示自定义对象未重写equals方法时的判断问题:

import java.util.ArrayList;
import java.util.List;

class User {
    private String name;
    private int age;

    public User(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

public class CustomObjectDemo {
    public static void main(String[] args) {
        List<User> userList1 = new ArrayList<>();
        userList1.add(new User("张三", 20));

        List<User> userList2 = new ArrayList<>();
        userList2.add(new User("张三", 20));

        // 未重写equals方法,按照对象地址判断,返回false
        System.out.println(userList1.containsAll(userList2)); // 输出false
    }
}

containsAll和其他方法的区别

很多开发者容易混淆containsAllcontainsretainAll方法,下面是三者的核心区别:

方法名功能描述返回值含义
contains(Object o)判断集合是否包含单个指定元素包含返回true,否则返回false
containsAll(Collection<?> c)判断集合是否包含指定集合的所有元素全部包含返回true,否则返回false
retainAll(Collection<?> c)保留集合和指定集合的交集元素,移除其他元素如果集合发生了改变返回true,否则返回false

常见使用场景

containsAll常用于权限校验、标签匹配、数据校验等场景,比如判断用户拥有的权限是否包含某个操作需要的所有权限,或者判断文章的标签是否包含筛选条件中的所有标签。

import java.util.ArrayList;
import java.util.List;

public class PermissionDemo {
    public static void main(String[] args) {
        // 用户拥有的权限列表
        List<String> userPermissions = new ArrayList<>();
        userPermissions.add("read");
        userPermissions.add("write");
        userPermissions.add("delete");

        // 某个操作需要的权限列表
        List<String> requiredPermissions = new ArrayList<>();
        requiredPermissions.add("read");
        requiredPermissions.add("write");

        // 判断用户是否有操作权限
        if (userPermissions.containsAll(requiredPermissions)) {
            System.out.println("用户拥有该操作的所有权限,允许操作");
        } else {
            System.out.println("用户权限不足,不允许操作");
        }
    }
}

JavacontainsAll集合集合包含判断修改时间:2026-06-23 15:45:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。