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

【java 13天进阶Day05】数据结构,List,Set ,TreeSet集合,Collections工具类

常见的数据结构种类

  1. 集合是基于数据结构做出来的,不同的集合底层会采用不同的数据结构。
  2. 不同的数据结构,功能和作用是不一样的。
  3. 数据结构:
    • 数据结构指的是数据以什么方式组织在一起。
    • 不同的数据结构,增删查的性能是不一样的。
    • 不同的集合底层会采用不同的数据结构,我们要知道集合的底层是基于哪种数据结构存储和操作数据的。这样才能知道具体场景用哪种集合。
  4. Java常见的数据结构即数据存储的常用结构:栈、队列、数组、链表和红黑树。
  5. a.队列(queue)
    • –先进先出,后进后出。
    • –场景:各种排队。叫号系统。
    • –有很多集合可以实现队列。
  6. b.栈(stack)
    • –后进先出,先进后出
    • – 压栈==入栈
    • – 弹栈 == 出栈
    • –场景:手枪的弹夹。
  7. c.数组
    • –数组是内存中的连续存储区域。
    • –分成若干等分的小区域(每个区域大小是一样的)
    • –元素存在索引
    • –特点:查询元素快(根据索引快速计算出元素的地址,然后立即去定位)
    • 增删元素慢(创建新数组,迁移元素)
  8. d.链表
    • –元素不是内存中的连续区域存储。
    • –元素是游离存储的。每个元素会记录下个元素的地址。
    • –特点:查询元素慢。
    • 增删元素快(针对于首尾元素,速度极快,一般是双链表)。
  9. e.红黑树(待看)
    1.
    2. 二叉树:binary tree永远只有一个根节点**,是每个结点不超过2个节点的树(tree) 。
    3. 查找二叉树,排序二叉树:小的左边,大的右边,但是可能树很高,性能变差。
    4. 为了做排序和搜索会进行左旋和右旋实现平衡查找二叉树,让树的高度差不大于
    1**。
    5. 红黑树(就是基于红黑规则实现了自平衡的排序二叉树):树尽量的保证到了很矮小,但是又排好序了,性能最高的树。
    6. 红黑树的增删查改性能都好。

ArrayList集合

  • List集合继承了Collection集合的全部功能,因为List集合多了索引,所以多了很多按照索引操作元素的功能。
  • ArrayList实现List集合底层基于数组存储数据的,查询快,增删慢!
  • public void add(int index, E element):将指定的元素,添加到该集合中的指定位置上。
  • public E get(int index):返回集合中指定位置的元素。
  • public E remove(int index):移除列表中指定位置的元素,返回的是被移除的元素。
  • public E set(int index, E element):用指定元素替换集合中指定位置的元素,返回更新前的元素值。
  • 四种遍历:多了for遍历,因为有索引。
  • 使用多态List<String> lists = new ArrayList<>();

LinkedList集合
  • LinkedList也是List的实现类:底层是基于链表的,增删比较快,查询慢!!
  • LinkedList是支持双链表,定位前后的元素是非常快的,增删首尾的元素也是最快的。
  • public void addFirst(E e):将指定元素插入此列表的开头。
  • public void addLast(E e):将指定元素添加到此列表的结尾。
  • public E getFirst():返回此列表的第一个元素。
  • public E getLast():返回此列表的最后一个元素。
  • public E removeFirst():移除并返回此列表的第一个元素。
  • public E removeLast():移除并返回此列表的最后一个元素。
  • public E pop():从此列表所表示的堆栈处弹出一个元素。
  • public void push(E e):将元素推入此列表所表示的堆栈。
  • 放弃多态,使用多态无法调用子类新功能LinkedList<String> linkList = new LinkedList<>();

Set系列集合
  • Set系列集合是基于哈希表存储数据的,它的增删改查的性能都很好。
  • 只有HashSet同父类Set一致都是无序,不重复,无索引的。
  • 使用多态Set<String> sets = new HashSet<>();
  • 两个问题:
    • Set集合添加的元素是不重复的,是如何去重复的?
      • 对于有值特性的,Set集合可以直接判断进行去重复。
      • 对于引用数据类型的类对象,Set集合是按照如下流程进行是否重复的判断。
        1. Set集合会让两两对象,先调用自己的hashCode()方法得到彼此的哈希值(所谓的内存地址)a1.hashCode());
        2. 然后比较两个对象的哈希值是否相同,如果不相同则直接认为两个对象不重复。
        3. 如果哈希值相同,会继续让两个对象进行equals比较内容是否相同,如果相同认为真的重复了
          如果不相同认为不重复。
        4. 如果希望Set集合认为两个对象只要内容一样就重复了,必须重写对象的hashCode和equals方法。这会使得相同内容的对象哈希值一致且equals比较内容相同。(直接生产即可)
    • Set集合元素无序的原因是什么?
      • 根本原因是因为底层采用了哈希表存储元素。63%6=3
      • JDK 1.8之前:哈希表 = 数组 + 链表 + (哈希算法)
      • JDK 1.8之后:哈希表 = 数组 + 链表 + 红黑树 + (哈希算法)
      • 当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。

LinkedHashSet
  • 是HashSet的子类,元素是**“有序”** 不重复,无索引。
  • LinkedHashSet底层依然是使用哈希表存储元素的,但是每个元素都额外带一个链来维护添加顺序!!不光增删查快,还有序。
  • 缺点是多了一个存储顺序的链会占内存空间!!而且不允许重复,无索引。
  • 总结:
    • 如果希望元素可以重复,又有索引,查询要快用ArrayList集合。(用的最多)
    • 如果希望元素可以重复,又有索引,增删要快要用LinkedList集合。(适合查询元素比较少的情况,经常要首尾操作元素的情况)
    • 如果希望增删改查都很快,但是元素不重复以及无序无索引,那么用HashSet集合。
    • 如果希望增删改查都很快且有序,但是元素不重复以及无索引,那么用LinkedHashSet集合。

TreeSet集合
  • 不重复,无索引,按照大小默认升序排序!!
  • TreeSet集合称为排序不重复集合,可以对元素进行默认的升序排序。
  • 使用多态,在Set基础上基本无新增功能 Set<Double> scores = new TreeSet<>();
  • TreeSet集合自自排序的方式:
    • 1.有值特性的元素直接可以升序排序。(浮点型,整型)
    • 2.字符串类型的元素会按照首字符的编号排序。
    • 3.对于自定义的引用数据类型,TreeSet默认无法排序,执行的时候直接报错,因为人家不知道排序规则。
  • 自定义的引用数据类型的排序实现:定制排序的大小规则
    • a.直接为对象的类实现比较器规则接口Comparable,重写比较方法(拓展方式)。

      • 如果程序员认为比较者大于被比较者 返回正数。
      • 如果程序员认为比较者小于被比较者 返回负数。
      • 如果程序员认为比较者等于被比较者 返回0。
      • @Data
        public class Employee implements Comparable<Employee> {private String name;private double salary;private int age;// 重写了比较方法。// e1.compareTo(o)// 比较者:this// 被比较者:o// 需求:按照年龄比较@Overridepublic int compareTo(Employee o) {// 规则:Java规则// 如果程序员认为比较者大于被比较者 返回正数!// 如果程序员认为比较者小于被比较者 返回负数!// 如果程序员认为比较者等于被比较者 返回0!
        //        if(this.age > o.age){
        //            return 1;
        //        }else if(this.age < o.age){
        //            return -1;
        //        }
        //        return 0;return this.age - o.age;}} 
        
    • b.直接为集合设置比较器Comparator对象,重写比较方法。

      • 如果程序员认为比较者大于被比较者 返回正数。
      • 如果程序员认为比较者小于被比较者 返回负数。
      • 如果程序员认为比较者等于被比较者 返回0。
      • 使用匿名内部类 public TreeSet(Comparator<? super E> comparator)
      • Set<Employee> employees1 = new TreeSet<>(new Comparator<Employee>() {@Overridepublic int compare(Employee o1, Employee o2) {// o1比较者   o2被比较者// 如果程序员认为比较者大于被比较者 返回正数!// 如果程序员认为比较者小于被比较者 返回负数!// 如果程序员认为比较者等于被比较者 返回0!return o1.getAge() - o2.getAge();}});
        
  • 注意:如果类和集合都带有比较规则,优先使用集合自带的比较规则。

Collections工具类的使用

  • java.utils.Collections:是集合工具类
  • Collections并不属于集合,是用来操作集合的工具类。
  • Collections有几个常用的API:
    • -public static boolean addAll(Collection<? super T> c, T… elements):给集合对象批量添加元素!
      • List<String> names = new ArrayList<>();
      • Collections.addAll(names, "曹操", "小亮", "小王");
    • - public static void shuffle(List<?> list) :打乱集合顺序,只能打乱有序的List集合。
    • - public static void sort(List list):将集合中元素按照默认规则排序,默认升序。
    • - public static void sort(List list,Comparator<? super T> ):将集合中元素按照指定规则排序。
  • Set是哈希算法存储的,无法为其排序和升序。
  • 引用数据类型的排序
    • 字符串按照首字符的编号升序排序!
    • 自定义类型的比较方法API
      • - public static void sort(List list):
        • 将集合中元素按照默认规则排序。对于自定义的引用类型的排序人家根本不知道怎么排,直接报错!
        • 如果希望自定义的引用类型排序不报错,可以给类提供比较规则:Comparable。
      • - public static void sort(List list,Comparator<? super T>
        • 将集合中元素按照指定规则排序,自带比较器
        • //方式1 自定义比较器
          Collections.sort(oranges1, new Comparator<Orange>() {@Overridepublic int compare(Orange o1, Orange o2) {if (o1.getWeight() > o2.getWeight()) return -1;if (o1.getWeight() < o2.getWeight()) return 1;return 0;}});
          
        • //方式2 类实现Comparable接口
          @Data
          public class Orange implements Comparable {private String name;private double weight;private String price;@Overridepublic int compareTo(Object o) {Orange o2 = (Orange) o;if (this.weight > o2.weight) return 1;if (this.weight < o2.weight) return -1;return 0;}
          }
          
        • 注意:如果类有比较规则,而sort有比较器,优先使用比较器。

可变参数

  • 可变参数用在形参中可以接收多个数据。
  • 可变参数的格式:数据类型… 参数名称 public static void sum(int... nums)
  • 可变参数的作用:
    • 传输参数非常灵活,方便。
    • 可以不传输参数。
    • 可以传输一个参数。
    • 可以传输多个参数。
    • 可以传输一个数组。
    • 可变参数在方法内部本质上就是一个数组。
  • 可变参数的注意事项:
    • 1.一个形参列表中可变参数只能有一个。
    • 2.可变参数必须放在形参列表的最后面。

ps:b站课程《黑马程序员Java13天进阶》根据官方笔记结合自身情况整理的笔记
视频链接

相关文章:

【java 13天进阶Day05】数据结构,List,Set ,TreeSet集合,Collections工具类

常见的数据结构种类 集合是基于数据结构做出来的&#xff0c;不同的集合底层会采用不同的数据结构。不同的数据结构&#xff0c;功能和作用是不一样的。数据结构&#xff1a; 数据结构指的是数据以什么方式组织在一起。不同的数据结构&#xff0c;增删查的性能是不一样的。不同…...

水污染治理(生物膜+机器学习)

文章目录 **1. 水质监测与污染预测****2. 植物-微生物群落优化****3. 系统设计与运行调控****4. 维护与风险预警****5. 社区参与与政策模拟****挑战与解决思路****未来趋势** 前言&#xff1a; 将机器学习&#xff08;ML&#xff09;等人工智能技术融入植树生物膜系统&#xff…...

Python人工智能 使用可视图方法转换时间序列为复杂网络

基于可视图方法的时间序列复杂网络转换实践 引言 在人工智能与数据科学领域&#xff0c;时间序列分析是一项基础且重要的技术。本文将介绍一种创新的时间序列分析方法——可视图方法&#xff0c;该方法能将时间序列转换为复杂网络&#xff0c;从而利用复杂网络理论进行更深入…...

spring:加载配置类

在前面的学习中&#xff0c;通过读取xml文件将类加载&#xff0c;或他通过xml扫描包&#xff0c;将包中的类加载。无论如何都需要通过读取xml才能够进行后续操作。 在此创建配置类。通过对配置类的读取替代xml的功能。 配置类就是Java类&#xff0c;有以下内容需要执行&#…...

使用Pydantic优雅处理几何数据结构 - 前端输入验证实践

使用Pydantic优雅处理几何数据结构 - 前端输入验证实践 一、应用场景解析 在视频分析类项目中&#xff0c;前端常需要传递几何坐标数据。例如智能安防系统中&#xff0c;需要接收&#xff1a; 视频流地址&#xff08;rtsp_video&#xff09;检测区域坐标点&#xff08;point…...

从零搭建一套前端开发环境

一、基础环境搭建 1.NVM(Node Version Manager)安装 简介 nvm&#xff08;Node Version Manager&#xff09; 是一个用于管理多个 Node.js 版本的工具&#xff0c;允许开发者在同一台机器上轻松安装、切换和使用不同版本的 Node.js。它特别适合需要同时维护多个项目&#xff…...

金融数据库转型实战读后感

荣幸收到老友太保科技有限公司数智研究院首席专家林春的签名赠书。 这是国内第一本关于OceanBase数据库实际替换过程总结的的实战书。打个比方可以说是从战场上下来分享战斗经验。读后感受颇深。我在这里讲讲我的感受。 第三章中提到的应用改造如何降本。应用改造是国产化替换…...

代码审计系列2:小众cms oldcms

目录 sql注入 1. admin/admin.php Login_check 2. admin/application/label/index.php 3. admin/application/hr/index.php 4. admin/application/feedback/index.php 5. admin/application/article/index.php​ sql注入 1. admin/admin.php Login_check 先看一下p…...

Cursor + MCP,实现自然语言操作 GitLab 仓库

本分分享如何使用 cursor mcp 来操作极狐GitLab 仓库&#xff0c;体验用自然语言在不接触极狐GitLab 的情况下来完成一些仓库操作。 极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitL…...

Vue el-from的el-form-item v-for循环表单如何校验rules(一)

实际业务需求场景&#xff1a; 新增或编辑页面&#xff08;基础信息表单&#xff0c;一个数据列表的表单&#xff09;&#xff0c;数据列表里面的表单数是动态添加的。数据可新增、可删除&#xff0c;在表单保存前&#xff0c;常常需要做表单必填项的校验&#xff0c;校验通过以…...

C#集合List<T>与HashSet<T>的区别

在C#中&#xff0c;List和HashSet都是用于存储元素的集合&#xff0c;但它们在内部实现、用途、性能特性以及使用场景上存在一些关键区别。 内部实现 List&#xff1a;基于数组实现的&#xff0c;可以包含重复的元素&#xff0c;并且元素是按照添加的顺序存储的。 HashSet&…...

【Reading Notes】(8.3)Favorite Articles from 2025 March

【March】 雷军一度登顶中国首富&#xff0c;太厉害了&#xff08;2025年03月02日&#xff09; 早盘&#xff0c;小米港股一路高歌猛进&#xff0c;暴涨4%&#xff0c;股价直接飙到52港元的历史新高。这一波猛如虎的操作&#xff0c;直接把雷军的身家拉到了2980亿元&#xff0c…...

Spring Boot 项目里设置默认国区时区,Jave中Date时区配置

在 Spring Boot 项目里设置国区时区&#xff08;也就是中国标准时间&#xff0c;即 Asia/Shanghai&#xff09;&#xff0c;可通过以下几种方式实现&#xff1a; 方式一&#xff1a;在application.properties或application.yml里设置 application.properties properties sp…...

从PDF到播客:MIT开发的超越NotebookLM的工具

NotebookLM是谷歌推出的更具创意的AI产品之一,几个月前刚刚推出。 许多人对它的能力感到惊叹——尤其是将长文本转化为两位播客主持人之间有趣对话的功能。 NotebookLM提供的不仅仅是这些,还包括聊天(问答)甚至生成思维导图。 如果你还没有尝试过NotebookLM,我强烈建议…...

Kotlin协程Semaphore withPermit约束并发任务数量

Kotlin协程Semaphore withPermit约束并发任务数量 import kotlinx.coroutines.* import kotlinx.coroutines.sync.Semaphore import kotlinx.coroutines.sync.withPermit import kotlinx.coroutines.launch import kotlinx.coroutines.runBlockingfun main() {val permits 1 /…...

Redis的下载安装和使用(超详细)

目录 一、所需的安装包资源小编放下述网盘了&#xff0c;提取码&#xff1a;wshf 二、双击打开文件redis.desktop.manager.exe 三、点击next后&#xff0c;再点击i agree 四、点击箭头指向&#xff0c;选择安装路径&#xff0c;然后点击Install进行安装 五、安装完后依次点…...

Springboot 学习 之 logback-spring.xml 日志打印

文章目录 1. property2. springProperty3. appender4. logger4.1. 通过包路径控制日志4.2. 通过类名控制日志4.3. 按自定义 Logger 名称控制日志 5. root6. springProfile SpringBoot 项目中可以通过自定义 logback-spring.xml 中各项配置&#xff0c;实现日志的打印控制 1. p…...

从游戏显卡到AI引擎:NVIDIA CUDA如何重构计算世界的底层逻辑

当GPU不再是"显卡" 2025年&#xff0c;当ChatGPT-5的万亿参数模型在0.1秒内完成推理时&#xff0c;人们很少意识到&#xff0c;支撑这场智能革命的不仅是算法突破&#xff0c;更是一场持续20年的架构革命。NVIDIA CUDA技术&#xff0c;这个最初被游戏玩家视为"…...

无线网络入侵检测系统实战 | 基于React+Python的可视化安全平台开发详解

随着无线网络的普及&#xff0c;网络攻击风险也日益严峻。本项目旨在构建一个实时监测、智能识别、高效防护的无线网络安全平台&#xff0c;通过结合前后端技术与安全算法&#xff0c;实现对常见攻击行为的有效监控和防御。 一、项目简介与功能目的 本系统是一款基于 React 前…...

前端 实现文字打字效果(仿AI)

DOM结构 <scroll-view class"scroll-view" scroll-y"true" :scroll-top"scrollTop" :style"{height: contentHeight px}"scroll-with-animation show-scrollbar"false" id"report-scroll-view"><view …...

C#核心(25)练手小项目:飞机大战

简介 通过核心部分的学习,我们已经可以做一些复杂的项目了。 我们这次会用我们学到的面向对象知识写一个飞机大战(性能可能不太好,因为毕竟是控制台项目) 如果你有所不懂,建议多查多思考多问。 因为这次的项目比较难,博主会稍微讲仔细一点。 基类设计:GameObject 抽…...

[经验总结]Linux双机双网卡Keepalived高可用配置及验证细节

1. 前言 这种配置需求比较少见&#xff0c;在网上也很少有相关文章&#xff0c;于是记录在此&#xff0c;供有需要的朋友参考。 本篇重点介绍配置的关键点&#xff0c;基础部分简单提及&#xff0c;不赘述。 2. 需求描述 如上图&#xff0c;即给两个主机配置两对高可用主从配…...

Go语言入门到入土——三、处理并返回异常

Go语言入门到入土——三、处理并返回异常 文章目录 Go语言入门到入土——三、处理并返回异常1. 在greetings.go中添加异常处理代码2. 在hello.go中添加日志记录代码3. 运行 1. 在greetings.go中添加异常处理代码 处理空输入的异常&#xff0c;代码如下&#xff1a; package g…...

2025.04.17【Dendrogram】生信数据可视化:Dendrogram图表详解

Dendrogram customization Go further with ggraph: edge style, general layout, node features, adding labels, and more. Customized circular dendrogram Learn how to build a circular dendrogram with proper labels. 文章目录 Dendrogram customizationCustomized c…...

Linux下的网络管理

一、ipv4原理 网络接口是指网络中的计算机或网络设备与其他设备实现通讯的进出口&#xff0c;一般是指计算机的网络接口即网卡设备 从RHEL7开始引入了一种新的“一致网络设备命名”的方式为网络接口命名&#xff0c;该方式可以根据固件、设备拓扑、设备类型和位置信息分配固…...

GPT-4o Image Generation Capabilities: An Empirical Study

GPT-4o 图像生成能力:一项实证研究 目录 介绍研究背景方法论文本到图像生成图像到图像转换图像到 3D 能力主要优势局限性与挑战对比性能影响与未来方向结论介绍 近年来,图像生成领域发生了巨大的变化,从生成对抗网络 (GAN) 发展到扩散模型,再到可以处理多种模态的统一生成架…...

Zookeeper介绍与安装配置

1.综述 1.1.Zookeeper介绍 Zookeeper 是一个分布式协调服务&#xff0c;由 Apache 开发&#xff0c;主要用于管理分布式应用中的配置信息、命名服务、分布式同步和组服务。它通过简单的接口提供高性能、高可用性和严格的顺序访问控制&#xff0c;广泛应用于分布式系统的协调与…...

提示词阶段总结

经过这些天的提示词学习&#xff0c;总结了一下提示词示例&#xff0c;可以直接拿来使用&#xff0c;规范大模型的输出。 CoT&#xff08;适用于算术题&#xff09; {问题}&#xff0c;让我们一步一步思考。 Auto-CoT&#xff08;自动思维链&#xff0c;适合回答多个问题一起…...

实验五 内存管理实验

实验五 内存管理实验 一、实验目的 1、了解操作系统动态分区存储管理过程和方法。 2、掌握动态分区存储管理的主要数据结构--空闲表区。 3、加深理解动态分区存储管理中内存的分配和回收。 4、掌握空闲区表中空闲区3种不同放置策略的基本思想和实现过程。 5、通过模拟程…...

用Webpack 基础配置快速搭建项目开发环境

Webpack 是一个现代 JavaScript 应用程序的静态模块打包工具&#xff0c;但是Webpack有大量的配置项&#xff0c;对新手不太友好&#xff0c;但是我们可以根据webpack-cli的init命令根据项目需求快速生成webpack的配置文件&#xff0c;本文将手把手教你如何用 Webpack 和 npm 快…...