【Java】泛型与集合篇(二)
泛型与集合(二)
- Set 接口及实现类
- HashSet 类
- 特点
- 内部实现
- 构造方法
- LinkedHashSet 类
- 基本概念
- 特点
- 构造方法
- 常用方法
- 适用场景
- 用 Set 对象实现集合运算
- TreeSet 类
- 特性
- 构造方法
- 常用方法
- 注意事项
- 对象顺序
- 自然排序
- 定制排序
- 注意事项
- Queue 接口及实现类
- Queue 接口
- 定义与特点
- 常用方法
- 常见实现类
- 注意事项
- Deque 接口
- 基本概念
- 常用方法
- 常见实现类
- 注意事项
- ArrayDeque 类
- 基本概念
- 特点
- 常用方法
- 使用示例
- 注意事项
- LinkedList 类
- 基本概念
- 特点
- 构造方法
- 常用方法
- 使用示例
- 注意事项
- 集合转换
- List 与 Set 之间的转换
- List 转 Set
- Set 转 List
- List 与数组之间的转换
- List 转数组
- 数组转 List
- Map 与其他集合之间的转换
- Map 的键或值转换为 Set 或 List
Set 接口及实现类
HashSet 类
HashSet 是 Java 集合框架中 Set 接口的一个具体实现类,它存储唯一的元素,不允许重复值,且不保证元素的顺序。下面从多个方面详细介绍 HashSet 类。
特点
- 不允许重复元素:HashSet 会使用元素的 hashCode() 和 equals() 方法来确保元素的唯一性。当添加一个元素时,HashSet 首先会计算元素的哈希码,然后根据哈希码找到对应的存储位置,如果该位置已经有元素,会进一步使用 equals() 方法来判断两个元素是否相等,如果相等则不会添加该元素。
- 无序性:HashSet 不保证元素的存储顺序,即元素添加的顺序和遍历的顺序可能不同。
- 允许存储 null 元素:但只能存储一个 null 元素,因为重复的 null 元素会被视为相同元素而不被添加。
- 非线程安全:如果在多线程环境下使用,需要进行额外的同步处理,比如使用 Collections.synchronizedSet() 方法来包装 HashSet。
内部实现
HashSet 内部基于 HashMap 实现,它将元素存储在 HashMap 的键中,而值则统一使用一个静态的 PRESENT 对象。HashMap 的哈希表结构使得 HashSet 在插入、删除和查找元素时具有较好的性能,平均时间复杂度为 O (1)。
构造方法
HashSet()创建一个空的散列集合,该集合的默认初始容量是 16,默认装填因子是 0.75。HashSet(Collection c)用指定的集合c的元素创建一个散列集合HashSet(int initialCapacity)创建一个散列集合,并指定集合的初始容量HashSet(int initialCapacity,float loadFactor)创建一个散列集合,并指定集合的初始容量和装填因子
以下是使用这些方法的代码示例:
import java.util.*;public class HashSetExample {public static void main(String[] args) {// 使用HashSet()构造方法HashSet<Integer> hashSet1 = new HashSet<>();hashSet1.add(1);hashSet1.add(2);System.out.println("使用HashSet()构造的集合: " + hashSet1);// 使用HashSet(Collection c)构造方法List<Integer> list = new ArrayList<>();list.add(3);list.add(4);HashSet<Integer> hashSet2 = new HashSet<>(list);System.out.println("使用HashSet(Collection c)构造的集合: " + hashSet2);// 使用HashSet(int initialCapacity)构造方法HashSet<Integer> hashSet3 = new HashSet<>(10);hashSet3.add(5);hashSet3.add(6);System.out.println("使用HashSet(int initialCapacity)构造的集合: " + hashSet3);// 使用HashSet(int initialCapacity, float loadFactor)构造方法HashSet<Integer> hashSet4 = new HashSet<>(10, 0.8f);hashSet4.add(7);hashSet4.add(8);System.out.println("使用HashSet(int initialCapacity, float loadFactor)构造的集合: " + hashSet4);}
}
注意事项:
- 当使用自定义类作为 HashSet 的元素时,必须重写 hashCode() 和 equals() 方法,以确保元素的唯一性判断正确。
- 在多线程环境下使用时,要进行同步处理,否则可能会出现数据不一致的问题。
LinkedHashSet 类
LinkedHashSet 是 Java 集合框架中的一个类,它结合了 HashSet 的哈希表存储特性和链表维护插入顺序的特性。下面从基本概念、特点、常用方法、示例代码等方面对 LinkedHashSet 类进行详细介绍。
基本概念
LinkedHashSet 继承自 HashSet 并实现了 Set 接口。它内部使用哈希表(HashMap)来存储元素,同时使用双向链表维护元素的插入顺序。这意味着当你遍历 LinkedHashSet 时,元素会按照它们被插入的顺序返回。
特点
- 元素唯一:和其他 Set 实现类一样,LinkedHashSet 不允许存储重复的元素。当你尝试添加重复元素时,LinkedHashSet 会忽略该操作。
- 保持插入顺序:LinkedHashSet 会维护元素的插入顺序,当你遍历集合时,元素会按照它们被插入的顺序依次返回。
- 非线程安全:LinkedHashSet 不是线程安全的。如果多个线程同时访问一个 LinkedHashSet,并且至少有一个线程修改了该集合,那么它必须在外部进行同步。可以使用 Collections.synchronizedSet 方法来包装 LinkedHashSet 以实现线程安全。
- 性能:LinkedHashSet 的基本操作(如 add、remove 和 contains)的时间复杂度是 ,和 HashSet 相同。但是由于需要维护链表,它的空间开销会略大一些。
构造方法
LinkedHashSet():创建一个空的 LinkedHashSet,初始容量为 16,加载因子为 0.75。LinkedHashSet(int initialCapacity):创建一个具有指定初始容量的空 LinkedHashSet,加载因子为 0.75。LinkedHashSet(int initialCapacity, float loadFactor):创建一个具有指定初始容量和加载因子的空 LinkedHashSet。LinkedHashSet(Collection<? extends E> c):创建一个包含指定集合中所有元素的 LinkedHashSet。
常用方法
LinkedHashSet 继承了 HashSet 的大部分方法,因为它是 HashSet 的子类。以下是一些常用方法:
- 添加元素
boolean add(E e):将指定的元素添加到集合中,如果集合中已经包含该元素,则返回 false。boolean addAll(Collection<? extends E> c):将指定集合中的所有元素添加到该集合中。
- 删除元素
void clear():移除集合中的所有元素。boolean remove(Object o):如果集合中包含指定的元素,则将其移除。
- 查找元素
boolean contains(Object o):如果集合包含指定的元素,则返回 true。
- 集合大小
int size():返回集合中的元素数量。
- 遍历元素
- 可以使用迭代器(Iterator)、增强 for 循环或 forEach 方法来遍历 LinkedHashSet 中的元素。
以下是使用这些方法的代码示例:
import java.util.LinkedHashSet;public class LinkedHashSetExample {public static void main(String[] args) {// 创建一个 LinkedHashSet 并添加元素LinkedHashSet<String> fruits = new LinkedHashSet<>();fruits.add("Apple");fruits.add("Banana");fruits.add("Orange");fruits.add("Apple"); // 重复元素,不会被添加// 输出集合中的元素,会按插入顺序排序System.out.println("LinkedHashSet 中的元素: " + fruits);// 查找元素System.out.println("是否包含元素 Banana: " + fruits.contains("Banana"));// 删除元素fruits.remove("Orange");System.out.println("删除元素 Orange 后,LinkedHashSet 中的元素: " + fruits);// 遍历元素System.out.println("遍历 LinkedHashSet 中的元素:");for (String fruit : fruits) {System.out.println(fruit);}}
}
适用场景
由于 LinkedHashSet 能保持元素的插入顺序,它适用于需要保证元素插入顺序的场景,例如记录用户的操作历史,在展示时需要按照操作的先后顺序展示,就可以使用 LinkedHashSet 来存储操作记录。
用 Set 对象实现集合运算
使用 Set 对象的批量操作方法,可以实现标准集合代数运算。假设 s1 和 s2 是 Set 对象,下面的操作可以实现相关的集合运算:
s1.addAll(s2);实现集合 s1 与 s2 的并运算。s1.retainAll(s2);实现集合 s1 与 s2 的交运算。s1.removeAll(s2);实现集合 s1 与 s2 的差运算。s1.containAll(s2);如果 s2 是 s1 的子集,该方法返回 true。
以下是使用这些方法的代码示例:
import java.util.HashSet;
import java.util.Set;public class SetOperationExample {public static void main(String[] args) {// 创建Set对象s1Set<Integer> s1 = new HashSet<>();s1.add(1);s1.add(2);s1.add(3);// 创建Set对象s2Set<Integer> s2 = new HashSet<>();s2.add(3);s2.add(4);s2.add(5);// 并运算Set<Integer> unionResult = new HashSet<>(s1);unionResult.addAll(s2);System.out.println("并集结果: " + unionResult);// 交运算Set<Integer> intersectionResult = new HashSet<>(s1);intersectionResult.retainAll(s2);System.out.println("交集结果: " + intersectionResult);// 差运算Set<Integer> differenceResult = new HashSet<>(s1);differenceResult.removeAll(s2);System.out.println("差集结果: " + differenceResult);// 判断子集boolean isSubset = s1.containsAll(s2);System.out.println("s2是否是s1的子集: " + isSubset);}
}
TreeSet 类
TreeSet 是 Java 集合框架中的一个重要类,它实现了 NavigableSet 接口(NavigableSet 接口继承的 SortedSet 接口是 Set 接口的子接口),底层基于红黑树(一种自平衡的二叉搜索树)实现。以下将详细介绍 TreeSet 类:
特性
- 元素唯一性:TreeSet 遵循 Set 接口的通用特性,不允许存储重复元素。当试图添加已存在的元素时,添加操作会失败。
- 元素有序性:TreeSet 中的元素会自动排序,默认按照元素的自然顺序(如果元素实现了 Comparable 接口)排列;也可以在创建 TreeSet 时传入自定义的 Comparator 来指定排序规则。
- 高效操作:由于采用红黑树结构,TreeSet 在添加、删除和查找元素操作上具有 的时间复杂度。
- 非线程安全:和大多数集合类一样,TreeSet 不是线程安全的。如果在多线程环境下使用,需要进行额外的同步处理。
构造方法
TreeSet():创建一个空的 TreeSet,元素按照自然顺序排序。TreeSet(Comparator<? super E> comparator):创建一个空的 TreeSet,使用指定的比较器对元素进行排序。TreeSet(Collection<? extends E> c):创建一个包含指定集合中所有元素的 TreeSet,元素按照自然顺序排序。TreeSet(SortedSet<E> s):创建一个包含指定有序集合中所有元素的 TreeSet,使用与指定有序集合相同的比较器。
以下是使用构造方法的代码示例:
import java.util.*;class CustomComparator implements Comparator<Integer> {@Overridepublic int compare(Integer o1, Integer o2) {return o2 - o1; // 逆序比较}
}public class TreeSetExample {public static void main(String[] args) {// 使用TreeSet()构造方法TreeSet<Integer> treeSet1 = new TreeSet<>();treeSet1.add(3);treeSet1.add相关文章:
【Java】泛型与集合篇(二)
泛型与集合(二) Set 接口及实现类HashSet 类特点内部实现构造方法LinkedHashSet 类基本概念特点构造方法常用方法适用场景用 Set 对象实现集合运算TreeSet 类特性构造方法常用方法注意事项对象顺序自然排序定制排序注意事项Queue 接口及实现类Queue 接口定义与特点常用方法常…...
解锁机器学习核心算法 | 线性回归:机器学习的基石
在机器学习的众多算法中,线性回归宛如一块基石,看似质朴无华,却稳稳支撑起诸多复杂模型的架构。它是我们初涉机器学习领域时便会邂逅的算法之一,其原理与应用广泛渗透于各个领域。无论是预测房价走势、剖析股票市场波动࿰…...
CSS 底部颗粒磨砂特效
参考:element-plus的顶部效果 background-image: radial-gradient(transparent 1px, var(--bg-color) 1px); background-size: 4px 4px; backdrop-filter: saturate(50%) blur(4px); 注意点:var(--bg-color) 改为跟你背景色相同的即可。 其他自己看情况…...
QT自定义扫描控件,支持任意方位拖动和拖动扫描范围。
部分代码: void FishControlForm::paintEvent(QPaintEvent *event) {QPainter p(this);p.setRenderHints(QPainter::Antialiasing|QPainter::SmoothPixmapTransform);p.translate(m_centerPoint);//bgp.setPen(Qt::white);p.drawEllipse(-m_radius,-m_radius,m_rad…...
Ubuntu18.04安装rvm、ruby2.6.5和rails5.2.6
系统环境:Ubuntu 18.04 一、安装前准备 1. sudo apt update 2. sudo apt upgrade 如果提示abort,忽略。 3. sudo apt install sqlite3 gnupg curl git libpq-dev 二、安装rvm ruby版本管理器 1.切换管理员模式 sudo su 2.安装软件签名公钥 gpg…...
燧光 XimmerseMR SDK接入Unity
官网SDK文档连接: RhinoX Unity XR SDK 一:下载SDK 下载链接:RhinoX Unity XR SDK 二:打开Unity项目,添加Package 1、先添加XR Core Utilties包和XR Interaction Toolkit包 2、导 2、再导入下载好的燧光SDK 三&…...
罗德与施瓦茨ZNB20,矢量网络分析仪9KHz-20GHz
罗德与施瓦茨ZNB20矢量网络分析仪9KHz-20GHz R&SZNB20矢量网络分析仪 产品型号: ZNB20 产品品牌:罗德与施瓦茨 R&S 产品名称: 矢量网络分析仪 频率范围:9kHz - 20GHz R&S ZNB 矢量网络分析仪 良好的测量速度、动态范围和操作方便性&am…...
突破平面限制:低空经济激活城市土地“立体生长力”
蓄锐行:我深耕于低空经济领域,同时对IOT技术有着深入的理解,而在AI的探索性研究上,我也已迈出坚实的步伐,虽起步不久,却满怀热情与憧憬。平日里,我热衷于撰写关于低空经济的文章,分享…...
可调节图片参数,解决图片模糊及尺寸过小问题的工具
软件介绍 你是否正为图片模糊、尺寸太小而烦恼?别担心,有这样一款神器能帮你轻松解决。它能精准调节图片参数,即便原本模糊不清的图片,经它处理后也能变得高清锐利,瞬间让图片焕然一新。而且,它还具备导出…...
React 与 Vue 对比指南 - 上
React 与 Vue 对比指南 - 上 本文将展示如何在 React 和 Vue 中实现常见功能,从基础渲染到高级状态管理 Hello 分别使用 react 和 vue 写一个 Hello World! react export default () > {return <div>Hello World!</div>; }vue <…...
✨2.快速了解HTML5的标签类型
✨✨HTML5 的标签类型丰富多样,每种类型都有其独特的功能和用途,以下是一些常见的 HTML5 标签类型介绍: 🦋结构标签 🪭<html>:它是 HTML 文档的根标签,所有其他标签都包含在这个标签内&am…...
力扣 买卖股票的最佳时机
贪心算法典型例题。 题目 做过股票交易的都知道,想获取最大利润,就得从最低点买入,最高点卖出。这题刚好可以用暴力,一个数组中找到最大的数跟最小的数,然后注意一下最小的数在最大的数前面即可。从一个数组中选两个数…...
【SQL】SQL多表查询
🎄概念 一般我们说的多表查询都涉及外键和父子表之间的关系。比如一对多:一般前面指的是父表后面指的是子表。 ⭐分类 一对多(多对一) 多对多 一对一 ⭐一对多 📢案例:部门与员工的关系 📢关系:一个部门对应多个员…...
HTML之JavaScript DOM(document)编程处理事件
HTML之JavaScript DOM(document)编程处理事件 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"…...
知识篇 | DeepSeek企业部署模式主要有6种
国际数据公司IDC近日发文《DeepSeek爆火的背后,大模型/生成式AI市场生态潜在影响引人关注》表示: “大模型的部署过程需同时满足高并发与低延迟的严苛要求,并需全面考量数据安全、隐私保障、资源弹性扩展以及系统维护等多重因素,D…...
uniapp中@input输入事件在修改值只有第一次有效的问题解决
在uniapp中使用输入框,要求输入不超过7个字,所以需要监听输入事件,当每次输入文字的时候,就把输入的值截断,取前7个值。但是在input事件中,重新赋值的值发生了变化,但是页面上的还是没有变&…...
linux环境-nginx通过nginx_upstream_check_module模块,配置服务自动检测-日志自动分割
依赖包正在审核中,通过后将在文章顶部展示,如再次编辑请到内容管理-下载类目 cd nginx源码目录(nginx-1.27.3) 在源码目录下执行一下操作,完成nginx安装和启动 1、双击执行gccCheck.sh,安装gcc化境 脚本内容如下 #!/bin/bash # 检查GCC是否安装 if ! gcc --vers…...
AI 百炼成神:线性回归,预测房价
我们开始第一个项目——线性回归:预测房价。这是一个经典的机器学习入门项目,可以帮助你理解如何使用线性回归模型来预测连续的数值。 第一个项目:线性回归预测房价 项目目标 学习线性回归的基本概念。使用历史房价数据建立一个预测模型。理解如何评估模型的性能。项目步骤…...
Linux运维篇-存储基础知识
什么是存储 用于存放数据信息的设备和介质,等同于计算机系统中的外部存储,是一个完整的系统。 存储的结构和趋势 存储的体系结构 当前存储的主要体系结构有三种: DASNASSAN 存储的发展趋势 ssd固态硬盘云存储一体化应用存储设备非结构…...
Pytorch实现论文之三元DCGAN生成RGB图像用于红外图像着色生成
简介 简介:采用了三次DCGAN单独生成单通道图像之后进行组成RGB图像放入鉴别器中检测,并在鉴别器和生成器的损失训练中采用梯度方法来提升或者降低权重。该方法将用于获得红外图像着色的生成。 论文题目:Infrared Image Colorization based on a Triplet DCGAN Architectur…...
Socket通讯协议理解及客户端服务器程序流程
Socket通讯我们可以从以下几个方面简单理解 1.Socket是网络通信中的一项重要技术,它提供了在网络上进行数据交换的接口。用C#、Java、C等开发语言,都可以开发Socket网络通信程序。 2.Socket(套接字)是计算机网络编程中的一种抽象,它允许不同…...
ceph部署-14版本(nautilus)-使用ceph-ansible部署实验记录
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、环境信息二、部署步骤2.1 基础环境准备2.2 各节点docker环境安装2.3 搭建互信集群2.4 下载ceph-ansible 三、配置部署文件3.1 使用本地docker3.2 配置hosts…...
vue3 + thinkphp 接入 七牛云 DeepSeek-R1/V3 流式调用和非流式调用
如何获取七牛云 Token API 密钥 https://eastern-squash-d44.notion.site/Token-API-1932c3f43aee80fa8bfafeb25f1163d8 后端 // 七牛云 DeepSeek API 地址private $deepseekUrl https://api.qnaigc.com/v1/chat/completions;private $deepseekKey 秘钥;// 流式调用public f…...
vlanif接口转发vlan
一.为什么需要VLAN 1.1 什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”。LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络。VLAN所指的LAN特指使用路由器分割的网络——…...
Rook-ceph(1.92最新版)
安装前准备 #确认安装lvm2 yum install lvm2 -y #启用rbd模块 modprobe rbd cat > /etc/rc.sysinit << EOF #!/bin/bash for file in /etc/sysconfig/modules/*.modules do[ -x \$file ] && \$file done EOF cat > /etc/sysconfig/modules/rbd.modules &l…...
第2章 信息技术发展(一)
2.1 信息技术及其发展 2.1.1 计算机软硬件 计算机硬件(Computer Hardware)是指计算机系统中由电子、机械和光电元件等组成的各种物理装置的总称。 计算机软件 (Computer Software)是指计算机系统中的程序及其文档,程序是计算任务的处理对象和处理规则的描述; 文档…...
python学习笔记,python处理 Excel、Word、PPT 以及邮件自动化办公
文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python 二、处理 Excel 文件(openpyxl库)三、 处理 Word 文件(python-docx库)四、 处理 PPT 文件(python-pptx库)五、 自动发送邮件(smtplib和…...
【网络基本知识--2】
网络基本知识--2 1.主机A和主机B通过三次握手TCP连接,过程是: TCP三次握手连接过程如下: 1.客户端发送SYN(SEQx)报文发送给服务器端,进入SYN_SEND状态; 2.服务器端收到SYN报文,回应一个SYN(SEQy)ACK(ACKx1)…...
MoE硬件部署
文章目录 MoE硬件部署硬件需求**专家硬件映射:模块化计算单元****路由硬件加速:门控网络专用单元****内存与通信优化****能效控制策略****实例:假设部署Mixtral 8x7B到自研AI芯片** 资源分配硬件资源预分配(编译时)运行…...
摄影——曝光三要素
曝光三要素 光圈(F):控制进光量的装置快门(1/X):接受光线的时间感光度(ISO):感光器件对光线的敏感程度 一、快门(1/X) 静物 1/125 动物 1/500 …...
