【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天进阶》根据官方笔记结合自身情况整理的笔记
视频链接

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

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

相关文章

systemctl管理指令

今天我们来继续学习服务管理指令,接下来才是重头戏-systemctl,那么话不多说,直接开始吧. systemctl管理指令 1.基本语法: systemctl [start | stop | restart | status]服务 注&#xff1a;systemctl指令管理的服务在/usr/lib/ systemd/system查看 2.systemctl设置服务的自…

STM32单片机教程:从零开始打造智能天气时钟

STM32单片机教程&#xff1a;从零开始打造智能天气时钟 大家好&#xff01;今天我想为大家详细介绍一下我们的STM32课程&#xff0c;以及如何从零基础逐步掌握单片机开发技能&#xff0c;最终实现一个完整的智能天气时钟项目。 课程面向人群 本课程主要面向那些已经通过野火…

Neovim插件深度解析:mcphub.nvim如何用MCP协议重构开发体验

在AI与工具链深度融合的今天,Neovim 作为现代开发者的生产力工具,正通过插件生态不断突破边界。mcphub.nvim 作为一款基于 MCP(Model Context Protocol) 协议的插件,重新定义了Neovim与智能工具的交互方式。它不仅简化了MCP服务器的集成与管理,更通过直观的UI和生态整合,…

第33讲|遥感大模型在地学分类中的初探与实战

目录 🧠 一、什么是“遥感大模型”? 📚 二、遥感大模型在地学分类中的优势 📍三、案例:使用 Segment Anything Model (SAM) 进行遥感地物分割 📦 1. 安装与依赖配置(PyTorch) 🖼 2. 读取遥感图像(可用 Sentinel-2 伪彩色图) 🔧 3. SAM 模型载入 💡 …

MATLAB - 小车倒立摆的非线性模型预测控制(NMPC)

系列文章目录 目录 系列文章目录 前言 一、摆锤/小车组件 二、系统方程 三、控制目标 四、控制结构 五、创建非线性 MPC 控制器 六、指定非线性设备模型 七、定义成本和约束 八、验证非线性 MPC 控制器 九、状态估计 十、MATLAB 中的闭环仿真 十一、使用 MATLAB 中…

JAVA文件I/O

目录 一、三种路径的分类&#xff1a; 1、绝对路径&#xff1a; 2、相对路径&#xff1a; 3、基准目录&#xff1a; 二、文件的种类&#xff1a; 三、利用JAVA操作文件&#xff1a; 1、File类的构造方法&#xff1a; 2、File 类方法的使用&#xff1a; 使用例子&#…

焊接机器人的设计

一、引言 随着制造业的发展&#xff0c;焊接工艺在各个领域得到广泛应用。焊接机器人具有焊接质量高、效率高、劳动强度低等优点&#xff0c;能够满足现代制造业对焊接生产的要求。设计一款性能优良的焊接机器人&#xff0c;对于提高焊接生产的自动化水平和产品质量具有重要意…

Thymeleaf简介

在Java中&#xff0c;模板引擎可以帮助生成文本输出。常见的模板引擎包括FreeMarker、Velocity和Thymeleaf等 Thymeleaf是一个适用于Web和独立环境的现代服务器端Java模板引擎。 Thymeleaf 和 JSP比较&#xff1a; Thymeleaf目前所作的工作和JSP有相似之处&#xff0c;Thyme…

(论文阅读)RNNoise 基于递归神经网络的噪声抑制库

RNNoise 是一个基于递归神经网络的噪声抑制库。 有关该算法的描述见以下论文&#xff1a; J.-M. Valin, A Hybrid DSP/Deep Learning Approach to Real-Time Full-Band Speech Enhancement, Proceedings of IEEE Multimedia Signal Processing (MMSP) Workshop, arXiv:1709.08…

DevOps-文章目录

01什么是DevOps 02DevOps基础环境准备 03-DevOps-安装并初始化Gitlab 04-DevOps-安装并初始化Jenkins 05-DevOps-Jenkins自动拉取构建代码1 05-DevOps-Jenkins自动拉取构建代码2 06-DevOps-自动构建Docker镜像 07-DevOps-安装部署Harbor镜像仓库 08-DevOps-向Harbor上传自定义镜…

UML 状态图:以网络媒体教学系统为例解析

目录 一、系统概述 二、状态图分析 &#xff08;一&#xff09;登录认证模块 &#xff08;二&#xff09;课程选择模块 &#xff08;三&#xff09;视频播放模块 &#xff08;四&#xff09;退出登录状态 三、UML状态图绘画 四、总结 UML状态图是一种行为图&#xff0c…

交易模式革新:Eagle Trader APP上线,助力自营交易考试效率提升

近年来&#xff0c;金融行业随着投资者需求的日益多样化&#xff0c;衍生出了众多不同的交易方式。例如&#xff0c;为了帮助新手小白建立交易基础&#xff0c;诞生了各类跟单社区&#xff1b;而与此同时&#xff0c;一种备受瞩目的交易方式 —— 自营交易模式&#xff0c;正吸…

Elasticsearch BBQ 与 OpenSearch FAISS:向量搜索性能对比

作者&#xff1a;来自 Elastic Ugo Sangiorgi Elasticsearch BBQ 与 OpenSearch FAISS 的性能对比。 带有二值量化的向量搜索&#xff1a;使用 BBQ 的 Elasticsearch 比使用 FAISS 的 OpenSearch 快 5 倍。Elastic 收到了来自社区的请求&#xff0c;希望澄清 Elasticsearch 与 …

Vue 3.4 新特性详解:Composition API 与 Effect 作用域 API 实战

一、Vue 3.4 核心特性概览 Vue 3.4 代号「🏀 Slam Dunk」,带来多项关键升级: 模板解析器性能翻倍:单文件组件(SFC)构建效率提升 44%,解析速度提升 2 倍。响应式系统优化:计算属性和 watchEffect 触发更精准,减少无效渲染。Effect 作用域 API 稳定:通过 effectScope…

【day8】调用AI接口,生成自动化测试用例

1、项目结构建议 project/ ├── api_docs/ # 存放接口文档 │ └── XX系统.swagger.json ├── ai_generator/ # AI测试用例生成模块 │ └── test_case_generator.py ├── tests/ # 生成的测试用例 │ └── test_user_api.py ├── conftest.py # pytest配置 ├─…

React应用开发学习指南

AI生成研究报告&#xff1a;关键词 React应用开发 React 已经成为前端 Web 开发领域的主导力量&#xff0c;它是一个免费且开源的 JavaScript 库&#xff0c;主要用于构建用户界面 (UI) 1。其多功能性延伸到为 Web 和原生应用程序创建 UI&#xff0c;使其成为行业内备受追捧的…

MSTP+VRRP+DHCP(ENSP)

下载链接 通过网盘分享的文件&#xff1a;MSTPVRRPDHCP拓扑图 链接: https://pan.baidu.com/s/1ehRwRQ-WzKC8PsUHsTe70Q?pwd345d 提取码: 345d PC1 PC2 PC5 AR1 为AR1各端口配置IP地址 <Huawei>sys [Huawei]un in en [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/…

第一个Qt开发的OpenCV程序

OpenCV计算机视觉开发实践&#xff1a;基于Qt C - 商品搜索 - 京东 下载安装Qt&#xff1a;https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-windows-x86-5.14.2.exe 下载安装OpenCV&#xff1a;https://opencv.org/releases/ 下载安装CMake&#xff1a;Downl…

深入解析 Python 中的装饰器 —— 从基础到实战

1. 装饰器基础 1.1 什么是装饰器&#xff1f; 装饰器本质上是一个 Python 函数&#xff0c;它可以让其他函数在不需要做任何代码变动的前提下增加额外功能。装饰器的返回值也是一个函数对象。 1.2 语法糖&#xff1a; 符号 Python 提供了 符号作为装饰器的语法糖&#xff0c…

研究生面试常见问题

研究生面试是考研复试的重要环节&#xff0c;面试表现直接关系到录取结果。以下从面试流程、常见问题分类及回答技巧等方面为您整理了相关内容&#xff0c;帮助您更好地准备面试。 一、研究生面试的基本流程 自我介绍&#xff1a;通常需要准备1分钟左右的中文或英文自我介绍&a…