Java retainAll() 详解

news2024/11/23 4:05:59

在 Java 中,retainAll()Collection 接口(ListSet 等集合类实现该接口)的一种方法,用于保留集合中与指定集合交集的元素,删除其他所有元素。

以下是对 retainAll() 方法的详细讲解。


1. 方法定义

方法签名

boolean retainAll(Collection<?> c)

参数

  • c:一个集合,用于指定要保留的元素。

返回值

  • 返回一个 boolean 值:
    • true:如果集合内容因调用此方法而改变。
    • false:如果集合内容没有改变(即调用此方法前后集合中的元素相同)。

2. 功能描述

  • retainAll() 方法会将调用该方法的集合(假设为 A)中的所有元素与参数集合(假设为 B)进行比较,保留两者交集的元素。
  • 如果 A 中的元素不在 B 中,它们会被移除。
  • 参数集合 B 不会被修改。

3. 使用示例

基本用法

import java.util.ArrayList;
import java.util.Arrays;

public class RetainAllExample {
    public static void main(String[] args) {
        ArrayList<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
        ArrayList<Integer> list2 = new ArrayList<>(Arrays.asList(3, 4, 5, 6, 7));

        // 保留 list1 和 list2 的交集
        list1.retainAll(list2);

        System.out.println(list1); // 输出:[3, 4, 5]
    }
}

返回值示例

import java.util.ArrayList;
import java.util.Arrays;

public class RetainAllExample {
    public static void main(String[] args) {
        ArrayList<String> list1 = new ArrayList<>(Arrays.asList("A", "B", "C"));
        ArrayList<String> list2 = new ArrayList<>(Arrays.asList("B", "C"));

        boolean isModified = list1.retainAll(list2);

        System.out.println(isModified); // 输出:true,因为 list1 发生了改变
        System.out.println(list1); // 输出:[B, C]
    }
}

4. 常见场景

场景 1:找出两个集合的交集

使用 retainAll() 可以快速找到两个集合的交集:

Set<Integer> set1 = new HashSet<>(Arrays.asList(1, 2, 3, 4));
Set<Integer> set2 = new HashSet<>(Arrays.asList(3, 4, 5, 6));

set1.retainAll(set2);

System.out.println(set1); // 输出:[3, 4]

场景 2:从集合中删除不需要的元素

通过与一个已知集合比较,保留需要的元素,其余元素被删除:

List<String> fruits = new ArrayList<>(Arrays.asList("Apple", "Banana", "Mango", "Orange"));
List<String> preferredFruits = Arrays.asList("Apple", "Orange");

fruits.retainAll(preferredFruits);

System.out.println(fruits); // 输出:[Apple, Orange]

5. 注意事项和常见问题

注意事项

  1. 不支持 null 集合

    • 如果参数集合为 null,调用 retainAll() 会抛出 NullPointerException
      List<Integer> list = new ArrayList<>(Arrays.asList(1, 2, 3));
      list.retainAll(null); // 抛出 NullPointerException
      
  2. 原集合会被修改

    • 调用此方法后,原集合的内容会被更改,仅保留交集元素。
  3. 参数集合不可修改

    • retainAll() 不会修改参数集合。

常见问题

  • 空交集
    如果两个集合没有交集,则调用 retainAll() 后,原集合会变为空。

    List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3));
    List<Integer> list2 = new ArrayList<>(Arrays.asList(4, 5, 6));
    
    list1.retainAll(list2);
    
    System.out.println(list1); // 输出:[]
    
  • 顺序保留
    如果使用 List(如 ArrayList),retainAll() 保留交集时,元素的顺序按照原集合的顺序。

    List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
    List<Integer> list2 = new ArrayList<>(Arrays.asList(4, 3));
    
    list1.retainAll(list2);
    
    System.out.println(list1); // 输出:[3, 4]
    

6. 内部原理

执行流程

  1. 遍历调用 retainAll() 的集合(如 list1)。
  2. 对于每个元素,检查它是否存在于参数集合中(如 list2)。
  3. 如果不存在,移除该元素。
  4. 返回 true,如果至少有一个元素被移除;否则返回 false

效率

  • 取决于参数集合的类型:
    • 如果参数集合是一个 HashSetretainAll() 的性能较好,因为 HashSet 提供了快速的查找操作(O(1))。
    • 如果参数集合是一个 List,性能可能会较低,因为查找操作需要线性时间(O(n))。

7. 与其他方法的区别

removeAll()

  • 区别removeAll() 是删除当前集合中与指定集合交集的元素,而 retainAll() 是保留交集元素。
  • 示例
    List<Integer> list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
    List<Integer> list2 = new ArrayList<>(Arrays.asList(3, 4, 5));
    
    // removeAll 删除交集
    list1.removeAll(list2);
    System.out.println(list1); // 输出:[1, 2]
    
    // retainAll 保留交集
    list1 = new ArrayList<>(Arrays.asList(1, 2, 3, 4));
    list1.retainAll(list2);
    System.out.println(list1); // 输出:[3, 4]
    

8. 总结

方法描述
作用保留集合中与指定集合交集的元素,其余元素被删除
修改原集合
参数不可为空如果参数集合为空会抛出 NullPointerException
返回值如果集合发生变化返回 true,否则返回 false
常见用途找交集、过滤集合中的元素

retainAll() 是操作集合的一个常用方法,能够帮助开发者快速进行集合间的交集操作。在使用时,需要注意原集合会被修改,因此在某些场景下可能需要备份原集合数据以避免数据丢失。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2245716.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

RocketMQ学习记录

服务器操作系统版本&#xff1a;Ubuntu 24.04 Java版本&#xff1a;21 Spring Boot版本&#xff1a;3.3.5 如果打算用GUI&#xff0c;虚拟机安装Ubuntu 24.04&#xff0c;见虚拟机安装Ubuntu 24.04及其常用软件(2024.7)_ubuntu24.04-CSDN博客https://blog.csdn.net/weixin_4…

网络安全之接入控制

身份鉴别 ​ 定义:验证主题真实身份与其所声称的身份是否符合的过程&#xff0c;主体可以是用户、进程、主机。同时也可实现防重放&#xff0c;防假冒。 ​ 分类:单向鉴别、双向鉴别、三向鉴别。 ​ 主题身份标识信息:密钥、用户名和口令、证书和私钥 Internet接入控制过程 …

Spring 框架七大模块(Java EE 学习笔记03)

​ ​核心容器模块&#xff08;Core Container&#xff09; 核心容器模块在Spring的功能体系中起着支撑性作用&#xff0c;是其他模块的基石。核心容器层主要由Beans模块、Core模块、Contex模块和SpEL模块组成。 &#xff08;1&#xff09;Beans模块。它提供了BeanFactory类&…

IPv6基础知识

IPv6是由IEIF提出的互聯網協議第六版&#xff0c;用來替代IPv4的下一代協議&#xff0c;它的提出不僅解決了網絡地址資源匱乏問題&#xff0c;也解決了多種接入設備接入互聯網的障礙。IPv6的地址長度為128位&#xff0c;可支持340多萬億個地址。如下圖&#xff0c;3ffe:1900:fe…

旷世yolox自定义数据训练和验证和onnx导出推理

目录 1.前言 2.代码 3.环境 4.自定义数据形态 5.配置文件 6.训练 7.验证 8.评估混淆矩阵 9.导出onnx 10.onnx推理 -- 补充&#xff1a;docker环境 1.前言 旷世科技的yolox比较清爽&#xff0c;效果也不错&#xff0c;简单总结主要有三点创新比较高&#xff1a;deco…

Electron开发构建工具electron-vite(alex8088)添加VueDevTools(VitePlugin)

零、介绍 本文章的electron-vite指的是这个项目&#x1f449;electron-vite仓库&#xff0c;electron-vite网站 本文章的VueDevTools指的是VueDevTools的Vite插件版&#x1f449;https://devtools.vuejs.org/guide/vite-plugin 一、有一个用electron-vite创建的项目 略 二、…

软件测试—— Selenium 常用函数(一)

前一篇文章&#xff1a;软件测试 —— 自动化基础-CSDN博客 目录 前言 一、窗口 1.屏幕截图 2.切换窗口 3.窗口设置大小 4.关闭窗口 二、等待 1.等待意义 2.强制等待 3.隐式等待 4.显式等待 总结 前言 在前一篇文章中&#xff0c;我们介绍了自动化的一些基础知识&a…

UE5 腿部IK 解决方案 footplacement

UE5系列文章目录 文章目录 UE5系列文章目录前言一、FootPlacement 是什么&#xff1f;二、具体实现 前言 在Unreal Engine 5 (UE5) 中&#xff0c;腿部IK&#xff08;Inverse Kinematics&#xff0c;逆向运动学&#xff09;是一个重要的动画技术&#xff0c;用于实现角色脚部准…

私有化部署视频平台EasyCVR宇视设备视频平台如何构建视频联网平台及升级视频转码业务?

在当今数字化、网络化的时代背景下&#xff0c;视频监控技术已广泛应用于各行各业&#xff0c;成为保障安全、提升效率的重要工具。然而&#xff0c;面对复杂多变的监控需求和跨区域、网络化的管理挑战&#xff0c;传统的视频监控解决方案往往显得力不从心。 EasyCVR视频融合云…

山东春季高考-C语言-综合应用题

&#xff08;2018年&#xff09;3.按要求编写以下C语言程序&#xff1a; &#xff08;1&#xff09;从键盘上输入三个整数a、b、c&#xff0c;判断能否以这三个数为边构成三角形&#xff0c;若可以则计算机三角形的面积且保留两位小数&#xff1b;若不可以则输出“不能构成三角…

Linux移植IMX6ULL记录 一:编译源码并支持能顺利进入linux

目录 前言 一、不修改文件进行编译 二、修改设备树文件进行编译 前言 我用的开发板是100_ask_imx6ull_pro&#xff0c;其自带的linux内核版本linux-4.9.88&#xff0c;然后从linux官网下载过来的linux-4.9.88版本的arch/arm/configs/defconfig和dts设备树文件并没有对imx6ull…

从Stream的 toList() 和 collect(Collectors.toList()) 方法看Java的不可变流

环境 JDK 21Windows 11 专业版IntelliJ IDEA 2024.1.6 背景 在使用Java的Stream的时候&#xff0c;常常会把流收集为List。 假设有List list1 如下&#xff1a; var list1 List.of("aaa", "bbbbbb", "cccc", "d", "eeeee&qu…

大语言模型---LoRA简介;LoRA的优势;LoRA训练步骤;总结

文章目录 1. 介绍2. LoRA的优势3. LoRA训练步骤&#xff1a;4.总结 1. 介绍 LoRA&#xff08;Low-Rank Adaptation&#xff09;是一种用于高效微调大模型的技术&#xff0c;它通过在已有模型的基础上引入低秩矩阵来减少训练模型时所需的参数量和计算量。具体来说&#xff0c;L…

Debug-031-近期功能实现小结

由于时间原因&#xff0c;没办法对每个小的功能点进行比较细致的总结&#xff0c;这里统一去记录一下最近的实现了的功能&#xff0c;算是存档备份&#xff0c;为今后开发带来便利和参考。 一、ACEeditor ACEeditor使用手册&#xff08;一&#xff09;_ace editor-CSDN博客 AC…

深度学习中的mAP

在深度学习中&#xff0c;mAP是指平均精度均值(mean Average Precision)&#xff0c;它是深度学习中评价模型好坏的一种指标(metric)&#xff0c;特别是在目标检测中。 精确率和召回率的概念&#xff1a; (1).精确率(Precision)&#xff1a;预测阳性结果中实际正确的比例(TP / …

基于SpringBoot+Vue的影院管理系统(含演示视频+运行截图+说明文档)

web启动链接地址&#xff1a; http://localhost:8082&#xff08;管理端&#xff09; http://localhost:8081&#xff08;用户端&#xff09; http://localhost:8082&#xff08;员工端&#xff09; 一、项目介绍 基于框架的系统&#xff0c;系统分为用户、员工和管理员三个…

科研实验室的数字化转型:Spring Boot系统

1系统概述 1.1 研究背景 随着计算机技术的发展以及计算机网络的逐渐普及&#xff0c;互联网成为人们查找信息的重要场所&#xff0c;二十一世纪是信息的时代&#xff0c;所以信息的管理显得特别重要。因此&#xff0c;使用计算机来管理实验室管理系统的相关信息成为必然。开发合…

网络无人值守批量装机-cobbler

网络无人值守批量装机-cobbler 一、cobbler简介 ​ 上一节中的pxe+kickstart已经可以解决网络批量装机的问题了,但是环境配置过于复杂,而且仅针对某一个版本的操作系统进批量安装则无法满足目前复杂环境的部署需求。 ​ 本小节所讲的cobbler则是基于pxe+kickstart技术的二…

基于Java Springboot二手商品网站

一、作品包含 源码数据库全套环境和工具资源部署教程 二、项目技术 前端技术&#xff1a;Html、Css、Js、Vue、Element-ui 数据库&#xff1a;MySQL 后端技术&#xff1a;Java、Spring Boot、MyBatis 三、运行环境 开发工具&#xff1a;IDEA/eclipse 数据库&#xff1a;…

使用chrome 访问虚拟机Apache2 的默认页面,出现了ERR_ADDRESS_UNREACHABLE这个鸟问题

本地环境 主机MacOs Sequoia 15.1虚拟机Parallels Desktop 20 for Mac Pro Edition 版本 20.0.1 (55659)虚拟机-操作系统Ubuntu 22.04 服务器版本 最小安装 开发环境 编辑器编译器调试工具数据库http服务web开发防火墙Vim9Gcc13Gdb14Mysql8Apache2Php8.3Iptables 第一坑 数…