【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)…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
挑战杯推荐项目
“人工智能”创意赛 - 智能艺术创作助手:借助大模型技术,开发能根据用户输入的主题、风格等要求,生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用,帮助艺术家和创意爱好者激发创意、提高创作效率。 - 个性化梦境…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...

iOS 26 携众系统重磅更新,但“苹果智能”仍与国行无缘
美国西海岸的夏天,再次被苹果点燃。一年一度的全球开发者大会 WWDC25 如期而至,这不仅是开发者的盛宴,更是全球数亿苹果用户翘首以盼的科技春晚。今年,苹果依旧为我们带来了全家桶式的系统更新,包括 iOS 26、iPadOS 26…...

剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
vue3 定时器-定义全局方法 vue+ts
1.创建ts文件 路径:src/utils/timer.ts 完整代码: import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...

基于 TAPD 进行项目管理
起因 自己写了个小工具,仓库用的Github。之前在用markdown进行需求管理,现在随着功能的增加,感觉有点难以管理了,所以用TAPD这个工具进行需求、Bug管理。 操作流程 注册 TAPD,需要提供一个企业名新建一个项目&#…...

Linux 内存管理实战精讲:核心原理与面试常考点全解析
Linux 内存管理实战精讲:核心原理与面试常考点全解析 Linux 内核内存管理是系统设计中最复杂但也最核心的模块之一。它不仅支撑着虚拟内存机制、物理内存分配、进程隔离与资源复用,还直接决定系统运行的性能与稳定性。无论你是嵌入式开发者、内核调试工…...