diff --git a/ReadMe.md b/ReadMe.md
index 54edfa2..c3554f4 100644
--- a/ReadMe.md
+++ b/ReadMe.md
@@ -1,25 +1,11 @@
-本仓库为【Java工程师技术指南】力求打造最完整最实用的Java工程师学习指南!
-这些文章和总结都是我近几年学习Java总结和整理出来的,非常实用,对于学习Java后端的朋友来说应该是最全面最完整的技术仓库。
-我靠着这些内容进行复习,拿到了BAT等大厂的offer,这个仓库也已经帮助了很多的Java学习者,如果对你有用,希望能给个star支持我,谢谢!
-
-为了更好地讲清楚每个知识模块,我们也参考了很多网上的优质博文,力求不漏掉每一个知识点,所有参考博文都将声明转载来源,如有侵权,请联系我。
-
-点击关注[微信公众号](#微信公众号)及时获取笔主最新更新文章,并可免费领取Java工程师必备学习资源
-
-
-
-
-
-
-
-
-推荐使用 https://how2playlife.com/ 在线阅读,在线阅读内容本仓库同步一致。这种方式阅读的优势在于:左侧边栏有目录,阅读体验更好。
+# Java工程师技术指南
+本仓库原为 [Java工程师技术指南](https://github.com/h2pl/Java-Tutorial),现 fork 修正错误和更新内容。
## 目录
-- [Java基础](#Java基础)
+- [Java基础](#Java基础)
- [基础知识](#基础知识)
- [容器](#容器)
- [设计模式](#设计模式)
@@ -31,6 +17,10 @@
- [并发](#并发)
- [JVM](#JVM)
- [Java网络编程](#Java网络编程)
+- [算法](#算法)
+ - [必备算法总结](#必备算法总结)
+ - [剑指offer](#剑指offer)
+ - [todo]()
- [计算机基础](#计算机基础)
- [计算机网络](#计算机网络)
- [操作系统](#操作系统)
@@ -56,8 +46,6 @@
- [资料](#资料)
- [书单](#书单)
- [待办](#待办)
-- [说明](#说明)
-- [微信公众号](#微信公众号)
## Java基础
@@ -81,9 +69,9 @@
* [JavaIO流](docs/java/basic/16、JavaIO流.md)
* [多线程](docs/java/basic/17、多线程.md)
* [深入理解内部类](docs/java/basic/18、深入理解内部类.md)
-* [javac和javap](docs/java/basic/19、Java集合框架梳理.md)
-* [Java8新特性终极指南](docs/java/basic/20、javac和javap.md)
-* [Java类和包](docs/java/basic/21、Java8新特性终极指南.md)
+* [Java集合框架梳理](docs/java/basic/19、Java集合框架梳理.md)
+* [javac和javap](docs/java/basic/20、javac和javap.md)
+* [Java8新特性终极指南](docs/java/basic/21、Java8新特性终极指南.md)
* [序列化和反序列化](docs/java/basic/22、序列化和反序列化.md)
* [继承、封装、多态的实现原理](docs/java/basic/23、继承、封装、多态的实现原理.md)
@@ -141,12 +129,12 @@
### SpringMVC
-* [SpringMVC源码分析1:SpringMVC概述](docs/java-web/Spring/SSM/SpringMVC源码分析1:SpringMVC概述.md)
-* [SpringMVC源码分析2:SpringMVC设计理念与DispatcherServlet](docs/java-web/Spring/SSM/SpringMVC源码分析2:SpringMVC设计理念与DispatcherServlet.md)
-* [SpringMVC源码分析3:DispatcherServlet的初始化与请求转发 ](docs/java-web/Spring/SSM/SpringMVC源码分析3:DispatcherServlet的初始化与请求转发.md)
-* [SpringMVC源码分析4:DispatcherServlet如何找到正确的Controller ](docs/java-web/Spring/SSM/SpringMVC源码分析4:DispatcherServlet如何找到正确的Controller.md)
-* [SpringMVC源码剖析5:消息转换器HttpMessageConverter与@ResponseBody注解](docs/java-web/Spring/SSM/SpringMVC源码剖析5:消息转换器HttpMessageConverter与@ResponseBody注解.md)
-* [SpringMVC源码分析6:SpringMVC的视图解析原理 ](docs/java-web/Spring/SSM/SpringMVC源码分析6:SpringMVC的视图解析原理.md)
+* [SpringMVC源码分析1:SpringMVC概述](docs/java-web/SSM/SpringMVC源码分析1:SpringMVC概述.md)
+* [SpringMVC源码分析2:SpringMVC设计理念与DispatcherServlet](docs/java-web/SSM/SpringMVC源码分析2:SpringMVC设计理念与DispatcherServlet.md)
+* [SpringMVC源码分析3:DispatcherServlet的初始化与请求转发 ](docs/java-web/SSM/SpringMVC源码分析3:DispatcherServlet的初始化与请求转发.md)
+* [SpringMVC源码分析4:DispatcherServlet如何找到正确的Controller ](docs/java-web/SSM/SpringMVC源码分析4:DispatcherServlet如何找到正确的Controller.md)
+* [SpringMVC源码剖析5:消息转换器HttpMessageConverter与@ResponseBody注解](docs/java-web/SSM/SpringMVC源码剖析5:消息转换器HttpMessageConverter与@ResponseBody注解.md)
+* [SpringMVC源码分析6:SpringMVC的视图解析原理](docs/java-web/SSM/SpringMVC源码分析1:SpringMVC概述.md)
### SpringBoot
@@ -179,6 +167,7 @@ todo
### JVM
+* [JVM](https://mp.weixin.qq.com/s?__biz=MzI4Njg5MDA5NA==&mid=2247484721&idx=2&sn=73b2762abd8c54cdc8b6bb8b5692384b&chksm=ebd74430dca0cd262c0cd72509e8e9df71287eb74d3e3e56430934df7c60db38a78824a80a4a&token=1676899695&lang=zh_CN&scene=21#wechat_redirect)
* [JVM总结](docs/java/jvm/JVM总结.md)
* [深入理解JVM虚拟机1:JVM内存的结构与消失的永久代](docs/java/jvm/深入理解JVM虚拟机1:JVM内存的结构与消失的永久代.md)
* [深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法](docs/java/jvm/深入理解JVM虚拟机2:JVM垃圾回收基本原理和算法.md)
@@ -197,47 +186,71 @@ todo
### Java网络编程
-* [Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制](docs/java/jvm/Java网络编程和NIO详解1:JAVA%20中原生的%20socket%20通信机制.md)
-* [Java网络编程与NIO详解2:JAVA NIO 一步步构建IO多路复用的请求模型](docs/java/jvm/Java网络编程与NIO详解2:JAVA%20NIO%20一步步构建IO多路复用的请求模型.md)
-* [Java网络编程和NIO详解3:IO模型与Java网络编程模型](docs/java/jvm/Java网络编程和NIO详解3:IO模型与Java网络编程模型.md)
-* [Java网络编程与NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector](https://github.com/h2pl/Java-Tutorial/blob/master/docs/java/network-programming/Java%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E4%B8%8ENIO%E8%AF%A6%E8%A7%A34%EF%BC%9A%E6%B5%85%E6%9E%90NIO%E5%8C%85%E4%B8%AD%E7%9A%84Buffer%E3%80%81Channel%20%E5%92%8C%20Selector.md)
-* [Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO](https://github.com/h2pl/Java-Tutorial/blob/master/docs/java/network-programming/Java%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E5%92%8CNIO%E8%AF%A6%E8%A7%A35%EF%BC%9AJava%20%E9%9D%9E%E9%98%BB%E5%A1%9E%20IO%20%E5%92%8C%E5%BC%82%E6%AD%A5%20IO.md)
-* [Java网络编程和NIO详解6:Linux epoll实现原理详解](docs/java/jvm/Java网络编程和NIO详解6:Linux%20epoll实现原理详解.md)
-* [Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理](Java网络编程和NIO详解7:浅谈%20Linux%20中NIO%20Selector%20的实现原理.md)
-* [Java网络编程与NIO详解8:浅析mmap和Direct Buffer](https://github.com/h2pl/Java-Tutorial/blob/master/docs/java/network-programming/Java%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E4%B8%8ENIO%E8%AF%A6%E8%A7%A38%EF%BC%9A%E6%B5%85%E6%9E%90mmap%E5%92%8CDirect%20Buffer.md)
-* [Java网络编程和NIO详解9:基于NIO的网络编程框架Netty](docs/java/jvm/Java网络编程和NIO详解9:基于NIO的网络编程框架Netty.md)
-* [Java网络编程与NIO详解10:深度解读Tomcat中的NIO模型](https://github.com/h2pl/Java-Tutorial/blob/master/docs/java/network-programming/Java%E7%BD%91%E7%BB%9C%E7%BC%96%E7%A8%8B%E4%B8%8ENIO%E8%AF%A6%E8%A7%A310%EF%BC%9A%E6%B7%B1%E5%BA%A6%E8%A7%A3%E8%AF%BBTomcat%E4%B8%AD%E7%9A%84NIO%E6%A8%A1%E5%9E%8B.md)
-* [Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO)](docs/java/jvm/Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO).md)
+* [Java网络编程和NIO详解1:JAVA 中原生的 socket 通信机制](docs/java/network-programming/Java网络编程和NIO详解1:JAVA%20中原生的%20socket%20通信机制.md)
+* [Java网络编程与NIO详解2:JAVA NIO 一步步构建IO多路复用的请求模型](docs/java/network-programming/Java网络编程与NIO详解2:JAVA%20NIO%20一步步构建IO多路复用的请求模型.md)
+* [Java网络编程和NIO详解3:IO模型与Java网络编程模型](docs/java/network-programming/Java网络编程和NIO详解3:IO模型与Java网络编程模型.md)
+* [Java网络编程与NIO详解4:浅析NIO包中的Buffer、Channel 和 Selector](docs/java/network-programming/Java网络编程与NIO详解4:浅析NIO包中的Buffer、Channel%20和%20Selector.md)
+* [Java网络编程和NIO详解5:Java 非阻塞 IO 和异步 IO](docs/java/network-programming/Java网络编程和NIO详解5:Java%20非阻塞%20IO%20和异步%20IO.md)
+* [Java网络编程和NIO详解6:Linux epoll实现原理详解](docs/java/network-programming/Java网络编程和NIO详解6:Linux%20epoll实现原理详解.md)
+* [Java网络编程和NIO详解7:浅谈 Linux 中NIO Selector 的实现原理](docs/java/network-programming/Java网络编程和NIO详解7:浅谈%20Linux%20中NIO%20Selector%20的实现原理.md)
+* [Java网络编程与NIO详解8:浅析mmap和Direct Buffer](docs/java/network-programming/Java网络编程与NIO详解8:浅析mmap和Direct%20Buffer.md)
+* [Java网络编程和NIO详解9:基于NIO的网络编程框架Netty](docs/java/network-programming/Java网络编程和NIO详解9:基于NIO的网络编程框架Netty.md)
+* [Java网络编程与NIO详解10:深度解读Tomcat中的NIO模型](docs/java/network-programming/Java网络编程与NIO详解10:深度解读Tomcat中的NIO模型.md)
+* [Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO)](docs/java/network-programming/Java网络编程与NIO详解11:Tomcat中的Connector源码分析(NIO).md)
+
+## 算法
+
+* [必背代码](docs/code/code.md)
+* [必备算法总结](https://www.zhihu.com/question/23148377/answer/907915556)
+* [剑指offer](docs/algorithms/剑指offer.md)
+* [动态规划](https://www.cxyxiaowu.com/6781.html)
+* [十大排序](https://www.zhihu.com/question/51337272/answer/572455307)
+* [排序JAVA代码](https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247484184&idx=1&sn=62965b401aa42107b3c17d1d8ea17454&chksm=fa0e6c99cd79e58f298e9026f677f912bd8c8e55edb48fc509b2b5834f05e529a9b47d59d202&scene=21#wechat_redirect)
+
+
## 计算机基础
### 计算机网络
-todo
+* [计算机网络学习总结](docs/network/计算机网络学习总结.md)
+* [tcp/ip必会](https://www.cxyxiaowu.com/11609.html)
+* [计算机网络——五层与七层模型](https://blog.csdn.net/liuchengzimozigreat/article/details/100169829)
### 操作系统
-todo
+
+[操作系统学习总结](docs/operating-system/操作系统学习总结.md)
+
+[操作系统复习](docs/operating-system/操作系统复习.md)
#### Linux相关
-todo
+[Linux内核与基础命令学习总结](docs/operating-system/Linux内核与基础命令学习总结.md)
+
+### 编译原理
+
+todo
### 数据结构与算法
+
todo
#### 数据结构
-todo
+
+* [数据结构总复习](https://blog.csdn.net/zl88086603/article/details/80727172)
#### 算法
+
todo
## 数据库
+
todo
### MySQL
* [Mysql原理与实践总结](docs/database/Mysql原理与实践总结.md)
* [重新学习Mysql数据库1:无废话MySQL入门](docs/database/重新学习Mysql数据库1:无废话MySQL入门.md)
-* [重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB](docs/database/重新学习Mysql数据库2:%20『浅入浅出』MySQL%20和%20InnoDB.md)
+* [重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB](docs/database/重新学习Mysql数据库2:MySQL%20和%20InnoDB.md)
* [重新学习Mysql数据库3:Mysql存储引擎与数据存储原理](docs/database/重新学习Mysql数据库3:Mysql存储引擎与数据存储原理.md)
* [重新学习Mysql数据库4:Mysql索引实现原理和相关数据结构算法](docs/database/重新学习Mysql数据库4:Mysql索引实现原理和相关数据结构算法.md)
* [重新学习Mysql数据库5:根据MySQL索引原理进行分析与优化](docs/database/重新学习Mysql数据库5:根据MySQL索引原理进行分析与优化.md)
@@ -276,7 +289,10 @@ todo
### Kafka
+Todo
+
## 大后端
+
* [后端技术杂谈开篇:云计算,大数据与AI的故事](docs/big-backEnd/后端技术杂谈开篇:云计算,大数据与AI的故事.md)
* [后端技术杂谈1:搜索引擎基础倒排索引](docs/big-backEnd/后端技术杂谈1:搜索引擎基础倒排索引.md)
* [后端技术杂谈2:搜索引擎工作原理](docs/big-backEnd/后端技术杂谈2:搜索引擎工作原理.md)
@@ -330,13 +346,25 @@ todo
## 面试指南
todo
+
+### 典例问题
+
+* [熟记算法](docs/code/code.md)
+
+* [Java面试大纲](https://www.jianshu.com/p/a07d1d4004b0)
+* [校招Java后端](https://www.zhihu.com/question/403508943/answer/1311334943)
+* [常见SSM](https://zhuanlan.zhihu.com/p/140394330)
+* [MySQL](https://zhuanlan.zhihu.com/p/140876416)
+
### 校招指南
todo
### 面经
+
todo
## 工具
+
todo
## 资料
@@ -347,29 +375,3 @@ todo
## 待办
springboot和springcloud
-
-## 微信公众号
-
-### Java技术江湖
-
-如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!
-
-**Java工程师技术学习资料:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。
-
-**Java进阶架构师资料:** 关注公众号后回复 **”架构师“** 即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源
-
-
-
-### 个人公众号:程序员黄小斜
-
-黄小斜是 985 硕士,阿里巴巴Java工程师,在自学编程、技术求职、Java学习等方面有丰富经验和独到见解,希望帮助到更多想要从事互联网行业的程序员们。
-
-作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得,以及自学编程和Java技术栈的相关干货。
-
-黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长!
-
-**原创电子书:** 关注微信公众号【程序员黄小斜】后回复 **"原创电子书"** 即可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》这份电子书总结了我2年的Java学习之路,包括学习方法、技术总结、求职经验和面试技巧等内容,已经帮助很多的程序员拿到了心仪的offer!
-
-**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号【程序员黄小斜】后,后台回复关键字 **“资料”** 即可免费无套路获取,包括Java、python、C++、大数据、机器学习、前端、移动端等方向的技术资料。
-
-
diff --git a/backup.md b/backup.md
deleted file mode 100644
index f2fb131..0000000
--- a/backup.md
+++ /dev/null
@@ -1,81 +0,0 @@
-## 声明
-
-**关于仓库**
-
-本仓库是笔者在准备 2018 年秋招复习过程中的学习总结,内容以Java后端的知识总结为主,其中大部分都是笔者根据自己的理解加上个人博客总结而来的。
-
-其中有少数内容可能会包含瞎XX说,语句不通顺,内容不全面等各方面问题,还请见谅。
-
-每篇文章都会有笔者更加详细的一系列博客可供参考,这些文章也被我发表在CSDN技术博客上,整理成博客专栏,欢迎查看━(*`∀´*)ノ亻!
-
-详细内容请见我的CSDN技术博客:https://blog.csdn.net/a724888
-
-**更多校招干货和技术文章请关注我的公众号:黄小斜**
-
-| Ⅰ | Ⅱ | Ⅲ | Ⅳ | Ⅴ | Ⅵ | Ⅶ | Ⅷ | Ⅸ |
-| :----------------------------: | :--------------------------------------: | :------------------------: | :----------------------------------------: | :--------------------------: | :---------------------------------: | :-----------------------------------------: | :----------------------------------: | :--------------------------------------------: |
-| 算法[:pencil2:](#算法-pencil2) | 操作系统[:computer:](#操作系统-computer) | 网络[:cloud:](#网络-cloud) | 数据库[:floppy_disk:](#数据库-floppy_disk) | Java[:couple:](#Java-couple) | JavaWeb [:coffee:](#JavaWeb-coffee) | 分布式 [:sweat_drops:](#分布式-sweat_drops) | 设计模式[:hammer:](#设计模式-hammer) | Hadoop[:speak_no_evil:](#Hadoop-speak_no_evil) |
-
-## 算法 :pencil2:
-
-> [剑指offer算法总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/%E5%89%91%E6%8C%87offer.md)
-
-> [LeetCode刷题指南](https://github.com/h2pl/Java-Tutorial/blob/master/md/LeetCode%E5%88%B7%E9%A2%98%E6%8C%87%E5%8D%97.md)
-
-## 操作系统 :computer:
-
-> [操作系统学习总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93.md)
-
-> [Linux内核与基础命令学习总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/Linux%E5%86%85%E6%A0%B8%E4%B8%8E%E5%9F%BA%E7%A1%80%E5%91%BD%E4%BB%A4%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93.md)
-
-## 网络 :cloud:
-
-> [计算机网络学习总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93.md)
-
-## 数据库 :floppy_disk:
-
-> [Mysql原理与实践总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/Mysql%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E8%B7%B5%E6%80%BB%E7%BB%93.md)
-
-> [Redis原理与实践总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/Redis%E5%8E%9F%E7%90%86%E4%B8%8E%E5%AE%9E%E8%B7%B5%E6%80%BB%E7%BB%93.md)
-
-## Java :couple:
-
-> [Java核心技术总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/Java%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.md)
-
-> [Java集合类总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/Java%E9%9B%86%E5%90%88%E7%B1%BB%E6%80%BB%E7%BB%93.md)
-
-> [Java并发技术总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/Java%E5%B9%B6%E5%8F%91%E6%80%BB%E7%BB%93.md)
-
-> [JVM原理学习总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/JVM%E6%80%BB%E7%BB%93.md)
-
-> [Java网络与NIO总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/Java%E7%BD%91%E7%BB%9C%E4%B8%8ENIO%E6%80%BB%E7%BB%93.md)
-
-## JavaWeb :coffee:
-
-> [JavaWeb技术学习总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/JavaWeb%E6%8A%80%E6%9C%AF%E6%80%BB%E7%BB%93.md)
-
-> [Spring与SpringMVC源码解析](https://github.com/h2pl/Java-Tutorial/blob/master/md/Spring%E4%B8%8ESpringMVC%E6%BA%90%E7%A0%81%E8%A7%A3%E6%9E%90%E6%80%BB%E7%BB%93.md)
-
-## 分布式 :sweat_drops:
-
-> [分布式理论学习总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/%E5%88%86%E5%B8%83%E5%BC%8F%E7%90%86%E8%AE%BA%E6%80%BB%E7%BB%93.md)
-
-> [分布式技术学习总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/%E5%88%86%E5%B8%83%E5%BC%8F%E6%8A%80%E6%9C%AF%E5%AE%9E%E8%B7%B5%E6%80%BB%E7%BB%93.md)
-
-## 设计模式 :hammer:
-> [设计模式学习总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E5%AD%A6%E4%B9%A0%E6%80%BB%E7%BB%93.md)
-
-## Hadoop :speak_no_evil:
-
-> [Hadoop生态学习总结](https://github.com/h2pl/Java-Tutorial/blob/master/md/Hadoop%E7%94%9F%E6%80%81%E6%80%BB%E7%BB%93.md)
-
-
-
-**关于转载**
-
-转载的时候请注明一下出处就行啦。
-
-另外我这个仓库的格式模仿的是@CyC2018 大佬的仓库
-
-并且其中一篇LeetCode刷题指南也是fork这位大佬而来的。我只是自己刷了一遍然后稍微加了一些解析,站在大佬肩膀上。
-
diff --git "a/docs/algorithms/\345\211\221\346\214\207offer.md" "b/docs/algorithms/\345\211\221\346\214\207offer.md"
index a4f7aca..66dc482 100644
--- "a/docs/algorithms/\345\211\221\346\214\207offer.md"
+++ "b/docs/algorithms/\345\211\221\346\214\207offer.md"
@@ -266,6 +266,7 @@ https://github.com/h2pl/SwordToOffer
+
该算法的时间复杂度是多少呢?考虑最坏情况下,每次 partition 将数组分为长度为 N-1 和 1 的两部分,然后在长的一边继续寻找第 K 大,此时时间复杂度为 O(N^2 )。不过如果在开始之前将数组进行随机打乱,那么可以尽量避免最坏情况的出现。而在最好情况下,每次将数组均分为长度相同的两半,运行时间 T(N) = N + T(N/2),时间复杂度是 O(N)。
所以也就是说,本题用这个方法解的话,复杂度只需要O(n),因为第一次交换需要N/2,j接下来的交换的次数越来越少,最后加起来就是O(N)了。
@@ -304,11 +305,11 @@ https://github.com/h2pl/SwordToOffer
- for(int i=0;i= matrix.length || x < 0 || y >= matrix[0].length || y < 0) {
- continue;
- }
- if (visit[x][y] == 0 && matrix[x][y] == str[cur]) {
- sb.append(matrix[x][y]);
- visit[x][y] = 1;
- dfs(matrix, x, y, visit, str, cur + 1, sb);
- sb.deleteCharAt(sb.length() - 1);
- visit[x][y] = 0;
- }
- }
- }
-
-
## 机器人的运动范围
@@ -1715,20 +1668,5 @@ public static int LastRemaining_Solution(int n, int m) {
return sum;
}
}
-## 微信公众号
-
-### Java技术江湖
-
-如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!
-
-**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。
-
-
-
-### 个人公众号:黄小斜
-
-作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量!
-**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。
-
diff --git "a/docs/big-backEnd/Hadoop\347\224\237\346\200\201\346\200\273\347\273\223.md" "b/docs/big-backEnd/Hadoop\347\224\237\346\200\201\346\200\273\347\273\223.md"
index 0dbb50d..05edeaf 100644
--- "a/docs/big-backEnd/Hadoop\347\224\237\346\200\201\346\200\273\347\273\223.md"
+++ "b/docs/big-backEnd/Hadoop\347\224\237\346\200\201\346\200\273\347\273\223.md"
@@ -275,20 +275,5 @@ spout负责获取数据,并且将数据发送给bolt,这个过程就是把
这就形成了一个完整的流程。
-## 微信公众号
-### Java技术江湖
-如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!
-
-**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。
-
-
-
-### 个人公众号:黄小斜
-
-作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量!
-
-**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。
-
-
diff --git "a/docs/cache/Redis\345\216\237\347\220\206\344\270\216\345\256\236\350\267\265\346\200\273\347\273\223.md" "b/docs/cache/Redis\345\216\237\347\220\206\344\270\216\345\256\236\350\267\265\346\200\273\347\273\223.md"
index 4a2131b..f16e8ce 100644
--- "a/docs/cache/Redis\345\216\237\347\220\206\344\270\216\345\256\236\350\267\265\346\200\273\347\273\223.md"
+++ "b/docs/cache/Redis\345\216\237\347\220\206\344\270\216\345\256\236\350\267\265\346\200\273\347\273\223.md"
@@ -15,29 +15,10 @@
* [总结](#总结)
* [分布式方案](#分布式方案)
* [redis事务](#redis事务)
+
* [redis脚本事务](#redis脚本事务)
- * [微信公众号](#微信公众号)
- * [Java技术江湖](#java技术江湖)
- * [个人公众号:黄小斜](#个人公众号:黄小斜)
-
-
----
-title: Redis原理与实践总结
-date: 2018-07-08 22:15:12
-tags:
- - Redis
-categories:
- - 后端
- - 技术总结
----
-
-本文主要对Redis的设计和实现原理做了一个介绍很总结,有些东西我也介绍的不是很详细准确,尽量在自己的理解范围内把一些知识点和关键性技术做一个描述。如有错误,还望见谅,欢迎指出。
-这篇文章主要还是参考我之前的技术专栏总结而来的。欢迎查看:
-
-重新学习Redis
-
-https://blog.csdn.net/column/details/21877.html
-
+
+
## 使用和基础数据结构(外观)
@@ -455,20 +436,4 @@ redis事务的ACID特性
因为redis事务不过是简单的用队列包裹起来一组redis命令,redis并没有为事务提供任何额外的持久化功能,所以redis事务的耐久性由redis使用的模式
决定
-## 微信公众号
-
-### Java技术江湖
-
-如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!
-
-**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。
-
-
-
-### 个人公众号:黄小斜
-
-作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量!
-
-**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。
-
diff --git a/docs/code/code.md b/docs/code/code.md
new file mode 100644
index 0000000..0f5b798
--- /dev/null
+++ b/docs/code/code.md
@@ -0,0 +1,429 @@
+# [熟记算法代码](https://www.zhihu.com/question/23148377/answer/907915556)
+
+## 动态规划
+
+```java
+public int dpExample(int n) {
+ int[] dp = new int[n + 1]; // 多开一位用来存放 0 个 1 相加的结果
+
+ dp[0] = 0; // 0 个 1 相加等于 0
+
+ for (int i = 1; i <= n; ++i) {
+ dp[i] = dp[i - 1] + 1;
+ }
+
+ return dp[n];
+}
+```
+
+## 排序
+
+### 冒泡排序
+
+- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
+- 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
+- 针对所有的元素重复以上的步骤,除了最后一个。
+- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
+
+```java
+public class BubbleSort implements IArraySort {
+
+ @Override
+ public int[] sort(int[] sourceArray) throws Exception {
+ // 对 arr 进行拷贝,不改变参数内容
+ int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
+
+ for (int i = 1; i < arr.length; i++) {
+ // 设定一个标记,若为true,则表示此次循环没有进行交换,也就是待排序列已经有序,排序已经完成。
+ boolean flag = true;
+
+ for (int j = 0; j < arr.length - i; j++) {
+ if (arr[j] > arr[j + 1]) {
+ int tmp = arr[j];
+ arr[j] = arr[j + 1];
+ arr[j + 1] = tmp;
+
+ flag = false;
+ }
+ }
+
+ if (flag) {
+ break;
+ }
+ }
+ return arr;
+ }
+}
+```
+
+### 选择排序
+
+- 首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置
+- 再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。
+- 重复第二步,直到所有元素均排序完毕。
+
+```java
+public class SelectionSort implements IArraySort {
+
+ @Override
+ public int[] sort(int[] sourceArray) throws Exception {
+ int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
+
+ // 总共要经过 N-1 轮比较
+ for (int i = 0; i < arr.length - 1; i++) {
+ int min = i;
+
+ // 每轮需要比较的次数 N-i
+ for (int j = i + 1; j < arr.length; j++) {
+ if (arr[j] < arr[min]) {
+ // 记录目前能找到的最小值元素的下标
+ min = j;
+ }
+ }
+
+ // 将找到的最小值和i位置所在的值进行交换
+ if (i != min) {
+ int tmp = arr[i];
+ arr[i] = arr[min];
+ arr[min] = tmp;
+ }
+
+ }
+ return arr;
+ }
+}
+```
+
+### 插入排序
+
+将第一待排序序列第一个元素看做一个有序序列,把第二个元素到最后一个元素当成是未排序序列。
+
+从头到尾依次扫描未排序序列,将扫描到的每个元素插入有序序列的适当位置。(如果待插入的元素与有序序列中的某个元素相等,则将待插入元素插入到相等元素的后面。)
+
+```java
+public class InsertSort implements IArraySort {
+
+ @Override
+ public int[] sort(int[] sourceArray) throws Exception {
+ // 对 arr 进行拷贝,不改变参数内容
+ int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
+
+ // 从下标为1的元素开始选择合适的位置插入,因为下标为0的只有一个元素,默认是有序的
+ for (int i = 1; i < arr.length; i++) {
+
+ // 记录要插入的数据
+ int tmp = arr[i];
+
+ // 从已经排序的序列最右边的开始比较,找到比其小的数
+ int j = i;
+ while (j > 0 && tmp < arr[j - 1]) {
+ arr[j] = arr[j - 1];
+ j--;
+ }
+
+ // 存在比其小的数,插入
+ if (j != i) {
+ arr[j] = tmp;
+ }
+
+ }
+ return arr;
+ }
+}
+```
+
+### 希尔排序
+
+选择一个增量序列 t1,t2,……,tk,其中 ti > tj, tk = 1;
+
+按增量序列个数 k,对序列进行 k 趟排序;
+
+每趟排序,根据对应的增量 ti,将待排序列分割成若干长度为 m 的子序列,分别对各子表进行直接插入排序。仅增量因子为 1 时,整个序列作为一个表来处理,表长度即为整个序列的长度。
+
+```java
+public class ShellSort implements IArraySort {
+
+ @Override
+ public int[] sort(int[] sourceArray) throws Exception {
+ // 对 arr 进行拷贝,不改变参数内容
+ int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
+
+ int gap = 1;
+ while (gap < arr.length) {
+ gap = gap * 3 + 1;
+ }
+
+ while (gap > 0) {
+ for (int i = gap; i < arr.length; i++) {
+ int tmp = arr[i];
+ int j = i - gap;
+ while (j >= 0 && arr[j] > tmp) {
+ arr[j + gap] = arr[j];
+ j -= gap;
+ }
+ arr[j + gap] = tmp;
+ }
+ gap = (int) Math.floor(gap / 3);
+ }
+
+ return arr;
+ }
+}
+```
+
+### 快速排序
+
+- 从数列中挑出一个元素,称为 “基准”(pivot);
+- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
+- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序;
+
+```java
+public class QuickSort implements IArraySort {
+
+ @Override
+ public int[] sort(int[] sourceArray) throws Exception {
+ // 对 arr 进行拷贝,不改变参数内容
+ int[] arr = Arrays.copyOf(sourceArray, sourceArray.length);
+
+ return quickSort(arr, 0, arr.length - 1);
+ }
+
+ private int[] quickSort(int[] arr, int left, int right) {
+ if (left < right) {
+ int partitionIndex = partition(arr, left, right);
+ quickSort(arr, left, partitionIndex - 1);
+ quickSort(arr, partitionIndex + 1, right);
+ }
+ return arr;
+ }
+
+ private int partition(int[] arr, int left, int right) {
+ // 设定基准值(pivot)
+ int pivot = left;
+ int index = pivot + 1;
+ for (int i = index; i <= right; i++) {
+ if (arr[i] < arr[pivot]) {
+ swap(arr, i, index);
+ index++;
+ }
+ }
+ swap(arr, pivot, index - 1);
+ return index - 1;
+ }
+
+ private void swap(int[] arr, int i, int j) {
+ int temp = arr[i];
+ arr[i] = arr[j];
+ arr[j] = temp;
+ }
+
+}
+```
+
+## 搜索
+
+### 二叉树的层次遍历
+
+```java
+public List> levelOrder(TreeNode root) {
+ if(root == null)
+ return new ArrayList<>();
+ List> res = new ArrayList<>();
+ Queue queue = new LinkedList();
+ queue.add(root);
+ while(!queue.isEmpty()){
+ int count = queue.size();
+ List list = new ArrayList();
+ while(count > 0){
+ TreeNode node = queue.poll();
+ list.add(node.val);
+ if(node.left != null)
+ queue.add(node.left);
+ if(node.right != null)
+ queue.add(node.right);
+ count--;
+ }
+ res.add(list);
+ }
+ return res;
+}
+
+```
+
+## 查找
+
+### 二分查找模版
+
+```java
+int start = 0, end = nums.length - 1;
+while (start + 1 < end) {
+ int mid = start + (end - start) / 2;
+
+ if (...) {
+ start = mid;
+ } else {
+ end = mid;
+ }
+}
+```
+
+**查找元素的第一个和最后一个位置**
+
+```java
+public int[] searchRange(int[] nums, int target) {
+ int[] result = new int[]{-1, -1};
+ if (nums == null || nums.length == 0) {
+ return result;
+ }
+
+ // find front
+ int start = 0, end = nums.length - 1;
+ while (start + 1 < end) {
+ int mid = start + (end - start) / 2;
+ if (nums[mid] >= target) {
+ end = mid;
+ } else {
+ start = mid;
+ }
+ }
+
+ if (nums[start] == target) {
+ result[0] = start;
+ } else if (nums[end] == target) {
+ result[0] = end;
+ }
+
+ // find back
+ start = 0; end = nums.length - 1;
+ while (start + 1 < end) {
+ int mid = start + (end - start) / 2;
+ if (nums[mid] <= target) {
+ start = mid;
+ } else {
+ end = mid;
+ }
+ }
+
+ if (nums[end] == target) {
+ result[1] = end;
+ } else if (nums[start] == target) {
+ result[1] = start;
+ }
+
+ return result;
+}
+```
+
+## 字符串匹配
+
+[BM 算法](https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247486150&idx=1&sn=9e9f8c35805c66132005cb634ef18171&chksm=fa0e6547cd79ec51529d0510f18161b65e54826231fae025d2cfbbd4f8a9656460f5b2d424b3&scene=21#wechat_redirect)
+
+[BF 算法](https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247485906&idx=1&sn=f00a07cbca83d345cbacc327e335de2d&chksm=fa0e6653cd79ef45a9566cd8ea947d122cfde8e1c9459332e4d7d04f06644fc7a6e81da7ee10&scene=21#wechat_redirect)
+
+```java
+int index( String S, String T, int pos ){
+ int i = pos; // i 表示主串 S 中当前位置下标
+ int j = 1; // j 表示子串 T 中当前位置下标
+
+ while( i <= S[0] && j <= T[0] ){ // i 或 j 其中一个到达尾部则终止搜索
+ if( S[i] == T[i] ){ // 若相等则继续进行下一个元素匹配
+ i++;
+ j++;
+ }else { // 若匹配失败则 j 回溯到第一个元素重新匹配
+ i = i - j + 2; // 将 i 重新回溯到上次匹配首位的下一个元素
+ j = 1;
+ }
+ }
+
+ if( j > T[0] ){
+ return i - T[0];
+ }else {
+ return 0;
+ }
+}
+```
+
+[KMP 算法](https://mp.weixin.qq.com/s?__biz=MzUyNjQxNjYyMg==&mid=2247486490&idx=3&sn=35ba410818207a1bef83d6578f4b332c&chksm=fa0e639bcd79ea8dff1141a8729cf4b1243d23ac276652a58fc23d7b6b2ce01ca2666feab293&scene=21#wechat_redirect)
+
+```java
+public class KMP {
+ private int[][] dp;
+ private String pat;
+
+ public KMP(String pat) {
+ this.pat = pat;
+ int M = pat.length();
+ // dp[状态][字符] = 下个状态
+ dp = new int[M][256];
+ // base case
+ dp[0][pat.charAt(0)] = 1;
+ // 影子状态 X 初始为 0
+ int X = 0;
+ // 构建状态转移图(稍改的更紧凑了)
+ for (int j = 1; j < M; j++) {
+ for (int c = 0; c < 256; c++) {
+ dp[j][c] = dp[X][c];
+ dp[j][pat.charAt(j)] = j + 1;
+ // 更新影子状态
+ X = dp[X][pat.charAt(j)];
+ }
+ }
+
+ public int search(String txt) {
+ int M = pat.length();
+ int N = txt.length();
+ // pat 的初始态为 0
+ int j = 0;
+ for (int i = 0; i < N; i++) {
+ // 计算 pat 的下一个状态
+ j = dp[j][txt.charAt(i)];
+ // 到达终止态,返回结果
+ if (j == M) return i - M + 1;
+ }
+ // 没到达终止态,匹配失败
+ return -1;
+ }
+}
+```
+
+## 线性表
+
+### 有序数组/链表去重[快慢指针]
+
+```java
+int removeDuplicates(int[] nums){
+ int n = nums.lenght;
+ if(n == 0) return 0;
+ int slow = 0, fast =1;
+ while (fast < n) {
+ if (nums[fast] != nums[slow]) {
+ slow++;
+ // 维护 nums[0..slow] 无重复
+ nums[slow] = nums[fast];
+ }
+ fast++;
+ }
+ // 长度为索引 + 1
+ return slow + 1;
+}
+```
+
+```java
+ListNode deleteDuplicates(ListNode head) {
+ if (head == null) return null;
+ ListNode slow = head, fast = head.next;
+ while (fast != null) {
+ if (fast.val != slow.val) {
+ // nums[slow] = nums[fast];
+ slow.next =fast;
+ // slow++;
+ slow = slow.next;
+ }
+ // fast++;
+ fast = fast.next;
+ }
+ // 断开与后面重复元素的连接
+ slow.next = null;
+ return head;
+}
+```
diff --git "a/docs/database/Mysql\345\216\237\347\220\206\344\270\216\345\256\236\350\267\265\346\200\273\347\273\223.md" "b/docs/database/Mysql\345\216\237\347\220\206\344\270\216\345\256\236\350\267\265\346\200\273\347\273\223.md"
index 53ed5a0..e26aa29 100644
--- "a/docs/database/Mysql\345\216\237\347\220\206\344\270\216\345\256\236\350\267\265\346\200\273\347\273\223.md"
+++ "b/docs/database/Mysql\345\216\237\347\220\206\344\270\216\345\256\236\350\267\265\346\200\273\347\273\223.md"
@@ -21,30 +21,8 @@
* [分库分表](#分库分表)
* [主从复制,读写分离](#主从复制,读写分离)
* [分布式数据库](#分布式数据库)
- * [微信公众号](#微信公众号)
- * [Java技术江湖](#java技术江湖)
- * [个人公众号:黄小斜](#个人公众号:黄小斜)
----
-title: Mysql原理与实践总结
-date: 2018-07-08 22:15:04
-tags:
- - Mysql
-categories:
- - 后端
- - 技术总结
----
-
-本文根据自己对MySQL的学习和实践以及各类文章与书籍总结而来。
-囊括了MySQL数据库的基本原理和技术。本文主要是我的一个学习总结,基于之前的系列文章做了一个概括,如有错误,还望指出,谢谢。
-
-详细内容请参考我的系列文章:
-
-重新学习MySQL与Redis
-
-https://blog.csdn.net/column/details/21877.html
-
# 数据库原理
Mysql是关系数据库。
@@ -62,6 +40,20 @@ Mysql是关系数据库。
## 存储过程与视图
存储过程是对sql语句进行预编译并且以文件形式包装为一个可以快速执行的程序。但是缺点是不易修改,稍微改动语句就需要重新开发储存过程,优点是执行效率快。视图就是对其他一个或多个表进行重新包装,是一个外观模式,对视图数据的改动也会影响到数据报本身。
+## 内模式,模式,外模式
+
+模式又称概念模式或逻辑模式,对应于概念级。它是由数据库设计者综合所有用户的数据,按照统一的观点构造的全局逻辑结构,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。
+
+外模式又称子模式,对应于用户级。它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示。外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据。
+
+内模式又称存储模式,对应于物理级,它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式的物理结构,对应着实际存储在外存储介质上的数据库。内模式由内模式描述语言来描述、定义,它是数据库的存储观。
+
+##### 拓展资料
+
+用户应用程序根据外模式进行数据操作,通过外模式一模式映射,定义和建立某个外模式与模式间的对应关系,将外模式与模式联系起来,当模式发生改变时,只要改变其映射,就可以使外模式保持不变,对应的应用程序也可保持不变;
+
+另一方面,通过模式一内模式映射,定义建立数据的逻辑结构(模式)与存储结构(内模式)间的对应关系,当数据的存储结构发生变化时,只需改变模式一内模式映射,就能保持模式不变,因此应用程序也可以保持不变。
+
## 事务与隔离级别
事务的四个性质:原子性,一致性,持久性,隔离性。
@@ -71,6 +63,8 @@ Mysql是关系数据库。
隔离性:两个事务之间互不相干,不能互相影响。
+持久性:事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。
+
事务的隔离级别
读未提交:事务A和事务B,A事务中执行的操作,B也可以看得到,因为级别是未提交读,别人事务中还没提交的数据你也看得到。这是没有任何并发措施的级别,也是默认级别。这个问题叫做脏读,为了解决这个问题,提出了读已提交。
@@ -88,7 +82,7 @@ Mysql是关系数据库。
# mysql原理
-MySQL是oracle公司的免费数据库,作为关系数据库火了很久了。所以我们要学他。
+MySQL是oracle公司的免费数据库,作为关系数据库火了很久了。所以我们要学它。
## mysql客户端,服务端,存储引擎,文件系统
@@ -186,7 +180,7 @@ User Records 就是整个页面中真正用于存放行记录的部分,而 Fre
## mysql的索引,b树,聚集索引
-1 MySQL的innodb支持聚簇索引,myisam不支持聚簇索引。
+1. MySQL的innodb支持聚簇索引,myisam不支持聚簇索引。
innodb在建表时自动按照第一个非空字段或者主键建立聚簇索引。mysql使用B+树建立索引。
@@ -194,7 +188,7 @@ innodb在建表时自动按照第一个非空字段或者主键建立聚簇索
一个节点页对应着多行数据,每个节点按照顺序使用指针连成一个链表。mysql使用索引访问一行数据时,先通过log2n的时间访问到叶子节点,然后在数据页中按照行数链表执行顺序查找,直到找到那一行数据。
-2 b+树索引可以很好地支持范围搜索,因为叶子节点通过指针相连。
+2. b+树索引可以很好地支持范围搜索,因为叶子节点通过指针相连。
## mysql的explain 慢查询日志
@@ -213,40 +207,40 @@ mysql慢查询日志可以在mysql的,my.cnf文件中配置开启,然后执行
- 还是没用到索引,因为不符合最左前缀匹配。查询需要3.5秒左右
+ 还是没用到索引,因为不符合最左前缀匹配。查询需要3.5秒左右
- 最后修改一下sql语句
-
- EXPLAIN SELECT * FROM vote_record WHERE id > 0 AND vote_num > 1000;
-
- id select_type table partitions type possible_keys key key_len ref rows filtered Extra
-
+ 最后修改一下sql语句
+
+ EXPLAIN SELECT * FROM vote_record WHERE id > 0 AND vote_num > 1000;
+
+ id select_type table partitions type possible_keys key key_len ref rows filtered Extra
+
1 SIMPLE vote_record \N range PRIMARY,votenum,vote PRIMARY 4 \N 498253 50.00 Using where
- 用到了索引,但是只用到了主键索引。再修改一次
+ 用到了索引,但是只用到了主键索引。再修改一次
- EXPLAIN SELECT * FROM vote_record WHERE id > 0 AND vote_num = 1000;
+ EXPLAIN SELECT * FROM vote_record WHERE id > 0 AND vote_num = 1000;
- id select_type table partitions type possible_keys key key_len ref rows filtered Extra
-
- 1 SIMPLE vote_record \N index_merge PRIMARY,votenum,vote votenum,PRIMARY 8,4 \N 51 100.00 Using intersect(votenum,PRIMARY); Using where
+ id select_type table partitions type possible_keys key key_len ref rows filtered Extra
+
+ 1 SIMPLE vote_record \N index_merge PRIMARY,votenum,vote votenum,PRIMARY 8,4 \N 51 100.00 Using intersect(votenum,PRIMARY); Using where
- 用到了两个索引,votenum,PRIMARY。
+ 用到了两个索引,votenum,PRIMARY。
## mysql的binlog,redo log和undo log。
@@ -302,7 +296,7 @@ innodb支持行级锁和事务,而myisam只支持表锁,它的所有操作
通过时间戳来判断先后顺序,并且是无锁的。但是需要额外存一个字段。
- 读操作比较自己的版本号,自动读取比自己版本号新的版本。不读。
+ 读操作比较自己的版本号,自动读取比自己版本号新的版本。否则不读。
写操作自动覆盖写版本号比自己的版本号早的版本。否则不写。
@@ -378,20 +372,5 @@ innodb支持行级锁和事务,而myisam只支持表锁,它的所有操作
redis的分布式部署方案也比较成熟。
-## 微信公众号
-
-### Java技术江湖
-
-如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发!
-
-**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。
-
-
-
-### 个人公众号:黄小斜
-
-作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量!
-**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。
-
diff --git "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\22310\357\274\232MySQL\351\207\214\347\232\204\351\202\243\344\272\233\346\227\245\345\277\227\344\273\254.md" "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\22310\357\274\232MySQL\351\207\214\347\232\204\351\202\243\344\272\233\346\227\245\345\277\227\344\273\254.md"
index f233134..4416084 100644
--- "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\22310\357\274\232MySQL\351\207\214\347\232\204\351\202\243\344\272\233\346\227\245\345\277\227\344\273\254.md"
+++ "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\22310\357\274\232MySQL\351\207\214\347\232\204\351\202\243\344\272\233\346\227\245\345\277\227\344\273\254.md"
@@ -9,27 +9,6 @@
* [总结](#总结)
-本文转自互联网
-
-本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
-> https://github.com/h2pl/Java-Tutorial
-
-喜欢的话麻烦点下Star哈
-
-本也将整理到我的个人博客:
-> www.how2playlife.com
-
-更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。
-
-本文是《重新学习MySQL数据库》系列其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。
-
-该系列博文会告诉你如何从入门到进阶,从sql基本的使用方法,从MySQL执行引擎再到索引、事务等知识,一步步地学习MySQL相关技术的实现原理,更好地了解如何基于这些知识来优化sql,减少SQL执行时间,通过执行计划对SQL性能进行分析,再到MySQL的主从复制、主备部署等内容,以便让你更完整地了解整个MySQL方面的技术体系,形成自己的知识框架。
-
-如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。
-
-
-
-
## 重新学习MySQL数据库10:MySQL里的那些日志们
diff --git "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\22311\357\274\232\344\273\245Java\347\232\204\350\247\206\350\247\222\346\235\245\350\201\212\350\201\212SQL\346\263\250\345\205\245.md" "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\22311\357\274\232\344\273\245Java\347\232\204\350\247\206\350\247\222\346\235\245\350\201\212\350\201\212SQL\346\263\250\345\205\245.md"
index 8ee94df..ffdda81 100644
--- "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\22311\357\274\232\344\273\245Java\347\232\204\350\247\206\350\247\222\346\235\245\350\201\212\350\201\212SQL\346\263\250\345\205\245.md"
+++ "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\22311\357\274\232\344\273\245Java\347\232\204\350\247\206\350\247\222\346\235\245\350\201\212\350\201\212SQL\346\263\250\345\205\245.md"
@@ -3,60 +3,24 @@
* [前言](#前言)
* [靶场准备](#靶场准备)
* [SQL注入测试](#sql注入测试)
+
* [注入原理分析](#注入原理分析)
- * [JDBC的预处理](#jdbc的预处理)
- * [Mybatis下注入防范](#mybatis下注入防范)
- * [JPA注入防范](#jpa注入防范)
- * [SQL注入的其他防范办法](#sql注入的其他防范办法)
- * [小结](#小结)
-
-
-本文转自互联网
-
-本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
-> https://github.com/h2pl/Java-Tutorial
-
-喜欢的话麻烦点下Star哈
-
-本也将整理到我的个人博客:
-> www.how2playlife.com
-
-更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。
-
-本文是《重新学习MySQL数据库》系列其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。
-
-该系列博文会告诉你如何从入门到进阶,从sql基本的使用方法,从MySQL执行引擎再到索引、事务等知识,一步步地学习MySQL相关技术的实现原理,更好地了解如何基于这些知识来优化sql,减少SQL执行时间,通过执行计划对SQL性能进行分析,再到MySQL的主从复制、主备部署等内容,以便让你更完整地了解整个MySQL方面的技术体系,形成自己的知识框架。
-如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。
-
-
-
-
-
-本文转自互联网
-
-本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
-> https://github.com/h2pl/Java-Tutorial
-
-喜欢的话麻烦点下Star哈
-
-文章首发于我的个人博客:
-> www.how2playlife.com
+ * [JDBC的预处理](#jdbc的预处理)
-本文是微信公众号【Java技术江湖】的《重新学习MySQL数据库》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。
+ * [Mybatis下注入防范](#mybatis下注入防范)
-该系列博文会告诉你如何从入门到进阶,从sql基本的使用方法,从MySQL执行引擎再到索引、事务等知识,一步步地学习MySQL相关技术的实现原理,更好地了解如何基于这些知识来优化sql,减少SQL执行时间,通过执行计划对SQL性能进行分析,再到MySQL的主从复制、主备部署等内容,以便让你更完整地了解整个MySQL方面的技术体系,形成自己的知识框架。
+ * [JPA注入防范](#jpa注入防范)
-如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。
+ * [SQL注入的其他防范办法](#sql注入的其他防范办法)
-
+ * [小结](#小结)
+
## 前言
-
-
### 靶场准备
首先我们来准备一个web接口服务,该服务可以提供管理员的信息查询,这里我们采用springboot + jersey 来构建web服务框架,数据库则采用最常用的mysql。下面,我们来准备测试环境,首先建立一张用户表jwtk_admin,SQL如下:
diff --git "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\2236\357\274\232\346\265\205\350\260\210MySQL\347\232\204\344\270\255\344\272\213\345\212\241\344\270\216\351\224\201.md" "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\2236\357\274\232\346\265\205\350\260\210MySQL\347\232\204\344\270\255\344\272\213\345\212\241\344\270\216\351\224\201.md"
index 94eee23..a462b5a 100644
--- "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\2236\357\274\232\346\265\205\350\260\210MySQL\347\232\204\344\270\255\344\272\213\345\212\241\344\270\216\351\224\201.md"
+++ "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\2236\357\274\232\346\265\205\350\260\210MySQL\347\232\204\344\270\255\344\272\213\345\212\241\344\270\216\351\224\201.md"
@@ -35,29 +35,6 @@
* [PostgreSQL 与 MVCC](#postgresql-与-mvcc)
-本文转自互联网
-
-本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
-> https://github.com/h2pl/Java-Tutorial
-
-喜欢的话麻烦点下Star哈
-
-本也将整理到我的个人博客:
-> www.how2playlife.com
-
-更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。
-
-本文是《重新学习MySQL数据库》系列其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。
-
-该系列博文会告诉你如何从入门到进阶,从sql基本的使用方法,从MySQL执行引擎再到索引、事务等知识,一步步地学习MySQL相关技术的实现原理,更好地了解如何基于这些知识来优化sql,减少SQL执行时间,通过执行计划对SQL性能进行分析,再到MySQL的主从复制、主备部署等内容,以便让你更完整地了解整个MySQL方面的技术体系,形成自己的知识框架。
-
-如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。
-
-
-
-
-
-
## 『浅入深出』MySQL 中事务的实现
@@ -375,9 +352,9 @@ MySQL 中实现的多版本两阶段锁协议(Multiversion 2PL)将 MVCC 和
MySQL 在InnoDB引擎下有当前读和快照读两种模式。
-1 当前读即加锁读,读取记录的最新版本号,会加锁保证其他并发事物不能修改当前记录,直至释放锁。插入/更新/删除操作默认使用当前读,显示的为select语句加lock in share mode或for update的查询也采用当前读模式。
+1 当前读即加锁读,读取记录的最新版本号,会加锁保证其他并发事务不能修改当前记录,直至释放锁。插入/更新/删除操作默认使用当前读,显式的为select语句加lock in share mode或for update的查询也采用当前读模式。
-2 快照读:不加锁,读取记录的快照版本,而非最新版本,使用MVCC机制,最大的好处是读取不需要加锁,读写不冲突,用于读操作多于写操作的应用,因此在不显示加[lock in share mode]/[for update]的select语句,即普通的一条select语句默认都是使用快照读MVCC实现模式。所以楼主的为了让大家明白所做的演示操作,既有当前读也有快照读……
+2 快照读:不加锁,读取记录的快照版本,而非最新版本,使用MVCC机制,最大的好处是读取不需要加锁,读写不冲突,用于读操作多于写操作的应用,因此在不显式加[lock in share mode]/[for update]的select语句,即普通的一条select语句默认都是使用快照读MVCC实现模式。所以楼主的为了让大家明白所做的演示操作,既有当前读也有快照读……
1.1 什么是MVCC
@@ -395,7 +372,7 @@ MVCC是通过保存数据在某个时间点的快照来实现的. 不同存储
2.MVCC 具体实现分析
-下面,我们通过InnoDB的MVCC实现来分析MVCC使怎样进行并发控制的. InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间。这里存储的并不是实际的时间值,而是系统版本号(可以理解为事务的ID),没开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的ID.下面看一下在REPEATABLE READ隔离级别下,MVCC具体是如何操作的.
+下面,我们通过InnoDB的MVCC实现来分析MVCC使怎样进行并发控制的. InnoDB的MVCC,是通过在每行记录后面保存两个隐藏的列来实现的,这两个列,分别保存了这个行的创建时间,一个保存的是行的删除时间。这里存储的并不是实际的时间值,而是系统版本号(可以理解为事务的ID),每开始一个新的事务,系统版本号就会自动递增,事务开始时刻的系统版本号会作为事务的ID.下面看一下在REPEATABLE READ隔离级别下,MVCC具体是如何操作的.
2.1简单的小例子
diff --git "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\2239\357\274\232Innodb\344\270\255\347\232\204\344\272\213\345\212\241\351\232\224\347\246\273\347\272\247\345\210\253\345\222\214\351\224\201\347\232\204\345\205\263\347\263\273.md" "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\2239\357\274\232Innodb\344\270\255\347\232\204\344\272\213\345\212\241\351\232\224\347\246\273\347\272\247\345\210\253\345\222\214\351\224\201\347\232\204\345\205\263\347\263\273.md"
index 17dd649..f628c38 100644
--- "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\2239\357\274\232Innodb\344\270\255\347\232\204\344\272\213\345\212\241\351\232\224\347\246\273\347\272\247\345\210\253\345\222\214\351\224\201\347\232\204\345\205\263\347\263\273.md"
+++ "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240MySQL\346\225\260\346\215\256\345\272\2239\357\274\232Innodb\344\270\255\347\232\204\344\272\213\345\212\241\351\232\224\347\246\273\347\272\247\345\210\253\345\222\214\351\224\201\347\232\204\345\205\263\347\263\273.md"
@@ -2,6 +2,7 @@
* [Innodb中的事务隔离级别和锁的关系](#innodb中的事务隔离级别和锁的关系)
* [事务中的加锁方式](#事务中的加锁方式)
+
* [](#)
* [MySQL中锁的种类](#mysql中锁的种类)
* [Read Committed(读取提交内容)](#read-committed(读取提交内容))
@@ -12,31 +13,12 @@
* [MVCC在MySQL的InnoDB中的实现](#mvcc在mysql的innodb中的实现)
* [“读”与“读”的区别](#读与读的区别)
* [](#-2)
+
* [](#-3)
- * [](#-4)
-
-
-本文转自互联网
-
-本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
-> https://github.com/h2pl/Java-Tutorial
-
-喜欢的话麻烦点下Star哈
-
-本也将整理到我的个人博客:
-> www.how2playlife.com
-
-更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。
-
-本文是《重新学习MySQL数据库》系列其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。
-
-该系列博文会告诉你如何从入门到进阶,从sql基本的使用方法,从MySQL执行引擎再到索引、事务等知识,一步步地学习MySQL相关技术的实现原理,更好地了解如何基于这些知识来优化sql,减少SQL执行时间,通过执行计划对SQL性能进行分析,再到MySQL的主从复制、主备部署等内容,以便让你更完整地了解整个MySQL方面的技术体系,形成自己的知识框架。
-
-如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。
-
-
-
-
+
+ * [](#-4)
+
+
## Innodb中的事务隔离级别和锁的关系
diff --git "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\25613\357\274\232Mysql\344\270\273\344\273\216\345\244\215\345\210\266\357\274\214\350\257\273\345\206\231\345\210\206\347\246\273\357\274\214\345\210\206\350\241\250\345\210\206\345\272\223\347\255\226\347\225\245\344\270\216\345\256\236\350\267\265.md" "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\25613\357\274\232Mysql\344\270\273\344\273\216\345\244\215\345\210\266\357\274\214\350\257\273\345\206\231\345\210\206\347\246\273\357\274\214\345\210\206\350\241\250\345\210\206\345\272\223\347\255\226\347\225\245\344\270\216\345\256\236\350\267\265.md"
index 38d0148..a2dce6f 100644
--- "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\25613\357\274\232Mysql\344\270\273\344\273\216\345\244\215\345\210\266\357\274\214\350\257\273\345\206\231\345\210\206\347\246\273\357\274\214\345\210\206\350\241\250\345\210\206\345\272\223\347\255\226\347\225\245\344\270\216\345\256\236\350\267\265.md"
+++ "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\25613\357\274\232Mysql\344\270\273\344\273\216\345\244\215\345\210\266\357\274\214\350\257\273\345\206\231\345\210\206\347\246\273\357\274\214\345\210\206\350\241\250\345\210\206\345\272\223\347\255\226\347\225\245\344\270\216\345\256\236\350\267\265.md"
@@ -24,30 +24,8 @@
* [dataHost](#datahost)
-本文转自互联网
-本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看
-> https://github.com/h2pl/Java-Tutorial
-
-喜欢的话麻烦点下Star哈
-
-本也将整理到我的个人博客:
-> www.how2playlife.com
-
-更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。
-
-本文是《重新学习MySQL数据库》系列其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。
-
-该系列博文会告诉你如何从入门到进阶,从sql基本的使用方法,从MySQL执行引擎再到索引、事务等知识,一步步地学习MySQL相关技术的实现原理,更好地了解如何基于这些知识来优化sql,减少SQL执行时间,通过执行计划对SQL性能进行分析,再到MySQL的主从复制、主备部署等内容,以便让你更完整地了解整个MySQL方面的技术体系,形成自己的知识框架。
-
-如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。
-
-
-
-
-
-
-一、MySQL扩展具体的实现方式
+## 一、MySQL扩展具体的实现方式
随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。
@@ -361,7 +339,8 @@ create database database4 character set utf8;
执行`bin`目录下的`startup_nowrap.bat`文件,如果输出下面内容,则说明已经启动mycat成功,如果没有,请检查`order,trade,user,comment`4个数据库是否已经创建。
-