【Java基础】023 -- 集合进阶(List、Set、泛型、树)

目录
一、集合的体系结构
1、单列集合(Collection)
二、Collection集合
1、Collection常见方法
①、代码实现:
②、contains方法重写equals方法示例:(idea可自动重写)
2、Collection的遍历方式(3种)
①、迭代器遍历
②、增强for遍历
③、Lambda表达式遍历
3、小结
三、List集合
1、List集合特有的方法(操作索引的4个方法)
2、List集合的遍历方式(5种)
①、示例代码
②、小结
四、数据结构(常见有8种)
1、什么是数据结构呢?
2、数据结构概述
3、栈(后进先出,先进后出)
4、队列(先进先出,后进后出)
5、栈与队列小结
6、数组
7、链表(与数组相对)
小结
五、ArrayList集合
1、ArrayList集合底层原理
2、ArrayList源码分析
六、LinkedList集合
1、LinkedList特有方法
2、LinkedList源码分析
3、迭代器的底层源码
七、泛型深入
1、没有泛型时的集合如何存储数据?
2、泛型的好处
3、知识点:Java中的泛型是伪泛型
4、泛型的细节
5、泛型可以在很多地方进行定义
①、泛型类
②、泛型方法
③、泛型接口
6、泛型的继承和通配符
①、泛型的继承示例代码
②、泛型的通配符练习
7、小结
八、树(Tree)
1、集合起名的艺术
2、树的基本结构
3、二叉树
4、二叉查找树
①、添加节点
②、查找节点
③、二叉查找树的弊端
5、二叉树的遍历方式
①、前序遍历(根、左、右)
②、中序遍历(左、根、右)
③、后序遍历(左、右、根)
④、层序遍历(一层一层遍历)
⑤、小结
6、平衡二叉树
①、平衡二叉树的旋转机制
②、左旋
③、右旋
④、平衡二叉树需要旋转的四种情况(左左、左右、右右、右左)
⑤、小结
7、树的演变
8、红黑树(一种特殊的二叉查找树,而不是平衡二叉树)【★★】
①、红黑树的红黑规则
②、红黑树添加节点的规则
③、小结(能看懂即可)
九、Set系列集合
1、练习:利用Set系列的集合,添加字符串,并使用多种方式遍历
①、示例代码
②、小结
2、HashSet底层原理
①、哈希值
②、对象的哈希值特点
3、HashSet JDK8 以前的底层原理
①、HashSet完整创建过程
②、HashSet创建的细节
4、HashSet的三个问题
①、HashSet为什么存和取的顺序不一样?
②、HashSet为什么没有索引?
③、HashSet是利用什么机制保证数据去重的?
④、问题回答
5、练习:利用HashSet集合去除重复元素
十、LinkedHashSet
1、LinkedHashSet底层原理
①、示例代码:(LinkedHashSet可以保证数据的存储顺序)
②、小结
十一、TreeSet(自动排序)
1、TreeSet的基本应用
①、TreeSet的特点
②、练习:利用TreeSet存储整数并进行排序
2、TreeSet集合默认的规则
①、TreeSet对象排序练习题
②、示例代码理解
3、TreeSet的两种比较方式
①、方式一:JavaBean类实现Comparable接口指定比较规则
②、方式二:比较器排序,创建TreeSet对象时,传递比较器Comparator指定规则
③、扩展:TreeSet对象排序练习题
4、小结
5、Set集合源码分析
①、HashSet
②、LinkedHashSet
③、TreeSet
十二、集合的使用场景
一、集合的体系结构

1、单列集合(Collection)


二、Collection集合
1、Collection常见方法

①、代码实现:



②、contains方法重写equals方法示例:(idea可自动重写)



2、Collection的遍历方式(3种)

①、迭代器遍历


示例:

循环遍历:

示例代码:(不依赖索引,而是通过指针移动的方式)

迭代器书写的小细节:


示例代码:



小结:

②、增强for遍历

示例代码:

增强for的细节:

③、Lambda表达式遍历

示例代码:

Lambda表达式形式:

3、小结

三、List集合

1、List集合特有的方法(操作索引的4个方法)

示例代码:

add方法:

remove方法:

List删除的小细节:

set & get方法:

2、List集合的遍历方式(5种)

①、示例代码
1、迭代器遍历:

2、增强for:

3、Lambda表达式

4、普通for循环

5、列表迭代器(ListIterator,继承于Iterator)

但迭代器默认指向0索引,想要使用previous方法需要先移动到后面

②、小结

四、数据结构(常见有8种)
1、什么是数据结构呢?
数据结构就是计算机存储、组织数据的方式


2、数据结构概述


3、栈(后进先出,先进后出)

栈内存:

4、队列(先进先出,后进后出)


5、栈与队列小结


6、数组

7、链表(与数组相对)


双向链表可以提高查询效率:

小结

五、ArrayList集合

1、ArrayList集合底层原理

2、ArrayList源码分析
idea快捷键:Alt+7:列出方法大纲
添加的数据长度不超过10:

一次添加多个,超过10,但不超过15:

六、LinkedList集合

1、LinkedList特有方法

2、LinkedList源码分析

3、迭代器的底层源码

modCount:集合变化的次数
expectedModCount:创建对象时,传递过来的次数




七、泛型深入

1、没有泛型时的集合如何存储数据?
没有泛型时,集合可以添加任意类型的值,但其弊端也很明显,不能访问子类特有的功能


泛型规范修改:

2、泛型的好处

3、知识点:Java中的泛型是伪泛型

4、泛型的细节

5、泛型可以在很多地方进行定义

①、泛型类


示例代码:


转成Integer:

②、泛型方法



练习:

代码实现:

可变参数改进代码:(即 类型… 变量名)

测试类:

③、泛型接口

方式1:实现类给出具体方法


方式2:实现类延续泛型,创建对象时再确定

![]()
6、泛型的继承和通配符

①、泛型的继承示例代码

②、泛型的通配符练习


练习:

示例代码:


7、小结


八、树(Tree)
1、集合起名的艺术

2、树的基本结构

一个树节点的基本结构:


3、二叉树

但数据没什么规则

4、二叉查找树

①、添加节点

②、查找节点

③、二叉查找树的弊端
为了避免长短腿的出现,就出现了平衡二叉树

5、二叉树的遍历方式

①、前序遍历(根、左、右)

②、中序遍历(左、根、右)

③、后序遍历(左、右、根)

④、层序遍历(一层一层遍历)

⑤、小结




6、平衡二叉树

①、平衡二叉树的旋转机制

②、左旋

当根节点是支点时:


③、右旋
普通情况:


当根节点是支点时:


④、平衡二叉树需要旋转的四种情况(左左、左右、右右、右左)

左左:(一次右旋)


左右:(先局部左旋,再整体右旋)


右右:(一次左旋)


右左:(先局部右旋,再整体左旋)

⑤、小结

1、在平衡二叉树中,如何添加节点?
A:大的存右边,小的存左边,相等的不存
2、如何查找单个节点?
A:从根节点开始查找,然后逐个比较
3、为什么要旋转?
A:只有平衡二叉树和红黑树才需要旋转;旋转的原因就是在添加一个节点后,导致这个树不平衡了,那么就需要通过旋转让它重新平衡
4、旋转的触发时机?
A:树不平衡了
5、左左是什么意思?
![]()
6、左右是什么意思?

7、右右是什么意思?

8、右左是什么意思?

7、树的演变

8、红黑树(一种特殊的二叉查找树,而不是平衡二叉树)【★★】

平衡二叉树也有一些弊端:在添加节点是时候,由于旋转次数太多,会导致添加节点的时间浪费。

①、红黑树的红黑规则
简单路径:只能往前,不能回头,eg:13 -> 8 -> 1 -> Nil
Nil本身实际上是没有什么含义的,就是在第5条的规则上,要用到它来统计个数的

②、红黑树添加节点的规则

如果默认节点颜色为黑色,那么添加三个节点,需要调整两次

如果默认节点颜色为红色,那么添加三个节点,只需要调整一次


添加节点示例:


③、小结(能看懂即可)


九、Set系列集合

无序:存取顺序不一致
不重复:可以去除重复
无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素


1、练习:利用Set系列的集合,添加字符串,并使用多种方式遍历

①、示例代码

多种方式遍历:

②、小结

2、HashSet底层原理

①、哈希值



②、对象的哈希值特点
因为地址不同



示例代码:

重写hashCode()方法后:


哈希碰撞情况:

3、HashSet JDK8 以前的底层原理

①、HashSet完整创建过程
当我们在创建一个HashSet对象时,在底层会创建一个默认长度为16,默认加载因子为0.75的数组:

②、HashSet创建的细节

4、HashSet的三个问题

①、HashSet为什么存和取的顺序不一样?

HashSet在遍历的时候,是从数组的0索引开始,一条链表,一条链表的查询
但是黄色小球就是第一个被存入的吗?不见得吧!
②、HashSet为什么没有索引?

主要原因是因为HashSet不够纯粹,底层是由数组+链表+红黑树构成的,所以不好规定以谁为索引
③、HashSet是利用什么机制保证数据去重的?

切记:如果HashSet中存储的是自定义对象,那么一定要重写HashCode和equals方法
④、问题回答

5、练习:利用HashSet集合去除重复元素

示例代码:
在JavaBean中重写hashCode和equals方法



十、LinkedHashSet

1、LinkedHashSet底层原理

①、示例代码:(LinkedHashSet可以保证数据的存储顺序)


②、小结

十一、TreeSet(自动排序)
1、TreeSet的基本应用
①、TreeSet的特点

②、练习:利用TreeSet存储整数并进行排序
直接打印:


遍历集合:

2、TreeSet集合默认的规则

字符串比较:

①、TreeSet对象排序练习题

示例代码:
JavaBean:Student.java
测试类:

运行程序结构报错了:因为JavaBean是我们自己写的,并没有给它添加一个默认的比较规则,所以TreeSet也不知道应该怎么比

②、示例代码理解
图解:

代码理解:


3、TreeSet的两种比较方式
![]() |
①、方式一:JavaBean类实现Comparable接口指定比较规则



②、方式二:比较器排序,创建TreeSet对象时,传递比较器Comparator指定规则
示例:

因为是String类型,源码中已经定义了排序规则:即以ASCII表升序排序
所以我们就需要使用比较器,重写比较方法

改成lambda表达式:

③、扩展:TreeSet对象排序练习题

idea快捷键:
- Ctrl + D :向下复制一行
示例代码:
JavaBean:Student.java
测试类:
默认排序情况:JavaBean实现Comparable接口,重现CompareTo方法

课堂练习:

在重写方法中加入System.out.println();语句即可
4、小结
如果方式一和方式二同时存在,那么实际上我们以方式二为准


5、Set集合源码分析
①、HashSet

HashSet其实是new了一个HashMap
②、LinkedHashSet

LinkedHashSet其实是new了一个LinkedHashMap
③、TreeSet

new了一个TreeMap
十二、集合的使用场景

相关文章:
【Java基础】023 -- 集合进阶(List、Set、泛型、树)
目录 一、集合的体系结构 1、单列集合(Collection) 二、Collection集合 1、Collection常见方法 ①、代码实现: ②、contains方法重写equals方法示例:(idea可自动重写) 2、Collection的遍历方式(…...
面试题整理01-集合详解
文章目录前言一、集合的整体结构单列集合接口:双列集合接口:二、单列集合详解1.List接口1.1 ArrayList集合特点:扩容:添加元素遍历1.2 LinkedList集合特点:添加元素:2.Set接口2.1 HashSet集合特点ÿ…...
数据驱动的两阶段分布鲁棒(1-范数和∞-范数约束)的电热综合能源系统研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
ArcGIS网络分析之发布网络分析服务(二)
在上一篇中讲述了如何构建网络分析数据集,本篇将讲解如何发布网络分析服务。本文将使用上一篇中建立的网络数据集,下载地址在上一篇博文的最后已给出。 之前我们已经实现了基于ArcMap中的网络分析,但是仅仅支持本地是万万不够的,这里我们的目的就是将我们建好的网络分析图…...
js实现元素样式切换的基本功能
需求:用户第一次点击某些元素,改变元素的某些样式,比如背景颜色,字体颜色。用户第二次点击某些元素,恢复之前的样式。.....思路:准备一定量的div盒子,并取相同的类名<div class"box&quo…...
java 策略模式 + 工厂模式 实例
一 前言 经常听说各种设计模式,知道理论,也知道应该使用,但具体怎么用,什么时候用,使用的优点一直比较模糊,今天写一个项目中经常用到的模式,来具体理解。项目中经常用到工厂模式或者策略模式&…...
本地生成动漫风格 AI 绘画 图像|Stable Diffusion WebUI 的安装和部署教程
Stable Diffusion WebUI 的安装和部署教程1. 简介2. Windows安装环境3. 运行4. 模型下载链接5. 其他资源1. 简介 先放一张WebUI的图片生成效果图,以给大家学习的动力 :) 怎么样,有没有小小的心动?这里再补充一下&…...
华为OD机试 - 异常的打卡记录 | 备考思路,刷题要点,答疑 【新解法】
最近更新的博客 【新解法】华为OD机试 - 关联子串 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 停车场最大距离 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 任务调度 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试…...
「机器学习笔记」之深度学习基础概念(基于Pytorch)
本文以 Pytorch 为线索,介绍人工智能和深度学习相关的一些术语、概念。 关于发展历史您也可以阅读深度学习神经网络之父 Jrgen Schmidhuber 所写的《Annotated History of Modern AI and Deep Learning(现代人工智能和深度学习的注释版历史)…...
概率和似然
在日常生活中,我们经常使用这些术语。但是在统计学和机器学习上下文中使用时,有一个本质的区别。本文将用理论和例子来解释概率和似然之间的关键区别。 概率与似然 假设在一场棒球比赛中,两队的队长都被召集到场上掷硬币。获胜的队长将根据掷…...
前期软件项目评估偏差,如何有效处理?
1、重新评估制定延期计划 需要对项目进行重新评估,将新的评估方案提交项目干系人会议,开会协商一致后按照新的讨论结果制定计划,并实施执行。 软件项目评估偏差 怎么办:重新评估制定延期计划2、申请加资源 如果项目客户要求严格&a…...
Xline v0.2.0: 一个用于元数据管理的分布式KV存储
Xline是什么?我们为什么要做Xline? Xline是一个基于Curp协议的,用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议,需要两次RTT才能完成一次请求。当部署在单个数据中心时,节点之间的延迟较低&a…...
CompletableFuture
一、一个示例回顾Future 一些业务场景我们需要使用多线程异步执行任务,加快任务执行速度。JDK5新增了Future接口,用于描述一个异步计算的结果。虽然Future以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,我们必须使用Future.get()的方式阻塞调…...
面试不到10分钟就被赶出来了,问的实在是太变态了...
干了两年外包,本来想出来正儿八经找个互联网公司上班,没想到算法死在另一家厂子。 自从加入这家外包公司,每天都在加班,钱倒是给的不少,所以也就忍了。没想到11月一纸通知,所有人不许加班,薪资…...
【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化
前言 本章就是我们C中类与对象的终章了,不过本章的难度不大,都是类中一些边边角角的知识,记忆理解就行了,相信经过这么长时间的学习类与对象,你对面向对象也有了更加深的理解,最后我们学习完边边角角的一些…...
04:进阶篇 - 编译 CTK
作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在使用 CTK 之前,首先要进行编译。但要成功编译它,并不是一件很容易的事,这不仅取决于平台、Qt 的版本,也取决于编译器,以及所使用的 IDE。 平台(Linux、Windows)Qt 版本(4.x、5.x、6.x)编译器(MS…...
SQL73 返回所有价格在 3美元到 6美元之间的产品的名称和价格
描述有表Productsprod_idprod_nameprod_pricea0011egg3a0019sockets4b0019coffee15【问题】编写 SQL 语句,返回所有价格在 3美元到 6美元之间的产品的名称(prod_name)和价格(prod_price),使用 AND操作符&am…...
【Linux 多线程互斥】如何保证锁的原子性(互斥的原理)
临界资源:可以被多个执行流(线程或者叫轻量级进程)同是访问的(多个执行流共享的,比如:全局、堆等等);临界区:访问这些临界资源的代码;原子性:没有中间态&…...
Android 实现沉浸式全屏
前言 本文总结 Android 实现沉浸式全屏的实现方式。 实现沉浸式全屏 在一些需要全屏显示的场景下,比如玩游戏、看横屏视频的时候,内容全屏,占满窗口的体验会让用户更加沉浸到对内容的消费中,带来好的用户体验。 沉浸式显示具体来说就是如状态栏和导航栏部分的显示效果调…...
数据分析与SAS学习笔记6
数据集整理: 目的:对数据集中的数据进行预处理,使数据更适合统计分析过程对数据格式的要求; 常见整理要求: 1)建立新的变量,衍生变量,删除某些原变量; 2)…...
超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...
脑机新手指南(八):OpenBCI_GUI:从环境搭建到数据可视化(下)
一、数据处理与分析实战 (一)实时滤波与参数调整 基础滤波操作 60Hz 工频滤波:勾选界面右侧 “60Hz” 复选框,可有效抑制电网干扰(适用于北美地区,欧洲用户可调整为 50Hz)。 平滑处理&…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
Caliper 配置文件解析:fisco-bcos.json
config.yaml 文件 config.yaml 是 Caliper 的主配置文件,通常包含以下内容: test:name: fisco-bcos-test # 测试名称description: Performance test of FISCO-BCOS # 测试描述workers:type: local # 工作进程类型number: 5 # 工作进程数量monitor:type: - docker- pro…...
Bean 作用域有哪些?如何答出技术深度?
导语: Spring 面试绕不开 Bean 的作用域问题,这是面试官考察候选人对 Spring 框架理解深度的常见方式。本文将围绕“Spring 中的 Bean 作用域”展开,结合典型面试题及实战场景,帮你厘清重点,打破模板式回答,…...
【无标题】湖北理元理律师事务所:债务优化中的生活保障与法律平衡之道
文/法律实务观察组 在债务重组领域,专业机构的核心价值不仅在于减轻债务数字,更在于帮助债务人在履行义务的同时维持基本生活尊严。湖北理元理律师事务所的服务实践表明,合法债务优化需同步实现三重平衡: 法律刚性(债…...

