【自用】JavaSE--集合框架(一)--Collection集合体系

概述

之前学的ArrayList就是集合的一种,是一种容器,可以往里面存东西,大小可变

Collection集合体系

Collection的常用方法

以后Collection体系的集合都可以用下图的方法

注意

toArray方法的数组类型是Object,这样就可以接收任意类型的数据到数组中去,如果需要指定数组类型,方法如下图

补充

addAll( ) 方法,可以将一个集合中的数据拷贝一份到另一个集合中去,示例如下图

 输出结果===>     

Collection的遍历方式

之后所有的Collection体系集合都能使用这些方法,而之前用的for方法本质是利用 i 充当索引进行遍历的,而Set系列集合是没有索引的,只能在List系列集合中使用

迭代器

(是不是有点像链表的遍历🤔,不准确理解方式:next指向当前所在元素,获取后就指向下一个元素,使用hasnext判断指向元素是否为空)

示例:

增强for循环

示例:ele可以取任何名字,把ele理解成当前指向的元素,他会遍历完所有的元素

Lambda表达式

Java提供一个foreach方法用于遍历,可以采用lambda表达式简化,目前还看不出其强大的简化能力,当后面学到对map集合遍历时,才能感受到他的强大之处

List集合

未来创建ArrayList或LinkList推荐采用多态的写法:List<类型> 类名 = new ArrayList<>( );   List<类型> 类名 = new LinkedList<>( );

ArrrayList与LinkedList的底层实现不同,采用的数据结构不一样,适用场景不同

List特有方法

List遍历方式

有索引,因此是支持普通的for循环的

ArrayList

底层原理

应用场景

ArrayList  适用于根据索引查数据、或数据量不大时;不适用于数据量大且需要频繁进行增删操作的场景

LinkedList

底层原理

应用场景

Set集合

HashSet用的比较多

前置知识-哈希值

每个对象都有一个哈希值,可以通过哈希值找到对象,若出现相同的哈希值-->碰撞(类比数据结构中的哈希查找)

哈希碰撞:

String类的hashCode()方法把字符值代入特定公式计算哈希值,知道公式就能轻易设计出哈希碰撞

上图的例子是故意设计的,是为了演示哈希碰撞,实际中并不会这么容易就撞

HashSet

无序、不重复、无索引

jdk8之前:采用的是哈希表,因此增删改查效率都不错

补充知识

  1. 数组长度 × 加载因子 = 需要扩容的大小。比如上图,16×0.75=12,当数组中占了12个位置的时候,就会进行扩容,增加数组长度至原来长度的两倍
  2. 从jdk8开始,当链表的长度>8,且数组长度>=64,自动将链表转换成红黑树(具体红黑树细节看408笔记)

去重机制

HashSet默认不能对内容一样的两个不同对象进行去重!因为虽然内容一样,但是地址是不同的,因此HashSet会认为两个对象并不是重复的

解决办法:在对象的类中重写 equals方法 与 HashCode方法 即可,直接右键generate可以生成,具体如下,简单的理解 ---> 重写后的equals方法:若对象相同会返回true,而重写后的hashcode方法:若两个对象的内容一样就返回相同的哈希值

LinkedHashSet

有序、不重复、无索引

如何实现有序?双链表实现,但也因此增加了内存

TreeSet

不重复、无索引、可排序

自定义排序规则

由于无法进行排序,因此需要自己指定排序规则,如下图,之前在学习Arrays.sort时学过,这里方法一样

补充:

  1. 如果两种方法都是用了,TreeSet会采用就近原则使用外部重写的Comparator规则,而不使用对象类内部重新的
  2. 如果两个对象中出现的某一项相同,比如采用年龄排序,年龄都是16,则会丢失其中一个,因为Set的规则就是出现输入相同的数据时会保留先前输入的
Comparable

让需要排序的对象类实现Comparable泛型接口,重写comparetor,自己指定规则,就能对对象进行排序了,示例如下:

Comparator

Comparator是一个匿名内部类,在传入参数时直接重写,可以利用TreeSet的有参构造器直接设置Comparator对象

示例如下,其中调用的 Double.compare(double a,double b) 方法:a>b return 1 ; a<b return -1; a==b return0

各种集合的使用总结

注意事项

集合的并发修改异常问题

下面这段代码就会发生并发修改异常问题,主要问题在于remove,remove后集合整体是会往前移一个的,因此当找到含李的名字的时候,remove后集合会整体往前移,此时hasNext会让指针指向下一个,导致漏检

解决办法

若采用迭代器遍历,不要直接使用  集合.remove,而是采用  迭代器.remove,就可以解决该问题

注意:若使用增强for循环或是lambda表达式进行循环出现并发修改异常问题,是没有办法解决的

其他相关知识

可变参数

示例:

Collections

addAll 示例:

shuffle 示例:

sort

默认升序排序,如果里面存的是对象,就需要像上面一样使用 comparable 或者 comparator 设置比较规则进行排序

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

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

相关文章

电脑视频常用几种接口

传输信号类型 DP&#xff08;DisplayPort&#xff09;主要用于传输数字视频和音频信号&#xff0c;支持高分辨率和高刷新率。HDMI&#xff08;High-Definition Multimedia Interface&#xff09;同样传输数字音视频信号&#xff0c;但更偏向消费电子领域&#xff0c;如电视、游…

CherryStudio+playwright-mcp-server实现AI自动化

目录 1、CherryStudio安装与配置 1.1什么是CherryStudio 1.2安装 1.3配置 2、playwright-mcp-server的安装与配置 3、执行测试与结果 1、CherryStudio安装与配置 1.1什么是CherryStudio Cherry Studio 是一款集多模型对话、知识库管理、AI 绘画、翻译等功能于一体的全能 …

深入了解 find_element 方法:Web 自动化定位元素的核心​

在 Web 自动化测试领域&#xff0c;元素定位是实现各类操作的基础&#xff0c;而find_element方法正是 Selenium 等自动化工具中用于定位单个元素的核心方法。掌握它的使用技巧&#xff0c;能让我们更精准、高效地操控网页元素&#xff0c;为自动化测试脚本的编写打下坚实基础。…

从零开始的云计算生活——第三十三天,关山阻隔,ELK日志分析

目录 一.故事背景 二、Elasticsearch 全面概述 1、核心定位 2、核心特性 a. 分布式架构 b. 高性能原理 c. 数据模型创新 3、核心技术组件 4、核心应用场景 a. 企业级搜索 b. 可观测性 c. 安全分析&#xff08;SIEM&#xff09; 5、版本演进关键特性 6、核心优势…

深入理解 Spring Boot Starter 的生成机制

在使用 Spring Boot 进行开发时&#xff0c;我们常常会引入诸如 spring-boot-starter-web、spring-boot-starter-data-jpa 等依赖&#xff0c;从而快速开启相关功能模块。但你是否思考过这些 Starter 是如何构建的&#xff1f;如果我们要开发自己的 Starter&#xff0c;又该如何…

阿里云-通义灵码:隐私保护机制—为数据安全筑起铜墙铁壁

免责声明&#xff1a;此篇文章所有内容皆是本人实验&#xff0c;并非广告推广&#xff0c;并非抄袭&#xff0c;该系列继续~每日一句不要感叹自己的平凡&#xff0c;即便是最暗的星星&#xff0c;相与无边的黑暗已是耀眼。一.引言在这个数据如同空气般渗透到生活每个角落的时代…

最小生成树算法详解

最小生成树算法详解一、最小生成树基础概念1.1 生成树与最小生成树1.2 核心性质1.3 应用场景二、Prim 算法&#xff1a;从顶点出发的“生长式”构建2.1 算法原理2.2 Java 代码实现&#xff08;邻接矩阵版&#xff09;2.3 复杂度分析三、Kruskal 算法&#xff1a;按边权排序的“…

YOLO 目标检测的改进方法

YOLO目标检测的改进方法可以从模型架构、训练策略、损失函数等多个方面入手&#xff0c;以下是一些常见的改进方法方向及参考文献&#xff1a; 模型架构改进 骨干网络替换&#xff1a;使用更轻量或更强大的网络替换原始骨干网络。轻量级网络如MobileNetV3、ShuffleNetV2等适合…

C++ 程序 AddressSanitizer:DEADLYSIGNAL

GCC && G 操作系统&#xff1a;Ubuntu 22.04 现象&#xff1a;C程序编译时开启ASAN&#xff0c;运行时有几率会出现大量AddressSanitizer:DEADLYSIGNAL 参考文章&#xff1a; https://stackoverflow.com/questions/77894856/possible-bug-in-gcc-sanitizers https://st…

【强化学习】实际部署

环境 Gymnasium 作为环境接口&#xff0c; PyBullet作为物理仿真平台&#xff0c; Stable Baselines3 用于训练算法。 测试框架搭建 以pybullet自带的Cart-pole-v1为例 安装依赖&#xff1a;确保安装了 Gymnasium 和 SB3 ( pip install gymnasium stable-baselines3 ).初始化环…

集训Demo4

创建数据库创建项目基本和视频中的一样我给User添加了vip这个属性&#xff0c;想实现两个令牌通过访问的案例&#xff0c;但遇到了问题一个令牌是密码加用户名的map数组这是它的获取、验证逻辑获取验证另一个令牌是Int vip这是自己写的另一套密钥和方法获取但在验证这里有问题头…

深度优化:Java 慢查询排查与性能调优实战

文章目录&#x1f680; 深度优化&#xff1a;Java 慢查询排查与性能调优实战&#x1f6a8;1. 事故全景&#xff1a;从告警到定位&#x1f575;️‍♂️1.1 事故时间线&#x1f4ca; 1.2 关键指标异常&#x1f6e0;️ 1.3 排查工具链&#x1f50d; 2. 深度剖析&#xff1a;MySQL…

TF-IDF(Term Frequency - Inverse Document Frequency)

TF-IDF&#xff08;Term Frequency - Inverse Document Frequency&#xff09;是一种在信息检索与文本挖掘中非常常用的关键词提取方法&#xff0c;用于衡量一个词在文档集合中的重要性。它的核心思想是&#xff1a;如果一个词在某个文档中出现得频繁&#xff0c;同时在其他文档…

Chrome紧急更新,谷歌修复正遭活跃利用的关键零日漏洞

谷歌已针对桌面版Chrome发布重要稳定渠道更新&#xff08;版本138.0.7204.157/.158&#xff09;&#xff0c;修复了六个安全漏洞&#xff0c;其中包括一个已被实际利用的漏洞。该更新正在向Windows、Mac和Linux平台推送&#xff0c;预计未来数日或数周内将通过自动更新完成部署…

Typecho插件开发:实现文章字数统计与阅读时长计算功能

文章目录 Typecho文章字数统计与阅读时长计算功能实现指南 1. 功能背景与需求分析 2. 插件设计与实现 2.1 插件基础结构 2.2 插件主逻辑实现 2.3 代码解析与优化 3. 前端展示优化 3.1 CSS样式增强 3.2 多语言支持 4. 高级功能扩展 4.1 数据库表优化 4.2 定时批量处理历史文章 5…

开源短链接工具 Sink 无需服务器 轻松部署到 Workers / Pages

本文首发于只抄博客,欢迎点击原文链接了解更多内容。 前言 Sink 是一款开源免费的短链接生成工具,支持自定义短链接 Slug 以及设置到期时间,并且还可以借助 Cloudflare 的 Analytics Engine 功能分析短链接的统计数据。 最重要的是实现以上这些功能并不需要有自己的服务器,…

嵌入式数据结构之顺序表总结

以下是为嵌入式面试准备的顺序表全面优化指南&#xff0c;结合高频考点、代码规范与嵌入式专项优化技巧&#xff0c;助你系统掌握该知识点。 一、顺序表基础与嵌入式特点 ​本质​ 用连续内存空间存储线性表元素&#xff0c;通过下标实现O(1)随机访问 。 ​嵌入式优势​&#x…

Pytorch下载Mnist手写数据识别训练数据集的代码详解

datasets.MNIST(root./data, trainFalse, downloadTrue, transformtransforms.ToTensor())1. datasets.MNIST这是torchvision.datasets模块中的一个类&#xff0c;专门用于加载MNIST数据集。MNIST是一个著名的手写数字识别数据集&#xff0c;包含60,000个训练样本和10,000个测试…

汽车免拆诊断案例 | 07款丰田Hilux启动故障

故障现象一辆 2007 年的丰田Hilux 2.5L柴油手动挡&#xff0c;行驶里程为23万公里。车主说车辆有很多故障&#xff0c;包括故障灯闪烁、发动机启动后又熄火、短时间运行时发动机还会剧烈抖动异响&#xff0c;从排气管冒出大量烟雾。故障诊断接车之后进行检查&#xff0c;发现发…

黄老师(Exeter University)学术交流

1. 文章结构与核心贡献聚焦 强调明确切入点和核心“亮点”贡献&#xff0c;避免分散&#xff0c;确保至少一项最主要、富有创新的方法。在该贡献点上进行全面充分的实验验证&#xff0c;包括不同模型尺寸、普适性测试&#xff0c;以应对审稿专家的质疑。建议从读者或审稿人角度…