1.java rabbit 3h
- 消息交换器
- 消息可靠性
- 生产者可靠性 消息重发,确认
- 交换机可靠性 持久化,lazy
- 消费者可靠性 确认,幂等
- 借此复习项目里的消息队列,重新复习了一遍短链接更新相关,查阅学习消息重复的出现和Tomcat线程池oom
2.算法 2h
- 链表深拷贝
- 数字最大和
- 冒泡排序和优化
3.MySQL 40min
- 复习日志
4.jvm 2h
- stringtable优化
- 直接内存
- 判断对象是否回收
- 4种类引用
- 垃圾回收算法
- 分代垃圾回收
1.java 1h
- spring框架
2.算法 1.5h
- 简单动态规划若干
3.MySQL 1h
- undolog,redolog,binlog
4.jvm 1h
- 运行时常量池+串池
1.java 2.5h
- rabbitmq基础使用复习
- 框架八股
- git commit amend
2.算法 2h
- 贪心:二叉树监控,递增数字
3.MySQL 1h
- 数据页结构
- count优化
4.jvm 1h
- jvm结构:方法区,堆,栈,pcr,本地方法栈
- 内存溢出和检测工具 top/jps/jconsole
1.算法 2.5h
- 复习了一批以前做过的链表题
- 复习贪心
2.java 2h
- 集合--List(ArrayList,linkedList),Map(HashMap相关),Set(底层实现HashMap,value是一个静态object类)
- hashmap1.7扩容死循环,扩容,put
- 基础
3.MySQL 0.5h
- 数据页––结构和页内查询
这周准备找实习前的最后准备阶段,主要工作是修简历和学完juc,感触很深,这些底层的东西透彻以后再看以前开发中根本不了解的线程,已经有了理解和处理能力。辅以刷算法,一周推进了 26 道算法题,主要是贪心和数组的回顾。最后是补充操作系统,但发现和juc概念很相似后转向学习计网,今天截止也是把计网主体线打通,后续再通过八股完善知识框架和详细知识。
总结一下下周的任务
- 完成Linux和rabbitMQ的学习
- 完成MySQL和java八股
- 继续复习juc
- 推进jvm和算法
11.17
1.Git 1.5h
复习了git常用指令
针对使用命令行还是idea操作git,idea操作固然方便,也可以作为主要使用,但基础学习应该多使用命令行,让自己对常用命令以及各种分支切换有更加深刻的理解,熟练之后再上手idea才可以事半功倍,否则看着idea中的head,checkout,reset等也很容易混淆.
2.算法 2.5h
- Array *2+Greedy *3
复习
3.MySQL 2h
- 事务部分
- 索引基础
- 索引失效
三刷事务终于彻底搞懂了MVCC
4.计网
- 完成应用层学习
- 八股打通框架
5.juc
- 复习两阶段终止
11.16
1.juc 45min
- 锁 优化
- 线程安全判断
2.算法 2h
贪心 *3 + 数组滑动窗口 *1
3.计网 1h
- 四次挥手
- 应用层DHCP
4.改简历
11.15
1.juc 2h
- RentrantLock读写锁源码
- 复习锁原理,锁升级
- 两阶段终止模式
2.算法 2h
- 贪心 * 7
3.计网 1.5h
- tcp拥塞控制
- 建立连接三次握手
11.14
1.juc 3h
- 读aqs和reentrantlock源码
- 回头复习线程
2.项目1.5h
- 两种登录校验:cookie+session,JWT
- 完善简历
3.算法1h
链表合并,原来是进制的思想
一道链表排序卡时间复杂度,复习归并排序,顺便把常见排序都复习下吧
4.计网 1.5 h
- 网络层ipv4地址的3种划分
- 运输层 端口号,复用分用
- udp和tcp区别
- tcp窗口控制
11.13
1.juc
- ThreadPool实现:阻塞队列+ 线程集合+拒绝策略
- jdk线程池状态
- api:提交任务的4种方法execute,submit,invoteAll.invoteAny
- 关闭线程池:shutdown(),shutdownnow()
- 常用的四种线程池
- 任务调动线程池的两个执行方法
- 实现定时任务
- 线程饥饿
- 线程池异常处理的两种方案
手写了线程池和定时任务两部分代码
2.算法
合并区间,思路想到了,但数据结构实现被卡住了
3.操作系统
juc 4h,上手代码,感觉良好,数据结构1h看了一题半,思路都有,实现上难以落地,操作系统1h,进程的相关状态和原语操作,都在juc里了解过,感到juc和操作系统同根同源
11.12
1.项目
看看面试问题
2.juc
- 乐观锁
- cas和volatile搭配
- 一些线程安全的原子包装类
- LongAdder源码
- 底层的Unsafe
- 可变类的线程安全问题--DateTimeFormatter
- 不可变类的设计--String:1.final 2.私有成员变量无set 3.类上加final 防止子类破坏不可变性 4.保护性拷贝
- 保护性拷贝引出的对象频繁创建--享元模式
- 享元模式 :1.包装类的valueOf 2.String串池 3.BigDecimal
3.算法
3道算法题
--求数组中和为k的子数组,第一次接触到前缀和的概念
--单调队列解滑动窗口
--最大和的连续子数组,是动态规划的思想,一开始已经想到dp的点上了,但还是跑偏了,试错了很久,这个题目也是第一次自己找到dp的感觉
4.操作系统
今天花了四个小时在juc上,进展也确实挺大,不过其中有很大一部分源码比较难,两个小时的算法卡在那道dp比较久,不过以后这道应该是不会再不会做了,一个半小时的操作系统,有juc的基础学的还挺快的,都是类似的底层概念,并发共享什么的,项目看了半个小时有点头昏
11.11
1.短链接
学完了项目所有的视频,将所有项目的关键业务点都整理出来了,整体看完项目之后再会看之前的一些架构设计,又比之前更好理解一些了
简历的这部分也已经完善了,发现技术和项目亮点都是集中在短链接的crud上,新增时查询短链接存在和生成时确保短链接唯一,查询(跳转)时的缓存击穿,缓存穿透,修改时与监控分离引出的消息队列和幂等,还有缓存和数据库一致性的处理,还有就是对两个模块的限流
之后就是看看各种面试的提问点和debug复习代码了
2.juc--完成第五章:可见性和有序性
- 引入有序性
- 由CPU指令重排到jvm指令重排
- 指令重排的解决--volatile的读写双屏障机制
- 指令重排实例--scl初始版本,因为赋值和创建指令重排导致的线程问题,通过volatile解决
- before规则--确保变量改变是其他线程可见
- 线程安全单例的5个例子
第5章总结
11.10
1.短链接
- 修改--读写锁+消息队列+消息幂等
- 流量风控
修改部分在消息队列和延迟队列之间反复横跳,项目设计很不合理,总是在一个新的设计后将原来的思考和设计全部推翻,然后再去吸收理解,学着真心累
这些天也是又发现学习方式的错误,之前是想多写一些代码来提升自己的代码能力和对项目理解,但是针对这个项目后期的各种架构设计,由于频繁出现上述的推翻情况,导致自己实际写根本有些不可能了,光是理解都是很困难了,各种修改时间成本巨大,针对这个用于实习的项目,还是不应该把重点放到copy代码,而是都去做业务理解应对面试的问题,意识到这点后进度明显变快了
2.juc
十几天没打卡了,但学习其实也没落下,每天学的有点散,导致没什么好记的,这两天也是反思了下,应该把重心放到项目和八股上,先冲刺实习,算法还是得每天跟着,但可以降低比例,至于juc是看八股的时候,里面掺杂了很多线程和锁知识,就先把juc学完连同八股一起搞定吧
10.29
1.短链接
熬完了监控部分的内容
2.算法
hot100 * 3
3.java
在看集合部分八股时有很多线程安全之类设计线程和锁机制的内容,准备先去学习juc
身体状况太差了,有点熬不住
10.28
1.短链接
监控信息相关方法
也是很长的crud,信息很多很复杂
涉及到多表拼接查询时还是用到手写mapper,原生sql语句在这种复杂情况还是很实用
2.算法
二叉搜索树算法*7
二叉树部分算法完结,之后开始动态规划+hot100
10.27
1.短链接
- 跳转实现
- 其他小功能
- 回收站
2.java
复习javase基础
10.26
1.短链接--短链接核心
- 短链接相关crud测试
- 后管对中台接口联动
2.算法
二叉树*6
10.24
1.短链接项目--短链接分组
又臭又长的crud和代码调试,遇到一个bug是测试登录接口时,其他数据正常,但一条数据总是内部报错,最后排查出这条数据是在采用数据库信息加密之前插入的数据,因此shardingsphere从数据库查出来解密的时候报错
2.算法
- 二叉树*5
- 贪心:活动选择,最小背包
3.java
Spring和SpringCloud
SpringCloud主要是整体概念,服务组件,和一些微服务流程异常的处理方法
10.23
1.短链接项目--用户管理模块
- 用户信息查询:序列化加密
- 用户注册:布隆过滤器+分布式锁
- 分库分表+存储加密
2.算法
二叉树*5
3.java
- 基础:锁+线程池
- Spring:IOC+AOP
10.22
1.外卖项目
- 购物车业务
2.算法
二叉树习题若干
3.java
- 线程创建方式
- 两种常见锁的特性 区别和实现
10.21
1.外卖项目
- 修改业务
- springCache注解
遇到一个多表联查中service相互调用的情况,最后在业务层通过逻辑处理解决
2.算法
- n皇后
- 二叉树前中后,层序便利
10.20
1.项目
- 复习redisTemplate
- 了解微信小程序开发
- 微信登录接口
- 查询业务...
2.算法
回溯算法
3道数组内元素求和的回溯算法,基础版,去重版,数字唯一版
10.19
1.算法
回溯算法*2
比较抽象,尤其是针对问题设计递归函数,但其本事都是在递归后对栈中元素做回溯操作
10.18
1.算法
- 单调队列求滑动窗口
- 小顶堆求解第k大的元素
复习了堆的实现,堆也是特殊的队列,其核心方法为
- heapify:弗洛伊德建堆算法,从最后一个非叶子结点开始向前,将每个节点都进行down操作
- down:与左右孩子的最大值作交换,直至比孩子小或者没有孩子
- up:与父节点比较,小则交换,直到比父亲大或者到索引0
其中涉及到一些数组实现后索引的特性,比如左孩子索引为(parent-1)/2.父亲为child*2+1
2.java
集合八股
10.17
1.算法
- 双指针部分若干复习+新题
- 栈和队列*3
接触到滑动窗口,除去之前的kmp算是第二难坎
2.mysql
3种大锁和3种行级锁
今天调整作息,来不及做项目了
10.16
1.外卖项目
- oos网络上传文件
- 完成一个大模块
对mp上手更加熟练,今天模块涉及到多表操作,技术上没什么难点,但一些多表的基础业务操作起来感觉java还是挺臃肿麻烦的,做什么操作都要先来个三层架构,不过在项目体量够大的情况下还是很有益的,其次还没用到mp的结构构造器,明天补上
2.mysql
复习索引,事务
10.14
1.外卖项目
mp实现DO公共属性自动填充
2.算法
hash,string算法题若干
开始学习KMP算法,了解思路和过了几遍代码,还是有点懵
10.12
1.算法
hash算法题*6
10.10
1.外卖项目
- 改造分页查询接口为mp查询
- 重新学习mp的分页插件
测试分页接口时因为token问题的更换被给晕了头,客户端应该是每次登录后都会使用新的token来进行jwt检验,但项目情况是新的token不生效,应该被覆盖的token反而生效,生成jwt的工具类也调试着嵌套很深,明天再查查token的资料
2.算法
链表和hash的4道算法
3.mysql
- select语句执行过程
- 索引下推
- 数据页的结构和检索设计
4.计网
网络层
10.8
1.外卖项目
- 上手swagger
- 新增用户接口引入mp实现
- 复习mp整合到springboot和使用
导依赖过程解决两个依赖冲突bug:
1.导入mp时xml中需要两个依赖mybatis-plus-boot-starter和mysql-connector-java,同时需要删掉spring-boot-starter,因为前者已包含会发生冲突
2.mybatis-plus-boot-starter和pagehelper的依赖冲突
2.算法
链表算法题*4
3.mysql
- undolog
- redolog
4.计算机网络
mac地址和ip地址以及ARP协议
9.29
1.外卖项目
- 导入资源
- 熟悉调试
- nginx代理
saas项目大体跟完,剩余拓展部分.
先做个外卖项目巩固下基础部分,预计花费4天完结
2.算法
红黑树的put和remove
内容相对简单,是各种情况的分类繁琐,后续做个流程图再巩固代码
3.计算机网络---数据链路层
- 封装成帧
- 差错检测
- 可靠传输(3种传输协议)
9.26
1.saas---短链接访问监控
- pv
- uv---cookie+redis
- 地区
- ip,设备类型...各种监控量
参考视频的质量太差,让人感觉做着很混乱,感觉一刷完之后需要重新更加仔细的二刷了,
一刷先熟悉手感和项目业务,记下重点和可以业务改进的地方
不过对项目的学习感受有了更加深刻的理解,原来只是会看着视频理解业务,现在会往文档和查询学习的方向去靠,毕竟日后文档才是学习和工作中的主体
2.mysql
- 唯一索引等值查询和范围查询的行级锁退化情况
- 二级索引等值查询和范围查询的行级锁加锁情况
- 执行update语句where中无索引锁全表的情况及解决方法
对行级锁的上锁情况有了大概的了解,有点柳暗花明,后续这块还是要再重点复习
3.计算机网络
修正学习方法,改用视频+文档学习的方式,基础薄弱的情况下只学习文档效率有些低
9.25
1.saas
回收站的创建,分页查询,删除和移除
分页查询时需要对gid做查询处理,因为回收站中数据不需要分组,但查询shortlink表需要使用gid,所以先查询出当前用户的所有分组gid,再使用in(g1,g2...)来查询数据
2.mysql
- 4种表级锁
- 3种行锁
锁的内容很复杂,二刷图文后再看看视频
3.计算机网络
- http的优缺点,数据透明带来的三种隐患
- https对3种数据透明的处理方案
- GET和POST
9.24
1.saas
- 短链接跳转业务
- 短链接的缓存穿透,缓存击穿,缓存预热
2.mysql
- 索引失效的6种情况
- 模糊匹配仍然生效的情况
- count(*)和count(1)的性能比较
- 事务中可重复读级别下对幻读的处理和无法解决的两种情况
- 全局锁
3.计算机网络
零零散散的知识
9.23
1.saas
- 远程调用查询分组数量
- 修改短链接---涉及分表后的update操作处理
2.mysql---事务
四大特性
- 三种并发问题
- 四种隔离级别
- mvcc版本链
- 读已提交和可重复读的mvcc实现和库按照区别
9.22
1.saas
- 分页查询---mp的selectPage接口
- 模块间调用联调
- 分组分表
- 查询分组内数量---使用mp自定义复杂sql语句
9.18
1.saas项目
- 分布式锁+布隆过滤器解决用户恶意注册(同时只能有一个用户名被注册)
- 用户数据分库分表
- 数据库敏感信息加密
- 用户修改
- 用户登录---采用hash结构缓存,username作为key,token和用户json作为hash键值
- 用户退出
涉及到同一个用户名恶意注册,缓存实现用户登录两个业务难点
9.17
1.saas项目
- result返回类封装
- 全局异常码定义
- 全局异常拦截器定义
- 用户名查询
- 用户注册,引入布隆过滤器
因为初始接触项目还是手生,在参数接收和请求路径这些基础方面花了些时间,不过接触到了很多新注解和插件,项目开始涉及到缓存穿透
9.16
1.saas项目
- 了解项目结构
- 用户模块的查询用户
controller层方法中的参数注解@PathVariable
9.15
1.saas
导入项目,创建项目基础结构
<dependencyManagement>中的依赖爆红---虚假爆红,此处的依赖只是做版本约束,在子模块中导入依赖后才会下载
9.14
1.java微服务
- es---java批量处理文档
- ASL---叶子查询,复合查询
- 排序,分页(深度分页)
- 高亮显示
es是像mysql一样的一个高搜索性能的数据库,其内容和结构也大致都和mysql一致,感觉是学习了一套es的操作api
2.mysql
回头重新复习前面的20题,感觉sql操作中各种表的拼接和函数的调用很混乱,总之感觉很难,需要重新静下来重新过一遍
3.项目
选定了一个优惠券秒杀项目,复习Git的相关操作,阅读整理各种文档,刚开始起步总是感觉很难.
考虑之后还是基础不牢靠,还是先选择一个基础的项目练手后再操手大项目.
学习的试错率 --感觉学习中对这个概念总是感触很深,每次要开始下一个学习章节的开头,总要花大把的时间去试错反思,再重新开始找适合的课程,总是有益的
9.13
1.java微服务
es---JavaRestClient对索引库和文档的操作
2.mysql
sql50 16-10
9.12
1.java微服务
- MQ消费者可靠性---失败重试,确认,业务幂等(多次执行业务只造成一次业务影响)
- 消息延迟方案---死信交换机,插件实现延迟queue
--------------
- elasticsearch---倒排索引
- ik分词器
- 索引库和文档的crud
2.mysql
sql50题 11-15
9.11
1.java微服务
- 消息转换器
- 发送者可靠性保障---重连和确认
- MQ可靠性---数据持久化,LazyQueue
2.mysql
- sql50 6-10
- 事务并发的3中问题
- 4种隔离级别
9.10
1.java微服务
- seata的XA和AT模式解决分布式事务
- 同步/异步消息在微服务项目中的应用
- RabbitMQ客户端
- 队列和3种交换机
- SpringAMPO基于Bean和注解绑定队列和交换机
2.MYSQL
sql50题 1-5
事务四大特性
3.算法
avl树
9.9
1.java微服务
- mvc拦截器---实现网关到微服务的登录校验,token获取
- feign拦截器---实现微服务间相互调用的用户token传递
- nacos微服务配置管理
- 微服务雪崩问题
- sentinel的四种雪崩处理方案
- 分布式事务问题
- 引入seata
微服务中的用户登录校验分为三部分,网关入口jwt处理token,网关到微服务,微服务调用微服务,本质都是将用户id存储到请求头中,分别采用网关过滤器,mvc拦截器和feign拦截器来将用户id写入/取出请求头
(微服务内部是在mvc拦截器中将用户id存入ThreadLocal利用UserContext获取)
9.8
1.java
- 微服务拆分
- 网关时间
- 网关过滤器
- 网关登录校验
一个nacos启动失败的bug
在docker logs nacos 中查找发现是sql配置文件未读取到的原因,分析得知本机docker的mysql未设置开机自启,导致nacos自启动时配置出错
9.7
1.java
- 微服务概念
- 项目拆分实践
- 远程调用
- nacos服务注册和发现
9.5
1.数据结构
二叉搜索树remove递归,范围查询
2.操作系统
...1h
3.mysql
主从复制,分表分库的概念
4.算法
验证二叉搜索树(98) ,思考二叉树直径问题(543)
9.4
1.数据结构
二叉搜索树的get,put,前后祖先,remove
2.操作系统
糊里糊涂的网课1.5h
3.mysql
四种日志
4.算法
leetcode 104,226,101二叉树深度,反转二叉树,判断对称
8.7
1.mysql
- 视图--检查选项,作用
- 存储过程--语法,3种变量
2.计算机网络
web应用
web缓存中的条件性GET
3.算法
leetcode88,27
8.2
1.redis
2.mysql---索引
- 概念
- 结构---b+树,hash
- 分类---聚集索引,连接索引
- 操作语法
- 性能分析工具---执行频率,慢查询日志,profile,explain
3.jvm
- 启动类,扩展类,应用加载类加载器的详情
- 双亲委派机制
8.1
1.redis
三种redis的消息队列 list,pubsub,stream
2.mysql
存储引擎,innodb的优点
3.jvm
- 类的生命周期---初始化
- 类加载器的分类
7.30
1.redis
异步秒杀
将抢购秒杀券的步骤分割为两个部分分别执行,验证部分由redis进行,生成订单则代开现场采用阻塞队列进行,以提高执行效率
代码实现时开线程获取代理对象执行的步骤出bug,无法解决
2.mysql
多表查询 内外连接,联合查询,子查询
事务 ACID,并发事务问题及隔离级别的解决
7.28
1.jvm
类的生命加载周期 加载 连接
7.27
1.jvm
- 字节码文件组成 常量,方法
- 字节码查看工具 jclasslib arthas
7.25
1.redis---分布式锁
- redis实现
- 误删问题-->删除时进行线程匹配
- jvm导致的误删-->redis执行lua脚本实现原子性
2.mysql
- dql
- 四种函数
7.24
1.redis---优惠券秒杀
- 多线程并发引发的超卖
- 一人一单及并发安全
- 分布式锁概念
7.22
1.redis
- 优惠券秒杀的基础版本
7.18
1.redis
- 缓存穿透的逻辑过期实现
- 缓存工具类的封装
- 全局id的redis生成
7.17
1.jvm
串池
- intern
- 字符串面试题
- 串池1.6和1.8的位置(永久代 堆)
- 串池底层hash表,对bucket的性能调优
2.计算机网络
- OSI模型详解
7.16
1.jvm-内存结构
(1)堆 定义,内存溢出及诊断(3种工具及gc后仍内存占用高)
(2)方法区 定义(永久代->元空间),组成,内存溢出,常量池
(3)stringTable 和运行时常量池的联系; string的两种创建方式:串池和堆(new string()); 常量字符串和变量字符串的拼接
7.2
1.数据结构
huffman树的结构实现及其编码解码
7.1
复习jsp考试
1.redis
解决两个bug
2.计算机网络
- 报文交换,分组交换
- 计算机网络性能
3.算法
leetcode322最少硬币的贪心解法(非正解)
花费4h处理两个bug:
1.使用SpringBootTest测试时发现没有运行按钮,逐步测试后发现是idea自动导包为juint4的test包,与项目的5不兼容,重新导包后解决.
2.spring项目没有图标和各种应有的配置,查阅后发现是社区版功能极少,于是重新安装了idea企业版并破解,然后发现项目启动jdk报错,试过所有方法都无解,最后似乎是因为删除了PATH中社区版的环境变量才正常运行
都是因为idea的更换所导致,果然没有这么容易,但idea重新安装时会自动删除旧版本并继承其中的数据,但今天的情况是我在安装好之前先自行删除了社区版,然后新版安装是删除了原来的卡顿版本,所以社区版可能会有一些残留问题
6.30
1.数据结构
贪心算法
2.redis
缓存穿透的逻辑过期解决
3.计算机网络
- 网络协议概念
- 网络组成结构
- 数据交换的电路交换
4.算法
leetcode518 零钱兑换的暴力递归解法
idea突然变得卡顿,重新安装了2023.1版本,据说更稳定流畅一些,下载初体验确实如此
6.28
复习数据结构考试
6.24
1.数据结构
1)图
- 图的kruskal算法(利用并查集)
- 图的并查集(结构,find和union方法及其优化)
2)排序
- shell排序(基于插入排序分组以减少调换次数,O(n*log n))
- 归并排序的递归与非递归(分:主要是选取每次的合并边界,合:合并有序数组
2.redis
- 缓存的应用
- 缓存穿透及空对象的解决
- 缓存雪崩
- 缓存击穿及互斥锁解决
6.23
1.redis
1)登录模块和拦截器模块
2)mp:query,save
2.数据结构
1)图的prim
3.算法
中缀表达式转后缀(leetcode150)
6.21
1.小项目
完成购物车模块和主页的开发,在开发商家功能的过程中,因为mapper和xml映射文件中的某个bug导致所有的ResultMap失效报错
最后逐步排查后通过,但最终也没能搞清楚是哪个小地方的问题,但可以锁定在mapper文件或者xml中,供参考
但这件事也给我一个启发就是断点编程:在开始某个开发任务前先测试系统是否正常运行,这样后续出bug也好确定查验范围.像这个bug的出现,是在我先删了几个无用servlet后直接写了store的一整套mvc代码后测验dao层时遇到,也是完全没想到是基础mapper的问题,所以在过滤器和其他地方花了很多时间,然后也是恢复到删除前发现项目正常运行以为是删除servlet的问题,最后才从起点处一步一步排查发现bug是mapper处的问题,较大的排查范围很容易被误导到错误的方向.
2.数据结构
1)图的最小生成树的prim算法:类似于迪克斯特拉最短路径算法,每一步找到dist最小的顶点,更新邻居顶点的dist,记录来路顶点
2)复习DFS:递归和非递归(栈),BFS:队列实现
6.13
1.小项目
完成商品详情模块的开发,完成分页展示功能
分页展示功能
1)五要素:List数据,pageSize,totalPage,currentPage,totalcount-->pagesize和currentpage由前端传入
2)pageBean-->其中的totalpage由totalcount和pagesize计算得到
3)Sql语句的limit start,count(start = (currentpage-1)*pagesize)
2.数据结构
复习冒泡,插入,选择排序
6.12
1.java
复习jdbc和mybatis,昨天项目里的参数封装异常采用mapper的xml映射文件中的ResultMap映射解决
2.数据结构
1)图的拓扑排序的dfs实现(栈)
2)求最短路径的算法
6.11
1.数据结构
图的拓扑排序
2.小项目
开始菜单模块的开发,mapper查询封装时会有参数不能成功封装,应该是表名和属性名不对应的原因,明天复习mapper这块的处理方案,学完就忘,一直感觉这块学的挺虚的.
退出登录的逻辑:删除session和cookie,跳转到登录界面.
6.10
1.数据结构
图的java表示和bfs与dfs遍历
6.8
1.redis
session实现登录的逻辑流程
6.7
1.数据结构
b树删除的的case1-4代码实现
2.redis
SpringDataRedis的使用和两种序列化解决方案
6.6
1.数据结构
1)冒泡排序及边界优化,插入排序,选择排序
2)b树 remove 的6种情况
2.小项目
1)自动登录的实现:cookie+filter:勾选自动登录后使用cookie在浏览器记录,filter拦截登录页面获取cookie,如果存有记录则直接转发
2)转发和重定向
保留一个转发的跳转406bug
3.redis
1)基础数据类型的命令行操作
2)jedis和线程池的使用
6.3
1.数据结构:
2.小项目
继昨天:
3.多servlet处理:
多个servlet类的优化都是同样的获取参数利用反射调用方法,因此将反射调用方法抽取为baseServlet类,这样子类servlet中就只保留其对应的业务方法
4.返回值集中处理
将子类方法的返回值类型设为string,在baseServlet中集中处理返回值:获取到参数后如果不为null,则判断参数以forward或redirect开头(统一约定),然后在baseServlet中完乘相应转发,重定向或返回字符串
5.标识符异常处理
baseServlet中判断获取到的method是否为空,为空则跳转到默认页
6.2
1.数据结构
B树的特性和其特殊的节点类:
1)key和child都需要使用数组来记录
2)有最小度数的属性来限制每个节点key的数量
实现了put方法,B树的特点特点在于添加时会更多的依赖逻辑特性,比如其下一步遍历的子树与key的索引值会有很大的牵连
2.小项目
反省发现自我挣扎做项目的效率太低,很多都是无用的想法或者想法的实现因知识储备量的不足而耗费大量精力,决定先进行课程学习,多汲取一些项目经验.但这些挣扎也并非无益,在看课时发现所讲的某个实现思路自己原先也有考虑,但知识过少无法实现,有柳暗花明之感,这也算成长经验里最重要的思考一环,但这个程度还是很难把握,少则缺少思考,多则过度耗费精力,拉低学习效率
项目学习笔记:
baseServlet:
1.创建baseservlet的基本框架:通过在一个servlet中调用不同的方法来实现一个servlet处理多种业务逻辑,因此使用service方法,在方法内接收请求路径中的请求参数来判断调用哪个方法:
1)接收请求参数
2)调用业务逻辑
3)响应(转发,重定向,返回json或返回字节数据)
2. 优化:为处理增加一个需求就多写一个判断的冗杂架构,利用路径中的参数和方法同名的特性使用反射来调用方法:
1)获取类的对象
2)获取类的方法
3)执行方法
6.1
1.大项目
完成了导出excel文件的接口,遇到一个很坑的事情是xlsx表中的时间一栏一直是星号,以为是数据转化出了问题,各种倒腾无果后询问学长,发现是excel表格栏宽过窄,自动省略的展现方式...
书写代码和测试对接口本身所学到的东西:
a.数据库中的DateTime在pojo中使用LocalDataTime进行封装,LocalDataTime的默认格式是,其中 是日期和时间的标准分隔符。虽然数据库中的数据缺少中间的T,但是会进行自动转换封装,如需自定义格式,只需在属性上添加注解注明格式;
b. 修改订单状态的接口:自定义了一个新的PlanStatusDTO,只封装id和status两个需用属性,在service中接收到dto对象后调用msMapper将其转换为do后再调用basemapper.update即可
c.删除订单的接口参数是List<Long>,切记controller中添加@RequestBody注解来接收参数,参数这块学习完已久,当时也没怎么用到,导致这块卡了很久
2.数据结构
avl树的实现与自平衡旋转:首先定义了获取和更新节点树高,获取平衡因子的工具类方法,然后处理平衡旋转:树的不平衡分为4种情况,ll,lr,rl,rr,针对这4种情况给出了4种旋转方法,然后是实现方法banlance,在方法内部判断不平衡情况并调用相应的方法.然后是put和remove的递归实现(和二叉搜索树的实现大差不差),avl树的不同在于需要对每个节点做更新树高和balance的操作
5.28
1.数据结构
(1)有关hash表:
a.jdk提供的Object类的hashCode方法根据key的值生成hash码,String 采用字母乘权重写了生成方式:
乘以31是因为质数减少重合概率,变*32-1是为了移位提高效率
b.murmurHash---第二代哈希算法
c.HashMap链表的头插改尾插是为了防止多线程时冲突
d.HashMap采用了高低位按位与来使高位也参与到hashcode的生成中,减少冲突
e.HashMap采用2的n次方作为容量通过按位与取余,扩容按位与拆分链表,高低位异或来提升效率,Hashtable采用11(质数)作为容量可以使得生成的hashcode分散性更好
f.jdk中的HashMap链表过长转为红黑树是为了防止恶意攻击是链表过长影响性能
5.27
1.项目
(1)领域模型:
do:data object,与数据库表中的字段名一一对应,封装数据库初始数据
dto:data transfer object,service层的数据传输对象,用于传递所需属性
query:在进行条件查询时,有以下三种方式:1.传入对应的属性名,但其代码耦合性过高,如需修改或增加属性则需要修改多处,操作繁琐;2,map.其透明性过低,程序员不容易看出其中封装了哪些属性,因此两个参数以上禁用map;3.query查询对象,将查询条件作为属性封装,直接调用即可
vo:view object
(2)前后端数据校验
前端数据校验是用于数据格式等简单校验,不用传输到后端校验后再返回结果,提高效率,用户不用等待过久,提升用户的体验 ;后端则是对数据的精准审核校验
2.数据结构
(1)二叉搜索树的remove方法,非递归和递归实现
(2)hash表的基本crud方法
5.21
1.项目
完成美食系统的数据库设计
使用powerdesginer时生成pdm后及时选择路径保存,第一次用没注意到没有自动保存,导致文件丢失重新补进度花了很多时间,通过设计sql数据库对cdm和pdm熟悉了解
2.数据结构
复习准备考试
5.18
1.项目
绘制业务流程图,了解学习了FastDfs
2.java
通过测试类中虚拟web环境,controller层虚拟Mvc测试其响应状态,响应体(json),响应头
业务层数据测试事务回滚,达成不留痕测试
5.17
1.数据结构
二叉搜索树的实现
leetcode 通过中后,前后序遍历获取二叉树
5.16
1.java国际象棋小项目
stack实现悔棋,两种实现方法,一种记录每一步的棋盘状态,一种记录棋子的移动复原 并且考虑被吃掉棋子的复原
5.15
1.java国际象棋小项目
了解项目架构,使用hashMap代替二维数组实现棋盘
数据结构
2.二叉树的最大深度,最小深度
5.10
部署先验项目
1.安装虚拟机anolis-8.6
新建虚拟机启动后出现operating system not found,重新新建得以解决,配置过程大概做了以下操作:修改运行内存和线程核数,网络nat模式,配置分区创建root用户
2.安装docker
3.安装mysql,redis,minio
解除防火墙,开放端口供外部连接
熟悉掌握了docker的操作指令和安装虚拟机的步骤,以及了解了一些docker相关的bug,比如容器创建后闪退
注:
总体只要按照文档走就好,最容易出问题的地方是很多docker run 命令的 -- 参数 在复制粘贴时丢失了一个 -,导致出问题,日后配置环境出bug应该先检验各种参数连接是否正确
5.6
1.redis今天复习了mp
进入项目实操,完成了通过session实现登录短信验证码的验证,大致分为发送验证码,接收登录信息验证和校验登录状态.通过将生成的验证码存到session中再取出来进行验证.web中session的知识有些遗忘,有必要复习后再巩固理解.
2.mp
实操redis中遇到mp的内容,会偷进行复习,今天复习了mp的实操和基础CRUD,以及条件查询(lamda查询),null值判断(多一个判断参数)和查询投影(处理查询结果的展示)
3.docker
docker的安装和基本命令
5.5
redis五种数据结构和操作命令的学习,然后是Redis由java操作的实现,实操了jadis和SpringDataRedis操作Redis数据.还有SpringDataRedis操作Redis库的两种序列化设置方法
4.25
1.linux
安装xshell和xftp实现远程连接,然后依次学习了Linux系统的关闭重启登录注销命令,用户管理和运行级别,然后了解了一些文件目录的操作指令
还有找回root密码的一系列操作需要留心
4.24
1.数据结构
完成堆的两道算法题
2.springboot
完成运维篇的学习,运维大致分为四部分:项目打包运行,运行属性配置,多环境开发以及日志的使用,多是对项目已经启动后的一些维护工作,像是对不同环境的调换和属性的各级配置
4.23
1.springboot
学习项目运维知识,包括打包和执行,配置文件的格式和优先级,多环境配置的部署
2.数据结构
完成大顶堆的完整实现,堆的三个重要方法:heatify,down,up
3.Linux
vmware和centos的安装,虚拟机的克隆,移动,删除,快照等操作,了解了Linux的目录结构
4.22
1.Java
完成controller表现层复习和使用vue完成前端开发,实现前后端交互,完结springBoot入门案例
4.9
1.数据结构 阻塞队列的单锁实现 了解到数据结构能和线程特性结合到一起产生新的数据结构还是蛮震撼的
2.springboot
入门部分的复习
4.8
1.设计方法:今天学习Springboot的时候联想到了外观模式,之前使用ssm开的时候需要在SpringConfig类上添加Configuration,ComponentScan等许多注解,而每个注解都是为了使当前配置类实现某一个子功能,这不就可以理解为许多的子系统,而没有Facade类来管理入口的话就需要每次配置都要人工一个一个加注解,Springboot中是将各种注解抽取到一个统一注解中(@SpringBootApplication)加到了启动类上,这其实就是一个Facade类入口的使用实例
2.ssm:完成springboot部分,主要是熟悉了一些文件结构的相关操作,下午花了些时间帮被人解决了个bug,大致情况是他在练习注解实现Bean的生命周期方法时方法未能执行,我自己实现了一遍加反复比对二人的代码,又和他不断沟通后,大致解决过程如下:我这边先是发现未打印是因为他在pom依赖中多加了一个注解包的依赖导致未能打印,将注解包删掉后他那边反而报错显示注解不存在了(我这边没问题),我开始认为是spring-framework依赖版本的问题(他是5.2.1.RELEASE,我是5.2.10.RELEASE),换版本后还是没用,我又查了一遍代码发现原来我这里自动导了注解依赖包,查看来源竟然是jdk1.8,这才想起来一开始从gitee clone到 的他的代码就是jdk17的,最终更换jdk得以解决.
之前虽然一直知道之所以很多人使用jdk1.8是因为其稳定这件事,但经历了这个不起眼的因为jdk版本和其他依赖包不兼容性导致的bug之后我也深有体会,对我现在的学习程度来说,这种jar包兼容问题无疑是降维打击,要不是这个例子的代码及其简单,我绝对查不到jdk身上,
不过当学完ssm之后再回头看最开始的spring容器的概念确实有豁然开朗之感,对容器和Bean的理解和使用都感觉更上一层
3.数据结构:堆实现优先队列,了解了大顶堆和小顶堆的实现
4.7
1.ssm:完成高级maven私服的学习,springboot yaml文件的学习,上午解决了昨天配置文件访问pom文件的属性遗留的bug,发现是子包的pom文件中未继承父包导致未能成功获取数据,今天下午连接私服又出bug,查了半天最后发现是idea默认maven路径导致setting配置未生效,发现现在以每天一个bug的出现和次日解决bug的进度稳步推进,bug真是伴随开发始终,
2.数据结构:数组实现优先级队列的两种方式
3.程序设计方法:外观模式:在子系统的入口处定义Facade类来将子系统复杂的属性和内容进行封装,从而简化了外部使用者的调用操作,同时降低子系统之间的耦合性.
4.6
1.ssm完成拦截器部分学习,高级maven学习了分模块开发和一些pom文件的特性,SpringBoot完成入门案例,这里感叹SpringBoot技术确实大大增加了开发的效率,省去了配置常用的框架,这样看来java开发史就是一个不断的由繁到简的过程,开发越来越便捷,不过等框架越来越简洁的时候,这种简化是不是也已经到头了呢,SpringBoot经久不衰想必有一部分原因也是框架整合确实已经饱和,很难在出现进一步简单的框架,所以下一步就是引导人工智能开发吧,人的开发确实已经够简捷了.
启动springboot jar包出了问题,环境变量设置jdk那边的问题,这一块一直没去补全,今天也是花了一些时间彻底把这一块给完善了,也温习了一遍正确的jdk配置,方便以后工作初期的环境初始化吧
在完成Springmvc的部分后,发现后面的高级maven,springboot章节相比之下都是小卡拉米了,之前 查阅资料看到说s平部分因为是学习框架开发会很轻松,现在才有所体会,这才是真正进入框架学习了吧
2.数据结构:实现数组实现双端队列,然后是一道双端队列实现二叉树z型遍历的算法题,最近精力放到了ssm上,抓紧赶java进度参与5月的项目吧
4.5
1.ssm:从头开始实现了一个ssm项目,整合了Mybatsi,Spring和SpringMvc,仍然在请求静态资源的访问拦截处被卡时间,但最终已经解决,然后学习了表现层的数据封装Result和异常处理器(未手动实践),了解了一点拦截器.通过这个整合案例,印证了之前听课后花大把时间手动实践和记录笔记绝对不是无效功,大大加深了对技术的熟练度,也方便查阅,
2.数据结构:两道栈结构的算法题,链表实现双端队列,因为花了大把时间在ssm上,所以数据结构推进较少
4.4
1.数据结构:完成了栈的学习,包括数组和链表实现栈,和栈的一道后序遍历的习题,使用栈的特性设计算法实现中缀表达式遍历转化为后缀表达式
2.ssm:mvc入门,学习了参数的传递和请求与响应,REST实现案例遇到bug阻碍推进
4.3
1.数据结构:学习了环形数组实现队列的三种方法(首尾指针,容量属性,使用时取模---这里有一个超出整数表示的问题,由一些底层数学特性进行解决),完成了一道树的层序遍历的算法题,一开始自己的实现比较冗杂,了解后在两个方面完成优化:程序的循环结构:如果是不断执行一段代码,然后依据执行次数进行if判断的话,那可以将这段程序修改为fori结构,其次是列表的复制和赋值相关,要调用工具包进行复制,不然复制和赋值操作都会导致新的列表和原有列表指向同一片区域,算是重温了列表的一个特性问题
2.ssm:springmvc入门,解决一个导入依赖时的bug,如果是第一遍导错包刷新后一直报错,那应该去maven的jar包目录结构下先去删除已有的目标包文件,然后再去pom文件中重新刷新导入正确的,不然即使修改后也会一直报错.今天的内容学习比较少,在入门案例也遇到bug卡住进度
4.2
1.ssm:AOP开发和Spring事务管理
4.1
1.ssm:完成注解开发Bean内容的学习,在实现整合MyBatis的案例时理解和修改bug花了很久时间,最后调试发现问题是在占位符传参时多打了一个字母,但也学到了一些MySQL的相关bug,这个案例还是废了很大的力气,反复写了很久才能实现.让人想起上一次这样被整了很久还是MyBatis的入门案例,但不同的是这次的心态确实不一样了,明白自己只是第一次不熟练,而且这个问题最终都会被解决并且成为以后一个简单的实现,抱着这种心态倒也是沉住气查改了很久,这也是程序员磨炼的心性吧,在经历越来越多的bug之后,这种平和之心也会越来越稳
2.处理Java文件结构的bug问题,每次创建项目包或文件的位置都会有bug,今天花了很久的时间调试,发现是在创建时idea自动匹配的路径不是当前项目路径,而是上次使用idea打开文件的路径,但也对idea的各种文件结构有了比较透彻的理解,算是填了之前一个一直没解决的坑
3.算法:LeetCode88,环形哨兵链表实现队列
3.31.2024
1.ssm:Bean,容器和依赖注入的相关知识
2.算法:LeetCode88,完成链表的学习
3.30.2024
1.Vue:
(1)Vue的使用步骤和常用操作
(2)简化js中的DOM操作,和Axios结合实现前后端页面数据交互
2.ssm:
(1)复习IoC容器和Di的使用案例
(2)bean的三个配置内容:基础配置,别名,作用范围
3.算法