【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)…...
自动化完成1000个用户的登录并获取token并生成tokens.txt文件
自动化完成1000个用户的登录并获取token并生成tokens.txt文件 写作背景 在我学习使用redis实现秒杀功能的过程中,在编写完秒杀代码后,需要使用Jmeter实际测试1000个用户进行秒杀,由于秒杀功能需要在用户登录完成后才能实现,用户是…...
2023年全国最新安全员精选真题及答案1
百分百题库提供安全员考试试题、建筑安全员考试预测题、建筑安全员ABC考试真题、安全员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 11.(单选题)在起重作业中,()…...
NoMachine 输入用户名密码后 闪断 解决办法
大家好,我是虎哥,最近工作忙,好长时间没有继续套件的深度学习,今天周六,难得有空,泡好茶,打开电脑,链接套件桌面,得,出问题了,一个很奇怪的问题&a…...
WebADI - 参数的使用
* 本文仅供交流分享,不作为专业指导 最近研究了一下WEBADI文档下载的参数,由于网上这块资料较少,所以专意分享下我的笔记。 准备 集成器:BHSC_EMP_ADI 表值集:BHSC_DEPT_LOV(值:dname&#x…...
【OJ】两个圆
📚Description: 直角坐标系内现有两个半径相等的圆,问两圆的位置关系。 位置关系有:重合,相切,相离,相交; 若两圆相交,需要求出两圆的重叠面积。 ⏳Input: 输入包含多组数据&a…...
一文读懂澳洲医疗:白菜价的药物怎么领?
众所周知,福利优厚的澳洲,在医疗系统上有着令全世界人民都羡慕的超高福利。 几十万的天价药,在澳洲,白菜价就能轻松到手。 国内70万元一针的“诺西那生钠注射液”(目前中国国内唯一治疗脊髓性肌萎缩症的进口精准靶向药…...
scrum看板视图切换时间线视图做项目管理
企业需要开发一个项目,可以制作时间线进行管理,以便参与者和管理者了解项目的时间进度。项目进行到哪一步,参与者有哪些,责任人是谁,这些都可以通过时间线进行展示。「时间线视图」是一种比甘特图更轻量、更实用的工具…...
10、MySQL查询优化
MySQL查询优化 1.MySQL查询优化技术2.子查询优化2.1 优化器自动优化2.2 优化措施:子查询合并2.2 优化措施:子查询上拉技术3.外连接消除4.生产环境不使用join联表查询5.group by分组优化5.1 group by执行流程5.2 为什么group by要创建临时表6.order by排序优化7.MySQL性能抖动…...
C++模板(一)
文章目录C模板(一)1. 泛型编程2. 函数模板2.1 函数模板格式2.2 模板原理2.3 模板实例化2.4 模板参数匹配原则3. 类模板3.1 类模板格式3.2 背景3.3 类模板的实例化C模板(一) 1. 泛型编程 前面我们学到了函数重载这个特性…...
【TypeScript】TypeScript的基础类型(string,number,boolean,void,null,undefined):
文章目录一、安装【1】安装npm install typescript -g【2】基础类型:Boolean、Number、String、null、undefined 以及 ES6 的 Symbol 和 ES10 的 BigInt二、字符串类型(string)三、数字类型(number)四、布尔类型(boolean)五、空值类型(void)六、null和undefined类型…...
这几年做哪些网站致富/营销策划方案包括哪些内容
虽然现在jdk已经已经到了14【截至2020-08-15】,但是jdk8仍然是使用最广的版本,它的新特性不仅在我们日常开发中用到,在面试中也是一个经常被提问的点,所以对一些常用的还是需要知道的,我也只写一些常用的,有…...
柔造网站定制/网络营销推广价格
第17讲为有条件跳转。 有条件跳转的指令通常为 J[N]Flag 有符号数比较的判定为: 大于(G) 等于(E) 小于(L) 无符号数比较的判定为: 大于(A) 等于(E) 小于(B) X, Y 中存放为16位有符号数,将X,Y中较大的数放入AX MOV AX, X CMP AX, Y JGE SKIP MOV AX, Y SK…...
wordpress获取当前页地址/b2b电子商务平台排名
原题地址 题目描述 有 nnn 个小朋友坐成一圈,每人有 aia_iai 个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为 111 。 输入格式 小朋友个数 nnn,下面 nnn 行 aia_iai 。 输出格式 求使所有人获得均等糖果的最小代价。 输入输出…...
做兼职有哪些靠谱的网站有哪些/站长之家seo工具
MySQL的热备(物理备份)可以采取全备加增量备份的方式来减轻数据库I/O压力及系统资源的占用。增量备份主要是以全备或增量备份为基础,备份那些变更过的页面。其备份的原理是基于一个不断增长的LSN序列,这个LSN与Oracle的SCN类似。在恢复期间,我…...
使用vue做的商城网站/电子商务网站建设方案
RealThinClient SDK是用于开发标准的HTTP(S)服务器,ISAPI扩展以及客户端的VCL控件。可用于Windows下的CodeGear Delphi 6-2010。关于RealThinClient SDK的教程会持续更新,本节是RealThinClient SDK的第二课,如何使用构建的服务器发送动态生成…...
wordpress 新建页面 所有文章/优化推广什么意思
题目描述 【问题描述】 Gardon 昨天给小希布置了一道作业,即根据一张由不超过 5000 的 N(3<N<100)个正整数组成的数表两两相加得到 N*(N-1)/2 个和,然后再将它们排序。例如,如果数表里含有四个数 1,3,4&#x…...