From 59a374264bb8e28488429c433100781597e01ba9 Mon Sep 17 00:00:00 2001 From: Suwen macOS Yurisa <577014284@qq.com> Date: Wed, 15 Jul 2020 17:49:31 +0800 Subject: [PATCH 1/8] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E8=B7=AF=E5=BE=84,=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReadMe.md | 64 +---- .../\345\211\221\346\214\207offer.md" | 104 +++---- ...33\346\200\273\347\273\223\357\274\211.md" | 46 +--- docs/hxx/think/copy.md | 35 --- ...\213\277\345\217\243\345\244\264offer).md" | 259 ------------------ ...40\350\275\275\350\277\207\347\250\213.md" | 4 +- ...72\347\241\200\347\237\245\350\257\206.md" | 8 +- ...06\350\212\202\347\262\276\350\256\262.md" | 2 +- ...46\344\271\240\346\200\273\347\273\223.md" | 5 +- ...66\345\231\250\350\257\246\350\247\243.md" | 4 +- 10 files changed, 91 insertions(+), 440 deletions(-) delete mode 100644 "docs/interview/BATJ-Experience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md" diff --git a/ReadMe.md b/ReadMe.md index 54edfa2..a5ee595 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,20 +1,6 @@ -本仓库为【Java工程师技术指南】力求打造最完整最实用的Java工程师学习指南! +本仓库原为[Java工程师技术指南](https://github.com/h2pl/Java-Tutorial)力求打造最完整最实用的Java工程师学习指南! -这些文章和总结都是我近几年学习Java总结和整理出来的,非常实用,对于学习Java后端的朋友来说应该是最全面最完整的技术仓库。 -我靠着这些内容进行复习,拿到了BAT等大厂的offer,这个仓库也已经帮助了很多的Java学习者,如果对你有用,希望能给个star支持我,谢谢! - -为了更好地讲清楚每个知识模块,我们也参考了很多网上的优质博文,力求不漏掉每一个知识点,所有参考博文都将声明转载来源,如有侵权,请联系我。 - -点击关注[微信公众号](#微信公众号)及时获取笔主最新更新文章,并可免费领取Java工程师必备学习资源 - -

- - - -

- - -推荐使用 https://how2playlife.com/ 在线阅读,在线阅读内容本仓库同步一致。这种方式阅读的优势在于:左侧边栏有目录,阅读体验更好。 +现 fork 修正错误和更新内容。 ## 目录 @@ -81,9 +67,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) @@ -212,20 +198,26 @@ todo ## 计算机基础 ### 计算机网络 -todo - +* [计算机网络学习总结](docs/network/计算机网络学习总结.md) ### 操作系统 -todo + +[操作系统学习总结](docs/operating-system/操作系统学习总结.md) #### Linux相关 -todo +[Linux内核与基础命令学习总结](docs/operating-system/Linux内核与基础命令学习总结.md) + +#### 编译原理 + +todo ### 数据结构与算法 + todo #### 数据结构 + todo #### 算法 @@ -347,29 +339,3 @@ todo ## 待办 springboot和springcloud - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师技术学习资料:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -**Java进阶架构师资料:** 关注公众号后回复 **”架构师“** 即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:程序员黄小斜 -​ -黄小斜是 985 硕士,阿里巴巴Java工程师,在自学编程、技术求职、Java学习等方面有丰富经验和独到见解,希望帮助到更多想要从事互联网行业的程序员们。 -​ -作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得,以及自学编程和Java技术栈的相关干货。 -​ -黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长! - -**原创电子书:** 关注微信公众号【程序员黄小斜】后回复 **"原创电子书"** 即可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》这份电子书总结了我2年的Java学习之路,包括学习方法、技术总结、求职经验和面试技巧等内容,已经帮助很多的程序员拿到了心仪的offer! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号【程序员黄小斜】后,后台回复关键字 **“资料”** 即可免费无套路获取,包括Java、python、C++、大数据、机器学习、前端、移动端等方向的技术资料。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/algorithms/\345\211\221\346\214\207offer.md" "b/docs/algorithms/\345\211\221\346\214\207offer.md" index a4f7aca..4c6e825 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 - -- [一面 (37 分钟左右)](#一面-37-分钟左右) -- [二面 (33 分钟左右)](#二面-33-分钟左右) -- [三面 (46 分钟)](#三面-46-分钟) -- [HR 面](#hr-面) - - - -### 一面 (37 分钟左右) - -一面是上海的小哥打来的,3.12 号中午确认的内推,下午就打来约时间了,也是唯一一个约时间的面试官。约的晚上八点。紧张的一比,人生第一次面试就献给了阿里。 - -幸运的是一面的小哥特温柔。好像是个海归?口语中夹杂着英文。废话不多说,上干货: - -**面试官:** 先自我介绍下吧! - -**我:** 巴拉巴拉...。 - -> 关于自我介绍:从 HR 面、技术面到高管面/部门主管面,面试官一般会让你先自我介绍一下,所以好好准备自己的自我介绍真的非常重要。网上一般建议的是准备好两份自我介绍:一份对 HR 说的,主要讲能突出自己的经历,会的编程技术一语带过;另一份对技术面试官说的,主要讲自己会的技术细节,项目经验,经历那些就一语带过。 - -**面试官:** 我看你简历上写你做了个秒杀系统?我们就从这个项目开始吧,先介绍下你的项目。 - -> 关于项目介绍:如果有项目的话,技术面试第一步,面试官一般都是让你自己介绍一下你的项目。你可以从下面几个方向来考虑: -> -> 1. 对项目整体设计的一个感受(面试官可能会让你画系统的架构图) -> 2. 在这个项目中你负责了什么、做了什么、担任了什么角色 -> 3. 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用 -> 4. 另外项目描述中,最好可以体现自己的综合素质,比如你是如何协调项目组成员协同开发的或者在遇到某一个棘手的问题的时候你是如何解决的又或者说你在这个项目用了什么技术实现了什么功能比如:用 redis 做缓存提高访问速度和并发量、使用消息队列削峰和降流等等。 - -**我:** 我说了我是如何考虑它的需求(秒杀地址隐藏,记录订单,减库存),一开始简单的用 synchronized 锁住方法,出现了问题,后来乐观锁改进,又有瓶颈,再上缓存,出现了缓存雪崩,于是缓存预热,错开缓存失效时间。最后,发现先记录订单再减库存会减少行级锁等待时间。 - -> 一面面试官很耐心地听,并给了我一些指导,问了我乐观锁是怎么实现的,我说是基于 sql 语句,在减库存操作的 where 条件里加剩余库存数>0,他说这应该不算是一种乐观锁,应该先查库存,在减库存的时候判断当前库存是否与读到的库存一样(可这样不是多一次查询操作吗?不是很理解,不过我没有反驳,只是说理解您的意思。事实证明千万别怼面试官,即使你觉得他说的不对) - -**面试官:** 我缓存雪崩什么情况下会发生?如何避免? - -**我:** 当多个商品缓存同时失效时会雪崩,导致大量查询数据库。还有就是秒杀刚开始的时候缓存里没有数据。解决方案:缓存预热,错开缓存失效时间 - -**面试官:** 问我更新数据库的同时为什么不马上更新缓存,而是删除缓存? - -**我:** 因为考虑到更新数据库后更新缓存可能会因为多线程下导致写入脏数据(比如线程 A 先更新数据库成功,接下来要取更新缓存,接着线程 B 更新数据库,但 B 又更新了缓存,接着 B 的时间片用完了,线程 A 更新了缓存) - -逼逼了将近 30 分钟,面试官居然用周杰伦的语气对我说: - -![not bad](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3not-bad.jpg) - -我突然受宠若惊,连忙说谢谢,也正是因为第一次面试得到了面试官的肯定,才让我信心大增,二三面稳定发挥。 - -**面试官又曰:** 我看你还懂数据库是吧,答:略懂略懂。。。那我问个简单的吧! - -**我:** 因为这个问题太简单了,所以我忘记它是什么了。 - -**面试官:** 你还会啥数据库知识? - -**我:** 我一听,问的这么随意的吗。。。都让我选题了,我就说我了解索引,慢查询优化,巴拉巴拉 - -**面试官:** 等等,你说索引是吧,那你能说下索引的存储数据结构吗? - -**我:** 我心想这简单啊,我就说 B+树,还说了为什么用 B+树 - -**面试官:** 你简历上写的这个 J.U.C 包是什么啊?(他居然不知道 JUC) - -**我:** 就是 java 多线程的那个包啊。。。 - -**面试官:** 那你都了解里面的哪些东西呢? - -**我:** 哈哈哈!这可是我的强项,从 ConcurrentHashMap,ConcurrentLinkedQueue 说到 CountDownLatch,CyclicBarrier,又说到线程池,分别说了底层实现和项目中的应用。 - -**面试官:** 我觉得差不多了,那我再问个与技术无关的问题哈,虽然这个问题可能不应该我问,就是你是如何考虑你的项目架构的呢? - -**我:** 先用最简单的方式实现它,再去发掘系统的问题和瓶颈,于是查资料改进架构。。。 - -**面试官:** 好,那我给你介绍下我这边的情况吧 - -![chat-end](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3chat-end.jpg) - -**总结:** 一面可能是简历面吧,问的比较简单,我在讲项目中说出了我做项目时的学习历程和思考,赢得了面试官的好感,感觉他应该给我的评价很好。 - -### 二面 (33 分钟左右) - -然而开心了没一会,内推人问我面的怎么样啊?看我流程已经到大大 boss 那了。我一听二面不是主管吗???怎么直接跳了一面。于是瞬间慌了,赶紧(下床)学习准备二面。 - -隔了一天,3.14 的早上 10:56 分,杭州的大大 boss 给我打来了电话,卧槽我当时在上毛概课,万恶的毛概课每节课都点名,我还在最后一排不敢跑出去。于是接起电话来怂怂地说不好意思我在上课,晚上可以面试吗?大大 boss 看来很忙啊,跟我说晚上没时间啊,再说吧! - -于是又隔了一天,3.16 中午我收到了北京的电话,当时心里小失望,我的大大 boss 呢???接起电话来,就是一番狂轰乱炸。。。 - -第一步还是先自我介绍,这个就不多说了,提前准备好要说的重点就没问题! - -**面试官:** 我们还是从你的项目开始吧,说说你的秒杀系统。 - -**我:** 一面时的套路。。。我考虑到秒杀地址在开始前不应暴露给用户。。。 - -**面试官:** 等下啊,为什么要这样呢?暴露给用户会怎么样? - -**我:** 用户提前知道秒杀地址就可以写脚本来抢购了,这样不公平 - -**面试官:** 那比如说啊,我现在是个黑客,我在秒杀开始时写好了脚本,运行一万个线程获取秒杀地址,这样是不是也不公平呢? - -**我:** 我考虑到了这方面,于是我自己写了个 LRU 缓存(划重点,这么多好用的缓存我为啥不用偏要自己写?就是为了让面试官上钩问我是怎么写的,这样我就可以逼逼准备好的内容了!),用这个缓存存储请求的 ip 和用户名,一个 ip 和用户名只能同时透过 3 个请求。 - -**面试官:** 那我可不可以创建一个 ip 代理池和很多用户来抢购呢?假设我有很多手机号的账户。 - -**我:** 这就是在为难我胖虎啊,我说这种情况跟真实用户操作太像了。。。我没法区别,不过我觉得可以通过地理位置信息或者机器学习算法来做吧。。。 - -**面试官:** 好的这个问题就到这吧,你接着说 - -**我:** 我把生成订单和减库存两条 sql 语句放在一个事务里,都操作成功了则认为秒杀成功。 - -**面试官:** 等等,你这个订单表和商品库存表是在一个数据库的吧,那如果在不同的数据库中呢? - -**我:** 这面试官好变态啊,我只是个本科生?!?!我觉得应该要用分布式锁来实现吧。。。 - -**面试官:** 有没有更轻量级的做法? - -**我:** 不知道了。后来查资料发现可以用消息队列来实现。使用消息队列主要能带来两个好处:(1) 通过异步处理提高系统性能(削峰、减少响应所需时间);(2) 降低系统耦合性。关于消息队列的更多内容可以查看这篇文章: - -后来发现消息队列作用好大,于是现在在学手写一个消息队列。 - -**面试官:** 好的你接着说项目吧。 - -**我:** 我考虑到了缓存雪崩问题,于是。。。 - -**面试官:** 等等,你有没有考虑到一种情况,假如说你的缓存刚刚失效,大量流量就来查缓存,你的数据库会不会炸? - -**我:** 我不知道数据库会不会炸,反正我快炸了。当时说没考虑这么高的并发量,后来发现也是可以用消息队列来解决,对流量削峰填谷。 - -**面试官:** 好项目聊(怼)完了,我们来说说别的,操作系统了解吧,你能说说 NIO 吗? - -**我:** NIO 是。。。 - -**面试官:** 那你知道 NIO 的系统调用有哪些吗,具体是怎么实现的? - -**我:** 当时复习 NIO 的时候就知道是咋回事,不知道咋实现。最近在补这方面的知识,可见 NIO 还是很重要的! - -**面试官:** 说说进程切换时操作系统都会发生什么? - -**我:** 不如杀了我,我最讨厌操作系统了。简单说了下,可能不对,需要答案自行百度。 - -**面试官:** 说说线程池? - -**答:** 卧槽这我熟啊,把 Java 并发编程的艺术里讲的都说出来了,说了得有十分钟,自夸一波,毕竟这本书我看了五遍😂 - -**面试官:** 好问问计网吧如果设计一个聊天系统,应该用 TCP 还是 UDP?为什么 - -**我:** 当然是 TCP!原因如下: - -![TCP VS UDP](https://user-gold-cdn.xitu.io/2018/4/19/162db5e97e9a9e01?imageView2/0/w/1280/h/960/format/webp/ignore-error/1) - -**面试官:** 好的,你有什么要问我的吗? - -**我:** 我还有下一次面试吗? - -**面试官:** 应该。应该有的,一周内吧。还告诉我居然转正前要实习三个月?wtf,一个大三满课的本科生让我如何在八月底前实习三个月? - -**我:** 面试官再见 - -![saygoodbye-smile](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3saygoodbye-smile.jpg) - -### 三面 (46 分钟) - -3.18 号,三面来了,这次又是那个大大 boss! - -第一步还是先自我介绍,这个就不多说了,提前准备好要说的重点就没问题! - -**面试官:** 聊聊你的项目? - -**我:** 经过二面的教训,我迅速学习了一下分布式的理论知识,并应用到了我的项目(吹牛逼)中。 - -**面试官:** 看你用到了 Spring 的事务机制,你能说下 Spring 的事务传播吗? - -**我:** 完了这个问题好像没准备,虽然之前刷知乎看到过。。。我就只说出来一条,面试官说其实这个有很多机制的,比如事务嵌套,内事务回滚外事务回滚都会有不同情况,你可以回去看看。 - -**面试官:** 说说你的分布式事务解决方案? - -**我:** 我叭叭的照着资料查到的解决方案说了一通,面试官怎么好像没大听懂??? - -> 阿里巴巴之前开源了一个分布式 Fescar(一种易于使用,高性能,基于 Java 的开源分布式事务解决方案),后来,Ant Financial 加入 Fescar,使其成为一个更加中立和开放的分布式交易社区,Fescar 重命名为 Seata。Github 地址: - -**面试官:** 好,我们聊聊其他项目,说说你这个 MapReduce 项目?MapReduce 原理了解过吗? - -**我:** 我叭叭地说了一通,面试官好像觉得这个项目太简单了。要不是没项目,我会把我的实验写上吗??? - -**面试官:** 你这个手写 BP 神经网络是干了啥? - -**我:** 这是我选修机器学习课程时的一个作业,我又对它进行了扩展。 - -**面试官:** 你能说说为什么调整权值时要沿着梯度下降的方向? - -**我:** 老大,你太厉害了,怎么什么都懂。我压根没准备这个项目。。。没想到会问,做过去好几个月了,加上当时一紧张就忘了,后来想起来大概是....。 - -**面试官:** 好我们问问基础知识吧,说说什么叫 xisuo? - -**我:**???xisuo,您说什么,不好意思我没听清。(这面试官有点口音。。。)就是 xisuo 啊!xisuo 你不知道吗?。。。尴尬了十几秒后我终于意识到,他在说死锁!!! - -**面试官:** 假如 A 账户给 B 账户转钱,会发生 xisuo 吗?能具体说说吗? - -**我:** 当时答的不好,后来发现面试官又是想问分布式,具体答案参考这个: - -**面试官:** 为什么不考研? - -**我:** 不喜欢学术氛围,巴拉巴拉。 - -**面试官:** 你有什么问题吗? - -**我:** 我还有下一面吗。。。面试官说让我等,一周内答复。 - ------- - -等了十天,一度以为我凉了,内推人说我流程到 HR 了,让我等着吧可能 HR 太忙了,3.28 号 HR 打来了电话,当时在教室,我直接飞了出去。 - -### HR 面 - -**面试官:** 你好啊,先自我介绍下吧 - -**我:** 巴拉巴拉....HR 面的技术面试和技术面的还是有所区别的! - -面试官人特别好,一听就是很会说话的小姐姐!说我这里给你悄悄透露下,你的评级是 A 哦! - -![panghu-knowledge](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3panghu-knowledge.jpg) - -接下来就是几个经典 HR 面挂人的问题,什么难给我来什么,我看别人的 HR 面怎么都是聊聊天。。。 - -**面试官:** 你为什么选择支付宝呢,你怎么看待支付宝? - -**我:** 我从个人情怀,公司理念,环境氛围,市场价值,趋势导向分析了一波(说白了就是疯狂夸支付宝,不过说实话我说的那些一点都没撒谎,阿里确实做到了。比如我举了个雷军和格力打赌 5 年 2000 亿销售额,大部分企业家关注的是利益,而马云更关注的是真的为人类为世界做一些事情,利益不是第一位的。) - -**面试官:** 明白了解,那你的优点我们都很明了了,你能说说你的缺点吗? - -> 缺点肯定不能是目标岗位需要的关键能力!!! -> -> 总之,记住一点,面试官问你这个问题的话,你可以说一些不影响你这个职位工作需要的一些缺点。比如你面试后端工程师,面试官问你的缺点是什么的话,你可以这样说:自己比较内向,平时不太爱与人交流,但是考虑到以后可能要和客户沟通,自己正在努力改。 - -**我:** 据说这是 HR 面最难的一个问题。。。我当时翻了好几天的知乎才找到一个合适的,也符合我的答案:我有时候会表现的不太自信,比如阿里的内推二月份就开始了,其实我当时已经复习了很久了,但是老是觉得自己还不行,不敢投简历,于是又把书看了一遍才投的,当时也是舍友怂恿一波才投的,面了之后发现其实自己也没有很差。(划重点,一定要把自己的缺点圆回来)。 - -**面试官:** HR 好像不太满意我的答案,继续问我还有缺点吗? - -**我:** 我说比较容易紧张吧,举了自己大一面实验室因为紧张没进去的例子,后来不断调整心态,现在已经好很多了。 - -接下来又是个好难的问题。 - -**面试官:** BAT 都给你 offer 了,你怎么选? - -其实我当时好想说,BT 是什么?不好意思我只知道阿里。 - -**我 :** 哈哈哈哈开玩笑,就说了阿里的文化,支付宝给我们带来很多便利,想加入支付宝为人类做贡献! - -最后 HR 问了我实习时间,现在大几之类的问题,说肯定会给我发 offer 的,让我等着就好了,希望过两天能收到好的结果。 - -![mengbi](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3mengbi.jpg) diff --git "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2203\357\274\232Spring IOC\345\256\271\345\231\250\347\232\204\345\212\240\350\275\275\350\277\207\347\250\213.md" "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2203\357\274\232Spring IOC\345\256\271\345\231\250\347\232\204\345\212\240\350\275\275\350\277\207\347\250\213.md" index 50c5dc2..2e5703e 100644 --- "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2203\357\274\232Spring IOC\345\256\271\345\231\250\347\232\204\345\212\240\350\275\275\350\277\207\347\250\213.md" +++ "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2203\357\274\232Spring IOC\345\256\271\345\231\250\347\232\204\345\212\240\350\275\275\350\277\207\347\250\213.md" @@ -831,8 +831,7 @@ DefaultBeanDefinitionDocumentReader就开始做实际的解析工作了,但是 # loadBeanDefinitions -> BeanDefinition的解析,已经走到了DefaultBeanDefinitionDocumentR -> eader里,这时候配置文件已经被加载,并解析成w3c的Document对象。这篇博客就接着介绍,DefaultBeanDefinitionDocumentReader和BeanDefinitionParserDelegate类,是怎么协同完成bean的解析和注册的。 +> BeanDefinition的解析,已经走到了DefaultBeanDefinitionDocumentReader里,这时候配置文件已经被加载,并解析成w3c的Document对象。这篇博客就接着介绍,DefaultBeanDefinitionDocumentReader和BeanDefinitionParserDelegate类,是怎么协同完成bean的解析和注册的。 ``` BeanDefinitionParserDelegate parent = this.delegate; @@ -1111,7 +1110,6 @@ this.parseState.push(new BeanEntry(beanName)); if (ele.hasAttribute(CLASS_ATTRIBUTE)) { className = ele.getAttribute(CLASS_ATTRIBUTE).trim(); } - ``` 这段是从配置中抽取出类名。接下来的长长一段,把异常处理先抛开,看看实际的业务 diff --git "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2141\357\274\232JavaWeb\347\232\204\347\224\261\346\235\245\345\222\214\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2141\357\274\232JavaWeb\347\232\204\347\224\261\346\235\245\345\222\214\345\237\272\347\241\200\347\237\245\350\257\206.md" index 1377342..fbe5272 100644 --- "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2141\357\274\232JavaWeb\347\232\204\347\224\261\346\235\245\345\222\214\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2141\357\274\232JavaWeb\347\232\204\347\224\261\346\235\245\345\222\214\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -54,7 +54,7 @@ web开发的历史其实并不久远,要搞清楚java web开发的特点(主 -图中的服务器保持了一系列html脚本来响应用户的请求,可以说这个时期的web应用还是比较简单的,但是却确立了两个重要的对象:一个request(代表请求),另一个是response(代表回应)。如果把web开发的历史比喻成一部美国大片的话,那么request和response绝对是这部大片的那女主角,而且每一部都是不可或缺的主角(简单的说就是死不了)。 +图中的服务器保持了一系列html脚本来响应用户的请求,可以说这个时期的web应用还是比较简单的,但是却确立了两个重要的对象:一个request(代表请求),另一个是response(代表回应)。如果把web开发的历史比喻成一部美国大片的话,那么request和response绝对是这部大片的男女主角,而且每一部都是不可或缺的主角(简单的说就是死不了)。 看到这个图,不知道第一批从事web开发的80后是否和我一样,已经有点感触了,当年为了搞清楚这个结构,曾经连续多少个通宵做实验(实验环境比较恶劣)。没关系,这仅仅是个开始,我想当你看完这篇文章的时候,你会泪流满面的(相信我)。为了配合一下这张结构图,在web发展过程中,有一个小插曲,就是在web site向web application发展的过程中,出现了一个小“玩意儿”,就是applet,很多人了解java都是从使用java applet开始的(70,80后那一批程序员)。当时风靡校园(我当时在读大一)的网易聊天室,哎呀那个火啊(大家回忆一下你在学校机房上网时的兴奋),这个聊天室就是采用了applet构建的,当时applet给静态页面一个动态交互的可能,着实火了一段时间。现在知道applet的程序员,你已经暴露年龄了。看一张图片吧: @@ -185,7 +185,7 @@ HTTP(超文本传输协议),它是一种主流B/S架构中应用的通信协 1、无状态 -服务端不会记录客户端每次提交的请求,服务器一旦相应客户端之后,就会结束本次的通信过程。客户端下一次的请求是一个新的 连接,和上一次通信没有任何关系。 +服务端不会记录客户端每次提交的请求,服务器一旦响应客户端之后,就会结束本次的通信过程。客户端下一次的请求是一个新的连接,和上一次通信没有任何关系。 2、简单灵活 @@ -197,7 +197,7 @@ HTTP是基于请求(request)和响应(response)的模型 注意:C/S架构可选的协议有多种,例如:TCP/IP,UDP,HTTP -​ 而B/S架构通常只支持HTTP协议 + 而B/S架构通常只支持HTTP协议 ### 二、服务器 @@ -245,7 +245,7 @@ https://blog.csdn.net/qq_41911570/article/details/83279327 ### 个人公众号:程序员黄小斜 -​ + 黄小斜是 985 硕士,阿里巴巴Java工程师,在自学编程、技术求职、Java学习等方面有丰富经验和独到见解,希望帮助到更多想要从事互联网行业的程序员们。 ​ 作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得,以及自学编程和Java技术栈的相关干货。 diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2438\357\274\232Java\351\233\206\345\220\210\347\261\273\347\273\206\350\212\202\347\262\276\350\256\262.md" "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2438\357\274\232Java\351\233\206\345\220\210\347\261\273\347\273\206\350\212\202\347\262\276\350\256\262.md" index 658e558..d64c80c 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2438\357\274\232Java\351\233\206\345\220\210\347\261\273\347\273\206\350\212\202\347\262\276\350\256\262.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2438\357\274\232Java\351\233\206\345\220\210\347\261\273\347\273\206\350\212\202\347\262\276\350\256\262.md" @@ -347,7 +347,7 @@ public static void main(String[] args) { at java.util.ArrayList$SubList.checkForComodification(Unknown Source) at java.util.ArrayList$SubList.size(Unknown Source) at com.chenssy.test.arrayList.SubListTest.main(SubListTest.java:17) -list1正常输出,但是list3就抛出ConcurrentModificationException异常,看过我另一篇博客的同仁肯定对这个异常非常,fail-fast?不错就是fail-fast机制,在fail-fast机制中,LZ花了很多力气来讲述这个异常,所以这里LZ就不对这个异常多讲了。我们再看size方法: +list1正常输出,但是list3就抛出ConcurrentModificationException异常,看过我另一篇博客的同仁肯定对这个异常非常熟悉,fail-fast?不错就是fail-fast机制,在fail-fast机制中,LZ花了很多力气来讲述这个异常,所以这里LZ就不对这个异常多讲了。我们再看size方法: public int size() { checkForComodification(); diff --git "a/docs/java/design-parttern/\350\256\276\350\256\241\346\250\241\345\274\217\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/java/design-parttern/\350\256\276\350\256\241\346\250\241\345\274\217\345\255\246\344\271\240\346\200\273\347\273\223.md" index c6595f1..73c5a41 100644 --- "a/docs/java/design-parttern/\350\256\276\350\256\241\346\250\241\345\274\217\345\255\246\344\271\240\346\200\273\347\273\223.md" +++ "b/docs/java/design-parttern/\350\256\276\350\256\241\346\250\241\345\274\217\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -86,11 +86,10 @@ https://blog.csdn.net/a724888/article/category/6780980 # 结构型模式 - 结构型模式 前面创建型模式介绍了创建对象的一些设计模式,这节介绍的结构型模式旨在通过改变代码结构来达到解耦的目的,使得我们的代码容易维护和扩展。 -## 桥接模式 +## [桥接模式](https://www.cnblogs.com/WindSun/p/10260547.html) 有点复杂。建议参考原文 @@ -128,7 +127,7 @@ https://blog.csdn.net/a724888/article/category/6780980 ## 代理模式 -// 我们发现没有,代理模式说白了就是做 “方法包装” 或做 “方法增强”。 +// 我们发现没有,代理模式说白了就是做 “方法包装” 或做 “方法增强”。 // 在面向切面编程中,算了还是不要吹捧这个名词了,在 AOP 中, // 其实就是动态代理的过程。比如 Spring 中, // 我们自己不定义代理类,但是 Spring 会帮我们动态来定义代理, diff --git "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2723\357\274\232\345\236\203\345\234\276\345\233\236\346\224\266\345\231\250\350\257\246\350\247\243.md" "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2723\357\274\232\345\236\203\345\234\276\345\233\236\346\224\266\345\231\250\350\257\246\350\247\243.md" index 741c437..d978e0b 100644 --- "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2723\357\274\232\345\236\203\345\234\276\345\233\236\346\224\266\345\231\250\350\257\246\350\247\243.md" +++ "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2723\357\274\232\345\236\203\345\234\276\345\233\236\346\224\266\345\231\250\350\257\246\350\247\243.md" @@ -98,13 +98,13 @@ JDK1.2以后,Java对引用的感念进行了扩充,将引用分为强引用 **2.软引用(SoftReference)** -如果一个对象只具有软引用,那就类似于**可有可物的生活用品**。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。 +如果一个对象只具有软引用,那就类似于**可有可无的生活用品**。如果内存空间足够,垃圾回收器就不会回收它,如果内存空间不足了,就会回收这些对象的内存。只要垃圾回收器没有回收它,该对象就可以被程序使用。软引用可用来实现内存敏感的高速缓存。 软引用可以和一个引用队列(ReferenceQueue)联合使用,如果软引用所引用的对象被垃圾回收,JAVA虚拟机就会把这个软引用加入到与之关联的引用队列中。 **3.弱引用(WeakReference)** -如果一个对象只具有弱引用,那就类似于**可有可物的生活用品**。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。 +如果一个对象只具有弱引用,那就类似于**可有可无的生活用品**。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。 弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java虚拟机就会把这个弱引用加入到与之关联的引用队列中。 From 81a6b1c9707107a0650bb3f3e18899706a4803e5 Mon Sep 17 00:00:00 2001 From: Suwen macOS Yurisa <577014284@qq.com> Date: Thu, 16 Jul 2020 23:00:13 +0800 Subject: [PATCH 2/8] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=A4=9A=E4=BD=99?= =?UTF-8?q?=E4=BF=A1=E6=81=AF,=E5=A2=9E=E5=8A=A0=E7=AE=97=E6=B3=95,?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E7=BB=93=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReadMe.md | 36 ++- backup.md | 81 ------ .../\345\211\221\346\214\207offer.md" | 15 - ...37\346\200\201\346\200\273\347\273\223.md" | 15 - ...36\350\267\265\346\200\273\347\273\223.md" | 16 -- ...36\350\267\265\346\200\273\347\273\223.md" | 15 - ...36\350\267\265\346\200\273\347\273\223.md" | 15 - ...06\350\256\272\346\200\273\347\273\223.md" | 16 -- ...42\347\273\217\346\200\273\347\273\223.md" | 259 ++++++++++++++++++ ...00\346\234\257\346\200\273\347\273\223.md" | 18 -- ...00\346\234\257\346\200\273\347\273\223.md" | 18 -- ...71\350\261\241\345\237\272\347\241\200.md" | 15 - ...60\346\215\256\347\261\273\345\236\213.md" | 15 - ...14\345\214\205\350\243\205\347\261\273.md" | 15 - ...56\345\255\227\347\211\271\346\200\247.md" | 15 - ...17\347\232\204\347\247\230\345\257\206.md" | 15 - ...10\347\261\273\346\200\273\347\273\223.md" | 15 - ...36\347\216\260\345\216\237\347\220\206.md" | 21 -- ...357\274\232Queue\345\222\214LinkedList.md" | 16 -- ...16\346\257\224\350\276\203\345\231\250.md" | 20 -- ...57\274\232HashMap\345\222\214HashTable.md" | 22 -- ...345\222\214LRU\347\274\223\345\255\230.md" | 17 -- ...14\347\272\242\351\273\221\346\240\221.md" | 19 -- ...74\214TreeSet\344\270\216LinkedHashSet.md" | 19 -- ...06\350\212\202\347\262\276\350\256\262.md" | 20 -- ...66\345\217\221\346\200\273\347\273\223.md" | 16 -- ...25\344\276\213\347\255\211\357\274\211.md" | 16 -- ...41\345\274\217\347\255\211\357\274\211.md" | 16 -- ...37\350\200\205\347\255\211\357\274\211.md" | 17 -- ...76\350\256\241\346\250\241\345\274\217.md" | 18 -- ...76\350\256\241\346\250\241\345\274\217.md" | 17 -- ...46\344\271\240\346\200\273\347\273\223.md" | 17 -- .../java/jvm/JVM\346\200\273\347\273\223.md" | 18 -- ...14\346\234\237\344\274\230\345\214\226.md" | 17 -- ...03\344\274\230\345\256\236\350\267\265.md" | 17 -- ...06\344\270\216\345\256\236\350\267\265.md" | 18 -- ...15\344\270\216\345\256\236\346\210\230.md" | 18 -- ...\345\217\212GC\345\256\236\350\267\265.md" | 18 -- ...06\345\222\214\347\256\227\346\263\225.md" | 17 -- ...40\350\275\275\346\234\272\345\210\266.md" | 16 -- ...75\345\231\250\345\256\236\347\216\260.md" | 16 -- ...12\346\226\255\345\256\236\350\267\265.md" | 16 -- ...70\347\224\250\345\267\245\345\205\267.md" | 16 -- ...344\270\216NIO\346\200\273\347\273\223.md" | 18 -- ...46\344\271\240\346\200\273\347\273\223.md" | 18 -- ...46\344\271\240\346\200\273\347\273\223.md" | 17 -- ...46\344\271\240\346\200\273\347\273\223.md" | 18 -- ...07\347\253\240\346\261\207\346\200\273.md" | 0 .../\347\224\265\345\255\220\344\271\246.md" | 16 -- pom.xml | 21 -- "\345\217\202\350\200\203.md" | 1 - 51 files changed, 290 insertions(+), 871 deletions(-) delete mode 100644 backup.md create mode 100644 "docs/interview/BATJ-Experience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223.md" delete mode 100644 "docs/\345\205\254\344\274\227\345\217\267\345\216\206\345\217\262\346\226\207\347\253\240\346\261\207\346\200\273.md" delete mode 100644 pom.xml delete mode 100644 "\345\217\202\350\200\203.md" diff --git a/ReadMe.md b/ReadMe.md index a5ee595..4605f72 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,7 +1,4 @@ -本仓库原为[Java工程师技术指南](https://github.com/h2pl/Java-Tutorial)力求打造最完整最实用的Java工程师学习指南! - -现 fork 修正错误和更新内容。 - +​ 本仓库原为[Java工程师技术指南](https://github.com/h2pl/Java-Tutorial),现 fork 修正错误和更新内容。 ## 目录 @@ -17,6 +14,10 @@ - [并发](#并发) - [JVM](#JVM) - [Java网络编程](#Java网络编程) +- [算法](#算法) + -[必备算法总结](#必备算法总结) + -[剑指offer](#剑指offer) + -[todo]() - [计算机基础](#计算机基础) - [计算机网络](#计算机网络) - [操作系统](#操作系统) @@ -165,6 +166,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) @@ -195,10 +197,23 @@ todo * [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) +## 算法 + +* [必备算法总结](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) + + + ## 计算机基础 ### 计算机网络 + * [计算机网络学习总结](docs/network/计算机网络学习总结.md) +* [tcp/ip必会](https://www.cxyxiaowu.com/11609.html) ### 操作系统 @@ -218,12 +233,14 @@ todo #### 数据结构 -todo +* [数据结构总复习](https://blog.csdn.net/zl88086603/article/details/80727172) #### 算法 + todo ## 数据库 + todo ### MySQL @@ -269,6 +286,7 @@ todo ### Kafka ## 大后端 + * [后端技术杂谈开篇:云计算,大数据与AI的故事](docs/big-backEnd/后端技术杂谈开篇:云计算,大数据与AI的故事.md) * [后端技术杂谈1:搜索引擎基础倒排索引](docs/big-backEnd/后端技术杂谈1:搜索引擎基础倒排索引.md) * [后端技术杂谈2:搜索引擎工作原理](docs/big-backEnd/后端技术杂谈2:搜索引擎工作原理.md) @@ -322,6 +340,14 @@ todo ## 面试指南 todo + +### 典例问题 + +* [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 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 4c6e825..1eb848f 100644 --- "a/docs/algorithms/\345\211\221\346\214\207offer.md" +++ "b/docs/algorithms/\345\211\221\346\214\207offer.md" @@ -1717,20 +1717,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”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) 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”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) 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..d330355 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" @@ -455,20 +455,4 @@ redis事务的ACID特性 因为redis事务不过是简单的用队列包裹起来一组redis命令,redis并没有为事务提供任何额外的持久化功能,所以redis事务的耐久性由redis使用的模式 决定 -## 微信公众号 -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) 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..97d5eae 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" @@ -378,20 +378,5 @@ innodb支持行级锁和事务,而myisam只支持表锁,它的所有操作 redis的分布式部署方案也比较成熟。 -## 微信公众号 -### Java技术江湖 -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/distrubuted/\345\210\206\345\270\203\345\274\217\346\212\200\346\234\257\345\256\236\350\267\265\346\200\273\347\273\223.md" "b/docs/distrubuted/\345\210\206\345\270\203\345\274\217\346\212\200\346\234\257\345\256\236\350\267\265\346\200\273\347\273\223.md" index 2c7c65f..fc67b49 100644 --- "a/docs/distrubuted/\345\210\206\345\270\203\345\274\217\346\212\200\346\234\257\345\256\236\350\267\265\346\200\273\347\273\223.md" +++ "b/docs/distrubuted/\345\210\206\345\270\203\345\274\217\346\212\200\346\234\257\345\256\236\350\267\265\346\200\273\347\273\223.md" @@ -509,20 +509,5 @@ snowflake是twitter开源的分布式ID生成算法,其核心思想为,一 并且:结合业务做优化 -## 微信公众号 -### Java技术江湖 -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/distrubuted/\345\210\206\345\270\203\345\274\217\347\220\206\350\256\272\346\200\273\347\273\223.md" "b/docs/distrubuted/\345\210\206\345\270\203\345\274\217\347\220\206\350\256\272\346\200\273\347\273\223.md" index a118bdc..791941a 100644 --- "a/docs/distrubuted/\345\210\206\345\270\203\345\274\217\347\220\206\350\256\272\346\200\273\347\273\223.md" +++ "b/docs/distrubuted/\345\210\206\345\270\203\345\274\217\347\220\206\350\256\272\346\200\273\347\273\223.md" @@ -379,20 +379,4 @@ ZK自身提供了一些“四字命令”,通过这些四字命令,我们可 zookeeper以目录树的形式管理数据,提供znode监听、数据设置等接口,基于这些接口,我们可以实现Leader选举、配置管理、命名服务等功能。结合四字命令,加上模拟zookeeper client 创建/删除znode,我们可以实现对zookeeper的有效监控。在各种分布式系统中,我们经常可以看到zookeeper的身影。 -## 微信公众号 -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/interview/BATJ-Experience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223.md" "b/docs/interview/BATJ-Experience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223.md" new file mode 100644 index 0000000..95f8403 --- /dev/null +++ "b/docs/interview/BATJ-Experience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223.md" @@ -0,0 +1,259 @@ +# Table of Contents + + * [一面 (37 分钟左右)](#一面-37-分钟左右) + * [二面 (33 分钟左右)](#二面-33-分钟左右) + * [三面 (46 分钟)](#三面-46-分钟) + * [HR 面](#hr-面) + + +本文来自 Anonymous 的投稿 ,JavaGuide 对原文进行了重新排版和一点完善。 + + + +- [一面 (37 分钟左右)](#一面-37-分钟左右) +- [二面 (33 分钟左右)](#二面-33-分钟左右) +- [三面 (46 分钟)](#三面-46-分钟) +- [HR 面](#hr-面) + + + +### 一面 (37 分钟左右) + +一面是上海的小哥打来的,3.12 号中午确认的内推,下午就打来约时间了,也是唯一一个约时间的面试官。约的晚上八点。紧张的一比,人生第一次面试就献给了阿里。 + +幸运的是一面的小哥特温柔。好像是个海归?口语中夹杂着英文。废话不多说,上干货: + +**面试官:** 先自我介绍下吧! + +**我:** 巴拉巴拉...。 + +> 关于自我介绍:从 HR 面、技术面到高管面/部门主管面,面试官一般会让你先自我介绍一下,所以好好准备自己的自我介绍真的非常重要。网上一般建议的是准备好两份自我介绍:一份对 HR 说的,主要讲能突出自己的经历,会的编程技术一语带过;另一份对技术面试官说的,主要讲自己会的技术细节,项目经验,经历那些就一语带过。 + +**面试官:** 我看你简历上写你做了个秒杀系统?我们就从这个项目开始吧,先介绍下你的项目。 + +> 关于项目介绍:如果有项目的话,技术面试第一步,面试官一般都是让你自己介绍一下你的项目。你可以从下面几个方向来考虑: +> +> 1. 对项目整体设计的一个感受(面试官可能会让你画系统的架构图) +> 2. 在这个项目中你负责了什么、做了什么、担任了什么角色 +> 3. 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用 +> 4. 另外项目描述中,最好可以体现自己的综合素质,比如你是如何协调项目组成员协同开发的或者在遇到某一个棘手的问题的时候你是如何解决的又或者说你在这个项目用了什么技术实现了什么功能比如:用 redis 做缓存提高访问速度和并发量、使用消息队列削峰和降流等等。 + +**我:** 我说了我是如何考虑它的需求(秒杀地址隐藏,记录订单,减库存),一开始简单的用 synchronized 锁住方法,出现了问题,后来乐观锁改进,又有瓶颈,再上缓存,出现了缓存雪崩,于是缓存预热,错开缓存失效时间。最后,发现先记录订单再减库存会减少行级锁等待时间。 + +> 一面面试官很耐心地听,并给了我一些指导,问了我乐观锁是怎么实现的,我说是基于 sql 语句,在减库存操作的 where 条件里加剩余库存数>0,他说这应该不算是一种乐观锁,应该先查库存,在减库存的时候判断当前库存是否与读到的库存一样(可这样不是多一次查询操作吗?不是很理解,不过我没有反驳,只是说理解您的意思。事实证明千万别怼面试官,即使你觉得他说的不对) + +**面试官:** 我缓存雪崩什么情况下会发生?如何避免? + +**我:** 当多个商品缓存同时失效时会雪崩,导致大量查询数据库。还有就是秒杀刚开始的时候缓存里没有数据。解决方案:缓存预热,错开缓存失效时间 + +**面试官:** 问我更新数据库的同时为什么不马上更新缓存,而是删除缓存? + +**我:** 因为考虑到更新数据库后更新缓存可能会因为多线程下导致写入脏数据(比如线程 A 先更新数据库成功,接下来要取更新缓存,接着线程 B 更新数据库,但 B 又更新了缓存,接着 B 的时间片用完了,线程 A 更新了缓存) + +逼逼了将近 30 分钟,面试官居然用周杰伦的语气对我说: + +![not bad](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3not-bad.jpg) + +我突然受宠若惊,连忙说谢谢,也正是因为第一次面试得到了面试官的肯定,才让我信心大增,二三面稳定发挥。 + +**面试官又曰:** 我看你还懂数据库是吧,答:略懂略懂。。。那我问个简单的吧! + +**我:** 因为这个问题太简单了,所以我忘记它是什么了。 + +**面试官:** 你还会啥数据库知识? + +**我:** 我一听,问的这么随意的吗。。。都让我选题了,我就说我了解索引,慢查询优化,巴拉巴拉 + +**面试官:** 等等,你说索引是吧,那你能说下索引的存储数据结构吗? + +**我:** 我心想这简单啊,我就说 B+树,还说了为什么用 B+树 + +**面试官:** 你简历上写的这个 J.U.C 包是什么啊?(他居然不知道 JUC) + +**我:** 就是 java 多线程的那个包啊。。。 + +**面试官:** 那你都了解里面的哪些东西呢? + +**我:** 哈哈哈!这可是我的强项,从 ConcurrentHashMap,ConcurrentLinkedQueue 说到 CountDownLatch,CyclicBarrier,又说到线程池,分别说了底层实现和项目中的应用。 + +**面试官:** 我觉得差不多了,那我再问个与技术无关的问题哈,虽然这个问题可能不应该我问,就是你是如何考虑你的项目架构的呢? + +**我:** 先用最简单的方式实现它,再去发掘系统的问题和瓶颈,于是查资料改进架构。。。 + +**面试官:** 好,那我给你介绍下我这边的情况吧 + +![chat-end](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3chat-end.jpg) + +**总结:** 一面可能是简历面吧,问的比较简单,我在讲项目中说出了我做项目时的学习历程和思考,赢得了面试官的好感,感觉他应该给我的评价很好。 + +### 二面 (33 分钟左右) + +然而开心了没一会,内推人问我面的怎么样啊?看我流程已经到大大 boss 那了。我一听二面不是主管吗???怎么直接跳了一面。于是瞬间慌了,赶紧(下床)学习准备二面。 + +隔了一天,3.14 的早上 10:56 分,杭州的大大 boss 给我打来了电话,卧槽我当时在上毛概课,万恶的毛概课每节课都点名,我还在最后一排不敢跑出去。于是接起电话来怂怂地说不好意思我在上课,晚上可以面试吗?大大 boss 看来很忙啊,跟我说晚上没时间啊,再说吧! + +于是又隔了一天,3.16 中午我收到了北京的电话,当时心里小失望,我的大大 boss 呢???接起电话来,就是一番狂轰乱炸。。。 + +第一步还是先自我介绍,这个就不多说了,提前准备好要说的重点就没问题! + +**面试官:** 我们还是从你的项目开始吧,说说你的秒杀系统。 + +**我:** 一面时的套路。。。我考虑到秒杀地址在开始前不应暴露给用户。。。 + +**面试官:** 等下啊,为什么要这样呢?暴露给用户会怎么样? + +**我:** 用户提前知道秒杀地址就可以写脚本来抢购了,这样不公平 + +**面试官:** 那比如说啊,我现在是个黑客,我在秒杀开始时写好了脚本,运行一万个线程获取秒杀地址,这样是不是也不公平呢? + +**我:** 我考虑到了这方面,于是我自己写了个 LRU 缓存(划重点,这么多好用的缓存我为啥不用偏要自己写?就是为了让面试官上钩问我是怎么写的,这样我就可以逼逼准备好的内容了!),用这个缓存存储请求的 ip 和用户名,一个 ip 和用户名只能同时透过 3 个请求。 + +**面试官:** 那我可不可以创建一个 ip 代理池和很多用户来抢购呢?假设我有很多手机号的账户。 + +**我:** 这就是在为难我胖虎啊,我说这种情况跟真实用户操作太像了。。。我没法区别,不过我觉得可以通过地理位置信息或者机器学习算法来做吧。。。 + +**面试官:** 好的这个问题就到这吧,你接着说 + +**我:** 我把生成订单和减库存两条 sql 语句放在一个事务里,都操作成功了则认为秒杀成功。 + +**面试官:** 等等,你这个订单表和商品库存表是在一个数据库的吧,那如果在不同的数据库中呢? + +**我:** 这面试官好变态啊,我只是个本科生?!?!我觉得应该要用分布式锁来实现吧。。。 + +**面试官:** 有没有更轻量级的做法? + +**我:** 不知道了。后来查资料发现可以用消息队列来实现。使用消息队列主要能带来两个好处:(1) 通过异步处理提高系统性能(削峰、减少响应所需时间);(2) 降低系统耦合性。关于消息队列的更多内容可以查看这篇文章: + +后来发现消息队列作用好大,于是现在在学手写一个消息队列。 + +**面试官:** 好的你接着说项目吧。 + +**我:** 我考虑到了缓存雪崩问题,于是。。。 + +**面试官:** 等等,你有没有考虑到一种情况,假如说你的缓存刚刚失效,大量流量就来查缓存,你的数据库会不会炸? + +**我:** 我不知道数据库会不会炸,反正我快炸了。当时说没考虑这么高的并发量,后来发现也是可以用消息队列来解决,对流量削峰填谷。 + +**面试官:** 好项目聊(怼)完了,我们来说说别的,操作系统了解吧,你能说说 NIO 吗? + +**我:** NIO 是。。。 + +**面试官:** 那你知道 NIO 的系统调用有哪些吗,具体是怎么实现的? + +**我:** 当时复习 NIO 的时候就知道是咋回事,不知道咋实现。最近在补这方面的知识,可见 NIO 还是很重要的! + +**面试官:** 说说进程切换时操作系统都会发生什么? + +**我:** 不如杀了我,我最讨厌操作系统了。简单说了下,可能不对,需要答案自行百度。 + +**面试官:** 说说线程池? + +**答:** 卧槽这我熟啊,把 Java 并发编程的艺术里讲的都说出来了,说了得有十分钟,自夸一波,毕竟这本书我看了五遍😂 + +**面试官:** 好问问计网吧如果设计一个聊天系统,应该用 TCP 还是 UDP?为什么 + +**我:** 当然是 TCP!原因如下: + +![TCP VS UDP](https://user-gold-cdn.xitu.io/2018/4/19/162db5e97e9a9e01?imageView2/0/w/1280/h/960/format/webp/ignore-error/1) + +**面试官:** 好的,你有什么要问我的吗? + +**我:** 我还有下一次面试吗? + +**面试官:** 应该。应该有的,一周内吧。还告诉我居然转正前要实习三个月?wtf,一个大三满课的本科生让我如何在八月底前实习三个月? + +**我:** 面试官再见 + +![saygoodbye-smile](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3saygoodbye-smile.jpg) + +### 三面 (46 分钟) + +3.18 号,三面来了,这次又是那个大大 boss! + +第一步还是先自我介绍,这个就不多说了,提前准备好要说的重点就没问题! + +**面试官:** 聊聊你的项目? + +**我:** 经过二面的教训,我迅速学习了一下分布式的理论知识,并应用到了我的项目(吹牛逼)中。 + +**面试官:** 看你用到了 Spring 的事务机制,你能说下 Spring 的事务传播吗? + +**我:** 完了这个问题好像没准备,虽然之前刷知乎看到过。。。我就只说出来一条,面试官说其实这个有很多机制的,比如事务嵌套,内事务回滚外事务回滚都会有不同情况,你可以回去看看。 + +**面试官:** 说说你的分布式事务解决方案? + +**我:** 我叭叭的照着资料查到的解决方案说了一通,面试官怎么好像没大听懂??? + +> 阿里巴巴之前开源了一个分布式 Fescar(一种易于使用,高性能,基于 Java 的开源分布式事务解决方案),后来,Ant Financial 加入 Fescar,使其成为一个更加中立和开放的分布式交易社区,Fescar 重命名为 Seata。Github 地址: + +**面试官:** 好,我们聊聊其他项目,说说你这个 MapReduce 项目?MapReduce 原理了解过吗? + +**我:** 我叭叭地说了一通,面试官好像觉得这个项目太简单了。要不是没项目,我会把我的实验写上吗??? + +**面试官:** 你这个手写 BP 神经网络是干了啥? + +**我:** 这是我选修机器学习课程时的一个作业,我又对它进行了扩展。 + +**面试官:** 你能说说为什么调整权值时要沿着梯度下降的方向? + +**我:** 老大,你太厉害了,怎么什么都懂。我压根没准备这个项目。。。没想到会问,做过去好几个月了,加上当时一紧张就忘了,后来想起来大概是....。 + +**面试官:** 好我们问问基础知识吧,说说什么叫 xisuo? + +**我:**???xisuo,您说什么,不好意思我没听清。(这面试官有点口音。。。)就是 xisuo 啊!xisuo 你不知道吗?。。。尴尬了十几秒后我终于意识到,他在说死锁!!! + +**面试官:** 假如 A 账户给 B 账户转钱,会发生 xisuo 吗?能具体说说吗? + +**我:** 当时答的不好,后来发现面试官又是想问分布式,具体答案参考这个: + +**面试官:** 为什么不考研? + +**我:** 不喜欢学术氛围,巴拉巴拉。 + +**面试官:** 你有什么问题吗? + +**我:** 我还有下一面吗。。。面试官说让我等,一周内答复。 + +------ + +等了十天,一度以为我凉了,内推人说我流程到 HR 了,让我等着吧可能 HR 太忙了,3.28 号 HR 打来了电话,当时在教室,我直接飞了出去。 + +### HR 面 + +**面试官:** 你好啊,先自我介绍下吧 + +**我:** 巴拉巴拉....HR 面的技术面试和技术面的还是有所区别的! + +面试官人特别好,一听就是很会说话的小姐姐!说我这里给你悄悄透露下,你的评级是 A 哦! + +![panghu-knowledge](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3panghu-knowledge.jpg) + +接下来就是几个经典 HR 面挂人的问题,什么难给我来什么,我看别人的 HR 面怎么都是聊聊天。。。 + +**面试官:** 你为什么选择支付宝呢,你怎么看待支付宝? + +**我:** 我从个人情怀,公司理念,环境氛围,市场价值,趋势导向分析了一波(说白了就是疯狂夸支付宝,不过说实话我说的那些一点都没撒谎,阿里确实做到了。比如我举了个雷军和格力打赌 5 年 2000 亿销售额,大部分企业家关注的是利益,而马云更关注的是真的为人类为世界做一些事情,利益不是第一位的。) + +**面试官:** 明白了解,那你的优点我们都很明了了,你能说说你的缺点吗? + +> 缺点肯定不能是目标岗位需要的关键能力!!! +> +> 总之,记住一点,面试官问你这个问题的话,你可以说一些不影响你这个职位工作需要的一些缺点。比如你面试后端工程师,面试官问你的缺点是什么的话,你可以这样说:自己比较内向,平时不太爱与人交流,但是考虑到以后可能要和客户沟通,自己正在努力改。 + +**我:** 据说这是 HR 面最难的一个问题。。。我当时翻了好几天的知乎才找到一个合适的,也符合我的答案:我有时候会表现的不太自信,比如阿里的内推二月份就开始了,其实我当时已经复习了很久了,但是老是觉得自己还不行,不敢投简历,于是又把书看了一遍才投的,当时也是舍友怂恿一波才投的,面了之后发现其实自己也没有很差。(划重点,一定要把自己的缺点圆回来)。 + +**面试官:** HR 好像不太满意我的答案,继续问我还有缺点吗? + +**我:** 我说比较容易紧张吧,举了自己大一面实验室因为紧张没进去的例子,后来不断调整心态,现在已经好很多了。 + +接下来又是个好难的问题。 + +**面试官:** BAT 都给你 offer 了,你怎么选? + +其实我当时好想说,BT 是什么?不好意思我只知道阿里。 + +**我 :** 哈哈哈哈开玩笑,就说了阿里的文化,支付宝给我们带来很多便利,想加入支付宝为人类做贡献! + +最后 HR 问了我实习时间,现在大几之类的问题,说肯定会给我发 offer 的,让我等着就好了,希望过两天能收到好的结果。 + +![mengbi](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3mengbi.jpg) diff --git "a/docs/interview/InterviewQuestions/Java\346\240\270\345\277\203\346\212\200\346\234\257\346\200\273\347\273\223.md" "b/docs/interview/InterviewQuestions/Java\346\240\270\345\277\203\346\212\200\346\234\257\346\200\273\347\273\223.md" index 917620c..b8a3541 100644 --- "a/docs/interview/InterviewQuestions/Java\346\240\270\345\277\203\346\212\200\346\234\257\346\200\273\347\273\223.md" +++ "b/docs/interview/InterviewQuestions/Java\346\240\270\345\277\203\346\212\200\346\234\257\346\200\273\347\273\223.md" @@ -302,21 +302,3 @@ https://blog.csdn.net/a724888 Stream流概念,实现了集合类的流式访问,可以基于此使用map和reduce并行计算。 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java-web/JavaWeb\346\212\200\346\234\257\346\200\273\347\273\223.md" "b/docs/java-web/JavaWeb\346\212\200\346\234\257\346\200\273\347\273\223.md" index 39d6ef8..ae1ddef 100644 --- "a/docs/java-web/JavaWeb\346\212\200\346\234\257\346\200\273\347\273\223.md" +++ "b/docs/java-web/JavaWeb\346\212\200\346\234\257\346\200\273\347\273\223.md" @@ -136,21 +136,3 @@ git是分布式的代码管理工具,比起svn有着分布式的优势。太 但是还是差强人意,于是转而出现了hibernate这类的持久化框架。可以做到数据表和bean一一映射,程序只需要操作bean就可以完成数据库的curd。 mybatis比hibernate更轻量级,mybatis支持原生sql查询,并且也可以使用bean映射,同时还可以自定义地配置映射对象,更加灵活,并且在多表查询上更有优势。 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/basic/1\343\200\201\351\235\242\345\220\221\345\257\271\350\261\241\345\237\272\347\241\200.md" "b/docs/java/basic/1\343\200\201\351\235\242\345\220\221\345\257\271\350\261\241\345\237\272\347\241\200.md" index 1ce17ab..2cdc78e 100644 --- "a/docs/java/basic/1\343\200\201\351\235\242\345\220\221\345\257\271\350\261\241\345\237\272\347\241\200.md" +++ "b/docs/java/basic/1\343\200\201\351\235\242\345\220\221\345\257\271\350\261\241\345\237\272\347\241\200.md" @@ -688,21 +688,6 @@ public void eat(char ... c) { https://blog.csdn.net/android_hl/article/details/53228348 -## 微信公众号 -### Java技术江湖 -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/basic/2\343\200\201Java\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md" "b/docs/java/basic/2\343\200\201Java\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md" index 655b4c2..3e0913a 100644 --- "a/docs/java/basic/2\343\200\201Java\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md" +++ "b/docs/java/basic/2\343\200\201Java\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md" @@ -602,20 +602,5 @@ https://blog.csdn.net/a724888/article/details/80033043 -## 微信公众号 -### Java技术江湖 -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/basic/3\343\200\201string\345\222\214\345\214\205\350\243\205\347\261\273.md" "b/docs/java/basic/3\343\200\201string\345\222\214\345\214\205\350\243\205\347\261\273.md" index 13dfe0a..7779f4a 100644 --- "a/docs/java/basic/3\343\200\201string\345\222\214\345\214\205\350\243\205\347\261\273.md" +++ "b/docs/java/basic/3\343\200\201string\345\222\214\345\214\205\350\243\205\347\261\273.md" @@ -804,20 +804,5 @@ https://www.cnblogs.com/zhangyinhua/p/7689974.html https://blog.csdn.net/sinat_21925975/article/details/86493248 https://www.cnblogs.com/niew/p/9597379.html -## 微信公众号 -### Java技术江湖 -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/basic/4\343\200\201final\345\205\263\351\224\256\345\255\227\347\211\271\346\200\247.md" "b/docs/java/basic/4\343\200\201final\345\205\263\351\224\256\345\255\227\347\211\271\346\200\247.md" index f9c0f39..b06a282 100644 --- "a/docs/java/basic/4\343\200\201final\345\205\263\351\224\256\345\255\227\347\211\271\346\200\247.md" +++ "b/docs/java/basic/4\343\200\201final\345\205\263\351\224\256\345\255\227\347\211\271\346\200\247.md" @@ -561,20 +561,5 @@ https://www.iteye.com/blog/cakin24-2334965 https://blog.csdn.net/chengqiuming/article/details/70139503 https://blog.csdn.net/hupuxiang/article/details/7362267 -## 微信公众号 -### Java技术江湖 -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/basic/8\343\200\201Java\350\207\252\345\212\250\346\213\206\347\256\261\350\243\205\347\256\261\351\207\214\351\232\220\350\227\217\347\232\204\347\247\230\345\257\206.md" "b/docs/java/basic/8\343\200\201Java\350\207\252\345\212\250\346\213\206\347\256\261\350\243\205\347\256\261\351\207\214\351\232\220\350\227\217\347\232\204\347\247\230\345\257\206.md" index c6ed3af..d72737a 100644 --- "a/docs/java/basic/8\343\200\201Java\350\207\252\345\212\250\346\213\206\347\256\261\350\243\205\347\256\261\351\207\214\351\232\220\350\227\217\347\232\204\347\247\230\345\257\206.md" +++ "b/docs/java/basic/8\343\200\201Java\350\207\252\345\212\250\346\213\206\347\256\261\350\243\205\347\256\261\351\207\214\351\232\220\350\227\217\347\232\204\347\247\230\345\257\206.md" @@ -581,23 +581,8 @@ https://blog.csdn.net/a724888/article/details/80033043 -## 微信公众号 -### Java技术江湖 -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\347\261\273\346\200\273\347\273\223.md" "b/docs/java/collection/Java\351\233\206\345\220\210\347\261\273\346\200\273\347\273\223.md" index 2c05f7b..fe16e96 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\347\261\273\346\200\273\347\273\223.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\347\261\273\346\200\273\347\273\223.md" @@ -123,20 +123,5 @@ set就是hashmap将value固定为一个object,只存key元素包装成一个en 主要是基于红黑树实现的两个数据结构,可以保证key序列是有序的,获取sortedset就可以顺序打印key值了。其中涉及到红黑树的插入和删除,调整等操作,比较复杂,这里就不细说了。 -## 微信公众号 -### Java技术江湖 -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2431\357\274\232\344\270\200\346\226\207\350\257\273\346\207\202ArrayList,Vector\344\270\216Stack\344\275\277\347\224\250\346\226\271\346\263\225\345\222\214\345\256\236\347\216\260\345\216\237\347\220\206.md" "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2431\357\274\232\344\270\200\346\226\207\350\257\273\346\207\202ArrayList,Vector\344\270\216Stack\344\275\277\347\224\250\346\226\271\346\263\225\345\222\214\345\256\236\347\216\260\345\216\237\347\220\206.md" index df28c42..942046e 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2431\357\274\232\344\270\200\346\226\207\350\257\273\346\207\202ArrayList,Vector\344\270\216Stack\344\275\277\347\224\250\346\226\271\346\263\225\345\222\214\345\256\236\347\216\260\345\216\237\347\220\206.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2431\357\274\232\344\270\200\346\226\207\350\257\273\346\207\202ArrayList,Vector\344\270\216Stack\344\275\277\347\224\250\346\226\271\346\263\225\345\222\214\345\256\236\347\216\260\345\216\237\347\220\206.md" @@ -620,24 +620,3 @@ https://blog.csdn.net/u011419651/article/details/83831156 https://www.jianshu.com/p/c4027084ac43 -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - - - -​ diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2432\357\274\232Queue\345\222\214LinkedList.md" "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2432\357\274\232Queue\345\222\214LinkedList.md" index 7849acb..5eb9e9d 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2432\357\274\232Queue\345\222\214LinkedList.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2432\357\274\232Queue\345\222\214LinkedList.md" @@ -541,20 +541,4 @@ https://www.iteye.com/blog/shmilyaw-hotmail-com-1825171 https://blog.csdn.net/weixin_36378917/article/details/81812210 -## 微信公众号 -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2433\357\274\232Iterator\357\274\214fail-fast\346\234\272\345\210\266\344\270\216\346\257\224\350\276\203\345\231\250.md" "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2433\357\274\232Iterator\357\274\214fail-fast\346\234\272\345\210\266\344\270\216\346\257\224\350\276\203\345\231\250.md" index 2f9dbf3..83edad2 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2433\357\274\232Iterator\357\274\214fail-fast\346\234\272\345\210\266\344\270\216\346\257\224\350\276\203\345\231\250.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2433\357\274\232Iterator\357\274\214fail-fast\346\234\272\345\210\266\344\270\216\346\257\224\350\276\203\345\231\250.md" @@ -767,24 +767,4 @@ https://cmsblogs.com/p=1185 https://blog.csdn.net/android_hl/article/details/53228348 -## 微信公众号 -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - - - -​ diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2434\357\274\232HashMap\345\222\214HashTable.md" "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2434\357\274\232HashMap\345\222\214HashTable.md" index d5a7072..bc0b904 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2434\357\274\232HashMap\345\222\214HashTable.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2434\357\274\232HashMap\345\222\214HashTable.md" @@ -604,25 +604,3 @@ http://mini.eastday.com/mobile/180310183019559.html# https://blog.csdn.net/lihua5419/article/details/87691965 https://www.cnblogs.com/aeolian/p/8468632.html - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - - - -​ diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2435\357\274\232\346\267\261\345\205\245\347\220\206\350\247\243LinkedHashMap\345\222\214LRU\347\274\223\345\255\230.md" "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2435\357\274\232\346\267\261\345\205\245\347\220\206\350\247\243LinkedHashMap\345\222\214LRU\347\274\223\345\255\230.md" index bf76482..b2a817a 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2435\357\274\232\346\267\261\345\205\245\347\220\206\350\247\243LinkedHashMap\345\222\214LRU\347\274\223\345\255\230.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2435\357\274\232\346\267\261\345\205\245\347\220\206\350\247\243LinkedHashMap\345\222\214LRU\347\274\223\345\255\230.md" @@ -846,22 +846,5 @@ https://blog.csdn.net/wang_8101/article/details/83067860 https://www.cnblogs.com/create-and-orange/p/11237072.html https://www.cnblogs.com/ganchuanpu/p/8908093.html -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2436\357\274\232TreeMap\345\222\214\347\272\242\351\273\221\346\240\221.md" "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2436\357\274\232TreeMap\345\222\214\347\272\242\351\273\221\346\240\221.md" index 1d7bdc2..2de2ef5 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2436\357\274\232TreeMap\345\222\214\347\272\242\351\273\221\346\240\221.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2436\357\274\232TreeMap\345\222\214\347\272\242\351\273\221\346\240\221.md" @@ -633,24 +633,5 @@ private void removeFixUp(RBTreeNode node, RBTreeNode parent){ [红黑树深入剖析及Java实现](https://link.jianshu.com/?t=https://zhuanlan.zhihu.com/p/24367771) -## 微信公众号 -### Java技术江湖 -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - - - -​ diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2437\357\274\232HashSet\357\274\214TreeSet\344\270\216LinkedHashSet.md" "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2437\357\274\232HashSet\357\274\214TreeSet\344\270\216LinkedHashSet.md" index 64108f8..a5cd7e4 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2437\357\274\232HashSet\357\274\214TreeSet\344\270\216LinkedHashSet.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2437\357\274\232HashSet\357\274\214TreeSet\344\270\216LinkedHashSet.md" @@ -632,24 +632,5 @@ http://cmsblogs.com/?p=599 https://www.cnblogs.com/one-apple-pie/p/11036309.html https://blog.csdn.net/learningcoding/article/details/79983248 -## 微信公众号 -### Java技术江湖 -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - - - -​ diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2438\357\274\232Java\351\233\206\345\220\210\347\261\273\347\273\206\350\212\202\347\262\276\350\256\262.md" "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2438\357\274\232Java\351\233\206\345\220\210\347\261\273\347\273\206\350\212\202\347\262\276\350\256\262.md" index d64c80c..18c058c 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2438\357\274\232Java\351\233\206\345\220\210\347\261\273\347\273\206\350\212\202\347\262\276\350\256\262.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2438\357\274\232Java\351\233\206\345\220\210\347\261\273\347\273\206\350\212\202\347\262\276\350\256\262.md" @@ -482,24 +482,4 @@ http://blog.itpub.net/69906029/viewspace-2641300/ https://www.cnblogs.com/itxiaok/p/10356553.html -## 微信公众号 -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - - - -​ diff --git "a/docs/java/currency/Java\345\271\266\345\217\221\346\200\273\347\273\223.md" "b/docs/java/currency/Java\345\271\266\345\217\221\346\200\273\347\273\223.md" index 5c0fa32..504ac79 100644 --- "a/docs/java/currency/Java\345\271\266\345\217\221\346\200\273\347\273\223.md" +++ "b/docs/java/currency/Java\345\271\266\345\217\221\346\200\273\347\273\223.md" @@ -231,20 +231,4 @@ ScheduledThreadPoolExecutor内部使用的是delayqueue队列,内部是一个 窃取的基本思路就是:当worker自己的任务队列里面没有任务时,就去scan别的线程的队列,把别人的任务拿过来执行 -## 微信公众号 -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2171\357\274\232\345\210\233\345\273\272\345\236\213\346\250\241\345\274\217\357\274\210\345\267\245\345\216\202\357\274\214\345\215\225\344\276\213\347\255\211\357\274\211.md" "b/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2171\357\274\232\345\210\233\345\273\272\345\236\213\346\250\241\345\274\217\357\274\210\345\267\245\345\216\202\357\274\214\345\215\225\344\276\213\347\255\211\357\274\211.md" index ebacece..76a215b 100644 --- "a/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2171\357\274\232\345\210\233\345\273\272\345\236\213\346\250\241\345\274\217\357\274\210\345\267\245\345\216\202\357\274\214\345\215\225\344\276\213\347\255\211\357\274\211.md" +++ "b/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2171\357\274\232\345\210\233\345\273\272\345\236\213\346\250\241\345\274\217\357\274\210\345\267\245\345\216\202\357\274\214\345\215\225\344\276\213\347\255\211\357\274\211.md" @@ -443,20 +443,4 @@ protected native Object clone() throws CloneNotSupportedException; 转自https://javadoop.com/post/design-pattern -## 微信公众号 -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2172\357\274\232\347\273\223\346\236\204\345\236\213\346\250\241\345\274\217\357\274\210\344\273\243\347\220\206\346\250\241\345\274\217\357\274\214\351\200\202\351\205\215\345\231\250\346\250\241\345\274\217\347\255\211\357\274\211.md" "b/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2172\357\274\232\347\273\223\346\236\204\345\236\213\346\250\241\345\274\217\357\274\210\344\273\243\347\220\206\346\250\241\345\274\217\357\274\214\351\200\202\351\205\215\345\231\250\346\250\241\345\274\217\347\255\211\357\274\211.md" index a027df7..e1ca9b4 100644 --- "a/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2172\357\274\232\347\273\223\346\236\204\345\236\213\346\250\241\345\274\217\357\274\210\344\273\243\347\220\206\346\250\241\345\274\217\357\274\214\351\200\202\351\205\215\345\231\250\346\250\241\345\274\217\347\255\211\357\274\211.md" +++ "b/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2172\357\274\232\347\273\223\346\236\204\345\236\213\346\250\241\345\274\217\357\274\210\344\273\243\347\220\206\346\250\241\345\274\217\357\274\214\351\200\202\351\205\215\345\231\250\346\250\241\345\274\217\347\255\211\357\274\211.md" @@ -711,20 +711,4 @@ public class Employee { 转自https://javadoop.com/post/design-pattern -## 微信公众号 -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2173\357\274\232\350\241\214\344\270\272\345\236\213\346\250\241\345\274\217\357\274\210\347\255\226\347\225\245\357\274\214\350\247\202\345\257\237\350\200\205\347\255\211\357\274\211.md" "b/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2173\357\274\232\350\241\214\344\270\272\345\236\213\346\250\241\345\274\217\357\274\210\347\255\226\347\225\245\357\274\214\350\247\202\345\257\237\350\200\205\347\255\211\357\274\211.md" index e24ef16..ff6b264 100644 --- "a/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2173\357\274\232\350\241\214\344\270\272\345\236\213\346\250\241\345\274\217\357\274\210\347\255\226\347\225\245\357\274\214\350\247\202\345\257\237\350\200\205\347\255\211\357\274\211.md" +++ "b/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2173\357\274\232\350\241\214\344\270\272\345\236\213\346\250\241\345\274\217\357\274\210\347\255\226\347\225\245\357\274\214\350\247\202\345\257\237\350\200\205\347\255\211\357\274\211.md" @@ -1201,20 +1201,3 @@ public class Employee { 转自https://javadoop.com/post/design-pattern -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2174\357\274\232JDK\344\270\255\347\232\204\350\256\276\350\256\241\346\250\241\345\274\217.md" "b/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2174\357\274\232JDK\344\270\255\347\232\204\350\256\276\350\256\241\346\250\241\345\274\217.md" index 65b241a..034996c 100644 --- "a/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2174\357\274\232JDK\344\270\255\347\232\204\350\256\276\350\256\241\346\250\241\345\274\217.md" +++ "b/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2174\357\274\232JDK\344\270\255\347\232\204\350\256\276\350\256\241\346\250\241\345\274\217.md" @@ -935,21 +935,3 @@ public class Employee { 转自https://javadoop.com/post/design-pattern - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2175\357\274\232Spring\346\266\211\345\217\212\345\210\260\347\232\2049\347\247\215\350\256\276\350\256\241\346\250\241\345\274\217.md" "b/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2175\357\274\232Spring\346\266\211\345\217\212\345\210\260\347\232\2049\347\247\215\350\256\276\350\256\241\346\250\241\345\274\217.md" index 8c23116..605b7a4 100644 --- "a/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2175\357\274\232Spring\346\266\211\345\217\212\345\210\260\347\232\2049\347\247\215\350\256\276\350\256\241\346\250\241\345\274\217.md" +++ "b/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2175\357\274\232Spring\346\266\211\345\217\212\345\210\260\347\232\2049\347\247\215\350\256\276\350\256\241\346\250\241\345\274\217.md" @@ -872,20 +872,3 @@ public class Employee { 转自https://javadoop.com/post/design-pattern -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/design-parttern/\350\256\276\350\256\241\346\250\241\345\274\217\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/java/design-parttern/\350\256\276\350\256\241\346\250\241\345\274\217\345\255\246\344\271\240\346\200\273\347\273\223.md" index 73c5a41..df7413c 100644 --- "a/docs/java/design-parttern/\350\256\276\350\256\241\346\250\241\345\274\217\345\255\246\344\271\240\346\200\273\347\273\223.md" +++ "b/docs/java/design-parttern/\350\256\276\350\256\241\346\250\241\345\274\217\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -215,20 +215,3 @@ https://blog.csdn.net/a724888/article/category/6780980 责任链通常需要先建立一个单向链表,然后调用方只需要调用头部节点就可以了,后面会自动流转下去。比如流程审批就是一个很好的例子,只要终端用户提交申请,根据申请的内容信息,自动建立一条责任链,然后就可以开始流转了。 -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/jvm/JVM\346\200\273\347\273\223.md" "b/docs/java/jvm/JVM\346\200\273\347\273\223.md" index 2762768..5517d49 100644 --- "a/docs/java/jvm/JVM\346\200\273\347\273\223.md" +++ "b/docs/java/jvm/JVM\346\200\273\347\273\223.md" @@ -152,21 +152,3 @@ g1收集器和cms的收集方式类似,但是g1将堆内存划分成了大小 ## JVM的锁优化 在Java并发中讲述了synchronized重量级锁以及锁优化的方法,包括轻量级锁,偏向锁,自旋锁等。详细内容可以参考我的专栏:Java并发技术指南 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/jvm/\346\267\261\345\205\245\344\272\206\350\247\243JVM\350\231\232\346\213\237\346\234\2728\357\274\232Java\347\232\204\347\274\226\350\257\221\346\234\237\344\274\230\345\214\226\344\270\216\350\277\220\350\241\214\346\234\237\344\274\230\345\214\226.md" "b/docs/java/jvm/\346\267\261\345\205\245\344\272\206\350\247\243JVM\350\231\232\346\213\237\346\234\2728\357\274\232Java\347\232\204\347\274\226\350\257\221\346\234\237\344\274\230\345\214\226\344\270\216\350\277\220\350\241\214\346\234\237\344\274\230\345\214\226.md" index 2db99f7..8f6911b 100644 --- "a/docs/java/jvm/\346\267\261\345\205\245\344\272\206\350\247\243JVM\350\231\232\346\213\237\346\234\2728\357\274\232Java\347\232\204\347\274\226\350\257\221\346\234\237\344\274\230\345\214\226\344\270\216\350\277\220\350\241\214\346\234\237\344\274\230\345\214\226.md" +++ "b/docs/java/jvm/\346\267\261\345\205\245\344\272\206\350\247\243JVM\350\231\232\346\213\237\346\234\2728\357\274\232Java\347\232\204\347\274\226\350\257\221\346\234\237\344\274\230\345\214\226\344\270\216\350\277\220\350\241\214\346\234\237\344\274\230\345\214\226.md" @@ -235,20 +235,3 @@ Java虚拟机的即时编译器与C/C++的静态编译器相比,可能会由 https://blog.csdn.net/android_hl/article/details/53228348 -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27210\357\274\232JVM\345\270\270\347\224\250\345\217\202\346\225\260\344\273\245\345\217\212\350\260\203\344\274\230\345\256\236\350\267\265.md" "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27210\357\274\232JVM\345\270\270\347\224\250\345\217\202\346\225\260\344\273\245\345\217\212\350\260\203\344\274\230\345\256\236\350\267\265.md" index 07a6b33..5499638 100644 --- "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27210\357\274\232JVM\345\270\270\347\224\250\345\217\202\346\225\260\344\273\245\345\217\212\350\260\203\344\274\230\345\256\236\350\267\265.md" +++ "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27210\357\274\232JVM\345\270\270\347\224\250\345\217\202\346\225\260\344\273\245\345\217\212\350\260\203\344\274\230\345\256\236\350\267\265.md" @@ -413,20 +413,3 @@ jvm的参数设置一直是比较理不清的地方,很多时候都搞不清 https://blog.csdn.net/android_hl/article/details/53228348 -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27211\357\274\232Java\345\206\205\345\255\230\345\274\202\345\270\270\345\216\237\347\220\206\344\270\216\345\256\236\350\267\265.md" "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27211\357\274\232Java\345\206\205\345\255\230\345\274\202\345\270\270\345\216\237\347\220\206\344\270\216\345\256\236\350\267\265.md" index 0805113..55cff84 100644 --- "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27211\357\274\232Java\345\206\205\345\255\230\345\274\202\345\270\270\345\216\237\347\220\206\344\270\216\345\256\236\350\267\265.md" +++ "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27211\357\274\232Java\345\206\205\345\255\230\345\274\202\345\270\270\345\216\237\347\220\206\344\270\216\345\256\236\350\267\265.md" @@ -460,21 +460,3 @@ Optimizeit Profiler版本4.11支持Application,Applet,Servlet和Romote Appli https://blog.csdn.net/android_hl/article/details/53228348 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27212\357\274\232JVM\346\200\247\350\203\275\347\256\241\347\220\206\347\245\236\345\231\250VisualVM\344\273\213\347\273\215\344\270\216\345\256\236\346\210\230.md" "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27212\357\274\232JVM\346\200\247\350\203\275\347\256\241\347\220\206\347\245\236\345\231\250VisualVM\344\273\213\347\273\215\344\270\216\345\256\236\346\210\230.md" index 9df9174..b3321fe 100644 --- "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27212\357\274\232JVM\346\200\247\350\203\275\347\256\241\347\220\206\347\245\236\345\231\250VisualVM\344\273\213\347\273\215\344\270\216\345\256\236\346\210\230.md" +++ "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27212\357\274\232JVM\346\200\247\350\203\275\347\256\241\347\220\206\347\245\236\345\231\250VisualVM\344\273\213\347\273\215\344\270\216\345\256\236\346\210\230.md" @@ -256,21 +256,3 @@ https://blog.csdn.net/android_hl/article/details/53228348 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27213\357\274\232\345\206\215\350\260\210\345\233\233\347\247\215\345\274\225\347\224\250\345\217\212GC\345\256\236\350\267\265.md" "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27213\357\274\232\345\206\215\350\260\210\345\233\233\347\247\215\345\274\225\347\224\250\345\217\212GC\345\256\236\350\267\265.md" index 3167cfa..9446a4f 100644 --- "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27213\357\274\232\345\206\215\350\260\210\345\233\233\347\247\215\345\274\225\347\224\250\345\217\212GC\345\256\236\350\267\265.md" +++ "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\27213\357\274\232\345\206\215\350\260\210\345\233\233\347\247\215\345\274\225\347\224\250\345\217\212GC\345\256\236\350\267\265.md" @@ -228,21 +228,3 @@ StrongReference是Java的默认引用形式,使用时不需要显示定义。 https://blog.csdn.net/android_hl/article/details/53228348 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2722\357\274\232JVM\345\236\203\345\234\276\345\233\236\346\224\266\345\237\272\346\234\254\345\216\237\347\220\206\345\222\214\347\256\227\346\263\225.md" "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2722\357\274\232JVM\345\236\203\345\234\276\345\233\236\346\224\266\345\237\272\346\234\254\345\216\237\347\220\206\345\222\214\347\256\227\346\263\225.md" index e8a7e29..f1e1f3c 100644 --- "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2722\357\274\232JVM\345\236\203\345\234\276\345\233\236\346\224\266\345\237\272\346\234\254\345\216\237\347\220\206\345\222\214\347\256\227\346\263\225.md" +++ "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2722\357\274\232JVM\345\236\203\345\234\276\345\233\236\346\224\266\345\237\272\346\234\254\345\216\237\347\220\206\345\222\214\347\256\227\346\263\225.md" @@ -569,20 +569,3 @@ Stop-the-world意味着 JVM由于要执行GC而停止了应用程序的执行, https://blog.csdn.net/android_hl/article/details/53228348 -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2726\357\274\232\346\267\261\345\205\245\347\220\206\350\247\243JVM\347\261\273\345\212\240\350\275\275\346\234\272\345\210\266.md" "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2726\357\274\232\346\267\261\345\205\245\347\220\206\350\247\243JVM\347\261\273\345\212\240\350\275\275\346\234\272\345\210\266.md" index 60ad7b7..b0a250c 100644 --- "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2726\357\274\232\346\267\261\345\205\245\347\220\206\350\247\243JVM\347\261\273\345\212\240\350\275\275\346\234\272\345\210\266.md" +++ "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2726\357\274\232\346\267\261\345\205\245\347\220\206\350\247\243JVM\347\261\273\345\212\240\350\275\275\346\234\272\345\210\266.md" @@ -169,20 +169,4 @@ java中,对于初始化阶段,有且只有以下五种情况才会对要求 https://blog.csdn.net/android_hl/article/details/53228348 -## 微信公众号 -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2727\357\274\232JNDI\357\274\214OSGI\357\274\214Tomcat\347\261\273\345\212\240\350\275\275\345\231\250\345\256\236\347\216\260.md" "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2727\357\274\232JNDI\357\274\214OSGI\357\274\214Tomcat\347\261\273\345\212\240\350\275\275\345\231\250\345\256\236\347\216\260.md" index 1c3b52d..0e2e5e2 100644 --- "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2727\357\274\232JNDI\357\274\214OSGI\357\274\214Tomcat\347\261\273\345\212\240\350\275\275\345\231\250\345\256\236\347\216\260.md" +++ "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2727\357\274\232JNDI\357\274\214OSGI\357\274\214Tomcat\347\261\273\345\212\240\350\275\275\345\231\250\345\256\236\347\216\260.md" @@ -384,20 +384,4 @@ Servlet规范指出,容器用于加载Web应用内Servlet的class loader, 允 https://blog.csdn.net/android_hl/article/details/53228348 -## 微信公众号 -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2729\357\274\232JVM\347\233\221\346\216\247\345\267\245\345\205\267\344\270\216\350\257\212\346\226\255\345\256\236\350\267\265.md" "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2729\357\274\232JVM\347\233\221\346\216\247\345\267\245\345\205\267\344\270\216\350\257\212\346\226\255\345\256\236\350\267\265.md" index ab03095..0db0dbc 100644 --- "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2729\357\274\232JVM\347\233\221\346\216\247\345\267\245\345\205\267\344\270\216\350\257\212\346\226\255\345\256\236\350\267\265.md" +++ "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2729\357\274\232JVM\347\233\221\346\216\247\345\267\245\345\205\267\344\270\216\350\257\212\346\226\255\345\256\236\350\267\265.md" @@ -391,20 +391,4 @@ jmap -dump:format=b,file=/tmp/dump.dat 11869 https://blog.csdn.net/android_hl/article/details/53228348 -## 微信公众号 -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\272\357\274\232GC\350\260\203\344\274\230\346\200\235\350\267\257\344\270\216\345\270\270\347\224\250\345\267\245\345\205\267.md" "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\272\357\274\232GC\350\260\203\344\274\230\346\200\235\350\267\257\344\270\216\345\270\270\347\224\250\345\267\245\345\205\267.md" index 01adef6..a91740a 100644 --- "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\272\357\274\232GC\350\260\203\344\274\230\346\200\235\350\267\257\344\270\216\345\270\270\347\224\250\345\267\245\345\205\267.md" +++ "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\272\357\274\232GC\350\260\203\344\274\230\346\200\235\350\267\257\344\270\216\345\270\270\347\224\250\345\267\245\345\205\267.md" @@ -35,20 +35,4 @@ https://blog.csdn.net/android_hl/article/details/53228348 -## 微信公众号 -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/network-programming/Java\347\275\221\347\273\234\344\270\216NIO\346\200\273\347\273\223.md" "b/docs/java/network-programming/Java\347\275\221\347\273\234\344\270\216NIO\346\200\273\347\273\223.md" index 259082a..602b23a 100644 --- "a/docs/java/network-programming/Java\347\275\221\347\273\234\344\270\216NIO\346\200\273\347\273\223.md" +++ "b/docs/java/network-programming/Java\347\275\221\347\273\234\344\270\216NIO\346\200\273\347\273\223.md" @@ -228,21 +228,3 @@ bootstrap 在深入了解地Netty的核心组件之后,发现它们的设计都很模块化,如果想要实现你自己的应用程序,就需要将这些组件组装到一起。Netty通过Bootstrap类,以对一个Netty应用程序进行配置(组装各个组件),并最终使它运行起来。 对于客户端程序和服务器程序所使用到的Bootstrap类是不同的,后者需要使用ServerBootstrap,这样设计是因为,在如TCP这样有连接的协议中,服务器程序往往需要一个以上的Channel,通过父Channel来接受来自客户端的连接,然后创建子Channel用于它们之间的通信,而像UDP这样无连接的协议,它不需要每个连接都创建子Channel,只需要一个Channel即可。 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\345\255\246\344\271\240\346\200\273\347\273\223.md" index 96a1ef4..d12d4bc 100644 --- "a/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\345\255\246\344\271\240\346\200\273\347\273\223.md" +++ "b/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -693,21 +693,3 @@ OSPF 具有以下特点: 。一个数据帧或包被传输到本地网段 (由广播域定义)上的每个节点就是广播;由于网络拓扑的设计和连接问题,或其他原因导致广播在网段内大量复制,传播数据帧,导致网络性能下降,甚至网络瘫痪,这就是广播风暴。 要避免广播风暴,可以采用恰当划分VLAN、缩小广播域、隔离广播风暴,还可在千兆以太网口上启用广播风暴控制,最大限度地避免网络再次陷入瘫痪。 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/operating-system/Linux\345\206\205\346\240\270\344\270\216\345\237\272\347\241\200\345\221\275\344\273\244\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/operating-system/Linux\345\206\205\346\240\270\344\270\216\345\237\272\347\241\200\345\221\275\344\273\244\345\255\246\344\271\240\346\200\273\347\273\223.md" index 3728891..d23a9f2 100644 --- "a/docs/operating-system/Linux\345\206\205\346\240\270\344\270\216\345\237\272\347\241\200\345\221\275\344\273\244\345\255\246\344\271\240\346\200\273\347\273\223.md" +++ "b/docs/operating-system/Linux\345\206\205\346\240\270\344\270\216\345\237\272\347\241\200\345\221\275\344\273\244\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -916,20 +916,3 @@ uname可以显示一些重要的系统信息,例如内核名称、主机名、 5内存 free -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\255\246\344\271\240\346\200\273\347\273\223.md" index d0e096f..4e3f34e 100644 --- "a/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\255\246\344\271\240\346\200\273\347\273\223.md" +++ "b/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -331,21 +331,3 @@ linux使用inode来标识任意一个文件。inode存储除了文件名以外 于是我们ls到另一个目录。同理他也是一个inode。我们在这个inode下执行vi操作打开某个文件,于是linux通过inode中的映射表找到了我们请求访问的文件名对应的inode。 然后寻道到对应的磁盘位置,读取内容到缓冲区,通过系统调用把内容读到内存中,最后进行访问。 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/\345\205\254\344\274\227\345\217\267\345\216\206\345\217\262\346\226\207\347\253\240\346\261\207\346\200\273.md" "b/docs/\345\205\254\344\274\227\345\217\267\345\216\206\345\217\262\346\226\207\347\253\240\346\261\207\346\200\273.md" deleted file mode 100644 index e69de29..0000000 diff --git "a/docs/\347\224\265\345\255\220\344\271\246.md" "b/docs/\347\224\265\345\255\220\344\271\246.md" index 9f5fa61..eaa7687 100644 --- "a/docs/\347\224\265\345\255\220\344\271\246.md" +++ "b/docs/\347\224\265\345\255\220\344\271\246.md" @@ -224,23 +224,7 @@ [从三流小公司到一线大厂,聊聊程序员的成长之道](http://mp.weixin.qq.com/s?__biz=MzUyOTk5NDQwOA==&mid=2247485427&idx=1&sn=6004e6bed110c44f0d8ce77a2ffca1dc&chksm=fa59c034cd2e492253625d91492467b841c5f6de21d299cae01f05483ab363f856e8d97fe339&scene=21#wechat_redirect) -## 微信公众号 -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git a/pom.xml b/pom.xml deleted file mode 100644 index 2cca927..0000000 --- a/pom.xml +++ /dev/null @@ -1,21 +0,0 @@ - - - 4.0.0 - - groupId - JavaTutorial - 1.0-SNAPSHOT - - - - - com.github.houbb - markdown-toc - 1.0.6 - - - - - \ No newline at end of file diff --git "a/\345\217\202\350\200\203.md" "b/\345\217\202\350\200\203.md" deleted file mode 100644 index 8b13789..0000000 --- "a/\345\217\202\350\200\203.md" +++ /dev/null @@ -1 +0,0 @@ - From 4d32b28d5415ffa9974a7a6b97737d97908cfc74 Mon Sep 17 00:00:00 2001 From: Suwen macOS Yurisa <577014284@qq.com> Date: Mon, 20 Jul 2020 00:38:24 +0800 Subject: [PATCH 3/8] =?UTF-8?q?=E5=BF=85=E8=83=8Ccode?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ReadMe.md | 5 +- docs/code/code.md | 433 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 437 insertions(+), 1 deletion(-) create mode 100644 docs/code/code.md diff --git a/ReadMe.md b/ReadMe.md index 4605f72..03f6b9f 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,4 +1,4 @@ -​ 本仓库原为[Java工程师技术指南](https://github.com/h2pl/Java-Tutorial),现 fork 修正错误和更新内容。 + 本仓库原为[Java工程师技术指南](https://github.com/h2pl/Java-Tutorial),现 fork 修正错误和更新内容。 ## 目录 @@ -200,12 +200,15 @@ todo ## 算法 * [必备算法总结](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) + ## 计算机基础 diff --git a/docs/code/code.md b/docs/code/code.md new file mode 100644 index 0000000..b1e9c57 --- /dev/null +++ b/docs/code/code.md @@ -0,0 +1,433 @@ +# [熟记算法代码](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; +} +``` + From d9acdb33c93f1b0e4d794753c27c5b75549199d6 Mon Sep 17 00:00:00 2001 From: Suwen macOS Yurisa <577014284@qq.com> Date: Mon, 20 Jul 2020 14:08:54 +0800 Subject: [PATCH 4/8] fix page build failed --- .../\345\211\221\346\214\207offer.md" | 49 ------------------- 1 file changed, 49 deletions(-) diff --git "a/docs/algorithms/\345\211\221\346\214\207offer.md" "b/docs/algorithms/\345\211\221\346\214\207offer.md" index 1eb848f..66dc482 100644 --- "a/docs/algorithms/\345\211\221\346\214\207offer.md" +++ "b/docs/algorithms/\345\211\221\346\214\207offer.md" @@ -1620,55 +1620,6 @@ public static int LastRemaining_Solution(int n, int m) { 解析:回溯法也就是特殊的dfs,需要找到所有的路径,所以每当到达边界条件或抵达目标时,递归返回,由于需要保存路径中的字母,所以递归返回时需要删除路径最后的节点,来保证路径合法。不过本题只有一个解,所以找到即可返回。 - public class 矩阵中的路径 { - public static void main(String[] args) { - char[][]arr = {{'a','b','c','e'},{'s','f','c','s'},{'a','d','e','e'}}; - char []str = {'b','c','c','e','d'}; - System.out.println(hasPath(arr, arr.length, arr[0].length, str)); - } - static int flag = 0; - public static boolean hasPath(char[][] matrix, int rows, int cols, char[] str) - { - int [][]visit = new int[rows][cols]; - StringBuilder sb = new StringBuilder(); - for (int i = 0;i < rows;i ++) { - for (int j = 0;j < cols;j ++) { - if (matrix[i][j] == str[0]) { - visit[i][j] = 1; - sb.append(str[0]); - dfs(matrix, i, j, visit, str, 1, sb); - visit[i][j] = 0; - sb.deleteCharAt(sb.length() - 1); - } - } - } - return flag == 1; - } - public static void dfs(char [][]matrix, int row, int col, int [][]visit, char []str, int cur, StringBuilder sb) { - if (sb.length() == str.length) { - // System.out.println(sb.toString()); - flag = 1; - return; - } - - int [][]pos = {{1,0},{-1,0},{0,1},{0,-1}}; - for (int i = 0;i < pos.length;i ++) { - int x = row + pos[i][0]; - int y = col + pos[i][1]; - if (x >= 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; - } - } - } - - ​ ## 机器人的运动范围 From fdf63e5c606c177b0f57925416caab957597c78e Mon Sep 17 00:00:00 2001 From: Suwen macOS Yurisa <577014284@qq.com> Date: Wed, 29 Jul 2020 16:39:19 +0800 Subject: [PATCH 5/8] fix words, path --- ReadMe.md | 52 +++---- ...36\350\267\265\346\200\273\347\273\223.md" | 39 +++-- ...45\344\270\216\345\256\236\350\267\265.md" | 3 +- ...2\357\274\232MySQL \345\222\214 InnoDB.md" | 31 +--- ...23\346\236\204\347\256\227\346\263\225.md" | 28 +--- ...04\351\224\201\345\256\236\347\216\260.md" | 23 --- ...4\232SpringMVC\346\246\202\350\277\260.md" | 24 --- ...\274\232Spring\346\246\202\350\277\260.md" | 22 +-- ...70\345\277\203\346\265\201\347\250\213.md" | 23 +-- ...43\345\274\217\345\274\200\345\217\221.md" | 140 ++++++------------ ...274\232Mybatis\345\205\245\351\227\250.md" | 81 +--------- ...\215\347\275\256\347\232\204SpringBoot.md" | 63 +------- ...72\347\241\200\347\237\245\350\257\206.md" | 58 +------- ...17\344\270\216\347\216\260\345\234\250.md" | 21 --- ...45\346\261\240\346\212\200\346\234\257.md" | 20 --- ...37\347\220\206\350\257\246\350\247\243.md" | 61 -------- ...67\346\261\202\350\277\207\347\250\213.md" | 20 --- ...43\200\201Java\345\274\202\345\270\270.md" | 64 ++------ ...55\347\232\204\345\233\236\350\260\203.md" | 74 ++------- ...12\343\200\201\345\217\215\345\260\204.md" | 54 +------ ...13\343\200\201\346\263\233\345\236\213.md" | 39 +---- ...01\346\236\232\344\270\276\347\261\273.md" | 38 +---- ...00\344\275\263\345\256\236\350\267\265.md" | 51 +------ .../16\343\200\201JavaIO\346\265\201.md" | 54 +------ ...01\345\244\232\347\272\277\347\250\213.md" | 82 +++------- ...06\346\236\266\346\242\263\347\220\206.md" | 53 +------ ...71\350\261\241\345\237\272\347\241\200.md" | 28 +--- ...10\346\236\201\346\214\207\345\215\227.md" | 54 +------ ...15\345\272\217\345\210\227\345\214\226.md" | 114 +++++--------- ...36\347\216\260\345\216\237\347\220\206.md" | 53 +------ ...60\346\215\256\347\261\273\345\236\213.md" | 25 +--- ...14\345\214\205\350\243\205\347\261\273.md" | 29 +--- ...va\347\261\273\345\222\214\345\214\205.md" | 44 +----- ...73\345\222\214\346\216\245\345\217\243.md" | 42 +----- ...47\350\241\214\351\241\272\345\272\217.md" | 41 +---- ...17\347\232\204\347\247\230\345\257\206.md" | 25 +--- ...\261\273\345\222\214Object\347\261\273.md" | 47 ++---- ...10\347\261\273\346\200\273\347\273\223.md" | 32 +--- ...57\274\232HashMap\345\222\214HashTable.md" | 21 +-- ...14\347\272\242\351\273\221\346\240\221.md" | 35 ++--- ...46\344\271\240\346\200\273\347\273\223.md" | 13 +- ...46\344\271\240\346\200\273\347\273\223.md" | 15 +- 42 files changed, 276 insertions(+), 1560 deletions(-) rename "docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2232\357\274\232\343\200\216\346\265\205\345\205\245\346\265\205\345\207\272\343\200\217MySQL \345\222\214 InnoDB.md" => "docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2232\357\274\232MySQL \345\222\214 InnoDB.md" (96%) diff --git a/ReadMe.md b/ReadMe.md index 03f6b9f..021908f 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,8 +1,8 @@ - 本仓库原为[Java工程师技术指南](https://github.com/h2pl/Java-Tutorial),现 fork 修正错误和更新内容。 +本仓库原为 [Java工程师技术指南](https://github.com/h2pl/Java-Tutorial),现 fork 修正错误和更新内容。 ## 目录 -- [Java基础](#Java基础) +- [Java基础](#Java基础) - [基础知识](#基础知识) - [容器](#容器) - [设计模式](#设计模式) @@ -15,9 +15,9 @@ - [JVM](#JVM) - [Java网络编程](#Java网络编程) - [算法](#算法) - -[必备算法总结](#必备算法总结) - -[剑指offer](#剑指offer) - -[todo]() + - [必备算法总结](#必备算法总结) + - [剑指offer](#剑指offer) + - [todo]() - [计算机基础](#计算机基础) - [计算机网络](#计算机网络) - [操作系统](#操作系统) @@ -43,8 +43,6 @@ - [资料](#资料) - [书单](#书单) - [待办](#待办) -- [说明](#说明) -- [微信公众号](#微信公众号) ## Java基础 @@ -128,12 +126,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 @@ -185,17 +183,17 @@ 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) ## 算法 @@ -217,6 +215,7 @@ todo * [计算机网络学习总结](docs/network/计算机网络学习总结.md) * [tcp/ip必会](https://www.cxyxiaowu.com/11609.html) +* [计算机网络——五层与七层模型](https://blog.csdn.net/liuchengzimozigreat/article/details/100169829) ### 操作系统 @@ -226,7 +225,7 @@ todo [Linux内核与基础命令学习总结](docs/operating-system/Linux内核与基础命令学习总结.md) -#### 编译原理 +### 编译原理 todo @@ -249,7 +248,7 @@ 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 和 InnoDB.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) @@ -358,6 +357,7 @@ todo todo ## 工具 + todo ## 资料 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 97d5eae..05c4f57 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,9 +21,6 @@ * [分库分表](#分库分表) * [主从复制,读写分离](#主从复制,读写分离) * [分布式数据库](#分布式数据库) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) --- @@ -62,6 +59,20 @@ Mysql是关系数据库。 ## 存储过程与视图 存储过程是对sql语句进行预编译并且以文件形式包装为一个可以快速执行的程序。但是缺点是不易修改,稍微改动语句就需要重新开发储存过程,优点是执行效率快。视图就是对其他一个或多个表进行重新包装,是一个外观模式,对视图数据的改动也会影响到数据报本身。 +## 内模式,模式,外模式 + +模式又称概念模式或逻辑模式,对应于概念级。它是由数据库设计者综合所有用户的数据,按照统一的观点构造的全局逻辑结构,是对数据库中全部数据的逻辑结构和特征的总体描述,是所有用户的公共数据视图(全局视图)。 + +外模式又称子模式,对应于用户级。它是某个或某几个用户所看到的数据库的数据视图,是与某一应用有关的数据的逻辑表示。外模式是从模式导出的一个子集,包含模式中允许特定用户使用的那部分数据。 + +内模式又称存储模式,对应于物理级,它是数据库中全体数据的内部表示或底层描述,是数据库最低一级的逻辑描述,它描述了数据在存储介质上的存储方式的物理结构,对应着实际存储在外存储介质上的数据库。内模式由内模式描述语言来描述、定义,它是数据库的存储观。 + +##### 拓展资料 + +用户应用程序根据外模式进行数据操作,通过外模式一模式映射,定义和建立某个外模式与模式间的对应关系,将外模式与模式联系起来,当模式发生改变时,只要改变其映射,就可以使外模式保持不变,对应的应用程序也可保持不变; + +另一方面,通过模式一内模式映射,定义建立数据的逻辑结构(模式)与存储结构(内模式)间的对应关系,当数据的存储结构发生变化时,只需改变模式一内模式映射,就能保持模式不变,因此应用程序也可以保持不变。 + ## 事务与隔离级别 事务的四个性质:原子性,一致性,持久性,隔离性。 @@ -213,15 +224,15 @@ mysql慢查询日志可以在mysql的,my.cnf文件中配置开启,然后执行 ​ ​ - 还是没用到索引,因为不符合最左前缀匹配。查询需要3.5秒左右 +​ 还是没用到索引,因为不符合最左前缀匹配。查询需要3.5秒左右 ​ ​ - 最后修改一下sql语句 - - EXPLAIN SELECT * FROM vote_record WHERE id > 0 AND vote_num > 1000; - +​ 最后修改一下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 @@ -229,24 +240,24 @@ mysql慢查询日志可以在mysql的,my.cnf文件中配置开启,然后执行 ​ ​ - 用到了索引,但是只用到了主键索引。再修改一次 +​ 用到了索引,但是只用到了主键索引。再修改一次 ​ ​ - 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。 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..603397c 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" @@ -361,7 +361,8 @@ create database database4 character set utf8; 执行`bin`目录下的`startup_nowrap.bat`文件,如果输出下面内容,则说明已经启动mycat成功,如果没有,请检查`order,trade,user,comment`4个数据库是否已经创建。 - +.webp"> + 采用下面语句登陆Mycat服务器: 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\2232\357\274\232\343\200\216\346\265\205\345\205\245\346\265\205\345\207\272\343\200\217MySQL \345\222\214 InnoDB.md" "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2232\357\274\232MySQL \345\222\214 InnoDB.md" similarity index 96% rename from "docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2232\357\274\232\343\200\216\346\265\205\345\205\245\346\265\205\345\207\272\343\200\217MySQL \345\222\214 InnoDB.md" rename to "docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2232\357\274\232MySQL \345\222\214 InnoDB.md" index 40e7408..29a262b 100644 --- "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2232\357\274\232\343\200\216\346\265\205\345\205\245\346\265\205\345\207\272\343\200\217MySQL \345\222\214 InnoDB.md" +++ "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2232\357\274\232MySQL \345\222\214 InnoDB.md" @@ -3,52 +3,35 @@ * [数据库的定义](#数据库的定义) * [数据库和实例](#数据库和实例) * [MySQL 的架构](#mysql-的架构) + * [数据的存储](#数据的存储) * [如何存储表](#如何存储表) * [如何存储记录](#如何存储记录) * [数据页结构](#数据页结构) + * [索引](#索引) * [索引的数据结构](#索引的数据结构) * [聚集索引和辅助索引](#聚集索引和辅助索引) * [索引的设计](#索引的设计) + * [锁](#锁) * [并发控制机制](#并发控制机制) * [锁的种类](#锁的种类) * [锁的粒度](#锁的粒度) * [锁的算法](#锁的算法) * [死锁的发生](#死锁的发生) + * [事务与隔离级别](#事务与隔离级别) * [几种隔离级别](#几种隔离级别) * [脏读](#脏读) * [不可重复读](#不可重复读) * [幻读](#幻读) + * [总结](#总结) - * [[Innodb与Myisam引擎的区别与应用场景](https://www.cnblogs.com/changna1314/p/6878900.html)](#[innodb与myisam引擎的区别与应用场景]httpswwwcnblogscomchangna1314p6878900html) - - -本文转自互联网 - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -本也将整理到我的个人博客: -> www.how2playlife.com - -更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。 - -本文是《重新学习MySQL数据库》系列其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从入门到进阶,从sql基本的使用方法,从MySQL执行引擎再到索引、事务等知识,一步步地学习MySQL相关技术的实现原理,更好地了解如何基于这些知识来优化sql,减少SQL执行时间,通过执行计划对SQL性能进行分析,再到MySQL的主从复制、主备部署等内容,以便让你更完整地了解整个MySQL方面的技术体系,形成自己的知识框架。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - - + * [[Innodb与Myisam引擎的区别与应用场景](https://www.cnblogs.com/changna1314/p/6878900.html)](#[innodb与myisam引擎的区别与应用场景]httpswwwcnblogscomchangna1314p6878900html) + 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL、PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 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\2234\357\274\232Mysql\347\264\242\345\274\225\345\256\236\347\216\260\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\346\225\260\346\215\256\347\273\223\346\236\204\347\256\227\346\263\225.md" "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2234\357\274\232Mysql\347\264\242\345\274\225\345\256\236\347\216\260\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\346\225\260\346\215\256\347\273\223\346\236\204\347\256\227\346\263\225.md" index b15743e..91f2e93 100644 --- "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2234\357\274\232Mysql\347\264\242\345\274\225\345\256\236\347\216\260\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\346\225\260\346\215\256\347\273\223\346\236\204\347\256\227\346\263\225.md" +++ "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2234\357\274\232Mysql\347\264\242\345\274\225\345\256\236\347\216\260\345\216\237\347\220\206\345\222\214\347\233\270\345\205\263\346\225\260\346\215\256\347\273\223\346\236\204\347\256\227\346\263\225.md" @@ -36,28 +36,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索引 ### 一、简介 @@ -351,7 +329,7 @@ B-Tree有许多变种,其中最常见的是B+Tree,例如MySQL就普遍使用 图4 -如图4所示,在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。做这个优化的目的是为了提高区间访问的性能,例如图4中如果要查询key为从18到49的所有数据记录,当找到18后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率。 +如图4所示,在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。做这个优化的目的是为了**提高区间访问的性能**,例如图4中如果要查询key为从18到49的所有数据记录,当找到18后,只需顺着节点和指针顺序遍历就可以一次性访问到所有数据节点,极大提到了区间查询效率。 这一节对B-Tree和B+Tree进行了一个简单的介绍,下一节结合存储器存取原理介绍为什么目前B+Tree是数据库系统实现索引的首选数据结构。 @@ -359,7 +337,7 @@ B-Tree有许多变种,其中最常见的是B+Tree,例如MySQL就普遍使用 上文说过,红黑树等数据结构也可以用来实现索引,但是文件系统及数据库系统普遍采用B-/+Tree作为索引结构,这一节将结合计算机组成原理相关知识讨论B-/+Tree作为索引的理论基础。 -一般来说,索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。下面先介绍内存和磁盘存取原理,然后再结合这些原理分析B-/+Tree作为索引的效率。 +一般来说,**索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式存储的磁盘上**。这样的话,索引查找过程中就要产生磁盘I/O消耗,相对于内存存取,I/O存取的消耗要高几个数量级,所以评价一个数据结构作为索引的优劣最重要的指标就是在查找过程中磁盘I/O操作次数的渐进复杂度。换句话说,索引的结构组织要尽量减少查找过程中磁盘I/O的存取次数。下面先介绍内存和磁盘存取原理,然后再结合这些原理分析B-/+Tree作为索引的效率。 ### 主存存取原理 @@ -471,7 +449,7 @@ MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为 这里以英文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。 -了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。 +了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有**辅助索引都引用主索引,过长的主索引会令辅助索引变得过大**。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。 下一章将具体讨论这些与索引有关的优化策略。 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\2237\357\274\232\350\257\246\350\247\243MyIsam\344\270\216InnoDB\345\274\225\346\223\216\347\232\204\351\224\201\345\256\236\347\216\260.md" "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2237\357\274\232\350\257\246\350\247\243MyIsam\344\270\216InnoDB\345\274\225\346\223\216\347\232\204\351\224\201\345\256\236\347\216\260.md" index a562c57..e76b7de 100644 --- "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2237\357\274\232\350\257\246\350\247\243MyIsam\344\270\216InnoDB\345\274\225\346\223\216\347\232\204\351\224\201\345\256\236\347\216\260.md" +++ "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2237\357\274\232\350\257\246\350\247\243MyIsam\344\270\216InnoDB\345\274\225\346\223\216\347\232\204\351\224\201\345\256\236\347\216\260.md" @@ -13,27 +13,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的存储引擎,毕竟不同的引擎的锁机制也随着不同。 @@ -48,8 +27,6 @@ Memory:数据是存放在内存中的,默认哈希索引,非常适合存 - - ### 如何选择存储引擎: MyISAM:应用是以读操作和插入操作为主,只有很少的更新和删除操作,并且对事务的完整性、并发性要求不是很高。 diff --git "a/docs/java-web/SSM/SpringMVC\346\272\220\347\240\201\345\210\206\346\236\2201\357\274\232SpringMVC\346\246\202\350\277\260.md" "b/docs/java-web/SSM/SpringMVC\346\272\220\347\240\201\345\210\206\346\236\2201\357\274\232SpringMVC\346\246\202\350\277\260.md" index 167e1fe..1ec5fed 100644 --- "a/docs/java-web/SSM/SpringMVC\346\272\220\347\240\201\345\210\206\346\236\2201\357\274\232SpringMVC\346\246\202\350\277\260.md" +++ "b/docs/java-web/SSM/SpringMVC\346\272\220\347\240\201\345\210\206\346\236\2201\357\274\232SpringMVC\346\246\202\350\277\260.md" @@ -16,30 +16,6 @@ 转自:[跟开涛学SpringMVC](http://jinnianshilongnian.iteye.com/category/231099) -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章将同步到我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《Spring和SpringMVC源码分析》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从spring基础入手,一步步地学习spring基础和springmvc的框架知识,并上手进行项目实战,spring框架是每一个Java工程师必须要学习和理解的知识点,进一步来说,你还需要掌握spring甚至是springmvc的源码以及实现原理,才能更完整地了解整个spring技术体系,形成自己的知识框架。 - -后续还会有springboot和springcloud的技术专题,陆续为大家带来,敬请期待。 - -为了更好地总结和检验你的学习成果,本系列文章也会提供部分知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - - - - - ## Web MVC简介 diff --git "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2201\357\274\232Spring\346\246\202\350\277\260.md" "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2201\357\274\232Spring\346\246\202\350\277\260.md" index 0aa081b..428775a 100644 --- "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2201\357\274\232Spring\346\246\202\350\277\260.md" +++ "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2201\357\274\232Spring\346\246\202\350\277\260.md" @@ -9,28 +9,8 @@ 原文出处: [张开涛](http://sishuok.com/forum/blogPost/list/0/2508.html) -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial -喜欢的话麻烦点下Star哈 -文章将同步到我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《Spring和SpringMVC源码分析》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从spring基础入手,一步步地学习spring基础和springmvc的框架知识,并上手进行项目实战,spring框架是每一个Java工程师必须要学习和理解的知识点,进一步来说,你还需要掌握spring甚至是springmvc的源码以及实现原理,才能更完整地了解整个spring技术体系,形成自己的知识框架。 - -后续还会有springboot和springcloud的技术专题,陆续为大家带来,敬请期待。 - -为了更好地总结和检验你的学习成果,本系列文章也会提供部分知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - - -在讲源码之前,先让我们回顾一下一下Spring的基本概念,当然,在看源码之前你需要使用过spring或者spirngmvc。 ## Spring是什么 Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发。应用程序是由一组相互协作的对象组成。而在传统应用程序开发中,一个完整的应用是由一组相互协作的对象组成。所以开发一个应用除了要开发业务逻辑之外,最多的是关注如何使这些对象协作来完成所需功能,而且要低耦合、高内聚。 @@ -81,7 +61,7 @@ Spring除了不能帮我们写业务逻辑,其余的几乎什么都能帮助 Spring能帮我们做这么多事情,提供这么多功能和与那么多主流技术整合,而且是帮我们做了开发中比较头疼和困难的事情,那可能有人会问,难道只有Spring这一个框架,没有其他选择?当然有,比如EJB需要依赖应用服务器、开发效率低、在开发中小型项目是宰鸡拿牛刀,虽然发展到现在EJB比较好用了,但还是比较笨重还需要依赖应用服务器等。那为何需要使用Spring,而不是其他框架呢?让我们接着往下看。 -  + ## 为何需要Spring 一 首先阐述几个概念 diff --git "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2202\357\274\232\345\210\235\346\216\242Spring IOC\346\240\270\345\277\203\346\265\201\347\250\213.md" "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2202\357\274\232\345\210\235\346\216\242Spring IOC\346\240\270\345\277\203\346\265\201\347\250\213.md" index 50490ce..9a8a0e3 100644 --- "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2202\357\274\232\345\210\235\346\216\242Spring IOC\346\240\270\345\277\203\346\265\201\347\250\213.md" +++ "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2202\357\274\232\345\210\235\346\216\242Spring IOC\346\240\270\345\277\203\346\265\201\347\250\213.md" @@ -8,27 +8,6 @@ * [注入依赖](#注入依赖) -本文转载自互联网,侵删 - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章将同步到我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《Spring和SpringMVC源码分析》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从spring基础入手,一步步地学习spring基础和springmvc的框架知识,并上手进行项目实战,spring框架是每一个Java工程师必须要学习和理解的知识点,进一步来说,你还需要掌握spring甚至是springmvc的源码以及实现原理,才能更完整地了解整个spring技术体系,形成自己的知识框架。 - -后续还会有springboot和springcloud的技术专题,陆续为大家带来,敬请期待。 - -为了更好地总结和检验你的学习成果,本系列文章也会提供部分知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - ## 前言 @@ -352,7 +331,7 @@ public void registerBeanDefinition(String beanName, BeanDefinition beanDefinitio 理解了以上两个过程,我们就可以自己实现一个简单的Spring框架了。于是,我根据自己的理解实现了一个简单的IOC框架Simple Spring,有兴趣可以看看。 -​ + 注册过程中,最核心的一句就是:`this.beanDefinitionMap.put(beanName, beanDefinition)`,也就是说注册的实质就是以beanName为key,以beanDefinition为value,将其put到HashMap中。 diff --git "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\21413\357\274\232Hibernate\345\205\245\351\227\250\347\273\217\345\205\270\344\270\216\346\263\250\350\247\243\345\274\217\345\274\200\345\217\221.md" "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\21413\357\274\232Hibernate\345\205\245\351\227\250\347\273\217\345\205\270\344\270\216\346\263\250\350\247\243\345\274\217\345\274\200\345\217\221.md" index 738b37f..8d70361 100644 --- "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\21413\357\274\232Hibernate\345\205\245\351\227\250\347\273\217\345\205\270\344\270\216\346\263\250\350\247\243\345\274\217\345\274\200\345\217\221.md" +++ "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\21413\357\274\232Hibernate\345\205\245\351\227\250\347\273\217\345\205\270\344\270\216\346\263\250\350\247\243\345\274\217\345\274\200\345\217\221.md" @@ -6,30 +6,8 @@ * [相关类](#相关类) * [扩展](#扩展) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [个人公众号:程序员黄小斜](#个人公众号:程序员黄小斜) - * [技术公众号:Java技术江湖](#技术公众号:java技术江湖) - -本文转载自互联网,侵删 -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -本系列文章将同步到我的个人博客: -> www.how2playlife.com - -更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。 - -本文是《走进JavaWeb技术世界》系列博文的其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从入门到进阶,从servlet到框架,从ssm再到SpringBoot,一步步地学习JavaWeb基础知识,并上手进行实战,接着了解JavaWeb项目中经常要使用的技术和组件,包括日志组件、Maven、Junit,等等内容,以便让你更完整地了解整个JavaWeb技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - -**文末赠送8000G的Java架构师学习资料,需要的朋友可以到文末了解领取方式,资料包括Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)** - + ## 前言 @@ -96,7 +74,7 @@ Hibernate是一种ORM框架,全称为 Object_Relative DateBase-Mapping,在Ja } } - + 其实使用DbUtils时,DAO层中的代码编写是很有规律的。 当插入数据的时候,就将JavaBean对象拆分,拼装成SQL语句 @@ -145,7 +123,7 @@ hibernate3.jar核心 + required 必须引入的(6个) + jpa 目录 + 数据库 我们是不知道该XML是怎么写的,可以搜索一下Hibernate文件夹中后缀为.hbm.xml。看看它们是怎么写的。然后复制一份过来 - + - - + + +​ - - + + +​ @@ -183,7 +163,7 @@ hibernate3.jar核心 + required 必须引入的(6个) + jpa 目录 + 数据库 - + 在上面的模板上修改~下面会具体讲解这个配置文件! @@ -212,7 +192,7 @@ hibernate3.jar核心 + required 必须引入的(6个) + jpa 目录 + 数据库 它长得这个样子: - + update --> - + 通过上面的模板进行修改,后面会有对该配置文件进行讲解! @@ -267,7 +247,7 @@ hibernate3.jar核心 + required 必须引入的(6个) + jpa 目录 + 数据库 import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Session; - + /** * Created by ozc on 2017/5/6. */ @@ -313,44 +293,44 @@ hibernate3.jar核心 + required 必须引入的(6个) + jpa 目录 + 数据库 Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'zhongfucheng.user' does - + 执行完程序后,Hibernate就为我们创建对应的表,并把数据存进了数据库了 我们看看快速入门案例的代码用到了什么对象吧,然后一个一个讲解 public static void main(String[] args) { - + //创建对象 User user = new User(); user.setPassword("123"); user.setCellphone("122222"); user.setUsername("nihao"); - + //获取加载配置管理类 Configuration configuration = new Configuration(); - + //不给参数就默认加载hibernate.cfg.xml文件, configuration.configure(); - + //创建Session工厂对象 SessionFactory factory = configuration.buildSessionFactory(); - + //得到Session对象 Session session = factory.openSession(); - + //使用Hibernate操作数据库,都要开启事务,得到事务对象 Transaction transaction = session.getTransaction(); - + //开启事务 transaction.begin(); - + //把对象添加到数据库中 session.save(user); - + //提交事务 transaction.commit(); - + //关闭Session session.close(); } @@ -443,7 +423,7 @@ HQL是面向对象的查询语言,可以用来查询全部的数据! Query query = session.createQuery("FROM User"); - + List list = query.list(); System.out.println(list); @@ -451,10 +431,10 @@ HQL是面向对象的查询语言,可以用来查询全部的数据! Query query = session.createQuery("FROM User WHERE id=?"); - + //这里的?号是从0开始的,并不像JDBC从1开始的! query.setParameter(0, user.getId()); - + List list = query.list(); System.out.println(list); @@ -471,10 +451,10 @@ QBC查询: query by criteria 完全面向对象的查询 //创建关于user对象的criteria对象 Criteria criteria = session.createCriteria(User.class); - + //添加条件 criteria.add(Restrictions.eq("id", 1)); - + //查询全部数据 List list = criteria.list(); System.out.println(list); @@ -491,9 +471,9 @@ QBC查询: query by criteria 完全面向对象的查询 //将所有的记录封装成User对象存进List集合中 SQLQuery sqlQuery = session.createSQLQuery("SELECT * FROM user").addEntity(User.class); - + List list = sqlQuery.list(); - + System.out.println(list); beginTransaction方法 @@ -513,21 +493,21 @@ PO类注解配置 @Entity // 定义了一个实体 @Table(name="t_book",catalog="hibernateTest") public class Book { - + @Id // 这表示一个主键 // @GeneratedValue 相当于native主键生成策略 @GeneratedValue(strategy=GenerationType.IDENTITY) // 相当于identity主键生成策略 private Integer id; // 主键 - + @Column(name="c_name", length=30, nullable=true) private String name; - + @Temporal(TemporalType.TIMESTAMP) // 是用来定义日期类型 private Date publicationDate; // 出版日期 - + @Type(type="double") // 允许你去指定Hibernate里面的一些类型 private Double price; // 价格,如果没有添加注解,也会自动的生成在表中 - + public Integer getId() { return id; } @@ -559,16 +539,16 @@ PO类注解配置 @Entity:声明一个实体。 @Table:来描述类与表之间的对应关系。 - + @Entity // 定义了一个实体 @Table(name="t_book",catalog="hibernateTest") public class Book { ...... } - + @id:声明一个主键。 @GeneratedValue:用它来声明一个主键生成策略。默认情况是native主键生成策略。可以选择的主键生成策略有:AUTO、IDENTITY、SEQUENCE - + @Id // 这表示一个主键 // @GeneratedValue 相当于native主键生成策略 @GeneratedValue(strategy=GenerationType.IDENTITY) // 相当于identity主键生成策略 @@ -736,8 +716,9 @@ Hibernate关联映射——一对多(多对一) } } - - + + +​ 订单(Order)类 // 订单 ---- 多的一方 @@ -1045,39 +1026,4 @@ Hibernate关联映射——多对多 -https://blog.csdn.net/android_hl/article/details/53228348 - -## 微信公众号 - -### 个人公众号:程序员黄小斜 - -​ -黄小斜是 985 硕士,阿里巴巴Java工程师,在自学编程、技术求职、Java学习等方面有丰富经验和独到见解,希望帮助到更多想要从事互联网行业的程序员们。 -​ -作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得,以及自学编程和Java技术栈的相关干货。 -​ -黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长! - -**原创电子书:** -关注微信公众号【程序员黄小斜】后回复【原创电子书】即可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》这份电子书总结了我2年的Java学习之路,包括学习方法、技术总结、求职经验和面试技巧等内容,已经帮助很多的程序员拿到了心仪的offer! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取,包括Java、python、C++、大数据、机器学习、前端、移动端等方向的技术资料。 - - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - - -### 技术公众号:Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的微信公众号【Java技术江湖】 - -这是一位阿里 Java 工程师的技术小站。作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - - -**Java工程师必备学习资源:** -关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源 - - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -​ +https://blog.csdn.net/android_hl/article/details/53228348 diff --git "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\21414\357\274\232Mybatis\345\205\245\351\227\250.md" "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\21414\357\274\232Mybatis\345\205\245\351\227\250.md" index 6a2976a..28d8810 100644 --- "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\21414\357\274\232Mybatis\345\205\245\351\227\250.md" +++ "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\21414\357\274\232Mybatis\345\205\245\351\227\250.md" @@ -10,6 +10,7 @@ * [与Hibernate的异同](#与hibernate的异同) * [参考文章](#参考文章) * [微信公众号](#微信公众号) + * [个人公众号:黄小斜](#个人公众号:黄小斜) * [mybatis新手上路](#mybatis新手上路) * [MyBatis简介](#mybatis简介) @@ -19,29 +20,8 @@ * [3.会话工厂与会话](#3会话工厂与会话) * [4.运行流程](#4运行流程) * [测试工程搭建](#测试工程搭建) - * [微信公众号](#微信公众号-1) - * [个人公众号:程序员黄小斜](#个人公众号:程序员黄小斜) - * [技术公众号:Java技术江湖](#技术公众号:java技术江湖) - - -本文转载自互联网,侵删 -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -本系列文章将同步到我的个人博客: -> www.how2playlife.com - -更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。 - -本文是《走进JavaWeb技术世界》系列博文的其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从入门到进阶,从servlet到框架,从ssm再到SpringBoot,一步步地学习JavaWeb基础知识,并上手进行实战,接着了解JavaWeb项目中经常要使用的技术和组件,包括日志组件、Maven、Junit,等等内容,以便让你更完整地了解整个JavaWeb技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - + + ## 前言 @@ -174,25 +154,8 @@ Mybatis开始逐渐流行起来,必然有其原因,简单了解了一下它 https://blog.csdn.net/android_hl/article/details/53228348 -## 微信公众号 -### 个人公众号:黄小斜 -黄小斜是跨考软件工程的 985 硕士,自学 Java 两年,拿到了 BAT 等近十家大厂 offer,从技术小白成长为阿里工程师。 - -作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得和程序人生,目前黄小斜的CSDN博客有百万+访问量,知乎粉丝2W+,全网已有10W+读者。 - -黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长! - -**原创电子书:** -关注公众号【黄小斜】后回复【原创电子书】即可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》 - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -**考研复习资料:** -计算机考研大礼包,都是我自己考研复习时用的一些复习资料,包括公共课和专业的复习视频,这里也推荐给大家,关注公众号后,后台回复关键字 **“考研”** 即可免费获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) # mybatis新手上路 @@ -242,7 +205,7 @@ Mybatis中所有数据库的操作都会基于该映射文件和配置的sql语 Mapper.xml配置文件大致如下: - +```xml

@@ -253,7 +216,7 @@ Mapper.xml配置文件大致如下:
     
 
- +``` ### 3.会话工厂与会话 @@ -419,38 +382,4 @@ public class TestClient { //定义会话SqlSession ![](https://images2018.cnblogs.com/blog/577318/201807/577318-20180702181558003-1700599553.png) - -## 微信公众号 - -### 个人公众号:程序员黄小斜 - -​ -黄小斜是 985 硕士,阿里巴巴Java工程师,在自学编程、技术求职、Java学习等方面有丰富经验和独到见解,希望帮助到更多想要从事互联网行业的程序员们。 -​ -作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得,以及自学编程和Java技术栈的相关干货。 -​ -黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长! - -**原创电子书:** -关注微信公众号【程序员黄小斜】后回复【原创电子书】即可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》这份电子书总结了我2年的Java学习之路,包括学习方法、技术总结、求职经验和面试技巧等内容,已经帮助很多的程序员拿到了心仪的offer! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取,包括Java、python、C++、大数据、机器学习、前端、移动端等方向的技术资料。 - - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - - -### 技术公众号:Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的微信公众号【Java技术江湖】 - -这是一位阿里 Java 工程师的技术小站。作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - - -**Java工程师必备学习资源:** -关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源 - - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - ​ diff --git "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\21416\357\274\232\346\236\201\347\256\200\351\205\215\347\275\256\347\232\204SpringBoot.md" "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\21416\357\274\232\346\236\201\347\256\200\351\205\215\347\275\256\347\232\204SpringBoot.md" index a5cbc34..c08a57f 100644 --- "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\21416\357\274\232\346\236\201\347\256\200\351\205\215\347\275\256\347\232\204SpringBoot.md" +++ "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\21416\357\274\232\346\236\201\347\256\200\351\205\215\347\275\256\347\232\204SpringBoot.md" @@ -16,30 +16,8 @@ * [Spring Boot 支持 JSP](#spring-boot-支持-jsp) * [集成 MyBatis](#集成-mybatis) * [springMVC和springboot的区别](#springmvc和springboot的区别) - * [微信公众号](#微信公众号) - * [个人公众号:程序员黄小斜](#个人公众号:程序员黄小斜) - * [技术公众号:Java技术江湖](#技术公众号:java技术江湖) - -本文转载自互联网,侵删 -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -本系列文章将同步到我的个人博客: -> www.how2playlife.com - -更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。 - -本文是《走进JavaWeb技术世界》系列博文的其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从入门到进阶,从servlet到框架,从ssm再到SpringBoot,一步步地学习JavaWeb基础知识,并上手进行实战,接着了解JavaWeb项目中经常要使用的技术和组件,包括日志组件、Maven、Junit,等等内容,以便让你更完整地了解整个JavaWeb技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - -**文末赠送8000G的Java架构师学习资料,需要的朋友可以到文末了解领取方式,资料包括Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)** - + ![](https://upload-images.jianshu.io/upload_images/7896890-9323041dd0ce883e.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) @@ -52,7 +30,7 @@ #### 什么是 Spring Boot -* 它使用 “习惯优于配置” (项目中存在大量的配置,此外还内置一个习惯性的配置,让你无须)的理念让你的项目快速运行起来。 +* 它使用 “约定优于配置” (项目中存在大量的配置,此外还内置一个习惯性的配置,让你无须)的理念让你的项目快速运行起来。 * 它并不是什么新的框架,而是默认配置了很多框架的使用方式,就像 Maven 整合了所有的 jar 包一样,Spring Boot 整合了所有框架(引自:[springboot(一):入门篇——纯洁的微笑](http://www.ityouknow.com/springboot/2016/01/06/springboot(%E4%B8%80)-%E5%85%A5%E9%97%A8%E7%AF%87.html)) #### 使用 Spring Boot 有什么好处 @@ -158,7 +136,7 @@ public class HelloController { 让我们来看看默认生成的 pom.xml 文件中到底有一些什么特别: -``` +```xml @@ -211,7 +189,7 @@ public class HelloController { 我们可以看到一个比较陌生一些的标签 `` ,这个标签是在配置 Spring Boot 的父级依赖: -``` +```xml org.springframework.boot spring-boot-starter-parent @@ -530,37 +508,4 @@ Spring MVC 是基于Spring的一个 MVC 框架 ; Spring Boot 是基于Spring4的条件注册的一套快速开发整合包。 -## 微信公众号 - -### 个人公众号:程序员黄小斜 - -​ -黄小斜是 985 硕士,阿里巴巴Java工程师,在自学编程、技术求职、Java学习等方面有丰富经验和独到见解,希望帮助到更多想要从事互联网行业的程序员们。 -​ -作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得,以及自学编程和Java技术栈的相关干货。 -​ -黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长! - -**原创电子书:** -关注微信公众号【程序员黄小斜】后回复【原创电子书】即可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》这份电子书总结了我2年的Java学习之路,包括学习方法、技术总结、求职经验和面试技巧等内容,已经帮助很多的程序员拿到了心仪的offer! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取,包括Java、python、C++、大数据、机器学习、前端、移动端等方向的技术资料。 - - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - - -### 技术公众号:Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的微信公众号【Java技术江湖】 - -这是一位阿里 Java 工程师的技术小站。作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - - -**Java工程师必备学习资源:** -关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源 - - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - ​ diff --git "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2141\357\274\232JavaWeb\347\232\204\347\224\261\346\235\245\345\222\214\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2141\357\274\232JavaWeb\347\232\204\347\224\261\346\235\245\345\222\214\345\237\272\347\241\200\347\237\245\350\257\206.md" index fbe5272..d7f01d6 100644 --- "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2141\357\274\232JavaWeb\347\232\204\347\224\261\346\235\245\345\222\214\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2141\357\274\232JavaWeb\347\232\204\347\224\261\346\235\245\345\222\214\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -10,30 +10,8 @@ * [2、web服务器](#2、web服务器) * [三、JavaWeb项目结构](#三、javaweb项目结构) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [个人公众号:程序员黄小斜](#个人公众号:程序员黄小斜) - * [技术公众号:Java技术江湖](#技术公众号:java技术江湖) - -本文转载自互联网,侵删 -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -本系列文章将同步到我的个人博客: -> www.how2playlife.com - -更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。 - -本文是《走进JavaWeb技术世界》系列博文的其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从入门到进阶,从servlet到框架,从ssm再到SpringBoot,一步步地学习JavaWeb基础知识,并上手进行实战,接着了解JavaWeb项目中经常要使用的技术和组件,包括日志组件、Maven、Junit,等等内容,以便让你更完整地了解整个JavaWeb技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - + ## 什么是 Java Web 如果你是70、80后的程序员,你一定要看一看这篇文章,保证满满的回忆。如果你是90后,那你更要看看这篇文章,因为你能找到java web发展的历史。 @@ -240,38 +218,4 @@ https://www.jianshu.com/p/d9b770a78da1 https://www.cnblogs.com/albertrui/p/8427661.html https://blog.csdn.net/qq_41911570/article/details/83279327 - -## 微信公众号 - -### 个人公众号:程序员黄小斜 - - -黄小斜是 985 硕士,阿里巴巴Java工程师,在自学编程、技术求职、Java学习等方面有丰富经验和独到见解,希望帮助到更多想要从事互联网行业的程序员们。 -​ -作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得,以及自学编程和Java技术栈的相关干货。 -​ -黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长! - -**原创电子书:** -关注微信公众号【程序员黄小斜】后回复【原创电子书】即可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》这份电子书总结了我2年的Java学习之路,包括学习方法、技术总结、求职经验和面试技巧等内容,已经帮助很多的程序员拿到了心仪的offer! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取,包括Java、python、C++、大数据、机器学习、前端、移动端等方向的技术资料。 - - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - - -### 技术公众号:Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的微信公众号【Java技术江湖】 - -这是一位阿里 Java 工程师的技术小站。作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - - -**Java工程师必备学习资源:** -关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源 - - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - ​ diff --git "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2142\357\274\232JSP\344\270\216Servlet\347\232\204\346\233\276\347\273\217\344\270\216\347\216\260\345\234\250.md" "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2142\357\274\232JSP\344\270\216Servlet\347\232\204\346\233\276\347\273\217\344\270\216\347\216\260\345\234\250.md" index e396253..7cb3511 100644 --- "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2142\357\274\232JSP\344\270\216Servlet\347\232\204\346\233\276\347\273\217\344\270\216\347\216\260\345\234\250.md" +++ "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2142\357\274\232JSP\344\270\216Servlet\347\232\204\346\233\276\347\273\217\344\270\216\347\216\260\345\234\250.md" @@ -18,27 +18,6 @@ * [参考文章](#参考文章) -本文转载自互联网,侵删 -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -本系列文章将同步到我的个人博客: -> www.how2playlife.com - -更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。 - -本文是《走进JavaWeb技术世界》系列博文的其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从入门到进阶,从servlet到框架,从ssm再到SpringBoot,一步步地学习JavaWeb基础知识,并上手进行实战,接着了解JavaWeb项目中经常要使用的技术和组件,包括日志组件、Maven、Junit,等等内容,以便让你更完整地了解整个JavaWeb技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - -**文末赠送8000G的Java架构师学习资料,需要的朋友可以到文末了解领取方式,资料包括Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)** - - -jsp作为Servlet技术的扩展,经常会有人将jsp和Servlet搞混。本文,将为大家带来servlet和jsp的区别,希望对大家有所帮助。 ## servlet和jsp的区别 diff --git "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2143\357\274\232JDBC\347\232\204\350\277\233\345\214\226\344\270\216\350\277\236\346\216\245\346\261\240\346\212\200\346\234\257.md" "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2143\357\274\232JDBC\347\232\204\350\277\233\345\214\226\344\270\216\350\277\236\346\216\245\346\261\240\346\212\200\346\234\257.md" index 898f592..4d5f891 100644 --- "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2143\357\274\232JDBC\347\232\204\350\277\233\345\214\226\344\270\216\350\277\236\346\216\245\346\261\240\346\212\200\346\234\257.md" +++ "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2143\357\274\232JDBC\347\232\204\350\277\233\345\214\226\344\270\216\350\277\236\346\216\245\346\261\240\346\212\200\346\234\257.md" @@ -18,26 +18,6 @@ -本文转载自互联网,侵删 -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -本系列文章将同步到我的个人博客: -> www.how2playlife.com - -更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。 - -本文是《走进JavaWeb技术世界》系列博文的其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从入门到进阶,从servlet到框架,从ssm再到SpringBoot,一步步地学习JavaWeb基础知识,并上手进行实战,接着了解JavaWeb项目中经常要使用的技术和组件,包括日志组件、Maven、Junit,等等内容,以便让你更完整地了解整个JavaWeb技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - -**文末赠送8000G的Java架构师学习资料,需要的朋友可以到文末了解领取方式,资料包括Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)** - - # JDBC数据库连接池 ## 谈谈连接池、线程池技术原理 diff --git "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2144\357\274\232Servlet \345\267\245\344\275\234\345\216\237\347\220\206\350\257\246\350\247\243.md" "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2144\357\274\232Servlet \345\267\245\344\275\234\345\216\237\347\220\206\350\257\246\350\247\243.md" index 4e4c0db..0c4bde3 100644 --- "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2144\357\274\232Servlet \345\267\245\344\275\234\345\216\237\347\220\206\350\257\246\350\247\243.md" +++ "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2144\357\274\232Servlet \345\267\245\344\275\234\345\216\237\347\220\206\350\257\246\350\247\243.md" @@ -13,25 +13,6 @@ -本文转载自互联网,侵删 -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -本系列文章将同步到我的个人博客: -> www.how2playlife.com - -更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。 - -本文是《走进JavaWeb技术世界》系列博文的其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从入门到进阶,从servlet到框架,从ssm再到SpringBoot,一步步地学习JavaWeb基础知识,并上手进行实战,接着了解JavaWeb项目中经常要使用的技术和组件,包括日志组件、Maven、Junit,等等内容,以便让你更完整地了解整个JavaWeb技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - -**文末赠送8000G的Java架构师学习资料,需要的朋友可以到文末了解领取方式,资料包括Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)** - ## 什么是Servlet Servlet的作用是**为Java程序提供一个统一的web应用的规范**,方便程序员统一的使用这种规范来编写程序,应用容器可以使用提供的规范来实现自己的特性。比如tomcat的代码和jetty的代码就不一样,但作为程序员你只需要了解servlet规范就可以从request中取值,你可以操作session等等。不用在意应用服务器底层的实现的差别而影响你的开发。 @@ -153,25 +134,18 @@ Servlet工作原理时序图 > 1. Web Client 向Servlet容器(Tomcat)发出Http请求; > -> > 2. Servlet容器接收Web Client的请求; > -> > 3. Servlet容器创建一个HttpRequest对象,将Web Client请求的信息封装到这个对象中; > -> > 4. Servlet容器创建一个HttpResponse对象; > -> > 5. Servlet容器调用HttpServlet对象的service方法,把HttpRequest对象与HttpResponse对象作为参数传给 HttpServlet对象; > -> > 6. HttpServlet调用HttpRequest对象的有关方法,获取Http请求信息; > -> > 7. HttpServlet调用HttpResponse对象的有关方法,生成响应数据; > -> > 8. Servlet容器把HttpServlet的响应结果传给Web Client; ## Servlet生命周期 @@ -370,38 +344,3 @@ Session工作的时序图 https://blog.csdn.net/android_hl/article/details/53228348 - -## 微信公众号 - -### 个人公众号:程序员黄小斜 - -​ -黄小斜是 985 硕士,阿里巴巴Java工程师,在自学编程、技术求职、Java学习等方面有丰富经验和独到见解,希望帮助到更多想要从事互联网行业的程序员们。 -​ -作者专注于 JAVA 后端技术栈,热衷于分享程序员干货、学习经验、求职心得,以及自学编程和Java技术栈的相关干货。 -​ -黄小斜是一个斜杠青年,坚持学习和写作,相信终身学习的力量,希望和更多的程序员交朋友,一起进步和成长! - -**原创电子书:** -关注微信公众号【程序员黄小斜】后回复【原创电子书】即可领取我原创的电子书《菜鸟程序员修炼手册:从技术小白到阿里巴巴Java工程师》这份电子书总结了我2年的Java学习之路,包括学习方法、技术总结、求职经验和面试技巧等内容,已经帮助很多的程序员拿到了心仪的offer! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取,包括Java、python、C++、大数据、机器学习、前端、移动端等方向的技术资料。 - - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - - -### 技术公众号:Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的微信公众号【Java技术江湖】 - -这是一位阿里 Java 工程师的技术小站。作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - - -**Java工程师必备学习资源:** -关注公众号后回复”Java“即可领取 Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源 - - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -​ diff --git "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2145\357\274\232\345\210\235\346\216\242Tomcat\347\232\204HTTP\350\257\267\346\261\202\350\277\207\347\250\213.md" "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2145\357\274\232\345\210\235\346\216\242Tomcat\347\232\204HTTP\350\257\267\346\261\202\350\277\207\347\250\213.md" index 921ddf8..2c97aa0 100644 --- "a/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2145\357\274\232\345\210\235\346\216\242Tomcat\347\232\204HTTP\350\257\267\346\261\202\350\277\207\347\250\213.md" +++ "b/docs/java-web/\350\265\260\350\277\233JavaWeb\346\212\200\346\234\257\344\270\226\347\225\2145\357\274\232\345\210\235\346\216\242Tomcat\347\232\204HTTP\350\257\267\346\261\202\350\277\207\347\250\213.md" @@ -9,26 +9,6 @@ -本文转载自互联网,侵删 -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -本系列文章将同步到我的个人博客: -> www.how2playlife.com - -更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。 - -本文是《走进JavaWeb技术世界》系列博文的其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从入门到进阶,从servlet到框架,从ssm再到SpringBoot,一步步地学习JavaWeb基础知识,并上手进行实战,接着了解JavaWeb项目中经常要使用的技术和组件,包括日志组件、Maven、Junit,等等内容,以便让你更完整地了解整个JavaWeb技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - -**文末赠送8000G的Java架构师学习资料,需要的朋友可以到文末了解领取方式,资料包括Java基础、进阶、项目和架构师等免费学习资料,更有数据库、分布式、微服务等热门技术学习视频,内容丰富,兼顾原理和实践,另外也将赠送作者原创的Java学习指南、Java程序员面试指南等干货资源)** - - # [走进JavaWeb技术世界5:初探Tomcat的HTTP请求过程](https://www.cnblogs.com/xll1025/p/11366264.html) diff --git "a/docs/java/basic/10\343\200\201Java\345\274\202\345\270\270.md" "b/docs/java/basic/10\343\200\201Java\345\274\202\345\270\270.md" index c937417..3baa032 100644 --- "a/docs/java/basic/10\343\200\201Java\345\274\202\345\270\270.md" +++ "b/docs/java/basic/10\343\200\201Java\345\274\202\345\270\270.md" @@ -15,29 +15,9 @@ * [当finally遇上return](#当finally遇上return) * [JAVA异常常见面试题](#java异常常见面试题) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) ---- - - - Java异常 ---- - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 + - ## 为什么要使用异常 > 首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率。虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位,作用。 @@ -49,7 +29,6 @@ > 2、 代码可读性差。将异常处理代码和程序代码混淆在一起将会降低代码的可读性。 > > 3、 由调用函数来分析异常,这要求程序员对库函数有很深的了解。 -> 在OO中提供的异常处理机制是提供代码健壮的强有力的方式。使用异常机制它能够降低错误处理代码的复杂度,如果不使用异常,那么就必须检查特定的错误,并在程序中的许多地方去处理它。 @@ -71,7 +50,7 @@ ## 异常体系 -[外链图片转存失败(img-KNxcBTK0-1569073569353)(https://images0.cnblogs.com/blog/381060/201311/22185952-834d92bc2bfe498f9a33414cc7a2c8a4.png)] +![外链图片转存失败(img-KNxcBTK0-1569073569353)](https://images0.cnblogs.com/blog/381060/201311/22185952-834d92bc2bfe498f9a33414cc7a2c8a4.png) 从上面这幅图可以看出,Throwable是java语言中所有错误和异常的超类(万物即可抛)。它有两个子类:Error、Exception。 @@ -133,15 +112,15 @@ Throwable又派生出Error类和Exception类。 ​ - // ----欢迎使用命令行除法计算器---- - // r - // Exception in thread "main" java.util.InputMismatchException - // at java.util.Scanner.throwFor(Scanner.java:864) - // at java.util.Scanner.next(Scanner.java:1485) - // at java.util.Scanner.nextInt(Scanner.java:2117) - // at java.util.Scanner.nextInt(Scanner.java:2076) - // at com.javase.异常.异常.CMDCalculate(异常.java:17) - // at com.javase.异常.异常.main(异常.java:12) +​ // ----欢迎使用命令行除法计算器---- +​ // r +​ // Exception in thread "main" java.util.InputMismatchException +​ // at java.util.Scanner.throwFor(Scanner.java:864) +​ // at java.util.Scanner.next(Scanner.java:1485) +​ // at java.util.Scanner.nextInt(Scanner.java:2117) +​ // at java.util.Scanner.nextInt(Scanner.java:2076) +​ // at com.javase.异常.异常.CMDCalculate(异常.java:17) +​ // at com.javase.异常.异常.main(异常.java:12) [外链图片转存失败(img-9rqUQJQj-1569073569354)(http://incdn1.b0.upaiyun.com/2017/09/0b3e4ca2f4cf8d7116c7ad354940601f.png)] @@ -840,7 +819,7 @@ Bloch编写的 [Effective Java 一书](http://www.amazon.com/dp/0321356683/?tag **9) JDK7中对异常处理做了什么改变?** -  这是最近新出的Java异常处理的面试题。JDK7中对错误(Error)和异常(Exception)处理主要新增加了2个特性,一是在一个catch块中可以出来多个异常,就像原来用多个catch块一样。另一个是自动化资源管理(ARM), 也称为try-with-resource块。这2个特性都可以在处理异常时减少代码量,同时提高代码的可读性。对于这些特性了解,不仅帮助开发者写出更好的异常处理的代码,也让你在面试中显的更突出。我推荐大家读一下Java 7攻略,这样可以更深入的了解这2个非常有用的特性。 +  这是最近新出的Java异常处理的面试题。JDK7中对错误(Error)和异常(Exception)处理主要新增加了2个特性,一是在一个catch块中可以处理多个异常,就像原来用多个catch块一样。另一个是自动化资源管理(ARM), 也称为try-with-resource块。这2个特性都可以在处理异常时减少代码量,同时提高代码的可读性。对于这些特性了解,不仅帮助开发者写出更好的异常处理的代码,也让你在面试中显的更突出。我推荐大家读一下Java 7攻略,这样可以更深入的了解这2个非常有用的特性。 **10) 你遇到过 OutOfMemoryError 错误嘛?你是怎么搞定的?** @@ -861,22 +840,3 @@ https://www.jianshu.com/p/49d2c3975c56 http://c.biancheng.net/view/1038.html https://blog.csdn.net/Lisiluan/article/details/88745820 https://blog.csdn.net/michaelgo/article/details/82790253 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - diff --git "a/docs/java/basic/11\343\200\201\350\247\243\350\257\273Java\344\270\255\347\232\204\345\233\236\350\260\203.md" "b/docs/java/basic/11\343\200\201\350\247\243\350\257\273Java\344\270\255\347\232\204\345\233\236\350\260\203.md" index 1af4d91..f0330e9 100644 --- "a/docs/java/basic/11\343\200\201\350\247\243\350\257\273Java\344\270\255\347\232\204\345\233\236\350\260\203.md" +++ "b/docs/java/basic/11\343\200\201\350\247\243\350\257\273Java\344\270\255\347\232\204\345\233\236\350\260\203.md" @@ -7,36 +7,9 @@ * [实例二:由浅入深](#实例二:由浅入深) * [实例三:Tom做题](#实例三:tom做题) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) + - ---- -title: 夯实Java基础系列11:深入理解Java中的回调机制 -date: 2019-9-11 15:56:26 # 文章生成时间,一般不改 -categories: - - Java技术江湖 - - Java基础 -tags: - - 回调机制 ---- - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - ## 模块间的调用 本部分摘自https://www.cnblogs.com/xrq730/p/6424471.html @@ -67,7 +40,7 @@ tags: 2、回调的用途 回调一般用于层间协作,上层将本层函数安装在下层,这个函数就是回调,而下层在一定条件下触发回调。例如作为一个驱动,是一个底层,他在收到一个数据时,除了完成本层的处理工作外,还将进行回调,将这个数据交给上层应用层来做进一步处理,这在分层的数据通信中很普遍。 - + ## 多线程中的“回调” Java多线程中可以通过callable和future或futuretask结合来获取线程执行后的返回值。实现方法是通过get方法来调用callable的call方法获取返回值。 @@ -90,7 +63,7 @@ Java多线程中可以通过callable和future或futuretask结合来获取线程 System.out.println(future.get()); //需要手动关闭,不然线程池的线程会继续执行。 executor.shutdown(); - + //使用futuretask同时作为线程执行单元和数据请求单元。 FutureTask futureTask = new FutureTask(new Callable() { @Override @@ -112,7 +85,7 @@ Java多线程中可以通过callable和future或futuretask结合来获取线程 } }; FutureTask futureTask = new FutureTask(callable); - + } } @@ -334,7 +307,7 @@ callBottomService start --> callBottomService.bottom() execute --> BottomServi System.out.print("小明和小李一起去吃大龙虾"); } } - + 不过上面已经说过了这个不是回调函数,所以不能这样子,正确的方式如下 public class XiaoLi{//小李 @@ -345,7 +318,7 @@ callBottomService start --> callBottomService.bottom() execute --> BottomServi xm.eat();//洗漱完后,一起去吃饭 } } - + 这样子就可以实现washFace()同时也能实现eat()。小李洗漱完后,再通知小明一起去吃饭,这就是回调。 二、Java的回调-中 @@ -392,7 +365,7 @@ EatRice接口: xm.eatFood(); } } - + 测试结果: @@ -433,10 +406,11 @@ EatRice接口: public interface CallBack { void tellAnswer(int res); } - - + + +​ 数学老师类 - +​ //老师类实例化回调接口,即学生写完题目之后通过老师的提供的方法进行回调。 //那么学生如何调用到老师的方法呢,只要在学生类的方法中传入老师的引用即可。 //而老师需要指定学生答题,所以也要传入学生的实例。 @@ -470,7 +444,7 @@ EatRice接口: System.out.println("the answer is " + res); } } - + 学生接口 //学生的接口,解决问题的方法中要传入老师的引用,否则无法完成对具体实例的回调。 @@ -496,7 +470,7 @@ EatRice接口: e.printStackTrace(); } } - + 测试类 public class Test { @@ -513,7 +487,7 @@ EatRice接口: // the answer is 111 } } - + ## 参考文章 @@ -522,22 +496,4 @@ https://blog.csdn.net/fengye454545/article/details/80198446 https://blog.csdn.net/xiaanming/article/details/8703708/ https://www.cnblogs.com/prayjourney/p/9667835.html https://blog.csdn.net/qq_25652949/article/details/86572948 -https://my.oschina.net/u/3703858/blog/1798627 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) +https://my.oschina.net/u/3703858/blog/1798627 \ No newline at end of file diff --git "a/docs/java/basic/12\343\200\201\345\217\215\345\260\204.md" "b/docs/java/basic/12\343\200\201\345\217\215\345\260\204.md" index 0513f67..88c5938 100644 --- "a/docs/java/basic/12\343\200\201\345\217\215\345\260\204.md" +++ "b/docs/java/basic/12\343\200\201\345\217\215\345\260\204.md" @@ -22,36 +22,8 @@ * [Java反射机制的作用](#java反射机制的作用) * [如何使用Java的反射?](#如何使用java的反射) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) ---- -title: 夯实Java基础系列12:深入理解Java中的反射机制 -date: 2019-9-12 15:56:26 # 文章生成时间,一般不改 -categories: - - Java技术江湖 - - Java基础 -tags: - - Java反射 ---- - - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - + ## 回顾:什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性。 @@ -562,10 +534,10 @@ getFileds和getDeclaredFields用法同上(参照Method) ### 哪里用到反射机制? -JDBC中,利用反射动态加载了数据库驱动程序。 -Web服务器中利用反射调用了Sevlet的服务方法。 -Eclispe等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。 -很多框架都用到反射机制,注入属性,调用方法,如Spring。 +JDBC 中,利用反射动态加载了数据库驱动程序。 +Web 服务器中利用反射调用了 Servlet 的服务方法。 +Eclispe 等开发工具利用反射动态刨析对象的类型与结构,动态提示对象的属性和方法。 +Spring 等框架都用到反射机制,注入属性,调用方法。 ### 什么叫对象序列化,什么是反序列化,实现对象序列化需要做哪些工作? @@ -637,20 +609,4 @@ https://blog.csdn.net/grandgrandpa/article/details/84832343 http://blog.csdn.net/lylwo317/article/details/52163304 https://blog.csdn.net/qq_37875585/article/details/89340495 -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/basic/13\343\200\201\346\263\233\345\236\213.md" "b/docs/java/basic/13\343\200\201\346\263\233\345\236\213.md" index 2251e75..45ee68c 100644 --- "a/docs/java/basic/13\343\200\201\346\263\233\345\236\213.md" +++ "b/docs/java/basic/13\343\200\201\346\263\233\345\236\213.md" @@ -15,24 +15,8 @@ * [泛型上下边界](#泛型上下边界) * [泛型常见面试题](#泛型常见面试题) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - + ## 泛型概述 @@ -608,24 +592,3 @@ https://www.cnblogs.com/jpfss/p/9929045.html https://www.cnblogs.com/dengchengchao/p/9717097.html https://www.cnblogs.com/cat520/p/9353291.html https://www.cnblogs.com/coprince/p/8603492.html - - - - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/basic/14\343\200\201\346\236\232\344\270\276\347\261\273.md" "b/docs/java/basic/14\343\200\201\346\236\232\344\270\276\347\261\273.md" index 2891f98..8fa94d6 100644 --- "a/docs/java/basic/14\343\200\201\346\236\232\344\270\276\347\261\273.md" +++ "b/docs/java/basic/14\343\200\201\346\236\232\344\270\276\347\261\273.md" @@ -20,28 +20,8 @@ * [枚举 API](#枚举-api) * [总结](#总结) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) ---- -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - - -枚举(enum)类型是Java 5新增的特性,它是一种新的类型,允许用常量来表示特定的数据片断,而且全部都以类型安全的形式来表示。 + ## 初探枚举类 @@ -507,20 +487,4 @@ https://segmentfault.com/a/1190000012220863 https://my.oschina.net/wuxinshui/blog/1511484 https://blog.csdn.net/hukailee/article/details/81107412 -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) diff --git "a/docs/java/basic/15\343\200\201Java\346\263\250\350\247\243\345\222\214\346\234\200\344\275\263\345\256\236\350\267\265.md" "b/docs/java/basic/15\343\200\201Java\346\263\250\350\247\243\345\222\214\346\234\200\344\275\263\345\256\236\350\267\265.md" index ab4a401..2c67609 100644 --- "a/docs/java/basic/15\343\200\201Java\346\263\250\350\247\243\345\222\214\346\234\200\344\275\263\345\256\236\350\267\265.md" +++ "b/docs/java/basic/15\343\200\201Java\346\263\250\350\247\243\345\222\214\346\234\200\344\275\263\345\256\236\350\267\265.md" @@ -1,5 +1,6 @@ # 目录 * [Java注解简介](#java注解简介) + * [注解如同标签](#注解如同标签) * [Java 注解概述](#java-注解概述) * [什么是注解?](#什么是注解?) @@ -22,36 +23,8 @@ * [什么是元注解?](#什么是元注解?) * [下面的代码会编译吗?](#下面的代码会编译吗?) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) - - ---- -title: 夯实Java基础系列15:Java注解简介和最佳实践 -date: 2019-9-15 15:56:26 # 文章生成时间,一般不改 -categories: - - Java技术江湖 - - Java基础 -tags: - - annotation - - Java注解 ---- - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - + ## Java注解简介 @@ -666,22 +639,4 @@ https://blog.fundodoo.com/2018/04/19/130.html https://blog.csdn.net/qq_37939251/article/details/83215703 https://blog.51cto.com/4247649/2109129 https://www.jianshu.com/p/2f2460e6f8e7 -https://blog.csdn.net/yuzongtao/article/details/83306182 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) +https://blog.csdn.net/yuzongtao/article/details/83306182 \ No newline at end of file diff --git "a/docs/java/basic/16\343\200\201JavaIO\346\265\201.md" "b/docs/java/basic/16\343\200\201JavaIO\346\265\201.md" index a405b7f..76d1301 100644 --- "a/docs/java/basic/16\343\200\201JavaIO\346\265\201.md" +++ "b/docs/java/basic/16\343\200\201JavaIO\346\265\201.md" @@ -21,40 +21,8 @@ * [说说File类](#说说file类) * [说说RandomAccessFile?](#说说randomaccessfile) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) ---- -title: 夯实Java基础系列16:一文读懂Java IO流和常见面试题 -date: 2019-9-16 15:56:26 # 文章生成时间,一般不改 -categories: - - Java技术江湖 - - Java基础 -tags: - - Java IO流 ---- - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - - - -本文参考 - -并发编程网 – ifeve.com + ## IO概述 > 在这一小节,我会试着给出Java IO(java.io)包下所有类的概述。更具体地说,我会根据类的用途对类进行分组。这个分组将会使你在未来的工作中,进行类的用途判定时,或者是为某个特定用途选择类时变得更加容易。 @@ -457,22 +425,4 @@ Filter Stream是一种IO流主要作用是用来对存在的流增加一些额 https://www.imooc.com/article/24305 https://www.cnblogs.com/UncleWang001/articles/10454685.html https://www.cnblogs.com/Jixiangwei/p/Java.html -https://blog.csdn.net/baidu_37107022/article/details/76890019 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) +https://blog.csdn.net/baidu_37107022/article/details/76890019 \ No newline at end of file diff --git "a/docs/java/basic/17\343\200\201\345\244\232\347\272\277\347\250\213.md" "b/docs/java/basic/17\343\200\201\345\244\232\347\272\277\347\250\213.md" index e2cc758..13ccee6 100644 --- "a/docs/java/basic/17\343\200\201\345\244\232\347\272\277\347\250\213.md" +++ "b/docs/java/basic/17\343\200\201\345\244\232\347\272\277\347\250\213.md" @@ -1,6 +1,7 @@ # 目录 * [Java中的线程](#java中的线程) * [Java线程状态机](#java线程状态机) + * [一个线程的生命周期](#一个线程的生命周期) * [Java多线程实战](#java多线程实战) * [多线程的实现](#多线程的实现) @@ -16,37 +17,8 @@ * [Java多线程优先级](#java多线程优先级) * [Java多线程面试题](#java多线程面试题) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) ---- -title: 夯实Java基础系列17:一文搞懂Java多线程使用方式、实现原理以及常见面试题 -date: 2019-9-17 15:56:26 # 文章生成时间,一般不改 -categories: - - Java技术江湖 - - Java基础 -tags: - - 多线程 ---- - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - - - + ## Java中的线程 Java之父对线程的定义是: @@ -67,7 +39,7 @@ Java之父对线程的定义是:   多线程是指在同一程序中有多个顺序流在执行。 在java中要想实现多线程,有两种手段,一种是继续Thread类,另外一种是实现Runable接口.(其实准确来讲,应该有三种,还有一种是实现Callable接口,并与Future、线程池结合使用 - + ## Java线程状态机 @@ -237,7 +209,7 @@ Java 给多线程编程提供了内置的支持。 一条线程指的是进程 System.out.println(name + "run"); } } - + //测试join,父线程在子线程运行时进入waiting状态 @Test public void test1() throws InterruptedException { @@ -259,9 +231,9 @@ Java 给多线程编程提供了内置的支持。 一条线程指的是进程 //调用start,线程进入runnable状态,等待系统调度 dad.start(); //在父线程中对子线程实例使用join,保证子线程在父线程之前执行完 - + } - + //测试sleep @Test public void test2(){ @@ -276,7 +248,7 @@ Java 给多线程编程提供了内置的支持。 一条线程指的是进程 } } }); - + //主线程休眠。进入time waiting状态 try { Thread.sleep(3000); @@ -284,15 +256,15 @@ Java 给多线程编程提供了内置的支持。 一条线程指的是进程 e.printStackTrace(); } t1.start(); - + } - + //线程2进入blocked状态。 public static void main(String[] args) { test4(); Thread.yield();//进入runnable状态 } - + //测试blocked状态 public static void test4() { class A { @@ -318,9 +290,9 @@ Java 给多线程编程提供了内置的支持。 一条线程指的是进程 a.run(); } }).start(); - + } - + //volatile保证线程可见性 volatile static int flag = 1; //object作为锁对象,用于线程使用wait和notify方法 @@ -377,7 +349,7 @@ Java 给多线程编程提供了内置的支持。 一条线程指的是进程 } }).start(); } - + //输出结果是 // thread1 run // notify t2 @@ -388,7 +360,7 @@ Java 给多线程编程提供了内置的支持。 一条线程指的是进程 // thread1 run // notify t2 //不断循环 - + } ## Java Thread常用方法 @@ -429,9 +401,10 @@ A线程调用B线程的join()方法,将会使A等待B执行,直到B线程终 一个作为线程标识名的String字符串,该标识在跟踪和调试过程中会非常有用,除此别无它用。 线程组(ThreadGroup),用来放置新创建的线程,如果提供的ThreadGroup不允许被访问,那么就会抛出一个SecurityException 。 - + - + + Thread对象拥有一个守护(daemon)标识属性,这个属性无法在构造方法中被赋值,但是可以在线程启动之前设置该属性(通过setDaemon方法)。 当程序中所有的非守护线程都已经终止,调用setDaemon方法可能会导致虚拟机粗暴的终止线程并退出。 @@ -439,7 +412,7 @@ A线程调用B线程的join()方法,将会使A等待B执行,直到B线程终 isDaemon方法能够返回该属性的值。守护状态的作用非常有限,即使是后台线程在程序退出的时候也经常需要做一些清理工作。 (daemon的发音为”day-mon”,这是系统编程传统的遗留,系统守护进程是一个持续运行的进程,比如打印机队列管理,它总是在系统中运行。) - + ## 启动线程的方式和isAlive方法 启动线程 @@ -641,22 +614,3 @@ https://www.runoob.com/java/java-multithreading.html https://blog.csdn.net/qq_38038480/article/details/80584715 https://blog.csdn.net/tongxuexie/article/details/80145663 https://www.cnblogs.com/snow-flower/p/6114765.html - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - diff --git "a/docs/java/basic/19\343\200\201Java\351\233\206\345\220\210\346\241\206\346\236\266\346\242\263\347\220\206.md" "b/docs/java/basic/19\343\200\201Java\351\233\206\345\220\210\346\241\206\346\236\266\346\242\263\347\220\206.md" index 8ad5827..e770e51 100644 --- "a/docs/java/basic/19\343\200\201Java\351\233\206\345\220\210\346\241\206\346\236\266\346\242\263\347\220\206.md" +++ "b/docs/java/basic/19\343\200\201Java\351\233\206\345\220\210\346\241\206\346\236\266\346\242\263\347\220\206.md" @@ -26,37 +26,8 @@ * [线程安全的阻塞队列](#线程安全的阻塞队列) * [同步队列](#同步队列) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) ---- -title: 夯实Java基础系列19:一文搞懂Java集合类框架,以及常见面试题 -date: 2019-9-19 15:56:26 # 文章生成时间,一般不改 -categories: - - Java技术江湖 - - Java基础 -tags: - - Java集合类 ---- - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - - -本文参考 https://www.cnblogs.com/chenssy/p/3495238.html + ## 集合类大图 在编写java程序中,我们最常用的除了八种基本数据类型,String对象外还有一个集合类,在我们的的程序中到处充斥着集合类的身影! @@ -554,7 +525,7 @@ Apache Commons 有个TreeNodeList,里面是棵二叉树,可以快速移动 JDK的做法是链表法,Entry用一个next属性实现多个Entry以单向链表存放。查找哈希值为17的key时,先定位到哈希桶,然后链表遍历桶里所有元素,逐个比较其Hash值然后key值。 -在JDK8里,新增默认为8的阈值,当一个桶里的Entry超过閥值,就不以单向链表而以红黑树来存放以加快Key的查找速度。 +在JDK8里,新增默认为8的阈值,当一个桶里的Entry超过阈值,就不以单向链表而以红黑树来存放以加快Key的查找速度。 当然,最好还是桶里只有一个元素,不用去比较。所以默认当Entry数量达到桶数量的75%时,哈希冲突已比较严重,就会成倍扩容桶数组,并重新分配所有原来的Entry。扩容成本不低,所以也最好有个预估值。 @@ -710,22 +681,4 @@ https://blog.csdn.net/zzw1531439090/article/details/87872424 https://blog.csdn.net/weixin_40374341/article/details/86496343 https://www.cnblogs.com/uodut/p/7067162.html https://www.jb51.net/article/135672.htm -https://www.cnblogs.com/suiyue-/p/6052456.html - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) +https://www.cnblogs.com/suiyue-/p/6052456.html \ No newline at end of file diff --git "a/docs/java/basic/1\343\200\201\351\235\242\345\220\221\345\257\271\350\261\241\345\237\272\347\241\200.md" "b/docs/java/basic/1\343\200\201\351\235\242\345\220\221\345\257\271\350\261\241\345\237\272\347\241\200.md" index 2cdc78e..21bf358 100644 --- "a/docs/java/basic/1\343\200\201\351\235\242\345\220\221\345\257\271\350\261\241\345\237\272\347\241\200.md" +++ "b/docs/java/basic/1\343\200\201\351\235\242\345\220\221\345\257\271\350\261\241\345\237\272\347\241\200.md" @@ -28,25 +28,8 @@ * [B、方法多态](#b、方法多态) * [C、引用类型转换](#c、引用类型转换) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) - - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - + + # Java面向对象三大特性(基础篇) @@ -74,11 +57,11 @@ Java 是面向对象的编程语言,对象就是面向对象程序设计的核   面向过程最大的问题在于随着系统的膨胀,面向过程将无法应付,最终导致系统的崩溃。为了解决这一种软件危机,我们提出面向对象思想。 - 面向过程的缺陷: -   是采用指定而下的设计模式,在设计阶段就需要考虑每一个模块应该分解成哪些子模块,每一个子模块又细分为更小的子模块,如此类推,直到将模块细化为一个个函数。 +   是采用指顶而下的设计模式,在设计阶段就需要考虑每一个模块应该分解成哪些子模块,每一个子模块又细分为更小的子模块,如此类推,直到将模块细化为一个个函数。 - 存在的问题 - ​ 设计不够直观,与人类的思维习惯不一致 + 设计不够直观,与人类的思维习惯不一致 系统软件适应新差,可拓展性差,维护性低 - 面向对象: @@ -89,7 +72,6 @@ Java 是面向对象的编程语言,对象就是面向对象程序设计的核   在软件工程上,面向对象可以使工程更加模块化,实现更低的耦合和更高的内聚。 - ## 面向对象的三大核心特性简介 面向对象开发模式更有利于人们开拓思维,在具体的开发过程中便于程序的划分,方便程序员分工合作,提高开发效率。 @@ -148,7 +130,7 @@ Java 是面向对象的编程语言,对象就是面向对象程序设计的核 封装最主要的功能在于我们能修改自己的实现代码,而不用修改那些调用我们代码的程序片段。 -适当的封装可以让程式码更容易理解与维护,也加强了程式码的安全性。 +适当的封装可以让程序代码更容易理解与维护,也加强了程序代码的安全性。 ## 面向对象编程三大特性详解 diff --git "a/docs/java/basic/21\343\200\201Java8\346\226\260\347\211\271\346\200\247\347\273\210\346\236\201\346\214\207\345\215\227.md" "b/docs/java/basic/21\343\200\201Java8\346\226\260\347\211\271\346\200\247\347\273\210\346\236\201\346\214\207\345\215\227.md" index 14b4137..3422179 100644 --- "a/docs/java/basic/21\343\200\201Java8\346\226\260\347\211\271\346\200\247\347\273\210\346\236\201\346\214\207\345\215\227.md" +++ "b/docs/java/basic/21\343\200\201Java8\346\226\260\347\211\271\346\200\247\347\273\210\346\236\201\346\214\207\345\215\227.md" @@ -5,45 +5,25 @@ * [方法引用](#方法引用) * [接口的默认方法](#接口的默认方法) * [重复注解](#重复注解) + * [Java编译器的新特性](#java编译器的新特性) + * [方法参数名字可以反射获取](#方法参数名字可以反射获取) + * [Java 类库的新特性](#java-类库的新特性) * [Optional](#optional) * [Stream](#stream) * [Date/Time API (JSR 310)](#datetime-api-jsr-310) * [并行(parallel)数组](#并行(parallel)数组) * [CompletableFuture](#completablefuture) + * [Java虚拟机(JVM)的新特性](#java虚拟机(jvm)的新特性) - * [总结](#总结) - * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) ---- -title: 夯实Java基础系列21:Java8新特性终极指南 -date: 2019-9-21 15:56:26 # 文章生成时间,一般不改 -categories: - - Java技术江湖 - - Java基础 -tags: - - Java8 ---- -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 + * [总结](#总结) + * [参考文章](#参考文章) - + 这是一个Java8新增特性的总结图。接下来让我们一次实践一下这些新特性吧 @@ -822,22 +802,4 @@ https://blog.csdn.net/shuaicihai/article/details/72615495 https://blog.csdn.net/qq_34908167/article/details/79286697 https://www.jianshu.com/p/4df02599aeb2 https://www.cnblogs.com/yangzhilong/p/10973006.html -https://www.cnblogs.com/JackpotHan/p/9701147.html - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) +https://www.cnblogs.com/JackpotHan/p/9701147.html \ No newline at end of file diff --git "a/docs/java/basic/22\343\200\201\345\272\217\345\210\227\345\214\226\345\222\214\345\217\215\345\272\217\345\210\227\345\214\226.md" "b/docs/java/basic/22\343\200\201\345\272\217\345\210\227\345\214\226\345\222\214\345\217\215\345\272\217\345\210\227\345\214\226.md" index 6de5ffb..35399b5 100644 --- "a/docs/java/basic/22\343\200\201\345\272\217\345\210\227\345\214\226\345\222\214\345\217\215\345\272\217\345\210\227\345\214\226.md" +++ "b/docs/java/basic/22\343\200\201\345\272\217\345\210\227\345\214\226\345\222\214\345\217\215\345\272\217\345\210\227\345\214\226.md" @@ -3,39 +3,15 @@ * [Java对象的序列化与反序列化](#java对象的序列化与反序列化) * [相关接口及类](#相关接口及类) * [序列化ID](#序列化id) + * [静态变量不参与序列化](#静态变量不参与序列化) * [探究ArrayList的序列化](#探究arraylist的序列化) * [如何自定义的序列化和反序列化策略](#如何自定义的序列化和反序列化策略) * [为什么要实现Serializable](#为什么要实现serializable) * [序列化知识点总结](#序列化知识点总结) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) ---- -title: 夯实Java基础系列22:一文读懂Java序列化和反序列化 -date: 2019-9-22 15:56:26 # 文章生成时间,一般不改 -categories: - - Java技术江湖 - - Java基础 -tags: - - Java序列化 ---- - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - + 本文参考 http://www.importnew.com/17964.html和 @@ -93,37 +69,37 @@ Java为了方便开发人员将Java对象进行序列化及反序列化提供了 ​ ​ public static void main(String[] args) { ​ - } - //注意,内部类不能进行序列化,因为它依赖于外部类 - @Test - public void test() throws IOException { - A a = new A(); - a.i = 1; - a.s = "a"; - FileOutputStream fileOutputStream = null; - FileInputStream fileInputStream = null; - try { - //将obj写入文件 - fileOutputStream = new FileOutputStream("temp"); - ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); - objectOutputStream.writeObject(a); - fileOutputStream.close(); - //通过文件读取obj - fileInputStream = new FileInputStream("temp"); - ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); - A a2 = (A) objectInputStream.readObject(); - fileInputStream.close(); - System.out.println(a2.i); - System.out.println(a2.s); - //打印结果和序列化之前相同 - } catch (IOException e) { - e.printStackTrace(); - } catch (ClassNotFoundException e) { - e.printStackTrace(); - } - } - } - +​ } +​ //注意,内部类不能进行序列化,因为它依赖于外部类 +​ @Test +​ public void test() throws IOException { +​ A a = new A(); +​ a.i = 1; +​ a.s = "a"; +​ FileOutputStream fileOutputStream = null; +​ FileInputStream fileInputStream = null; +​ try { +​ //将obj写入文件 +​ fileOutputStream = new FileOutputStream("temp"); +​ ObjectOutputStream objectOutputStream = new ObjectOutputStream(fileOutputStream); +​ objectOutputStream.writeObject(a); +​ fileOutputStream.close(); +​ //通过文件读取obj +​ fileInputStream = new FileInputStream("temp"); +​ ObjectInputStream objectInputStream = new ObjectInputStream(fileInputStream); +​ A a2 = (A) objectInputStream.readObject(); +​ fileInputStream.close(); +​ System.out.println(a2.i); +​ System.out.println(a2.s); +​ //打印结果和序列化之前相同 +​ } catch (IOException e) { +​ e.printStackTrace(); +​ } catch (ClassNotFoundException e) { +​ e.printStackTrace(); +​ } +​ } +​ } +​ class A implements Serializable { int i; @@ -407,9 +383,9 @@ ArrayList的序列化 ​ int expectedModCount = modCount; ​ s.defaultWriteObject(); ​ - // Write out size as capacity for behavioural compatibility with clone() - s.writeInt(size); - +​ // Write out size as capacity for behavioural compatibility with clone() +​ s.writeInt(size); +​ // Write out all elements in the proper order. for (int i=0; i https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - + ## 从JVM结构开始谈多态 Java 对于方法调用动态绑定的实现主要依赖于方法表,但通过类引用调用和接口引用调用的实现则有所不同。总体而言,当某个方法被调用时,JVM 首先要查找相应的常量池,得到方法的符号引用,并查找调用类的方法表以确定该方法的直接引用,最后才真正调用该方法。以下分别对该过程中涉及到的相关部分做详细介绍。 @@ -502,8 +474,8 @@ Father do something overrideTest.doSomething(); } } - -​ + + 最后会打印: Father do something @@ -524,21 +496,4 @@ https://blog.csdn.net/chenssy/article/details/12757911 https://blog.csdn.net/fan2012huan/article/details/51007517 https://blog.csdn.net/fan2012huan/article/details/50999777 https://www.cnblogs.com/serendipity-fly/p/9469289.html -https://blog.csdn.net/m0_37264516/article/details/86709537 -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) +https://blog.csdn.net/m0_37264516/article/details/86709537 \ No newline at end of file diff --git "a/docs/java/basic/2\343\200\201Java\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md" "b/docs/java/basic/2\343\200\201Java\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md" index 3e0913a..a89be58 100644 --- "a/docs/java/basic/2\343\200\201Java\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md" +++ "b/docs/java/basic/2\343\200\201Java\345\237\272\346\234\254\346\225\260\346\215\256\347\261\273\345\236\213.md" @@ -15,29 +15,8 @@ * [存在栈中](#存在栈中) * [存在堆里](#存在堆里) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) - - - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - - - + + # Java 基本数据类型 diff --git "a/docs/java/basic/3\343\200\201string\345\222\214\345\214\205\350\243\205\347\261\273.md" "b/docs/java/basic/3\343\200\201string\345\222\214\345\214\205\350\243\205\347\261\273.md" index 7779f4a..f2b94a1 100644 --- "a/docs/java/basic/3\343\200\201string\345\222\214\345\214\205\350\243\205\347\261\273.md" +++ "b/docs/java/basic/3\343\200\201string\345\222\214\345\214\205\350\243\205\347\261\273.md" @@ -24,31 +24,12 @@ * [system.arraycopy方法](#systemarraycopy方法) * [String和JVM的关系](#string和jvm的关系) * [String为什么不可变?](#string为什么不可变?) + * [不可变有什么好处?](#不可变有什么好处?) * [String常用工具类](#string常用工具类) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) - - - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - + ## string基础 @@ -403,11 +384,7 @@ Java栈(线程私有数据区): Java堆(线程共享数据区): -``` - 在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配。 -``` - - +> 在虚拟机启动时创建,此内存区域的唯一目的就是存放对象实例,几乎所有的对象实例都在这里分配([Java 逃逸分析](https://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&mid=2247489776&idx=1&sn=74a93cea618aec7ff5af173f9b6a0626&chksm=eb539dc6dc2414d09a6277579edda97648ab42cce2da846746d7d85f65a3a250b412eb4a6d8b&scene=21#wechat_redirect))。 方法区(线程共享数据区): diff --git "a/docs/java/basic/5\343\200\201Java\347\261\273\345\222\214\345\214\205.md" "b/docs/java/basic/5\343\200\201Java\347\261\273\345\222\214\345\214\205.md" index 4084792..93319c4 100644 --- "a/docs/java/basic/5\343\200\201Java\347\261\273\345\222\214\345\214\205.md" +++ "b/docs/java/basic/5\343\200\201Java\347\261\273\345\222\214\345\214\205.md" @@ -15,30 +15,8 @@ * [外部类的访问权限](#外部类的访问权限) * [Java包的命名规则](#java包的命名规则) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) ---- - - Java类 ---- - - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - + ## Java中的包概念 @@ -442,22 +420,4 @@ https://www.cnblogs.com/ryanzheng/p/8465701.html https://blog.csdn.net/fuhanghang/article/details/84102404 https://www.runoob.com/java/java-package.html https://www.breakyizhan.com/java/4260.html -https://blog.csdn.net/qq_36626914/article/details/80627454 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) +https://blog.csdn.net/qq_36626914/article/details/80627454 \ No newline at end of file diff --git "a/docs/java/basic/6\343\200\201\346\212\275\350\261\241\347\261\273\345\222\214\346\216\245\345\217\243.md" "b/docs/java/basic/6\343\200\201\346\212\275\350\261\241\347\261\273\345\222\214\346\216\245\345\217\243.md" index e3bd41a..adc3bce 100644 --- "a/docs/java/basic/6\343\200\201\346\212\275\350\261\241\347\261\273\345\222\214\346\216\245\345\217\243.md" +++ "b/docs/java/basic/6\343\200\201\346\212\275\350\261\241\347\261\273\345\222\214\346\216\245\345\217\243.md" @@ -15,26 +15,8 @@ * [设计思想区别](#设计思想区别) * [如何回答面试题:接口和抽象类的区别?](#如何回答面试题:接口和抽象类的区别) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - - + ## 抽象类介绍 @@ -215,6 +197,7 @@ * 接口中每一个方法也是隐式抽象的,接口中的方法会被隐式的指定为 **public abstract**(只能是 public abstract,其他修饰符都会报错)。 * 接口中可以含有变量,但是接口中的变量会被隐式的指定为 **public static final** 变量(并且只能是 public,用 private 修饰会报编译错误)。 * 接口中的方法是不能在接口中实现的,只能由实现接口的类来实现接口中的方法。 +* JDK8中,接口中的方法可以被default和static修饰,但是被修饰的方法必须有方法体。 ### 抽象类和接口的区别 @@ -715,23 +698,4 @@ https://blog.csdn.net/zhangquan2015/article/details/82808399 https://blog.csdn.net/qq_38741971/article/details/80099567 https://www.runoob.com/java/java-interfaces.html https://blog.csdn.net/fengyunjh/article/details/6605085 -https://blog.csdn.net/xkfanhua/article/details/80567557 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - +https://blog.csdn.net/xkfanhua/article/details/80567557 \ No newline at end of file diff --git "a/docs/java/basic/7\343\200\201\344\273\243\347\240\201\345\235\227\345\222\214\344\273\243\347\240\201\346\211\247\350\241\214\351\241\272\345\272\217.md" "b/docs/java/basic/7\343\200\201\344\273\243\347\240\201\345\235\227\345\222\214\344\273\243\347\240\201\346\211\247\350\241\214\351\241\272\345\272\217.md" index 09dc5b5..81c2c95 100644 --- "a/docs/java/basic/7\343\200\201\344\273\243\347\240\201\345\235\227\345\222\214\344\273\243\347\240\201\346\211\247\350\241\214\351\241\272\345\272\217.md" +++ "b/docs/java/basic/7\343\200\201\344\273\243\347\240\201\345\235\227\345\222\214\344\273\243\347\240\201\346\211\247\350\241\214\351\241\272\345\272\217.md" @@ -17,25 +17,8 @@ * [静态代码块](#静态代码块) * [Java代码块、构造方法(包含继承关系)的执行顺序](#java代码块、构造方法(包含继承关系)的执行顺序) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - + ## Java中的构造方法 ### 构造方法简介 @@ -463,7 +446,7 @@ C类: 执行顺序依次为: 父类的静态成员和代码块 子类静态成员和代码块 - 父类成员初始化和代码快 + 父类成员初始化和代码块 父类构造方法 子类成员初始化和代码块 子类构造方法 @@ -533,22 +516,4 @@ https://www.jianshu.com/p/49e45af288ea https://blog.csdn.net/du_du1/article/details/91383128 http://c.biancheng.net/view/976.html https://blog.csdn.net/evilcry2012/article/details/79499786 -https://www.jb51.net/article/129990.htm - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) +https://www.jb51.net/article/129990.htm \ No newline at end of file diff --git "a/docs/java/basic/8\343\200\201Java\350\207\252\345\212\250\346\213\206\347\256\261\350\243\205\347\256\261\351\207\214\351\232\220\350\227\217\347\232\204\347\247\230\345\257\206.md" "b/docs/java/basic/8\343\200\201Java\350\207\252\345\212\250\346\213\206\347\256\261\350\243\205\347\256\261\351\207\214\351\232\220\350\227\217\347\232\204\347\247\230\345\257\206.md" index d72737a..1709b29 100644 --- "a/docs/java/basic/8\343\200\201Java\350\207\252\345\212\250\346\213\206\347\256\261\350\243\205\347\256\261\351\207\214\351\232\220\350\227\217\347\232\204\347\247\230\345\257\206.md" +++ "b/docs/java/basic/8\343\200\201Java\350\207\252\345\212\250\346\213\206\347\256\261\350\243\205\347\256\261\351\207\214\351\232\220\350\227\217\347\232\204\347\247\230\345\257\206.md" @@ -14,29 +14,7 @@ * [存在栈中:](#存在栈中:) * [存在堆里](#存在堆里) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) - - - - Java基本数据类型 ---- - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - + * # Java 基本数据类型 @@ -261,6 +239,7 @@ class Auto//code2 + Double localDouble = Double.valueOf(12.4D); double d = localDouble.doubleValue(); } diff --git "a/docs/java/basic/9\343\200\201Java\344\270\255\347\232\204Class\347\261\273\345\222\214Object\347\261\273.md" "b/docs/java/basic/9\343\200\201Java\344\270\255\347\232\204Class\347\261\273\345\222\214Object\347\261\273.md" index 4caf35a..5e61637 100644 --- "a/docs/java/basic/9\343\200\201Java\344\270\255\347\232\204Class\347\261\273\345\222\214Object\347\261\273.md" +++ "b/docs/java/basic/9\343\200\201Java\344\270\255\347\232\204Class\347\261\273\345\222\214Object\347\261\273.md" @@ -16,25 +16,8 @@ * [finalize()方法](#finalize方法) * [CLass类和Object类的关系](#class类和object类的关系) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章首发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《夯实Java基础系列博文》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 -该系列博文会告诉你如何从入门到进阶,一步步地学习Java基础知识,并上手进行实战,接着了解每个Java知识点背后的实现原理,更完整地了解整个Java技术体系,形成自己的知识框架。为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - + ## Java中Class类及用法 Java程序在运行时,Java运行时系统一直对所有的对象进行所谓的运行时类型标识,即所谓的RTTI。 @@ -311,6 +294,7 @@ private static native void registerNatives(); + > 看,clode()方法又是一个被声明为native的方法,因此,我们知道了clone()方法并不是Java的原生方法,具体的实现是有C/C++完成的。clone英文翻译为"克隆",其目的是创建并返回此对象的一个副本。 > 形象点理解,这有一辆科鲁兹,你看着不错,想要个一模一样的。你调用此方法即可像变魔术一样变出一辆一模一样的科鲁兹出来。配置一样,长相一样。但从此刻起,原来的那辆科鲁兹如果进行了新的装饰,与你克隆出来的这辆科鲁兹没有任何关系了。 @@ -340,6 +324,7 @@ private static native void registerNatives(); + > 例子很简单,在main()方法中,new一个Oject对象后,想直接调用此对象的clone方法克隆一个对象,但是出现错误提示:"The method clone() from the type Object is not visible" > > why? 根据提示,第一反应是ObjectTest类中定义的Oject对象无法访问其clone()方法。回到Object类中clone()方法的定义,可以看到其被声明为protected,估计问题就在这上面了,protected修饰的属性或方法表示:在同一个包内或者不同包的子类可以访问。 @@ -369,6 +354,7 @@ private static native void registerNatives(); + 是的,因为此时的主调已经是子类的引用了。 > 上述代码在运行过程中会抛出"java.lang.CloneNotSupportedException",表明clone()方法并未正确执行完毕,问题的原因在与Java中的语法规定: @@ -493,6 +479,7 @@ clone方法实现的是浅拷贝,只拷贝当前对象,并且在堆中分配 + > 由此可见,Object原生的equals()方法内部调用的正是==,与==具有相同的含义。既然如此,为什么还要定义此equals()方法? > > equals()方法的正确理解应该是:判断两个对象是否相等。那么判断对象相等的标尺又是什么? @@ -560,6 +547,7 @@ hashCode()具有如下约定: + > toString()方法相信大家都经常用到,即使没有显式调用,但当我们使用System.out.println(obj)时,其内部也是通过toString()来实现的。 > > getClass()返回对象的类对象,getClassName()以String形式返回类对象的名称(含包名)。Integer.toHexString(hashCode())则是以对象的哈希码为实参,以16进制无符号整数形式返回此哈希码的字符串表示形式。 @@ -669,6 +657,7 @@ hashCode()具有如下约定: + > 且wait(long timeout, int nanos)方法定义内部实质上也是通过调用wait(long timeout)完成。而wait(long timeout)是一个native方法。因此,wait(...)方法本质上都是native方式实现。 notify()/notifyAll()方法也都是native方法。 @@ -686,6 +675,7 @@ finalize方法主要与Java垃圾回收机制有关。首先我们看一下final + > 我们发现Object类中finalize方法被定义成一个空方法,为什么要如此定义呢?finalize方法的调用时机是怎么样的呢? > > 首先,Object中定义finalize方法表明Java中每一个对象都将具有finalize这种行为,其具体调用时机在:JVM准备对此对形象所占用的内存空间进行垃圾回收前,将被调用。由此可以看出,此方法并不是由我们主动去调用的(虽然可以主动去调用,此时与其他自定义方法无异)。 @@ -725,23 +715,4 @@ https://www.cnblogs.com/congsg2016/p/5317362.html https://www.jb51.net/article/125936.htm https://blog.csdn.net/dufufd/article/details/80537638 https://blog.csdn.net/farsight1/article/details/80664104 -https://blog.csdn.net/xiaomingdetianxia/article/details/77429180 - -## 微信公众号 - -### Java技术江湖 - -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号【Java技术江湖】一位阿里 Java 工程师的技术小站,作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! - -**Java工程师必备学习资源:** 一些Java工程师常用学习资源,关注公众号后,后台回复关键字 **“Java”** 即可免费无套路获取。 - -![我的公众号](https://img-blog.csdnimg.cn/20190805090108984.jpg) - -### 个人公众号:黄小斜 - -作者是 985 硕士,蚂蚁金服 JAVA 工程师,专注于 JAVA 后端技术栈:SpringBoot、MySQL、分布式、中间件、微服务,同时也懂点投资理财,偶尔讲点算法和计算机理论基础,坚持学习和写作,相信终身学习的力量! - -**程序员3T技术学习资源:** 一些程序员学习技术的资源大礼包,关注公众号后,后台回复关键字 **“资料”** 即可免费无套路获取。 - -![](https://img-blog.csdnimg.cn/20190829222750556.jpg) - +https://blog.csdn.net/xiaomingdetianxia/article/details/77429180 \ No newline at end of file diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\347\261\273\346\200\273\347\273\223.md" "b/docs/java/collection/Java\351\233\206\345\220\210\347\261\273\346\200\273\347\273\223.md" index fe16e96..30fb6ce 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\347\261\273\346\200\273\347\273\223.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\347\261\273\346\200\273\347\273\223.md" @@ -9,38 +9,8 @@ * [collections和Arrays工具类](#collections和arrays工具类) * [comparable和comparator](#comparable和comparator) * [treemap和treeset](#treemap和treeset) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) - - ---- -title: Java集合框架学习总结 -date: 2018-07-08 22:03:44 -tags: - - Java集合 -categories: - - 后端 - - 技术总结 ---- - - - -这篇总结是基于之前博客内容的一个整理和回顾。 - - - -这里先简单地总结一下,更多详细内容请参考我的专栏:深入浅出Java核心技术 - -https://blog.csdn.net/column/details/21930.html - -里面有包括Java集合类在内的众多Java核心技术系列文章。 - - -以下总结不保证全对,如有错误,还望能够指出。谢谢 - - + ## Colletion,iterator,comparable diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2434\357\274\232HashMap\345\222\214HashTable.md" "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2434\357\274\232HashMap\345\222\214HashTable.md" index bc0b904..1d90464 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2434\357\274\232HashMap\345\222\214HashTable.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2434\357\274\232HashMap\345\222\214HashTable.md" @@ -15,27 +15,8 @@ * [HashTable与HashMap的异同点](#hashtable与hashmap的异同点) * [面试题:HashMap和HashTable的区别](#面试题:hashmap和hashtable的区别) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) - -本文参考http://cmsblogs.com/?p=176 - - -《Java集合详解系列》是我在完成夯实Java基础篇的系列博客后准备开始整理的新系列文章。 -为了更好地诠释知识点,形成体系文章,本系列文章整理了很多优质的博客内容,如有侵权请联系我,一定删除。 - -这些文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star、fork哈 - -本系列文章将整理于我的个人博客: - -> www.how2playlife.com + ## HashMap diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2436\357\274\232TreeMap\345\222\214\347\272\242\351\273\221\346\240\221.md" "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2436\357\274\232TreeMap\345\222\214\347\272\242\351\273\221\346\240\221.md" index 2de2ef5..759ea7e 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2436\357\274\232TreeMap\345\222\214\347\272\242\351\273\221\346\240\221.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\350\257\246\350\247\2436\357\274\232TreeMap\345\222\214\347\272\242\351\273\221\346\240\221.md" @@ -11,25 +11,8 @@ * [删除节点](#删除节点) * [3.总结](#3总结) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) -本文参考多篇优质技术博客,参考文章请在文末查看 - -《Java集合详解系列》是我在完成夯实Java基础篇的系列博客后准备开始整理的新系列文章。 -为了更好地诠释知识点,形成体系文章,本系列文章整理了很多优质的博客内容,如有侵权请联系我,一定删除。 - -这些文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star、fork哈 - -本系列文章将整理于我的个人博客: - -> www.how2playlife.com + ## 什么是红黑树 @@ -131,9 +114,9 @@ ![](https://upload-images.jianshu.io/upload_images/4761309-be4bb2dee4bffd10.png?imageMogr2/auto-orient/strip|imageView2/2/w/870/format/webp) - +​ - +​ * Case 2:[先左旋变成Case1中的情况,再右旋,最后改变颜色(根节点必须为黑色,其两个子节点为红色,叔节点不用改变)],如下图所示,注意省略黑哨兵节点 @@ -144,7 +127,7 @@ ![](https://upload-images.jianshu.io/upload_images/4761309-7eed01cd63266976.png?imageMogr2/auto-orient/strip|imageView2/2/w/751/format/webp) - +​ * Case 3:[先左旋,最后改变颜色(根节点必须为黑色,其两个子节点为红色,叔节点不用改变)],如下图所示,注意省略黑哨兵节点 @@ -154,10 +137,10 @@ ![](https://upload-images.jianshu.io/upload_images/4761309-2885dd45740eb113.png?imageMogr2/auto-orient/strip|imageView2/2/w/831/format/webp) - +​ - +​ * Case 4:[先右旋变成Case 3的情况,再左旋,最后改变颜色(根节点必须为黑色,其两个子节点为红色,叔节点不用改变)],如下图所示,注意省略黑哨兵节点 @@ -167,10 +150,10 @@ ![](https://upload-images.jianshu.io/upload_images/4761309-db86cb65433a632e.png?imageMogr2/auto-orient/strip|imageView2/2/w/754/format/webp) - +​ - +​ 以上就是红黑树新增节点所有可能的操作,下面会介绍红黑树中的删除操作 @@ -242,7 +225,7 @@ ![](https://upload-images.jianshu.io/upload_images/4761309-75984ffc3773a040.png?imageMogr2/auto-orient/strip|imageView2/2/w/562/format/webp) - +​ diff --git "a/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\345\255\246\344\271\240\346\200\273\347\273\223.md" index d12d4bc..87920d3 100644 --- "a/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\345\255\246\344\271\240\346\200\273\347\273\223.md" +++ "b/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -73,6 +73,7 @@ categories: 路由器则工作在3层ip层,必须要有ip才能工作,所以路由器每一个接口都对应一个ip,维护一个可以识别ip的路由表,进行ip数据报转发。 ## 交换机 + 交换机具有自学习能力,学习的是交换表的内容。交换表中存储着 MAC 地址到接口的映射。 ## 以太网 @@ -323,8 +324,8 @@ https博大精深,首先先来看看他的基础知识 ​ ​ - 6 https过程 - +​ 6 https过程 +​ 用户发送请求,服务器返回一个数字证书。 用户在浏览器端生成一个随机数,使用证书中的公钥加密,发送给服务端。 @@ -387,8 +388,8 @@ TCP是传输层最重要的协议。 ​ - 三次握手 - +​ 三次握手 +​ 1 首先客户端发送连接请求syn,携带随机数x。 2 服务端返回请求ack,x + 1,说明服务端对x进行了回复。 3 客户端返回请求ack,y,说明接受到了信息并且开始传输数据,起始数据为y。 @@ -444,8 +445,8 @@ TCP 可靠传输 ​ - 2 滑动窗口可以连续发送多个数据再统一进行确认。 - +​ 2 滑动窗口可以连续发送多个数据再统一进行确认。 +​ 因为发送端希望在收到确认前,继续发送其它报文段。比如说在收到0号报文的确认前还发出了1-3号的报文,这样提高了信道的利用率。 3 滑动窗口只重传丢失的数据报 diff --git "a/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\255\246\344\271\240\346\200\273\347\273\223.md" index 4e3f34e..e348e89 100644 --- "a/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\255\246\344\271\240\346\200\273\347\273\223.md" +++ "b/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -21,18 +21,9 @@ * [磁盘和寻址](#磁盘和寻址) * [IO设备](#io设备) * [文件系统](#文件系统) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) --- -title: 操作系统学习总结 -date: 2018-07-09 22:33:03 -tags: - - 操作系统 -categories: - - 后端 - 技术总结 --- 这部分内容主要是基于一些关于操作系统基础的学习总结,内容不全面,只讲述了其中的一小部分,后续会再补充,如有错误,还请见谅。 @@ -109,7 +100,7 @@ cpu发出指令,将硬盘上的一段程序读入内存,由于cpu和硬盘 ## 进程与线程 ### 进程 -进程是资源分配的资本单位,操作系统为进程开辟一段内存空间,内存空间从高位向低位,包括函数调用栈,变量以及其他区域。cpu根据这些信息配合寄存器进行函数调用和程序执行。 +进程是资源分配的基本单位,操作系统为进程开辟一段内存空间,内存空间从高位向低位,包括函数调用栈,变量以及其他区域。cpu根据这些信息配合寄存器进行函数调用和程序执行。 ### 多进程 由于计算机是分时系统,所以多进程的使用不可避免,操作系统需要进行进程的切换,方法是内存指针指向新位置,保存原来的进程信息,同时刷新寄存器等数据。然后开始执行新的进程. @@ -167,9 +158,9 @@ cpu发出指令,将硬盘上的一段程序读入内存,由于cpu和硬盘 1互斥:资源必须是互斥的,只能给一个进程使用 - 2占有和等待:占有资源时可以请求其他资源 + 2停止等待:占有资源时可以请求其他资源 - 3不可抢占:资源占有时不会被抢 + 3不可剥夺:资源占有时不会被抢 4环路等待:有两个以上的进程组成一个环路,每个进程都在等待下一个进程的资源释放。 From 3ba778fb3cef2dce360126884bbef4ae6d7ddfbd Mon Sep 17 00:00:00 2001 From: Suwen macOS Yurisa <577014284@qq.com> Date: Thu, 30 Jul 2020 23:45:30 +0800 Subject: [PATCH 6/8] 2020.7.30 --- ReadMe.md | 5 +- ...36\350\267\265\346\200\273\347\273\223.md" | 25 +- ...36\350\267\265\346\200\273\347\273\223.md" | 33 +-- ...33\346\227\245\345\277\227\344\273\254.md" | 21 -- ...350\201\212SQL\346\263\250\345\205\245.md" | 50 +--- ...13\345\212\241\344\270\216\351\224\201.md" | 29 +- ...01\347\232\204\345\205\263\347\263\273.md" | 30 +-- ...45\344\270\216\345\256\236\350\267\265.md" | 24 +- ...0\257\235MySQL\345\205\245\351\227\250.md" | 255 ++++++++++++------ ...30\345\202\250\345\216\237\347\220\206.md" | 21 -- ...46\344\271\240\346\200\273\347\273\223.md" | 41 +-- ...46\344\271\240\346\200\273\347\273\223.md" | 33 +-- ...46\344\271\240\346\200\273\347\273\223.md" | 6 +- 13 files changed, 225 insertions(+), 348 deletions(-) diff --git a/ReadMe.md b/ReadMe.md index 021908f..c830adb 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -248,7 +248,7 @@ todo ### MySQL * [Mysql原理与实践总结](docs/database/Mysql原理与实践总结.md) * [重新学习Mysql数据库1:无废话MySQL入门](docs/database/重新学习Mysql数据库1:无废话MySQL入门.md) -* [重新学习Mysql数据库2:『浅入浅出』MySQL 和 InnoDB](docs/database/重新学习Mysql数据库2:MySQL 和 InnoDB.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) @@ -345,6 +345,8 @@ 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) @@ -354,6 +356,7 @@ todo todo ### 面经 + todo ## 工具 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 d330355..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 - + + ## 使用和基础数据结构(外观) 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 05c4f57..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" @@ -23,25 +23,6 @@ * [分布式数据库](#分布式数据库) ---- -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是关系数据库。 @@ -82,6 +63,8 @@ Mysql是关系数据库。 隔离性:两个事务之间互不相干,不能互相影响。 +持久性:事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。 + 事务的隔离级别 读未提交:事务A和事务B,A事务中执行的操作,B也可以看得到,因为级别是未提交读,别人事务中还没提交的数据你也看得到。这是没有任何并发措施的级别,也是默认级别。这个问题叫做脏读,为了解决这个问题,提出了读已提交。 @@ -99,7 +82,7 @@ Mysql是关系数据库。 # mysql原理 -MySQL是oracle公司的免费数据库,作为关系数据库火了很久了。所以我们要学他。 +MySQL是oracle公司的免费数据库,作为关系数据库火了很久了。所以我们要学它。 ## mysql客户端,服务端,存储引擎,文件系统 @@ -197,7 +180,7 @@ User Records 就是整个页面中真正用于存放行记录的部分,而 Fre ## mysql的索引,b树,聚集索引 -1 MySQL的innodb支持聚簇索引,myisam不支持聚簇索引。 +1. MySQL的innodb支持聚簇索引,myisam不支持聚簇索引。 innodb在建表时自动按照第一个非空字段或者主键建立聚簇索引。mysql使用B+树建立索引。 @@ -205,7 +188,7 @@ innodb在建表时自动按照第一个非空字段或者主键建立聚簇索 一个节点页对应着多行数据,每个节点按照顺序使用指针连成一个链表。mysql使用索引访问一行数据时,先通过log2n的时间访问到叶子节点,然后在数据页中按照行数链表执行顺序查找,直到找到那一行数据。 -2 b+树索引可以很好地支持范围搜索,因为叶子节点通过指针相连。 +2. b+树索引可以很好地支持范围搜索,因为叶子节点通过指针相连。 ## mysql的explain 慢查询日志 @@ -233,8 +216,8 @@ mysql慢查询日志可以在mysql的,my.cnf文件中配置开启,然后执行 ​ ​ 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 - +​ 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 @@ -313,7 +296,7 @@ innodb支持行级锁和事务,而myisam只支持表锁,它的所有操作 通过时间戳来判断先后顺序,并且是无锁的。但是需要额外存一个字段。 - 读操作比较自己的版本号,自动读取比自己版本号新的版本。不读。 + 读操作比较自己的版本号,自动读取比自己版本号新的版本。否则不读。 写操作自动覆盖写版本号比自己的版本号早的版本。否则不写。 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 603397c..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扩展具体的实现方式 随着业务规模的不断扩大,需要选择合适的方案去应对数据规模的增长,以应对逐渐增长的访问压力和数据量。 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\2231\357\274\232\346\227\240\345\272\237\350\257\235MySQL\345\205\245\351\227\250.md" "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2231\357\274\232\346\227\240\345\272\237\350\257\235MySQL\345\205\245\351\227\250.md" index f33d12a..ed7740b 100644 --- "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2231\357\274\232\346\227\240\345\272\237\350\257\235MySQL\345\205\245\351\227\250.md" +++ "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2231\357\274\232\346\227\240\345\272\237\350\257\235MySQL\345\205\245\351\227\250.md" @@ -40,27 +40,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技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - - ## 前言 开始使用 @@ -80,16 +59,31 @@ MySQL 为关系型数据库(Relational Database Management System),一个关 ### 登录MySQL -``` -mysql -h 127.0.0.1 -u 用户名 -pmysql -D 所选择的数据库名 -h 主机名 -u 用户名 -pmysql> exit # 退出 使用 “quit;” 或 “\q;” 一样的效果mysql> status; # 显示当前mysql的version的各种信息mysql> select version(); # 显示当前mysql的version信息mysql> show global variables like 'port'; # 查看MySQL端口号 +```bash +mysql -h 127.0.0.1 -u 用户名 -pmysql -D 所选择的数据库名 -h 主机名 -u 用户名 -pmysql> exit +# 退出 使用 “quit;” 或 “\q;” 一样的效果mysql> status; +# 显示当前mysql的version的各种信息mysql> select version(); +# 显示当前mysql的version信息mysql> show global variables like 'port'; +# 查看MySQL端口号 ``` ### 创建数据库 对于表的操作需要先进入库`use 库名;` -``` --- 创建一个名为 samp_db 的数据库,数据库字符编码指定为 gbkcreate database samp_db character set gbk;drop database samp_db; -- 删除 库名为samp_db的库show databases; -- 显示数据库列表。use samp_db; -- 选择创建的数据库samp_dbshow tables; -- 显示samp_db下面所有的表名字describe 表名; -- 显示数据表的结构delete from 表名; -- 清空表中记录 +```sql +-- 创建一个名为 samp_db 的数据库,数据库字符编码指定为 gbkcreate +database samp_db character set gbk; +drop database samp_db; +-- 删除 库名为samp_db的库 +show databases; +-- 显示数据库列表。 +use samp_db; +-- 选择创建的数据库 +samp_dbshow tables; +-- 显示samp_db下面所有的表名字describe 表名; +-- 显示数据表的结构delete from 表名; +-- 清空表中记录 ``` ### 创建数据库表 @@ -97,8 +91,10 @@ mysql -h 127.0.0.1 -u 用户名 -pmysql -D 所选择的数据库名 -h 主机名 > 使用 create table 语句可完成对表的创建, create table 的常见形式: > 语法:create table 表名称(列声明); -``` -CREATE TABLE `user_accounts` ( `id` int(100) unsigned NOT NULL AUTO_INCREMENT primary key, `password` varchar(32) NOT NULL DEFAULT '' COMMENT '用户密码', `reset_password` tinyint(32) NOT NULL DEFAULT 0 COMMENT '用户类型:0-不需要重置密码;1-需要重置密码', `mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机', `create_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `update_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), -- 创建唯一索引,不允许重复 UNIQUE INDEX idx_user_mobile(`mobile`))ENGINE=InnoDB DEFAULT CHARSET=utf8COMMENT='用户表信息'; +```sql +CREATE TABLE `user_accounts` ( `id` int(100) unsigned NOT NULL AUTO_INCREMENT primary key, `password` varchar(32) NOT NULL DEFAULT '' COMMENT '用户密码', `reset_password` tinyint(32) NOT NULL DEFAULT 0 COMMENT '用户类型:0-不需要重置密码;1-需要重置密码', `mobile` varchar(20) NOT NULL DEFAULT '' COMMENT '手机', `create_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), `update_at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), +-- 创建唯一索引,不允许重复 +UNIQUE INDEX idx_user_mobile(`mobile`))ENGINE=InnoDB DEFAULT CHARSET=utf8COMMENT='用户表信息'; ``` 数据类型的属性解释 @@ -127,8 +123,19 @@ CREATE TABLE `user_accounts` ( `id` int(100) unsigned NOT NULL AUTO > 语法:`SELECT 列名称 FROM 表名称`  > 语法:`SELECT * FROM 表名称` -``` --- 表station取个别名叫s,表station中不包含 字段id=13或者14 的,并且id不等于4的 查询出来,只显示idSELECT s.id from station s WHERE id in (13,14) and user_id not in (4); -- 从表 Persons 选取 LastName 列的数据SELECT LastName FROM Persons -- 结果集中会自动去重复数据SELECT DISTINCT Company FROM Orders -- 表 Persons 字段 Id_P 等于 Orders 字段 Id_P 的值,-- 结果集显示 Persons表的 LastName、FirstName字段,Orders表的OrderNo字段SELECT p.LastName, p.FirstName, o.OrderNo FROM Persons p, Orders o WHERE p.Id_P = o.Id_P -- gbk 和 utf8 中英文混合排序最简单的办法 -- ci是 case insensitive, 即 “大小写不敏感”SELECT tag, COUNT(tag) from news GROUP BY tag order by convert(tag using gbk) collate gbk_chinese_ci;SELECT tag, COUNT(tag) from news GROUP BY tag order by convert(tag using utf8) collate utf8_unicode_ci; +```sql +-- 表station取个别名叫s,表station中不包含 字段id=13或者14 的,并且id不等于4的 查询出来,只显示id +SELECT s.id from station s WHERE id in (13,14) and user_id not in (4); +-- 从表 Persons 选取 LastName 列的数据 +SELECT LastName FROM Persons +-- 结果集中会自动去重复数据 +SELECT DISTINCT Company FROM Orders +-- 表 Persons 字段 Id_P 等于 Orders 字段 Id_P 的值, +-- 结果集显示 Persons表的 LastName、FirstName字段,Orders表的OrderNo字段 +SELECT p.LastName, p.FirstName, o.OrderNo FROM Persons p, Orders o WHERE p.Id_P = o.Id_P +-- gbk 和 utf8 中英文混合排序最简单的办法 +-- ci是 case insensitive, 即 “大小写不敏感” +SELECT tag, COUNT(tag) from news GROUP BY tag order by convert(tag using gbk) collate gbk_chinese_ci;SELECT tag, COUNT(tag) from news GROUP BY tag order by convert(tag using utf8) collate utf8_unicode_ci; ``` ### UPDATE @@ -136,8 +143,11 @@ CREATE TABLE `user_accounts` ( `id` int(100) unsigned NOT NULL AUTO > Update 语句用于修改表中的数据。  > 语法:`UPDATE 表名称 SET 列名称 = 新值 WHERE 列名称 = 某值` -``` --- update语句设置字段值为另一个结果取出来的字段update user set name = (select name from user1 where user1 .id = 1 )where id = (select id from user2 where user2 .name='小苏');-- 更新表 orders 中 id=1 的那一行数据更新它的 title 字段UPDATE `orders` set title='这里是标题' WHERE id=1; +```sql +-- update语句设置字段值为另一个结果取出来的字段 +update user set name = (select name from user1 where user1 .id = 1 )where id = (select id from user2 where user2 .name='小苏'); +-- 更新表 orders 中 id=1 的那一行数据更新它的 title 字段 +UPDATE `orders` set title='这里是标题' WHERE id=1; ``` ### INSERT @@ -146,8 +156,15 @@ CREATE TABLE `user_accounts` ( `id` int(100) unsigned NOT NULL AUTO > 语法:`INSERT INTO 表名称 VALUES (值1, 值2,....)`  > 语法:`INSERT INTO 表名称 (列1, 列2,...) VALUES (值1, 值2,....)` -``` --- 向表 Persons 插入一条字段 LastName = JSLite 字段 Address = shanghaiINSERT INTO Persons (LastName, Address) VALUES ('JSLite', 'shanghai');-- 向表 meeting 插入 字段 a=1 和字段 b=2INSERT INTO meeting SET a=1,b=2;-- -- SQL实现将一个表的数据插入到另外一个表的代码-- 如果只希望导入指定字段,可以用这种方法:-- INSERT INTO 目标表 (字段1, 字段2, ...) SELECT 字段1, 字段2, ... FROM 来源表;INSERT INTO orders (user_account_id, title) SELECT m.user_id, m.title FROM meeting m where m.id=1; +```sql +-- 向表 Persons 插入一条字段 LastName = JSLite 字段 Address = shanghai +INSERT INTO Persons (LastName, Address) VALUES ('JSLite', 'shanghai'); +-- 向表 meeting 插入 字段 a=1 和字段 b=2 +INSERT INTO meeting SET a=1,b=2; +-- SQL实现将一个表的数据插入到另外一个表的代码 +-- 如果只希望导入指定字段,可以用这种方法: +-- INSERT INTO 目标表 (字段1, 字段2, ...) SELECT 字段1, 字段2, ... FROM 来源表; +INSERT INTO orders (user_account_id, title) SELECT m.user_id, m.title FROM meeting m where m.id=1; ``` ### DELETE @@ -155,8 +172,15 @@ CREATE TABLE `user_accounts` ( `id` int(100) unsigned NOT NULL AUTO > DELETE 语句用于删除表中的行。  > 语法:`DELETE FROM 表名称 WHERE 列名称 = 值` -``` --- 在不删除table_name表的情况下删除所有的行,清空表。DELETE FROM table_name-- 或者DELETE * FROM table_name-- 删除 Person表字段 LastName = 'JSLite' DELETE FROM Person WHERE LastName = 'JSLite' -- 删除 表meeting id 为2和3的两条数据DELETE from meeting where id in (2,3); +```sql +-- 在不删除table_name表的情况下删除所有的行,清空表。 +DELETE FROM table_name +-- 或者 +DELETE * FROM table_name +-- 删除 Person表字段 LastName = 'JSLite' +DELETE FROM Person WHERE LastName = 'JSLite' +-- 删除 表meeting id 为2和3的两条数据 +DELETE from meeting where id in (2,3); ``` ## WHERE @@ -164,8 +188,9 @@ CREATE TABLE `user_accounts` ( `id` int(100) unsigned NOT NULL AUTO > WHERE 子句用于规定选择的标准。  > 语法:`SELECT 列名称 FROM 表名称 WHERE 列 运算符 值` -``` --- 从表 Persons 中选出 Year 字段大于 1965 的数据SELECT * FROM Persons WHERE Year>1965 +```sql +-- 从表 Persons 中选出 Year 字段大于 1965 的数据 +SELECT * FROM Persons WHERE Year>1965 ``` ## AND 和 OR @@ -175,14 +200,18 @@ CREATE TABLE `user_accounts` ( `id` int(100) unsigned NOT NULL AUTO ### AND -``` --- 删除 meeting 表字段 -- id=2 并且 user_id=5 的数据 和-- id=3 并且 user_id=6 的数据 DELETE from meeting where id in (2,3) and user_id in (5,6); -- 使用 AND 来显示所有姓为 "Carter" 并且名为 "Thomas" 的人:SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'; +```sql +-- 删除 meeting 表字段 -- id=2 并且 user_id=5 的数据 和-- id=3 并且 user_id=6 的数据 +DELETE from meeting where id in (2,3) and user_id in (5,6); +-- 使用 AND 来显示所有姓为 "Carter" 并且名为 "Thomas" 的人: +SELECT * FROM Persons WHERE FirstName='Thomas' AND LastName='Carter'; ``` ### OR -``` --- 使用 OR 来显示所有姓为 "Carter" 或者名为 "Thomas" 的人:SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter' +```sql +-- 使用 OR 来显示所有姓为 "Carter" 或者名为 "Thomas" 的人: +SELECT * FROM Persons WHERE firstname='Thomas' OR lastname='Carter' ``` ## ORDER BY @@ -192,8 +221,13 @@ CREATE TABLE `user_accounts` ( `id` int(100) unsigned NOT NULL AUTO > `DESC` - 按照降序对记录进行排序。  > `ASC` - 按照顺序对记录进行排序。 -``` --- Company在表Orders中为字母,则会以字母顺序显示公司名称SELECT Company, OrderNumber FROM Orders ORDER BY Company -- 后面跟上 DESC 则为降序显示SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC -- Company以降序显示公司名称,并OrderNumber以顺序显示SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC +```sql +-- Company在表Orders中为字母,则会以字母顺序显示公司名称 +SELECT Company, OrderNumber FROM Orders ORDER BY Company +-- 后面跟上 DESC 则为降序显示 +SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC +-- Company以降序显示公司名称,并OrderNumber以顺序显示 +SELECT Company, OrderNumber FROM Orders ORDER BY Company DESC, OrderNumber ASC ``` ## IN @@ -202,15 +236,16 @@ CREATE TABLE `user_accounts` ( `id` int(100) unsigned NOT NULL AUTO > IN - 操作符用来指定范围,范围中的每一条,都进行匹配。IN取值规律,由逗号分割,全部放置括号中。 > 语法:`SELECT "字段名"FROM "表格名"WHERE "字段名" IN ('值一', '值二', ...);` -``` --- 从表 Persons 选取 字段 LastName 等于 Adams、CarterSELECT * FROM Persons WHERE LastName IN ('Adams','Carter') +```sql +-- 从表 Persons 选取 字段 LastName 等于 Adams、Carter +SELECT * FROM Persons WHERE LastName IN ('Adams','Carter') ``` ## NOT > NOT - 操作符总是与其他操作符一起使用,用在要过滤的前面。 -``` +```sql SELECT vend_id, prod_name FROM Products WHERE NOT vend_id = 'DLL01' ORDER BYprod_name; ``` @@ -218,8 +253,10 @@ SELECT vend_id, prod_name FROM Products WHERE NOT vend_id = 'DLL01' ORDE > UNION - 操作符用于合并两个或多个 SELECT 语句的结果集。 -``` --- 列出所有在中国表(Employees_China)和美国(Employees_USA)的不同的雇员名SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA -- 列出 meeting 表中的 pic_url,-- station 表中的 number_station 别名设置成 pic_url 避免字段不一样报错-- 按更新时间排序SELECT id,pic_url FROM meeting UNION ALL SELECT id,number_station AS pic_url FROM station ORDER BY update_at; +```sql +-- 列出所有在中国表(Employees_China)和美国(Employees_USA)的不同的雇员名 +SELECT E_Name FROM Employees_China UNION SELECT E_Name FROM Employees_USA -- 列出 meeting 表中的 pic_url,-- station 表中的 number_station 别名设置成 pic_url 避免字段不一样报错-- 按更新时间排序 +SELECT id,pic_url FROM meeting UNION ALL SELECT id,number_station AS pic_url FROM station ORDER BY update_at; ``` ## AS @@ -228,8 +265,19 @@ SELECT vend_id, prod_name FROM Products WHERE NOT vend_id = 'DLL01' ORDE > 一般是重命名列名或者表名。  > 语法:`select column_1 as 列1,column_2 as 列2 from table as 表` -``` -SELECT * FROM Employee AS emp-- 这句意思是查找所有Employee 表里面的数据,并把Employee表格命名为 emp。-- 当你命名一个表之后,你可以在下面用 emp 代替 Employee.-- 例如 SELECT * FROM emp. SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders-- 列出表 Orders 字段 OrderPrice 列最大值,-- 结果集列不显示 OrderPrice 显示 LargestOrderPrice -- 显示表 users_profile 中的 name 列SELECT t.name from (SELECT * from users_profile a) AS t; -- 表 user_accounts 命名别名 ua,表 users_profile 命名别名 up-- 满足条件 表 user_accounts 字段 id 等于 表 users_profile 字段 user_id-- 结果集只显示mobile、name两列SELECT ua.mobile,up.name FROM user_accounts as ua INNER JOIN users_profile as up ON ua.id = up.user_id; +```sql +SELECT * FROM Employee AS emp +-- 这句意思是查找所有Employee 表里面的数据,并把Employee表格命名为 emp。 +-- 当你命名一个表之后,你可以在下面用 emp 代替 Employee. +-- 例如 +SELECT * FROM emp. SELECT MAX(OrderPrice) AS LargestOrderPrice FROM Orders +-- 列出表 Orders 字段 OrderPrice 列最大值, +-- 结果集列不显示 OrderPrice 显示 LargestOrderPrice +-- 显示表 users_profile 中的 name 列 +SELECT t.name from (SELECT * from users_profile a) AS t; +-- 表 user_accounts 命名别名 ua,表 users_profile 命名别名 up +-- 满足条件 表 user_accounts 字段 id 等于 表 users_profile 字段 user_id-- 结果集只显示mobile、name两列 +SELECT ua.mobile,up.name FROM user_accounts as ua INNER JOIN users_profile as up ON ua.id = up.user_id; ``` ## JOIN @@ -246,7 +294,7 @@ SELECT * FROM Employee AS emp-- 这句意思是查找所有Employee 表里面的 * `FULL JOIN`: 只要其中一个表中存在匹配,就返回行 -``` +```sql SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsINNER JOIN OrdersON Persons.Id_P = Orders.Id_PORDER BY Persons.LastName; ``` @@ -257,8 +305,14 @@ SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsINNER JOIN > COUNT 让我们能够数出在表格中有多少笔资料被选出来。  > 语法:`SELECT COUNT("字段名") FROM "表格名";` -``` --- 表 Store_Information 有几笔 store_name 栏不是空白的资料。-- "IS NOT NULL" 是 "这个栏位不是空白" 的意思。SELECT COUNT (Store_Name) FROM Store_Information WHERE Store_Name IS NOT NULL; -- 获取 Persons 表的总数SELECT COUNT(1) AS totals FROM Persons;-- 获取表 station 字段 user_id 相同的总数select user_id, count(*) as totals from station group by user_id; +```sql +-- 表 Store_Information 有几笔 store_name 栏不是空白的资料。 +-- "IS NOT NULL" 是 "这个栏位不是空白" 的意思。 +SELECT COUNT (Store_Name) FROM Store_Information WHERE Store_Name IS NOT NULL; +-- 获取 Persons 表的总数 +SELECT COUNT(1) AS totals FROM Persons; +-- 获取表 station 字段 user_id 相同的总数 +select user_id, count(*) as totals from station group by user_id; ``` ### MAX @@ -280,8 +334,13 @@ SELECT Persons.LastName, Persons.FirstName, Orders.OrderNoFROM PersonsINNER JOIN > for each row # 触发器的执行间隔,for each row 通知触发器每隔一行执行一次动作,而不是对整个表执行一次。 > <触发器SQL语句> -``` -DELIMITER $ -- 自定义结束符号CREATE TRIGGER set_userdate BEFORE INSERT on `message`for EACH ROWBEGIN UPDATE `user_accounts` SET status=1 WHERE openid=NEW.openid;END$DELIMITER ; -- 恢复结束符号 +```sql +DELIMITER $ +-- 自定义结束符号 +CREATE TRIGGER set_userdate BEFORE INSERT on `message`for EACH ROWBEGIN UPDATE `user_accounts` SET status=1 WHERE openid=NEW.openid; +END$ +DELIMITER ; +-- 恢复结束符号 ``` OLD和NEW不区分大小写 @@ -296,32 +355,44 @@ OLD和NEW不区分大小写 > 语法:ALTER TABLE `表名字` ADD INDEX 索引名字 ( `字段名字` ) -``` --- –直接创建索引CREATE INDEX index_user ON user(title)-- –修改表结构的方式添加索引ALTER TABLE table_name ADD INDEX index_name ON (column(length))-- 给 user 表中的 name字段 添加普通索引(INDEX)ALTER TABLE `table` ADD INDEX index_name (name)-- –创建表的时候同时创建索引CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), INDEX index_name (title(length)))-- –删除索引DROP INDEX index_name ON table +```sql +-- –直接创建索引 +CREATE INDEX index_user ON user(title) +-- –修改表结构的方式添加索引 +ALTER TABLE table_name ADD INDEX index_name ON (column(length)) +-- 给 user 表中的 name字段 添加普通索引(INDEX) +ALTER TABLE `table` ADD INDEX index_name (name) +-- –创建表的时候同时创建索引 +CREATE TABLE `table` ( `id` int(11) NOT NULL AUTO_INCREMENT , `title` char(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL , `content` text CHARACTER SET utf8 COLLATE utf8_general_ci NULL , `time` int(10) NULL DEFAULT NULL , PRIMARY KEY (`id`), INDEX index_name (title(length))) +-- –删除索引 +DROP INDEX index_name ON table ``` ### 主键索引(PRIMARY key) > 语法:ALTER TABLE `表名字` ADD PRIMARY KEY ( `字段名字` ) -``` --- 给 user 表中的 id字段 添加主键索引(PRIMARY key)ALTER TABLE `user` ADD PRIMARY key (id); +```sql +-- 给 user 表中的 id字段 添加主键索引(PRIMARY key) +ALTER TABLE `user` ADD PRIMARY key (id); ``` ### 唯一索引(UNIQUE) > 语法:ALTER TABLE `表名字` ADD UNIQUE (`字段名字`) -``` --- 给 user 表中的 creattime 字段添加唯一索引(UNIQUE)ALTER TABLE `user` ADD UNIQUE (creattime); +```sql +-- 给 user 表中的 creattime 字段添加唯一索引(UNIQUE) +ALTER TABLE `user` ADD UNIQUE (creattime); ``` ### 全文索引(FULLTEXT) > 语法:ALTER TABLE `表名字` ADD FULLTEXT (`字段名字`) -``` --- 给 user 表中的 description 字段添加全文索引(FULLTEXT)ALTER TABLE `user` ADD FULLTEXT (description); +```sql +-- 给 user 表中的 description 字段添加全文索引(FULLTEXT) +ALTER TABLE `user` ADD FULLTEXT (description); ``` ### 添加多列索引 @@ -330,8 +401,9 @@ OLD和NEW不区分大小写 ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `column3`) -``` --- 给 user 表中的 name、city、age 字段添加名字为name_city_age的普通索引(INDEX)ALTER TABLE user ADD INDEX name_city_age (name(10),city,age); +```sql +-- 给 user 表中的 name、city、age 字段添加名字为name_city_age的普通索引(INDEX) +ALTER TABLE user ADD INDEX name_city_age (name(10),city,age); ``` ### 建立索引的时机 @@ -344,8 +416,12 @@ ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `colu * 在`LIKE`以通配符%和_开头作查询时,MySQL不会使用索引。 -``` --- 此时就需要对city和age建立索引,-- 由于mytable表的userame也出现在了JOIN子句中,也有对它建立索引的必要。SELECT t.Name FROM mytable t LEFT JOIN mytable m ON t.Name=m.username WHERE m.age=20 AND m.city='上海'; SELECT * FROM mytable WHERE username like'admin%'; -- 而下句就不会使用:SELECT * FROM mytable WHEREt Name like'%admin'; -- 因此,在使用LIKE时应注意以上的区别。 +```sql +-- 此时就需要对city和age建立索引,-- 由于mytable表的userame也出现在了JOIN子句中,也有对它建立索引的必要。 +SELECT t.Name FROM mytable t LEFT JOIN mytable m ON t.Name=m.username WHERE m.age=20 AND m.city='上海'; SELECT * FROM mytable WHERE username like'admin%'; +-- 而下句就不会使用: +SELECT * FROM mytable WHEREt Name like'%admin'; +-- 因此,在使用LIKE时应注意以上的区别。 ``` 索引的注意事项 @@ -364,32 +440,46 @@ ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `colu 示例: -``` --- 在表students的最后追加列 address: alter table students add address char(60);-- 在名为 age 的列后插入列 birthday: alter table students add birthday date after age;-- 在名为 number_people 的列后插入列 weeks: alter table students add column `weeks` varchar(5) not null default "" after `number_people`; +```sql +-- 在表students的最后追加列 address: +alter table students add address char(60); +-- 在名为 age 的列后插入列 birthday: +alter table students add birthday date after age; +-- 在名为 number_people 的列后插入列 weeks: +alter table students add column `weeks` varchar(5) not null default "" after `number_people`; ``` ### 修改列 > 语法:`alter table 表名 change 列名称 列新名称 新数据类型;` -``` --- 将表 tel 列改名为 telphone: alter table students change tel telphone char(13) default "-";-- 将 name 列的数据类型改为 char(16): alter table students change name name char(16) not null;-- 修改 COMMENT 前面必须得有类型属性alter table students change name name char(16) COMMENT '这里是名字';-- 修改列属性的时候 建议使用modify,不需要重建表-- change用于修改列名字,这个需要重建表alter table meeting modify `weeks` varchar(20) NOT NULL DEFAULT "" COMMENT "开放日期 周一到周日:0~6,间隔用英文逗号隔开"; +```sql +-- 将表 tel 列改名为 telphone: +alter table students change tel telphone char(13) default "-"; +-- 将 name 列的数据类型改为 char(16): alter table students change name name char(16) not null; +-- 修改 COMMENT 前面必须得有类型属性 +alter table students change name name char(16) COMMENT '这里是名字'; +-- 修改列属性的时候 建议使用modify,不需要重建表 +-- change用于修改列名字,这个需要重建表 +alter table meeting modify `weeks` varchar(20) NOT NULL DEFAULT "" COMMENT "开放日期 周一到周日:0~6,间隔用英文逗号隔开"; ``` ### 删除列 > 语法:`alter table 表名 drop 列名称;` -``` --- 删除表students中的 birthday 列: alter table students drop birthday; +```sql +-- 删除表students中的 birthday 列: +alter table students drop birthday; ``` ### 重命名表 > 语法:`alter table 表名 rename 新表名;` -``` --- 重命名 students 表为 workmates: alter table students rename workmates; +```sql +-- 重命名 students 表为 workmates: +alter table students rename workmates; ``` ### 清空表数据 @@ -401,22 +491,25 @@ ALTER TABLE `table_name` ADD INDEX index_name ( `column1`, `column2`, `colu * `TRUNCATE:`1\. DDL语言;2\. 无法回退;3\. 默认所有的表内容都删除;4\. 删除速度比delete快。 -``` --- 清空表为 workmates 里面的数据,不删除表。 delete from workmates;-- 删除workmates表中的所有数据,且无法恢复truncate from workmates; +```sql +-- 清空表为 workmates 里面的数据,不删除表。 +delete from workmates;-- 删除workmates表中的所有数据,且无法恢复truncate from workmates; ``` ### 删除整张表 > 语法:`drop table 表名;` -``` --- 删除 workmates 表: drop table workmates; +```sql +-- 删除 workmates 表: +drop table workmates; ``` ### 删除整个数据库 > 语法:`drop database 数据库名;` -``` --- 删除 samp_db 数据库: drop database samp_db; +```sql +-- 删除 samp_db 数据库: +drop database samp_db; ``` 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\2233\357\274\232Mysql\345\255\230\345\202\250\345\274\225\346\223\216\344\270\216\346\225\260\346\215\256\345\255\230\345\202\250\345\216\237\347\220\206.md" "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2233\357\274\232Mysql\345\255\230\345\202\250\345\274\225\346\223\216\344\270\216\346\225\260\346\215\256\345\255\230\345\202\250\345\216\237\347\220\206.md" index 683b5ca..9e069a9 100644 --- "a/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2233\357\274\232Mysql\345\255\230\345\202\250\345\274\225\346\223\216\344\270\216\346\225\260\346\215\256\345\255\230\345\202\250\345\216\237\347\220\206.md" +++ "b/docs/database/\351\207\215\346\226\260\345\255\246\344\271\240Mysql\346\225\260\346\215\256\345\272\2233\357\274\232Mysql\345\255\230\345\202\250\345\274\225\346\223\216\344\270\216\346\225\260\346\215\256\345\255\230\345\202\250\345\216\237\347\220\206.md" @@ -35,27 +35,6 @@ * [[](https://draveness.me/mysql-innodb#reference)Reference](#[]httpsdravenessmemysql-innodbreferencereference) -本文转自互联网 - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -本也将整理到我的个人博客: -> www.how2playlife.com - -更多Java技术文章将陆续在微信公众号【Java技术江湖】更新,敬请关注。 - -本文是《重新学习MySQL数据库》系列其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从入门到进阶,从sql基本的使用方法,从MySQL执行引擎再到索引、事务等知识,一步步地学习MySQL相关技术的实现原理,更好地了解如何基于这些知识来优化sql,减少SQL执行时间,通过执行计划对SQL性能进行分析,再到MySQL的主从复制、主备部署等内容,以便让你更完整地了解整个MySQL方面的技术体系,形成自己的知识框架。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - - ## 前言 作为一名开发人员,在日常的工作中会难以避免地接触到数据库,无论是基于文件的 sqlite 还是工程上使用非常广泛的 MySQL、PostgreSQL,但是一直以来也没有对数据库有一个非常清晰并且成体系的认知,所以最近两个月的时间看了几本数据库相关的书籍并且阅读了 MySQL 的官方文档,希望对各位了解数据库的、不了解数据库的有所帮助。 diff --git "a/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\345\255\246\344\271\240\346\200\273\347\273\223.md" index 87920d3..e8f2c65 100644 --- "a/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\345\255\246\344\271\240\346\200\273\347\273\223.md" +++ "b/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -35,6 +35,7 @@ * [为什么要三次握手](#为什么要三次握手) * [time wait的作用](#time-wait的作用) * [可靠传输协议](#可靠传输协议) + * [tcp的粘包拆包](#tcp的粘包拆包) * [网络层](#网络层) * [IP 数据报格式](#ip-数据报格式) @@ -44,25 +45,8 @@ * [ip分片详谈](#ip分片详谈) * [路由选择协议和算法](#路由选择协议和算法) * [链路层](#链路层) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) - - ---- -title: 计算机网络学习总结 -date: 2018-07-09 22:32:57 -tags: - - 计算机网络 -categories: - - 后端 - - 技术总结 ---- -这部分内容主要是基于一些关于计算机网络基础的学习总结,内容不全面,只讲述了其中的一小部分,后续会再补充,如有错误,还请见谅。 - - - 计算机网络常见概念 + ## 网卡和路由器 @@ -326,8 +310,8 @@ https博大精深,首先先来看看他的基础知识 ​ ​ 6 https过程 ​ - 用户发送请求,服务器返回一个数字证书。 - +​ 用户发送请求,服务器返回一个数字证书。 +​ 用户在浏览器端生成一个随机数,使用证书中的公钥加密,发送给服务端。 服务端使用公钥解密该密文,得到随机数。 @@ -358,13 +342,13 @@ TCP是传输层最重要的协议。 伪首部的意义:伪首部并非TCP&UDP数据报中实际的有效成分。伪首部是一个虚拟的数据结构,其中的信息是从数据报所在IP分组头的分组头中提取的,既不向下传送也不向上递交,而仅仅是为计算校验和。 -![image](https://github.com/CyC2018/Interview-Notebook/raw/master/pics/d4c3a4a1-0846-46ec-9cc3-eaddfca71254.jpg) +![image](http://c.biancheng.net/uploads/allimg/191111/6-1911111249535K.gif) 首部字段只有 8 个字节,包括源端口、目的端口、长度、检验和。12 字节的伪首部是为了计算检验和临时添加的。 ### TCP 首部格式 -[![](https://github.com/CyC2018/Interview-Notebook/raw/master/pics/55dc4e84-573d-4c13-a765-52ed1dd251f9.png)](https://github.com/CyC2018/Interview-Notebook/blob/master/pics/55dc4e84-573d-4c13-a765-52ed1dd251f9.png) +[![](http://c.biancheng.net/uploads/allimg/191108/6-19110Q62344I5.gif) * **序号** :用于对字节流进行编号,例如序号为 301,表示第一个字节的编号为 301,如果携带的数据长度为 100 字节,那么下一个报文段的序号应为 401。 @@ -390,10 +374,10 @@ TCP是传输层最重要的协议。 ​ ​ 三次握手 ​ - 1 首先客户端发送连接请求syn,携带随机数x。 - 2 服务端返回请求ack,x + 1,说明服务端对x进行了回复。 - 3 客户端返回请求ack,y,说明接受到了信息并且开始传输数据,起始数据为y。 - +​ 1 首先客户端发送连接请求syn,携带随机数x。 +​ 2 服务端返回请求ack,x + 1,说明服务端对x进行了回复。 +​ 3 客户端返回请求ack,y,说明接受到了信息并且开始传输数据,起始数据为y。 +​ 客户端状态时syn_send和establish 服务端则是从listen到syn_rcvd,再到establish @@ -447,8 +431,8 @@ TCP 可靠传输 ​ ​ 2 滑动窗口可以连续发送多个数据再统一进行确认。 ​ - 因为发送端希望在收到确认前,继续发送其它报文段。比如说在收到0号报文的确认前还发出了1-3号的报文,这样提高了信道的利用率。 - +​ 因为发送端希望在收到确认前,继续发送其它报文段。比如说在收到0号报文的确认前还发出了1-3号的报文,这样提高了信道的利用率。 +​ 3 滑动窗口只重传丢失的数据报 但可以想想,0-4发出去后可能要重传,所以需要一个缓冲区维护这些报文,所以就有了窗口。 @@ -650,6 +634,7 @@ OSPF 具有以下特点: OSPF找到最短路径。告诉大家。 ## 链路层 + 链路层最主要是指局域网内的网络交互了,使用mac地址通过交换机进行通信,其中用得最多的局域网协议就是以太网。 链路层使用MTU表示最大传输帧长度,报文长度不能超过MTU,否则会进行分片,比如比较大的IP数据报就会被分片,为了避免被分片。一般要控制IP报文长度。 diff --git "a/docs/operating-system/Linux\345\206\205\346\240\270\344\270\216\345\237\272\347\241\200\345\221\275\344\273\244\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/operating-system/Linux\345\206\205\346\240\270\344\270\216\345\237\272\347\241\200\345\221\275\344\273\244\345\255\246\344\271\240\346\200\273\347\273\223.md" index d23a9f2..1b0043b 100644 --- "a/docs/operating-system/Linux\345\206\205\346\240\270\344\270\216\345\237\272\347\241\200\345\221\275\344\273\244\345\255\246\344\271\240\346\200\273\347\273\223.md" +++ "b/docs/operating-system/Linux\345\206\205\346\240\270\344\270\216\345\237\272\347\241\200\345\221\275\344\273\244\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -60,32 +60,9 @@ * [ifconfig](#ifconfig) * [uname](#uname) * [实际场景问题](#实际场景问题) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) - - ---- -title: Linux内核与基础命令学习总结 -date: 2018-07-09 22:33:14 -tags: - - Linux -categories: - - 后端 - - 技术总结 ---- -这部分内容主要是基于一些关于Linux系统的内核基础和基本命令的学习总结,内容不全面,只讲述了其中的一小部分,后续会再补充,如有错误,还请见谅。 - - -Linux操作系统 - - - -Linux操作系统博大精深,其中对线程,IO,文件系统等概念的实现都很有借鉴意义。 - - + + -​ ## 文件系统和VFS 文件系统的inode上面讲过了。VFS主要用于屏蔽底层的不同文件系统,比如接入网络中的nfs文件系统,亦或是windows文件系统,正常情况下难以办到,而vfs通过使用IO操作的posix规范来规定所有文件读写操作,每个文件系统只需要实现这些操作就可以接入VFS,不需要重新安装文件系统。 @@ -513,9 +490,9 @@ ps:拥有目录权限才能修改文件名,拥有文件权限是没用的 ​ - # ln /etc/crontab . - # ll -i /etc/crontab crontab - +​ # ln /etc/crontab . +​ # ll -i /etc/crontab crontab +​ 34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 crontab 34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab diff --git "a/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\255\246\344\271\240\346\200\273\347\273\223.md" "b/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\255\246\344\271\240\346\200\273\347\273\223.md" index e348e89..fa52bf4 100644 --- "a/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\255\246\344\271\240\346\200\273\347\273\223.md" +++ "b/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\255\246\344\271\240\346\200\273\347\273\223.md" @@ -24,14 +24,10 @@ --- - - 技术总结 ---- -这部分内容主要是基于一些关于操作系统基础的学习总结,内容不全面,只讲述了其中的一小部分,后续会再补充,如有错误,还请见谅。 -操作系统 - ## CPU + cpu是中央处理器,他是计算机的核心。 cpu通过和寄存器,高速缓存,以及内存交互来执行程序。 From 0d98e38ac881b31f4c88d61547ded8d3bd270119 Mon Sep 17 00:00:00 2001 From: Suwen macOS Yurisa <577014284@qq.com> Date: Mon, 3 Aug 2020 15:35:26 +0800 Subject: [PATCH 7/8] 8.3 --- ReadMe.md | 12 +- docs/code/code.md | 12 +- docs/index.html | 45 - ...37\347\220\206\350\257\246\350\247\243.md" | 21 - ...357\274\214CAS\346\223\215\344\275\234.md" | 26 +- ...1\224\201 Lock\345\222\214synchronized.md" | 22 +- ...76\350\256\241\346\250\241\345\274\217.md" | 16 +- ...14\346\234\237\344\274\230\345\214\226.md" | 34 +- ...06\345\222\214\347\256\227\346\263\225.md" | 127 +- ...73\347\273\237\345\244\215\344\271\240.md" | 2285 +++++++++++++++++ src/main/java/md/AtxMarkdownTocFileTest.java | 4 - src/main/java/md/mdToc.java | 10 - ...00\347\273\210\346\225\210\346\236\234.md" | 162 -- 13 files changed, 2375 insertions(+), 401 deletions(-) delete mode 100644 docs/index.html create mode 100644 "docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\244\215\344\271\240.md" delete mode 100644 src/main/java/md/AtxMarkdownTocFileTest.java delete mode 100644 src/main/java/md/mdToc.java delete mode 100644 "\346\234\200\347\273\210\346\225\210\346\236\234.md" diff --git a/ReadMe.md b/ReadMe.md index c830adb..c3554f4 100644 --- a/ReadMe.md +++ b/ReadMe.md @@ -1,3 +1,6 @@ + +# Java工程师技术指南 + 本仓库原为 [Java工程师技术指南](https://github.com/h2pl/Java-Tutorial),现 fork 修正错误和更新内容。 ## 目录 @@ -197,14 +200,11 @@ todo ## 算法 +* [必背代码](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) @@ -221,6 +221,8 @@ todo [操作系统学习总结](docs/operating-system/操作系统学习总结.md) +[操作系统复习](docs/operating-system/操作系统复习.md) + #### Linux相关 [Linux内核与基础命令学习总结](docs/operating-system/Linux内核与基础命令学习总结.md) @@ -287,6 +289,8 @@ todo ### Kafka +Todo + ## 大后端 * [后端技术杂谈开篇:云计算,大数据与AI的故事](docs/big-backEnd/后端技术杂谈开篇:云计算,大数据与AI的故事.md) diff --git a/docs/code/code.md b/docs/code/code.md index b1e9c57..0f5b798 100644 --- a/docs/code/code.md +++ b/docs/code/code.md @@ -72,7 +72,7 @@ public class SelectionSort implements IArraySort { // 总共要经过 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]) { @@ -173,12 +173,9 @@ public class ShellSort implements IArraySort { ### 快速排序 - - -* 从数列中挑出一个元素,称为 “基准”(pivot); - -* 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作; -* 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序; +- 从数列中挑出一个元素,称为 “基准”(pivot); +- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作; +- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序; ```java public class QuickSort implements IArraySort { @@ -430,4 +427,3 @@ ListNode deleteDuplicates(ListNode head) { return head; } ``` - diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index 3d8c75e..0000000 --- a/docs/index.html +++ /dev/null @@ -1,45 +0,0 @@ - - - - - JavaGuide - - - - - - - -
- - - - - - - - - diff --git "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2205\357\274\232JDK\345\222\214cglib\345\212\250\346\200\201\344\273\243\347\220\206\345\216\237\347\220\206\350\257\246\350\247\243.md" "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2205\357\274\232JDK\345\222\214cglib\345\212\250\346\200\201\344\273\243\347\220\206\345\216\237\347\220\206\350\257\246\350\247\243.md" index 5bd2ca0..f05e7ee 100644 --- "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2205\357\274\232JDK\345\222\214cglib\345\212\250\346\200\201\344\273\243\347\220\206\345\216\237\347\220\206\350\257\246\350\247\243.md" +++ "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2205\357\274\232JDK\345\222\214cglib\345\212\250\346\200\201\344\273\243\347\220\206\345\216\237\347\220\206\350\257\246\350\247\243.md" @@ -14,27 +14,6 @@ * [对委托类进行代理](#对委托类进行代理) -转自 https://www.jianshu.com/u/668d0795a95b - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章将同步到我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《Spring和SpringMVC源码分析》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从spring基础入手,一步步地学习spring基础和springmvc的框架知识,并上手进行项目实战,spring框架是每一个Java工程师必须要学习和理解的知识点,进一步来说,你还需要掌握spring甚至是springmvc的源码以及实现原理,才能更完整地了解整个spring技术体系,形成自己的知识框架。 - -后续还会有springboot和springcloud的技术专题,陆续为大家带来,敬请期待。 - -为了更好地总结和检验你的学习成果,本系列文章也会提供部分知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - ## 前言 AOP的基础是Java动态代理,了解和使用两种动态代理能让我们更好地理解 AOP,在讲解AOP之前,让我们先来看看Java动态代理的使用方式以及底层实现原理。 diff --git "a/docs/java/currency/Java\345\271\266\345\217\221\346\214\207\345\215\2273\357\274\232\345\271\266\345\217\221\344\270\211\345\244\247\351\227\256\351\242\230\344\270\216volatile\345\205\263\351\224\256\345\255\227\357\274\214CAS\346\223\215\344\275\234.md" "b/docs/java/currency/Java\345\271\266\345\217\221\346\214\207\345\215\2273\357\274\232\345\271\266\345\217\221\344\270\211\345\244\247\351\227\256\351\242\230\344\270\216volatile\345\205\263\351\224\256\345\255\227\357\274\214CAS\346\223\215\344\275\234.md" index 4220389..55b43cb 100644 --- "a/docs/java/currency/Java\345\271\266\345\217\221\346\214\207\345\215\2273\357\274\232\345\271\266\345\217\221\344\270\211\345\244\247\351\227\256\351\242\230\344\270\216volatile\345\205\263\351\224\256\345\255\227\357\274\214CAS\346\223\215\344\275\234.md" +++ "b/docs/java/currency/Java\345\271\266\345\217\221\346\214\207\345\215\2273\357\274\232\345\271\266\345\217\221\344\270\211\345\244\247\351\227\256\351\242\230\344\270\216volatile\345\205\263\351\224\256\345\255\227\357\274\214CAS\346\223\215\344\275\234.md" @@ -59,7 +59,7 @@ return ((b == 0) || (b == -1 && a == 1)); } } - + @@ -181,7 +181,7 @@ Java内存模型没有具体讲述前面讨论的执行策略是由编译器,C } - +​ 假设有多个线程分别调用上面程序的三个方法,这个程序在语意上和下面程序等价: class VolatileFeaturesExample { @@ -203,7 +203,7 @@ Java内存模型没有具体讲述前面讨论的执行策略是由编译器,C } - +​ 如上面示例程序所示,对一个volatile变量的单个读/写操作,与对一个普通变量的读/写操作使用同一个监视器锁来同步,它们之间的执行效果相同。 @@ -226,21 +226,21 @@ Java内存模型没有具体讲述前面讨论的执行策略是由编译器,C class VolatileExample { int a = 0; volatile boolean flag = false; - + public void writer() { a = 1; // 1 flag = true; // 2 } public void reader() { - if (flag) { //3 - int i = a; //4 - …… - } - } + if (flag) { //3 + int i = a; //4 + …… + } + } } - +​ 假设线程A执行writer()方法之后,线程B执行reader()方法。根据happens before规则,这个过程建立的happens before 关系可以分为两类: @@ -350,7 +350,7 @@ volatile读的内存语义如下: } - +​ 针对readAndWrite()方法,编译器在生成字节码时可以做如下的优化: @@ -530,7 +530,7 @@ JVM中的CAS操作正是利用了上一节中提到的处理器提供的CMPXCHG 992362 1000000 75 - + @@ -542,7 +542,7 @@ JVM中的CAS操作正是利用了上一节中提到的处理器提供的CMPXCHG 从Java1.5开始JDK的atomic包里提供了一个类AtomicStampedReference来解决ABA问题。这个类的compareAndSet方法作用是首先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志,如果全部相等,则以原子方式将该引用和该标志的值设置为给定的更新值。 - + public boolean compareAndSet( V expectedReference,//预期引用 diff --git "a/docs/java/currency/Java\345\271\266\345\217\221\346\214\207\345\215\2274\357\274\232Java\344\270\255\347\232\204\351\224\201 Lock\345\222\214synchronized.md" "b/docs/java/currency/Java\345\271\266\345\217\221\346\214\207\345\215\2274\357\274\232Java\344\270\255\347\232\204\351\224\201 Lock\345\222\214synchronized.md" index d3d1b76..4a4fe79 100644 --- "a/docs/java/currency/Java\345\271\266\345\217\221\346\214\207\345\215\2274\357\274\232Java\344\270\255\347\232\204\351\224\201 Lock\345\222\214synchronized.md" +++ "b/docs/java/currency/Java\345\271\266\345\217\221\346\214\207\345\215\2274\357\274\232Java\344\270\255\347\232\204\351\224\201 Lock\345\222\214synchronized.md" @@ -21,24 +21,6 @@ * [参考资料](#参考资料) -**本文转载自并发编程网,侵删** - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章同步发于我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《Java并发指南》其中一篇,本文大部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何全面深入地学习Java并发技术,从Java多线程基础,再到并发编程的基础知识,从Java并发包的入门和实战,再到JUC的源码剖析,一步步地学习Java并发编程,并上手进行实战,以便让你更完整地了解整个Java并发编程知识体系,形成自己的知识框架。 - -为了更好地总结和检验你的学习成果,本系列文章也会提供一些对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - ## Java中的锁机制及Lock类 @@ -119,7 +101,7 @@ } } } - + 在ReentrantLock中,调用lock()方法获取锁;调用unlock()方法释放锁。 ReentrantLock的实现依赖于java同步器框架AbstractQueuedSynchronizer(本文简称之为AQS)。AQS使用一个整型的volatile变量(命名为state)来维护同步状态,马上我们会看到,这个volatile变量是ReentrantLock内存语义实现的关键。 下面是ReentrantLock的类图(仅画出与本文相关的部分): @@ -244,7 +226,7 @@ ReentrantLock分为公平锁和非公平锁,我们首先分析公平锁。 intel的手册对lock前缀的说明如下: 1. 确保对内存的读-改-写操作原子执行。在Pentium及Pentium之前的处理器中,带有lock前缀的指令在执行期间会锁住总线,使得其他处理器暂时无法通过总线访问内存。很显然,这会带来昂贵的开销。 - + 2. 从Pentium 4,Intel Xeon及P6处理器开始,intel在原有总线锁的基础上做了一个很有意义的优化:如果要访问的内存区域(area of memory)在lock前缀指令执行期间已经在处理器内部的缓存中被锁定(即包含该内存区域的缓存行当前处于独占或以修改状态),并且该内存区域被完全包含在单个缓存行(cache line)中,那么处理器将直接执行该指令。 3. 由于在指令执行期间该缓存行会一直被锁定,其它处理器无法读/写该指令要访问的内存区域,因此能保证指令执行的原子性。这个操作过程叫做缓存锁定(cache locking),缓存锁定将大大降低lock前缀指令的执行开销,但是当多处理器之间的竞争程度很高或者指令访问的内存地址未对齐时,仍然会锁住总线。 diff --git "a/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2175\357\274\232Spring\346\266\211\345\217\212\345\210\260\347\232\2049\347\247\215\350\256\276\350\256\241\346\250\241\345\274\217.md" "b/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2175\357\274\232Spring\346\266\211\345\217\212\345\210\260\347\232\2049\347\247\215\350\256\276\350\256\241\346\250\241\345\274\217.md" index 605b7a4..de7a74b 100644 --- "a/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2175\357\274\232Spring\346\266\211\345\217\212\345\210\260\347\232\2049\347\247\215\350\256\276\350\256\241\346\250\241\345\274\217.md" +++ "b/docs/java/design-parttern/\345\210\235\346\216\242Java\350\256\276\350\256\241\346\250\241\345\274\2175\357\274\232Spring\346\266\211\345\217\212\345\210\260\347\232\2049\347\247\215\350\256\276\350\256\241\346\250\241\345\274\217.md" @@ -10,22 +10,8 @@ * [享元模式](#享元模式) * [结构型模式总结](#结构型模式总结) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) - - - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 - -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star、fork哈 - -文章也将发表在我的个人博客,阅读体验更佳: - -> www.how2playlife.com + **设计模式**作为工作学习中的枕边书,却时常处于勤说不用的尴尬境地,也不是我们时常忘记,只是一直没有记忆。 diff --git "a/docs/java/jvm/\346\267\261\345\205\245\344\272\206\350\247\243JVM\350\231\232\346\213\237\346\234\2728\357\274\232Java\347\232\204\347\274\226\350\257\221\346\234\237\344\274\230\345\214\226\344\270\216\350\277\220\350\241\214\346\234\237\344\274\230\345\214\226.md" "b/docs/java/jvm/\346\267\261\345\205\245\344\272\206\350\247\243JVM\350\231\232\346\213\237\346\234\2728\357\274\232Java\347\232\204\347\274\226\350\257\221\346\234\237\344\274\230\345\214\226\344\270\216\350\277\220\350\241\214\346\234\237\344\274\230\345\214\226.md" index 8f6911b..63a5d1f 100644 --- "a/docs/java/jvm/\346\267\261\345\205\245\344\272\206\350\247\243JVM\350\231\232\346\213\237\346\234\2728\357\274\232Java\347\232\204\347\274\226\350\257\221\346\234\237\344\274\230\345\214\226\344\270\216\350\277\220\350\241\214\346\234\237\344\274\230\345\214\226.md" +++ "b/docs/java/jvm/\346\267\261\345\205\245\344\272\206\350\247\243JVM\350\231\232\346\213\237\346\234\2728\357\274\232Java\347\232\204\347\274\226\350\257\221\346\234\237\344\274\230\345\214\226\344\270\216\350\277\220\350\241\214\346\234\237\344\274\230\345\214\226.md" @@ -12,43 +12,11 @@ * [编译优化技术](#编译优化技术) * [java与C/C++编译器对比](#java与cc编译器对比) * [参考文章](#参考文章) - * [微信公众号](#微信公众号) - * [Java技术江湖](#java技术江湖) - * [个人公众号:黄小斜](#个人公众号:黄小斜) - - -本文转自互联网,侵删 - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章将同步到我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《深入理解JVM虚拟机》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从入门到进阶,一步步地学习JVM基础知识,并上手进行JVM调优实战,JVM是每一个Java工程师必须要学习和理解的知识点,你必须要掌握其实现原理,才能更完整地了解整个Java技术体系,形成自己的知识框架。 - -为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - - - - - + ## [java编译期优化](https://www.cnblogs.com/LeonNew/p/6187411.html) - - - - java语言的编译期其实是一段不确定的操作过程,因为它可以分为三类编译过程: 1.前端编译:把_.java文件转变为_.class文件 2.后端编译:把字节码转变为机器码 diff --git "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2722\357\274\232JVM\345\236\203\345\234\276\345\233\236\346\224\266\345\237\272\346\234\254\345\216\237\347\220\206\345\222\214\347\256\227\346\263\225.md" "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2722\357\274\232JVM\345\236\203\345\234\276\345\233\236\346\224\266\345\237\272\346\234\254\345\216\237\347\220\206\345\222\214\347\256\227\346\263\225.md" index f1e1f3c..53a7a86 100644 --- "a/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2722\357\274\232JVM\345\236\203\345\234\276\345\233\236\346\224\266\345\237\272\346\234\254\345\216\237\347\220\206\345\222\214\347\256\227\346\263\225.md" +++ "b/docs/java/jvm/\346\267\261\345\205\245\347\220\206\350\247\243JVM\350\231\232\346\213\237\346\234\2722\357\274\232JVM\345\236\203\345\234\276\345\233\236\346\224\266\345\237\272\346\234\254\345\216\237\347\220\206\345\222\214\347\256\227\346\263\225.md" @@ -29,27 +29,7 @@ * [微信公众号](#微信公众号) * [Java技术江湖](#java技术江湖) * [个人公众号:黄小斜](#个人公众号:黄小斜) - - -本文转自互联网,侵删 - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章将同步到我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《深入理解JVM虚拟机》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从入门到进阶,一步步地学习JVM基础知识,并上手进行JVM调优实战,JVM是每一个Java工程师必须要学习和理解的知识点,你必须要掌握其实现原理,才能更完整地了解整个Java技术体系,形成自己的知识框架。 - -为了更好地总结和检验你的学习成果,本系列文章也会提供每个知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - + * ## JVM GC基本原理与GC算法 @@ -248,9 +228,10 @@ Survivor 区(S0 和 S1):作为年轻代 GC(Minor GC)周期的一部分 System.out.println("Main is completed."); } - - - + + +​ +​ protected void finalize() { System.out.println("Rest in Peace!"); @@ -271,9 +252,10 @@ Survivor 区(S0 和 S1):作为年轻代 GC(Minor GC)周期的一部分 GCScope t; static int i = 1; - - - + + +​ +​ public static void main(String args[]) { GCScope t1 = new GCScope(); @@ -281,33 +263,38 @@ Survivor 区(S0 和 S1):作为年轻代 GC(Minor GC)周期的一部分 GCScope t2 = new GCScope(); GCScope t3 = new GCScope(); - - - + + +​ +​ // No Object Is Eligible for GC - - - + + +​ +​ t1.t = t2; // No Object Is Eligible for GC t2.t = t3; // No Object Is Eligible for GC t3.t = t1; // No Object Is Eligible for GC - - - + + +​ +​ t1 = null; // No Object Is Eligible for GC (t3.t still has a reference to t1) - - - + + +​ +​ t2 = null; // No Object Is Eligible for GC (t3.t.t still has a reference to t2) - - - + + +​ +​ t3 = null; // All the 3 Object Is Eligible for GC (None of them have a reference. @@ -319,9 +306,10 @@ Survivor 区(S0 和 S1):作为年轻代 GC(Minor GC)周期的一部分 // reference) } - - - + + +​ +​ protected void finalize() { System.out.println("Garbage collected from object" + i); @@ -329,17 +317,19 @@ Survivor 区(S0 和 S1):作为年轻代 GC(Minor GC)周期的一部分 i++; } - - - + + +​ +​ class GCScope { GCScope t; static int i = 1; - - - + + +​ +​ public static void main(String args[]) { GCScope t1 = new GCScope(); @@ -347,9 +337,10 @@ Survivor 区(S0 和 S1):作为年轻代 GC(Minor GC)周期的一部分 GCScope t2 = new GCScope(); GCScope t3 = new GCScope(); - - - + + +​ +​ // 没有对象符合GC t1.t = t2; // 没有对象符合GC @@ -357,21 +348,24 @@ Survivor 区(S0 和 S1):作为年轻代 GC(Minor GC)周期的一部分 t2.t = t3; // 没有对象符合GC t3.t = t1; // 没有对象符合GC - - - + + +​ +​ t1 = null; // 没有对象符合GC (t3.t 仍然有一个到 t1 的引用) - - - + + +​ +​ t2 = null; // 没有对象符合GC (t3.t.t 仍然有一个到 t2 的引用) - - - + + +​ +​ t3 = null; // 所有三个对象都符合GC (它们中没有一个拥有引用。 @@ -381,9 +375,10 @@ Survivor 区(S0 和 S1):作为年轻代 GC(Minor GC)周期的一部分 // 形成了一个由对象组成的环形的岛,而没有任何外部的引用。) } - - - + + +​ +​ protected void finalize() { System.out.println("Garbage collected from object" + i); diff --git "a/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\244\215\344\271\240.md" "b/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\244\215\344\271\240.md" new file mode 100644 index 0000000..7db63b4 --- /dev/null +++ "b/docs/operating-system/\346\223\215\344\275\234\347\263\273\347\273\237\345\244\215\344\271\240.md" @@ -0,0 +1,2285 @@ +# 操作系统复习 + +> 本文由本人学习过程中总结,难免有纰漏,欢迎交流学习 + +## 目录 + +#### [第1章 操作系统引论](#第1章 操作系统引论) + +#### [第2章 进程管理](#第2章 进程管理) + +#### [第3章 处理机调度与死锁](#第3章 处理机调度与死锁) + +#### [第4章 存储器管理](#第4章 存储器管理) + +#### [第5章 设备管理](#第5章 设备管理) + +#### [第6章 文件管理](#第6章 文件管理) + +#### [附习题及答案](#附习题及答案) + +
+
+ + + +## 第1章 操作系统引论 + +操作系统的地位:紧贴系统硬件之上,所有其他软件之下(是其他软件的共同环境) + +### 操作系统目的/目标 + + 使计算机系统更易于使用(方便性)。 + 以一种效率的方式使用资源(有效性). + 采用模块化结构,易于增、删、改(可扩充性)。 + 要求统一开放的环境,能通过网络集成化并正确、有效地协同工作,实现应用程序的移植(开放性) + + + +### 操作系统的作用 + + Os作为用户与计算机硬件系统之间的接口。 + OS作为计算机系统资源的管理者。 + OS用作扩充机器 + + + +### 操作系统的基本特征 + + 并发(concurrence) + 共享(sharing) + 虚拟(virtual) + 异步性(asynchronism) + + + +并发(concurrence):指在计算机系统中同时存在着多道运行的程序(进程) + 宏观上:多道程序同时在执行 + 微观上:任何时刻只有一道程序在执行,即微观上多道程序在CPU上轮流(交替)执行(单机) +并行(parallel): 与并发相似,指多道程序在同一时刻执行, + 但需多个硬件支持。 + 注:1、程序的并发执行能有效改善系统资源的利用率,但使系统复杂化,因此操作系统必须对并发活动进行控制和管理。 + 2、并发是操作系统最重要的特征,其它特征均以并发为前提。 + +共享(sharing)系统中的资源不再为某道程序所独占,而 + 是供多道程序共同使用。 +资源共享方式:互斥共享式、同时访问式 + +并发和共享是操作系统的两个最基本的特征 + 二者互为存在条件: + 资源的共享是以程序的并发执行为条件。 + 程序的并发执行也以资源的共享为条件。 + +虚拟(virtual)把一个物理实体映射为若干个对应的逻辑实体——分时或分空间。 +虚拟是操作系统管理系统资源的重要手段,可提高资源利用率。如:虚拟处理机、虚拟存储器、虚拟设备 + +异步性(asynchronism)也称不确定性,指进程在执行中,其执行时间、顺序、向前推进的速度和完成的时间等都是不可预知的。 + +#### 操作系统的功能 + +##### 处理机管理 + +处理机管理的主要任务: +是对处理机进行分配 +对处理机运行进行有效的控制和管理 +注:处理机的分配和运行以进程为基本单位,因此对处理机的管理可归结为对进程的管理 +处理机管理的功能 +进程控制 +进程同步 +进程通信 +调度 + +##### 存储器管理 + +主要任务 +为多道程序的运行提供良好的环境 +方便用户使用存储器 +提高存储器的利用率 +从逻辑上扩充内存 +功能 +内存分配 +内存保护 +地址映射 +内存扩充 + + + +##### 设备管理 + +主要任务 +完成用户提出的I/O请求 +为用户分配I/O设备 +提高I/O设备的利用率及速度 +方便用户使用I/O设备 +功能 +缓冲管理 +设备分配 +设备处理 +虚拟设备 + +##### 文件管理 + +主要任务 +对用户文件和系统文件进行管理 +方便用户使用文件 +保证文件的安全性 +功能 +文件存储空间的管理 +目录管理 +文件的读、写管理 +文件的共享与保护 + +##### 用户接口 + +主要任务 +方便用户使用操作系统 +功能 +命令接口 +程序接口(系统调用) +图形接口 + +##### 单道批处理系统 + +1、工作流程: + (1)作业合成一批输入到外存上,同时在系统中配上监控程序。 + (2)monitor将作业逐个送入内存并运行。 +2、特征:(1)自动性 (2)顺序性 (3)单道性 +3、优点:减少了人工操作的时间,提高机器的利用率和系统吞吐量。 +4、缺点:对某些作业来说,当它发出输入/输出请求后,CPU必须等待I/O的完成,特别因为I/O设备的低速性,从而使机器的利用率很低。 + +##### 多道批处理系统 + +特征:(1)调度性 (2)无序性 (3)多道性 +优点:(1)资源的利用率高 (2)系统吞吐量大 +缺点:(1)平均周转周期长 (2)无交互能力 +需解决问题 + 处理机管理、内存管理、I/O设备管理、文件及作业管理问题 +操作系统的形成 + 为解决上述问题,在多道程序系统中增设一组软件以有效加以解决,同时增设方便用户使用计算机的软件,这样便形成了操作系统。 +操作系统:是一组控制和管理计算机硬件和软件资源,合理地组织计算工作流程,以及方便用户使用的程序集合。 + +##### 批处理操作系统优缺点 + +优点: +作业流程自动化; +效率高 +吞吐量高 +缺点: +无交互手段 +调试程序困难 + +##### 实时系统 + +实时操作系统:指系统能及时(或即时)响应外部事件的请求,并控制所有实时任务协调一致地运行。 +实时操作系统的应用领域 + 有实时要求(有严格确定的时间限制)的领域(过程控制及事务处理) +实时系统分类: + (1)实时控制系统 (2)实时信息处理系统 +实时操作系统的主要特征:实时性和可靠性; + 多路性、独立性、交互性 + +##### 三种基本的操作系统 + +三种基本的操作系统 +批处理操作系统、分时操作系统和实时操作系统 +通用操作系统 +如果一个操作系统兼有批处理、分时和实时系统三者或二者的功能 ,则称该操作系统为通用操作系统。 + +### 微机操作系统 + +###### 微机操作系统的特征 + +应用领域:事务处理、个人娱乐, +系统要求:使用方便、支持多种硬件和外部设备(多媒体设备、网络、远程通信)、效率不必很高。 + +###### 常用的微机操作系统 + +单用户单任务:CP/M,MS- DOS +单用户多任务:OS/2, Windows +多用户多任务:UNIX, Solaris x86, Linux。 + +### 多处理机操作系统 + +###### 多处理机系统引入原因 + +增加系统的吞吐量 +节省投资 +提高系统的可靠性 + +###### 多处理机系统的类型 + +紧密耦合MPS +松散耦合MPS + +###### 多处理机操作系统的类型 + +非对称多处理模式 +对称多处理模式 + +### 网络操作系统 + +###### 计算机网络的类型 + +###### 网络OS的模式 + +客户/服务器模式 +对等模式 + +###### 网络OS的功能 + +通信、资源管理、网络服务、网络管理、互操作能力 + +#### 并行系统 + +##### 并行系统: 多于一个CPU的多处理机系统。 + +##### 并行系统的优点 + +增大吞吐量:能在更短的时间内完成更多的工作。 +经济:共享许多设备(内存,总线等) +提高可靠性:当一个CPU出故障时,会将部分工作分给其它CPU,从而不会使整个系统停机,只是降低了速度而已。 + +### 分布式操作系统 + +##### 分布式系统:能将任务处理和控制进行分散/分布的系统(相对于集中式)。 + +##### 分布式系统的两种环境:多处理系统;多计算机系统。 + +##### 分布式OS与网络OS的比较 + +​ 1.分布性 2.并行性 3.透明性 +​ 4.共享性 5.键壮性 +​ 分布式系统基本特征---处理上的分布,即功能和任务的分布。 + +### 模块化操作系统结构 + +OS是采用“模块化程序设计”技术,按其功能划分为若干个独立的模块,管理相应的功能,同时规定好各模块之间的接口,以实现其交互,对较大模块又可按子功能进一步细分下去。所以这种OS称为模块化OS结构。 + +##### 优点 + +提高了OS设计的正确性、可理解性和可维护性 +增强了OS的可适用性 +加速了OS的开发过程 + +##### 缺点: + +模块及接口划分较困难 +未区别共享资源和独占资源 +由于管理的差异,使OS结构变得不够清晰 + +##### Linux(多用户、多任务OS) + +### 微内核的OS结构 + +##### 微内核技术的主要思想 + +​ 在OS内核中只留下一些最基本的功能,而将其他服务分离出去,由工作在用户态下的进程来实现,形成所谓“客户/服务器”模式。客户进程可通过内核向服务器进程发送请求,以取OS的服务。 + +##### 微内核 + +​ 精心设计的,能实现现代OS核心功能的小型内核,它小而精炼,运行在核心态下,开机后常驻内存,不会因内存紧张而换出,它为构建通用OS提供了一个重要基础。 + +##### 微内核的基本功能 + +进程管理 +存储器管理 +进程通信管理 +I/O设备管理 + +##### 特点 + +小而精练 +系统的灵活性和可扩充性好 +系统的可靠性高 +适用于分布式系统 + +##### windows 2000/XP、UNIX、嵌入式OS + + + + + +## 第2章 进程管理 + +### 程序顺序执行 + +##### 程序执行时,必须按照某种先后次序逐个执行 + +Eg s1: a:=x+y + s2: b:=a-5 + s3: c:=b+1 + +##### 程序顺序执行时有如下特征: + +顺序性 +封闭性 +可再现性 + +### 程序并发执行 + +##### 程序并发执行时的特征 + +间断性 +失去封闭性 +不可再现性 + + +### 进程的定义、特征 + +#### 1、进程process的定义 + + 1)进程是程序的一次执行。 + 2)进程是一个程序及其数据在处理机上顺序执行时所发生的活动。 + 3)进程是程序在一个数据集合上的运行过程,它是系统进行资源分配和调度的一个独立单位。 + +##### 注:进程与程序的主要区别 + +#### 进程与程序的主要区别 + +1)程序是指令的有序集合,其本身没有任何运行的含义,它是一个静态的概念。而进程是程序在处理机上的一次执行过程,它是一个动态概念。 +2)程序的存在是永久的。而进程则是有生命期的,它因创建而产生,因调度而执行,因得不到资源而暂停,因撤消而消亡。 +3)程序仅是指令的有序集合。而进程则由程序段、相关数据段和进程控制块(PCB)组成。 +4)进程与程序之间不是一一对应。 + +| | 程序 | 进程 | +| ---------- | :-------------------------------------------: | :---------------- | +| 概念 | 静态 | 动态 | +| 所在存储器 | 外存 | 内存 | +| 存在时间 | 永久 | 有生命期 | +| 组成 | 有序指令 | 程序段,数据段,PCB | +| 对应关系 | 一个程序可对应多个进程 一个进程可对应多个程序 | Same | + +#### 进程process的基本特征 + + + +##### (1)结构特征 + +​ 为了描述和记录进程的运动变化过程,并使之能正确运行,每个进程都应配置了一个进程PCB。所以,从结构上看,每个进程(进程实体)都是由程序段、相关数据段及进程控制块(PCB)组成。 +注:1.在早期UNIX版本中称进程的三个组成部分为“进程映像” +​ 2.区别进程实体和进程 + +##### (2)动态性 + +​ 进程的实质是程序在处理机上的一次执行过程,因此是动态性的。所以动态性是进程的最基本的特征。同时动态性还表现在 进程则是有生命期的,它因创建而产生,因调度而执行,因得不到资源而暂停,因撤消而消亡。 + +##### (3)并发性 + +​ 指多个进程实体同时存在于内存中,能在一段时间内同时运行。 +​ 引入进程的目的就是为了使进程能并发执行,以提高资源利用率,所以并发性是进程的重要特征,也是OS的重要特征。 + +##### (4)独立性 + +​ 指进程是一个能独立运行的基本单位,也是系统进行资源分配和调度的独立单位。 + +##### (5)异步性 + +​ 指进程以各自独立的、不可预知的速度向前推进。 + +### 二、 进程状态 + +#### 进程的5种状态(三种基本状态) + +##### new新建/创建:进程正在创建中的状态 + +##### ready就绪: 进程已获得了除处理机以外的所有资源,等待分配处理机执行的等待状态。 + +##### running运行/执行: 当一个进程获得必要的资源并正在处理机上执行的状态。 + +##### waiting等待/阻塞: 正在执行的进程由于发生某事件而暂时无法执行下去,此时进程所处的状态。 + +##### terminated终止/撤消/退出:进程执行完毕,释放所占资源的状态。 + +进程在运行期间并非固定处于某个状态,而是不断从一个状态转换到另一个状态。 + +#### 三种基本状态转换: + +##### (1) 就绪→执行 + +1. 处于就绪状态的进程,当进程调度程序为之分配了处理机后 +2. 该进程便由就绪状态转变成执行状态。 + +##### (2) 执行→就绪 + + +处于执行状态的进程在其执行过程中,因分配给它的一个时间 +片已用完而不得不让出处理机,于是进程从执行状态转变成就 +绪状态。 + +##### (3) 执行→阻塞 + + +正在执行的进程因等待某种事件发生而无法继续执行时,便从执行状态变成阻塞状态。 + +##### (4) 阻塞→就绪 + + +处于阻塞状态的进程,若其等待的事件已经发生,于是进程由阻塞状态转变为就绪状态。 + +### 进程的挂起状态 + +​ 在某些系统中,为了更好地管理和调度进程,引入了挂起状态: + +#### 挂起状态/静止状态: + +​ 程序在运行期间,由于某种需要,往往要将进程暂停执行,使其静止下来,以满足其需要。这种静止状态就称为进程的挂起状态。 + +#### 引起挂起状态的原因 + +##### 终端用户的需要: + +终端用户在自己程序运行中发现问题要求使正在执行的进程暂停执行而使进程处于挂起状态。 + +##### 父进程的需要: + +父进程为了考查和修改某个子进程,或者协调各子进程间的活动,需要将该子进程挂起。 + +##### 操作系统的需要: + +操作系统为了检查运行中的资源使用情况或进行记帐,而将某些进程挂起。 + +##### 对换的需要: + +为了提高内存的利用率,而将内存中某些进程挂起,以调进其它程序运行。 + +##### 负荷调节的需要: + +由于工作负荷较重,而将一些不重要的进程挂起,以保证系统能正常运行(实时操作系统) + +#### 具有挂起状态的进程状态 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143706070-1351390210.png) + + +### 进程控制块Process Control Block (PCB) + +进程控制块PCB + 是操作系统为了管理和控制进程的运行而为每一个进程定义的一个数据结构,它记录了系统管理进程所需的全部信息。系统根据PCB而感知进程的存在,PCB是进程存在的唯一标志。 + +#### 1、进程控制块PCB的作用 + +1. 是OS对并发执行的进程进行控制和管理的根据。 +2. 也是系统用来感知进程存在的根据,即PCB是进程存在的唯一标志。 + +#### 2、进程控制块PCB中的信息 + + 根据操作系统的要求不同,PCB所包含信息有些不同,但通常包含以下信息: + +##### 进程标志符: + +由系统创建进程时分配给进程的唯一标识号,通常为一整数,称为进程号,用于区分不同的进程。其所属用户通常也为一整数,称为用户号。 + +##### 处理机状态(断点信息): + +即处理机中各种寄存器(通用寄存器、PC、PSW等)的内容 + +##### 进程调度: + +记录了进程调度的相关信息(状态、优先级、事件等)。 + +##### 进程控制: + +记录了系统对进程控制的信息(程序和数据的地址、同步机制、资源清单、链接指针) + +#### 3、进程控制块PCB的组织方式 + + 在一个系统中,通常存在着许多进程,它们所处的状态不同,为了方便进程的调度和管理,需要将各进程的PCB用适当方法组织起来。目前常用的组织方式有: + +##### 链接方式 图示 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143714207-1275160792.png) + + +​ 把同一状态的PCB链接成一个队列,这样就形成了就绪队列、阻塞队列等。 + +##### 索引方式 图示 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143721182-217202540.png) + + +​ 将同一状态的进程组织在一个索引表中,索引表的表项指向相应的PCB ,不同状态对应不同的索引表。 + +### 进程的控制 + +进程控制是进程管理中最基本的功能,即对系统中所有的进程实施有效的管理,其功能包括进程的创建、撤消、阻塞与唤醒等,这些功能一般是由操作系统的内核来完成。 + +#### OS 内核: + +在现代OS中,常把一些功能模块(与硬件紧密相关的、常用设备的驱动程序及运行频率较高的)放在紧靠硬件的软件层次中,加以特殊保护,同时把它们常驻内存,以提高OS的运行效率,这部分功能模块就称OS的内核。内核是基于硬件的第一层软件扩充,它为系统控制和管理进程提供了良好的环境。 + +#### 处理机的执行状态 + +为防止OS及其关键数据(如PCB等)不被用户有意或无意破坏,通常将处理机的执行状态分为两种 + +| 处理机状态 | 特权(执行指令,访问) | 程序 | +| -------------- | ---------------------------- | -------- | +| 系统态(核心态) | 较高(一切指令,所有R及存储区) | OS内核 | +| 用户态 | 较低(规定指令,指定R及存储区) | 用户程序 | + +### 进程创建 + +一个进程可以创建若干个新进程,新创建的进程又可以创建子进程,为了描述进程之间的创建关系,引入了进程图(如下图所示:) + +#### 1、进程图: + +又称为进程树或进程家族树,是描述进程家族关系的一棵有向树。 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143729018-341083733.png) + + +#### 2、引起进程创建的事件 + + 在多道程序环境中,只有进程才可以在系统中运行。为了使一个程序能运行,必须为它创建进程。导致进程创建的事件有: + 用户登录:在分时OS中,用户在终端键入登录命令后,如是合法用户,则系统为该终端创建一进程,并插入就绪队列。 + 作业调度:在批处理OS中,当按某算法调度一作业进内存,系统为之分配必要资源,同时为该作业创建一进程,并插入就绪队列。 + 提供服务:在程序运行中,若用户需某种服务,则系统创建一进程为用户提供服务,并插入就绪队列。 + 应用请求:在运行中,由于应用进程本身的需求,自己创建一进程,并插入就绪队列。 + +#### 3、进程的创建 + +操作系统一旦发现了要求创建进程的事件后,便调用进程创建原语create()按以下过程创建一新进程: + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143735227-1134513950.png) + + +### 二、进程的撤消 + + 一个进程在完成其任务后,应加以撤消,以便及时释放其占有的各类资源。 + +#### 1、导致进程撤消的事件 + +进程正常结束 +进程异常结束 +外界干预 + 如果系统中发生了要求撤消进程的事件,OS便调用撤消原语去撤消进程。 + +#### 2、撤消原语可采用2种撤消策略: + +只撤消指定的进程 +撤消指定进程及其所有的子孙进程 + +#### 3、进程撤消的过程 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143742218-1630570027.png) + + +### 三、进程的阻塞与唤醒 + + 当一个进程期待的事件尙未出现时,该进程调用阻塞原语block()(功能:将进程由执行状态转为阻塞状态)将自己阻塞起来。对于处于阻塞状态的进程,当该进程期待的事件出现时,由其它相关进程调用唤醒原语wakeup()(功能:将进程由阻塞状态变为就绪状态)将阻塞的进程唤醒,使其进入就绪状态。 + +#### 1、引起进程阻塞和唤醒的事件 + +1. 请求系统服务 +2. 启动某种操作 +3. 新数据尚未到达 +4. 无新工作可做 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143759957-1356523466.png) + +#### 四、进程的挂起与激活 + +​ 当引起进程挂起的事件发生时,系统就将利用挂起原语suspend()将指定进程或处于阻塞状态的进程挂起。当发生激活进程的事件时,系统就将利用激活原语active()将指定进程激活。 + +##### 1、引起进程的挂起与激活的事件 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143826260-1393300638.png) + + +### 进程同步 + +进程同步是指对多个相关进程在执行次序上进行协调,它的目的是使系统中诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性;或系统中诸进程之间在逻辑上的相互制约的关系(直接的-同步;间接的—互斥)。 +用来实现同步的机制称为同步机制。如:信号量机制;管程机制。 + +#### 进程同步的基本概念 + +两种形式的制约关系 +临界资源、临界区 +同步机制应遵循的规则 + +#### 信号量机制 + +整型信号量 +记录型信号量 +AND型信号量集、一般信号量集 + +#### 信号量的应用 + +信号量实现进程互斥 +信号量描述进程间的前趋关系 + +#### 一、进程同步的基本概念 + +##### 1、两种形式的制约关系 + +系统中诸进程之间在逻辑上存在着两种制约关系: +直接制约关系(进程同步):即为完成同一个任务的诸进程间,因需要协调它们的工作而相互等待、相互交换信息所产生的直接制约关系。 +间接制约关系(进程互斥) :是进程共享独占型资源而必须互斥执行的间接制约关系。 +同步与互斥比较 + +| 同 步 | 互 斥 | +| ------------------------------------------------------------ | ---------------------------------- | +| 进程-进程 | 进程-资源-进程 | +| 时间次序上受到某种限制 | 竞争到某一物理资源时不允许进程工作 | +| 相互清楚对方的存在及作用,交换信息 | 不一定清楚其进程情况 | +| 往往指有几个进程共同完成一个任务 | 往往指多个任务多个进程间通讯制约 | +| 例:生产与消费之间,发送与接受之间,作者与读者之间,供者与用者之间 | 例:交通十字路口,单轨火车的拨道岔 | + +##### 2、临界资源、临界区 + +一次只允许一个进程使用的资源称为临界资源,如打印机,绘图机;变量,数据等,诸进程间采取互斥方式式实现对这种临界资源的共享,从而实现并行程序的封闭性。 +例:有两个进程A和B,它们共享一个变量x,且两个进程按以下方式对变量X进行访问和修改: +A: R1=X; + R1=R1+1; + X=R1; +B: R2=X; + R2=R2+1; + X=R2; + 其中R1和R2为处理机中的两个寄存器。A与B均对X+1,即X+2。 +若按另一顺序对变量进行修改: + +A: R1=X; +B: R2=X; +A: R1=R1+1; + X=R1; +B: R2=R2+1; + X=R2; +结果x只加了1. + +(1)变量X必需按临界资源处理。 +(2)每个进程中访问临界资源的那段代码称为临界区 + + 为了保证临界资源的正确使用,可以把临界资源的访问过程分成以下几部分: + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143833694-226812400.png) + + +进入区—增加在临界区前面的一段代码,用于检查欲访问的临界资源此刻是否被访问。 +退出区—增加在临界区后面的一段代码,用于将临界资源的访问标志恢复为未被访问标志。 +剩余区—进程中除了进入区、临界区及退出区之外的其余代码。 + +###### 要进入临界区的若干进程必须满足: + +(1)一次只允许一个进程进入临界区 +(2)任何时候,处于临界区的进程不得多于一个 +(3)进入临界区的进程要在有限的时间内退出 +(4)如果不能进入自己的临界区,则应让出处理机资源 + +###### 解决临界区(互斥)问题的几类方法: + +> 同步机制 + +(1)软件方法 +(2)硬件方法 +(3)P-V操作 + +##### 3、同步机制应遵循的规则 + +###### 有空让进(空闲让进): + +当无进程处于临界区时,表明临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入自己的临界区,以有效地利用临界资源。 + +###### 互斥(忙则等待): + +当已有进程进入临界区时,表明临界资源正在被访问,因而其他试图进入临界区的进程必须等待,以保证对临界资源的互斥访问 + +###### 有限等待: + +对要求访问临界资源的进程,应保证在有限时间内能进入自己的临界区,以免陷入“死等”状态. + +###### 让权等待: + +当进程不能进入自己的临界区时,应立即释放处理机,以免进程陷入“忙等”。 + +#### 二、信号量机制 + +n信号量机制是荷兰科学家E.W.Dijkstra在1965年提出的一种同步机制,也称为P、V操作。由最初的整型信号量发展为记录型信号量,进而发展为信号量集。 + +n整型信号量 + +n记录型信号量 + +信号量集 (AND信号量集、一般信号量集) + +n基本思想 + +​ 1、设置一个代表资源数目的整型变量value(资源信号量) + +​ 2、设置一链表L用于链接所有等待的进程 + +§记录型信号量的数据结构 + +​ Type semaphore=record + +​ value:integer; + +​ L: list of process; + +​ end + +§wait和signal操作描述: + +​ wait(S): S.value:=S.value-1; + +​ if S.value<0 then block(S.L); + +​ signal(S): S.value:=S.value+1; + +​ if S.value£0 then wakeup(S.L); + +做到“让权等待”。 + +#### 三、信号量的应用 + +##### 利用信号量实现进程互斥(进程互斥) + +利用信号量可以方便地解决临界区问题(进程互斥)。为临界资源设置一互斥信号量mutex,初值为1,则实现进程P1和P2互斥的描述: + +P1进程 + +​ wait(mutex); + +​ critical section; + +​ signal(mutex); + + + +P2进程 + +​ wait(mutex); + +​ critical section; + +​ ignal(mutex); + +### 1、生产者消费者问题 + +#### 设置两个同步信号量及一互斥信号量 + +empty:说明空缓冲单元的数目,其初值为有界缓冲区的大小n。 +Full: 说明满缓冲单元的数目(即产品数目),其初值为0. +Mutex: 说明该有界缓冲区是一临界资源,必须互斥使用, + 其初值为1。 + +#### “生产者—消费者”问题的同步算法描述 + + semaphore full=0; / 表示满缓冲区的数目 / + semaphore empty=n; / 表示空缓冲区的数目 / + semaphore mutex=1; / 表示对缓冲区进程操作的互斥信号量 / +Main() +{ + cobegin + producer(); + consumer(); + coend + } + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143843878-843256517.png) + + +#### “生产者-消费者”问题中应注意 + +1. 互斥信号量的P,V操作在每一程序中必须成对出现. +2. 资源信号量(full,empty)也必须成对出现,但可分别处于不同的程序中. +3. 多个P操作顺序不能颠倒. +4. 先执行资源信号量的P操作,再执行互斥信号量的P操作,否则可能引起进程死锁. +5. 它是一个同步问题: + (1)消费者想要取产品,有界缓冲区中至少有一个单元是满的。 + (2)生产者想要放产品,有界缓冲区中至少有一个是空的。 +6. 它是一互斥问题: + 有界缓冲区是临界资源,因此,各生产者进程和各消费者进程必须互斥执行。 + +### 2、“哲学家进餐”问题 + + semaphore stick[5]={1,1,1,1,1}; / 分别表示5支筷子 / + Main() +{ + cobegin + philosopher(0); + philosopher(1); + philosopher(2); + philosopher(3); + philosopher(4); + coend + } + +#### 第i个哲学家的活动算法 + +philosopher(int i) + +{ + while(true) + { + 思考; + p(stick[i]); + P(stick[(i+1)%5]); + 进餐; + V(stick[i]); + V(stick[(i+1)%5]); +} +} + +#### 说明: + +1、此算法可以 保证不会有相邻的两位哲学家同时进餐 。 + +2、若五位哲学家同时饥饿而各自拿起了左边的筷子,这使五个信号量stick均为0,当他们试图去拿起右边的筷子时,都将因无筷子而无限期地等待下去,即 可能会引起死锁 。 + +### 3、“读者—写者”问题 + +#### “读者—写者”问题的同步算法描述 + +##### 设置一个共享变量和两个信号量: + +共享变量Readcount:记录当前正在读数据集的读进程数目, + 初值为0。 +读互斥信号量Rmutex :表示读进程互斥地访问共享变量 + readcount,初值为1. +写互斥信号量wmutex:表示写进程与其它进程(读、写) + 互斥地访问数据集,初值为1. + +##### “读者—写者”问题的同步算法描述 + + semaphore rmutex=1; + semaphore wmutex=1; + int readcount=0; +Main() +{ + cobegin + reader(); + writer(); + coend + } + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143853267-456259474.png) + + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143857737-723730834.png) + + +### 管程的基本概念 + +### 进程通信—高级通信 + +### 线程 + +| | 进程 | 线程 | +| -------------------------- | ------------------------------------------------------------ | ------------------------------------------------------------ | +| 引入 目的 | 能并发执行 , 提高资源的利用率和系统吞吐量 . | 提高并发执行的程度,进一步提高资源的利用率和系统吞吐量 . | +| 并发性 | 较低 | 较高 | +| 基本属性 (调度) | 资源拥有的基本单位 — 进程 独立调度 / 分派的基本单位 — 进程 | 资源拥有的基本单位 — 进程 独立调度 / 分派的基本单位 — 线程 | +| 基本状态 | 就绪 ; 执行 ; 等待 | 就绪 ; 执行 ; 等待 | +| 拥有资源 | 资源拥有的基本单位 — 进程 | 资源拥有的基本单位 — 进程 | +| 系统开销 | 创建 / 撤消 / 切换 时空开销较大 | 创建 / 撤消 / 切换时空开销较小 | +| 系统操作 | 创建 , 撤消 , 切换 | 创建 , 撤消 , 切换 | +| 存在标志 | 进程控制块 PCB | 进程控制块 PCB ,线程控制块 TCB | +| 关系 | 单进程单线程 ; 单进程多线程 ; 多进程单线程 ; 多进程多线程 | | + +http://blog.sina.com.cn/s/blog_5a2bbc860101gedc.html + + + +## 第3章 处理机调度与死锁 + +​ 在多道程序环境下,一个作业从提交到执行,通常都要经历多级调度,如高级调度、低级调度、中级调度等。而系统的运行性能在很大程序上取决于调度,因此调度便成为多道程序的关键。 + +​ 在多道程序环境下,由于多个进程的并发执行,改善了系统资源的利用率并提高了系统的处理能力,然而,多个进程的并发执行也带来了新的问题----死锁。 + +### 一、调度的层次 + +一个作业从提交开始,往往要经历三级调度:高级调度、低级调度、中级调度。 + +#### 1、高级调度(长程/作业/宏观调度) + +(1)从外存后备队列中选择作业进入就绪队列或挂起就绪. +(2)在批处理系统中,大多配有作业调度,但在分时系统及实时系统中,一般不配置. +(3)作业调度执行频率很低,通常为几分钟一次,甚至更久。 + +#### 2、低级调度(短程/CPU/进程/微观调度) + +(1)主要任务就是从就绪队列中选择一个进程来执行并分配处理机。 +(2)是OS中最基本的调度。 +(3)调度频率非常高,一般几十毫秒一次。 +(4)常采用非抢占(非剥夺)方式和抢占(剥夺)方式两种。 +(5)引起进程调度的因素: +进程正常终止或导常终止 +正在执行的进程因某种原因而阻塞 +在引入时间片的系统中,时间片用完。 +在抢占调度方式中,就绪队列中某进程的优先权变得比当前正执行的进程高。 + +#### 非抢占式进程调度、抢占式进程调度 + +##### 非抢占方式: + +一旦把处理机分配给某进程后,便让该进程一直执行,直到该进程完成或因某事件而被阻塞,才再把处理机分配给其它进程,决不允许某进程抢占已分配出去的处理机。 + 实现简单,系统开销小,常用于批处理系统;但不利于处理紧急任务,故实时、分时系统不宜采用。 + +##### 抢占方式: + +允许调度程序根据某种原则(时间片、优先权、短进程优先),停止正在执行的进程,而将处理机重新分配给另一进程。 + 有利于处理紧急任务,故实时与分时系统中常采用。 + +### 二、调度队列模型 + +在OS中的任何一种调度中,都将涉及到进程队列,由此形成了三种类型的调度队列模型。 + +1. 仅有进程调度的调度队列模型 +2. 具有高级和低级调度的调度队列模型 +3. 同时具有三级调度的调度队列模型 + +### 三、选择调度方式和算法的若干准则 + + + +在一个操作系统的设计中,应如何选择调度方式和算法,在很大程度上取决于操作系统的类型及其目标,选择选择调度方式和算法的准则有 + +#### 面向用户的准则 + +周转时间短 +响应时间快 +截止时间的保证 +优先权准则 + +#### 面向系统的准则 + +系统吞吐量 +处理机利用率好 +各类资源平衡利用 + +#### 最优准则 + +最大的CPU利用率 +最大的吞吐量 +最短的周转时间 +最短的等待时间 +最短的响应时间 + +### 调度算法 + +#### 一、先来先服务调度算法FCFS + +##### FCFS调度算法存在的问题 + +​ 从表面上,先来先服务于所有作业是公平的,即按照它们到来的先后次序进程服务。但若一个长作业先到达系统,就会使许多短作业等待很长的时间,从而引起许多短作业用户的不满。 + + 所以,现在操作系统中,已很少用该算法作为主要调度策略,尤其是在分时系统和实时系统中。但它常被结合在其它调度策略中使用。 + +#### 二、短作业/进程优先调度算法SJF/SPF + +##### 短作业优先调度算法(SJF) + +用于作业调度 +主要任务是从后备队列中选择一个或若干个估计运行时间最短的作业,将它们调入内存运行。 + +##### 短进程优先调度算法(SPF) + +用于进程调度 +主要任务是从就绪队列中选出一估计运行时间最短的进程,将处理机分配给它。 +可采用抢占(剥夺)或者非抢占(非剥夺)调度方式。 + +##### SF(P)F短作业/进程优先调度的优缺点 + +###### 优点: + +​ 1)能有效降低作业的平均等待时间; +​ 2)能有效缩短进程的周转时间; + +###### 缺点: + +​ 1)对长作业不利; +​ 2)不考虑作业的紧迫程度; +​ 3)作业执行时间仅为估计*; + 故SJ(P)F算法虽然是优化的,但在CPU调度中很难实现。 + +#### 三、时间片轮转调度算法RR—注: + +(1)保证了就绪队列中的所有进程在给定的时间内,均能获得一时间片来执行,即系统在给定的时间内,响应所有用户的请求。 +(2)若进程的执行时间少于时间片,则自愿释放CPU。 +(3)时间片将影响: +调度算法(太长---FCFS); +上下文切换(太短---上下文切换频繁,如下页); +平均周转时间(如再下页)。 + +#### 四、优先权调度算法 + +##### 非抢占式优先权算法: + +系统一旦把处理机分配给就绪队列中优先权最高的进程后,该进程便一直执行下去,直到完成/因发生某事件而放弃处理机时,系统方可重新分配处理机。 + +##### 抢占式优先权算法: + +系统把处理机分配给就绪队列中优先机最高的进程,使之执行。但在其执行期间,只要出现了另一个优先权更高的进程,进程调度程序就立即停止当前进程的执行,重新将处理机分配给新到的优先权最高的进程。 + +##### 优先权的类型 + +###### 静态优先权 + +​ 优先权在创建进程时确定,且在进程的整个运行期间保持不变。一般用一整数表示,小表优先级高。 + +###### 动态优先权 + +​ 优先权在创建进程时确定,但在进程的运行期间会发生变化。 + +#### 五、高响应比优先权调度算法 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143907166-61281932.png) + + +注: +1)如等待时间相同,则要求服务时间愈短,其优先权愈高--SPF. +2)如要求服务时间相同,优先权决定于等待时间----FCFS。 +3)对长作业,若等待时间足够长,优先权也高,也能获得CPU。 + +### 实时系统中的调度 + +#### 与实时调度相关的几个概念 + +就绪时间:实时任务产生并可以开始处理的时间。 +开始截止时间:实时任务最迟开始处理的时间。 +处理时间:实时任务处理所需要的处理机的时间。 +完成截止时间:实时任务最迟完成时间。 +发生周期:周期性实时任务的发生间隔时间。 +优先级:实时任务相对紧廹程序。 + +### 死锁的基本概念 + +死锁 + 指多个进程在运行过程中因争夺资源而造成的一种僵局(deadly-Embrace),若无外力作用,这些进程都将无法向前推进。 + +注意: +(1)参与死锁的进程数至少为2 +(2)参与死锁的所有进程均等待资源 +(3)参与死锁的进程至少有两个占有资源 +(4)参与死锁的进程是系统中当前正在运行进程的一部分。 + +#### 产生死锁的原因 + +##### 资源分类 + +​ 操作系统管理着系统内所有资源,它负责分配不同类型的资源给进程使用,系统中的资源从不同角度可分: + +##### 根据资源本身的性质 + +可剥夺资源:如主存、CPU +不可剥夺资源:如驱动器、打印机等 + +##### 根据资源使用期限 + +永久性资源:可再次使用,如所有硬件。 +临时性资源:消耗性的资源,如消息、信号和数据 + +##### 竞争资源 + +竞争非剥夺性资源 竞争临时性资源 + +#### 产生死锁的必要条件 + + 产生死锁必须具备以下四个条件,这四个条件是Coffman首先提出的,所以称为Coffman 条件: +* 互斥条件(资源独占条件) +* 请求和保持条件(部分分配条件) +* 不剥夺条件 +* 循环等待条件(环路条件) + +#### 处理死锁的基本方法 + + 目前处理死锁的基本方法有四种: +##### 预防死锁: + +指通过设置某些限制条件,去破坏产生死锁的四个必要条件中的一个或几个条件,来防止死锁的发生。 + +##### 避免死锁: + +指在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免死锁的发生。 + +##### 检测死锁: + +允许系统在运行过程中发生死锁,但可设置检测机构及时检测死锁的发生,并采取适当措施加以清除。 + +##### 解除死锁: + +当检测出死锁后,便采取适当措施将进程从死锁状态中解脱出来。 + +### 死锁的预防和避免方法 + +#### 一、死锁的预防 + +—— 破坏死锁的四个必要条件(常针对条件2,3,4) + +##### (1)破坏互斥条件: + +即允许多个进程同时访问资源。但由于资源本身固有特性限制,有的资源根本不能同时访问,只能互斥访问,所以破坏互斥条件来预防死锁,这不太可能。 + +##### (2)破坏请求和保条件: + +可采用预先静态分配方法,即要求进程在运行之前一次申请它所需要的全部资源,在它的资源未满足前,不把它投入运行。一旦运行后,这些资源全归其占有,同时它也不再提出其它资源要求,这样可以保证系统不会发生死锁。此方法虽简单安全,但降低了资源利用率,同时必须预知进程所需要的全部资源。 + +##### (3)破坏不可剥夺条件: + +即一个已经获得某些资源的进程,若又请求新的资源时不能得到满足,则它必须释放出已获得的所有资源,以后需要资源时再请求。也即一个进程已获得的资源在运行过程中可被剥夺。从而破坏了该条件。但这种方法实现较复杂,会增加系统开销,降低系统吞吐量。 + +##### (4)破坏环路条件: + +可采用有序资源分配方法,即将系统中的所有资源都按类型赋予一个编号,要求每一个进程均严格按照编号递增的次序来请求资源,同类资源一次申请完。也就是,只要进程提出请求资源Ri,则在以后的请求中,只能请求Ri后的资源,这样不会出现几个进程请求资源而形成环路。该方法虽提高了资源的利用率,但编号难,加重进程负担及因使用资源顺序与申请顺序不同而造成资源浪费。 + +#### 死锁的避免 + +在死锁预防的几种方法中,都施加了较强的限制条件,严重降低了系统性能。在死锁避免的方法中,所施加的限制条件较弱,对于进程发出的每一个资源申请命令实施动态检查,并根据检查结果决定是否实施资源分配。在该方法中把系统的状态分为安全状态和不安全状态,只要能使系统始终处于安全状态,便可以避免死锁的发生。 + +##### 系统的安全状态 + + 指在某一时刻,系统能按某种进程顺序(p1,p2,…,pn)来为每个进程Pi分配其资源,直到满足每个进程对资源的最大需求,使每个进程都可顺利地完成,则称此时的系统状态为安全状态称序列(p1,p2,…,pn)为安全序列。若某一时刻系统中不存在这样一个安全序列,则称此时的系统状态为不安全状态。 + +注:在死锁避免的方法中,允许进程动态申请资源,系统在进行资源分配之前,先计算资源分配的安全性,若此次分配不会导致系统进入不安全状态,便将资源分配给进程,否则进程等待。 + +##### 基本事实 + +如果一个系统在安全状态,就没有死锁 +如果一个系统处于不安全状态,就有可能死锁 +避免死锁的实质:确保系统不进入不安全状态) + +#### 避免死锁的算法-银行家算法 + +具有代表性的避免死锁算法,是Dijkstra给出的银行家算法,为实现银行家算法,系统中必须设置若干数据结构。假定系统中有n个进程(P1,P2,…,Pn),m类资源(R1,R2,…,Rm),银行家算法中使用的数据结构如下: +可利用资源向量:available[j]=k, 资源Rj类有k个可用 +最大需求矩阵:Max[i,j]=k,进程Pi最大请求k个Rj类资源 +分配矩阵:Allocation[i,j]=k,进程Pi分配到k个Rj类资源 +需求矩阵:Need[i,j]=k,进程Pi还需要k个Rj类资源 + 三个矩阵的关系: +Need [i,j] = Max[i,j] – Allocation [i,j]. + +##### 资源分配算法 + +设Requesti是进程Pi的请求向量,设Requesti [j] =k,表示进进程Pi请求分配Rj类资源k个。当进程Pi 发出资源请求后,系统按如下步骤进行检查: +(1)如Requesti[j]≤Need[i,j],转(2);否则出错,因为进程申请资源量超过它申明的最大量。 +(2)如Requesti[j] ≤Available[j],转(3);否则表资源不够,需等待。 +(3)系统试分配资源给进程Pi,并作如下修改: +Available[j]= Available[j]- Requesti[j] +Allocation[i,j]= Allocation[i,j]+ Requesti[j] +Need[i,j]= Need[i,j]- Requesti[j] +(4)系统执行安全性算法,检查此次资源分配后,系统是否处于安全状态。若安全,则正式进行分配,否则恢复原状态让进程Pi等待。 + +##### 安全性检查算法 + +为了进行安全性检查,需要定义如下数据结构: +int work[m] 工作变量,记录可用资源,开始时, Work= Available +int finish[n] 工作变量,记录进程是否进行完,开始时, finish[i]=false;当有足够资源分配给进程Pi时,令finish[i]=true。 + +#### 死锁的检测和解除 + + 如果在一个系统中,即未采用死锁预防方法,也未采用死锁避免方法,而是直接为进程分配资源,则系统中便有可能发生死锁。一旦死锁发生,系统应能将其找到并加以消除,为此需提供死锁检测和解除的手段。 +#### 一、资源分配图 + +​ 检测死锁的基本思想: 是在操作系统中保存资源的请求和分配信息,利用某种算法对这些信息加以检查,以判断是否存在死锁。为此,将进程和资源间的申请和分配关系描述成一个有向图---资源分配图。 + +##### 重要结论: + +如果资源分配图中不存在环路,则系统中不存在死锁;反之,如果资源分配图中存在环路,则系统中可能存在死锁,也可能不存在死锁。 + +##### 资源分配图的化简 + + + +## 第4章 存储器管理 + +存储器是计算机系统的重要组成部分,是计算机系统中的一种宝贵而紧俏的资源。操作系统中的存储管理是指对内存的管理,它是操作系统的重要功能之一。 +存储管理的主要任务是为多道程序提供良好的运行环境,方便用户使用存储器,提高存储器的利用率以及从逻辑上扩充存储器。 + +为此存储管理应具有以下功能: + +1. 实现内存的分配和回收 +2. 地址变换(相对地址←→绝对地址) +3. “扩充”内存容量 +4. 进行存储保护 + +#### 程序的装入和链接 + +##### 1、绝对装入方式 + +如果在编译时,事先知用户程序在内存的驻留位置,则编译程序在编译时就产生绝对地址的目标代码。装入程序就直接把装入模块中的程序和数据装入到指定的位置,(不需进行地址转换) +该装入方式只适用于单道程序环境。 + +##### 2、可重定位装入方式 + +重定位:由于一个作业装入到与其地址空间不一致的存储空间所引起的需对其有关地址部分进行调整的过程就称为重定位(实质是一个地址变换过程/地址映射)。 根据地址变换进行的时间及采用技术手段不同,可分为静态重定位和动态重定位两类。 +可重定位装入方式:事先不知用户程序在内存的驻留位置,装入程序在装入时根据内存的实际情况把相对地址(逻辑地址)转换为绝对地址,装入到适当的位置。(在装入时进行地址转换) +用于多道程序环境 + +##### 3、动态运行装入方式 + +如果事先不知用户程序在内存的驻留位置,为了保证程序在运行过程中,它在内存中的位置可经常改变。装入程序把装入模块装入内存后,并不立即把装入模块中相对地址转换为绝对地址,而是在程序运行时才进行。这种方式需一个重定位寄存器来支持。(在程序运行过程中进行地址转换) + +### 连续分配存储管理方式 + +连续/分区分配方式: 指为一个用户程序分配一片连续的内存空间 + +#### 一、单一连续分配方式(单独分区分配) + + 最简单的一种存储管理方式,但只能用于单用户、单任务的OS中(为什么?)。 +##### 存储管理方法: + +将内存分为系统区(内存低端,分配给OS用)和用户区(内存高端,分配给用户用)。采用静态分配方式,即作业一旦进入内存,就要等待它运行结束后才能释放内存。 + +##### 主要特点: + +管理简单,只需小量的软件和硬件支持,便于用户了解和使用。但因内存中只装入一道作业运行,内存空间浪费大,各类资源的利用率也不高。 + +#### 分区分配方式存储管理 + + 分区分配方式是满足多道程序设计需要的一种最简单的存储管理方法。 +存储管理方法 + 将内存分成若干个分区(大小相等/不相等),除OS占一区外,其余的每一个分区容纳一个用户程序。按分区数目的变化情况,可将分区存储管理进一步分为: +固定分区存储管理 +动态分区存储管理 + +#### 二、固定分区分配方式(固定分区存储管理) + + 是最早使用的一种可运行多道程序的存储管理方法。 +##### 存储管理方法 + +内存空间的划分:将内存空间划分为若干个固定大小的分区,除OS占一区外,其余的一个分区装入一道程序。分区的大小可以相等,也可以不等,但事先必须确定,在运行时不能改变。即分区大小及边界在运行时不能改变。 +系统需建立一张分区说明表或使用表,以记录分区号、分区大小、分区的起始地址及状态(已分配或未分配)。 + +##### 内存分配 + +当某个用户程序要装入内存时,由内存分配程序检索分区说明表,从表中找出一个满足要求的尚未分配的分区分配该程序,同时修改说明表中相应分区的状态;若找不到大小足够的分区,则拒绝为该程序分配内存。 +当程序执行完毕,释放占用的分区,管理程序将修改说明表中相应分区的状态为未分配,实现内存资源的回收。 + +##### 主要特点: + +管理简单,但因作业的大小并不一定与某个分区大小相等,从而使一部分存储空间被浪费。所以主存的利用率不高。 + +#### 三、动态分区分配方式 + + 动态分区分配又称为可变式分区分配,是一种动态划分存储器的分区方法。 +##### 存储管理方法 + +​ 不事先将内存划分成一块块的分区,而是在作业进入内存时,根据作业的大小动态地建立分区,并使分区的大小正好适应作业的需要。因此系统中分区的大小是可变的,分区的数目也是可变的。 + +##### 主要特点 + +​ 管理简单,只需小量的软件和硬件支持,便于用户了解和使用。进程的大小与某个分区大小相等,从而主存的利用率有所提高。 + +##### 1、分区分配中的数据结构 + +###### 空闲分区表 + +​ 用来登记系统中的空闲分区(分区号,分区起始地址,分区大小及状态). + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143913578-1864004301.png) + + +###### 空闲分区链 + +​ 用链头指针将系统中的空闲分区链接起来,构成空闲分区链。每个空闲分区的起始部分存放相应的控制信息(如大小,指向下一空闲分区的指针等). + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143922144-781287364.png) + + +#### 2、分区分配算法 + +##### 首次适应算法(最先适应算法) + +​ 空闲分区(链)按地址递增的次序排列。在进行内存分配时,从空闲分区表/链首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。然后再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表(链)中。 + +###### 首次适应算法的特点 + +​ 优先利用内存低地址部分的空闲分区,从而保留了高地址部分的大空闲区。但由于低地址部分不断被划分,致使低地址端留下许多难以利用的很小的空闲分区(碎片或零头),而每次查找又都是从低地址部分开始,这无疑增加了查找可用空闲分区的开销。 + +##### 循环首次适应算法 + +又称为下次适应算法,由首次适应算法演变而来。在为作业分配内存空间时,不再每次从空闲分区表/链首开始查找,而是从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足其大小要求的空闲分区为止。然后,再按照作业大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲分区表/链中。 + +###### 算法特点 + +​ 使存储空间的利用更加均衡,不致使小的空闲区集中在存储区的一端,但这会导致缺乏大的空闲分区。 + +##### 最佳适应算法 + +###### 算法要求: + +​ 空闲分区/链按容量大小递增的次序排列。在进行内存分配时,从空闲分区表/链的首开始顺序查找,直到找到第一个满足其大小要求的空闲分区为止。 +​ 按这种方式为作业分配内存,就能把既满足作业要求又与作业大小最接近的空闲分区分配给作业。 + +###### 算法特点 + +​ 若存在与作业大小一致的空闲分区,则它必然被选中,若不存在与作业大小一致的空闲分区,则只划分比作业稍大的空闲分区,,从而保留了大的空闲分区,但空闲区一般不可能正好和它申请的内存空间大小一样,因而将其分割成两部分时,往往使剩下的空闲区非常小,从而在存储器中留下许多难以利用的小空闲区(碎片或零头)。 + +##### 最坏适应算法 + +###### 算法要求 + +​ 空闲分区/链按容量大小递减的次序排列。在进行内存分配时,将第一个(即最大的)空闲分区分割给作业使用。 + +###### 算法特点 + +​ 总是挑选满足作业要求的最大的分区分配给作业。这样使分给作业后剩下的空闲分区也较大,可装下其它作业。但由于最大的空闲分区总是因首先分配而划分,当有大作业到来时,其存储空间的申请往往会得不到满足。 + +#### 3、分区分配操作_分配内存和回收内存 + +##### (1)分配内存 + +​ 系统利用某种分配算法,从空闲分区表/链中找到所需大小的分区。 + +###### 分区的切割: + +​ 设请求的分区大小为u.size,空闲分区的大小为m.size,若m.size-u.size<=size(size是事先规定的不再切割的剩余分区的大小),说明多余部分大小,可不再切割,将整个分区分配给请求者;否则,从该分区中按请求的大小划分出一块内存空间分配出去,余下的部分仍留在空闲分区表/链中,然后,将分配区的首址返回给调用者。 + 分配流程图如下 + +##### (2)回收内存 + + 当作业执行结束时,应回收已使用完毕的分区。系统根据回收分区的大小及首地址,在空闲分区表中检查是否有邻接的空闲分区,如有,则合成为一个大的空闲分区,然后修改有关的分区状态信息。 +###### 回收分区与已有空闲分区的相邻情况有以下四种: + + 1)回收分区上邻接一个空闲分区,合并后首地址为空闲分区的首地址,大小为二者之和。 + 2)回收分区下邻接一个空闲分区,合并后首地址为回收分区的首地址,大小为二者之和。 + 3)回收分区上下邻接空闲分区,合并后首地址为上空闲分区的首地址,大小为三者之和。 + 4)回收分区不邻接空闲分区,这时在空闲分区表中新建一表项,并填写分区大小等信息。 + +#### 四、可重定位分区分配方式 + +##### 1、碎片问题 + +​ 在分区存储管理方式中,必须把作业装入到一片连续的内存空间。如果系统中有若干个小的分区,其总容量大于要装入的作业,但由于它们不相邻接,也将致使作业不能装入内存。 +例 :如图所示系统中有四个小空闲分区,不相邻,但总容量为90KB,如果现有一作业要求分配40KB的内存空间,由于系统中所有空闲分区的容量均小于40KB,故此作业无法装入内存。 +​ 这种内存中无法被利用的存储空间称为“零头”或“碎片”.根据碎片出现的情况分为以下两种: + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143929975-644457008.png) + + +##### 系统中的碎片 + +内部碎片:指分配给作业的存储空间中未被利用的部分。 + 如固定分区中存在的碎片。 +外部碎片:指系统中无法利用的小的空间分区。 + 如动态分区中存在的碎片。 + +##### 2、碎片问题的解决方法 + + 对系统中存在碎片,目前主要有两种分区重定位技术: +###### 拼接或紧凑或紧缩技术 + +​ 将内存中所有作业移到内存一端(作业在内存中的位置发生了变化,这就必须对其地址加以修改或变换即称为重定位),使本来分散的多个小空闲分区连成一个大的空闲区。如图所示。这种通过移动作业从把多个分散的小分区拼接成一个大分区的方法称为拼接或紧凑或紧缩。 +​ 拼接时机:分区回收时;当找不到足够大的空闲分区且总空闲分区容量可以满足作业要求时。 + +###### 可重定位分区分配方式主要特点 + +​ 可以充分利用存储区中的“零头/碎片”,提高主存的利用率。 但若 “零头/碎片”大多,则拼接频率过高会使系统开销加大。 + +#### 五、分区的存储保护 + + 存储保护是为了防止一个作业有意或无意地破坏操作系统或其它作业,常用的存储保护方法有: +##### 1、界限寄存器方法 + + 上下界寄存器方法:用这两个寄存器分别存放作业的起始地址和结束地址。在作业运行过程中,将每一个访问内存的绝对地址都同这两个寄存器的内容比较,如超出这个范围便产生保护性中断。 +基址、限长寄存器方法:用这两个寄存器分别存放作业的起始地址和作业的地址空间长度。当作业执行时,将每一访问内存的相对地址和限长寄存器比较,如果超过了限长寄存器的值,则发出越界中断信号,并停止作业的运行。 + +##### 2、存储保护键方法 + +给每个存储块(大小相同,一个分区为整数倍存储块)分配一个单独的保护键,它相当于一把锁。进入系统的每个作业也赋予一个保护键,它相当于一把钥匙。当作业运行时,检查钥匙和锁是否匹配,如果不匹配,则系统发出保护性中断信号,停止作业运行。 + +#### 六、覆盖与交换 + + 覆盖与交换技术是在多道程序环境下用来扩充内存的两种方法。覆盖技术主要用在早期的OS中,而交换技术则主要用在现代OS中,解决在小的内存空间运行大作业的问题。是“扩充”内存容量和提高内存利用率的有效措施。 +##### 1、覆盖技术 + +​ 覆盖技术主要用在早期的OS中(内存<64KB),可用的存储空间受限,某些大作业不能一次全部装入内存,产生了大作业与小内存的矛盾。 + 例: + +覆盖:把一个程序划分为一系列功能相对独立的程序段(称为覆盖),让执行时并不要求同时装入内存的覆盖组成一组(称为覆盖段),共享主存的同一个区域,从而解决在小的存储空间中运行大作业问题。这种内存扩充技术就是覆盖。 + +##### 2、交换/对换 + + 交换技术也是“扩充”内存容量和提高内存利用率的有效措施。现代OS中广泛采用。 + 最早用在MIT的兼容分时系统CTSS中,任何时刻系统中只有一个完整的用户作业,当运行一段时间后,因时间片用完或等待某事件发生,系统就把它交换到外存上,同时把另一作业调入内存让其运行,这样,可以在内存容量不大的小型机上分时运行,早期的一些分时系统多数采用这种交换技术。 +##### 交换与覆盖技术的区别 + +​ 交换技术不要求程序员给出程序段之间的覆盖结构,交换主要交换主要在作业或进程之间进行。 +​ 覆盖技术要求程序员必须把一个程序划分成不同的程序段,并规定好它们的执行和覆盖顺序,操作系统根据程序员提供的覆盖结构来完成程序段之间的覆盖。覆盖技术主要在同一个作业或进程中进行,同时覆盖只能覆盖与覆盖程序段无关的程序段。 + +### 基本分页存储管理方式 + +在分页存储管理方式中,如不具备页面对换功能,不支持虚拟存储器功能,在调度作业运行时,必须将它的所有页面一次调入内存,若内存没有足够的块,则作业等待,这种存储管理方式称为纯分页或基本分页存储管理方式 。 + +#### 一、基本思想 + +##### 空间划分 + +​ (1)将一个用户进程的地址空间(逻辑)划分成若干个大小相等的区域,称为页或页面,并为各页从0开始编号。 +​ (2)内存空间也分成若干个与页大小相等的区域,称为(存储、物理)块或页框(frame),同样从0开始编号。 + +##### 内存分配 + +​ 在为进程分配内存时,以块为单位,将进程中若干页装入到多个不相邻的块中,最后一页常装不满一块而出现页内碎片。 + +#### 二、地址结构 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143940972-772734007.png) + + +##### 二、地址结构例题 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143951003-1929887257.png) + + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115143958135-2105420705.png) + + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115144004126-1633779623.png) + + +#### 四、地址变换机构 + + 为了能将用户地址空间中的逻辑地址变换为内存空间中的物理地址,在系统中必须设置地址变换机构。分基本的地址变换机构和具有快表的地址变换机构。 +地址变换机构的基本任务 + ------实现逻辑地址向物理地址的转换(页号->块号)。 + 地址变换借助页表来完成。 +分页系统的基本地址变换机构如图所示: + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115144023731-1947884061.png) + + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115144029195-1947185968.png) + + +#### 四、地址变换机构 -----具有快表的地址变换机构 + +##### 基本的地址变换机构存在的问题 + +地址变换速度降低(因页表放于内存中,CPU访问一个字节的数据需两次访问内存) + +##### 目的:为提高地址变换速度 + +##### 快表(联想寄存器、联想存储器、TLB) + +为一种特殊高速缓冲存储器。 +内容--为页表中的一部分或全部 +CPU产生的逻辑地址的页首先在快表中寻找,若找到(命中),就找出其对应的物理块;若未找到(未命中),再到页表中找其对应的物理块,并将之复制到快表。 +若快表中内容满,则按某种算法淘汰某些页。 + +#### 四、页的共享保护 + +### 基本分段存储管理方式 + +### 利用段表和页表实现地址映射 + +### 虚拟存储器的引入 + +常规存储器管理方式的特征 + (1)一次性:作业在运行前需一次性地全部装入内存。将导致上述两问题。 + (2)驻留性:作业装入内存后,便一直驻留内存,直至作业运行结束。 +局部性原理 + 指程序在执行时呈现出局部性规律,即在一较短时间内,程序的执行仅限于某个部分,相应地,它所访问的存储空间也局限于某个区域。 + 局部性又表现为时间局部性(由于大量的循环操作,某指令或数据被访问后,则不久可能会被再次访问)和空间局部性(如顺序执行,指程序在一段时间内访问的地址,可能集中在一定的范围之内)。 + +### 虚拟存储器的概念 + +基于局部性原理,程序在运行之前,没有必要全部装入内存,仅须将当前要运行的页(段)装入内存即可。 +运行时,如访问的页(段)在内存中,则继续执行,如访问的页未在内存中(缺页或缺段),则利用OS的请求调页(段)功能,将该页(段)调入内存。 +如内存已满,则利用OS的页(段)置换功能,按某种置换算法将内存中的某页(段)调至外存,从而调入需访问的页。 + 虚拟存储器是指仅把作业的一部分装入内存便可运行作业的存储管理系统,它具有请求页调入功能和页置换功能,能从逻辑上对内存容量进行扩充,其逻辑容量由外存容量和内存容量之和决定,其运行速度接近于内存,成本接近于外存。 + +### 二、请求分页中的内存分配策略和分配算法 + +### 三、 请求分页中的页面调入策略 + +### 4.7 请求分页中的页面置换算法 + +常用的页面置换算法: + +最佳置换算法:选择永远不再需要的页面或最长时间以后才需要访问的页面予以淘汰。 +先进先出置换算法:选择先进入内存的页面予以淘汰。 +最近最久未使用置换算法LRU:选择最近一段时间最长时间没有被访问过的页面予以淘汰。 +*其它算法 + +#### 最佳置换算法例 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115144037058-1200610329.png) + + +### 最近最久未使用算法 + +### 请求分段式存储管理方式 + + + +## 第5章 设备管理 + +### I/O 系统 + +I/O 系统的组成: I/O设备、设备控制器、 I/O通道*、总线及相应软件 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115144044198-1219985522.png) + + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115144051408-427983657.png) + + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115144056841-62896708.png) + + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115144103432-1046115126.png) + + +### 设备与控制器之间的接口 + +#### 设备控制器 + +​ 是处于CPU与I/O设备之间的接口,接收CPU发来的命令,并控制I /O设备工作,是一个可编址设备。 + +#### 功能: + +接收和识别命令、实现数据交换、了解设备状态以及识别设备地址。 +设备控制器的组成 +设备控制器与处理机的接口 +设备控制器与设备接口 + +#### I/O逻辑 + +寄存器:控制寄存器(存放命令及参数)、数据寄存器(存放数据)、状态寄存器(记录设备状态). + +### I/O 通道 + +根据信息交换方式的不同,通道可分成以下几种类型: + +#### 字节多路通道 + +其工作原理: 数据传送是按字节交叉方式工作。 +1)有一个主通道。 +2)含有多个子通道A、B、C…… +3)每子通道通过一控制器与一台中/低速的I/O设备相连,可同时发行向主通道传数据。 +4)各子通道以时间片轮转方式按字节交叉使用主通道。 +优点:可连多台中/低速设备;能分时并行操作。 +缺点:传输率较低。 + +#### 数组多路通道 + +​ 数据传送仍是按数组方式工作。 + +​ 工作原理(结合两者:并发+数组) + +​ 1)有一个主通道 + +​ 2)含有多个子通道A、B、C…… + +​ 3)每子通道通过一控制器与一台**高****/****中速**的I/O设备相连,可同时并发向主通道传数据。 + +​ 4)各子通道以时间片轮转方式按数组方式使用主通道。 + +v优点:可连多台高/中速设备;能分时并行操作,传输率较高。 + +### I/O 控制方式 + +常用的输入/输出控制方式: + 1、程序控制方式 + 2、中断控制方式 + 3、直接存储器访问DMA方式 + 4、通道控制方式 + +#### 1、程序直接控制方式 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115144111788-769307780.png) + + +#### 2、中断控制方式 + +1)需数据的进程向CPU发出指令启动I/O设备输入数据。 +2)该进程放弃处理机,等待输入完成。 +3)输入完成后,I/O控制器向CPU发出中断请求,CPU收到后,转向中断服务程序。中断服务程序将数据输入寄存器中的数据送指定内存单元,并将原进程唤醒,继续执行。 +4)在以后,该进程再被调度,从内存单元取出数据进行处理。 + 优点—CPU利用率大大提高(可以与I/O设备并行工作)。 + 缺点---若中断次数较多将耗去大量CPU处理时间。 + +#### 3、DMA方式 + +1)需数据的进程向CPU发出指令,向DMA控制器写入数据存放的内存始址、传送的字节数,并置中断位和启动位,启动I/O设备输入数据并允许中断。 +2)该进程放弃处理机等待输入完成,处理机被其它进程占据。 +3)DMA控制器采用挪用存储器周期,将一批数据写入内存中。 +4)DMA控制器传送完数据后,向CPU发中断请求,CPU响应后转向中断服务程序,唤醒进程,并返回被中断程序。 +5)在以后该进程再被调度,从内存单元取出数据进行处理。 +优点—CPU利用率进一步提高(并行度有所提高)。 +缺点—数据传送方向、字节数、内存地址等需由CPU控制,且每一设备需一台DMA控制器,设备增多时,不经济。 + +#### 4、通道控制方式 + +1)需数据的进程向CPU发出指令,CPU发启动指令指明I/O操作、设备号和对应的通道。 +2)该进程放弃CPU等待输入完成,CPU被其它进程占据。 +3)通道接收到CPU发来的启动指令后,取出内存中的通道程序执行,控制设备将数据传送到内存指定区域。 +4)传送完数据后,通道向CPU发中断请求,CPU响应后转向中断服务程序,唤醒进程,并返回被中断程序。 +5)在以后该进程再被调度,从内存取出数据进行处理。 +优点—一个通道可控制多设备,所需CPU干预更少。 + CPU利用率较高(并行度较高)。 +缺点:通道价格较高。 + +### 缓冲管理 + +1、提高处理机与I/O设备的并行工作的技术: + 1) 数据传送控制方式 2) 缓冲技术 +2、操作系统中,引入缓冲的主要原因 + 1)缓冲CPU与I/O设备间速度不匹配的矛盾。 + 2)减少中断CPU的次数 + 3)提高CPU与I/O设备的并行性 +3、缓冲实现方法两种: + 1)采用硬件缓冲器实现 + 2)用软件缓冲区来实现 + +缓冲就是用来对数据传送速度不同的设备的传送速度进行匹配/缓冲的一种常用手段。其实现方法除在关键地方可采用硬件缓冲器外,大都采用软件缓冲来实现。软件缓冲区是指在I/O操作期间,专门用来临时存放输入/输出数据的一块存储区域。 +4、缓冲技术的分类 + 单缓冲 双缓冲 + 循环缓冲 缓冲池 + +#### 单 缓 冲 + + 在设备和处理机之间设置一个缓冲。设备与处理机交换数据时,先把交换的数据写入缓冲区,然后需要数据的设备/处理机再从缓冲区中取走数据。 + 特点:缓冲区数只有一个;设备与处理机对缓冲区的操作是串行的。 +#### 双 缓 冲 + + 在设备和处理机之间设置两个缓冲。设备与处理机交换数据时,先把交换的数据写入缓冲区,然后需要数据的设备/处理机再从缓冲区中取走数据。因缓冲区有2个,提高了设备与处理机并行操作的程度,只有当两个均为空时,需数据的进程才等待。 + +特点:缓冲区数有2个;设备与处理机对缓冲区的操作可并行,提高了设备与处理机并行操作的程度。 + +#### 循 环 缓 冲 + + 在设备和处理机之间设置多个大小相等的缓冲区,这些缓冲区构成环形,每一个缓冲区中含一指针指向下一个缓冲区,最后一个指向第一个缓冲区,同时还含有2个用于输入/输出的指针IN和OUT。 + 特点:缓冲区数有多个;设备与处理机对缓冲区的操作可并行,进一步提高了设备与处理机并行操作的程度。 +### 缓 冲 池 + +1、缓冲池:将系统内所有的缓冲区统一管理起来,就形成了能用于输入/输出的缓冲池。缓冲池通常由若干大小相同的缓冲区组成,是系统的公用资源,任何进程都可以申请使用缓冲池中的各个缓冲区。 +2、缓冲池的组成(数据结构) + 三个队列:空缓冲队列、装满输入数据队列、装满输出数据队列 + 四个工作缓冲区: 收容输入缓冲区、提取输入 + 收容输出、提取输出缓冲区 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115144118835-1023573347.png) + + +### 设备分配 + +●设备分配中的数据结构 +●设备分配的策略/应考虑的因素 +● 设备独立性 +●设备分配程序 +●SPOOLING技术 + +#### 7.4 .1 设备分配中的数据结构 + +设备控制表DCT(device control table) +控制器控制表COCT(controller control table) +通道控制表CHCT(channel control table) +系统设备表SDT(system device table) + +#### 5.4 .2 设备分配策略/应考虑的因素 + +1、设备的使用性质/固有属性 + (独享分配 、共享分配、虚拟分配) +2、设备分配算法 + (先请求先服务、优先级高者优先 ) +3、设备分配的安全性(防止进程死锁) +4、设备独立性 :是指用户在编制程序时所用的设备(逻辑)与实际使用的设备无关 + +##### 先请求先服务 + +当有多进程对同一设备提出I/O请求时,系统根据这些进程发出请求的先后次序将它们排成一个设备请求队列,设备分配程序总是把设备分配给队首的进程。 + +##### 优先级高者优先 + +按照进程优先级的高低进行分配。即当多进程对同一设备提出I/O请求时,谁优先级高,就将设备分配给谁。若优先级相同,则按先请求先服务进行分配。 + +#### 5.4 .3 设备独立性 + +##### 设备独立性概念(设备无关性) + +##### 设备独立性的实现 + +###### 逻辑设备(应用程序)和物理设备(执行) + +设备分配时的灵活性 +易于实现I/O重定向 + +###### 设备独立性软件 + +执行所有设备的公有操作 +向用户层(文件层)软件提供统一的接口 + +###### 逻辑设备名到物理设备名映射的实现 + +逻辑设备表LUT(Logical Unit Table) +LUT设置问题(图5-8) + 整个系统设置一张LUT ;每个用户设一张LUT + +##### 设备独立性概念(设备无关性) + +​ 为提高OS的可适应性和可扩展性,而将应用程序独立于具体使用的物理设备。 + +##### I/O重定向 + +​ 指用于I/O操作的设备可以更换,即重定向,而不必改变应用程序。 + +##### 所有设备的公有操作 + +​ 独立设备的分配与回收;将逻辑设备名映射为物理设备名;对设备进行保护(禁直访);缓冲管理;差错控制。 + +#### 5.4.4 独占设备的分配程序 + +##### 基本的设备分配程序 + +分配设备 +分配控制器 +分配通道 +问题(“瓶颈”) + 进程以物理设备名来提出I/O请求 + 采用的是单通路的I/O系统结构 + +##### 设备分配程序的改进 + +增加设备的独立性(进程以逻辑设备名来提出I/O请求) +考虑多通路情况 + +#### SPOOLING技术(Simultaneaus Periphernal Operations On-Line) + +##### 脱机输入、输出技术 + +​ 为了缓和CPU的高速性与I/O设备的低速性间矛盾而引入,该技术在外围控制机的控制下实现低速的I/O设备与高速的磁盘之间进行数据传送。 + +##### SPOOLING技术 + +##### SPOOLING系统的组成 + +##### SPOOLING系统的特点 + +提高了I/O速度 +将独占设备改造为共享设备 +实现了虚拟设备功能 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115144125248-1452461726.png) + + +#### 在操作系统中,引入虚拟设备的原因 + +​ 引入虚拟设备是为了克服独占设备速度较慢、降低设备资源利用率的缺点,从而提高设备的利用率。 + +#### 虚拟设备 + +​ 是指通过虚拟技术将一台独占设备变换为若干台逻辑设备,供若干个用户进程使用,通常把这种经过虚拟技术处理后的设备称为虚拟设备。 + +### 设备处理 + +##### 设备驱动程序的功能和特点 + +设备驱动程序的功能 +设备处理方式 +设备驱动程序的特点 + +##### 设备驱动程序的的处理过程 + +##### 中断处理程序的处理过程 + +#### 设备驱动程序的功能 + +将接收到的抽象要求转换为具体要求。 +检查用户I/O请求的合法性,I/O设备状态,传参数,设设备的工作方式。 +按处理机的I/O请求去启动指定的设备进行I/O操作 +及时响应由控制器或通道发来的中断请求,并进行相应处理 +按I/O请求构成相应通道程序。 + +#### 设备处理方式 + +为每一类设备设置一进程,专门执行其I/O操作。 +在整个系统中设置一个进程,执行所有的I/O操作。 +不设置专门的设备处理进程,而为各类设备设置相应的设备驱动程序。 + +#### 设备驱动程序的特点 + +是请求I/O的进程与设备控制器之间的一个通信与转换程序。 +与I/O设备的特性紧密相关 +与I/O控制方式紧密相关 +与硬件紧密相关,因而其中一部分程序必须用汇编语言编写。 + +#### 设备驱动程序的的处理过程 + +将接收到的抽象要求转换为具体要求。 +检查用户I/O请求的合法性 +读出和检查 I/O设备状态 +传送必要参数 +设置设备的工作方式。 +按处理机的I/O请求去启动指定的设备进行I/O操作。 + +#### 中断处理程序的处理过程 + +唤醒被阻塞的驱动程序进程 +保护被中断进程的CPU环境 +分析中断原因、转入相应的设备中断处理程序 +进行中断处理 +恢复被中断进程的现场 + +### 5.6 磁盘存储器 + +提高磁盘I/O速度的主要途径: +(1)选择性能好的磁盘 +(2)采用好的磁盘调度算法 +(3)设置磁盘高速缓存(Disk Cache) +(4)其它方法 +(5)采用高度可靠、快速的容量磁盘系统_____谦价磁盘冗余阵列 + +#### 1、磁盘性能 + +##### 磁盘性能简述 + +##### 数据的组织 + +磁盘结构、磁道、柱面、扇区、磁盘格式化 +磁盘物理块的地址: 柱面号 磁头号 扇区号 + +##### 磁盘类型 + +(固定头磁盘、移动头磁盘) + +##### 访问时间 + +寻道时间:将磁头从当前位置移到指定磁道所经历时间 +旋转延迟时间:指定扇区移动到磁头下面所经历时间 +传输时间:将扇区上的数据从磁盘读出/向磁盘写入数据所经历的时间。 + +#### 2、 磁盘调度算法 + +##### 磁盘调度算法 + +##### 早期的磁盘调度算法 + +先来先服务FCFS +最短寻道时间优先SSTF + +扫描算法 + +扫描(SCAN)算法 +循环扫描(CSCAN)算法 +**N-STEP-SCAN调度算法 + +##### **SSTF、SCAN及CSCAN存在的问题---磁臂粘着 + +​ 在SSTF、SCAN及CSCAN几种调度算法中,可能出现磁臂停留在某处的情况,即反复请求某一磁道,从而垄断了整个磁盘设备,这种现象称为磁臂粘着。 +N-STEP-SCAN调度算法 +​ 将磁盘请求队列分成若干个长度为N的子队列,磁盘调度将按FCFS算法依次处理这些子队列,而每一子队列按SCAN算法处理。 +​ N=1 FCFS算法 +​ N很大 SCAN算法 +​ N取半长度 FSCAN算法 + +#### 3、设置磁盘高速缓存(Disk Cache) + + 目前,由于磁盘的I/O速度远低内存的访问速度,而致使磁盘的I/O成为计算机系统的瓶颈。为提高磁盘的I/O速度,便采用磁盘高速缓存。 +磁盘高速缓存的形式 +数据交付方式 +置换算法 +周期性地写回磁盘 + +##### (1)磁盘高速缓存的形式 + +###### 磁盘高速缓存 + +是指内存中的一部分存储空间,用来暂存从磁盘读出的一系列盘块中的信息。所以它是一组在逻辑上属于磁盘,而物理上是驻留在内存中的盘块。 + +###### 磁盘高速缓存的形式 + +内存中单独的存储空间(大小固定) +未利用的存储空间__缓冲池(大小不固定) + +##### (2)数据交付方式 + +##### (3)置换算法 + + 在将磁盘中的盘块读入到磁盘高速缓存中时,若因磁盘高速缓存已满,则采用常用的算法进行置换: +最近最久未使用算法LRU +最近未使用算法NRU +最少使用算法LFU + +###### 置换时除算法外还应考虑的问题 + +访问频率 +可预见性 +数据的一致性 ___解决方法将系统中所有盘块数据,拉成一条LRU链,对将会严重影响到数据一致性的数据和很久都可能不再使用的盘块数据, 放在LRU头部,到时优先写回磁盘。 + +##### (4)周期性地写回磁盘 + +#### 4、提高磁盘I/O速度的其它方法 + +##### 提前读(Read_Ahead) + +​ 由于用户对文件的访问常用顺序方式,在读当前块时,可预知下一次要读的盘块,所以,可采用预先读方式,即在读当前块的同时,连同将下一块提前读入缓冲。当访问下一块数据时,其已在缓冲中,而不需去启动磁盘I/O。 + +##### 延迟写 + +​ 在缓存中的数据,本应立即写回磁盘,考虑不久之后可能会再用,故不立即写回磁盘。 +优化物理块的分布 使磁头移动的距离最小(优化物理块的分布、优化索引结点的分布)。 + +##### 虚拟盘 + +​ 利用内存去访真磁盘,又称为RAM盘。(与磁盘高速缓存的区别:RAM盘中的内容由用户控制,而缓存中的内容则由OS控制) + +#### 5、谦价磁盘冗余阵列(RAID) + + 是1987年由美国加利福尼来大学伯莱分校提出的,1988年问世,即利用一台磁盘陈列控制器,来统一管理和控制一组磁盘驱动器,组成一个高度可靠的、快速的大容量磁盘系统。 +并行交叉存取 +RAID的分级 +RAID的优点 + +谦价磁盘冗余阵列( RAID )的优点 + +##### 可靠性高 + +​ 是RAID 的最大优点(除RAID 0 级外) + +##### 磁盘I/O速度高 + +​ 由于RAID 可采用并行交叉存取方式,故提高了磁盘I/O速度。 + +##### 性能/价格比高 + +​ 用RAID技术实现大容量存储器时,与大型磁盘系统相比,其体积和价格只是它的1/3,且可靠性高。 + +### 5.7 UNIX系统中的设备管理 + + + +### 第6章 文件系统 + +文件系统的功能/需解决的问题 + +##### 从系统角度看 + +负责为用户建立、删除、读写、修改和复制文件。 + +##### 从用户的角度看: + +实现了按名存取。 + +#### 一、数据的组成 + +##### 数据项 + +基本数据项(最小的逻辑数据单位) +组合数据项 + +##### 记录 + +是一组相关数据项的集合 + +##### 文件 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115144132876-1536131941.png) + + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115144138212-1215025807.png) + + +### 三、文件系统模型 + +![](https://img2018.cnblogs.com/blog/1545358/202001/1545358-20200115144143466-764748937.png) + + +### 四、文件操作 + + 用户通过文件系统所提供的接口实施对文件的操作。最基本的操作有: +##### 对记录的操作:检索、插入、修改、删除 + +##### 对文件的操作 + +最基本的: 创建 、打开、关闭、删除 、读 、写 、截断 +其它的:文件属性类操作、目录类操作 + +##### 文件的“打开”和“关闭”操作 + +​ “打开”:系统将文件的属性(目录信息)从外存复制到内存打开文件表中,并返回该表目的编号给用户,建立了用户与文件间的联系。以后若再访问此文件,则利用编号直接在内存中检索,从而节省大量的检索开销,提高了文件的操作速度。 +​ “关闭”:当用户不再需要对该文件的操作时,系统利用关闭文件将文件的属性从内存打开表中删除,从而切断用户与文件间的联系。 + +### 6.2 文件逻辑结构 + + 对任一文件存在着两种形式的结构: +##### 文件的逻辑结构(文件组织) + +​ 从用户观点出发,所观察到的文件组织形式,是用户可以直接处理的数据及其结构,它独立于物理特性。 + +##### *文件的物理结构(文件的存储结构) + +​ 是指文件在外存上的存储组织形式,与存储介质的存储性能有关。(分为顺序、链接及索引结构) +注: 文件的逻辑结构和物理结构都将影响文件的检索速度。 + +##### 对文件的逻辑结构提出的要求: + +​ 提高检索;便于修改;降低文件存储费用。 +文件逻辑结构的类型 +顺序文件 +索引文件 +索引顺序文件 + +#### 一、文件逻辑结构的类型 + +##### 有结构的记录式文件 + +文件构成:由一个以上的记录构成。 +记录长度:分为定长和变长。 +分类(按记录的组织):顺序文件 + 索引文件 + 索引顺序文件 + +##### 无结构的流式文件 + +文件构成:由字符流构成。 +长度:字节为单位 +访问:读写指针 +注:Unix中所有文件视为流式文件 + +#### 二、顺序文件 + +##### 逻辑记录的排序 + +串结构:记录顺序与关键字无关,按存入时间的先后排列。 +顺序结构:记录顺序按关键字排列。 + +##### 对顺序文件的读、写操作 + +记录为定长的顺序文件 +记录为变长的顺序文件 + +#### 顺序文件的优缺点 + +##### 优 + +顺序存取速度较快(批量存取)。 +对定长记录,还可方便实现直接存取。 + +##### 缺 + +对变长记录,直接存取低效 +不利于文件的动态增长。 + +#### 三、索引文件 + +##### 引入 + +为解决变长记录文件的直接存取低效问题。 + +##### 索引文件 + +为变长记录文件建立一张索引表。 + +### 索引顺序文件的特点 + +##### 优点 + +通过索引表可方便地实现直接存取,具有较快的检索速度。 +易于进行文件的增删。 + +##### 缺点 + +索引表的使用增加了存储费用; + +索引表的查找策略对文件系统的效率影响很大. + +注:若索引表很大,可建多级索引 + +### 6.3 外存分配方式 + +##### 文件存储单位:簇(cluster) + +​ 文件的存储空间通常由多个分立的簇组成,而每个簇包含若干个连续的扇区(sector)/块。 + +##### 目前常用的外存分配方法: + +(1)连续分配(顺序分配) +(2)链接分配 +(3)索引分配 + +#### (1) 外存分配方法-连续/顺序分配 + +Figure P214 6-7 +为每一个文件分配一片连续的磁盘块/簇 +只需要起始块/簇号和长度,适用于预分配方法 +可以随机存取 +文件不能增长 +从逻辑地址映射到物理地址较简单 +浪费空间:动态存储分配问题 +可以通过紧缩(compact)将外存空闲空间合并成连续的区域。 + +#### 连续/顺序分配的主要优缺点 + +##### 主要优点 + +顺序访问容易 +顺序访问速度快 + +##### 缺点 + +要求有连续的存储空间 +必须事先知道文件的长度 +存在外部碎片 + +#### (2) 外存分配方法-链接分配 + +Figure 215 6-8 +每个文件是一个磁盘块的链接列表:块可以分散在磁盘各处 +按所需分配磁盘块,链接在一起 +在每个块中有指向下一个块的指针 +只需要起始地址 + +可以通过合并(consolidation)将一个文件的各个簇连续存放,以提高I/O访问性能。 + +#### 链接分配的优缺点 + +##### 优点 + +1、无外部碎片,没有磁盘空间浪费 +2、无需事先知道文件大小。文件动态增长时,可动态分配空闲块。对文件的增、删、改十分方便。 +3、不需紧缩磁盘空间。 + +##### 缺点 + +1、不能支持高效随机/直接访问,仅对顺序存取特有效 +2、需为指针分配空间。---块 簇 (隐式链接) +3、可靠性较低(指针丢失/损害) + 文件分配表FAT + FAT需占用较大的内存空间。 + +#### (3) 外存分配方法-索引分配 + +### 6.4 目录管理 + +##### 对文件目录的管理要求 + +实现“按名存取” +提高对目录的检索速度 +文件共享 +允许文件重名 + +#### 文件控制块和索引结点 + +从文件管理角度看,文件由FCB和文件体(文件本身)两部分组成。 + +##### 文件控制块(FCB) + +文件控制块是操作系统为管理文件而设置的数据结构,存放了文件的有关说明信息,是文件存在的标志。 + +###### 文件目录 + +​ 把所有的FCB组织在一起,就构成了文件目录,即文件控制块的有序集合。 + +###### 目录项 + +​ 构成文件目录的项目(目录项就是FCB) + +###### 目录文件 + +​ 为了实现对文件目录的管理,通常将文件目录以文件的形式保存在外存,这个文件就叫目录文件 + +##### FCB中的信息 + +基本信息类:文件名、文件长度、类型、属性文件物理位置 +存取控制信息类:文件存取权限、用户名、口令、共享计数 +使用信息类:文件的建立日期、最后修改日期、保存期限、 + 最后访问日期, + +#### 两级目录结构 + +##### 优点: + +提高了检索目录的速度; +不同用户目录中可重名; +不同用户可用不同文件名来访问系统中一共享文件 + +##### 缺点: + +限制了各用户对文件的共享 +增加了系统开销,缺乏灵活性,无法反映真实世界复杂的文件结构形式。 + +#### 树型目录结构 + +在两级目录中若允许用户建立自己的子目录,则形成3级或多级目录结构(即树型目录结构) + +#### 目录查询技术 + +##### 数据文件(按名存取)的查询步骤 + +根据用户提供的文件名,对文件目录进行查询,找到该文件的FCB(索引结点) +根据FCB(索引结点)所记录的磁盘盘块号,换算出文件在磁盘上的物理位置 +启动磁盘驱动程序,读该数据文件至内存中。 + +##### 对目录进行查询的方式 + +线性检索法(顺序检索法) +Hash方法 + +### 6.5 文件共享 + +早期实现文件共享的方法 +绕弯路法(低效) + 允许每个用户获得一“当前目录”,用户所访问的所有文件均相对于当前目录,若不在,则“向上走”绕弯路去访问其上级目录。 +连访法 +利用基本文件目录实现文件共享 +基于索引结点的共享方式 +利用符号链实现文件共享 + +### 6.5 文件保护 + +#### 影响文件安全性的主要因素 + +人为因素 +系统因素 +自然因素 + +#### 确保文件系统安全性的措施 + +存取控制机制------人为因素 +系统容错技术------系统因素 +后备系统------------自然因素 + +#### 6.5 文件保护---存取控制机制 + +##### 保护域 + +##### 访问矩阵 + +##### 访问矩阵的修改(拷贝权、所有权、控制权) + +##### 访问矩阵的实现(访问控制表、访问权限表) + +##### 分级安全管理 + +###### 系统级安全管理 + +使系统管理员能够掌握要使用系统的诸用户的情况,并保证用户名在系统中的唯一性。 + +###### 用户级安全管理 + +根据用户性质、需求及文件属性给用户分配“文件访问权” 。 + +###### 目录级安全管理 + +为保护系统中各种目录的安全,系统对目录操作指定了权限。 + +###### 文件级安全管理 + +通过系统管理员或文件主对文件属性的设置,来控制用户对文件的访问。 + +##### 磁盘容错技术 + +### 6.7 UNIX系统的文件管理 + +##### 对文件的管理 + +文件存储空间的管理 +文件物理结构 +用户文件描述符表和文件表的管理 + +##### 目录管理 + +对索引结点的管理 +构造目录和删除目录 + +##### 检索目录 + +文件系统的系统调用 + + + +## 附习题答案 + +[下载链接](https://www.lanzous.com/b00z6e8hg) +密码:ce89 \ No newline at end of file diff --git a/src/main/java/md/AtxMarkdownTocFileTest.java b/src/main/java/md/AtxMarkdownTocFileTest.java deleted file mode 100644 index 531617d..0000000 --- a/src/main/java/md/AtxMarkdownTocFileTest.java +++ /dev/null @@ -1,4 +0,0 @@ -package md; - -public class AtxMarkdownTocFileTest { -} diff --git a/src/main/java/md/mdToc.java b/src/main/java/md/mdToc.java deleted file mode 100644 index 3650a29..0000000 --- a/src/main/java/md/mdToc.java +++ /dev/null @@ -1,10 +0,0 @@ -package md; - -import com.github.houbb.markdown.toc.core.impl.AtxMarkdownToc; - -public class mdToc { - public static void main(String[] args) { - String path = "D:\\javaTutorial\\docs\\distrubuted\\practice\\"; - AtxMarkdownToc.newInstance().genTocDir(path); - } -} diff --git "a/\346\234\200\347\273\210\346\225\210\346\236\234.md" "b/\346\234\200\347\273\210\346\225\210\346\236\234.md" deleted file mode 100644 index dc34623..0000000 --- "a/\346\234\200\347\273\210\346\225\210\346\236\234.md" +++ /dev/null @@ -1,162 +0,0 @@ -点击订阅[Java面试进阶指南](https://xiaozhuanlan.com/java-coder)(专为Java面试方向准备) - - -## 目录 - -- [Java](#Java) - - [基础](#基础) - - [容器](#容器) - - [并发](#并发) - - [JVM](#jvm) - - [Java网络编程](#Java网络编程) - - [设计模式](#设计模式) -- [JavaWeb](#JavaWeb) - - [Maven](#Maven) - - [Srping](#Srping) - - [SpringMVC](#SpringMVC) - - [SpringBoot](#SpringBoot) -- [计算机网络](#计算机网络) -- [操作系统](#操作系统) - - [Linux相关](#linux相关) -- [数据结构与算法](#数据结构与算法) - - [数据结构](#数据结构) - - [算法](#算法) -- [数据库](#数据库) - - [MySQL](#mysql) -- [缓存](#缓存) - - [Redis](#Redis) -- [消息队列](#消息队列) - - [Kafka](#Kafka) -- [面试指南](#面试指南) - - [校招指南](#校招指南) - - [面经](#面经) -- [工具](#工具) - - [Git](#git) -- [资料](#资料) - - [书单](#书单) -- [待办](#待办) -- [说明](#说明) - -## Java - -### 基础 - -* [1、面向对象基础](docs/java/basic/1、面向对象基础.md) -* [2、Java基本数据类型](docs/java/basic/2、Java基本数据类型.md) -* [3、string和包装类.md](docs/java/basic/3、string和包装类.md) -* [4、final关键字特性.md](docs/java/basic/4、final关键字特性.md) -* [5、Java类和包.md](docs/java/basic/5、Java类和包.md) - -### 容器 -* [1 面向对象基础](docs/java/collection/Java集合类总结.md) - - -### 并发 -* [1 面向对象基础](docs/java/currency/Java并发总结.md) - - -### JVM -* [1 面向对象基础](docs/java/jvm/JVM总结.md) - - -### Java网络编程 -* [1 面向对象基础](docs/java/network-programing/Java网络与NIO总结.md) - -### 设计模式 -* [1 面向对象基础](docs/java/design-parttern/设计模式学习总结.md) - -## JavaWeb - -### Maven -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - -### Spring -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - -### SpringMVC -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - -### SpringBoot -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - -## 计算机网络 -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - - -## 操作系统 -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - -### Linux相关 -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - - -## 数据结构与算法 - -### 数据结构 -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - - -### 算法 -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - - -## 数据库 - -### MySQL -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - - - -## 缓存 - -### Redis -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - -## 消息队列 -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - -### Kafka -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - - - -## 面试指南 - -### 校招指南 -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - - -### 面经 -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - -## 工具 - -### Git -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - -## 资料 -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - - -### 书单 -* [1 面向对象基础](docs/java/basic/1、面向对象基础.md) - -*** - -## 待办 - -- [x] Java集合类 -- [x] Java并发编程 -- [x] Java网络编程 -- [x] JVM -- [x] 设计面试 - -## 公众号 - -- 如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。 -- 微信公众号【Java技术江湖】一位阿里 Java 工程师的技术小站。作者黄小斜,专注 Java 相关技术:SSM、SpringBoot、MySQL、分布式、中间件、集群、Linux、网络、多线程,偶尔讲点Docker、ELK,同时也分享技术干货和学习经验,致力于Java全栈开发! -- 一些Java工程师常用学习资源公众号后台回复关键字 **“Java”** 即可免费无套路获取。 - -

- -

From 6cdcf0030ff8092d7080f6c89acb30e836845c65 Mon Sep 17 00:00:00 2001 From: pc-suwen <577014284@qq.com> Date: Tue, 15 Sep 2020 20:27:13 +0800 Subject: [PATCH 8/8] 9.15 --- ...\274\232Spring\346\246\202\350\277\260.md" | 3 +- ...70\345\277\203\346\265\201\347\250\213.md" | 34 ++++++------- ...07\347\250\213\345\210\206\346\236\220.md" | 23 +-------- ...37\347\220\206\350\257\246\350\247\243.md" | 28 +++++------ ...\232Spring AOP\346\246\202\350\277\260.md" | 50 ++++++------------- ...13\345\212\241\346\246\202\350\277\260.md" | 27 +--------- ...20\347\240\201\345\211\226\346\236\220.md" | 22 +------- 7 files changed, 51 insertions(+), 136 deletions(-) diff --git "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2201\357\274\232Spring\346\246\202\350\277\260.md" "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2201\357\274\232Spring\346\246\202\350\277\260.md" index 428775a..23049da 100644 --- "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2201\357\274\232Spring\346\246\202\350\277\260.md" +++ "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2201\357\274\232Spring\346\246\202\350\277\260.md" @@ -6,8 +6,7 @@ * [为什么需要Spring及Spring的优点](#为什么需要spring及spring的优点) * [如何学好Spring](#如何学好spring) - -原文出处: [张开涛](http://sishuok.com/forum/blogPost/list/0/2508.html) +> 原文出处: [张开涛](http://sishuok.com/forum/blogPost/list/0/2508.html) diff --git "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2202\357\274\232\345\210\235\346\216\242Spring IOC\346\240\270\345\277\203\346\265\201\347\250\213.md" "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2202\357\274\232\345\210\235\346\216\242Spring IOC\346\240\270\345\277\203\346\265\201\347\250\213.md" index 9a8a0e3..2fd9c8f 100644 --- "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2202\357\274\232\345\210\235\346\216\242Spring IOC\346\240\270\345\277\203\346\265\201\347\250\213.md" +++ "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2202\357\274\232\345\210\235\346\216\242Spring IOC\346\240\270\345\277\203\346\265\201\347\250\213.md" @@ -15,7 +15,7 @@ 接下来的文章会更加深入剖析Bean容器如何解析xml,注册和初始化bean,以及如何获取bean实例等详细的过程。 -转自:[http://www.importnew.com/19243.html](http://www.importnew.com/19243.html) +> 转自:[http://www.importnew.com/19243.html](http://www.importnew.com/19243.html) 1\. 初始化 @@ -37,7 +37,7 @@ ``` 加载时需要读取、解析、注册bean,这个过程具体的调用栈如下所示: -[![](https://cloud.githubusercontent.com/assets/1736354/7896285/8a488060-06e6-11e5-9ad9-4ddd3375984f.png "load")](https://cloud.githubusercontent.com/assets/1736354/7896285/8a488060-06e6-11e5-9ad9-4ddd3375984f.png "load") +![](https://cloud.githubusercontent.com/assets/1736354/7896285/8a488060-06e6-11e5-9ad9-4ddd3375984f.png ) 下面对每一步的关键的代码进行详细分析: @@ -46,7 +46,7 @@ 保存配置位置,并刷新 在调用ClassPathXmlApplicationContext后,先会将配置位置信息保存到configLocations,供后面解析使用,之后,会调用`AbstractApplicationContext`的refresh方法进行刷新: -``` +```java public ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent) throws BeansException { @@ -101,7 +101,7 @@ public void refresh() throws BeansException, IllegalStateException { 创建载入BeanFactory -``` +```java protected final void refreshBeanFactory() throws BeansException { // ... ... DefaultListableBeanFactory beanFactory = createBeanFactory(); @@ -113,7 +113,7 @@ protected final void refreshBeanFactory() throws BeansException { 创建XMLBeanDefinitionReader -``` +```java protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException { // Create a new XmlBeanDefinitionReader for the given BeanFactory. @@ -129,7 +129,7 @@ protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) 创建处理每一个resource -``` +```java public int loadBeanDefinitions(String location, Set actualResources) throws BeanDefinitionStoreException { // ... ... @@ -152,7 +152,7 @@ public int loadBeanDefinitions(Resource... resources) throws BeanDefinitionStore 处理XML每个元素 -``` +```java protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { // ... ... NodeList nl = root.getChildNodes(); @@ -175,7 +175,7 @@ protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate d 解析和注册bean -``` +```java protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) { // 解析 BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele); @@ -201,11 +201,11 @@ protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate d ## 解析 -[![](https://cloud.githubusercontent.com/assets/1736354/7896302/eae02bc6-06e6-11e5-941a-d1f59e3b363f.png "process")](https://cloud.githubusercontent.com/assets/1736354/7896302/eae02bc6-06e6-11e5-941a-d1f59e3b363f.png "process") +![](https://cloud.githubusercontent.com/assets/1736354/7896302/eae02bc6-06e6-11e5-941a-d1f59e3b363f.png) 处理每个Bean的元素 -``` +```java public AbstractBeanDefinition parseBeanDefinitionElement( Element ele, String beanName, BeanDefinition containingBean) { @@ -230,7 +230,7 @@ public AbstractBeanDefinition parseBeanDefinitionElement( 处理属性的值 -``` +```java public Object parsePropertyValue(Element ele, BeanDefinition bd, String propertyName) { String elementName = (propertyName != null) ? " element for property '" + propertyName + "'" : @@ -264,7 +264,7 @@ public Object parsePropertyValue(Element ele, BeanDefinition bd, String property 1.4 注册 -``` +```java public static void registerBeanDefinition( BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) throws BeanDefinitionStoreException { @@ -299,7 +299,7 @@ public void registerBeanDefinition(String beanName, BeanDefinition beanDefinitio ## 注册 -``` +```java public static void registerBeanDefinition( BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) throws BeanDefinitionStoreException { @@ -338,19 +338,19 @@ public void registerBeanDefinition(String beanName, BeanDefinition beanDefinitio ### 注入依赖 当完成初始化IOC容器后,如果bean没有设置lazy-init(延迟加载)属性,那么bean的实例就会在初始化IOC完成之后,及时地进行初始化。初始化时会先建立实例,然后根据配置利用反射对实例进行进一步操作,具体流程如下所示: -[![](https://cloud.githubusercontent.com/assets/1736354/7929429/615570ea-0930-11e5-8097-ae982ef7709d.png "bean_flow")](https://cloud.githubusercontent.com/assets/1736354/7929429/615570ea-0930-11e5-8097-ae982ef7709d.png "bean_flow") +![](https://cloud.githubusercontent.com/assets/1736354/7929429/615570ea-0930-11e5-8097-ae982ef7709d.png) 创建bean的实例 创建bean的实例过程函数调用栈如下所示: -[![](https://cloud.githubusercontent.com/assets/1736354/7929379/cec01bcc-092f-11e5-81ad-88c285f33845.png "create_bean")](https://cloud.githubusercontent.com/assets/1736354/7929379/cec01bcc-092f-11e5-81ad-88c285f33845.png "create_bean") +![](https://cloud.githubusercontent.com/assets/1736354/7929379/cec01bcc-092f-11e5-81ad-88c285f33845.png) 注入bean的属性 注入bean的属性过程函数调用栈如下所示: -[![](https://cloud.githubusercontent.com/assets/1736354/7929381/db58350e-092f-11e5-82a4-caaf349291ea.png "inject_property")](https://cloud.githubusercontent.com/assets/1736354/7929381/db58350e-092f-11e5-82a4-caaf349291ea.png "inject_property") +![](https://cloud.githubusercontent.com/assets/1736354/7929381/db58350e-092f-11e5-82a4-caaf349291ea.png) 在创建bean和注入bean的属性时,都是在doCreateBean函数中进行的,我们重点看下: -``` +```java protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final Object[] args) { // Instantiate the bean. diff --git "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2204\357\274\232\346\207\222\345\212\240\350\275\275\347\232\204\345\215\225\344\276\213Bean\350\216\267\345\217\226\350\277\207\347\250\213\345\210\206\346\236\220.md" "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2204\357\274\232\346\207\222\345\212\240\350\275\275\347\232\204\345\215\225\344\276\213Bean\350\216\267\345\217\226\350\277\207\347\250\213\345\210\206\346\236\220.md" index 3d41877..a3e0a4e 100644 --- "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2204\357\274\232\346\207\222\345\212\240\350\275\275\347\232\204\345\215\225\344\276\213Bean\350\216\267\345\217\226\350\277\207\347\250\213\345\210\206\346\236\220.md" +++ "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2204\357\274\232\346\207\222\345\212\240\350\275\275\347\232\204\345\215\225\344\276\213Bean\350\216\267\345\217\226\350\277\207\347\250\213\345\210\206\346\236\220.md" @@ -5,28 +5,7 @@ * [step2:](#step2) * [step3 : 我们已经step by step 的看到了如何将xml文件转换成Document的,现在就要分析是如何提取和注册bean的。](#step3--我们已经step-by-step-的看到了如何将xml文件转换成document的,现在就要分析是如何提取和注册bean的。) - -本文转自五月的仓颉 https://www.cnblogs.com/xrq730 - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章将同步到我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《Spring和SpringMVC源码分析》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从spring基础入手,一步步地学习spring基础和springmvc的框架知识,并上手进行项目实战,spring框架是每一个Java工程师必须要学习和理解的知识点,进一步来说,你还需要掌握spring甚至是springmvc的源码以及实现原理,才能更完整地了解整个spring技术体系,形成自己的知识框架。 - -后续还会有springboot和springcloud的技术专题,陆续为大家带来,敬请期待。 - -为了更好地总结和检验你的学习成果,本系列文章也会提供部分知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - +> 本文转自五月的仓颉 https://www.cnblogs.com/xrq730 ## 前言 diff --git "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2205\357\274\232JDK\345\222\214cglib\345\212\250\346\200\201\344\273\243\347\220\206\345\216\237\347\220\206\350\257\246\350\247\243.md" "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2205\357\274\232JDK\345\222\214cglib\345\212\250\346\200\201\344\273\243\347\220\206\345\216\237\347\220\206\350\257\246\350\247\243.md" index f05e7ee..04df606 100644 --- "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2205\357\274\232JDK\345\222\214cglib\345\212\250\346\200\201\344\273\243\347\220\206\345\216\237\347\220\206\350\257\246\350\247\243.md" +++ "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2205\357\274\232JDK\345\222\214cglib\345\212\250\346\200\201\344\273\243\347\220\206\345\216\237\347\220\206\350\257\246\350\247\243.md" @@ -81,7 +81,7 @@ JDK静态代理是通过直接编码创建的,而JDK动态代理是利用反 ### Proxy类中的newProxyInstance -``` +```java public static Object newProxyInstance(ClassLoader loader, Class[] interfaces, InvocationHandler h) @@ -141,9 +141,9 @@ JDK静态代理是通过直接编码创建的,而JDK动态代理是利用反 所以代理类其实是通过getProxyClass方法来生成的: -``` - /** - * 生成一个代理类,但是在调用本方法之前必须进行权限检查 +```java + /** + * 生成一个代理类,但是在调用本方法之前必须进行权限检查 */ private static Class getProxyClass0(ClassLoader loader, Class... interfaces) { @@ -161,7 +161,7 @@ JDK静态代理是通过直接编码创建的,而JDK动态代理是利用反 那么ProxyClassFactory是什么呢? -``` +```java /** * 里面有一个根据给定ClassLoader和Interface来创建代理类的工厂函数 * @@ -270,7 +270,7 @@ JDK静态代理是通过直接编码创建的,而JDK动态代理是利用反 由上方代码byte[] proxyClassFile = ProxyGenerator.generateProxyClass(proxyName, interfaces, accessFlags);可以看到,其实生成代理类字节码文件的工作是通过 ProxyGenerate类中的generateProxyClass方法来完成的。 -``` +```java public static byte[] generateProxyClass(final String var0, Class[] var1, int var2) { ProxyGenerator var3 = new ProxyGenerator(var0, var1, var2); // 真正用来生成代理类字节码文件的方法在这里 @@ -307,7 +307,7 @@ JDK静态代理是通过直接编码创建的,而JDK动态代理是利用反 下面来看看真正用于生成代理类字节码文件的generateClassFile方法: -``` +```java private byte[] generateClassFile() { //下面一系列的addProxyMethod方法是将接口中的方法和Object中的方法添加到代理方法中(proxyMethod) this.addProxyMethod(hashCodeMethod, Object.class); @@ -432,7 +432,7 @@ private byte[] generateClassFile() { 下面是将接口与Object中一些方法添加到代理类中的addProxyMethod方法: -``` +```java private void addProxyMethod(Method var1, Class var2) { String var3 = var1.getName();//获得方法名称 Class[] var4 = var1.getParameterTypes();//获得方法参数类型 @@ -465,7 +465,7 @@ private void addProxyMethod(Method var1, Class var2) { 这就是最终真正的代理类,它继承自Proxy并实现了我们定义的Subject接口。我们通过 -``` +```java HelloInterface helloInterface = (HelloInterface ) Proxy.newProxyInstance(loader, interfaces, handler); ``` @@ -473,7 +473,7 @@ HelloInterface helloInterface = (HelloInterface ) Proxy.newProxyInstance(loader, 得到的最终代理类对象就是上面这个类的实例。那么我们执行如下语句: -``` +```java helloInterface.hello("Tom"); ``` @@ -481,7 +481,7 @@ helloInterface.hello("Tom"); 实际上就是执行上面类的相应方法,也就是: -``` +```java public final void hello(String paramString) { try @@ -503,13 +503,13 @@ helloInterface.hello("Tom"); 注意这里的`this.h.invoke`中的h,它是类Proxy中的一个属性 -``` +```java protected InvocationHandler h; ``` 因为这个代理类继承了Proxy,所以也就继承了这个属性,而这个属性值就是我们定义的 -``` +```java InvocationHandler handler = new InvocationHandlerImpl(hello); ``` @@ -576,7 +576,7 @@ JDK代理要求被代理的类必须实现接口,有很强的局限性。而CG 我们来看看将代理类Class文件反编译之后的Java代码 -``` +```java package proxy; import java.lang.reflect.Method; diff --git "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2206\357\274\232Spring AOP\346\246\202\350\277\260.md" "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2206\357\274\232Spring AOP\346\246\202\350\277\260.md" index 87e1208..ce83296 100644 --- "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2206\357\274\232Spring AOP\346\246\202\350\277\260.md" +++ "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2206\357\274\232Spring AOP\346\246\202\350\277\260.md" @@ -7,28 +7,8 @@ * [使用AOP](#使用aop) * [AOP总结](#aop总结) +> 本文转自五月的仓颉 https://www.cnblogs.com/xrq730 -本文转自五月的仓颉 https://www.cnblogs.com/xrq730 - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章将同步到我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《Spring和SpringMVC源码分析》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从spring基础入手,一步步地学习spring基础和springmvc的框架知识,并上手进行项目实战,spring框架是每一个Java工程师必须要学习和理解的知识点,进一步来说,你还需要掌握spring甚至是springmvc的源码以及实现原理,才能更完整地了解整个spring技术体系,形成自己的知识框架。 - -后续还会有springboot和springcloud的技术专题,陆续为大家带来,敬请期待。 - -为了更好地总结和检验你的学习成果,本系列文章也会提供部分知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - ## 我们为什么要使用 AOP @@ -39,12 +19,12 @@ 原始代码的写法 既然要通过代码来演示,那必须要有例子,这里我的例子为: - 有一个接口Dao有insert、delete、update三个方法,在insert与update被调用的前后,打印调用前的毫秒数与调用后的毫秒数 首先定义一个Dao接口: -``` +```java /** + * * @author 五月的仓颉http://www.cnblogs.com/xrq730/p/7003082.html */ public interface Dao { @@ -60,7 +40,7 @@ public interface Dao { 然后定义一个实现类DaoImpl: -``` +```java /** * @author 五月的仓颉http://www.cnblogs.com/xrq730/p/7003082.html */ @@ -86,7 +66,7 @@ public class DaoImpl implements Dao { 最原始的写法,我要在调用insert()与update()方法前后分别打印时间,就只能定义一个新的类包一层,在调用insert()方法与update()方法前后分别处理一下,新的类我命名为ServiceImpl,其实现为: -``` +```java /** * @author 五月的仓颉http://www.cnblogs.com/xrq730/p/7003082.html */ @@ -122,7 +102,7 @@ public class ServiceImpl { ## 使用装饰器模式 接着我们使用上设计模式,先用装饰器模式,看看能解决多少问题。装饰器模式的核心就是实现Dao接口并持有Dao接口的引用,我将新增的类命名为LogDao,其实现为: -``` +```java /** * @author 五月的仓颉http://www.cnblogs.com/xrq730/p/7003082.html */ @@ -169,7 +149,7 @@ public class LogDao implements Dao { ## 使用代理模式 接着我们使用代理模式尝试去实现最原始的功能,使用代理模式,那么我们就要定义一个InvocationHandler,我将它命名为LogInvocationHandler,其实现为: -``` +```java /** * @author 五月的仓颉http://www.cnblogs.com/xrq730/p/7003082.html */ @@ -200,7 +180,7 @@ public class LogInvocationHandler implements InvocationHandler { 其调用方式很简单,我写一个main函数: -``` +```java /** * @author 五月的仓颉http://www.cnblogs.com/xrq730/p/7003082.html */ @@ -229,7 +209,7 @@ JDK提供的动态代理只能针对接口做代理,不能针对类做代理 ## 使用CGLIB 接着看一下使用CGLIB的方式,使用CGLIB只需要实现MethodInterceptor接口即可: -``` +```java /** * @author 五月的仓颉http://www.cnblogs.com/xrq730/p/7003082.html */ @@ -256,7 +236,7 @@ public class DaoProxy implements MethodInterceptor { 代码调用方式为: -``` +```java /** * @author 五月的仓颉http://www.cnblogs.com/xrq730/p/7003082.html */ @@ -289,7 +269,7 @@ public static void main(String[] args) { 最后来看一下使用AOP的方式,首先定义一个时间处理类,我将它命名为TimeHandler: -``` +```java /** * @author 五月的仓颉http://www.cnblogs.com/xrq730/p/7003082.html */ @@ -320,7 +300,7 @@ public class TimeHandler { 接着看一下aop.xml的配置: -``` +```xml -``` +```java 我不大会写expression,也懒得去百度了,因此这里就拦截Dao下的所有方法了。测试代码很简单: @@ -382,7 +362,7 @@ AOP使用场景举例 第一个例子,我们知道MyBatis的事务默认是不会自动提交的,因此在编程的时候我们必须在增删改完毕之后调用SqlSession的commit()方法进行事务提交,这非常麻烦,下面利用AOP简单写一段代码帮助我们自动提交事务(这段代码我个人测试过可用): -``` +```java /** * @author 五月的仓颉http://www.cnblogs.com/xrq730/p/7003082.html */ @@ -421,7 +401,7 @@ insert、update、delete操作事务自动提交 第二个例子是权限控制的例子,不管是从安全角度考虑还是从业务角度考虑,我们在开发一个Web系统的时候不可能所有请求都对所有用户开放,因此这里就需要做一层权限控制了,大家看AOP作用的时候想必也肯定会看到AOP可以做权限控制,这里我就演示一下如何使用AOP做权限控制。我们知道原生的Spring MVC,Java类是实现Controller接口的,基于此,利用AOP做权限控制的大致代码如下(这段代码纯粹就是一段示例,我构建的Maven工程是一个普通的Java工程,因此没有验证过): -``` +```java /** * @author 五月的仓颉http://www.cnblogs.com/xrq730/p/7003082.html */ diff --git "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2208\357\274\232Spring\344\272\213\345\212\241\346\246\202\350\277\260.md" "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2208\357\274\232Spring\344\272\213\345\212\241\346\246\202\350\277\260.md" index bbf94f7..a15f34b 100644 --- "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2208\357\274\232Spring\344\272\213\345\212\241\346\246\202\350\277\260.md" +++ "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2208\357\274\232Spring\344\272\213\345\212\241\346\246\202\350\277\260.md" @@ -15,29 +15,6 @@ * [声明式实现事务管理](#声明式实现事务管理) * [@Transactional实现事务管理](#transactional实现事务管理) - -原文出处: [张开涛](http://sishuok.com/forum/blogPost/list/0/2508.html) - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章将同步到我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《Spring和SpringMVC源码分析》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从spring基础入手,一步步地学习spring基础和springmvc的框架知识,并上手进行项目实战,spring框架是每一个Java工程师必须要学习和理解的知识点,进一步来说,你还需要掌握spring甚至是springmvc的源码以及实现原理,才能更完整地了解整个spring技术体系,形成自己的知识框架。 - -后续还会有springboot和springcloud的技术专题,陆续为大家带来,敬请期待。 - -为了更好地总结和检验你的学习成果,本系列文章也会提供部分知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - - ## 数据库事务概述 事务首先是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所有操作都做,要么所有操作都不做,这就是事务。 @@ -59,8 +36,8 @@ 为了解决这些并发问题,需要通过数据库隔离级别来解决,在标准SQL规范中定义了四种隔离级别: * 未提交读(Read Uncommitted):最低隔离级别,一个事务能读取到别的事务未提交的更新数据,很不安全,可能出现丢失更新、脏读、不可重复读、幻读; -* 提交读(Read Committed):一个事务能读取到别的事务提交的更新数据,不能看到未提交的更新数据,不可能可能出现丢失更新、脏读,但可能出现不可重复读、幻读; -* 可重复读(Repeatable Read):保证同一事务中先后执行的多次查询将返回同一结果,不受其他事务影响,可能可能出现丢失更新、脏读、不可重复读,但可能出现幻读; +* 提交读(Read Committed):一个事务能读取到别的事务提交的更新数据,不能看到未提交的更新数据,不可能出现丢失更新、脏读,但可能出现不可重复读、幻读; +* 可重复读(Repeatable Read):保证同一事务中先后执行的多次查询将返回同一结果,不受其他事务影响,不可能出现丢失更新、脏读、不可重复读,但可能出现幻读; * 序列化(Serializable):最高隔离级别,不允许事务并发执行,而必须串行化执行,最安全,不可能出现更新、脏读、不可重复读、幻读。 隔离级别越高,数据库事务并发执行性能越差,能处理的操作越少。因此在实际项目开发中为了考虑并发性能一般使用提交读隔离级别,它能避免丢失更新和脏读,尽管不可重复读和幻读不能避免,但可以在可能出现的场合使用悲观锁或乐观锁来解决这些问题。 diff --git "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2209\357\274\232Spring\344\272\213\345\212\241\346\272\220\347\240\201\345\211\226\346\236\220.md" "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2209\357\274\232Spring\344\272\213\345\212\241\346\272\220\347\240\201\345\211\226\346\236\220.md" index 829f645..7cc7885 100644 --- "a/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2209\357\274\232Spring\344\272\213\345\212\241\346\272\220\347\240\201\345\211\226\346\236\220.md" +++ "b/docs/java-web/Spring/Spring\346\272\220\347\240\201\345\211\226\346\236\2209\357\274\232Spring\344\272\213\345\212\241\346\272\220\347\240\201\345\211\226\346\236\220.md" @@ -8,28 +8,8 @@ * [Transactional注解](#transactional注解) * [开启事务过程](#开启事务过程) +> 转自:http://www.linkedkeeper.com/detail/blog.action?bid=1045 -转自:http://www.linkedkeeper.com/detail/blog.action?bid=1045 - -本系列文章将整理到我在GitHub上的《Java面试指南》仓库,更多精彩内容请到我的仓库里查看 -> https://github.com/h2pl/Java-Tutorial - -喜欢的话麻烦点下Star哈 - -文章将同步到我的个人博客: -> www.how2playlife.com - -本文是微信公众号【Java技术江湖】的《Spring和SpringMVC源码分析》其中一篇,本文部分内容来源于网络,为了把本文主题讲得清晰透彻,也整合了很多我认为不错的技术博客内容,引用其中了一些比较好的博客文章,如有侵权,请联系作者。 - -该系列博文会告诉你如何从spring基础入手,一步步地学习spring基础和springmvc的框架知识,并上手进行项目实战,spring框架是每一个Java工程师必须要学习和理解的知识点,进一步来说,你还需要掌握spring甚至是springmvc的源码以及实现原理,才能更完整地了解整个spring技术体系,形成自己的知识框架。 - -后续还会有springboot和springcloud的技术专题,陆续为大家带来,敬请期待。 - -为了更好地总结和检验你的学习成果,本系列文章也会提供部分知识点对应的面试题以及参考答案。 - -如果对本系列文章有什么建议,或者是有什么疑问的话,也可以关注公众号【Java技术江湖】联系作者,欢迎你参与本系列博文的创作和修订。 - - ## 声明式事务使用 Spring事务是我们日常工作中经常使用的一项技术,Spring提供了编程、注解、aop切面三种方式供我们使用Spring事务,其中编程式事务因为对代码入侵较大所以不被推荐使用,注解和aop切面的方式可以基于需求自行选择,我们以注解的方式为例来分析Spring事务的原理和源码实现。