diff --git "a/Java345円237円272円347円241円200円345円255円246円344円271円240円/README.MD" "b/Java345円237円272円347円241円200円345円255円246円344円271円240円/README.MD" new file mode 100644 index 0000000..a038f88 --- /dev/null +++ "b/Java345円237円272円347円241円200円345円255円246円344円271円240円/README.MD" @@ -0,0 +1,22 @@ +## Java基础篇(持续更新中) +​ +公众号:捡田螺的小男孩 +​ +- [一文读懂线程池的工作原理(故事白话文)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488078&idx=1&sn=0a7cef472002f6582fd2354fba83706a&chksm=cf21cd67f85644716263c3a80cead9b7bb36d9677f6f8b06d0602077ece70fcafa9d20c1cffb&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Synchronized解析——如果你愿意一层一层剥开我的心](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487942&idx=1&sn=bbc68d1b9da23bf6474378e310b1ef1b&chksm=cf21ceeff85647f9ad7a08226849fcba3f9481387d13b17a5787fb94027647de81c349f9e390&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [异步编程利器:CompletableFuture详解](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490456&idx=1&sn=95836324db57673a4d7aea4fb233c0d2&chksm=cf21c4b1f8564da72dc7b39279362bcf965b1374540f3b339413d138599f7de59a5f977e3b0e&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java日常开发的21个坑,你踩过几个?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488115&idx=1&sn=bdd4a4ca36bc7ea902106d058e8537fb&chksm=cf21cd5af856444cb36af600705615454b0aaa2b289b97ddb52d594556ac07a1915b73ecce19&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [一份Java程序员的珍藏书单,请您注意查收](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488066&idx=1&sn=44b5a90be1b69d7938dbcf516d85f041&chksm=cf21cd6bf856447d869278386250f59a926881375df848e54f86a21682bdab50f9e09ca56fbd&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java程序员必备基础:JDK 5-15都有哪些经典新特性](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488058&idx=1&sn=aab4d0dc9020cb62710086474ca90baf&chksm=cf21cd13f8564405040593daa45c62aec218e13f5ff42d679c59f768dd4fcc53ddcf34e0a454&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [程序员必备基础:Git 命令全方位学习](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488013&idx=1&sn=7011a51a347e3da2cf8f8540b4d9a5d6&chksm=cf21cd24f8564432d74bc13551ebdeae71a71ea31e339c7a8f1f42f181078b5192475d598626&token=162724582&ang=zh_CN&scene=21#wechat_redirect) +- [给你的Java程序拍个片子吧:jstack命令解析](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487990&idx=1&sn=b5b3c565392f39e5ac517696603b2ed9&chksm=cf21cedff85647c960407dce77fe04d08e51f8c7332310ccacd925be5567c187aa761dd1d1c8&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java程序员必备基础结构图](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487985&idx=1&sn=ead28c6c8d81b98e59603b848d250b30&chksm=cf21ced8f85647ce336f19016c7ff1936b21c81066815c8f28b830098716111548edb9767b21&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java程序员必备:序列化全方位解析](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487980&idx=1&sn=2a9ce519f87a1ffe1511022e6724208e&chksm=cf21cec5f85647d357c79860171fc1799ef3c44a2bdd0716e8437e31708a17d9000b4224bd36&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [优化if-else代码的八种方案](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487970&idx=1&sn=c296bb03419adf93955c6d0f27e56b29&chksm=cf21cecbf85647dd0ef5160559bc0d524a4be004a28bc5d2770a43409e3b090123c0930cf047&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java程序员必备基础:泛型解析](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487964&idx=1&sn=24d7228cc10afc98c52dbf35da61a7b9&chksm=cf21cef5f85647e3d2b3f1e126cdc46d9e889d2e30c09716e0aea016beee3ca6d4c321cf60ae&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java程序员必备基础:内部类解析](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487963&idx=1&sn=a0b49cd49a3dd51b6736c9ffa0a5997a&chksm=cf21cef2f85647e49a4bdb43f27583f03fb9ec4719767512dc084edd05675599c3bec44251fb&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [老是遇到乱码问题:它是如何产生的,又如何解决呢?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487962&idx=1&sn=7424e843c80b228283fc08d4d24cc4bb&chksm=cf21cef3f85647e5a9c92d280624ad2564e885561a8b64cbf6722459f7c13da7421765321aa9&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [谈谈Java反射:从入门到实践,再到原理](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487959&idx=1&sn=778114d611f18b0f307a3f3ab6cd9117&chksm=cf21cefef85647e84b77c0e46620e91cf5ff079785b58a7dc66e5ed7419e21e0da9180699617&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java程序员必备的一些流程图](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487946&idx=1&sn=57a86e1d2fe1a9ecf00594a0bb6baf5f&chksm=cf21cee3f85647f5cf2ba728cc0838923140130a18ad117e248cf9843460614fc855d556968a&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java程序员必备:查看日志常用的linux命令](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487954&idx=1&sn=6c04ff4edfcfea52a82795bcb9ed8efd&chksm=cf21cefbf85647ed8df72a23307315be5d1b3d4974c128f111bfdaa84da37cf7b49ff65c1112&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [ThreadLocal的八个关键知识点](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247500784&idx=1&sn=6519d0e092be4ed9d6f4da8d90deef2c&chksm=cf221cd9f85595cf9123043241e92a19ca9c212aa8527cfb2aeb9a2472c6bdab9045cf40f22f&token=349136600&lang=zh_CN#rd) \ No newline at end of file diff --git "a/Java345円237円272円347円241円200円345円255円246円344円271円240円/README.MD.bak" "b/Java345円237円272円347円241円200円345円255円246円344円271円240円/README.MD.bak" new file mode 100644 index 0000000..4ba4024 --- /dev/null +++ "b/Java345円237円272円347円241円200円345円255円246円344円271円240円/README.MD.bak" @@ -0,0 +1,21 @@ +## Java基础篇(持续更新中) +​ +公众号:捡田螺的小男孩 +​ +- [一文读懂线程池的工作原理(故事白话文)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488078&idx=1&sn=0a7cef472002f6582fd2354fba83706a&chksm=cf21cd67f85644716263c3a80cead9b7bb36d9677f6f8b06d0602077ece70fcafa9d20c1cffb&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Synchronized解析——如果你愿意一层一层剥开我的心](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487942&idx=1&sn=bbc68d1b9da23bf6474378e310b1ef1b&chksm=cf21ceeff85647f9ad7a08226849fcba3f9481387d13b17a5787fb94027647de81c349f9e390&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [异步编程利器:CompletableFuture详解](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490456&idx=1&sn=95836324db57673a4d7aea4fb233c0d2&chksm=cf21c4b1f8564da72dc7b39279362bcf965b1374540f3b339413d138599f7de59a5f977e3b0e&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java日常开发的21个坑,你踩过几个?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488115&idx=1&sn=bdd4a4ca36bc7ea902106d058e8537fb&chksm=cf21cd5af856444cb36af600705615454b0aaa2b289b97ddb52d594556ac07a1915b73ecce19&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [一份Java程序员的珍藏书单,请您注意查收](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488066&idx=1&sn=44b5a90be1b69d7938dbcf516d85f041&chksm=cf21cd6bf856447d869278386250f59a926881375df848e54f86a21682bdab50f9e09ca56fbd&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java程序员必备基础:JDK 5-15都有哪些经典新特性](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488058&idx=1&sn=aab4d0dc9020cb62710086474ca90baf&chksm=cf21cd13f8564405040593daa45c62aec218e13f5ff42d679c59f768dd4fcc53ddcf34e0a454&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [程序员必备基础:Git 命令全方位学习](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488013&idx=1&sn=7011a51a347e3da2cf8f8540b4d9a5d6&chksm=cf21cd24f8564432d74bc13551ebdeae71a71ea31e339c7a8f1f42f181078b5192475d598626&token=162724582&ang=zh_CN&scene=21#wechat_redirect) +- [给你的Java程序拍个片子吧:jstack命令解析](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487990&idx=1&sn=b5b3c565392f39e5ac517696603b2ed9&chksm=cf21cedff85647c960407dce77fe04d08e51f8c7332310ccacd925be5567c187aa761dd1d1c8&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java程序员必备基础结构图](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487985&idx=1&sn=ead28c6c8d81b98e59603b848d250b30&chksm=cf21ced8f85647ce336f19016c7ff1936b21c81066815c8f28b830098716111548edb9767b21&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java程序员必备:序列化全方位解析](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487980&idx=1&sn=2a9ce519f87a1ffe1511022e6724208e&chksm=cf21cec5f85647d357c79860171fc1799ef3c44a2bdd0716e8437e31708a17d9000b4224bd36&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [优化if-else代码的八种方案](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487970&idx=1&sn=c296bb03419adf93955c6d0f27e56b29&chksm=cf21cecbf85647dd0ef5160559bc0d524a4be004a28bc5d2770a43409e3b090123c0930cf047&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java程序员必备基础:泛型解析](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487964&idx=1&sn=24d7228cc10afc98c52dbf35da61a7b9&chksm=cf21cef5f85647e3d2b3f1e126cdc46d9e889d2e30c09716e0aea016beee3ca6d4c321cf60ae&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java程序员必备基础:内部类解析](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487963&idx=1&sn=a0b49cd49a3dd51b6736c9ffa0a5997a&chksm=cf21cef2f85647e49a4bdb43f27583f03fb9ec4719767512dc084edd05675599c3bec44251fb&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [老是遇到乱码问题:它是如何产生的,又如何解决呢?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487962&idx=1&sn=7424e843c80b228283fc08d4d24cc4bb&chksm=cf21cef3f85647e5a9c92d280624ad2564e885561a8b64cbf6722459f7c13da7421765321aa9&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [谈谈Java反射:从入门到实践,再到原理](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487959&idx=1&sn=778114d611f18b0f307a3f3ab6cd9117&chksm=cf21cefef85647e84b77c0e46620e91cf5ff079785b58a7dc66e5ed7419e21e0da9180699617&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java程序员必备的一些流程图](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487946&idx=1&sn=57a86e1d2fe1a9ecf00594a0bb6baf5f&chksm=cf21cee3f85647f5cf2ba728cc0838923140130a18ad117e248cf9843460614fc855d556968a&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java程序员必备:查看日志常用的linux命令](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487954&idx=1&sn=6c04ff4edfcfea52a82795bcb9ed8efd&chksm=cf21cefbf85647ed8df72a23307315be5d1b3d4974c128f111bfdaa84da37cf7b49ff65c1112&token=162724582&lang=zh_CN&scene=21#wechat_redirect) \ No newline at end of file diff --git "a/Java347円250円213円345円272円217円345円221円230円351円234円200円350円246円201円347円234円213円345円223円252円344円272円233円344円271円246円/README.MD" "b/Java347円250円213円345円272円217円345円221円230円351円234円200円350円246円201円347円234円213円345円223円252円344円272円233円344円271円246円/README.MD" new file mode 100644 index 0000000..5ee6e33 --- /dev/null +++ "b/Java347円250円213円345円272円217円345円221円230円351円234円200円350円246円201円347円234円213円345円223円252円344円272円233円344円271円246円/README.MD" @@ -0,0 +1,5 @@ +## Java程序员书单(持续更新中) +​ +公众号:捡田螺的小男孩 +​ +- [一份Java程序员的珍藏书单,请您注意查收](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488066&idx=1&sn=44b5a90be1b69d7938dbcf516d85f041&chksm=cf21cd6bf856447d869278386250f59a926881375df848e54f86a21682bdab50f9e09ca56fbd&token=162724582&lang=zh_CN&scene=21#wechat_redirect) diff --git "a/Java351円235円242円350円257円225円351円242円230円351円233円206円347円273円223円345円217円267円/README.MD" "b/Java351円235円242円350円257円225円351円242円230円351円233円206円347円273円223円345円217円267円/README.MD" new file mode 100644 index 0000000..7397d39 --- /dev/null +++ "b/Java351円235円242円350円257円225円351円242円230円351円233円206円347円273円223円345円217円267円/README.MD" @@ -0,0 +1,32 @@ +## 1. 面试真题 + +关注公众号:捡田螺的小男孩 +​ +- [oppo后端16连问](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498750&idx=1&sn=19fe8b4fff28fe81db14e733053bbc74&chksm=cf2224d7f855adc1d0984980a4e3de31fe33329164a472ca8d8255a8a80b69b2e23850811323&token=2001057130&lang=zh_CN#rd) +- [小厂后端十连问(附答案)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498316&idx=1&sn=7749b78293b7b2af51eda99844e08a56&chksm=cf222565f855ac7324232e2af459f8b6e6eb5fd5b272c2b29bda08cc579421b6704a0de94b2e&token=2001057130&lang=zh_CN#rd) +- [腾讯云后端15连问!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498171&idx=1&sn=f5a7ec25a569822be0f73fbcd413e8ba&chksm=cf222692f855af84fba419166fcd4235c0e78af3a2e1ec4c723a4efb1bd1ad6f8a5b9404c599&token=2001057130&lang=zh_CN#rd) +- [社招后端21连问(三年工作经验一面)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498084&idx=1&sn=96c8148cfeeeb16668ed9e03fa9131cc&chksm=cf22264df855af5b6e81b93738cca28989226a53ec702fcfaa0cc5004dded4208c5ee5ea844a&token=2001057130&lang=zh_CN#rd) +- [一份热乎乎的字节面试真题](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497742&idx=1&sn=18765e7356f446a7f2521f45b467d5d3&chksm=cf222727f855ae31dd2029e3219814211336c41d9228d271a583d3691ddadca586529aca9302&token=2001057130&lang=zh_CN#rd) +- [面试必备:虾皮服务端15连问](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497256&idx=1&sn=3b799c2d514aa25e85a6faa60d639a0b&chksm=cf222901f855a017b73356b99b830b8800a7a9172fab891c5759d8dd69a270872ea9480c0b7c&token=2001057130&lang=zh_CN#rd) +- [宇宙条一面:十道经典面试题解析](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247495342&idx=1&sn=54e1c0c16a6467001524c34818025331&chksm=cf223187f855b89140db5ca429e6efc19d0111abf7f36b78a0ecd73b00fded1ff1e7ba32a6f1&token=2001057130&lang=zh_CN#rd) +- [蚂蚁金服一面:十道经典面试题解析](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247493270&idx=1&sn=1c78a81d6e1bd0f0fd947fe8c3a33e32&chksm=cf2239bff855b0a9627855f20a17799e0506eb7548a409bfa0ee0450328d7519ec70f7b962cc&token=2001057130&lang=zh_CN#rd) +​ +## 2. 必考经典面试题 +​ +- [Redis主从、哨兵、 Cluster集群一锅端!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498254&idx=1&sn=6489360c3b226df9811e66cb40ec7656&chksm=cf222527f855ac3112628bcec7730064fee3fdbe869fbd0a7410c22766a0c036a7e5c1a69fa0&token=2001057130&lang=zh_CN#rd) +- [我们为什么要分库分表?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498625&idx=1&sn=0d7bd9d1b46eeff4c715a6761355e9b0&chksm=cf2224a8f855adbea8931c8e011711f6c70cffeef8ddf8b87729c710eacef11b46eef80fda36&token=2001057130&lang=zh_CN#rd) +- [面试必备:聊聊MySQL的主从](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497982&idx=1&sn=bb589329cceb5462fc41f66ec63dbf56&chksm=cf2227d7f855aec16dd4d3b3425c0401850eeaf2c9cdc82e82722d38a00c24ee9ccfa3353774&token=2001057130&lang=zh_CN#rd) +- [消息队列经典十连问](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497847&idx=1&sn=29a32672b712e7dfadfa36c9902b2ec7&chksm=cf22275ef855ae484fb3f51a5726e9a4bc45222e8fbbd33631d177dc4b5619c36889ea178463&token=2001057130&lang=zh_CN#rd) +- [八种幂等设计](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497427&idx=1&sn=2ed160c9917ad989eee1ac60d6122855&chksm=cf2229faf855a0ecf5eb34c7335acdf6420426490ee99fc2b602d54ff4ffcecfdab24eeab0a3&token=2001057130&lang=zh_CN#rd) +- [看一遍就理解:零拷贝详解](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247496788&idx=1&sn=f65ddd10d16d8376efa0037762153932&chksm=cf222b7df855a26bad76249e7b77e28da3097b226f9165d79f5031516d9c345827fca901559c&token=2001057130&lang=zh_CN#rd) +- [看一遍就理解:IO模型详解](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247496448&idx=1&sn=cd502f850290a25949dd4a11ac55a039&chksm=cf222c29f855a53f094bde2868900fa252b07385e73564e9ee9f0510cb4e74387d9d23ab67e6&token=2001057130&lang=zh_CN#rd) +- [看一遍就理解:MVCC原理详解](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247495277&idx=1&sn=a1812febb4246f824ce54d778f672025&chksm=cf223144f855b8528ad6cce707dc3a1b4d387817bd751dfab4f79dda90c6640f9763d25f3f33&token=2001057130&lang=zh_CN#rd) +- [2W字!详解20道Redis经典面试题!(珍藏版)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247494124&idx=1&sn=c185f7d999d5f006608d05707a8a7eea&chksm=cf2236c5f855bfd329c6e2ee27f23f8131ebcd312960190a10f1a819d67f07a21a08ad17f263&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [七种方案!探讨Redis分布式锁的正确使用姿势](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488142&idx=1&sn=79a304efae7a814b6f71bbbc53810c0c&chksm=cf21cda7f85644b11ff80323defb90193bc1780b45c1c6081f00da85d665fd9eb32cc934b5cf&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [面试必备!TCP协议经典十五连问!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490868&idx=1&sn=96889bfe6a97f9200fa2d682cf2f5d89&chksm=cf21c21df8564b0b0757df584560a69340b1775fe1c70b867439565969ec3aed19c442ff4eeb&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [2W字!梳理50道经典计算机网络面试题(收藏版)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247492832&idx=1&sn=601fa1c340a313bc0f74bb75cdb6a95a&chksm=cf223bc9f855b2dfb8d0e74f3360e2edfe25c3a728fe17e9e80b6022340994fd9d9e1ca83ca8&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [ZooKeeper的十二连问,你顶得了嘛?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488047&idx=1&sn=4913c7e1c3b8835f7512d8dc6b845727&chksm=cf21cd06f8564410cce6121230256facb1ab3b5a9ed35579896f428d84bdea7b86836109d575&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [50道Java集合经典面试题(收藏版)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488007&idx=1&sn=c5c16c8ec916c791e776216f3177c7e2&chksm=cf21cd2ef85644382a985e9fed1956d6ee60c86ce69e65f31f775318435fdb86bf368e26edf2&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [100道MySQL数据库经典面试题解析(收藏版)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488000&idx=1&sn=1c38db7fd110bbcc1ffb2d72a56aaf25&chksm=cf21cd29f856443f25a3fe98ae8e888faceef9bee45df045969b2cffb105363dcc2a4480bb74&token=1495321435&lang=zh_CN&scene=21#wechat_redirect) +- [Spring 面试63问](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497672&idx=1&sn=6ff0350e23d014b29a47bdec79af9ef5&chksm=cf2228e1f855a1f70fa78d9bd85c53dfbe154c1325aa1e203e4c918132c430d51bb68e961eda&token=2001057130&lang=zh_CN#rd) +- [多线程50连问](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247501446&idx=1&sn=3d83f3c1035c963c1fda3f77ab750e71&chksm=cf2219aff85590b9ba054dc33956a5cafe1beaa77b231dc4dc0cf891be3e16ef367f6b2ac4ed&token=245109219&lang=zh_CN#rd) \ No newline at end of file diff --git "a/Java351円235円242円350円257円225円351円242円230円351円233円206円347円273円223円345円217円267円/README.MD.bak" "b/Java351円235円242円350円257円225円351円242円230円351円233円206円347円273円223円345円217円267円/README.MD.bak" new file mode 100644 index 0000000..cfb8d9d --- /dev/null +++ "b/Java351円235円242円350円257円225円351円242円230円351円233円206円347円273円223円345円217円267円/README.MD.bak" @@ -0,0 +1,31 @@ +## 1. 面试真题 + +关注公众号:捡田螺的小男孩 +​ +- [oppo后端16连问](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498750&idx=1&sn=19fe8b4fff28fe81db14e733053bbc74&chksm=cf2224d7f855adc1d0984980a4e3de31fe33329164a472ca8d8255a8a80b69b2e23850811323&token=2001057130&lang=zh_CN#rd) +- [小厂后端十连问(附答案)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498316&idx=1&sn=7749b78293b7b2af51eda99844e08a56&chksm=cf222565f855ac7324232e2af459f8b6e6eb5fd5b272c2b29bda08cc579421b6704a0de94b2e&token=2001057130&lang=zh_CN#rd) +- [腾讯云后端15连问!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498171&idx=1&sn=f5a7ec25a569822be0f73fbcd413e8ba&chksm=cf222692f855af84fba419166fcd4235c0e78af3a2e1ec4c723a4efb1bd1ad6f8a5b9404c599&token=2001057130&lang=zh_CN#rd) +- [社招后端21连问(三年工作经验一面)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498084&idx=1&sn=96c8148cfeeeb16668ed9e03fa9131cc&chksm=cf22264df855af5b6e81b93738cca28989226a53ec702fcfaa0cc5004dded4208c5ee5ea844a&token=2001057130&lang=zh_CN#rd) +- [一份热乎乎的字节面试真题](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497742&idx=1&sn=18765e7356f446a7f2521f45b467d5d3&chksm=cf222727f855ae31dd2029e3219814211336c41d9228d271a583d3691ddadca586529aca9302&token=2001057130&lang=zh_CN#rd) +- [面试必备:虾皮服务端15连问](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497256&idx=1&sn=3b799c2d514aa25e85a6faa60d639a0b&chksm=cf222901f855a017b73356b99b830b8800a7a9172fab891c5759d8dd69a270872ea9480c0b7c&token=2001057130&lang=zh_CN#rd) +- [宇宙条一面:十道经典面试题解析](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247495342&idx=1&sn=54e1c0c16a6467001524c34818025331&chksm=cf223187f855b89140db5ca429e6efc19d0111abf7f36b78a0ecd73b00fded1ff1e7ba32a6f1&token=2001057130&lang=zh_CN#rd) +- [蚂蚁金服一面:十道经典面试题解析](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247493270&idx=1&sn=1c78a81d6e1bd0f0fd947fe8c3a33e32&chksm=cf2239bff855b0a9627855f20a17799e0506eb7548a409bfa0ee0450328d7519ec70f7b962cc&token=2001057130&lang=zh_CN#rd) +​ +## 2. 必考经典面试题 +​ +- [Redis主从、哨兵、 Cluster集群一锅端!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498254&idx=1&sn=6489360c3b226df9811e66cb40ec7656&chksm=cf222527f855ac3112628bcec7730064fee3fdbe869fbd0a7410c22766a0c036a7e5c1a69fa0&token=2001057130&lang=zh_CN#rd) +- [我们为什么要分库分表?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498625&idx=1&sn=0d7bd9d1b46eeff4c715a6761355e9b0&chksm=cf2224a8f855adbea8931c8e011711f6c70cffeef8ddf8b87729c710eacef11b46eef80fda36&token=2001057130&lang=zh_CN#rd) +- [面试必备:聊聊MySQL的主从](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497982&idx=1&sn=bb589329cceb5462fc41f66ec63dbf56&chksm=cf2227d7f855aec16dd4d3b3425c0401850eeaf2c9cdc82e82722d38a00c24ee9ccfa3353774&token=2001057130&lang=zh_CN#rd) +- [消息队列经典十连问](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497847&idx=1&sn=29a32672b712e7dfadfa36c9902b2ec7&chksm=cf22275ef855ae484fb3f51a5726e9a4bc45222e8fbbd33631d177dc4b5619c36889ea178463&token=2001057130&lang=zh_CN#rd) +- [八种幂等设计](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497427&idx=1&sn=2ed160c9917ad989eee1ac60d6122855&chksm=cf2229faf855a0ecf5eb34c7335acdf6420426490ee99fc2b602d54ff4ffcecfdab24eeab0a3&token=2001057130&lang=zh_CN#rd) +- [看一遍就理解:零拷贝详解](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247496788&idx=1&sn=f65ddd10d16d8376efa0037762153932&chksm=cf222b7df855a26bad76249e7b77e28da3097b226f9165d79f5031516d9c345827fca901559c&token=2001057130&lang=zh_CN#rd) +- [看一遍就理解:IO模型详解](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247496448&idx=1&sn=cd502f850290a25949dd4a11ac55a039&chksm=cf222c29f855a53f094bde2868900fa252b07385e73564e9ee9f0510cb4e74387d9d23ab67e6&token=2001057130&lang=zh_CN#rd) +- [看一遍就理解:MVCC原理详解](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247495277&idx=1&sn=a1812febb4246f824ce54d778f672025&chksm=cf223144f855b8528ad6cce707dc3a1b4d387817bd751dfab4f79dda90c6640f9763d25f3f33&token=2001057130&lang=zh_CN#rd) +- [2W字!详解20道Redis经典面试题!(珍藏版)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247494124&idx=1&sn=c185f7d999d5f006608d05707a8a7eea&chksm=cf2236c5f855bfd329c6e2ee27f23f8131ebcd312960190a10f1a819d67f07a21a08ad17f263&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [七种方案!探讨Redis分布式锁的正确使用姿势](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488142&idx=1&sn=79a304efae7a814b6f71bbbc53810c0c&chksm=cf21cda7f85644b11ff80323defb90193bc1780b45c1c6081f00da85d665fd9eb32cc934b5cf&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [面试必备!TCP协议经典十五连问!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490868&idx=1&sn=96889bfe6a97f9200fa2d682cf2f5d89&chksm=cf21c21df8564b0b0757df584560a69340b1775fe1c70b867439565969ec3aed19c442ff4eeb&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [2W字!梳理50道经典计算机网络面试题(收藏版)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247492832&idx=1&sn=601fa1c340a313bc0f74bb75cdb6a95a&chksm=cf223bc9f855b2dfb8d0e74f3360e2edfe25c3a728fe17e9e80b6022340994fd9d9e1ca83ca8&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [ZooKeeper的十二连问,你顶得了嘛?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488047&idx=1&sn=4913c7e1c3b8835f7512d8dc6b845727&chksm=cf21cd06f8564410cce6121230256facb1ab3b5a9ed35579896f428d84bdea7b86836109d575&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [50道Java集合经典面试题(收藏版)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488007&idx=1&sn=c5c16c8ec916c791e776216f3177c7e2&chksm=cf21cd2ef85644382a985e9fed1956d6ee60c86ce69e65f31f775318435fdb86bf368e26edf2&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [100道MySQL数据库经典面试题解析(收藏版)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488000&idx=1&sn=1c38db7fd110bbcc1ffb2d72a56aaf25&chksm=cf21cd29f856443f25a3fe98ae8e888faceef9bee45df045969b2cffb105363dcc2a4480bb74&token=1495321435&lang=zh_CN&scene=21#wechat_redirect) +- [Spring 面试63问](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497672&idx=1&sn=6ff0350e23d014b29a47bdec79af9ef5&chksm=cf2228e1f855a1f70fa78d9bd85c53dfbe154c1325aa1e203e4c918132c430d51bb68e961eda&token=2001057130&lang=zh_CN#rd) \ No newline at end of file diff --git "a/Mysql345円237円272円347円241円200円345円255円246円344円271円240円/README.md" "b/Mysql345円237円272円347円241円200円345円255円246円344円271円240円/README.md" new file mode 100644 index 0000000..f335927 --- /dev/null +++ "b/Mysql345円237円272円347円241円200円345円255円246円344円271円240円/README.md" @@ -0,0 +1,2 @@ +- [聊聊select for update到底加了什么锁](https://mp.weixin.qq.com/s?__biz=MzkyMzU5Mzk1NQ==&mid=2247506728&idx=1&sn=5526ee3984e971d4c3b251c2ad76d658&chksm=c1e026a4f697afb28224d5ce0ecca7432879b357cd6433834c66d94c72a1935ba13e2e3e274e&token=337310304&lang=zh_CN#rd) +- [数据库死锁排查思路分享](https://mp.weixin.qq.com/s?__biz=MzkyMzU5Mzk1NQ==&mid=2247507770&idx=1&sn=b84b20aca057b34d511a501ff91941b5&chksm=c1e022b6f697aba05248128cb82f93aed341b1cc80e6d568c7150a4ffa6775692c7c9fa423a3&token=1822874069&lang=zh_CN#rd) diff --git a/README.md b/README.md index 6018cc3..7018310 100644 --- a/README.md +++ b/README.md @@ -1,11 +1,46 @@ -整理一份超级详细的Java面试题+后端基础+日常工作总结,做最暖心的男孩子,后面会慢慢把答案完善,希望大家找到理想offer +## 前言 -## 个人公众号 +整理一份超级详细的Java面试题+后端基础+日常工作总结,做最暖心的男孩子,后面会慢慢完善,希望大家找到理想offer + +⭐ 点右上角给一个 Star,鼓励技术人输出更多干货,感谢感谢,爱了! ! + +作者捡田螺的小男孩,浪迹过几家大厂,**掘金优秀创作者**,CSDN博主,知乎博主。以下内容全部出自公众号:**捡田螺的小男孩**,欢迎关注。 + +- [田螺原创精品100篇](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497536&idx=1&sn=3ac9934f607d79e51457fd01f4c8a4ef&chksm=cf222869f855a17fc30c744e5b7ccdeca407f3b7ddcca46bae1c93b1436ffc6fe417ccb8aef4&token=1990771297&lang=zh_CN#rd) + +## 工作总结 -![image](https://user-gold-cdn.xitu.io/2019/7/28/16c381c89b127bbb?w=344&h=344&f=jpeg&s=8943) +- [盘点数据库主从延迟的9个原因以及解决方案](https://mp.weixin.qq.com/s/aT7YjsTrM_dhDbddr8TSjg?token=528541177&lang=zh_CN) +- [实战项目,是如何保证缓存跟数据库数据一致性的?](https://mp.weixin.qq.com/s/UVHMeFDO4NYTnSwHZc9f1A?token=528541177&lang=zh_CN) +- [工作总结!日志打印的15个建议](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247494838&idx=1&sn=cdb15fd346bddf3f8c1c99f0efbd67d8&chksm=cf22339ff855ba891616c79d4f4855e228e34a9fb45088d7acbe421ad511b8d090a90f5b019f&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [25种代码坏味道总结+优化示例](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490148&idx=1&sn=00a181bf74313f751b3ea15ebc303545&chksm=cf21c54df8564c5bc5b4600fce46619f175f7ae557956f449629c470a08e20580feef4ea8d53&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [聊聊日常开发中,如何减少bug呢?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490662&idx=1&sn=d38a090611af7f64ee3c6a31331d5228&chksm=cf21c34ff8564a59e505e6edf3065a0fc506c6d2c96f492c8d8873cd46dedbe0704e43cb9c2e&token=1990771297&lang=zh_CN#rd) +- [工作四年,分享50个让你代码更好的小建议](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488708&idx=1&sn=6e2e0a740f5d42a59641487a0bf1e3bf&chksm=cf21cbedf85642fbb485fa1c7bf9af21923d8503f2542b6f8283ce79ddc683f7d9e45da83100&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [写代码有这16个好习惯,可以减少80%非业务的bug](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488097&idx=1&sn=eaca1f92ca3ccd9de00dbc4ef3e4029a&chksm=cf21cd48f856445e4cc24c1f8bcf18d1479bad0a37a87a2fb70717d8a4e65dcf7b4d5f83d24f&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java日常开发的21个坑,你踩过几个?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488115&idx=1&sn=bdd4a4ca36bc7ea902106d058e8537fb&chksm=cf21cd5af856444cb36af600705615454b0aaa2b289b97ddb52d594556ac07a1915b73ecce19&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [CAS乐观锁解决并发问题的一次实践](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487937&idx=1&sn=206a37bf6d6a7aa1d05674c479ed7a72&chksm=cf21cee8f85647fe7a082049a41c0f640f54976d2cdf4302b24c5517ca42b854eb84b13ece10&token=1990771297&lang=zh_CN#rd) +- [写代码有这些想法,同事才不会认为你是复制粘贴程序员](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487961&idx=1&sn=e646231067968d9f58e6665914293f9a&chksm=cf21cef0f85647e6f3ff2feece004ac3bd979e37fe45103c88d0f299dfe632a5cf6dd547c1d9&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [程序员必备:Java日期处理的十个坑](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487973&idx=1&sn=0f713413098fb579e5f200b829f71e89&chksm=cf21ceccf85647da450765d79bf5943da551c3be950447063b9f8c77c21bf2a39b99387a949b&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [内存泄漏问题的分析和解决方案](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487986&idx=1&sn=d681a585ac489703788e3baa48eb9aa3&chksm=cf21cedbf85647cd23bbab9dfec63e6877f83c34efb19bd16075d5d90fea91d3f4a20fc77921&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [程序员必备基础:加签验签](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488022&idx=1&sn=70484a48173d36006c8db1dfb74ab64d&chksm=cf21cd3ff8564429a1205f6c1d78757faae543111c8461d16c71aaee092fe3e0fed870cc5e0e&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [记一次接口性能优化实践总结:优化接口性能的八个建议](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488004&idx=1&sn=00840efd9c0bd0a7f172b59eb2ca130f&chksm=cf21cd2df856443bf21d8e09cfe5c8452ecaf82e3c2210fca3b28829ded04defddcf63c0a59b&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [程序员必备基础:如何安全传输存储用户密码?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488117&idx=1&sn=5d3d0eda0ed45f3f576e211de31ca3a9&chksm=cf21cd5cf856444af1407a94a2abf445265ca7c5f5855cfa1c223cb209e99040c7889621f231&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [一次代码优化实践,用了模板方法+策略+工厂方法模式](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488061&idx=1&sn=1d9ab7954b03521ab81ecf033c0e5e50&chksm=cf21cd14f8564402b213f0ef908bbdb0e12fed4b281c5803b8e539cacb1551654194becfb7d6&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [保证接口数据安全的10种方案](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247500285&idx=1&sn=7d0723f25d46e858859cfd79acb6fb9d&chksm=cf221ed4f85597c2093f81baa5fdedc65817bf2d23a7951236836b0f54c2335695cbed61cd13&token=1990771297&lang=zh_CN#rd) +- [实战总结!18种接口优化方案的总结](https://mp.weixin.qq.com/s?__biz=MzkyMzU5Mzk1NQ==&mid=2247506674&idx=1&sn=8b2914d9aafa334029495b029b69d0b6&chksm=c1e0277ef697ae68e8c2bffe4bd7d9849be3165ef1a20286538f6a7569a6ba0879d517d55b87&token=337310304&lang=zh_CN#rd) +- [聊聊工作中常用的Lambda表达式](https://mp.weixin.qq.com/s?__biz=MzkyMzU5Mzk1NQ==&mid=2247506654&idx=1&sn=4835e9f486e643765d4ad3b3fc93e079&chksm=c1e02752f697ae442f62fc122d7604f4b01979f6d1665df414bb499fd8ba211335ebc503c368&token=337310304&lang=zh_CN#rd) +- [21个MySQL表设计的经验准则](https://mp.weixin.qq.com/s?__biz=MzkyMzU5Mzk1NQ==&mid=2247506621&idx=1&sn=afca898cb461827054d706a92f9b9250&chksm=c1e02731f697ae27a83e5637ee2184d1e26e5090caeaa58121d3cf5afab7d4d5832cac6d171a&token=337310304&lang=zh_CN#rd) +- [程序员必备基础:如何安全传输存储用户密码?](https://mp.weixin.qq.com/s?__biz=MzkyMzU5Mzk1NQ==&mid=2247506023&idx=1&sn=b96dde436c1c9fe4bda745ca5ca1b170&source=41#wechat_redirect) + +## 福利 500+页原创面试题 + +- [田螺原创500+页面试题](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247499943&idx=1&sn=fe869c0a97a306e42830336fe74e17a6&chksm=cf221f8ef8559698781709bfbccbb85087286e48434905fb18bec3a3ec0af7329c2a1632c230&token=1990771297&lang=zh_CN#rd) + + +## 个人公众号 -- 如果你是个爱学习的好孩子,可以关注我公众号,一起学习讨论哈~~ +微信搜公众号:**捡田螺的小男孩** -## 一分也是爱,谢谢大家的支持哈~ -![](https://user-gold-cdn.xitu.io/2020/7/15/1735311bf66cecd8?w=430&h=580&f=jpeg&s=35456) +- 小伙伴可以关注我的公众号(扫描下面二维码,还有**很多很多干货文章**),一起学习讨论哈~~ +![扫一扫](https://user-images.githubusercontent.com/20244922/179399354-8a9fd2a8-42ba-4303-9ce5-04891e899e6d.png) diff --git "a/letecode350円247円243円351円242円230円347円256円227円346円263円225円344円273円213円347円273円215円/README.MD" "b/letecode350円247円243円351円242円230円347円256円227円346円263円225円344円273円213円347円273円215円/README.MD" new file mode 100644 index 0000000..921f58b --- /dev/null +++ "b/letecode350円247円243円351円242円230円347円256円227円346円263円225円344円273円213円347円273円215円/README.MD" @@ -0,0 +1,13 @@ +## leetcode(持续更新中) + +关注公众号:捡田螺的小男孩 + +- [看一遍就理解:动态规划详解](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247489016&idx=1&sn=bba3fb1a7a864b6ccefeb9f633751811&chksm=cf21cad1f85643c716c8c9396d3a6711f7722f8f81c8f40f5a91c525c98f73f5c476b7d49dd4&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [程序员必备的基本算法:递归详解](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488073&idx=1&sn=ec81b4a1f8b11ea59264b55e571fed91&chksm=cf21cd60f8564476952c5abb8ffa93fc38fde354a61ca5596e1875d35760383f3a92b2879e30&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [看一遍就理解,图解单链表反转](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487967&idx=1&sn=e75373dcb0507081c242ba018b42ca82&chksm=cf21cef6f85647e0cbf0b2072eb1264a44abcaa9f4a0621ef8954a1b1d6719560f7f4cbbce60&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [面试必备:回溯算法详解](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497665&idx=1&sn=39011296fa99eda839ab2bbe83a42cdf&chksm=cf2228e8f855a1fe8f059130dc0b3d9ad34431a27bbe7e16f508b7e9340c24e2e4dfd8b414c2&token=1990771297&lang=zh_CN#rd) +- [leetcode必备算法:聊聊滑动窗口](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247496003&idx=1&sn=8c40eb3e611514f3bafb8d6873c03fda&chksm=cf222e6af855a77ce2fc36d4e4fc02945286300206f43975e30bc23b65c9ca67b6a1ac9806d1&token=1990771297&lang=zh_CN#rd) +- [五分钟搞定贪心算法,从此不惧大厂面试](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490681&idx=1&sn=0388da1492fe0fdfa3ed6b1a43511328&chksm=cf21c350f8564a466d89578f73886eb462c6dd485f42e7953f126be5f9af49b3fb0be3457d52&token=1990771297&lang=zh_CN#rd) +- [双指针+归并排序!图解排序链表!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247496038&idx=1&sn=96a1a665e43ee9e3337e3d941db49f1e&chksm=cf222e4ff855a75919f0be68e78472199c44d0e9d94de6d5bf621a892ba211738d6f4dbd53ac&token=1990771297&lang=zh_CN#rd) +- [双指针技巧](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488116&idx=1&sn=aeec0553e2317bef76d158d2b0e0b5a5&chksm=cf21cd5df856444b8963efc2745bce6801df4bc547b679ae8366fa8c3cd293f1f7c60c18e4f6&token=1990771297&lang=zh_CN#rd) +- [字符串匹配算法详解](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247494506&idx=1&sn=1f13b0cc1f03af464e1063be8ef1cb57&chksm=cf223443f855bd5597898126d12c6039f64da47b8a95714018203ee5e453950c802ebecfabe1&token=1990771297&lang=zh_CN#rd) diff --git "a/344円270円255円351円227円264円344円273円266円/README.MD" "b/344円270円255円351円227円264円344円273円266円/README.MD" new file mode 100644 index 0000000..74d80b2 --- /dev/null +++ "b/344円270円255円351円227円264円344円273円266円/README.MD" @@ -0,0 +1,8 @@ +## 中间件 + +- [一文快速入门分库分表中间件 Sharding-JDBC (必修课)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247499781&idx=1&sn=74bbb25c9347408f1edf7f8c9c82d7cf&chksm=cf221f2cf855963a6549069deeabe93bb6d6e889bcd086668bf6f0e23327fa1ddb31adc6d10c&token=1990771297&lang=zh_CN#rd) +- [全方位对比Zookeeper、Eureka、Nacos、Consul和Etcd](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498268&idx=1&sn=7b24b8625fb4ff88d50c9bd55335f478&chksm=cf222535f855ac230dfca629127f93efec606641d7338c29a8d41e7d2016a7f0b6ec28a432a0&token=1990771297&lang=zh_CN#rd) +- [消息队列经典十连问](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497847&idx=1&sn=29a32672b712e7dfadfa36c9902b2ec7&chksm=cf22275ef855ae484fb3f51a5726e9a4bc45222e8fbbd33631d177dc4b5619c36889ea178463&token=1990771297&lang=zh_CN#rd) +- [Kafka性能篇:为何Kafka这么"快"?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488717&idx=1&sn=006c65f9a9a5796961c42f3cafc37cb4&chksm=cf21cbe4f85642f2e8ff948f8de8a69508783cee6dafd22512d6a06cd03f7065001bd1d8d87b&token=1990771297&lang=zh_CN#rd) +- [后端程序员必备:RocketMQ相关流程图/原理图](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487949&idx=1&sn=888e0917884b2918a94053e5cd560e00&chksm=cf21cee4f85647f24877791d574f5ef3f979fc9c4c84ca3fd1ea1aa08ab30c1041ad3aaa5650&token=1990771297&lang=zh_CN#rd) +- [ZooKeeper的十二连问,你顶得了嘛?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488047&idx=1&sn=4913c7e1c3b8835f7512d8dc6b845727&chksm=cf21cd06f8564410cce6121230256facb1ab3b5a9ed35579896f428d84bdea7b86836109d575&token=162724582&lang=zh_CN&scene=21#wechat_redirect) \ No newline at end of file diff --git "a/345円210円206円345円270円203円345円274円217円/README.MD" "b/345円210円206円345円270円203円345円274円217円/README.MD" new file mode 100644 index 0000000..1b5f507 --- /dev/null +++ "b/345円210円206円345円270円203円345円274円217円/README.MD" @@ -0,0 +1,12 @@ +## 分布式 + +关注公众号:捡田螺的小男孩 + +- [面试必备:聊聊分布式锁的多种实现!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498595&idx=1&sn=4e5308930e151a609baa2df820e48a89&chksm=cf22244af855ad5c71822cb33e828ce652c6f34202096a9344922b86dcbc08076d7922acde5f&token=1990771297&lang=zh_CN#rd) +- [我们为什么要分库分表?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498625&idx=1&sn=0d7bd9d1b46eeff4c715a6761355e9b0&chksm=cf2224a8f855adbea8931c8e011711f6c70cffeef8ddf8b87729c710eacef11b46eef80fda36&token=1990771297&lang=zh_CN#rd) +- [聊聊高可用的 11 个关键技巧](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498784&idx=1&sn=aad1c00d6eafb0c1f08959612c69959a&chksm=cf222309f855aa1f71ef9cf470bfa72ac73365c401ec7c7d0c3b241a9116c3112f83760793e8&token=1990771297&lang=zh_CN#rd) +- [看一遍就理解:分布式事务详解](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498358&idx=1&sn=aa6c7ceb61b73267d68d1b4fb7ccc2ed&chksm=cf22255ff855ac495861d57df276517e89779006267fa8413fe925cc15b0c3e0b0f1b1a5675e&token=1990771297&lang=zh_CN#rd) +- [几种主流的分布式定时任务,你知道哪些?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498121&idx=1&sn=e3d7e4f5297c7b2390b412a9bafc3385&chksm=cf2226a0f855afb669cde8d7f400fb334bd4c75a8c672d1208667387d03d2dfd24884e60b825&token=1990771297&lang=zh_CN#rd) +- [redis分布式锁的8大坑,记得拿小本本记下来啦](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247495390&idx=1&sn=87cc1567c709cfa67b43dd8d273bb426&chksm=cf2231f7f855b8e17919f7763469d87c47d9b4c4ad25aba7e6ff60fa33b048bc47a4afd287fc&token=1990771297&lang=zh_CN#rd) +- [框架篇:分布式一致性解决方案](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490468&idx=2&sn=91b8e5dd2ce3db218708b5c736fce700&chksm=cf21c48df8564d9b30164e1dbf9b5ebcc1847a9450d08ee146c98eb53107af475149ad12a748&token=1990771297&lang=zh_CN#rd) +- [这三年被分布式坑惨了,曝光十大坑](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488553&idx=2&sn=fa13e9698e59f5a5485d3d3d4b8ef2b1&chksm=cf21cb00f8564216277806780c64e13c48fe32009f588349b3365afa8de97bd8ef192507bd50&token=1990771297&lang=zh_CN#rd) \ No newline at end of file diff --git "a/345円210円267円leetcode345円277円205円345円244円207円347円256円227円346円263円225円/347円234円213円344円270円200円351円201円215円345円260円261円347円220円206円350円247円243円357円274円232円345円212円250円346円200円201円350円247円204円345円210円222円350円257円246円350円247円243円.md" "b/345円210円267円leetcode345円277円205円345円244円207円347円256円227円346円263円225円/347円234円213円344円270円200円351円201円215円345円260円261円347円220円206円350円247円243円357円274円232円345円212円250円346円200円201円350円247円204円345円210円222円350円257円246円350円247円243円.md" deleted file mode 100644 index e8cc9b4..0000000 --- "a/345円210円267円leetcode345円277円205円345円244円207円347円256円227円346円263円225円/347円234円213円344円270円200円351円201円215円345円260円261円347円220円206円350円247円243円357円274円232円345円212円250円346円200円201円350円247円204円345円210円222円350円257円246円350円247円243円.md" +++ /dev/null @@ -1,440 +0,0 @@ - -### ǰ�� - -����sleetcode��ɦ�򣬾��������̬�滮������L·����̬�滮�����dz��dz����䣬Ҳ���м����ԣ�һ���󳧶��dz�ς���ʡ�����������һ����ѧκ��̬�滮����·�����������в���ȷ�ĵط�����ӭ����ָ��������л��л~ - -- jô�Ƕ�̬�滮�� -- ��̬�滮�ĺ���˼�� -- һ�������߽���̬�滮 -- ��̬�滮�Ľ�����· -- leetcode�������� - - -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/01fdad6c74864d7da07193203c2dcbf4~tplv-k3u1fbpfcp-zoom-1.image) - - -���ںţ�**�����ݵ�С�к�** - -### jô�Ƕ�̬�滮�� - - -��̬�滮��Ӣ�Dynamic programming������ DP������һ������ѧ��������ѧ����������ѧ������ѧ��������Ϣѧ��ʹ�õģ�ͨ����ԭ�����ֽ�Ϊ���Լ򵥵��������ķ�ʽ���⸴�������ķ�������̬�滮�������������ص��������������ӽṹ���ɻ����⡣ - -> dynamic programming is a method for solving a complex problem by breaking it down into a collection of simpler subproblems. - -���϶�������ά���ٿƣ��������о������е����󡣼�����˵����̬�滮��ɻ���ǣ�����һ�����⣬���ǰ�������һ���������⣬ֱ������������ֱ�ӽ�����Ȼ���أ����������𰸱����������Լ����ظ����㡣�يٴ����������𰸷��ƣ��ó�ԭ��������һ�ַ����� -> һ����Щ�����������ƣ�����ͨ��������εʽ���Ƴ�����Ȼ���أ���̬�滮�������ڽ���ÿ��������һ�Σ������ظ�����,����쳲��������оͿ��Կ������ż��ľ��䶯̬�滮���⡣ - - -### ��̬�滮����˼�� - -��̬�滮�����ĵ�˼�룬������**���������⣬��ס�����������ظ�����**�� - -![��̬�滮���ڼ�ס����](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d26f967ff6e447d291b0b196c4edaa07~tplv-k3u1fbpfcp-watermark.image) - -���������£����ρȽ����е�һ�����ӣ� -> - A �� "1+1+1+1+1+1+1+1 =��" -> - A �� "������ʽ��ֵ�Ƕ���" -> - B �� ���� "8" -> - A : ��������ʽ������д�� "1+" �أ� -> - A : "��ɦ��ʽ��ֵΪ����" -> - B : �ܿ��ó����� "9" -> - A : "����ô��ô����֪��������" -> - A : "ֻҪ��8�Ļ����ϼ�1������" -> - A : "�����㲻�����1⁄4��㣬��Ϊ����ס�˵�һ����ʽ��ֵΪ8!��̬�滮�㷨Ҳ����˵�� '��ס�����Ľ�����ʡɦ��'" - -### һ�����Ӵ����߽���̬�滮 -- ������������ - -#### �����ݹ� - -> leetcodeԭ�⣺һֻ����һ�ο�������1��̨�ף�Ҳ��������2��̨�ס�������������һ�� 10 ����̨���ܹ��ж������� - -��ЩС������һ�μ���������ɦ�򣬿��ܻ��е���Ȧ����֪����ô��������ɻ�������룺 -> - Ҫ��������10��̨�ף�Ҫô����������9����Ȼ������1��̨����ȥ;Ҫô����������8����Ȼ��һ����2��̨����ȥ�� -> - ͬ��Ҫ��������9��̨�ף�Ҫô����������8����Ȼ������1��̨����ȥ;Ҫô����������7����Ȼ��һ����2��̨����ȥ�� -> - Ҫ��������8��̨�ף�Ҫô����������7����Ȼ������1��̨����ȥ;Ҫô����������6����Ȼ��һ����2��̨����ȥ�� - -����������n��̨�׵��������Ƕ���Ϊf(n)������Ȼ�Ϳ��Եó����1�ʽ�� - -``` -f��10�� = f��9��+f(8) -f (9) = f(8) + f(7) -f (8) = f(7) + f(6) -... -f(3) = f(2) + f(1) - -��ͨ�ù�ʽΪ: f(n) = f(n-1) + f(n-2) -``` - -��f(2) ���� f(1) ���ڶ����أ� -- ��ֻ��2��̨��ɦ������������һ����ֱ�����������ڶ���������һ����Ȼ������һ������f(2) = 2; -- ��ֻ��1��̨��ɦ��ֻ��һ������f��1��= 1�� - - -���˿����õݹ�ȥ�����������⣺ -``` -class Solution { - public int numWays(int n) { - if(n == 1){ - return 1; - } - if(n == 2){ - return 2; - } - return numWays(n-1) + numWays(n-2); - } -} -``` - -ȥleetcode�ύһ�£����������⣬����ɦ�������� - -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/3e0608ec89a246568e01c7ba4b8f50d8~tplv-k3u1fbpfcp-zoom-1.image) - - -Ϊjô��ɦ���أ��ݹ���ɦ�������أ��Ȼ���**�ݹ���**������ - - -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/2dd95840552e4a7db9536884b7a9b558~tplv-k3u1fbpfcp-zoom-1.image) - -- Ҫ����ԭ���� f(10)������Ҫ�ȼ����������� f(9) �� f(8) -- Ȼ��Ҫ���� f(9)����Ҫ������������ f(8) �� f(7)���Դ����ơ� -- һֱ�� f(2) �� f(1�����ݹ�������ֹ�� - -�����������������ݹ���ɦ�临�ӶȰɣ� - - -``` -�ݹ�ɦ�临�Ӷ� = ����һ��������ɦ��*���������� -``` - -- һ��������ɦ�� = f��n-1��+f��n-2����Ҳ����һ���ӷ��IJ��������Ը��Ӷ��� O(1)�� -- �������� = �ݹ����ڵ����������ݹ������ܽڵ� = 2^n-1�������Ǹ��Ӷ�O(2^n)�� - -���x��������ף��ݹ��ⷨ��ɦ�临�Ӷ� = O(1) * O(2^n) = O(2^n)������ָ�������ģ���ը��ģ�����n�ȽΘ��Ļ�����ɦ���������l� - -�ع�ͷ��������ϸ�۲����ŵݹ��������ᷢ�ִ��ڴ����ظ����㣬����f��8�������������Σ�f��7�����ظ�������3��...���������ݹ��㷨��Ч��ԭ�򣬾���**���ڴ������ظ�����**�� - -��Ȼ���ڴ����ظ����㣬��ô���ǿ����ȰѼ����õĴ𰸴�����������һ������1⁄4���ȵ�� ́���Ҫ�Ļ�����ȥ����1⁄4��һ�£������У���ֱ��ȡ� ͅ��x�����1⁄4û�вs�ʼ���㣬�ǾͿ���ʡȥ�����ظ������ĺ�ɦ���������Ǵ�����1⁄4�Ľⷨ�� - - - -#### ������1⁄4�ĵݹ��ⷨ���Զ����£� - -һ��ʹ��һ����������һ����ϣmap�䵱����**����1⁄4**�� -- ��һ����f��10��= f(9) + f(8)��f(9) ��f��8������Ҫ����������Ȼ���ټӵ�����1⁄4�У����£� - - - -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/94484290462e45c799609b0a581b14b0~tplv-k3u1fbpfcp-zoom-1.image) - -- �ڶ����� f(9) = f��8��+ f��7����f��8��= f��7��+ f(6), ��Ϊ f(8) �Ѿ��ڱ���1⁄4���������Կ���ʡ����f(7),f��6������Ҫ�����������ӵ�����1⁄4��~ - - -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/12900b17d77f4adfbdb71920f729d61a~tplv-k3u1fbpfcp-zoom-1.image) - - -�������� f(8) = f��7��+ f(6),����f(8)��f(7),f��6��ȫ�����ڱ���1⁄4���x����Զ����Լ����� - - -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9a8c7ba6b5ae413799c6a33490bb1f8f~tplv-k3u1fbpfcp-zoom-1.image) - -�����أ����˱���1⁄4�ݹ��㷨���ݹ������ɹ� ͅ ͅ�����ɿ������£� - -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/18a78d6b99a84ff8a1df834f3c085014~tplv-k3u1fbpfcp-zoom-1.image) - -��**����1⁄4**�ĵݹ��㷨������������=���ڵ���=n������һ�������⻹��O(1),���Դ�**����1⁄4**�ĵݹ��㷨��ɦ�临�Ӷ���O(n)���������أ������ô�**����1⁄4**�ĵݹ��㷨ȥߣ���룬���������������������ij�ɦ���⿩~���������£� - - - -``` -public class Solution { - //ʹ�ù�ϣmap���䵱����1⁄4������ - Map tempMap = new HashMap(); - public int numWays(int n) { - // n = 0 Ҳ��1�� - if (n == 0) { - return 1; - } - if (n <= 2) { - return n; - } - //���ж���û�������������1⁄4��û�� - if (tempMap.containsKey(n)) { - //����1⁄4�У�����������ֱ�ӷ��� - return tempMap.get(n); - } else { - // ����1⁄4û�У���û�м�������ִ�еݹ�����,���Ұѽ������浽����1⁄4map�У���1000000007ȡ�ࣨ������leetcode��L·�涨�ģ� - tempMap.put(n, (numWays(n - 1) + numWays(n - 2)) % 1000000007); - return tempMap.get(n); - } - } -} -``` -ȥleetcode�ύһ�£���ͼ�����x� - -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e5f0fb1998c542dc8cb3826de800f443~tplv-k3u1fbpfcp-zoom-1.image) - -��ɻ���������ö�̬�滮���������⡣ - -#### �Ե����εĶ�̬�滮 - -��̬�滮��������1⁄4�ĵݹ��ⷨ����˼����һ�μģ����Ǽ����ظ����㣬ɦ�临�Ӷ�Ҳ���Dz�ࡣ�����أ� -- ������1⁄4�ĵݹ飬�Ǵ�f(10)��f(1���������������ģ�����Ҳ��Ϊ**�Զ�����**�Ľⷨ�� -- ��̬�滮�ӽ�С�����Ľ⣬�ɽ������ʣ��𲽾��߳��Θ������Ľ⣬���Ǵ�f(1)��f(10�����������������⣬���Գ�Ϊ**�Ե�����**�Ľⷨ�� - - -��̬�滮�м�������������**�����ӽṹ��״̬ת�Ʒ��̡��߽硢�ص�������**�����������������У� -- f(n-1)��f(n-2) ��Ϊ f(n) �������ӽṹ -- f(n)= f��n-1��+f��n-2���ͳ�Ϊ״̬ת�Ʒ��� -- f(1) = 1, f(2) = 2 ���DZ߽��� -- ����f(10)= f(9)+f(8),f(9) = f(8) + f(7) ,f(8)�����ص������⡣ - -�����������Ե����εĽⷨ����f(1)��f(10�������������Dz���ֱ��һ��forѭ���Ϳ��Խ����������£� - -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8e21b14d47e64afa958506d49972827b~tplv-k3u1fbpfcp-zoom-1.image) - -������1⁄4�ĵݹ��ⷨ���ռ临�Ӷ���O(n)�������أ���ϸ�۲���ͼ�����Է��֣�f��n��ֻ����ǰ��������������ֻ��Ҫ��������a��b���洢���Ϳ������������x����˿ռ临�Ӷ���O(1)�Ϳ����� - -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/8b202b2364eb4aae9122cfa8474c045e~tplv-k3u1fbpfcp-zoom-1.image) - -��̬�滮ɻ�ִ������£� - -``` -public class Solution { - public int numWays(int n) { - if (n<= 1) { - return 1; - } - if (n == 2) { - return 2; - } - int a = 1; - int b = 2; - int temp = 0; - for (int i = 3; i <= n; i++) { - temp = (a + b)% 1000000007; - a = b; - b = temp; - } - return temp; - } - } -``` - -### ��̬�滮�Ľ�����· - -#### jô�����������Կ���ʹ�ö�̬�滮�����أ� - -> ����һ�����⣬���԰����п��ܵĴ������ٳ������������ٳ����󣬷��ִ����ص������⣬�Ϳ��Կ���ʹ�ö�̬�滮�� - -����һЩ����ֵ�ij�������**����������С���С�༭���롢�������⡢����Ǯ����**�ȵȣ����Ƕ�̬�滮�ľ���Ӧ�ó����� - - -### ��̬�滮�Ľ���˼· - - -��̬�滮�ĺ���˼������**���������⣬��ס�����������ظ����㡣** ���Ҷ�̬�滮һ�㶼���Ե����εģ����˵��������**��������**���⣬���ܽ���һ��������̬�滮��˼·�� - -- ���ۇٴ��� -- ȷ���߽� -- �ҳ����ɣ�ȷ�������ӽṹ -- д��״̬ת�Ʒ��� - - -#### 1. ���ۇٴ��� - - -- ��̨������1��ɦ������һ����f��1�� =1 -- ��ֻ��2��̨��ɦ������������һ����ֱ�����������ڶ���������һ����Ȼ������һ������f(2) = 2; -- ��̨����3��ɦ����������3��̨�ף�Ҫô����������2����Ȼ������1��̨����ȥ��Ҫô���������� 1����Ȼ��һ���� 2 ��̨����ȥ������f(3) = f(2) + f(1) =3 -- ��̨����4��ɦ����������3��̨�ף�Ҫô����������3����Ȼ������1��̨����ȥ��Ҫô���������� 2����Ȼ��һ���� 2 ��̨����ȥ������f(4) = f(3) + f(2) =5 -- ��̨����5��ɦ...... - -![�Ե����εĶ�̬�滮](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/29cd6d0d31514336baf9905f8084a624~tplv-k3u1fbpfcp-zoom-1.image) - - - -#### 2. ȷ���߽� - -ͨ�����ۇٴ��������Ƿ��֣���̨������1��ɦ������2��ɦ�򣬿�����ȷ֪��������f��1�� =1��f(2) = 2����̨��n>=3ɦ���Ѿ����ֳ�����f(3) = f(2) + f(1) =3������f��1�� =1��f(2) = 2�����������׵ı߽硣 - - -#### 3. �ҹ��ɣ�ȷ�������ӽṹ - -n>=3ɦ���Ѿ����ֳ����� f(n) = f(n-1) + f(n-2) �����x�f(n-1)��f(n-2) ��Ϊ f(n) �������ӽṹ��jô�������ӽṹ������ôһ�����ͣ� - -> һ����̬�滮���⣬��ɻ����һ���������⡣���赱ǰ���߽�����f(n),�������ӽṹ����Ҫ�� f(n-k) ����,�����ӽṹ���ʾ�������ת�Ƶ�n��״̬�����ŵ�,�����������ľ���û�й�ε,���ú����ľ��߰��ĵ�ʹ��ǰ���ľֲ����Ž���һ������ - - -#### 4�� д��״̬ת�Ʒ��� - -ͨ��ǰ��3�������ۇٴ�����ȷ���߽磬�����ӽṹ�����ǾͿ��Եó�״̬ת�Ʒ������� - -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4fb4cd7257ff4fcbac9d87be96f353bd~tplv-k3u1fbpfcp-zoom-1.image) - -#### 5. ����ɻ�� - -����ɻ�ִ�����ɦ����һ��ע���ӵ����ρ�������Ȼ����ע�±߽�����ռ临�Ӷȣ�Ҳ�Ͳ��������̬�滮�и����ܵģ�����ɻ�ֵ�ɦ�򣬿��Կ����ɻ��ο�һ�£� - - -``` -dp[0][0][...] = �߽�ֵ -for(״̬1 ������״̬1��ֵ){ - for(״̬2 ������״̬2��ֵ){ - for(...){ - //״̬ת�Ʒ��� - dp[״̬1][״̬2][...] = ����ֵ - } - } -} -``` - - -### leetcode�������� - -����һ��������һ������leetcode��L·�� - -> ����һ���������� nums ���ҵ�������ϸ����������еij��ȡ� - -ʾ�� 1�� - -``` -���룺nums = [10,9,2,5,3,7,101,18] -������4 -���ͣ�������������� [2,3,7,101]�����˳���Ϊ 4 �� -``` - -ʾ�� 2�� - - -``` -���룺nums = [0,1,0,3,2,3] -������4 -``` - -���ǰ������϶�̬�滮�Ľ���˼·�� - -- ���ۇٴ��� -- ȷ���߽� -- �ҹ��ɣ�ȷ�������ӽṹ -- ״̬ת�Ʒ��� - - -#### 1.���ۇٴ��� - - -��Ϊ��̬�滮������˼������**���������⣬��ס�����������ظ����㡣** ����������˼��ԭ���⣺**����num[i]������������г���ɦ**������˼����**����������**������ԭ�����Ƿ���**������**num[i-1]������������г����й��أ� - -##### �Զ����ε����� - -�����۲����ɣ���Ȼ���й�ε�ģ����ǻ�����ѭ��̬�滮**�Ե�����**��ԭ�򣬻���ʾ��1�����ݣ�������ֻ��һ��Ԫ�ؿ�ʼ������ - -- ��numsֻ��һ��Ԫ��10ɦ���������������[10],������1. -- ��nums��Ҫ����һ��Ԫ��9ɦ���������������[10]����[9],������1�� -- ��nums�ټ���һ��Ԫ��2ɦ���������������[10]����[9]����[2],������1�� -- ��nums�ټ���һ��Ԫ��5ɦ���������������[2,5],������2�� -- ��nums�ټ���һ��Ԫ��3ɦ���������������[2,5]����[2,3],������2�� -- ��nums�ټ���һ��Ԫ��7ɦ��,�������������[2,5,7]����[2,3,7],������3�� -- ��nums�ټ���һ��Ԫ��101ɦ���������������[2,5,7,101]����[2,3,7,101],������4�� -- ��nums�ټ���һ��Ԫ��18ɦ���������������[2,5,7,101]����[2,3,7,101]����[2,5,7,18]����[2,3,7,18],������4�� -- ��nums�ټ���һ��Ԫ��7ɦ,�������������[2,5,7,101]����[2,3,7,101]����[2,5,7,18]����[2,3,7,18],������4. - -##### �����ҹ��ɣ����������� -ͨ���������������ǿ���**����һ������**�� - -�����1⁄4���һ��Ԫ��nums[i], �����������Ҫô**����nums[i]��β�ĵ���������**��Ҫô����**nums[i-1]�������������**�������������Dz��Ǻܿ��ģ�nums[i]��������������Ѿ���**������** nums[i-1]��������������й����l� - -``` -ԭ��������nums[i]������������� = ����������nums[i-1]�������������/nums[i]��β������������� -``` - -�Dz��Ǹо��ɹ���һ���أ�����**���ΰ�nums[i]��β�ĵ���������Ҳת��Ϊ��Ӧ��������**�أ�Ҫ��nums[i]��β�ĵ���������Ҳ��nums[i-1]��������������йؾ ͅ��l��ֻ���nums[i]��β������������У���ǰ��������num[j]��0= - nums[3]=5,��```5```��β��������о���```[2,5]```,��Ϊ�������±�```0��3```������ֻ�ҵ���������```[2]```��```5```С�����Ծ���```[2]+[5]```������```dp[4]=2``` -> - nums[4]=3,��```3```��β��������о���```[2,3]```,��Ϊ�������±�```0��4```������ֻ�ҵ���������```[2]```��```3```С�����Ծ���```[2]+[3]```������```dp[4]=2``` -> - nums[5]=7����```7```��β��������о���```[2,5,7]```��```[2,3,7]```,��Ϊ�������±�```0��5```�������ҵ�```2,5��3```����7С�����Ծ���```[2,7],[5,7],[3,7],[2,5,7]��[2,3,7]```��Щ�����У�������о���```[2,5,7]��[2,3,7]```��������������```5```��β��```3```��β�������������+[7]��������ԣ�**```dp[5]=3 =dp[3]+1=dp[4]+1```**�� - - -����Ȼ���������ɣ�һ����nums[i]��β������nums -- ��������j��������[0��i-1],����num[i]>num[j]�Ļ������У�dp(i) =max(dp(j))+1�� - -#### ���򵥵ı߽����� - -��nums����ֻ��һ��Ԫ��ɦ������������еij���dp(1)=1,��nums����������Ԫ��ɦ��dp(2) =2����1�� -���˱߽�����dp(1)=1�� - -#### ȷ�������ӽṹ - -�����ۇٴ��������ǿ��Եó������μ����Žṹ�� - -``` -dp(i) =max(dp(j))+1������j��������[0��i-1],����num[i]>num[j]�� -``` -**max(dp(j))** ���������ӽṹ�� - -#### ״̬ת�Ʒ��� - -ͨ��ǰ�����������ǾͿ��Եó�״̬ת�Ʒ������� - -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/457ce281c1ec4e91b8c868aa593e41b6~tplv-k3u1fbpfcp-zoom-1.image) - -��������num[i]������������о��ǣ� -``` -����������� =max(dp[i]) -``` - - - - -#### ����ɻ�� - -``` -class Solution { - public int lengthOfLIS(int[] nums) { - if (nums.length == 0) { - return 0; - } - int[] dp = new int[nums.length]; - //��ʼ�����DZ߽����� - dp[0] = 1; - int maxans = 1; - //�Ե����ρ��� - for (int i = 1; i < nums.length; i++) { - dp[i] = 1; - //���±�0��i���� - for (int j = 0; j < i; j++) { - //�ҵ�ǰ����nums[i]С����nums[j],����dp[i]= dp[j]+1 - if (nums[j] < nums[i]) { - //��Ϊ���ж���С��nums[i]������Ҳ���ǻ����ڶ�������������Ǿ�ȡ�����ŵ�dp[i] - dp[i] = Math.max(dp[i], dp[j] + 1); - } - } - //����dp[i]����dp�����Ǹ�����nums��������������� - maxans = Math.max(maxans, dp[i]); - } - return maxans; - } -} -``` - - - - - - - - - - - - - diff --git "a/345円210円267円leetcode345円277円205円345円244円207円347円256円227円346円263円225円/347円234円213円344円270円200円351円201円215円345円260円261円347円220円206円350円247円243円357円274円232円345円212円250円346円200円201円350円247円204円345円210円222円350円257円246円350円247円243円.md.bak" "b/345円210円267円leetcode345円277円205円345円244円207円347円256円227円346円263円225円/347円234円213円344円270円200円351円201円215円345円260円261円347円220円206円350円247円243円357円274円232円345円212円250円346円200円201円350円247円204円345円210円222円350円257円246円350円247円243円.md.bak" deleted file mode 100644 index e69de29..0000000 diff --git "a/345円210円267円leetcode345円277円205円345円244円207円347円256円227円346円263円225円/351円200円222円345円275円222円350円257円246円350円247円243円.md" "b/345円210円267円leetcode345円277円205円345円244円207円347円256円227円346円263円225円/351円200円222円345円275円222円350円257円246円350円247円243円.md" deleted file mode 100644 index fb5ecdb..0000000 --- "a/345円210円267円leetcode345円277円205円345円244円207円347円256円227円346円263円225円/351円200円222円345円275円222円350円257円246円350円247円243円.md" +++ /dev/null @@ -1,380 +0,0 @@ -### 前言 -递归是一种非常重要的算法思想,无论你是前端开发,还是后端开发,都需要掌握它。在日常工作中,统计文件夹大小,解析xml文件等等,都需要用到递归算法。它太基础太重要了,这也是为什么面试的时候,面试官经常让我们手写递归算法。本文呢,将跟大家一起学习递归算法~ - -- 什么是递归? -- 递归的特点 -- 递归与栈的关系 -- 递归应用场景 -- 递归解题思路 -- leetcode案例分析 -- 递归可能存在的问题以及解决方案 - - -**公众号:捡田螺的小男孩** - -### 什么是递归? - -递归,在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。简单来说,递归表现为函数调用函数本身。在知乎看到一个比喻递归的例子,个人觉得非常形象,大家看一下: - -> 递归最恰当的比喻,就是查词典。我们使用的词典,本身就是递归,为了解释一个词,需要使用更多的词。当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词,可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。 - -来试试水,看一个递归的代码例子吧,如下: -``` -public int sum(int n) { - if (n <= 1) { - return 1; - } - return sum(n - 1) + n; -} -``` - -### 递归的特点 - -实际上,递归有两个显著的特征,终止条件和自身调用: -- 自身调用:原问题可以分解为子问题,子问题和原问题的求解方法是一致的,即都是调用自身的同一个函数。 -- 终止条件:递归必须有一个终止的条件,即不能无限循环地调用本身。 - -结合以上demo代码例子,看下递归的特点: - -![](https://imgkr2.cn-bj.ufileos.com/94f250ad-41ea-4760-ae79-060f91605aeb.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=gQGMVnPTDwM%252F5AX2OrH%252F0ugG9MA%253D&Expires=1602691176) - - -### 递归与栈的关系 -其实,递归的过程,可以理解为出入栈的过程的,这个比喻呢,只是为了方便读者朋友更好理解递归哈。以上代码例子计算sum(n=3)的出入栈图如下: -![](https://imgkr2.cn-bj.ufileos.com/d4f09883-727b-44b6-90e0-dfad9d768b8c.jpg?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=V%252BDCQxqTa24HsCxQcooMJ%252FzuOHc%253D&Expires=1602692111) - - -为了更容易理解一些,我们来看一下 函数sum(n=5)的递归执行过程,如下: -![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f587c37fea484be192fec7710634ec47~tplv-k3u1fbpfcp-zoom-1.image) - -- 计算sum(5)时,先sum(5)入栈,然后原问题sum(5)拆分为子问题sum(4),再入栈,直到终止条件sum(n=1)=1,就开始出栈。 -- sum(1)出栈后,sum(2)开始出栈,接着sum(3)。 -- 最后呢,sum(1)就是后进先出,sum(5)是先进后出,因此递归过程可以理解为栈出入过程啦~ - - -### 递归的经典应用场景 -哪些问题我们可以考虑使用递归来解决呢?即递归的应用场景一般有哪些呢? -- 阶乘问题 -- 二叉树深度 -- 汉诺塔问题 -- 斐波那契数列 -- 快速排序、归并排序(分治算法也使用递归实现) -- 遍历文件,解析xml文件 - -### 递归解题思路 -解决递归问题一般就三步曲,分别是: -- 第一步,定义函数功能 -- 第二步,寻找递归终止条件 -- 第二步,递推函数的等价关系式 - -这个递归解题三板斧理解起来有点抽象,我们拿阶乘递归例子来喵喵吧~ - -#### 1.定义函数功能 -定义函数功能,就是说,你这个函数是干嘛的,做什么事情,换句话说,你要知道递归原问题是什么呀?比如你需要解决阶乘问题,定义的函数功能就是n的阶乘,如下: -``` -//n的阶乘(n为大于0的自然数) -int factorial (int n){ - -} -``` - -#### 2.寻找递归终止条件 -递归的一个典型特征就是必须有一个终止的条件,即不能无限循环地调用本身。所以,用递归思路去解决问题的时候,就需要寻找递归终止条件是什么。比如阶乘问题,当n=1的时候,不用再往下递归了,可以跳出循环啦,n=1就可以作为递归的终止条件,如下: -``` -//n的阶乘(n为大于0的自然数) -int factorial (int n){ - if(n==1){ - return 1; - } -} -``` - -#### 3.递推函数的等价关系式 -递归的**本义**,就是原问题可以拆为同类且更容易解决的子问题,即**原问题和子问题都可以用同一个函数关系表示。递推函数的等价关系式,这个步骤就等价于寻找原问题与子问题的关系,如何用一个公式把这个函数表达清楚**。阶乘的公式就可以表示为 f(n) = n * f(n-1), 因此,阶乘的递归程序代码就可以写成这样,如下: -``` -int factorial (int n){ - if(n==1){ - return 1; - } - return n * factorial(n-1); -} -``` -**注意啦**,不是所有递推函数的等价关系都像阶乘这么简单,一下子就能推导出来。需要我们多接触,多积累,多思考,多练习递归题目滴~ - -### leetcode案例分析 - -来分析一道leetcode递归的经典题目吧~ -> 原题链接在这里哈:https://leetcode-cn.com/problems/invert-binary-tree/ - -**题目:** 翻转一棵二叉树。 - -输入: -``` - 4 - / \ - 2 7 - / \ / \ -1 3 6 9 -``` -输出: -``` - 4 - / \ - 7 2 - / \ / \ -9 6 3 1 -``` - -我们按照以上递归解题的三板斧来: - -**1. 定义函数功能** - -函数功能(即这个递归原问题是),给出一颗树,然后翻转它,所以,函数可以定义为: -``` -//翻转一颗二叉树 -public TreeNode invertTree(TreeNode root) { -} - -/** - * Definition for a binary tree node. - * public class TreeNode { - * int val; - * TreeNode left; - * TreeNode right; - * TreeNode(int x) { val = x; } - * } - */ -``` - -**2.寻找递归终止条件** - -这棵树什么时候不用翻转呢?当然是当前节点为null或者当前节点为叶子节点的时候啦。因此,加上终止条件就是: -``` -//翻转一颗二叉树 -public TreeNode invertTree(TreeNode root) { - if(root==null || (root.left ==null && root.right ==null)){ - return root; - } -} -``` - -**3. 递推函数的等价关系式** - -原问题之你要翻转一颗树,是不是可以拆分为子问题,分别翻转它的左子树和右子树?子问题之翻转它的左子树,是不是又可以拆分为,翻转它左子树的左子树以及它左子树的右子树?然后一直翻转到叶子节点为止。嗯,看图理解一下咯~ -![](https://imgkr2.cn-bj.ufileos.com/938b0fcf-7ab2-4c8f-833f-382be7f8b46d.jpg?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=9BiTdqNsNnz%252FqynFWb52CMQkMnU%253D&Expires=1602692880) - - -首先,你要翻转根节点为4的树,就需要**翻转它的左子树(根节点为2)和右子树(根节点为7)**。这就是递归的**递**的过程啦 -![](https://imgkr2.cn-bj.ufileos.com/381538fe-fe34-4cae-9d1e-b5894ea542b2.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=HK51fa4jYvucnu6r3829BqFWcys%253D&Expires=1602693025) - - -然后呢,根节点为2的树,不是叶子节点,你需要继续**翻转它的左子树(根节点为1)和右子树(根节点为3)**。因为节点1和3都是**叶子节点**了,所以就返回啦。这也是递归的**递**的过程~ - -![](https://imgkr2.cn-bj.ufileos.com/c9195723-d803-4b76-9cb3-bec8192a696f.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=n5Ct31iSBnMmK2HJ7kB0I6ZhEYs%253D&Expires=1602693145) - -同理,根节点为7的树,也不是叶子节点,你需要翻转**它的左子树(根节点为6)和右子树(根节点为9)**。因为节点6和9都是叶子节点了,所以也返回啦。 - -![](https://imgkr2.cn-bj.ufileos.com/63333c60-747b-45d3-a8eb-dacf0cf36231.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=8NTb2Fj1PBlwVIxwe1InO5YqoWg%253D&Expires=1602693197) - - - -左子树(根节点为2)和右子树(根节点为7)都被翻转完后,这几个步骤就**归来**,即递归的归过程,翻转树的任务就完成了~ - -![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/afada1b801734cdc899e896b0816b63f~tplv-k3u1fbpfcp-watermark.webp) - -显然,**递推关系式**就是: -``` -invertTree(root)= invertTree(root.left) + invertTree(root.right); -``` - -于是,很容易可以得出以下代码: -``` -//翻转一颗二叉树 -public TreeNode invertTree(TreeNode root) { - if(root==null || (root.left ==null && root.right ==null){ - return root; - } - //翻转左子树 - TreeNode left = invertTree(root.left); - //翻转右子树 - TreeNode right= invertTree(root.right); -} -``` -这里代码有个地方需要注意,就是翻转完一棵树的左右子树后,需要交换它左右子树的引用位置。 -``` - root.left = right; - root.right = left; -``` - -因此,leetcode这个递归经典题目的**终极解决代码**如下: -``` -class Solution { - public TreeNode invertTree(TreeNode root) { - if(root==null || (root.left ==null && root.right ==null)){ - return root; - } - //翻转左子树 - TreeNode left = invertTree(root.left); - //翻转右子树 - TreeNode right= invertTree(root.right); - //左右子树交换位置~ - root.left = right; - root.right = left; - return root; - } -} -``` -拿终极解决代码去leetcode提交一下,通过啦~ - - -![](https://imgkr2.cn-bj.ufileos.com/3c9bc7ba-1677-4b8b-a389-e7177fd2b747.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=oNJFxSVWmku%252FMg%252BKlGHop%252BQ%252BxIw%253D&Expires=1602693611) - - -### 递归存在的问题 -- 递归调用层级太多,导致栈溢出问题 -- 递归重复计算,导致效率低下 - -#### 栈溢出问题 -- 每一次函数调用在内存栈中分配空间,而每个进程的栈容量是有限的。 -- 当递归调用的层级太多时,就会超出栈的容量,从而导致调用栈溢出。 -- 其实,我们在前面小节也讨论了,递归过程类似于出栈入栈,如果递归次数过多,栈的深度就需要越深,最后栈容量真的不够咯 - -**代码例子如下:** -``` -/** - * 递归栈溢出测试 - */ -public class RecursionTest { - - public static void main(String[] args) { - sum(50000); - } - private static int sum(int n) { - if (n <= 1) { - return 1; - } - return sum(n - 1) + n; - } -} -``` -**运行结果:** -``` -Exception in thread "main" java.lang.StackOverflowError - at recursion.RecursionTest.sum(RecursionTest.java:13) -``` - -怎么解决这个栈溢出问题?首先需要**优化一下你的递归**,真的需要递归调用这么多次嘛?如果真的需要,先稍微**调大JVM的栈空间内存**,如果还是不行,那就需要弃用递归,**优化为其他方案**咯~ - -#### 重复计算,导致程序效率低下 -我们再来看一道经典的青蛙跳阶问题:一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 - -绝大多数读者朋友,很容易就想到以下递归代码去解决: -``` -class Solution { - public int numWays(int n) { - if (n == 0){ - return 1; - } - if(n <= 2){ - return n; - } - return numWays(n-1) + numWays(n-2); - } -} -``` - -但是呢,去leetcode提交一下,就有问题啦,超出时间限制了 - - -![](https://imgkr2.cn-bj.ufileos.com/47049001-7fae-4c98-8f4c-2e55aca367f3.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=xELiHeOso7vAsXwthfHEIDarVGs%253D&Expires=1602693967) - - -为什么超时了呢?递归耗时在哪里呢?先画出**递归树**看看: - -![](https://imgkr2.cn-bj.ufileos.com/9539296a-f5b1-433e-94ba-2e23eddfc409.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=Rzlo2ChPE7UEkCSJhbMNTBbtfaA%253D&Expires=1602694031) - - -- 要计算原问题 f(10),就需要先计算出子问题 f(9) 和 f(8) -- 然后要计算 f(9),又要先算出子问题 f(8) 和 f(7),以此类推。 -- 一直到 f(2) 和 f(1),递归树才终止。 - -**递归时间复杂度 = 解决一个问题时间*问题个数** -- 一个问题时间 = f(n-1)+f(n-2),也就是一个加法的操作,所以复杂度是 **O(1)**; -- 问题个数 = 递归树节点的总数,递归树的总结点 = 2^n-1,所以是复杂度**O(2^n)**。 - -因此,青蛙跳阶,递归解法的时间复杂度 = O(1) * O(2^n) = O(2^n),就是指数级别的,**如果n比较大的话,超时很正常的了**。 - -你仔细观察这颗递归树,你会发现存在**大量重复计算**,比如f(8)被计算了两次,f(7)被重复计算了3次...所以这个递归算法低效的原因,就是存在大量的重复计算! - -**那么,怎么解决这个问题呢?** - -既然存在大量重复计算,那么我们可以先把计算好的答案存下来,即造一个备忘录,等到下次需要的话,先去**备忘录**查一下,如果有,就直接取就好了,备忘录没有才再去计算,那就可以省去重新重复计算的耗时啦!这就是**带备忘录的解法** - -我们来看一下**带备忘录的递归解法**吧~ - -一般使用一个数组或者一个哈希map充当这个**备忘录**。 - -假设f(10)求解加上**备忘录**,我们再来画一下递归树: - -**第一步**,f(10)= f(9) + f(8),f(9) 和f(8)都需要计算出来,然后再加到备忘录中,如下: - -![](https://imgkr2.cn-bj.ufileos.com/22fe0dc0-136e-4e8d-9b54-7f1ff2a9d066.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=gJl54y4g86XMhK2K1ZbaqmVl94Y%253D&Expires=1602694255) - - -**第二步,** f(9) = f(8)+ f(7),f(8)= f(7)+ f(6), 因为 f(8) 已经在备忘录中啦,所以可以省掉,f(7),f(6)都需要计算出来,加到备忘录中~ - -![](https://imgkr2.cn-bj.ufileos.com/f9b26b22-c745-4bad-b14d-d8b2b51075f4.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=RkOd5Zj5Wwqonn63eXfoWqStvx4%253D&Expires=1602694275) - - -**第三步,** f(8) = f(7)+ f(6),发现f(8),f(7),f(6)全部都在备忘录上了,所以都可以剪掉。 -![](https://p1-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/ec535ab8a0d3401eae5cb041dabac221~tplv-k3u1fbpfcp-watermark.image) - -所以呢,用了备忘录递归算法,递归树变成光秃秃的咯,如下: -![](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/5b78faafe49b4ee0ab939194459cf386~tplv-k3u1fbpfcp-watermark.image) - -带「备忘录」的递归算法,子问题个数就为n了,解决一个子问题还是O(1),所以**带「备忘录」的递归算法的时间复杂度是O(n)**。接下来呢,我们用带「备忘录」的递归算法去撸代码,解决这个青蛙跳阶问题咯~,代码如下: - -``` -public class Solution { - //哈希map充当备忘录的作用 - Map tempMap = new HashMap(); - public int numWays(int n) { - // n = 0 也算1种 - if (n == 0) { - return 1; - } - if (n <= 2) { - return n; - } - //先判断有没计算过,即看看备忘录有没有 - if (tempMap.containsKey(n)) { - //备忘录有,即计算过,直接返回 - return tempMap.get(n); - } else { - // 备忘录没有,即没有计算过,执行递归计算,并且把结果保存到备忘录map中,对1000000007取余(这个是leetcode题目规定的) - tempMap.put(n, (numWays(n - 1) + numWays(n - 2)) % 1000000007); - return tempMap.get(n); - } - } -} -``` - -去leetcode提交一下,如图,稳了: - -![](https://imgkr2.cn-bj.ufileos.com/8208e494-07e6-467b-96a2-8acf77121737.png?UCloudPublicKey=TOKEN_8d8b72be-579a-4e83-bfd0-5f6ce1546f13&Signature=zNVyzVvQaWVQaQmABckQvIVh1XE%253D&Expires=1602694530) - -啥叫「自顶向下」?注意我们刚才画的递归树(或者说图),是从上向下延伸,都是从一个规模较大的原问题比如说 f(20),向下逐渐分解规模,直到 f(1) 和 f(2) 触底,然后逐层返回答案,这就叫「自顶向下」。 - - -啥叫「自底向上」?反过来,我们直接从最底下,最简单,问题规模最小的 f(1) 和 f(2) 开始往上推,直到推到我们想要的答案 f(20),这就是动态规划的思路,这也是为什么动态规划一般都脱离了递归,而是由循环迭代完成计算。 - -动态规划问题,下期分解 - -### 参考与感谢 -- [一文学会递归解题](https://mp.weixin.qq.com/s/Hew44D8rdXb3pf8mZGk67w) -- [动态规划详解](https://mp.weixin.qq.com/s/1V3aHVonWBEXlNUvK3S28w) - -### 个人公众号 -![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e6b23c704fc94ca09207b779f953cce6~tplv-k3u1fbpfcp-zoom-1.image) -- 更多干货,关注公众号 - diff --git "a/345円220円216円347円253円257円346円200円235円347円273円264円347円257円207円/README.md" "b/345円220円216円347円253円257円346円200円235円347円273円264円347円257円207円/README.md" new file mode 100644 index 0000000..7f6092a --- /dev/null +++ "b/345円220円216円347円253円257円346円200円235円347円273円264円347円257円207円/README.md" @@ -0,0 +1,10 @@ +## 后端思维篇(持续更新中) + +公众号:捡田螺的小男孩 + +- [后端思想篇:设计好接口的36个锦囊!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247499388&idx=1&sn=49a22120a3238e13ad7c3d3b73d9e453&chksm=cf222155f855a8434026b2c460d963c406186578c2527ca8f2bb829bbe849d87a2392a525a9b&scene=178&cur_album_id=2396778860463161350#rd) +- [后端思维篇:手把手教你写一个并行调用模板](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247499504&idx=1&sn=bb62226e6cffeb1859efb0100c796050&chksm=cf2221d9f855a8cf23f75cb51c1a407578fb0f279e96ddae74b5b8c84f2f5dc71762425b17cb&scene=178&cur_album_id=2396778860463161350#rd) +- [后端思维篇:如何应用设计模式优化代码](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247499524&idx=1&sn=cb4cc48a3e8d9a54b0ebc4c7ad517f14&chksm=cf22202df855a93b37327856ee88b0bf5f6ed7da67964438fc2cf747666260d5026dd62d4a17&scene=178&cur_album_id=2396778860463161350#rd) +- [后端思维篇:统一参数校验、异常处理、结果返回](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247499708&idx=1&sn=808979c495acd9344732d147c0ad40d3&chksm=cf222095f855a983f31d5f6abf401fa3b5967f8839c6775d35cefc5cc6244fb4135563ff1090&scene=178&cur_album_id=2396778860463161350#rd) +- [后端思维篇:如何抽一个观察者模板](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247500159&idx=1&sn=a5328372e580b22c939a5b3084aef164&chksm=cf221e56f85597401e8c99b8dd1bc1af97fcf69207ceaa04c5c26e028ac47d1658b79ae32291&scene=178&cur_album_id=2396778860463161350#rd) +- [后端思维篇:后端思维专栏:通过层层代码去重,我又搞了一个通用模板](https://mp.weixin.qq.com/s?__biz=MzkyMzU5Mzk1NQ==&mid=2247506942&idx=1&sn=ae14ed5cc179f73ea0b2f37c73ad8da4&chksm=c1e02672f697af645943ea8ee53b7cef6257ebbc21d2b77058994e98bdb1e107ad313e29e8c3&token=134957671&lang=zh_CN#rd) diff --git "a/345円220円216円347円253円257円346円200円235円347円273円264円347円257円207円/345円220円216円347円253円257円346円200円235円347円273円264円344円270円200円357円274円232円350円256円276円350円256円241円346円216円245円345円217円243円347円232円20436円344円270円252円351円224円246円345円233円212円.md" "b/345円220円216円347円253円257円346円200円235円347円273円264円347円257円207円/345円220円216円347円253円257円346円200円235円347円273円264円344円270円200円357円274円232円350円256円276円350円256円241円346円216円245円345円217円243円347円232円20436円344円270円252円351円224円246円345円233円212円.md" new file mode 100644 index 0000000..f999d6b --- /dev/null +++ "b/345円220円216円347円253円257円346円200円235円347円273円264円347円257円207円/345円220円216円347円253円257円346円200円235円347円273円264円344円270円200円357円274円232円350円256円276円350円256円241円346円216円245円345円217円243円347円232円20436円344円270円252円351円224円246円345円233円212円.md" @@ -0,0 +1,540 @@ +## ǰ�� + +���Һã����Ǽ����ݵ�С�к�����Ϊ���˿�����������jô���ԣ�```Java```��```Go```����```C++```���䱳���ĺ���˼�붼�����Ƶġ�����������һ������˼���ļ���ר������Ҫ�������˵�һЩ���ơ����ߺ��˹淶���صģ�ϣ���Դ����ճ������а������� + +���������˿�������ʦ����Ҫ�������ǣ�**���ΰ�һ���ӿ����ƺ�**�����ԣ������͸����ҽ��ܣ����ƺýӿڵ�36�����ҡ����ľ��Ǻ���˼��ר���ĵ�һƪ���� + + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1bfc8123cee34de2ad82b736121165d2~tplv-k3u1fbpfcp-zoom-1.image) + +- ���ںţ������ݵ�С�к� + + +## 1. �ӿڲ���У�� + +���γ���У����ÿ������Ա�ر��Ļ��������������ƵĽӿڣ�������У�����������������Ƿ�����Ϊ�գ����γ����Ƿ���������Ԥ�ڳ��ȡ�����Ҫ����κ�߹����ճ������У��ܶ��ͼ�bug���Dz�У���������μġ� + +> �����������ݿ����ֶ�����Ϊ```varchar(16)```,�Է�����һ��32λ���ַ��������������㲻У��������**�������ݿ�ֱ���쳣��**�� + +����Ҳ�ǣ������㶨���Ľӿڱ��ģ������Dz�Ϊ�յģ��������Ľӿڷ��ز�����û����У�飬��Ϊ����ijЩԭ����ֱ���ر���һ��```null```ֵ������ + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/bfd3392f3ce6408daa1940cc185f0d5f~tplv-k3u1fbpfcp-zoom-1.image) + +## 2. �޸��Ͻӿ�ɦ��ע���ӿڵļ����� + +�ܶ�bug������Ϊ�޸��˶����ɽӿڣ�����ȴ**��������**���μġ��ؼ��������������DZȽ����صģ�����ֱ�ӵ���εͳ����ʧ�ܵġ����ֳ���Ա�����׷���������Ŷ~ + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/701ac23b5dd04149b277c4001721fb87~tplv-k3u1fbpfcp-zoom-1.image) + +���ԣ�����������������ԭ���ӿ����޸ģ����������ӿ��Ƕ����ṩ�����Ļ���һ��Ҫ���ǽӿڼ��ݡ��يٴ����Ӱɣ�����dubbo�ӿڣ�ԭ����ֻ����A��B����������������һ������C���Ϳ��Կ����������� + +``` +//�Ͻӿ� +void oldService(A,B){ + //�����1⁄2ӿڣ�����null����C + newService(A,B,null); +} + +//�1⁄2ӿڣ���ɦ����ɾ���Ͻӿڣ���Ҫ�����ݡ� +void newService(A,B,C){ + ... +} +``` + +## 3. ���ƽӿ�ɦ�����ֿ��ǽӿڵL·���չ�� + +Ҫ����ɻ��ҵ�񳡾����ƽӿڣ����ֿ��ǽӿڵL·���չ�ԡ� + +�������ӵ�һ�����������û����ӻ����޸�Ա��ɦ����Ҫs���������Ƿ����ṩһ��Ա���������ύs����Ϣ�ӿڣ�������˼�����ύs���Dz���ͨ�������أ�����ת�˻���һ��������Ҫ����s���Ļ������Ƿ���Ҫ����ɻ��һ���ӿ��أ����ǵ�ǰ��ҵ�����ͻ���ģ�飬���������ӿھ ͅã������ӿڵL·���չ�ԡ� + +������ģ�黮�ֵĻ���δ��������������һ�����ֽ���s���Ļ��������يٴ�һ���μĽӿڣ�ֻ��Ҫ����ö�٣�Ȼ������s��ͨ�����̽ӿڣ�ɻ��һ������s���IJ��컯���ɡ� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/cd3ee52ecaa34de384bb529cbb358889~tplv-k3u1fbpfcp-zoom-1.image) + + +## 4.�ӿڿ����Ƿ���Ҫ���ش��� + +����ǰ���ظ������������߼����δ����Dz��ǿ��ǽӿ�ȥ�ش��� + +��Ȼ�������Dz�ѯ������������ɻ���÷��ء������Ǹ����޸����Ļ�����������ת�����ģ���Ҫ�����ظ������l��򵥵㣬������ʹ��Redis���ظ�������ͬ�������󷽣�һ��ɦ�������ڵ���ͬ���󣬿����Ƿ����l���Ȼ��ת�����ӿڣ��������ߵĻ���**�Ƽ�ʹ�����ݿ����ر�**����**Ψһ��ˮ����Ϊ��������Ψһ����**�� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/059928f565ba4d27a17c54f451b0235d~tplv-k3u1fbpfcp-zoom-1.image) + + +## 5. �ص��ӿڣ������̳߳ظ��롣 + +һЩ��1⁄2��ת�˽��ס��μ�����Ҫ�ӿڣ������̳߳ظ�����������������ҵ�񶼹���һ���̳߳أ���Щҵ����bug�����̳߳����������Ļ����Ǿͱ����x�**����ҵ����Ӱ����**�����˽����̳߳ظ��룬��Ҫҵ��������һ���ĺ����̣߳��͸��ñ�����Ҫҵ���� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1d30804afc044026b4eb7bad23689c42~tplv-k3u1fbpfcp-zoom-1.image) + + +## 6. ���õ������ӿ�Ҫ�����쳣�ͳ�ɦ���� + +���������õ������ӿڣ����߷ֲ�ʽԶ�̷����ĵĻ�����Ҫ���ǣ� + +- �쳣���� + +> ���磬�������˵Ľӿڣ������쳣�x���ô���������Ի��ǵ���ʧ�ܻ��Ǹ澯���� + +- �ӿڳ�ɦ + +> û��Ԥ���Է��ӿ�һ�����÷��أ�һ�����ø���ɦ�Ͽ�ɦ�䣬�Ա������Ľӿڡ�**֮ǰ����һ����������**������http���ò����ó�ɦɦ�䣬������Ӧ�����̼���������һֱռ���̲߳��ͷţ��Ͽ��̳߳ء� + +- ���Դ��� +> ���Ľӿڵ�ʧ�ܣ��費��Ҫ���ԣ����Լ��Σ���Ҫվ��ҵ���ϽǶ�˼���������� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/25ec61c10c324ada9252745fa4017ad6~tplv-k3u1fbpfcp-zoom-1.image) + + +## 7. �ӿ�ɻ�ֿ����۶Ϻͽ��� + +��ǰ������εͳһ�㶼�Ƿֲ�ʽ�����ġ����ֲ�ʽεͳ�о���������ij���������񲻿��ã����յ�������εͳ�����õ�����, �������󱻳�Ϊ**����ѩ��ЧӦ**�� + +�����ֲ�ʽ������·```A->B->C....```����ͼ��ʾ�� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/65240791c94c44b6aab143178eeb790c~tplv-k3u1fbpfcp-zoom-1.image) + +> ��������C�������⣬������**��Ϊ��SQL���μ��û���**���ǽ�����BҲ���ӳ٣��Ӷ�AҲ���ӳ١���ס��A����������ռ��εͳ���̡߳�IO����Դ�� ������A�ķ���Խ��Խ�࣬ռ�ü���������ԴҲԽ��Խ�࣬���ջᵼ��εͳƿ�����֣���������������ͬ�������ã���������ҵ��εͳ������ + +Ϊ��Ӧ�Է���ѩ��, ������������**�۶Ϻͽ���**���������Ǽӿ��ؿ��ƣ�������εͳ������ɦ�����ؽ��������اٴ�������εͳ��������ѡ�ÿ�Դ����```Hystrix```�� + +## 8. ��־��ӡ�ã��ӿڵĹؼ����룬Ҫ����־���ݻ����� + +�ؼ�ҵ�������������εأ���Ӧ�����㹻����־���ݻ����� +���磺��ɻ��ת��ҵ����ת�������Ȼ��תʧ���x����sͻ�Ͷ�ߣ�Ȼ���㻹û�д�ӡ����־����������ˮ�����ȵ������£���ȴ���ް취������ + +��ô������ת��ҵ������Ҫ��Щ��־��Ϣ�أ����٣���������ǰ��������Ҫ��ӡ��Ҫ�ɣ��ӿڵ��ú�����Ҫ����һ���쳣�ɣ�ͬɦ��ӡ�쳣������־�ɣ����£� +``` +public void transfer(TransferDTO transferDTO){ + log.info("invoke tranfer begin"); + //��ӡ���� + log.info("invoke tranfer,paramters:{}",transferDTO); + try { + res= transferService.transfer(transferDTO); + }catch(Exception e){ + log.error("transfer fail,account��{}", + transferDTO.getAccount����) + log.error("transfer fail,exception:{}",e); + } + log.info("invoke tranfer end"); + } +``` + +֮ǰд��һƪ��ӡ��־��15�����飬���ҿ��Կ�������[�����ܽᣡ��־��ӡ��15������](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247494838&idx=1&sn=cdb15fd346bddf3f8c1c99f0efbd67d8&chksm=cf22339ff855ba891616c79d4f4855e228e34a9fb45088d7acbe421ad511b8d090a90f5b019f&token=162724582&lang=zh_CN&scene=21#wechat_redirect) + +## 9. �ӿڵĹ��ܶ���Ҫ�߱���һ�� + +��һ����ָ�ӿ����������Ƚε�һ��רһ������һ����1⁄2�ӿڣ�������������ֻ��У���˻������룬Ȼ�󷵻ص�1⁄2�ɹ��Լ�```userId```���ɡ�**����������Ϊ�˼��ٽӿڽ�������һЩע�ᡢһЩ���ò�ѯ��ȫ�ŵ���1⁄2�ӿڣ��Ͳ�̫�ס�** + +��ɻ��Ҳ��΢����һЩ˼�룬�ӿڵĹ��ܵ�һ����ȷ�����綩�����񡢻��֡���Ʒ��Ϣ���صĽӿڶ��ǻ��ֿ��ġ���������΢�����Ļ����Dz��ǾͱȽϼ������� + + +## 10.�ӿ���Щ������ʹ���첽������ + +�يٴ��򵥵����ӣ�������ɻ��һ���û�ע���Ľӿڡ��û�ע���ɹ�ɦ�������ʼ����߶���ȥ֪ͨ�û��������ʼ����߷����ţ��͸��ʺ��첽������Ϊ�ܲ���һ��֪ͨ����ʧ�ܣ�����ע��ʧ�ܰɡ� + +�������첽�ķ�ʽ���򵥵ľ���**���̳߳�**��������ʹ����Ϣ���У������û�ע���ɹ����������߲���һ��ע���ɹ�����Ϣ������������ע���ɹ�����Ϣ���ͷ���֪ͨ�� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/585b098a67b349d495e6e8579ea85e4c~tplv-k3u1fbpfcp-zoom-1.image) + + +�������еĽӿڶ��ʺ�����Ϊͬ���ӿڡ�������Ҫ��һ��ת�˵Ĺ��ܣ��������ǵ��ɻ�ת�x����ǿ��԰ѽӿ�����ͬ�����û�����ת��ɦ���ͻ����ھ����ȴ�ת�˽���� ͅá�������������ת�x�һ������һǧ�ʣ�����һ���ɻģ��������԰ѽӿ�����Ϊ�첽�������û���������ת��ɦ���־û��ɹ����ȷ��������ɹ���Ȼ���û���ʮ���ӻ���ʮ�����ӵ�������ת�˽���� ͅá��ֻ��ߣ�����ת�˳ɹ������ٻص�����εͳ�� + + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1ae74868492344c4bcbab9b480904c47~tplv-k3u1fbpfcp-zoom-1.image) + + +## 11. �Ż��ӿں�ɦ��Զ�̴��п��ǸIJ��е��� + +������������һ��APP��ҳ�Ľӿڣ�����Ҫ���û���Ϣ����Ҫ��banner��Ϣ����Ҫ�鵯����Ϣ�ȵȡ�������һ��һ���ӿڴ��е���Dz��е����أ� + + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/d118e2b09e1f4fc6a1003fd44a43e4c7~tplv-k3u1fbpfcp-zoom-1.image) + +�����Ǵ���һ��һ���飬�������û���Ϣ200ms����banner��Ϣ100ms���鵯����Ϣ50ms����һ��� ͅ�ɦ```350ms```�x���������������Ϣ���Ǻ�ɦ�͸����l����ֳ����ǿ��Ը�Ϊ���е��õġ�Ҳ����˵���û���Ϣ����banner��Ϣ���鵯����Ϣ������ͬɦ������ + + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/83561366219b48a2a85a6bb0419f82a3~tplv-k3u1fbpfcp-zoom-1.image) + +��Java���и��첽����������```CompletableFuture```���Ϳ��Ժܺ�ɻ���������ܡ�����Ȥ��С�������Կ���֮ǰ�������1���[CompletableFuture����](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490456&idx=1&sn=95836324db57673a4d7aea4fb233c0d2&chksm=cf21c4b1f8564da72dc7b39279362bcf965b1374540f3b339413d138599f7de59a5f977e3b0e&token=1260947715&lang=zh_CN#rd) + +## 12. �ӿںς�����˵������������˼�� + +���ݿ�������������Զ�̵���ɦ�������������Ͳ�Ҫforѭ�����á� +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/855cd5cf57d047be909dbc41ddacc021~tplv-k3u1fbpfcp-zoom-1.image) + +һ���������ӣ�����ƽɦһ���б���ϸ���ݲ������ݿ�ɦ����Ҫ��forѭ��һ��һ�����룬����һ�����μ���������������롣ͬ��Զ�̵���Ҳ�����뷨����������ѯӪ����ǩ�Ƿ����У�����һ����ǩһ����ǩȥ�飬Ҳ����������ǩȥ�飬���������У�Ч�ʾ͸���� + +``` +//���� +for(int i=0;i ����һЩƽɦ�䶯��С����˵�����������Ʒ��Ϣ�����Էŵ����棬��������ɦ���Ȳ�ѯ���棬����û���ٲ����ݿ⣬���Ұ����ݿ������ݸ��μ����档���ǣ�ʹ�û�����������Ҫ������Щ�㣺���������ݿ�һ�������α�֤����Ⱥ�������������ѩ�������洩͸�����⡣ + +- ��֤���ݿ��ͻ���һ���ԣ�**������ɦ˫ɾ��ɾ���������Ի��ơ���ȡbiglog�첽ɾ������** +- ����������������������� +- ����ѩ����Redis��Ⱥ�߿��á��������ù���ɦ�� +- ���洩͸���ӿڲ�У�顢��ѯΪ�����ø�Ĭ�Ͽ�ֵ���ǡ���¡�������� + +һ����```Redis```�ֲ�ʽ���棬��Ȼ��Щɦ��Ҳ���Կ���ʹ�ñ��ػ��棬��```Guava Cache��Caffeine```�ȡ�ʹ�ñ��ػ�����Щȱ�㣬�����޷����д����ݴ洢������Ӧ�ý��̵����������ʧЧ�� + +## 14. �ӿڿ����ȵ����ݸ����� + +˲ɦ���ĸ߲��������ܻ���������εͳ��������һЩ�ȵ����ݵĸ��롣����**ҵ�����롢εͳ���롢�û����롢���ݸ���**�ȡ� + +- ҵ�������ԣ�����12306�ķ�ɦ����Ʊ�����ȵ����ݷ�ɢ��������εͳ����ѹ���� +- εͳ���룺������εͳ�ֳ����û�����Ʒ�������������顣���������ֱ�ʹ�ò�ͬ�������������������ݿ⣬��ӽ����㵽Ӧ�ò��اٴ����ݲ�������ȫ���롣 +- �û����룺�ص��û����������ø��õĻ����� +- ���ݸ��룺ʹ�õ����Ļ��漯Ⱥ�������ݿ������ȵ����ݡ� + +## 15. �ɱ��������û�����������Ƥ���л��� + +������Ʒ�������˸�����������ʥ���ڵ�ɦ�򣬺���Ƥ��Ϊʥ�������صģ����ڵ�ɦ����Ϊ���ں���Ƥ���ȡ� + +�����ڴ���д�����ƣ������������ ́��룺 +``` +if(duringChristmas){ + img = redPacketChristmasSkin; +}else if(duringSpringFestival){ + img = redSpringFestivalSkin; +} +``` +��������Ԫ���ڵ�ɦ������ӪС����ͻȻ�����뷨������Ƥ��ɵ������صģ���ɦ�����Dz���Ҫȥ�޸Ĵ����x����·����x� + +��һ��ʼ�ӿ�����ɦ������ɻ��**һ�ź���Ƥ�������ñ�**��������Ƥ���������û��أ���������Ƥ����ֻ���޸�һ�±����ݾ ͅ��l� + +��Ȼ������һЩ�����ʺ�һЩ���û��IJ�����һ����ҳ�����������ơ�ij������������ɦ��������Щ�������Ը㵽�������û������档**��Ҳ����չ��˼����һ�����֡�** + +## 16.�ӿڿ����ݵ��� + +�ӿ�����Ҫ�����ݵ��Եģ�������������ת����Щ��Ҫ�ӿڡ���ֱ�۵�ҵ�񳡾�������**�û����ŵ�������**�����Ľӿ���û��**holdס**��������Ϣ���г����ظ����ѵ�����������ҵ���߼���ô���ƣ� + +�����£�**jô���ݵȣ�** + +> ��������ѧ�У��ݵȱ�ʾһ�κͶ�������ijһ����ԴӦ�þ���ͬ���ĸ����ã�����˵������������������Ӱ����һ������ִ�е�Ӱ��Ч����ͬ�� + +���ұ���������**���غ��ݵ�������ɻ����������**��������ҪΪ�˱��������ظ����ݣ����ظ����������������ɡ����ݵ����Ƴ��������Ѿ����������󣬻�Ҫ��ÿ����ͬ�����󶼷���һ����Ч�����أ��ܶ�ɦ�������ǵĴ������̡����������ƵĹ��� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/f8c3d0d5a653455198ba3259ef221387~tplv-k3u1fbpfcp-zoom-1.image) + + +�ӿ��ݵ�ɻ�ַ�����Ҫ��8�֣� + +- select+insert+����/Ψһ������ͻ +- ֱ��insert + ����/Ψһ������ͻ +- ״̬���ݵ� +- ��ȡ���ر� +- token���� +- ������ +- �ֹ��� +- �ֲ�ʽ�� + +���ҿ��Կ�����ƪ���1���[�����ݵ�����](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497427&idx=1&sn=2ed160c9917ad989eee1ac60d6122855&chksm=cf2229faf855a0ecf5eb34c7335acdf6420426490ee99fc2b602d54ff4ffcecfdab24eeab0a3&token=1260947715&lang=zh_CN#rd) + +## 17. ��д���룬���ȿ��Ƕ��ӿ⣬ע�������ӳ����� + +���ǵ����ݿⶼ�Ǽ�Ⱥ�����ģ�������Ҳ�дӿ⣬��ǰһ�㶼�Ƕ�д�����ġ�������д�����ݣ��϶���д�����⣬���Ƕ��ڶ�ȡɻɦ��Ҫ�󲻸ߵ����ݣ������ȿ��Ƕ��ӿ⣬��Ϊ���Էֵ�������ѹ���� + +������ȡ�ӿ��Ļ�����Ҫ���������ӳاٴ����⡣ + +## 18.�ӿ�ע�ⷵ�ص�����������������������Ҫ��ҳ + +һ���ӿڷ��ر��ģ���Ӧ�ð��������������������������������������ӣ�����������������ѹ��Ҳ�dz�������������ɻ���DZȽΘ󣬿��Է�ҳ���أ������ǹ��ܲ����صı��ģ���Ӧ�ÿ��ǽӿڲ��֡� + +## 19. �õĽӿ�ɻ�֣��벻��SQL�Ż� + +���������˵ģ�д��һ���ӿڣ��벻��SQL�Ż��� + +SQL�Ż����弓��ά��˼���� + +- explain ����SQL��ѯ�ƻ����ص���עtype��extra��filtered�ֶΣ� +- show profile�������˽�SQLִ�е��̵߳�״̬�Լ����ĵ�ɦ�� +- �����Ż� ����������������ǰ׺ԭ������ʽת����order by�Լ�group by���Ż���join�Ż��� +- ����ҳ�����Ż����ӳٹ�������1⁄4��һҳ����ID�� +- ������̫����**�ֿ��ֱ�**��ͬ����es����es��ѯ�� + +## 20.�����������ȿ��ƺ� + +jô�Ǽ��������أ� + +> ��ɻ���Ǿ�����Ҫ��ס�ķ�Χ�Ƕ��󡣱������ڼ��������䣬��ֻҪ��ס�������Ϳ����˰ɣ�����Ҫ�������Ҷ����������ü��˽��Űɣ��������������ļ������ȡ� + +����д����ɦ���������漰��������Դ����û�б�Ҫ��ס�ġ���� ͅ������������䣬���ð������Ҷ���ס����ס�������žͿ����l� + +���磬��ҵ�������У���һ��ArrayList��Ϊ�漰�����̲߳�����������Ҫ������������պ�����һ�αȽϺ�ɦ�IJ�������е�```slowNotShare```���������漰�̰߳�ȫ���⣬�������μ����أ� + +������ +``` +//���漰������Դ�������� +private void slowNotShare() { + try { + TimeUnit.MILLISECONDS.sleep(100); + } catch (InterruptedException e) { + } +} + +//�����ļ��� +public int wrong() { + long beginTime = System.currentTimeMillis(); + IntStream.rangeClosed(1, 10000).parallel().forEach(i -> { + //��������̫���x�slowNotShare��ɻ���漰������Դ + synchronized (this) { + slowNotShare(); + data.add(i); + } + }); + log.info("cosume time:{}", System.currentTimeMillis() - beginTime); + return data.size(); +} +``` + +������ +``` +public int right() { + long beginTime = System.currentTimeMillis(); + IntStream.rangeClosed(1, 10000).parallel().forEach(i -> { + slowNotShare();//���Բ����� + //ֻ��List�ⲿ�ּ��� + synchronized (data) { + data.add(i); + } + }); + log.info("cosume time:{}", System.currentTimeMillis() - beginTime); + return data.size(); +} +``` + +## 21.�ӿ�״̬�ʹ�����Ҫͳһ��ȷ + +�ṩ��Ҫ�Ľӿڵ���״̬��Ϣ����������һ��ת�˽ӿڵ����dzɹ���ʧ�ܡ������л��������ɹ��ȣ���Ҫ��ȷ���߿ͻ��l������ӿ�ʧ�ܣ���ô����ʧ�ܵ�ԭ����jô����Щ��Ҫ����Ϣ������Ҫ���߸��ͻ��x�������Ҫ������ȷ�Ĵ������Ͷ�Ӧ��������ͬɦ�������Ա�����Ϣ��װһ�£���Ҫ�Ѻ��˵��쳣��Ϣ��ȫ�׳�ͻ��l� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/20a1080126274c04aa31802178c01bb0~tplv-k3u1fbpfcp-zoom-1.image) + + +## 22.�ӿ�Ҫ�����쳣���� + +ɻ��һ���õĽӿڣ��벻�����ŵ��쳣���������쳣������ʮ��С�����ɣ� + +- ������Ҫʹ��```e.printStackTrace()```,����ʹ��```log```��ӡ����Ϊ```e.printStackTrace()```�������ܻᵼ���ڴ�ռ���� +- ```catch```ס�쳣ɦ��������ӡ��������```exception```�����ڸ��ö�λ���� +- ��Ҫ��һ��```Exception```��׽���п��ܵ��쳣 +- �ǵ�ʹ��```finally```�ر�����Դ����ֱ��ʹ��```try-with-resource``` +- �����쳣���׳��쳣��������ȫƥ�䣬���߲����쳣�����쳣�ĸ��� +- ���񵽵��쳣�����ܺ����������ٴ�����־�� +- ע���쳣�����Ĵ������νṹ����Ⱦ +- �Զ�����װ�쳣����Ҫ����ԭʼ�쳣����Ϣ```Throwable cause``` +- ����ɦ�쳣```RuntimeException``` ����Ӧ��ͨ��```catch```�ķ�ʽ������������Ԥ���飬���磺```NullPointerException```���� +- ע���쳣ƥ����˳�������Ȳ����������쳣 + +С����������Ȥ���Կ�����֮ǰд����ƪ���1���[Java �쳣������ʮ������](https://mp.weixin.qq.com/s/3mqY77c8iXWvJFzkVQi9Og) + +## 23. �Ż������߼� + +�Ż������߼����黹��ͦ��Ҫ�ģ�Ҳ����˵����ɻ�ֵ�ҵ�����룬**�����DZȽϸ��ӵĻ���������ע��д����**�����У������߼��������������뾡����Ч�� + +> ���磬��Ҫʹ���û���Ϣ�����ԣ�������session�Ѿ���ȡ��```userId```�x�Ȼ���Ͱ��û���Ϣ�����ݿ���ѯ������ʹ�����󣬺���������Ҫ�õ��û���Ϣ�����ԣ���ЩС����û��̫�࣬���־Ͱ�```userId```�ٴ���ȥ���ٲ�һ�����ݿ⡣����������L·�У��������ִ��롣����ֱ�Ӱ��û������������������ + +����α���룺 + +``` +public Response test(Session session){ + UserInfo user = UserDao.queryByUserId(session.getUserId()); + + if(user==null){ + reutrn new Response(); + } + + return do(session.getUserId()); +} + +public Response do(String UserId){ + //������һ�����ݿ� + UserInfo user = UserDao.queryByUserId(session.getUserId()); + ...... + return new Response(); +} + +``` + +������ + +``` +public Response test(Session session){ + UserInfo user = UserDao.queryByUserId(session.getUserId()); + + if(user==null){ + reutrn new Response(); + } + + return do(session.getUserId()); +} + +//ֱ�Ӵ�UserInfo�����������ɣ������وٴ���һ�����ݿ� +public Response do(UserInfo user){ + ...... + return new Response(); +} +``` + +��Ȼ����ֻ��һЩ��С��һ�����ӣ����кܶ����Ƶ����ӣ���Ҫ���ҿ��������У�����˼���Ĺ��� + + +## 24. �ӿ�ɻ�ֹ��̻��У�ע�����ļ��������񡢴����� + +- ��ȡ���ļ�ɦ����Ҫ```Files.readAllBytes```ֱ�Ӷ�ȡ���ڴ棬������OOM�ģ�����ʹ��```BufferedReader```һ��һ������ +- ���������ܵ����������ع�ɦ�䳤�������ӳاٴ����⣬�����о��������������� +- ע��һЩ��������ʹ�ã���Ϊ��������ֱ�ӽ����������ģ��ᴥ��fullGC + +## 25. ���Ľӿڣ���Ҫ�������� + +��������εͳÿ�뿸ס��������1000������һ��������ʮ�������أ������ǶȾ���˵���߲�����ɦ���������������x�����εͳ�ij�����������ô���أ� + +��������ȡ��ʩ�����е�������������εͳCPU���ڴ桢Load����쮵ĺܸߣ����������������������е������޷�������Ӧ�� + +�������ֳ��������ǿ��Բ��������������Ϊ�˱���εͳ��������������ֱ�Ӷ����� + +�������壺 +> �ڼ����������У��������ǿ��������ӿڷ��ͻ��������������ʣ����ɷ�ֹDoS����������Web���档������Ҳ���������ơ���ָεͳ�����يٴ߲��������ߴ����������������£������μ�������εͳ�ķ��ʣ��Ӷ���֤εͳ���ȶ��ԡ� + +����ʹ��Guava��```RateLimiter```������������Ҳ����ʹ��```Redis```�ֲ�ʽ���������ʹ�ð��↑Դ����```sentinel```���� + +���ҿ��Կ�����֮ǰ��ƪ���1���[4�־��������㷨����](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490393&idx=1&sn=98189caa486406f8fa94d84ba0667604&chksm=cf21c470f8564d665ce04ccb9dc7502633246da87a0541b07ba4ac99423b28ce544cdd6c036b&token=162724582&lang=zh_CN&scene=21#wechat_redirect) + + +## 26.����ɻ��ɦ��ע������ɦ�쳣��������ָ�롢�±�Խ���ȣ� + +�ճ������У�������Ҫ��ȡ��ʩ**���������߽����������������ָ��**������ɦ���������ƴ����Ƚϳ����� +``` +String name = list.get(1).getName(); //list����Խ�磬��Ϊ��һ����2��Ԫ�ع� +``` + +Ӧ�ò�ȡ��ʩ��Ԥ��һ�������߽��������������£� +``` +if(CollectionsUtil.isNotEmpty(list)&& list.size()>1){ + String name = list.get(1).getName(); +} +``` +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/10199365140845ea8f7b29a07fbaf3cc~tplv-k3u1fbpfcp-zoom-1.image) + + +## 27.��֤�ӿڰ�ȫ�� + +��������API�ӿ��Ƕ����ṩ�ģ���Ҫ��֤�ӿڵİ�ȫ�ԡ���֤�ӿڵİ�ȫ����**token���ƺͽӿ�ǩ��**�� + +**token����������֤**�������Ƚϼ򵥵ģ����� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9b468f89cdaf4040b84e432182903fd9~tplv-k3u1fbpfcp-zoom-1.image) + +1. �ͻ��˷���������������ȡtoken�� +2. ����������ȫ��Ψһ��token�����浽redis�У�һ��������һ������ɦ�䣩��Ȼ�󷵻ظ��ͻ��l� +3. �ͻ��˴���token������������ +4. ������ȥredisȷ��token�Ƿ����ڣ�һ���� redis.del(token)�ķ�ʽ���������ڻ�ɾ���ɹ���������ҵ���߼�������ɾ��ʧ�ܲ�����ҵ���߼���ֱ�ӷ��ؽ����� + +**�ӿ�ǩ��**�ķ�ʽ�����ǰѽӿ�����������Ϣ���������ģ���������ɦ�������汾�š�appid�ȣ����ͻ���˽Կ��ǩ��Ȼ���������ù�Կ��ǩ����֤ͨ������Ϊ�ǺϷ��ġ�û�б��۸Ĺ��������� + +�й��ڼ�ǩ��ǩ�ģ����ҿ��Կ�������ƪ���1���[����Ա�ر�����ǩ��ǩ](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488022&idx=1&sn=70484a48173d36006c8db1dfb74ab64d&chksm=cf21cd3ff8564429a1205f6c1d78757faae543111c8461d16c71aaee092fe3e0fed870cc5e0e&token=162724582&lang=zh_CN&scene=21#wechat_redirect) + +����**��ǩ��ǩ��token���ƣ��ӿڱ���һ����Ҫ���ܵ�**����Ȼ����httpsЭ���ǻ��Ա��ļ��ܵġ����������Ƿ������Ļ������μӽ����أ� +> ���Բο�HTTPS��ԭ�����Ƿ����˰ѹ�Կ���ͻ��x�Ȼ���ͻ������ɶԳ���Կ�����sͻ����÷����˵Ĺ�Կ���ܶԳ���Կ���ۇٴ��������x����������Լ���˽Կ���ܣ��õ��ͻ��˵ĶԳ���Կ����ɦ���Ϳ������촫�䱨�������ͻ�����**�Գ���Կ������������**��**�������ö�Ӧ�ĶԳ���Կ���ܱ���**�� + +��ɦ�򣬽ӿڵİ�ȫ�ԣ�������**�ֻ��š�����֤����Ϣ������**������˵��**�û�����˽���ݣ��������㱩¶**�� + +## 28.�ֲ�ʽ���������α�֤ + +> �ֲ�ʽ���񣺾���ָ�����IJ����ߡ�֧�������ķ���������Դ�������Լ������������ֱ�λ�ڲ�ͬ�ķֲ�ʽεͳ�IJ�ͬ�ڵ�֮�ϡ�������˵���ֲ�ʽ����ָ�ľ��Ƿֲ�ʽεͳ�е����������Ĵ��ھ���Ϊ�˱�֤��ͬ���ݿ��ڵ�������һ���ԡ� + +�ֲ�ʽ�����ļ��ֽ������ +- 2PC(���׶��ύ)������3PC +- TCC��Try��Confirm��Cancel�� +- ������Ϣ�� +- ����Ŭ��֪ͨ +- seata + +���ҿ��Կ�����ƪ���1���[��һ�������⣺�ֲ�ʽ��������](https://mp.weixin.qq.com/s/3r9MfIz2RAtdFhYzwwZxjA) + +## 29. ����ʧЧ��һЩ���䳡�� + +���ǵĽӿڿ��������У�������Ҫʹ�õ�������������Ҫ�ܿ�����ʧЧ��һЩ���䳡���� + +- �����ķ���Ȩ�ޱ�����public������private��Ȩ�ޣ�����ʧЧ +- ��������������final�ģ������ᵼ������ʧЧ�� +- ��ͬһ�����еķ���ֱ���ڲ����ã��ᵼ������ʧЧ�� +- һ�������û����spring�����Ͳ�������spring������ +- ���̵߳��ã����������ͬһ���߳��У���ȡ�������ݿ����Ӳ�һ���ġ� +- ���Ĵ洢���治֧������ +- �����Լ�try...catch�������쳣������ʧЧ�� +- �����Ĵ������� + +�Ƽ����ҿ�����ƪ���£�[����spring����ʧЧ��12�ֳ�����̫����](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247494570&idx=2&sn=17357bcd328b2d1d83f4a72c47daac1b&chksm=cf223483f855bd95351a778d5f48ddd37917ce2790ebbbcd1d6ee4f27f7f4b147f0d41101dcc&token=2044040586&lang=zh_CN&scene=21#wechat_redirect) + + +## 30. ���ճ��õ�����ģʽ + +�Ѵ���д�ã�������Ҫ�������õ�����ģʽ����������ģʽ������ģʽ��ģ�巽��ģʽ���۲���ģʽ�ȵȡ�����ģʽ���Ǵ������ƾ������ܽᡣʹ������ģʽ���Կ����ô��롢�ô��������ױ��������⡢��֤�����ɿ��ԡ� + +��֮ǰд��һƪ�ܽṤ���г�������ģʽ�����£�д��ͦ�����ģ����ҿ��Կ��£�[ɻս�������г��õ���Щ����ģʽ](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247495616&idx=1&sn=e74c733d26351eab22646e44ea74d233&chksm=cf2230e9f855b9ffe1ddb9fe15f72a273d5de02ed91cc97f3066d4162af027299718e2bf748e&token=1260947715&lang=zh_CN#rd) + +## 31. д����ɦ���������԰�ȫ���� + +��**�߲���**�����£�```HashMap```���ܻ�������ѭ������Ϊ���Ƿ����԰�ȫ�ģ����Կ���ʹ��```ConcurrentHashMap```����������Ҳ��������κ�ߣ���Ҫ�������־���һ��```new HashMap()```; + +> - Hashmap��Arraylist��LinkedList��TreeMap�ȶ������Բ���ȫ�ģ� +> - Vector��Hashtable��ConcurrentHashMap�ȶ������԰�ȫ�� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/1ba0cab945874264a8d8e87b7d7c4a1b~tplv-k3u1fbpfcp-zoom-1.image) + + +## 32.�ӿڶ��������׶��������淶�� + +����д���룬��������Ϊ��ɻ�ֵ�ǰ�Ĺ��ܣ�ҲҪ�����ں�����ά����˵��ά�������벻������д���Լ����ģ�Ҳ�Ǹ����˿��ġ����Խӿڶ���Ҫ�����׶��������淶�� + +## 33. �ӿڵİ汾���� + +�ӿ�Ҫ���ð汾���ơ�����˵���������ģ�Ӧ�ð���```version```�ӿڰ汾���ֶΣ�����δ�����ӿڼ��ݡ���ɻ������Ҳ���ӿ���չ�Ե�һ�����ֵ��ɡ� + +�����ͻ���APPij�������Ż��x����κ汾�Ṳ�棬��ɦ�����ǵ�```version```�汾�ž������ó��x���```version```�����������ð汾���ơ� + +## 34. ע�������淶���� + +ע��һЩ�����Ĵ��뻵ζ���� +- �����ظ����루�鹫�÷���������ģʽ�� +- �����������ࣨ�ɷ�װ��һ��DTO������ +- �������С������ +- �ж�����̫�ࣨ�Ż�if...else�� +- ������û�õĴ��� +- ��ע�ش�����ʽ +- ������������ + +�����Ļ�ζ���������Ҷ�д������[25�ִ��뻵ζ���ܽ�+�Ż�ʾ��](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490148&idx=1&sn=00a181bf74313f751b3ea15ebc303545&chksm=cf21c54df8564c5bc5b4600fce46619f175f7ae557956f449629c470a08e20580feef4ea8d53&token=162724582&lang=zh_CN&scene=21#wechat_redirect) + +## 35.��֤�ӿ���ȷ�ԣ���ɻ���DZ�֤���اٴ�bug + +��֤�ӿڵ���ȷ�ԣ������ǶȽ������DZ�֤���اٴ�bug��������û��bug�����Խӿڿ���������һ����Ҫ����**�Բ�һ��**��Ȼ���Ļ����ӿڵ���ȷ�������ڣ����̲߳�����ɦ����**��֤���ݵ���ȷ��**,�ȵȡ���������һ��ת�˽��ף��ۼ�������ɦ�򣬿���ͨ��CAS�ֹ����ķ�ʽ��֤�����ۼ���ȷ�ɡ� + +��������ɻ����ɱ�ӿڣ��÷�ֹ���������ɡ�������ʹ��Redis�ֲ�ʽ����ֹ�������⡣ʹ��Redis�ֲ�ʽ�����м���ע��Ҫ�㣬���ҿ��Կ�����֮ǰ��ƪ���1���[���ַ�����̽��Redis�ֲ�ʽ������ȷʹ������](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488142&idx=1&sn=79a304efae7a814b6f71bbbc53810c0c&chksm=cf21cda7f85644b11ff80323defb90193bc1780b45c1c6081f00da85d665fd9eb32cc934b5cf&token=162724582&lang=zh_CN&scene=21#wechat_redirect) + +## 36.ѧ�ṵͨ����ǰ�˹�ͨ������Ʒ��ͨ + +�Ұ���һ���ŵ�������ѧ�ṵͨ�Ƿdz��dz���Ҫ�ġ������㿪�������ӿ�ɦ��**һ�������������Լ���ͷ�ѽӿڶ�������**��**��Ҫ���ͻ����ȶ����ӿ�**������һЩ�ѵ�ɦ��������leader���뷽����ɻ�������Ĺ����У���jô���⣬��ɦ����Ʒ��ͨ�� + +��֮���ǣ������ӿڹ����У�һ��Ҫ��ͨ��~ + + +## ����(����ע����������) + +������ƪ���¶�����������������������Ļ�����ӭ��ע�ҵĹ��ںţ������ݵ�С�к� + + diff --git "a/345円220円216円347円253円257円346円200円235円347円273円264円347円257円207円/345円220円216円347円253円257円346円200円235円347円273円264円347円257円207円344円272円214円357円274円232円346円211円213円346円212円212円346円211円213円346円225円231円344円275円240円345円256円236円347円216円260円344円270円200円344円270円252円345円271円266円350円241円214円350円260円203円347円224円250円346円250円241円346円235円277円.md" "b/345円220円216円347円253円257円346円200円235円347円273円264円347円257円207円/345円220円216円347円253円257円346円200円235円347円273円264円347円257円207円344円272円214円357円274円232円346円211円213円346円212円212円346円211円213円346円225円231円344円275円240円345円256円236円347円216円260円344円270円200円344円270円252円345円271円266円350円241円214円350円260円203円347円224円250円346円250円241円346円235円277円.md" new file mode 100644 index 0000000..762cb1b --- /dev/null +++ "b/345円220円216円347円253円257円346円200円235円347円273円264円347円257円207円/345円220円216円347円253円257円346円200円235円347円273円264円347円257円207円344円272円214円357円274円232円346円211円213円346円212円212円346円211円213円346円225円231円344円275円240円345円256円236円347円216円260円344円270円200円344円270円252円345円271円266円350円241円214円350円260円203円347円224円250円346円250円241円346円235円277円.md" @@ -0,0 +1,599 @@ +## ǰ�� + +���Һã����Ǽ����ݵ�С�к��� + +�����Ǻ���˼άר���ĵڶ�ƪ������һƪ[36�����ƽӿڵĽ���](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247499388&idx=1&sn=49a22120a3238e13ad7c3d3b73d9e453&chksm=cf222155f855a8434026b2c460d963c406186578c2527ca8f2bb829bbe849d87a2392a525a9b&token=1380536362&lang=zh_CN#rd)���õ��dz���С�������Ͽɡ� +36�����ƽӿڵĽ�����Ҳ�ᵽһ���㣺����**ʹ�ò��е����Ż��ӿ�**�����Խ������Ϳ����ӱޣ�д�ڶ�ƪ���ְ��ֽ���дһ�����е���ģ�塣 + +- һ�����е��õ����ӣ�App��ҳ��Ϣ��ѯ�� +- CompletionServiceɻ�ֲ��е��� +- ��ȡͨ�õIJ��е��÷��� +- ����˼���Լ�����ģʽӦ�� +- ˼���ܽ� +- ���ںţ�**�����ݵ�С�к�** + + +## 1. һ�����е��õ����� + +������������һ��APP��ҳ��ѯ�Ľӿڣ�����Ҫ���û���Ϣ����Ҫ��```banner```��Ϣ����Ҫ����ǩ��Ϣ�ȵȡ�һ��������С������ɻ�����£� + +``` +public AppHeadInfoResponse queryAppHeadInfo(AppInfoReq req) { + //���û���Ϣ + UserInfoParam userInfoParam = buildUserParam(req); + UserInfoDTO userInfoDTO = userService.queryUserInfo(userInfoParam); + //��banner��Ϣ + BannerParam bannerParam = buildBannerParam(req); + BannerDTO bannerDTO = bannerService.queryBannerInfo(bannerParam); + //����ǩ��Ϣ + LabelParam labelParam = buildLabelParam(req); + LabelDTO labelDTO = labelService.queryLabelInfo(labelParam); + //��װ���� + return buildResponse(userInfoDTO,bannerDTO,labelDTO); +} +``` + +���δ�������jô����� ��ɻ����һ��ͦ�����Ĵ��룬���������ɻ���У���ѯ�û���banner����ǩ��Ϣ��**�Ǵ��е�**��������ѯ�û���Ϣ```200ms```����ѯbanner��Ϣ```100ms```����ѯ��ǩ��Ϣ```200ms```�Ļ�����ɦ����```500ms```���� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/35fa8e071a7048d5ae7d8e3e7f339532~tplv-k3u1fbpfcp-zoom-1.image) + +��ɻΪ���Ż����ܣ����ǿ����޸�Ϊ**���е���**�ķ�ʽ����ɦ���Խ�Ϊ```200ms```������ͼ��ʾ�� + + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e8559cfd7bb2449dbab91c0b38a3d78e~tplv-k3u1fbpfcp-zoom-1.image) + + +## 2. CompletionServiceɻ�ֲ��е��� + +�������������ӣ�**����ɻ�ֲ��е����أ�** + +��С����˵������ʹ��```Future+Callable```ɻ�ֶ��������IJ��е��á������̳߳�ִ����������ɦ������ֵ��```Future��get()```��ȡ�������ģ�����ǰһ������ִ�бȽϺ�ɦ�Ļ���```get����```�������������γ��Ŷӵȴ��������� + +��```CompletionService```�ǶԶ���```ExecutorService```�����˰�װ������һ����������,һ�߻�ȡ�����ķ���ֵ�����������·ֿ�ִ��,����֮�䲻�ụ�����������Ի�ȡ�������ɵ����������� + + +> ```CompletionService```��ɻ��ԭ���Ƚϼ򵥣��ײ�ͨ��FutureTask+�������У�ɻ�������������ɵĻ��������Ȼ�ȡ����Ҳ����˵����ִ�н����������ɵ��Ⱥ�˳���������������ɿ����Ż���ȡ�����ڲ���һ���Ƚ��ȳ����������У����ڱ����Ѿ�ִ�����ɵ�Future��������```CompletionService```��poll��take�������ɻ�ȡ��һ���Ѿ�ִ�����ɵ�Future������ͨ������Future�ӿ�ɻ������```get```������ȡ���յĽ����� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/10e375f58f5d490193888b0c5375e0f0~tplv-k3u1fbpfcp-zoom-1.image) + + +�����������������£�������```CompletionService```��ɻ�ֲ��в�ѯAPP��ҳ��Ϣ����˼���������£� + +1. �����ȰѲ�ѯ�û���Ϣ�����񣬷ŵ��̳߳أ����£� +``` +ExecutorService executor = Executors.newFixedThreadPool(10); +//��ѯ�û���Ϣ +CompletionService userDTOCompletionService = new ExecutorCompletionService(executor); +Callable userInfoDTOCallableTask = () -> { + UserInfoParam userInfoParam = buildUserParam(req); + return userService.queryUserInfo(userInfoParam); + }; +userDTOCompletionService.submit(userInfoDTOCallableTask); +``` + +2. �����������Ѳ�ѯ```banner```��Ϣ��������Ҳ�ŵ������̳߳صĻ������ֲ��÷��x���Ϊ�������Ͳ�һ����һ����```UserInfoDTO```������һ����```BannerDTO```������ɦ���������Dz��ǰѷ�������ΪObject���ɣ���Ϊ���ж������Ǽ̳���Object�ģ����£� + +``` +ExecutorService executor = Executors.newFixedThreadPool(10); +//��ѯ�û���Ϣ +CompletionService baseDTOCompletionService = new ExecutorCompletionService(executor); +Callable userInfoDTOCallableTask = () -> { + UserInfoParam userInfoParam = buildUserParam(req); + return userService.queryUserInfo(userInfoParam); +}; +//banner��Ϣ���� +Callable bannerDTOCallableTask = () -> { + BannerParam bannerParam = buildBannerParam(req); + return bannerService.queryBannerInfo(bannerParam); +}; + +//�ύ�û���Ϣ���� +baseDTOCompletionService.submit(userInfoDTOCallableTask); +//�ύbanner��Ϣ���� +baseDTOCompletionService.submit(bannerDTOCallableTask); +``` +3. �������и����⣬���ǻ�ȡ**����ֵ��ɦ��**�����Dz�֪���ĸ�```Object```���û���Ϣ��DTO���ĸ���```BannerDTO```��**��ô���أ�**��ɦ�������ǿ����ڲ�������������չ�����������Ϊһ����������BaseRspDTO���يٴ������ͷ�Object���ݵģ�Ȼ����������BaseRspDTO�и�������UserDTO����BannerDTO��**Ψһ��������key**���������£� + +``` +public class BaseRspDTO { + + //������DTO���ص�Ψһ���ǣ�������UserInfoDTO����BannerDTO + private String key; + //���ص�data + private T data; + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public T getData() { + return data; + } + + public void setData(T data) { + this.data = data; + } +} + +//���в�ѯApp��ҳ��Ϣ +public AppHeadInfoResponse parallelQueryAppHeadPageInfo(AppInfoReq req) { + + long beginTime = System.currentTimeMillis(); + System.out.println("��ʼ���в�ѯapp��ҳ��Ϣ����ʼɦ�䣺" + beginTime); + + ExecutorService executor = Executors.newFixedThreadPool(10); + CompletionService baseDTOCompletionService = new ExecutorCompletionService(executor); + + //��ѯ�û���Ϣ���� + Callable userInfoDTOCallableTask = () -> { + UserInfoParam userInfoParam = buildUserParam(req); + UserInfoDTO userInfoDTO = userService.queryUserInfo(userInfoParam); + BaseRspDTO userBaseRspDTO = new BaseRspDTO(); + userBaseRspDTO.setKey("userInfoDTO"); + userBaseRspDTO.setData(userInfoDTO); + return userBaseRspDTO; + }; + + //banner��Ϣ��ѯ���� + Callable bannerDTOCallableTask = () -> { + BannerParam bannerParam = buildBannerParam(req); + BannerDTO bannerDTO = bannerService.queryBannerInfo(bannerParam); + BaseRspDTO bannerBaseRspDTO = new BaseRspDTO(); + bannerBaseRspDTO.setKey("bannerDTO"); + bannerBaseRspDTO.setData(bannerDTO); + return bannerBaseRspDTO; + }; + + //label��Ϣ��ѯ���� + Callable labelDTODTOCallableTask = () -> { + LabelParam labelParam = buildLabelParam(req); + LabelDTO labelDTO = labelService.queryLabelInfo(labelParam); + BaseRspDTO labelBaseRspDTO = new BaseRspDTO(); + labelBaseRspDTO.setKey("labelDTO"); + labelBaseRspDTO.setData(labelDTO); + return labelBaseRspDTO; + }; + + //�ύ�û���Ϣ���� + baseDTOCompletionService.submit(userInfoDTOCallableTask); + //�ύbanner��Ϣ���� + baseDTOCompletionService.submit(bannerDTOCallableTask); + //�ύlabel��Ϣ���� + baseDTOCompletionService.submit(labelDTODTOCallableTask); + + UserInfoDTO userInfoDTO = null; + BannerDTO bannerDTO = null; + LabelDTO labelDTO = null; + + try { + //��Ϊ�ύ��3�����������Ի�ȡ����������3 + for (int i = 0; i < 3; i++) { + Future baseRspDTOFuture = baseDTOCompletionService.poll(1, TimeUnit.SECONDS); + BaseRspDTO baseRspDTO = baseRspDTOFuture.get(); + if ("userInfoDTO".equals(baseRspDTO.getKey())) { + userInfoDTO = (UserInfoDTO) baseRspDTO.getData(); + } else if ("bannerDTO".equals(baseRspDTO.getKey())) { + bannerDTO = (BannerDTO) baseRspDTO.getData(); + } else if ("labelDTO".equals(baseRspDTO.getKey())) { + labelDTO = (LabelDTO) baseRspDTO.getData(); + } + } + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + + System.out.println("�������в�ѯapp��ҳ��Ϣ,�ܺ�ɦ��" + (System.currentTimeMillis() - beginTime)); + return buildResponse(userInfoDTO, bannerDTO, labelDTO); +} +``` + +������Ϊֹ��һ������```CompletionService```ɻ�ֲ��е��õ������Ѿ�ɻ�������Dz��Ǻܿ��ģ������� + +## 3. ��ȡͨ�õIJ��е��÷��� + +���ǻع����۲��μ�2С�ڣ���ѯapp��ҳ��Ϣ��demo��```CompletionService```ɻ���˲��е��á�������û��jô�����뷨�أ�����,��������ҵ�񳡾���Ҳ��ͨ�����е����Ż������Dz���Ҳ�ø�һ�����Ƶ�2С�ڵĴ��롣���ԣ�**�����Dz��ǿ��Գ�ȡһ��ͨ�õIJ��з������ñ��ij���Ҳ�����ã��԰ɣ������Ǻ���˼ά��**�� + +���ڵ�2С�ڵĴ��룬�������γ�ȡͨ�ò��е��÷����ء� + +���ȣ�����ͨ�õIJ��е��÷�����**���ܸ�ҵ�����ص����Թҹ�**���԰ɣ����Է���������Ӧ������Щ�أ� + +> ���������Σ�������```Callable```�԰ɡ���Ϊ���У��϶��Ƕ���Callable�����ġ����ԣ�����Ӧ����һ��```Callable```�����顣��Ȼ�󣬻���������APP��ҳ��ѯ�����ӣ�```Callable```�����ô�```BaseRspDTO```���ͣ��԰ɣ��������ξ���```List> list```�� + +�Dz��е��õij����أ� ���ж���```Callable```���������Dz��ǵ��ж�����Ӧ�ķ��أ����x����ij��ο�����```List```�����dz�ȡ��ͨ�ò��е���ģ�壬�Ϳ���д�ɽ��ϣ� + +``` + public List executeTask(List> taskList) { + + List resultList = new ArrayList(); + //У������ + if (taskList == null || taskList.size() == 0) { + return resultList; + } + + ExecutorService executor = Executors.newFixedThreadPool(10); + CompletionService baseDTOCompletionService = new ExecutorCompletionService(executor); + //�ύ���� + for (Callable task : taskList) { + baseDTOCompletionService.submit(task); + } + + try { + //������ȡ���� + for (int i = 0; i < taskList.size(); i++) { + Future baseRspDTOFuture = baseDTOCompletionService.poll(2, TimeUnit.SECONDS); + resultList.add(baseRspDTOFuture.get()); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + + return resultList; + } +``` +��Ȼ�����dz�ȡͨ�õIJ��е��÷����������εķ����Ƿ�����**��Щ�ط���Ҫ�Ľ�**���أ� + +- ��һ�������Ż��ĵط�������```executor�̳߳�```��������Щҵ�񳡾�����```A�̳߳�```����Щҵ������```B�̳߳�```����ô����������Ͳ�ͨ�������԰ɡ����ǿ��԰��̳߳��Բ�����ɻ���ṩ�����������÷��Լ����ơ� +- �ڶ��������Ż��ĵط�������```CompletionService```��```poll```������ȡɦ����ɦɦ����д���ġ���Ϊ��ͬҵ�񳡾�����ɦɦ�����ܲ�һ�������ԣ���ɦɦ��Ҳ�ǿ����Բ�����ʽ�ų����������÷��Լ����ơ� + +�����ٴ��Ż�һ������ͨ�õIJ��е���ģ�壬�������£� +``` +public List executeTask(List> taskList, long timeOut, ExecutorService executor) { + + List resultList = new ArrayList(); + //У������ + if (taskList == null || taskList.size() == 0) { + return resultList; + } + if (executor == null) { + return resultList; + } + if (timeOut <= 0) { + return resultList; + } + + //�ύ���� + CompletionService baseDTOCompletionService = new ExecutorCompletionService(executor); + for (Callable task : taskList) { + baseDTOCompletionService.submit(task); + } + + try { + //������ȡ���� + for (int i = 0; i < taskList.size(); i++) { + Future baseRspDTOFuture = baseDTOCompletionService.poll(timeOut, TimeUnit.SECONDS); + resultList.add(baseRspDTOFuture.get()); + } + } catch (InterruptedException e) { + e.printStackTrace(); + } catch (ExecutionException e) { + e.printStackTrace(); + } + + return resultList; +} +``` + +�Ժ����ij���Ҳ��Ҫ�õ����е��õĻ���ֱ�ӵ���������������ɣ��Dz����е�СС�ijɾ͸����������� + +## 4. ����˼���Լ�����ģʽӦ�� + +���ǰѳ�ȡ���Ǹ����õIJ��е��÷�����Ӧ�õ�```App��ҳ��Ϣ��ѯ```�����ӣ��������£� + +``` +public AppHeadInfoResponse parallelQueryAppHeadPageInfo1(AppInfoReq req) { + + long beginTime = System.currentTimeMillis(); + System.out.println("��ʼ���в�ѯapp��ҳ��Ϣ����ʼɦ�䣺" + beginTime); + //�û���Ϣ��ѯ���� + Callable userInfoDTOCallableTask = () -> { + UserInfoParam userInfoParam = buildUserParam(req); + UserInfoDTO userInfoDTO = userService.queryUserInfo(userInfoParam); + BaseRspDTO userBaseRspDTO = new BaseRspDTO(); + userBaseRspDTO.setKey("userInfoDTO"); + userBaseRspDTO.setData(userInfoDTO); + return userBaseRspDTO; + }; + + //banner��Ϣ��ѯ���� + Callable bannerDTOCallableTask = () -> { + BannerParam bannerParam = buildBannerParam(req); + BannerDTO bannerDTO = bannerService.queryBannerInfo(bannerParam); + BaseRspDTO bannerBaseRspDTO = new BaseRspDTO(); + bannerBaseRspDTO.setKey("bannerDTO"); + bannerBaseRspDTO.setData(bannerDTO); + return bannerBaseRspDTO; + }; + + //label��Ϣ��ѯ���� + Callable labelDTODTOCallableTask = () -> { + LabelParam labelParam = buildLabelParam(req); + LabelDTO labelDTO = labelService.queryLabelInfo(labelParam); + BaseRspDTO labelBaseRspDTO = new BaseRspDTO(); + labelBaseRspDTO.setKey("labelDTO"); + labelBaseRspDTO.setData(labelDTO); + return labelBaseRspDTO; + }; + + List> taskList = new ArrayList(); + taskList.add(userInfoDTOCallableTask); + taskList.add(bannerDTOCallableTask); + taskList.add(labelDTODTOCallableTask); + ExecutorService executor = Executors.newFixedThreadPool(10); + List resultList = parallelInvokeCommonService.executeTask(taskList, 3, executor); + if (resultList == null || resultList.size() == 0) { + return new AppHeadInfoResponse(); + } + + UserInfoDTO userInfoDTO = null; + BannerDTO bannerDTO = null; + LabelDTO labelDTO = null; + + //�������� + for (int i = 0; i < resultList.size(); i++) { + BaseRspDTO baseRspDTO = resultList.get(i); + if ("userInfoDTO".equals(baseRspDTO.getKey())) { + userInfoDTO = (UserInfoDTO) baseRspDTO.getData(); + } else if ("bannerDTO".equals(baseRspDTO.getKey())) { + bannerDTO = (BannerDTO) baseRspDTO.getData(); + } else if ("labelDTO".equals(baseRspDTO.getKey())) { + labelDTO = (LabelDTO) baseRspDTO.getData(); + } + } + + System.out.println("�������в�ѯapp��ҳ��Ϣ,�ܺ�ɦ��" + (System.currentTimeMillis() - beginTime)); + return buildResponse(userInfoDTO, bannerDTO, labelDTO); + } + +``` + +�������Θ��룬С�����ǣ��Ƿ����������������Ż��뷨�أ� �����弓��```Callable```��ѯ�����������Dz���Ҳ���Գ�ȡһ�£��ô������Ӽ��ࡣ + +> ������˵����������ֱ�ӽ�һ��```BaseTaskCommand```�࣬ɻ��```Callable```�ӿڣ��Ѳ�ѯ�û���Ϣ����ѯbanner��Ϣ��label��ǩ��Ϣ�IJ�ѯ�����Ž�ȥ�� + +�������£� + +``` +public class BaseTaskCommand implements Callable { + + private String key; + private AppInfoReq req; + private IUserService userService; + private IBannerService bannerService; + private ILabelService labelService; + + public BaseTaskCommand(String key, AppInfoReq req, IUserService userService, IBannerService bannerService, ILabelService labelService) { + this.key = key; + this.req = req; + this.userService = userService; + this.bannerService = bannerService; + this.labelService = labelService; + } + + @Override + public BaseRspDTO call() throws Exception { + + if ("userInfoDTO".equals(key)) { + UserInfoParam userInfoParam = buildUserParam(req); + UserInfoDTO userInfoDTO = userService.queryUserInfo(userInfoParam); + BaseRspDTO userBaseRspDTO = new BaseRspDTO(); + userBaseRspDTO.setKey("userInfoDTO"); + userBaseRspDTO.setData(userInfoDTO); + return userBaseRspDTO; + } else if ("bannerDTO".equals(key)) { + BannerParam bannerParam = buildBannerParam(req); + BannerDTO bannerDTO = bannerService.queryBannerInfo(bannerParam); + BaseRspDTO bannerBaseRspDTO = new BaseRspDTO(); + bannerBaseRspDTO.setKey("bannerDTO"); + bannerBaseRspDTO.setData(bannerDTO); + return bannerBaseRspDTO; + } else if ("labelDTO".equals(key)) { + LabelParam labelParam = buildLabelParam(req); + LabelDTO labelDTO = labelService.queryLabelInfo(labelParam); + BaseRspDTO labelBaseRspDTO = new BaseRspDTO(); + labelBaseRspDTO.setKey("labelDTO"); + labelBaseRspDTO.setData(labelDTO); + return labelBaseRspDTO; + } + + return null; + } + + + private UserInfoParam buildUserParam(AppInfoReq req) { + return new UserInfoParam(); + } + + private BannerParam buildBannerParam(AppInfoReq req) { + return new BannerParam(); + } + + private LabelParam buildLabelParam(AppInfoReq req) { + return new LabelParam(); + } +} +``` +�����������룬���캯��������**�Ƚ϶��IJ���**������```call()```�����У��ж���```if...else...```,��������һ����֧��**������ѯ������Ϣ**�������ֵ���```call```�������޸��x�����**BaseTaskCommand�Ĺ�����ҲҪ�޸���**�� + +> �����Ƿ���ӡ�󣬶������г��ֶ���if...else...ɦ�����ǾͿ��Կ���ʹ��**����ģʽ+����ģʽ**�Ż��� + +����������������ɻ���࣬���£� + +``` + +public interface IBaseTask { + + //����ÿ����������key���� + String getTaskType(); + + BaseRspDTO execute(AppInfoReq req); + +} + +//�û���Ϣ������ +@Service +public class UserInfoStrategyTask implements IBaseTask { + + @Autowired + private IUserService userService; + + @Override + public String getTaskType() { + return "userInfoDTO"; + } + + @Override + public BaseRspDTO execute(AppInfoReq req) { + UserInfoParam userInfoParam = userService.buildUserParam(req); + UserInfoDTO userInfoDTO = userService.queryUserInfo(userInfoParam); + BaseRspDTO userBaseRspDTO = new BaseRspDTO(); + userBaseRspDTO.setKey(getTaskType()); + userBaseRspDTO.setData(userBaseRspDTO); + return userBaseRspDTO; + } +} + +/** + * banner��Ϣ����ɻ���� + **/ +@Service +public class BannerStrategyTask implements IBaseTask { + + @Autowired + private IBannerService bannerService; + + @Override + public String getTaskType() { + return "bannerDTO"; + } + + @Override + public BaseRspDTO execute(AppInfoReq req) { + BannerParam bannerParam = bannerService.buildBannerParam(req); + BannerDTO bannerDTO = bannerService.queryBannerInfo(bannerParam); + BaseRspDTO bannerBaseRspDTO = new BaseRspDTO(); + bannerBaseRspDTO.setKey(getTaskType()); + bannerBaseRspDTO.setData(bannerDTO); + return bannerBaseRspDTO; + } +} + +... +``` +Ȼ���弓������ɻ���࣬��ô����```spring```�����أ� ���ǿ���ɻ��```ApplicationContextAware```�ӿڣ��Ѳ��Ե�ɻ����ע�뵽һ��map��Ȼ���������󷽲�ͬ�IJ�����������(��DTO�����ͣ���ȥɻ�ֲ�ͬ�IJ��������á���ɻ�������ڹ���ģʽ��˼�롣�������£� + +``` +/** + * ���Թ����� + **/ +@Component +public class TaskStrategyFactory implements ApplicationContextAware { + + private Map map = new ConcurrentHashMap(); + + @Override + public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { + Map tempMap = applicationContext.getBeansOfType(IBaseTask.class); + tempMap.values().forEach(iBaseTask -> { + map.put(iBaseTask.getTaskType(), iBaseTask); + }); + } + + public BaseRspDTO executeTask(String key, AppInfoReq req) { + IBaseTask baseTask = map.get(key); + if (baseTask != null) { + System.out.println("��������ɻ����ִ��"); + return baseTask.execute(req); + } + return null; + } +} +``` + +���˲��Թ�����```TaskStrategyFactory```�������ٻ����Ż���```BaseTaskCommand```���Ĵ��롣���Ĺ������Ѿ�����Ҫ����```IUserService userService, IBannerService bannerService, ILabelService labelService```����ֻ��Ҫ���Թ�����```TaskStrategyFactory```���ɡ�ͬɦ����Ҳ����Ҫ����```if...else...```�ж��x��ò��Թ�����```TaskStrategyFactory```���漴�ɡ��Ż����Ĵ������£� + +``` +public class BaseTaskCommand implements Callable { + + private String key; + private AppInfoReq req; + private TaskStrategyFactory taskStrategyFactory; + + public BaseTaskCommand(String key, AppInfoReq req, TaskStrategyFactory taskStrategyFactory) { + this.key = key; + this.req = req; + this.taskStrategyFactory = taskStrategyFactory; + } + + @Override + public BaseRspDTO call() throws Exception { + return taskStrategyFactory.executeTask(key, req); + } +} +``` + +��������```app��ҳ��Ϣ����```��ѯ���Ϳ����Ż��������������£� + +``` +public AppHeadInfoResponse parallelQueryAppHeadPageInfo2(AppInfoReq req) { + long beginTime = System.currentTimeMillis(); + System.out.println("��ʼ���в�ѯapp��ҳ��Ϣ�����հ汾������ʼɦ�䣺" + beginTime); + List> taskList = new ArrayList(); + //�û���Ϣ��ѯ���� + taskList.add(new BaseTaskCommand("userInfoDTO", req, taskStrategyFactory)); + //banner��ѯ���� + taskList.add(new BaseTaskCommand("bannerDTO", req, taskStrategyFactory)); + //��ǩ��ѯ���� + taskList.add(new BaseTaskCommand("labelDTO", req, taskStrategyFactory)); + + ExecutorService executor = Executors.newFixedThreadPool(10); + List resultList = parallelInvokeCommonService.executeTask(taskList, 3, executor); + + if (resultList == null || resultList.size() == 0) { + return new AppHeadInfoResponse(); + } + + UserInfoDTO userInfoDTO = null; + BannerDTO bannerDTO = null; + LabelDTO labelDTO = null; + + for (BaseRspDTO baseRspDTO : resultList) { + if ("userInfoDTO".equals(baseRspDTO.getKey())) { + userInfoDTO = (UserInfoDTO) baseRspDTO.getData(); + } else if ("bannerDTO".equals(baseRspDTO.getKey())) { + bannerDTO = (BannerDTO) baseRspDTO.getData(); + } else if ("labelDTO".equals(baseRspDTO.getKey())) { + labelDTO = (LabelDTO) baseRspDTO.getData(); + } + } + + System.out.println("�������в�ѯapp��ҳ��Ϣ�����հ汾��,�ܺ�ɦ��" + (System.currentTimeMillis() - beginTime)); + return buildResponse(userInfoDTO, bannerDTO, labelDTO); + } +``` + + +## 5. ˼���ܽ� + +���Θ��������Ż��������Ѿ��ܼ��������ǻ���û�б����Ż�˼·�ء� +> ��ɻ�����еģ����磬��Ψһ���ǵ�```key```����Ϊö�٣�������д�����ַ���```"userInfoDTO"��"bannerDTO"��"labelDTO"```�����У�����```CompletionService```����ЩС����ς����```CompletableFuture```ɻ�в��е��á� + +���Ĵ���ѧ������Щ֪ʁ�أ� +1. �����Ż��ӿ����ܣ�ijЩ�����£�����ʹ�ò��е��ô��洮�С� +2. ����ɻ�ֲ��е����أ� ����ʹ��```CompletionService```�� +3. ѧ���ĺ���˼ά�ǣ� �ճ������У�Ҫѧ����ȡͨ�õķ��������߹��ߡ� +4. ����ģʽ�͹���ģʽ��Ӧ�� + +���ĵĻ�������ģʽ���黹���Ǻ���ϸ��Ȼ����һƪ�������ҽ������������������д��������ϣ���ȡ����ģʽ�Ĺ���Ȼ��������������Ҫ���ĵ����������Ļ������Թ�ע�ҵĹ��ںţ�**�����ݵ�С�к�**���������ҵ���ε��ʽ���� + + + + + diff --git "a/345円244円247円345円216円202円351円235円242円350円257円225円347円234円237円351円242円230円/README.MD" "b/345円244円247円345円216円202円351円235円242円350円257円225円347円234円237円351円242円230円/README.MD" new file mode 100644 index 0000000..04f4506 --- /dev/null +++ "b/345円244円247円345円216円202円351円235円242円350円257円225円347円234円237円351円242円230円/README.MD" @@ -0,0 +1,13 @@ +## 1. 面试真题 + +关注公众号:捡田螺的小男孩 +​ +- [oppo后端16连问](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498750&idx=1&sn=19fe8b4fff28fe81db14e733053bbc74&chksm=cf2224d7f855adc1d0984980a4e3de31fe33329164a472ca8d8255a8a80b69b2e23850811323&token=2001057130&lang=zh_CN#rd) +- [小厂后端十连问(附答案)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498316&idx=1&sn=7749b78293b7b2af51eda99844e08a56&chksm=cf222565f855ac7324232e2af459f8b6e6eb5fd5b272c2b29bda08cc579421b6704a0de94b2e&token=2001057130&lang=zh_CN#rd) +- [腾讯云后端15连问!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498171&idx=1&sn=f5a7ec25a569822be0f73fbcd413e8ba&chksm=cf222692f855af84fba419166fcd4235c0e78af3a2e1ec4c723a4efb1bd1ad6f8a5b9404c599&token=2001057130&lang=zh_CN#rd) +- [社招后端21连问(三年工作经验一面)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498084&idx=1&sn=96c8148cfeeeb16668ed9e03fa9131cc&chksm=cf22264df855af5b6e81b93738cca28989226a53ec702fcfaa0cc5004dded4208c5ee5ea844a&token=2001057130&lang=zh_CN#rd) +- [一份热乎乎的字节面试真题](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497742&idx=1&sn=18765e7356f446a7f2521f45b467d5d3&chksm=cf222727f855ae31dd2029e3219814211336c41d9228d271a583d3691ddadca586529aca9302&token=2001057130&lang=zh_CN#rd) +- [面试必备:虾皮服务端15连问](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497256&idx=1&sn=3b799c2d514aa25e85a6faa60d639a0b&chksm=cf222901f855a017b73356b99b830b8800a7a9172fab891c5759d8dd69a270872ea9480c0b7c&token=2001057130&lang=zh_CN#rd) +- [宇宙条一面:十道经典面试题解析](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247495342&idx=1&sn=54e1c0c16a6467001524c34818025331&chksm=cf223187f855b89140db5ca429e6efc19d0111abf7f36b78a0ecd73b00fded1ff1e7ba32a6f1&token=2001057130&lang=zh_CN#rd) +- [蚂蚁金服一面:十道经典面试题解析](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247493270&idx=1&sn=1c78a81d6e1bd0f0fd947fe8c3a33e32&chksm=cf2239bff855b0a9627855f20a17799e0506eb7548a409bfa0ee0450328d7519ec70f7b962cc&token=2001057130&lang=zh_CN#rd) +- [田螺精品面试PDF发布](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247499943&idx=1&sn=fe869c0a97a306e42830336fe74e17a6&chksm=cf221f8ef8559698781709bfbccbb85087286e48434905fb18bec3a3ec0af7329c2a1632c230&token=1990771297&lang=zh_CN#rd) \ No newline at end of file diff --git "a/345円267円245円344円275円234円346円200円273円347円273円223円/READEME.MD" "b/345円267円245円344円275円234円346円200円273円347円273円223円/READEME.MD" new file mode 100644 index 0000000..6c258b9 --- /dev/null +++ "b/345円267円245円344円275円234円346円200円273円347円273円223円/READEME.MD" @@ -0,0 +1,17 @@ +## 工作总结 + +- [工作总结!日志打印的15个建议](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247494838&idx=1&sn=cdb15fd346bddf3f8c1c99f0efbd67d8&chksm=cf22339ff855ba891616c79d4f4855e228e34a9fb45088d7acbe421ad511b8d090a90f5b019f&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [25种代码坏味道总结+优化示例](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490148&idx=1&sn=00a181bf74313f751b3ea15ebc303545&chksm=cf21c54df8564c5bc5b4600fce46619f175f7ae557956f449629c470a08e20580feef4ea8d53&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [聊聊日常开发中,如何减少bug呢?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490662&idx=1&sn=d38a090611af7f64ee3c6a31331d5228&chksm=cf21c34ff8564a59e505e6edf3065a0fc506c6d2c96f492c8d8873cd46dedbe0704e43cb9c2e&token=1990771297&lang=zh_CN#rd) +- [工作四年,分享50个让你代码更好的小建议](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488708&idx=1&sn=6e2e0a740f5d42a59641487a0bf1e3bf&chksm=cf21cbedf85642fbb485fa1c7bf9af21923d8503f2542b6f8283ce79ddc683f7d9e45da83100&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [写代码有这16个好习惯,可以减少80%非业务的bug](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488097&idx=1&sn=eaca1f92ca3ccd9de00dbc4ef3e4029a&chksm=cf21cd48f856445e4cc24c1f8bcf18d1479bad0a37a87a2fb70717d8a4e65dcf7b4d5f83d24f&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [Java日常开发的21个坑,你踩过几个?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488115&idx=1&sn=bdd4a4ca36bc7ea902106d058e8537fb&chksm=cf21cd5af856444cb36af600705615454b0aaa2b289b97ddb52d594556ac07a1915b73ecce19&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [CAS乐观锁解决并发问题的一次实践](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487937&idx=1&sn=206a37bf6d6a7aa1d05674c479ed7a72&chksm=cf21cee8f85647fe7a082049a41c0f640f54976d2cdf4302b24c5517ca42b854eb84b13ece10&token=1990771297&lang=zh_CN#rd) +- [写代码有这些想法,同事才不会认为你是复制粘贴程序员](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487961&idx=1&sn=e646231067968d9f58e6665914293f9a&chksm=cf21cef0f85647e6f3ff2feece004ac3bd979e37fe45103c88d0f299dfe632a5cf6dd547c1d9&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [程序员必备:Java日期处理的十个坑](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487973&idx=1&sn=0f713413098fb579e5f200b829f71e89&chksm=cf21ceccf85647da450765d79bf5943da551c3be950447063b9f8c77c21bf2a39b99387a949b&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [内存泄漏问题的分析和解决方案](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487986&idx=1&sn=d681a585ac489703788e3baa48eb9aa3&chksm=cf21cedbf85647cd23bbab9dfec63e6877f83c34efb19bd16075d5d90fea91d3f4a20fc77921&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [程序员必备基础:加签验签](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488022&idx=1&sn=70484a48173d36006c8db1dfb74ab64d&chksm=cf21cd3ff8564429a1205f6c1d78757faae543111c8461d16c71aaee092fe3e0fed870cc5e0e&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [记一次接口性能优化实践总结:优化接口性能的八个建议](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488004&idx=1&sn=00840efd9c0bd0a7f172b59eb2ca130f&chksm=cf21cd2df856443bf21d8e09cfe5c8452ecaf82e3c2210fca3b28829ded04defddcf63c0a59b&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [程序员必备基础:如何安全传输存储用户密码?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488117&idx=1&sn=5d3d0eda0ed45f3f576e211de31ca3a9&chksm=cf21cd5cf856444af1407a94a2abf445265ca7c5f5855cfa1c223cb209e99040c7889621f231&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [一次代码优化实践,用了模板方法+策略+工厂方法模式](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488061&idx=1&sn=1d9ab7954b03521ab81ecf033c0e5e50&chksm=cf21cd14f8564402b213f0ef908bbdb0e12fed4b281c5803b8e539cacb1551654194becfb7d6&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [保证接口数据安全的10种方案](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247500285&idx=1&sn=7d0723f25d46e858859cfd79acb6fb9d&chksm=cf221ed4f85597c2093f81baa5fdedc65817bf2d23a7951236836b0f54c2335695cbed61cd13&token=1990771297&lang=zh_CN#rd) \ No newline at end of file diff --git "a/345円267円245円344円275円234円346円200円273円347円273円223円/346円227円245円345円277円227円346円211円223円345円215円260円350円247円204円350円214円203円.md" "b/345円267円245円344円275円234円346円200円273円347円273円223円/346円227円245円345円277円227円346円211円223円345円215円260円350円247円204円350円214円203円.md" new file mode 100644 index 0000000..4577332 --- /dev/null +++ "b/345円267円245円344円275円234円346円200円273円347円273円223円/346円227円245円345円277円227円346円211円223円345円215円260円350円247円204円350円214円203円.md" @@ -0,0 +1,269 @@ +## ǰ�� + +���Һã�����**�����ݵ�С�к�**����־�ǿ��وٴ�λ�����ĺð��֣���**˺�ƺ�˦��**�������ӡ����־�dz���Ҫ����������������**��־��ӡ**��15���ý���~ + +- ���ںţ�**�����ݵ�С�к�** + + +## 1. ѡ��ǡ������־���� + +��������־������5�֣��ֱ���error��warn��info��debug��trace���ճ������У�������Ҫѡ��ǡ������־���𣬲�Ҫ���־��Ǵ�ӡinfo��~ + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c4502943568747e79ac4091b4d2868ea~tplv-k3u1fbpfcp-zoom-1.image) + +- error��������־��ָ�Ƚ����صĴ��󣬶�����ҵ����Ӱ�죬��Ҫ**��ά���ü��ص�**�� +- warn��������־��һ���Ĵ��󣬶�ҵ��Ӱ�첻�󣬵�����Ҫ**������ע**�� +- info����Ϣ��־����1⁄4�Ų������Ĺؼ���Ϣ��������ɦ�䡢�������εȵȣ� +- debug�����ڿ���DEBUG�ģ��ؼ��߼�����������ɦ���ݣ� +- trace������ϸ����Ϣ��һ����Щ��Ϣֻ��1⁄4����־�ļ��С� + + +## 2. ��־Ҫ��ӡ��������Ρ����� + +���Dz�����Ҫ��ӡ�ܶ��ܶ���־��ֻ��Ҫ��ӡ����**���وٴ�λ��������Ч��־**����Ч����־����˦���������� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c59f66bfc09d42ffa8528c16145952b8~tplv-k3u1fbpfcp-zoom-1.image) + +��Щ���õ���**��Ч�ؼ�**����־�أ�����˵������������ɦ�򣬴�ӡ**����**����Ȼ���أ��ڷ������ص�ɦ�򣬾���**��ӡ���Σ�����ֵ**�����εĻ���һ������**userId����bizSeq��Щ�ؼ�**��Ϣ���������£� + +``` +public String testLogMethod(Document doc, Mode mode){ + log.debug(��method enter param��{}��,userId); + String id = "666"; + log.debug(��method exit param��{}��,id); + return id; +} +``` + + +## 3. ѡ�����ɻ���־��ʽ + +��������־��ʽ��Ӧ��������Щ����������Ϣ���統**ǰɦ����**��һ�����뾫ȷ�ȣ���**��־����**��**�߳�����**�ȵȡ���logback��־��������ô���ã� + +``` + + + %d{HH:mm:ss.SSS} %-5level [%thread][%logger{0}] %m%n + + +``` + +�������ǵ���־��ʽ������ǰɦ�䶼�]�м�1⁄4����**��������ɦ���㶼��֪����**�� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/6ecfebbe1a0b411e8186d46edaddbd38~tplv-k3u1fbpfcp-zoom-1.image) + + +## 4. ����if...else...������ɦ��ÿ����֧���ж�������ӡ��־ + +��������**if...else...����switch**����������ɦ�������ڷ�֧�����оʹ�ӡ��־�������Ų�����ɦ���Ϳ���ͨ����־��ȷ���������ĸ���֧�������߼���������Ҳ�������Ų������l� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/60bc12dfb6324c089b86a9dc05acc2f3~tplv-k3u1fbpfcp-zoom-1.image) + + +������ +``` +if(user.isVip()){ + log.info("���û��ǻ�Ա,Id:{},��ʼ������Ա�߼�",user,getUserId()); + //��Ա�߼� +}else{ + log.info("���û��Ƿǻ�Ա,Id:{},��ʼ�����ǻ�Ա�߼�",user,getUserId()) + //�ǻ�Ա�߼� +} +``` + +## 5.��־�����Ƚε�ɦ��������־�����ж� + +����trace/debug��Щ�Ƚε͵���־���𣬱���������־�����L·����жϡ� + +������ +``` +User user = new User(666L, "���ں�", "�����ݵ�С�к�"); +if (log.isDebugEnabled()) { + log.debug("userId is: {}", user.getId()); +} +``` + +��Ϊ��ǰ�����μ���־���룺 +``` +logger.debug("Processing trade with id: " + id + " and symbol: " + symbol); +``` + +����**���õ���־������warn**�Ļ���������־������ӡ�����ǻ�ִ���ַ���ƴ�Ӳ���������```symbol```�Ƕ����� +����ִ��```toString()```�������˷���εͳ��Դ��ִ��������������������־ȴû�д�ӡ�����˽���**����־�����жϡ�** + +## 6. ����ֱ��ʹ����־εͳ��Log4j��Logback���е� API������ʹ����־����SLF4J�е�API�� + +SLF4J ������ģʽ����־���ܣ�������ά���͸���������־����ʽͳһ�����ҿ����ڱ�֤���޸Ĵ����������£��ܷ�����ɻ�ֵײ���־���ܵĸ����� + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/9846b8d9ddd2485483e41b7134954f91~tplv-k3u1fbpfcp-zoom-1.image) + +������ +``` +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +private static final Logger logger = LoggerFactory.getLogger(TianLuoBoy.class); +``` + +## 7. ����ʹ�ò���ռλ{}����������+ƴ�ӡ� + +������ +``` +logger.info("Processing trade with id: " + id + " and symbol: " + symbol); +``` + +�����������У�ʹ��```+```�����������ַ�����ƴ�ӣ���һ����**��������**�� + +�������£� +``` +logger.info("Processing trade with id: {} and symbol : {} ", id, symbol); +``` +����ʹ���˴�����```{}```����Ϊ��־�е�ռλ��������ʹ��```+```���������������ż��ࡣ���ң�**�����ڷ���**��ʹ��ռλ�������滻���������Ч�������ܡ� + +## 8. ����ʹ���첽�ķ�ʽ��������־�� + +- ��־���ջ��������ļ����������������еģ�IO���ܻ���Ҫ���ġ������첽���Ϳ�����������IO���ܡ� +- ����������Ҫ����Ҫ��Ȼ����ʹ���첽�ķ�ʽ��������־����logbackΪ���ɣ�Ҫ�����첽�ܼ򵥣�ʹ��AsyncAppender���� +``` + + + +``` + +## 9. ��Ҫʹ��e.printStackTrace() + + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/e2aeaca5e0f44c08ad25fb92e75222dc~tplv-k3u1fbpfcp-zoom-1.image) + + +������ +``` +try{ + // ҵ�����봦�� +}catch(Exception e){ + e.printStackTrace(); +} +``` +������ +``` +try{ + // ҵ�����봦�� +}catch(Exception e){ + log.error("���ij������쳣��",e); +} +``` + +**���ɣ�** + +- e.printStackTrace()��ӡ���Ķ�ջ��־��ҵ��������־�ǽ���������һ���ģ�ͨ���Ų��쳣��־��̫���㡣 +- e.printStackTrace()�����������ַ�����1⁄4���Ƕ�ջ��Ϣ��������Ϣ̫��̫�࣬�ַ��������ڵ��ڴ���û�пռ���,���ڴ����x���ô���û��������Ϳ�ס��~ + +## 10. �쳣��־��Ҫֻ��һ�룬Ҫ����ȫ��������Ϣ + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/420f0da65bac44b5b340a96facfd5c11~tplv-k3u1fbpfcp-zoom-1.image) + +����1�� + +``` +try { + //ҵ�����봦�� +} catch (Exception e) { + // ���� + LOG.error('���ij������쳣��'); +} + +``` +- �쳣e��û�д�ӡ����������ѹ����֪������jô���͵��쳣�� + +����2�� +``` +try { + //ҵ�����봦�� +} catch (Exception e) { + // ���� + LOG.error('���ij������쳣��', e.getMessage()); +} +``` + +- ```e.getMessage()```������1⁄4��ϸ�Ķ�ջ�쳣��Ϣ��ֻ����1⁄4��������������Ϣ���������Ų����⡣ + +������ + +``` +try { + //ҵ�����봦�� +} catch (Exception e) { + // ���� + LOG.error('���ij������쳣��', e); +} +``` + +## 11. ��ֹ�����ϻ������� debug + +��ֹ�����ϻ�������debug����һ���dz���Ҫ�� + + +��Ϊһ��εͳ��debug��־���ܶ࣬���Ҹ��ֿ�����Ҳ����ʹ�� debug����־�����Ͽ���debug���ÿ��ܻ��������̣�Ӱ��ҵ��εͳ���������С� + +## 12.��Ҫ��1⁄4���쳣�����׳��쳣 + + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/671289ecaa4b4eb39dca1139b657f8cd~tplv-k3u1fbpfcp-zoom-1.image) + + +�������£� +``` +log.error("IO exception", e); +throw new MyException(e); +``` + +- ����ɻ�ֵĻ���ͨ������ջ��Ϣ��ӡ���Ρ�������Ϊ������MyException�쳣�ĵط��������ٴ�ӡһ�Ρ� +- ��������־��1⁄4�����߰�װ�����׳�ȥ����Ҫͬɦʹ�ã�����������־�����������˺��Ի��� + + +## 13.�����ظ���ӡ��־ + +�����ظ���ӡ��־�����ϻ��˷Ѵ��̿ռ䡣�������Ѿ���һ����־������������˼��**������������ӡ**���������£� + +``` +if(user.isVip()){ + log.info("���û��ǻ�Ա,Id:{}",user,getUserId()); + //���࣬���Ը�ǰ������־�ς�һ�� + log.info("��ʼ������Ա�߼�,id:{}",user,getUserId()); + //��Ա�߼� +}else{ + //�ǻ�Ա�߼� +} +``` + +��������ʹ��log4j��־���ܣ�������```log4j.xml```������ additivity=false����Ϊ���Ա����ظ���ӡ��־ + +������ +``` + +``` + +## 14.��־�ļ����� + + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/12a2cbe6cf7f4ba981ba7103f9d81858~tplv-k3u1fbpfcp-zoom-1.image) + + +- ���ǿ��԰Ѳ�ͬ���͵���־������ȥ������access.log������error����error.log�������Ե�����ӡ��һ���ļ����档 +- ��Ȼ��Ҳ���Ը��ݲ�ͬ��ҵ��ģ�飬��ӡ����ͬ����־�ļ�����������Ų�������������ͳ�Ƶ�ɦ�򣬶����ȽϷ������� + + +## 15. ���Ĺ���ģ�飬������ӡ����������־ + + +![](https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/c6f26259cda042edb98400145d208d12~tplv-k3u1fbpfcp-zoom-1.image) + + +- �����ճ������У��������Ļ����߼����ӵĴ��룬����������ϸ��ע�ͣ��Լ�����ϸ����־�� +- ��־Ҫ����ϸ�أ��Զ�һ�£��������ĺ��ij�����һ�������x�ͨ����־���Զ�λ�����ǾͿ������� + + + + + + diff --git "a/346円226円271円346円241円210円350円256円276円350円256円241円/README.MD" "b/346円226円271円346円241円210円350円256円276円350円256円241円/README.MD" new file mode 100644 index 0000000..e986b15 --- /dev/null +++ "b/346円226円271円346円241円210円350円256円276円350円256円241円/README.MD" @@ -0,0 +1,9 @@ +- [实现一个刷数任务,需要思考哪些维度?](https://mp.weixin.qq.com/s?__biz=MzkyMzU5Mzk1NQ==&mid=2247508890&idx=1&sn=919b8a794eb4902d958ae13d1f424737&chksm=c1e05e16f697d700ee9f79e087279de6312222b8e45887d976a572b01599f1177b358ade265b&token=337310304&lang=zh_CN#rd) +- [手把手教你写设计方案](https://mp.weixin.qq.com/s?__biz=MzkyMzU5Mzk1NQ==&mid=2247507937&idx=1&sn=33fd37f28675ce756e5d048b99254fcb&chksm=c1e0226df697ab7b4907fb2815c8dd2d195ea04c03a2f8fd0697c9a15a81fc639e5c5f7dab1b&token=337310304&lang=zh_CN#rd) +- [简易版,基于JWT 实现登录认证](https://mp.weixin.qq.com/s?__biz=MzkyMzU5Mzk1NQ==&mid=2247508057&idx=1&sn=06b6fee69c63afbe7ebd2f81a3627341&chksm=c1e05dd5f697d4c32e38bcb58c2ecba8115ea7f94a17bc197bcb7b042a18ef07fef0f0e03878&token=337310304&lang=zh_CN#rd) +- [高并发系统设计的15个建议](https://mp.weixin.qq.com/s?__biz=MzkyMzU5Mzk1NQ==&mid=2247508062&idx=1&sn=71e9647479ea71e8660d6ba48616c122&chksm=c1e05dd2f697d4c45ffd09e07fd40770e3d11591fa2b53161cd38da908cd55e41a38d5192605&token=337310304&lang=zh_CN#rd) +- [面试必备:聊聊分布式锁的多种实现!](https://mp.weixin.qq.com/s?__biz=MzkyMzU5Mzk1NQ==&mid=2247506434&idx=1&sn=c6ae1ec19558626897295bbe41304b62&chksm=c1e0278ef697ae989b14f4746d1049be976d1d5744e4f9c7ec6e17d006f206edcc1c47a3e862&token=337310304&lang=zh_CN#rd) +- [并发环境下,先操作数据库还是先操作缓存?](https://mp.weixin.qq.com/s?__biz=MzkyMzU5Mzk1NQ==&mid=2247508208&idx=1&sn=ac92523e33b478ad83560471338742f4&chksm=c1e05d7cf697d46aba95dc6661a8acbea0c894e44a793d054648b552a73b404aa3344d8a4826&token=337310304&lang=zh_CN#rd) + + + diff --git "a/347円224円237円344円272円247円351円227円256円351円242円230円345円210円206円346円236円220円/README.MD" "b/347円224円237円344円272円247円351円227円256円351円242円230円345円210円206円346円236円220円/README.MD" new file mode 100644 index 0000000..9d21f55 --- /dev/null +++ "b/347円224円237円344円272円247円351円227円256円351円242円230円345円210円206円346円236円220円/README.MD" @@ -0,0 +1,9 @@ +## 生产问题分析 + +- [内存泄漏问题的分析和解决方案](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487986&idx=1&sn=d681a585ac489703788e3baa48eb9aa3&chksm=cf21cedbf85647cd23bbab9dfec63e6877f83c34efb19bd16075d5d90fea91d3f4a20fc77921&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [生产问题分析!delete in子查询不走索引?!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247495170&idx=1&sn=ce914de3abdb0d887e286b680b25111f&chksm=cf22312bf855b83d31a00da110626747df8e69fca1bc310642c56e39d663b006a8105f9fb1e1&token=1495321435&lang=zh_CN&scene=21#wechat_redirect) +- [手把手教你分析Mysql死锁问题](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487979&idx=1&sn=588c83d77a8851f3b3c18cd68ed9c454&chksm=cf21cec2f85647d4a77cc239ae9a4cfd31bb8832be3d98540a08ea8b4a1f46b38cf736210a02&token=1495321435&lang=zh_CN&scene=21#wechat_redirect) +- [线程池运用不当的一次线上事故](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487992&idx=1&sn=733335f2f69d743712915abc99f83b1d&chksm=cf21ced1f85647c7ab8c5d8bc4e8206b04acb5fd4feb94b8d088a782ed458b82aab69dba82aa&token=1990771297&lang=zh_CN#rd) +- [盘点MySQL慢查询的12个原因](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247499624&idx=1&sn=561b9cb7fe831ca7cb2d9fd65691e85e&chksm=cf222041f855a957ac50c0a53baaec6d26be32427259b2974450620f33a8c834419fe535e83d&token=1990771297&lang=zh_CN#rd) +- [线程池如何监控,才能帮助开发者快速定位线上错误?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497444&idx=1&sn=1b2cc8b4685413149e46c814e468c6e6&chksm=cf2229cdf855a0db5f2da881d27c69f11c69480552985baa2a08cbe4d5a48bad7fb31a78dd5a&token=1990771297&lang=zh_CN#rd) +- [数据库死锁排查思路分享](https://mp.weixin.qq.com/s?__biz=MzkyMzU5Mzk1NQ==&mid=2247507770&idx=1&sn=b84b20aca057b34d511a501ff91941b5&chksm=c1e022b6f697aba05248128cb82f93aed341b1cc80e6d568c7150a4ffa6775692c7c9fa423a3&token=337310304&lang=zh_CN#rd) diff --git "a/347円250円213円345円272円217円344円272円272円347円224円237円&351円235円242円350円257円225円345円273円272円350円256円256円/README.MD" "b/347円250円213円345円272円217円344円272円272円347円224円237円&351円235円242円350円257円225円345円273円272円350円256円256円/README.MD" new file mode 100644 index 0000000..ae9424d --- /dev/null +++ "b/347円250円213円345円272円217円344円272円272円347円224円237円&351円235円242円350円257円225円345円273円272円350円256円256円/README.MD" @@ -0,0 +1,6 @@ +## 程序人生 + +- [跟大家聊聊天,我周末都在干啥](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247493222&idx=1&sn=29eb95b01b54bed2abbcf5a72285b38a&chksm=cf22394ff855b059b29ffb562e22d8ecc048caa743eb5c6257ad474676940ba8d36840f075ed&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [跟大家聊聊如何学习](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247495313&idx=1&sn=7f521db08e84b07177d847c60071d709&chksm=cf2231b8f855b8ae765f2dd584994836c0b74ce0ef761653233c3af04f38b4a1aa1833f7a55a&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [写了两年文章,终于破万!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247489788&idx=1&sn=66efbc1b718915bfd8996b521d317a55&chksm=cf21c7d5f8564ec3928957d3c23959f5cb99d9f9bd2c1bab0dcf1750a6a017c3869189a3651a&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [夏天的风,我永远记得~](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247487989&idx=2&sn=9eb923d4c8c22bee1a408e4f86983f65&chksm=cf21cedcf85647cac6fe4bfa6d732856fd0335f4fcadad4d1e0dd10702e95905e06c9e38e8e8&token=162724582&lang=zh_CN&scene=21#wechat_redirect) \ No newline at end of file diff --git "a/347円250円213円345円272円217円345円221円230円345円277円205円345円244円207円345円267円245円345円205円267円347円257円207円/README.MD" "b/347円250円213円345円272円217円345円221円230円345円277円205円345円244円207円345円267円245円345円205円267円347円257円207円/README.MD" new file mode 100644 index 0000000..73e3dce --- /dev/null +++ "b/347円250円213円345円272円217円345円221円230円345円277円205円345円244円207円345円267円245円345円205円267円347円257円207円/README.MD" @@ -0,0 +1,8 @@ + +## 程序员工具篇 + +- [用代码画时序图!YYDS](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247500478&idx=1&sn=ec674e3eadba9bb87849292f46f84989&chksm=cf221d97f8559481fae8f0e1871ae19499568b3e49980e92018c4a5acdcf743a37da79c2436d&token=1990771297&lang=zh_CN#rd) +- [程序员必备基础:Git 命令全方位学习](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488013&idx=1&sn=7011a51a347e3da2cf8f8540b4d9a5d6&chksm=cf21cd24f8564432d74bc13551ebdeae71a71ea31e339c7a8f1f42f181078b5192475d598626&token=1569911403&lang=zh_CN&scene=21#wechat_redirect) +- [MyBatis 插件原理与实战](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498815&idx=1&sn=737e8f92ff526dac408af7a409f3a3d4&chksm=cf222316f855aa007fe16f7bca0636c552f238deb766bb54c34db7b633c13451fc91a4fe8a3e&token=1990771297&lang=zh_CN#rd) +- [更快的Maven来了,速度提升了8倍!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497470&idx=1&sn=7a3a5bb48f7d3b1a627460b698e7e9a0&chksm=cf2229d7f855a0c1e892c23f7690e6ab1a745040142672b982a3934c8307901d0be03dff3cff&token=1990771297&lang=zh_CN#rd) +- [因为知道了30+款在线工具,我的工作效率提升500%!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488041&idx=1&sn=26d55c23ecd439860c4d9865bec61976&chksm=cf21cd00f8564416fe991974d24a51798d925b2e79d62935accf02aa6895c7b02adf48e9e207&token=1990771297&lang=zh_CN#rd) \ No newline at end of file diff --git "a/347円274円223円345円255円230円Redis346円200円273円347円273円223円/README.MD" "b/347円274円223円345円255円230円Redis346円200円273円347円273円223円/README.MD" new file mode 100644 index 0000000..996dc81 --- /dev/null +++ "b/347円274円223円345円255円230円Redis346円200円273円347円273円223円/README.MD" @@ -0,0 +1,7 @@ +## 缓存 + +- [大厂经典面试题:Redis为什么这么快?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490736&idx=1&sn=95377e729b27f0afefbaa5f20239fc9d&chksm=cf21c399f8564a8ff5239fbaa86d616a48086b47b3bb03c8ccc1d3cc066e41c75e16638c3fc8&token=1495321435&lang=zh_CN&scene=21#wechat_redirect) +- [美团二面:Redis与MySQL双写一致性如何保证?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490243&idx=1&sn=ff11c3aab9ada3b16d7f2b57c846d567&chksm=cf21c5eaf8564cfc59e3d0d56fd02b0f5513015005f498381be4d12db462442a49aabe4159ef&token=1495321435&lang=zh_CN&scene=21#wechat_redirect) +- [使用Redis,你必须知道的21个注意要点](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488325&idx=1&sn=6d9bbe5bf2f2f2904755de5c786fb21b&chksm=cf21cc6cf856457a9d23b3e25ec48107a582e709f05964dfdb5ba77e9a239d8307334c485fdf&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [七种方案!探讨Redis分布式锁的正确使用姿势](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247488142&idx=1&sn=79a304efae7a814b6f71bbbc53810c0c&chksm=cf21cda7f85644b11ff80323defb90193bc1780b45c1c6081f00da85d665fd9eb32cc934b5cf&token=162724582&lang=zh_CN&scene=21#wechat_redirect) +- [2W字!详解20道Redis经典面试题!(珍藏版)](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247494124&idx=1&sn=c185f7d999d5f006608d05707a8a7eea&chksm=cf2236c5f855bfd329c6e2ee27f23f8131ebcd312960190a10f1a819d67f07a21a08ad17f263&token=162724582&lang=zh_CN&scene=21#wechat_redirect) \ No newline at end of file diff --git "a/351円253円230円345円271円266円345円217円221円/README.MD" "b/351円253円230円345円271円266円345円217円221円/README.MD" new file mode 100644 index 0000000..0ce39a5 --- /dev/null +++ "b/351円253円230円345円271円266円345円217円221円/README.MD" @@ -0,0 +1,7 @@ +## 高并发 +- [美团二面:Redis与MySQL双写一致性如何保证?](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247490243&idx=1&sn=ff11c3aab9ada3b16d7f2b57c846d567&chksm=cf21c5eaf8564cfc59e3d0d56fd02b0f5513015005f498381be4d12db462442a49aabe4159ef&token=1495321435&lang=zh_CN&scene=21#wechat_redirect) +- [Redis主从、哨兵、 Cluster集群一锅端!](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247498254&idx=1&sn=6489360c3b226df9811e66cb40ec7656&chksm=cf222527f855ac3112628bcec7730064fee3fdbe869fbd0a7410c22766a0c036a7e5c1a69fa0&token=1990771297&lang=zh_CN#rd) +- [面试必备:聊聊MySQL的主从](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497982&idx=1&sn=bb589329cceb5462fc41f66ec63dbf56&chksm=cf2227d7f855aec16dd4d3b3425c0401850eeaf2c9cdc82e82722d38a00c24ee9ccfa3353774&token=1990771297&lang=zh_CN#rd) +- [聊聊幂等设计](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497427&idx=1&sn=2ed160c9917ad989eee1ac60d6122855&chksm=cf2229faf855a0ecf5eb34c7335acdf6420426490ee99fc2b602d54ff4ffcecfdab24eeab0a3&token=1990771297&lang=zh_CN#rd) +- [聊聊接口性能优化的11个小技巧](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247497361&idx=1&sn=a0a2b0f92804921ba3d31b6236f275c2&chksm=cf2229b8f855a0aec650f4e0c3f105aa08e52fabbc54807dd37fefc4873749698b2b1445b59f&token=1990771297&lang=zh_CN#rd) +- [面试必备:秒杀场景九个细节](https://mp.weixin.qq.com/s?__biz=Mzg3NzU5NTIwNg==&mid=2247493227&idx=1&sn=10e5064d7d224c69dce400e90cd44de6&chksm=cf223942f855b0541ada22a312e0d4ffbc99df463678247a0dede3ef16eb81e3344a4a54ceaf&token=1990771297&lang=zh_CN#rd) \ No newline at end of file

AltStyle によって変換されたページ (->オリジナル) /