Day01_Linked
1, 概述
// 学习流程
// javase基础
// 数据结构 集合类
// 前端
// 数据库
// EE: javaee服务器开发
// Spring 以及spring的衍生框架
// 分布式
框架: 简化开发
//能不能找到工作, 看se
//找到好工作, 框架和项目
// 服务器: 什么是服务器?
// 1, 云服务器: 一个在远端/远程的物理电脑
// 2, 运行在物理服务器上的程序:
// 物联网的产生: W3C的成立
// 网络三要素: 在网络上获取资源
// HTTP: 资源在网络中传输的方式 --> 网络模型
// HTML: 资源的格式
// URL: 指示资源路径/地址
//http://cskaoyan.com/forum.php --> 80
//https://www.taobao.com/ --> 443
// 前端 后端 pc 安卓 ios 小程序 游戏(游戏引擎)
// 前端: 攒页面
// 后端: 攒数据
2, 学习方法和要求
// 学习流程
// javase基础
// 数据结构 集合类
// 前端
// 数据库
// ------------------------------------------------
// EE: javaee服务器开发
// Spring 以及spring的衍生框架
// 分布式
//
// se学习, 是死的知识点, 练习和记忆
// ee之后, 掌握思想脉络 ---> 前端
//
// 一些要注意避免的学习习惯
// 1, 下课看视频-->"恍然大悟" --> 错觉
// 2, 晚上脑海一片空白 --> 课上记笔记的方式要注意(核心脉络), 课间扩充这个脉络
// 3, 预习, --> 10-30分钟之间预习时间. 解决一个问题: 明天讲这个东西是什么? 宏观层面可以干啥?
// 4, 下课立即写作业 --> 建议先整理今天的知识笔记或者敲今天上课代码
// 晚自习: 整理笔记, 敲上课代码, 写作业 , 扩展一下
//
// 补充:
// 1, 视频--> "翻" -->
// 2, 笔记问题. 必须要有,
// 3, 作业, "攒"作业.
// 4, 敲代码.
//规则要求
// 1, 上课不允许睡觉
// 2, 教室不允许娱乐相关的视频/游戏.... --> 2km/4次
// 3, 上课玩手机
3, 数据结构和集合类相关问题
//数据结构: 实现
//集合类
//前端
// 数据结构学习的前提目的要求:
// 1, 前提: if else 值,引用
// 2, 目的: 知道数据结构, 集合类用到了数据结构,
// 多写一些代码(要求大家上课代码, 要写)
// 3, 要求: 认真听课, 认真写代码
//
//
// 算法题: 刷题 --> 面试要用
// 大公司,算法硬性要求
// 小公司,
//
// 算法题要不要刷:
//
//
// 集合类: 数据容器, 实际上就是对数组和链表的'包装'
// 注意, 对于我们java代码来讲, 写一个服务, 更多的角色是作为一个数据的"中转站", 处在用户和数据库之间
// 所以在处理数据的时候, 我们需要一个在内存中临时存储数据的对象
// 这个临时存储数据的对象, 可以直接用数组, 但是使用数组, 会有一些问题(扩容不确定, 类型, 元素删除和移动的问题, 效率问题)
// 集合类和数据结构的关系?
// 集合类有时候要解决数据存储/删除/查找的效率问题, 所以我们有些集合类要按照特定的数据结构组织数据.
// 什么是数据结构: 数据+结构, 数据的组织方式
// 常见的数据结构:
// 集合: 一堆无序的数据
// 线性表: 有序序列, 除了头和尾以外, 每一个元素都有唯一的前驱和后继
// 树: 描述的是一种一对多的层级关系
// 图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2K1oAEhr-1641383013486)(.\img\java的集合类.jpg)]
4, 数组和链表
4.1, 数组
Q1: 数组我们都很熟悉,那你理解的数组是什么样的呢?它的最主要特点是什么呢?
// 数组在内存上是连续存储(内存开辟一份连续的内存空间存储数组) --> 随机访问
// 数组起始地址 + 下标 * 数组单个存储单元的大小
Q2: 为什么数组的索引是一般都是从0开始的呢?
// 易语言:
// 下标为0开始, 是一个历史遗留问题.
// 如果从1开始: 数组起始地址 + (下标-1) * 数组单个存储单元的大小
Q3: 为什么数组的效率比链表高?
// 数组是连续存储, 链表是非连续存储
数组的操作效率
时间复杂度:
空间复杂度:
数组的基本操作
添加 (保证元素的顺序)
最好情况:O(1)
最坏情况:移动n个元素,O(n)
平均情况:移动 n/2 个元素,O(n)
删除 (保证元素的顺序)
最好情况:O(1)
最坏情况:移动n-1个元素,O(n)
平均情况:移动(n-1)/2个元素,O(n)
查找
a. 根据索引/下标查找元素:O(1)
b. 查找数组中与特定值相等的元素
①大小无序:O(n)
②大小有序:O(log2n)
// 数组, 添加和删除是o(n), 查找是o(1)
4.2, 链表
什么是链表: 在java中链表, 就是通过对象间相互持有和引用构建出的链式结构
形象地说,链表就是用一串链子将结点串联起来。
结点:包含数据域和指针域。
数据域:数据
指针域:下一个结点的地址
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gELInUbP-1641383013491)(.\img\链表.jpg)]
链表的分类
单链表: 除了尾结点, 每一个结点都有一个后继结点
循环链表: 是单链表的改进, 尾结点的下一个结点指向头结点
双线链表: 是单链表的改进, 双向链表的结点, 不仅有后继结点还有前驱结点
双向循环链表: 是双向链表改进, 尾结点的下一个指向头, 头结点之前指向尾结点
![链表的分类](.\img\链表的分类.jpg)
慎用递归
单链表的时间复杂度
// 单链表的时间复杂度
// 添加: o(1)
// 删除: o(1)
// 查找:根据下标,根据内容/有序和无序: o(n)
双向链表的时间复杂度
// 双向链表的时间复杂度
// 添加: o(1)
// 删除: o(1)
// 查找:根据内容/有序和无序: o(n)
// 根据下标查找: o(n), 但是实际消耗的平均时间是n/4 (单链表是n/2)
// 结论: 根据下标的查找, 双向链表和单链表虽然都是o(n), 但是实际双向链表的时间是更少的
// 那为什么在工程上,我们用的一般是双向链表而不是单链表呢 (比如JDK中的 LinkedList & LinkedHashMap)? ---> 隐含了一个点, 如果我们使用集合类(数据容器)存储数据的时候, 相比较添加和删除,查找操作要更频繁
使用链表实现一个线性表–> 手动实现一个集合类
// 实现一个数据容器: 使用者
// 底层用链表: 单链表 or 双链表
// 隐含表现的数据结构: 线性表
什么是集合类?
/**
* 一个集合类有三个角度
* 1, 是一个集合类/数据容器--> 使用者的角度 --> 使用
* 2, 底层实现角度 --> 数组, 链表, 数组+链表
* 3, 隐含的数据结构角度 --> 线性表, 树, 集合...
*/
注意: java程序员注意
实现功能: 最重要的
代码可读性: 其次
底层用链表: 单链表 or 双链表
// 隐含表现的数据结构: 线性表
什么是集合类?
/**
* 一个集合类有三个角度
* 1, 是一个集合类/数据容器--> 使用者的角度 --> 使用
* 2, 底层实现角度 --> 数组, 链表, 数组+链表
* 3, 隐含的数据结构角度 --> 线性表, 树, 集合...
*/
注意: java程序员注意
实现功能: 最重要的
代码可读性: 其次
代码效率: 再其次