List.contains方法——判断列表中是否包含指定元素

本文详细介绍了 Java 中 List 接口的 contains 方法,该方法用于判断列表中是否包含指定元素。通过示例代码展示了如何使用 ArrayList 实现此功能并验证元素的存在性。
1.2.4 List.contains方法——判断列表中是否包含指定元素
2013-09-05 09:01:09      我来说两句 
收藏     我要投稿  

本文所属图书 > Java Web程序开发参考手册

本书是一本Java Web综合查询参考手册,介绍了Java Web程序开发中应用的各种常用类及其方法,还包含各种流行框架。本书分为三篇,共14章,第一篇为基础技术篇,主要包括Java语言基础和Ajax必备技术等内容;第二...   立即去当当网订购

contains方法用于判断列表中是否包含指定元素。如果列表中包含指定元素,则返回true,否则返回false。

语法  contains(Object o)

o:要判断是否存在于列表中的元素。

示例  本示例使用List接口的实现类ArrayList初始化一个列表对象list,并调用contains方法判断列表中是否包含“苹果”字符串。
public static void main(String[] args) {
  List<String> list = new ArrayList<String>();
  list.add("草莓");         //向列表中添加数据
  list.add("香蕉");        //向列表中添加数据
  list.add("菠萝");        //向列表中添加数据
  for (int i = 0; i < list.size(); i++) {    //通过循环输出列表中的内容
  System.out.println(i + ":" + list.get(i));
  }
  String o = "苹果";
System.out.println("list对象中是否包含元素" + o + ":" + list.contains(o));
//判断字符串中是否包含指定字符串对象
}

运行结果如图1.15所示。


在 Java 中,`Collection.containsAll(Collection<?> c)` 方法用于判断当前集合是否 **包含另一个集合中的所有元素**。它是 `Collection` 接口定义的一个标准方法,因此被 `List`、`Set`、`Queue` 等实现类所支持。 --- ### ✅ 方法签名 ```java boolean containsAll(Collection<?> c) ``` - **参数**:`c` —— 要检查是否全部被包含的集合。 - **返回值**: - `true`:如果当前集合包含 `c` 中的每一个元素。 - `false`:否则。 - **异常**: - `NullPointerException`:如果传入的集合为 `null`。 --- ### ✅ 示例代码 ```java import java.util.*; public class ContainsAllExample { public static void main(String[] args) { List<String> list1 = new ArrayList<>(Arrays.asList("A", "B", "C", "D")); List<String> list2 = Arrays.asList("B", "C"); List<String> list3 = Arrays.asList("B", "E"); System.out.println(list1.containsAll(list2)); // true → list1 包含 B 和 C System.out.println(list1.containsAll(list3)); // false → list1 不包含 E Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3, 4)); Set<Integer> set2 = new HashSet<>(Arrays.asList(2, 3)); System.out.println(set1.containsAll(set2)); // true } } ``` 输出: ``` true false true ``` --- ### 🔍 底层原理与源码解析(以 `ArrayList` 为例) 我们来看 `ArrayList.containsAll()` 的实现逻辑(基于 OpenJDK 源码): ```java public boolean containsAll(Collection<?> c) { for (Object e : c) if (!contains(e)) return false; return true; } ``` #### 分步解释: 1. 遍历传入的集合 `c` 中的每一个元素 `e`。 2. 对每个元素调用 `this.contains(e)`: - `contains(e)` 内部会使用 `equals()` 方法逐个比较当前集合中的元素。 3. 如果有任何一个元素 `e` 在当前集合中找不到(即 `contains(e) == false`),立即返回 `false`。 4. 所有元素都找到,则返回 `true`。 > ⚠️ 注意:`contains` 使用的是 `equals()` 判断,不是 `==`,所以自定义对象需要重写 `equals()` 和 `hashCode()` 方法! --- ### 🧩 自定义对象示例 ```java class Person { private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (!(o instanceof Person)) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, age); } @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } } ``` 测试: ```java List<Person> persons1 = new ArrayList<>(); persons1.add(new Person("Alice", 25)); persons1.add(new Person("Bob", 30)); List<Person> persons2 = Arrays.asList(new Person("Alice", 25)); System.out.println(persons1.containsAll(persons2)); // true(因为重写了 equals) ``` 如果不重写 `equals()`,即使内容相同也会返回 `false`! --- ### ⚠️ 注意事项 | 项目 | 说明 | |------|------| | **null 元素** | 允许 `null`,只要两边都有或能匹配即可。但传入集合不能为 `null`(会抛 NPE)。 | | **重复元素** | 对于 `List`,考虑重复;对于 `Set`,自动去重。例如:<br>`[A, B]` 是否包含 `[A, A]`?<br>→ `List` 返回 `false`(除非原集合有两个 A)<br>→ `Set` 返回 `true`(只关心是否存在) | | **性能** | 时间复杂度为 O(n × m),其中 n 是目标集合大小,m 是参数集合大小。对大集合慎用。 | | **空集合** | `collection.containsAll(Collections.emptyList())` 永远返回 `true`(空集合是任何集合的子集)。 | --- ### ✅ 实际应用场景 1. **权限校验**:用户拥有的角色是否包含访问某资源所需的所有角色。 2. **数据完整性检查**:接收到的数据字段是否包含了必需的字段。 3. **集合包含关系判断**:比如标签系统中,文章是否包含所有指定标签。 ```java Set<String> userRoles = getUserRoles(userId); Set<String> requiredRoles = getRequiredRoles(resource); if (userRoles.containsAll(requiredRoles)) { System.out.println("有权访问"); } else { System.out.println("权限不足"); } ``` ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值