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

【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集合特点&#xff…...

数据驱动的两阶段分布鲁棒(1-范数和∞-范数约束)的电热综合能源系统研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

ArcGIS网络分析之发布网络分析服务(二)

在上一篇中讲述了如何构建网络分析数据集,本篇将讲解如何发布网络分析服务。本文将使用上一篇中建立的网络数据集,下载地址在上一篇博文的最后已给出。 之前我们已经实现了基于ArcMap中的网络分析,但是仅仅支持本地是万万不够的,这里我们的目的就是将我们建好的网络分析图…...

js实现元素样式切换的基本功能

需求&#xff1a;用户第一次点击某些元素&#xff0c;改变元素的某些样式&#xff0c;比如背景颜色&#xff0c;字体颜色。用户第二次点击某些元素&#xff0c;恢复之前的样式。.....思路&#xff1a;准备一定量的div盒子&#xff0c;并取相同的类名<div class"box&quo…...

java 策略模式 + 工厂模式 实例

一 前言 经常听说各种设计模式&#xff0c;知道理论&#xff0c;也知道应该使用&#xff0c;但具体怎么用&#xff0c;什么时候用&#xff0c;使用的优点一直比较模糊&#xff0c;今天写一个项目中经常用到的模式&#xff0c;来具体理解。项目中经常用到工厂模式或者策略模式&…...

本地生成动漫风格 AI 绘画 图像|Stable Diffusion WebUI 的安装和部署教程

Stable Diffusion WebUI 的安装和部署教程1. 简介2. Windows安装环境3. 运行4. 模型下载链接5. 其他资源1. 简介 先放一张WebUI的图片生成效果图&#xff0c;以给大家学习的动力 &#xff1a;&#xff09; 怎么样&#xff0c;有没有小小的心动&#xff1f;这里再补充一下&…...

华为OD机试 - 异常的打卡记录 | 备考思路,刷题要点,答疑 【新解法】

最近更新的博客 【新解法】华为OD机试 - 关联子串 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 停车场最大距离 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试 - 任务调度 | 备考思路,刷题要点,答疑,od Base 提供【新解法】华为OD机试…...

「机器学习笔记」之深度学习基础概念(基于Pytorch)

本文以 Pytorch 为线索&#xff0c;介绍人工智能和深度学习相关的一些术语、概念。 关于发展历史您也可以阅读深度学习神经网络之父 Jrgen Schmidhuber 所写的《Annotated History of Modern AI and Deep Learning&#xff08;现代人工智能和深度学习的注释版历史&#xff09;…...

概率和似然

在日常生活中&#xff0c;我们经常使用这些术语。但是在统计学和机器学习上下文中使用时&#xff0c;有一个本质的区别。本文将用理论和例子来解释概率和似然之间的关键区别。 概率与似然 假设在一场棒球比赛中&#xff0c;两队的队长都被召集到场上掷硬币。获胜的队长将根据掷…...

前期软件项目评估偏差,如何有效处理?

1、重新评估制定延期计划 需要对项目进行重新评估&#xff0c;将新的评估方案提交项目干系人会议&#xff0c;开会协商一致后按照新的讨论结果制定计划&#xff0c;并实施执行。 软件项目评估偏差 怎么办&#xff1a;重新评估制定延期计划2、申请加资源 如果项目客户要求严格&a…...

Xline v0.2.0: 一个用于元数据管理的分布式KV存储

Xline是什么&#xff1f;我们为什么要做Xline&#xff1f; Xline是一个基于Curp协议的&#xff0c;用于管理元数据的分布式KV存储。现有的分布式KV存储大多采用Raft共识协议&#xff0c;需要两次RTT才能完成一次请求。当部署在单个数据中心时&#xff0c;节点之间的延迟较低&a…...

CompletableFuture

一、一个示例回顾Future 一些业务场景我们需要使用多线程异步执行任务,加快任务执行速度。JDK5新增了Future接口,用于描述一个异步计算的结果。虽然Future以及相关使用方法提供了异步执行任务的能力,但是对于结果的获取却是很不方便,我们必须使用Future.get()的方式阻塞调…...

面试不到10分钟就被赶出来了,问的实在是太变态了...

干了两年外包&#xff0c;本来想出来正儿八经找个互联网公司上班&#xff0c;没想到算法死在另一家厂子。 自从加入这家外包公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到11月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资…...

【C++】类与对象 (四)初始化列表 static成员 友元 内部类 匿名对象 拷贝对象时的一些编译器优化

前言 本章就是我们C中类与对象的终章了&#xff0c;不过本章的难度不大&#xff0c;都是类中一些边边角角的知识&#xff0c;记忆理解就行了&#xff0c;相信经过这么长时间的学习类与对象&#xff0c;你对面向对象也有了更加深的理解&#xff0c;最后我们学习完边边角角的一些…...

04:进阶篇 - 编译 CTK

作者: 一去、二三里 个人微信号: iwaleon 微信公众号: 高效程序员 在使用 CTK 之前,首先要进行编译。但要成功编译它,并不是一件很容易的事,这不仅取决于平台、Qt 的版本,也取决于编译器,以及所使用的 IDE。 平台(Linux、Windows)Qt 版本(4.x、5.x、6.x)编译器(MS…...

SQL73 返回所有价格在 3美元到 6美元之间的产品的名称和价格

描述有表Productsprod_idprod_nameprod_pricea0011egg3a0019sockets4b0019coffee15【问题】编写 SQL 语句&#xff0c;返回所有价格在 3美元到 6美元之间的产品的名称&#xff08;prod_name&#xff09;和价格&#xff08;prod_price&#xff09;&#xff0c;使用 AND操作符&am…...

【Linux 多线程互斥】如何保证锁的原子性(互斥的原理)

临界资源:可以被多个执行流&#xff08;线程或者叫轻量级进程&#xff09;同是访问的&#xff08;多个执行流共享的&#xff0c;比如&#xff1a;全局、堆等等&#xff09;&#xff1b;临界区&#xff1a;访问这些临界资源的代码&#xff1b;原子性&#xff1a;没有中间态&…...

Android 实现沉浸式全屏

前言 本文总结 Android 实现沉浸式全屏的实现方式。 实现沉浸式全屏 在一些需要全屏显示的场景下,比如玩游戏、看横屏视频的时候,内容全屏,占满窗口的体验会让用户更加沉浸到对内容的消费中,带来好的用户体验。 沉浸式显示具体来说就是如状态栏和导航栏部分的显示效果调…...

数据分析与SAS学习笔记6

数据集整理&#xff1a; 目的&#xff1a;对数据集中的数据进行预处理&#xff0c;使数据更适合统计分析过程对数据格式的要求&#xff1b; 常见整理要求&#xff1a; 1&#xff09;建立新的变量&#xff0c;衍生变量&#xff0c;删除某些原变量&#xff1b; 2&#xff09;…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI

前一阵子在百度 AI 开发者大会上&#xff0c;看到基于小智 AI DIY 玩具的演示&#xff0c;感觉有点意思&#xff0c;想着自己也来试试。 如果只是想烧录现成的固件&#xff0c;乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外&#xff0c;还提供了基于网页版的 ESP LA…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

A2A JS SDK 完整教程:快速入门指南

目录 什么是 A2A JS SDK?A2A JS 安装与设置A2A JS 核心概念创建你的第一个 A2A JS 代理A2A JS 服务端开发A2A JS 客户端使用A2A JS 高级特性A2A JS 最佳实践A2A JS 故障排除 什么是 A2A JS SDK? A2A JS SDK 是一个专为 JavaScript/TypeScript 开发者设计的强大库&#xff…...

Python Einops库:深度学习中的张量操作革命

Einops&#xff08;爱因斯坦操作库&#xff09;就像给张量操作戴上了一副"语义眼镜"——让你用人类能理解的方式告诉计算机如何操作多维数组。这个基于爱因斯坦求和约定的库&#xff0c;用类似自然语言的表达式替代了晦涩的API调用&#xff0c;彻底改变了深度学习工程…...

MySQL 部分重点知识篇

一、数据库对象 1. 主键 定义 &#xff1a;主键是用于唯一标识表中每一行记录的字段或字段组合。它具有唯一性和非空性特点。 作用 &#xff1a;确保数据的完整性&#xff0c;便于数据的查询和管理。 示例 &#xff1a;在学生信息表中&#xff0c;学号可以作为主键&#xff…...

Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)

引言 工欲善其事&#xff0c;必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后&#xff0c;我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集&#xff0c;就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...

CVPR2025重磅突破:AnomalyAny框架实现单样本生成逼真异常数据,破解视觉检测瓶颈!

本文介绍了一种名为AnomalyAny的创新框架&#xff0c;该方法利用Stable Diffusion的强大生成能力&#xff0c;仅需单个正常样本和文本描述&#xff0c;即可生成逼真且多样化的异常样本&#xff0c;有效解决了视觉异常检测中异常样本稀缺的难题&#xff0c;为工业质检、医疗影像…...