当前位置: 首页 > news >正文

Java小抄(一)|Java中的List与Set转换

文章目录

  • List和Set的区别
  • 线程安全的区别
  • 相互转换
    • List->Set
    • Set->List

List和Set的区别

在Java中,List和Set都是集合接口,它们之间有几个关键的区别:

  1. 重复元素:
  • List允许重复元素,可以存储相同的元素多次。
  • Set不允许重复元素,每个元素在Set中是唯一的。
  1. 元素的顺序:
  • List是有序集合,它按照元素插入的顺序来维护元素的顺序。
  • Set通常不保证元素的顺序。具体而言,HashSet不保证元素的顺序,而TreeSet按照元素的自然顺序或者通过提供的Comparator来排序元素。
  1. 实现类:
  • List的常见实现类有ArrayList、LinkedList和Vector。
  • Set的常见实现类有HashSet、TreeSet和LinkedHashSet。
  1. 性能:
  • List的实现类通常提供了快速的随机访问(根据索引访问元素),但在插入和删除操作时,ArrayList的性能较好,因为它不需要像LinkedList那样改变指针。
  • Set的实现类通常旨在提供快速的查找和插入操作,因此HashSet通常比TreeSet快,但是TreeSet可以保证元素的有序性。

在选择使用List还是Set时,你需要考虑你的数据结构的特性以及对性能和元素唯一性的需求。

线程安全的区别

在线程安全方面,List和Set之间也有一些区别:

  1. List的线程安全性:
  • Java中的ArrayList和LinkedList不是线程安全的,它们在多线程环境下不是安全的,如果多个线程同时修改一个List实例,可能会导致不确定的结果或者抛出ConcurrentModificationException异常。
  • Vector是List的线程安全实现类,它通过在每个方法上添加synchronized关键字来确保线程安全。
  1. Set的线程安全性:
  • HashSet和TreeSet都不是线程安全的,它们在多线程环境下可能会导致不确定的结果或者抛出ConcurrentModificationException异常。
  • LinkedHashSet也不是线程安全的。
  1. 线程安全的替代方案:
  • 如果需要在多线程环境下使用List或Set,可以考虑使用它们的线程安全实现类。例如,可以使用Collections类中的synchronizedList方法来获得一个线程安全的List,或者使用CopyOnWriteArrayList等并发集合类。
  • 如果需要在多线程环境下使用Set,可以考虑使用ConcurrentHashMap作为替代方案,或者使用ConcurrentSkipListSet。

总的来说,在多线程环境下,需要注意List和Set的线程安全性,并选择合适的线程安全实现类或并发集合类来确保线程安全。

相互转换

List->Set

在Java中,将List转换为Set可以通过以下几种方式实现:

  1. 使用构造函数:
List<String> list = new ArrayList<>();
// 添加元素到列表Set<String> set = new HashSet<>(list); // 使用HashSet构造函数
  1. 使用addAll()方法:
List<String> list = new ArrayList<>();
// 添加元素到列表Set<String> set = new HashSet<>();
set.addAll(list);
  1. Java 8 Stream API:
List<String> list = new ArrayList<>();
// 添加元素到列表Set<String> set = list.stream().collect(Collectors.toSet());
  1. Apache Commons Collections:
    如果你使用Apache Commons Collections库,你可以使用ListUtils类中的方法:
List<String> list = new ArrayList<>();
// 添加元素到列表Set<String> set = new HashSet<>(ListUtils.intersection(list, list)); // 使用ListUtils.intersection()方法

无论选择哪种方式,都可以将List转换为Set。注意,在转换过程中,如果List中包含重复元素,转换后的Set将只包含唯一的元素。

Set->List

在Java中,将Set转换为List也有几种实现方式:

  1. 使用构造函数:
Set<String> set = new HashSet<>();
// 添加元素到集合List<String> list = new ArrayList<>(set); // 使用ArrayList构造函数
  1. 使用addAll()方法:
Set<String> set = new HashSet<>();
// 添加元素到集合List<String> list = new ArrayList<>();
list.addAll(set);
  1. Java 8 Stream API:
Set<String> set = new HashSet<>();
// 添加元素到集合List<String> list = set.stream().collect(Collectors.toList());
  1. Apache Commons Collections:
    如果你使用Apache Commons Collections库,你可以使用SetUtils类中的方法:
Set<String> set = new HashSet<>();
// 添加元素到集合List<String> list = new ArrayList<>(SetUtils.orderedSetToList(set)); // 使用SetUtils.orderedSetToList()方法

以上是一些常见的将Set转换为List的方法。在转换过程中,Set中的元素顺序可能会改变,因为List是有序集合,而Set通常是无序的。

相关文章:

Java小抄(一)|Java中的List与Set转换

文章目录 List和Set的区别线程安全的区别相互转换List->SetSet->List List和Set的区别 在Java中&#xff0c;List和Set都是集合接口&#xff0c;它们之间有几个关键的区别&#xff1a; 重复元素&#xff1a; List允许重复元素&#xff0c;可以存储相同的元素多次。Set…...

【每日随笔】小人畏威不怀德 , 君子畏德不畏威 ( 先礼后兵 )

文章目录 一、小人畏威不怀德1、小人畏威不怀德2、小人场景一3、小人场景二 二、君子畏德不畏威三、先礼后兵 一、小人畏威不怀德 1、小人畏威不怀德 如果 友善 的对待 小人 , 这种人 认知低 且 素质差 , 小人 会将你的 " 友善 " 理解为 " 屈服 " , 他会认…...

不一样的2024

当我们继续往前走时&#xff0c;发现身边的事物不再那么的陌生&#xff0c;也不再那边多的阻碍&#xff0c;不管怎么&#xff0c;2024将会不一样。 当我们走进审批流时&#xff0c;全面石荒芜的&#xff0c;所以自己构建了一个体系。 当我们转向开源时&#xff0c;发现开源与…...

linux mv操作和cp操作

mv 和 cp 是 Linux 系统中用于移动和复制文件或文件夹的两个常用命令&#xff0c;它们之间的主要区别在于&#xff1a; mv&#xff08;move&#xff09;&#xff1a;mv 命令用于移动文件或文件夹&#xff0c;将它们从一个位置移动到另一个位置。移动后&#xff0c;原始文件或文…...

第十二届蓝桥杯物联网试题(国赛)

不得不说国赛相比较省赛而言确实&#xff0c;功能变得更加复杂&#xff0c;更加繁琐&#xff0c;特别是串口LORA通信相结合的更加频繁&#xff0c;且对收取的字符处理要求要更加复杂&#xff0c;处理判别起来会更加复杂。 对于收发数据本身来说&#xff0c;收发的数据本身是以…...

小而美的前端库推荐

小而美&#xff0c;指的是“小即是美”的事物&#xff0c;这是马云在 2009年 APEC 中小企业峰会上首次提出的观点 &#x1f44d; 前端有很多小而美的库&#xff0c;接入成本很低又能满足日常开发需求 &#x1f389;...

【LeetCode】力扣第 399 场周赛 优质数对的总数 II

文章目录 1. 优质数对的总数 II 1. 优质数对的总数 II 题目链接 &#x1f34e;该题涉及的小技巧&#xff1a;&#x1f425; &#x1f427;①一次可以统计这个数的 两个因子 但是要注意 25 5 * 5&#xff0c;这种情况 5 只能统计一次噢&#x1f192; 解题思路: &#x1f427…...

YOLOv8+PyQt5面部表情检测系统完整资源集合(yolov8模型,从图像、视频和摄像头三种路径识别检测,包含登陆页面、注册页面和检测页面)

1.资源包含可视化的面部表情检测系统&#xff0c;基于最新的YOLOv8训练的面部表情检测模型&#xff0c;和基于PyQt5制作的可视化面部表情检测系统&#xff0c;包含登陆页面、注册页面和检测页面&#xff0c;该系统可自动检测和识别图片或视频当中出现的八类面部表情&#xff1a…...

ROS 工作空间

ROS 工作空间 工作空间概念 ROS 的工作空间 在 ROS 中&#xff0c;工作空间&#xff08;通常称为 Catkin 工作空间&#xff09;是一个文件夹&#xff08;目录&#xff09;结构&#xff0c;它用于组织、构建和管理 ROS 项目中的软件包。主要特点包括&#xff1a; 1. 目录结构…...

【科普】ChatGPT-4o 是什么?和之前的ChatGPT4.0有什么区别,各有什么优劣势

文章目录 前言一、ChatGPT-4o 是什么&#xff1f;**主要特点和改进**&#xff1a; 二、ChatGPT-4o 和之前的ChatGPT4.0有什么区别&#xff0c;各有什么优劣势区别优势和劣势ChatGPT-4.0ChatGPT-4o 前言 5月13日&#xff0c;ChatGPT-4o发布&#xff0c;是人工智能的进一步发展&…...

django-celery-beat自动调度异步任务

Celery是一个简单、灵活且可靠的分布式系统&#xff0c;专门用于处理大量消息的实时任务调度。它支持使用任务队列的方式在分布的机器、进程、线程上执行任务调度。Celery不仅支持异步任务&#xff08;如发送邮件、文件上传、图像处理等耗时操作&#xff09;&#xff0c;还支持…...

【CSharp】将ushort数组保存为1通道位深16bit的Tiff图片

【CSharp】将ushort数组保存为1通道位深16bit的Tiff图片 1.背景2.接口 1.背景 System.Drawing.Common 是一个用于图像处理和图形操作的库&#xff0c;它是 System.Drawing 命名空间的一部分。由于 .NET Core 和 .NET 5 的跨平台特性&#xff0c;许多以前内置于 .NET Framework…...

Bug:Linux用户拥有r权限但无法打开文件【Linux权限体系】

Bug&#xff1a;Linux用户拥有r权限但无法打开文件【Linux权限体系】 0 问题描述&解决 问题描述&#xff1a; 通过go编写了一个程序&#xff0c;产生的/var/log/xx日志文件发现普通用户无权限打开 - 查看文件权限发现该文件所有者、所有者组、其他用户均有r权限 - 查看该日…...

【Redis】Widows 和 Linux 下使用 Redis

Redis 简述 1.缓存 缓存就是将数据存放在距离计算最近的位置以加快处理速度。缓存是改善软件性能的第一手段,现代 CPU 越来越快的一个重要因素就是使用了更多的缓存,在复杂的软件设计中,缓存几乎无处不在。大型网站架构设计在很多方面都使用了缓存设计。 2.Redis Redis …...

统计计算四|蒙特卡罗方法(Monte Carlo Method)

系列文章目录 统计计算一|非线性方程的求解 统计计算二|EM算法&#xff08;Expectation-Maximization Algorithm&#xff0c;期望最大化算法&#xff09; 统计计算三|Cases for EM 文章目录 系列文章目录一、基本概念&#xff08;一&#xff09;估算 π \pi π&#xff08;二&…...

大模型时代的具身智能系列专题(三)

清华高阳团队 高阳为清华叉院助理教授&#xff0c;本科毕业于清华大学计算机系&#xff0c;博士毕业于UC Berkeley。博士导师是Vision领域的大牛Trevor Darrell&#xff0c;读博期间和Sergey Levine合作开始强化学习方面的探索&#xff0c;博后跟随Pieter Abbeel做强化学习&am…...

使用 FileZilla 在 Windows 和 Ubuntu 之间传文件

网线一端插在板子的WAN口上&#xff0c;另一段插在电脑上&#xff0c;然后要配一下板子的IP。 板侧&#xff1a; 使用串口链接板子与PC端&#xff1b; 输入指令 ifconfig eth0&#xff08;具体看wan口对应哪一个&#xff09; 192.168.1.99 PC端配置&#xff1a; 打开网络设…...

【C++初阶】—— 类和对象 (上)

&#x1f4dd;个人主页&#x1f339;&#xff1a;EterNity_TiMe_ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; 类和对象 1. 初步认识C2. 类的引入3. 类的定义声明和定义全部放在类体中声明和定义分开存放 4.…...

基础—SQL—图形化界面工具的DataGrip使用(2)

一、回顾与引言 &#xff08;1&#xff09; 上次内容&#xff0c;博客讲到了DDL语句的数据库操作、表操作、表字段的操作的相关语法&#xff0c;然而之前都是在MySQL的命令行当中去操作演示的。这种方式可以用&#xff0c;但是使用的话&#xff0c;第一&#xff0c;在我们日常…...

4-主窗口

4-主窗口 1、简介2 菜单栏、工具栏、状态栏2.1 菜单栏2.2 QAction2.3 工具栏2.4 状态栏 3 混合方式UI设计 1、简介 QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏、多个工具栏、多个停靠控件、一个状态栏以及一个中心控件&#xff0c;是许多应用程序&…...

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

JAVA后端开发——多租户

数据隔离是多租户系统中的核心概念&#xff0c;确保一个租户&#xff08;在这个系统中可能是一个公司或一个独立的客户&#xff09;的数据对其他租户是不可见的。在 RuoYi 框架&#xff08;您当前项目所使用的基础框架&#xff09;中&#xff0c;这通常是通过在数据表中增加一个…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

Linux nano命令的基本使用

参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时&#xff0c;显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...

如何应对敏捷转型中的团队阻力

应对敏捷转型中的团队阻力需要明确沟通敏捷转型目的、提升团队参与感、提供充分的培训与支持、逐步推进敏捷实践、建立清晰的奖励和反馈机制。其中&#xff0c;明确沟通敏捷转型目的尤为关键&#xff0c;团队成员只有清晰理解转型背后的原因和利益&#xff0c;才能降低对变化的…...

tomcat指定使用的jdk版本

说明 有时候需要对tomcat配置指定的jdk版本号&#xff0c;此时&#xff0c;我们可以通过以下方式进行配置 设置方式 找到tomcat的bin目录中的setclasspath.bat。如果是linux系统则是setclasspath.sh set JAVA_HOMEC:\Program Files\Java\jdk8 set JRE_HOMEC:\Program Files…...

【UE5 C++】通过文件对话框获取选择文件的路径

目录 效果 步骤 源码 效果 步骤 1. 在“xxx.Build.cs”中添加需要使用的模块 &#xff0c;这里主要使用“DesktopPlatform”模块 2. 添加后闭UE编辑器&#xff0c;右键点击 .uproject 文件&#xff0c;选择 "Generate Visual Studio project files"&#xff0c;重…...