From 3c51ae2de7da46a69c0568fc9ef12d2c22a5de73 Mon Sep 17 00:00:00 2001 From: Ghost <375808041@qq.com> Date: Wed, 27 Feb 2019 16:22:00 +0800 Subject: [PATCH 01/66] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Java相关/synchronized.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Java相关/synchronized.md b/Java相关/synchronized.md index dfca675f..b0b0700a 100644 --- a/Java相关/synchronized.md +++ b/Java相关/synchronized.md @@ -168,4 +168,4 @@ synchronized 是依赖于 JVM 实现的,前面我们也讲到了 虚拟机团 **④ 性能已不是选择标准** -在JDK1.6之前,synchronized 的性能是比 ReenTrantLock 差很多。具体表示为:synchronized 关键字吞吐量岁线程数的增加,下降得非常严重。而ReenTrantLock 基本保持一个比较稳定的水平。我觉得这也侧面反映了, synchronized 关键字还有非常大的优化余地。后续的技术发展也证明了这一点,我们上面也讲了在 JDK1.6 之后 JVM 团队对 synchronized 关键字做了很多优化。**JDK1.6 之后,synchronized 和 ReenTrantLock 的性能基本是持平了。所以网上那些说因为性能才选择 ReenTrantLock 的文章都是错的!JDK1.6之后,性能已经不是选择synchronized和ReenTrantLock的影响因素了!而且虚拟机在未来的性能改进中会更偏向于原生的synchronized,所以还是提倡在synchronized能满足你的需求的情况下,优先考虑使用synchronized关键字来进行同步!优化后的synchronized和ReenTrantLock一样,在很多地方都是用到了CAS操作**。 +在JDK1.6之前,synchronized 的性能是比 ReenTrantLock 差很多。具体表示为:synchronized 关键字吞吐量随线程数的增加,下降得非常严重。而ReenTrantLock 基本保持一个比较稳定的水平。我觉得这也侧面反映了, synchronized 关键字还有非常大的优化余地。后续的技术发展也证明了这一点,我们上面也讲了在 JDK1.6 之后 JVM 团队对 synchronized 关键字做了很多优化。**JDK1.6 之后,synchronized 和 ReenTrantLock 的性能基本是持平了。所以网上那些说因为性能才选择 ReenTrantLock 的文章都是错的!JDK1.6之后,性能已经不是选择synchronized和ReenTrantLock的影响因素了!而且虚拟机在未来的性能改进中会更偏向于原生的synchronized,所以还是提倡在synchronized能满足你的需求的情况下,优先考虑使用synchronized关键字来进行同步!优化后的synchronized和ReenTrantLock一样,在很多地方都是用到了CAS操作**。 From 26b204371cb6ad7160c91281df6f47a7fa39fb5f Mon Sep 17 00:00:00 2001 From: ZhouLiMing Date: Wed, 27 Feb 2019 18:43:06 +0800 Subject: [PATCH 02/66] =?UTF-8?q?fix=20=20AQS.md->CyclicBarrier=20?= =?UTF-8?q?=E7=9A=84=E4=BD=BF=E7=94=A8=E7=A4=BA=E4=BE=8Bdemo=E7=A8=8B?= =?UTF-8?q?=E5=BA=8F=E7=A4=BA=E4=BE=8B=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Java相关/Multithread/AQS.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Java相关/Multithread/AQS.md b/Java相关/Multithread/AQS.md index 487669e5..3717be6c 100644 --- a/Java相关/Multithread/AQS.md +++ b/Java相关/Multithread/AQS.md @@ -336,7 +336,8 @@ public class CyclicBarrierExample2 { public static void test(int threadnum) throws InterruptedException, BrokenBarrierException { System.out.println("threadnum:" + threadnum + "is ready"); try { - cyclicBarrier.await(2000, TimeUnit.MILLISECONDS); + /**等待60秒,保证子线程完全执行结束*/ + cyclicBarrier.await(60, TimeUnit.SECONDS); } catch (Exception e) { System.out.println("-----CyclicBarrierException------"); } From c3623c2e0fe14658ad7083c9001ba447603a93c1 Mon Sep 17 00:00:00 2001 From: IceDarron Date: Thu, 28 Feb 2019 00:09:38 +0800 Subject: [PATCH 03/66] =?UTF-8?q?Update=20=E5=B9=B6=E5=8F=91=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **ConcurrentLinkedQueue:** 修改为 **ConcurrentLinkedQueue**: --- Java相关/Multithread/并发容器总结.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Java相关/Multithread/并发容器总结.md b/Java相关/Multithread/并发容器总结.md index 70164c13..90a436c3 100644 --- a/Java相关/Multithread/并发容器总结.md +++ b/Java相关/Multithread/并发容器总结.md @@ -27,7 +27,7 @@ JDK提供的这些容器大部分在 `java.util.concurrent` 包中。 - **ConcurrentHashMap:** 线程安全的HashMap - **CopyOnWriteArrayList:** 线程安全的List,在读多写少的场合性能非常好,远远好于Vector. -- **ConcurrentLinkedQueue:**高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList,这是一个非阻塞队列。 +- **ConcurrentLinkedQueue**:高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList,这是一个非阻塞队列。 - **BlockingQueue:** 这是一个接口,JDK内部通过链表、数组等方式实现了这个接口。表示阻塞队列,非常适合用于作为数据共享的通道。 - **ConcurrentSkipListMap:** 跳表的实现。这是一个Map,使用跳表的数据结构进行快速查找。 From 62828f054caed7b198851d2fbb3ece06d9c7ee00 Mon Sep 17 00:00:00 2001 From: IceDarron Date: Thu, 28 Feb 2019 00:11:58 +0800 Subject: [PATCH 04/66] =?UTF-8?q?Update=20=E5=B9=B6=E5=8F=91=E5=AE=B9?= =?UTF-8?q?=E5=99=A8=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改****符号位置 --- Java相关/Multithread/并发容器总结.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Java相关/Multithread/并发容器总结.md b/Java相关/Multithread/并发容器总结.md index 90a436c3..96a9fe23 100644 --- a/Java相关/Multithread/并发容器总结.md +++ b/Java相关/Multithread/并发容器总结.md @@ -25,9 +25,9 @@ JDK提供的这些容器大部分在 `java.util.concurrent` 包中。 -- **ConcurrentHashMap:** 线程安全的HashMap +- **ConcurrentHashMap:** 线程安全的HashMap - **CopyOnWriteArrayList:** 线程安全的List,在读多写少的场合性能非常好,远远好于Vector. -- **ConcurrentLinkedQueue**:高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList,这是一个非阻塞队列。 +- **ConcurrentLinkedQueue:** 高效的并发队列,使用链表实现。可以看做一个线程安全的 LinkedList,这是一个非阻塞队列。 - **BlockingQueue:** 这是一个接口,JDK内部通过链表、数组等方式实现了这个接口。表示阻塞队列,非常适合用于作为数据共享的通道。 - **ConcurrentSkipListMap:** 跳表的实现。这是一个Map,使用跳表的数据结构进行快速查找。 From 6197be81cf353fdb2fd6152a37c5cc8e59e3ff81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E3=80=90=E5=BC=A0=E9=91=AB=E3=80=91?= <974567732@qq.com> Date: Sat, 2 Mar 2019 21:47:14 +0800 Subject: [PATCH 05/66] =?UTF-8?q?=E6=9C=80=E9=95=BF=E5=85=AC=E5=85=B1?= =?UTF-8?q?=E5=89=8D=E7=BC=80=E9=A2=98=E7=9B=AE=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=BC=82=E5=B8=B8=E8=BE=93=E5=85=A5=E6=A3=80=E6=9F=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1、检查元素是否含有null 2、检查是否String数组是否为0 --- ...——几道常见的子符串算法题.md | 75 ++++++++++++------- 1 file changed, 47 insertions(+), 28 deletions(-) diff --git a/数据结构与算法/搞定BAT面试——几道常见的子符串算法题.md b/数据结构与算法/搞定BAT面试——几道常见的子符串算法题.md index b7b1c314..938f4a48 100644 --- a/数据结构与算法/搞定BAT面试——几道常见的子符串算法题.md +++ b/数据结构与算法/搞定BAT面试——几道常见的子符串算法题.md @@ -108,38 +108,57 @@ public class Solution { 思路很简单!先利用Arrays.sort(strs)为数组排序,再将数组第一个元素和最后一个元素的字符从前往后对比即可! ```java -//https://leetcode-cn.com/problems/longest-common-prefix/description/ public class Main { - public static String replaceSpace(String[] strs) { + public static String replaceSpace(String[] strs) { - // 数组长度 - int len = strs.length; - // 用于保存结果 - StringBuffer res = new StringBuffer(); - // 注意:=是赋值,==是判断 - if (strs == null || strs.length == 0) { - return ""; - } - // 给字符串数组的元素按照升序排序(包含数字的话,数字会排在前面) - Arrays.sort(strs); - int m = strs[0].length(); - int n = strs[len - 1].length(); - int num = Math.min(m, n); - for (int i = 0; i < num; i++) { - if (strs[0].charAt(i) == strs[len - 1].charAt(i)) { - res.append(strs[0].charAt(i)); - } else - break; + // 如果检查值不合法及就返回空串 + if (!chechStrs(strs)) { + return ""; + } + // 数组长度 + int len = strs.length; + // 用于保存结果 + StringBuilder res = new StringBuilder(); + // 给字符串数组的元素按照升序排序(包含数字的话,数字会排在前面) + Arrays.sort(strs); + int m = strs[0].length(); + int n = strs[len - 1].length(); + int num = Math.min(m, n); + for (int i = 0; i < num; i++) { + if (strs[0].charAt(i) == strs[len - 1].charAt(i)) { + res.append(strs[0].charAt(i)); + } else + break; - } - return res.toString(); + } + return res.toString(); - } - //测试 - public static void main(String[] args) { - String[] strs = { "customer", "car", "cat" }; - System.out.println(Main.replaceSpace(strs));//c - } + } + + private static boolean chechStrs(String[] strs) { + boolean flag = false; + // 注意:=是赋值,==是判断 + if (strs != null) { + // 遍历strs检查元素值 + for (int i = 0; i < strs.length; i++) { + if (strs[i] != null && strs[i].length() != 0) { + flag = true; + } else { + flag = false; + } + } + } + return flag; + } + + // 测试 + public static void main(String[] args) { + String[] strs = { "customer", "car", "cat" }; + // String[] strs = { "customer", "car", null };//空串 + // String[] strs = {};//空串 + // String[] strs = null;//空串 + System.out.println(Main.replaceSpace(strs));// c + } } ``` From f56c73b23af59baa7ef28b2eeed5b7ca175347b9 Mon Sep 17 00:00:00 2001 From: Silverados <295843706@qq.com> Date: Mon, 4 Mar 2019 00:38:43 +0800 Subject: [PATCH 06/66] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=A0=BC=E5=BC=8F?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Java相关/这几道Java集合框架面试题几乎必问.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Java相关/这几道Java集合框架面试题几乎必问.md b/Java相关/这几道Java集合框架面试题几乎必问.md index 18587f42..18d276c4 100644 --- a/Java相关/这几道Java集合框架面试题几乎必问.md +++ b/Java相关/这几道Java集合框架面试题几乎必问.md @@ -32,7 +32,7 @@ - **3. 插入和删除是否受元素位置的影响:** ① **ArrayList 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。** 比如:执行`add(E e) `方法的时候, ArrayList 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是O(1)。但是如果要在指定位置 i 插入和删除元素的话(`add(int index, E element) `)时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。 ② **LinkedList 采用链表存储,所以插入,删除元素时间复杂度不受元素位置的影响,都是近似 O(1)而数组为近似 O(n)。** - **4. 是否支持快速随机访问:** LinkedList 不支持高效的随机元素访问,而 ArrayList 支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于`get(int index) `方法)。 - **5. 内存空间占用:** ArrayList的空 间浪费主要体现在在list列表的结尾会预留一定的容量空间,而LinkedList的空间花费则体现在它的每一个元素都需要消耗比ArrayList更多的空间(因为要存放直接后继和直接前驱以及数据)。 --**6.补充内容:RandomAccess接口** +- **6.补充内容:RandomAccess接口** ```java public interface RandomAccess { From 89b0adba149ac7ea4d552b6fd429adcf0e194e72 Mon Sep 17 00:00:00 2001 From: Stage <1196089730@qq.com> Date: Mon, 4 Mar 2019 09:51:57 +0800 Subject: [PATCH 07/66] =?UTF-8?q?=E6=9B=B4=E6=AD=A3=E6=8B=BC=E5=86=99?= =?UTF-8?q?=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在Servlet生命周期处,destroy拼写错误。 --- Java相关/J2EE基础知识.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Java相关/J2EE基础知识.md b/Java相关/J2EE基础知识.md index 00e67f7d..ced017ab 100644 --- a/Java相关/J2EE基础知识.md +++ b/Java相关/J2EE基础知识.md @@ -61,7 +61,7 @@ Servlet接口定义了5个方法,其中**前三个方法与Servlet生命周期 - java.lang.String getServletInfo() - ServletConfig getServletConfig() -**生命周期:** **Web容器加载Servlet并将其实例化后,Servlet生命周期开始**,容器运行其**init()方法**进行Servlet的初始化;请求到达时调用Servlet的**service()方法**,service()方法会根据需要调用与请求对应的**doGet或doPost**等方法;当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的**destroy()方法**。**init方法和destory方法只会执行一次,service方法客户端每次请求Servlet都会执行**。Servlet中有时会用到一些需要初始化与销毁的资源,因此可以把初始化资源的代码放入init方法中,销毁资源的代码放入destroy方法中,这样就不需要每次处理客户端的请求都要初始化与销毁资源。 +**生命周期:** **Web容器加载Servlet并将其实例化后,Servlet生命周期开始**,容器运行其**init()方法**进行Servlet的初始化;请求到达时调用Servlet的**service()方法**,service()方法会根据需要调用与请求对应的**doGet或doPost**等方法;当服务器关闭或项目被卸载时服务器会将Servlet实例销毁,此时会调用Servlet的**destroy()方法**。**init方法和destroy方法只会执行一次,service方法客户端每次请求Servlet都会执行**。Servlet中有时会用到一些需要初始化与销毁的资源,因此可以把初始化资源的代码放入init方法中,销毁资源的代码放入destroy方法中,这样就不需要每次处理客户端的请求都要初始化与销毁资源。 参考:《javaweb整合开发王者归来》P81 From c7693078b8e2bf9fbde20621e1df8ac360d2388c Mon Sep 17 00:00:00 2001 From: Charles Wu Date: Mon, 4 Mar 2019 10:05:51 +0800 Subject: [PATCH 08/66] fix typo --- ...能是把Java内存区域讲的最清楚的一篇文章.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md b/Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md index 4f38f3a1..5235ba73 100644 --- a/Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md +++ b/Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md @@ -235,7 +235,7 @@ JDK1.4中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**通 **验证:** ```java - String s1 = new String("abc");// 堆内存的地值值 + String s1 = new String("abc");// 堆内存的地址值 String s2 = "abc"; System.out.println(s1 == s2);// 输出false,因为一个是堆内存,一个是常量池的内存,故两者是不同的。 System.out.println(s1.equals(s2));// 输出true From 06c726d78cfc86176c49659d72e0c3ab40063ad6 Mon Sep 17 00:00:00 2001 From: tangtao Date: Mon, 4 Mar 2019 10:06:22 +0800 Subject: [PATCH 09/66] =?UTF-8?q?FIX:=20=E4=BF=AE=E5=A4=8D=E9=94=99?= =?UTF-8?q?=E8=AF=AF=E6=8F=8F=E8=BF=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../常见安全算法(MD5、SHA1、Base64等等)总结.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/数据结构与算法/常见安全算法(MD5、SHA1、Base64等等)总结.md b/数据结构与算法/常见安全算法(MD5、SHA1、Base64等等)总结.md index 79a03d39..8dddb1b9 100644 --- a/数据结构与算法/常见安全算法(MD5、SHA1、Base64等等)总结.md +++ b/数据结构与算法/常见安全算法(MD5、SHA1、Base64等等)总结.md @@ -499,7 +499,7 @@ public class DesDemo { - **这种算法是在DES算法的基础上发展出来的,类似于三重DES。** - **发展IDEA也是因为感到DES具有密钥太短等缺点。** -- **DEA的密钥为128位,这么长的密钥在今后若干年内应该是安全的。** +- **IDEA的密钥为128位,这么长的密钥在今后若干年内应该是安全的。** - **在实际项目中用到的很少了解即可。** #### 代码实现: From 1f949675acdfbbb2040e0d82cd965e0ba5d6123b Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Mon, 4 Mar 2019 22:21:26 +0800 Subject: [PATCH 10/66] Update README.md --- README.md | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 3affa224..e141d04b 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,15 @@ # Java 学习/面试指南 -**一些Java工程师常用学习资源[公众号](#公众号)后台回复关键字“1”即可免费无套路获取。** - -**【限时福利】** 极客时间[《Java 并发编程面试必备》](#Java并发编程专栏)专栏限时特惠,购买之后的小伙伴加 [我的微信](#联系我) 报上自己的极客时间大名可以找我会把24元返现退给大家,减轻各位学习成本。 - - 为了优化大家的阅读体验,我重新进行了排版,并且增加了较为详细的[目录](#目录)供大家参考!对本仓库提过有价值的 issue 或 pr 的小伙伴将出现在 [Contributor](#Contributor) 这里。另外, 由于我个人能力有限,很多知识点我可能没有涉及到,所以你可以对其他知识点进行补充。**对于不错的原创文章我根据你的选择给予现金奖励、付费专栏或者书籍进行奖励!所以,快提 pr 或者邮件的方式(邮件地址在主页)给我投稿吧!** 当然,我觉得奖励是次要的,最重要的是你可以从自己整理知识点的过程中学习到很多知识。

-微信交流群添加 [我的微信](#我的微信) 后回复关键字“加群”即可入群。 +1. **加群:** 微信交流群添加 [我的微信](#联系我) 后回复关键字“加群”即可入群。 +2. **Java工程师必备学习资源:** 一些Java工程师常用学习资源[公众号](#公众号)后台回复关键字 **“1”** 即可免费无套路获取。 +3. **《Java面试突击》:** 由本文档衍生的专为面试而生的《Java面试突击》V2.0 PDF 版本公众号后台回复 **"Java面试突击"** 即可免费领取! +4. **【限时福利】** 极客时间[《Java 并发编程面试必备》](#Java并发编程专栏)专栏限时特惠,购买之后的小伙伴加 [我的微信](#联系我) 报上自己的极客时间大名可以找我会把24元返现退给大家,减轻各位学习成本。
From 539e685566f80c486e864336c8e2da44dab13970 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Mon, 4 Mar 2019 22:23:14 +0800 Subject: [PATCH 11/66] Update README.md --- README.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index e141d04b..880ba8bd 100644 --- a/README.md +++ b/README.md @@ -1,17 +1,18 @@ # Java 学习/面试指南 -为了优化大家的阅读体验,我重新进行了排版,并且增加了较为详细的[目录](#目录)供大家参考!对本仓库提过有价值的 issue 或 pr 的小伙伴将出现在 [Contributor](#Contributor) 这里。另外, 由于我个人能力有限,很多知识点我可能没有涉及到,所以你可以对其他知识点进行补充。**对于不错的原创文章我根据你的选择给予现金奖励、付费专栏或者书籍进行奖励!所以,快提 pr 或者邮件的方式(邮件地址在主页)给我投稿吧!** 当然,我觉得奖励是次要的,最重要的是你可以从自己整理知识点的过程中学习到很多知识。 -

+
+ +## 阅读之前必看 1. **加群:** 微信交流群添加 [我的微信](#联系我) 后回复关键字“加群”即可入群。 2. **Java工程师必备学习资源:** 一些Java工程师常用学习资源[公众号](#公众号)后台回复关键字 **“1”** 即可免费无套路获取。 3. **《Java面试突击》:** 由本文档衍生的专为面试而生的《Java面试突击》V2.0 PDF 版本公众号后台回复 **"Java面试突击"** 即可免费领取! 4. **【限时福利】** 极客时间[《Java 并发编程面试必备》](#Java并发编程专栏)专栏限时特惠,购买之后的小伙伴加 [我的微信](#联系我) 报上自己的极客时间大名可以找我会把24元返现退给大家,减轻各位学习成本。 - +为了优化大家的阅读体验,我重新进行了排版,并且增加了较为详细的[目录](#目录)供大家参考!对本仓库提过有价值的 issue 或 pr 的小伙伴将出现在 [Contributor](#Contributor) 这里。另外, 由于我个人能力有限,很多知识点我可能没有涉及到,所以你可以对其他知识点进行补充。**对于不错的原创文章我根据你的选择给予现金奖励、付费专栏或者书籍进行奖励!所以,快提 pr 或者邮件的方式(邮件地址在主页)给我投稿吧!** 当然,我觉得奖励是次要的,最重要的是你可以从自己整理知识点的过程中学习到很多知识。 ## 目录 From 4540f90f2b4112dcbf00150bb4a165424ee50aa5 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Tue, 5 Mar 2019 11:09:34 +0800 Subject: [PATCH 12/66] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 880ba8bd..4db9e0f3 100644 --- a/README.md +++ b/README.md @@ -9,7 +9,7 @@ 1. **加群:** 微信交流群添加 [我的微信](#联系我) 后回复关键字“加群”即可入群。 2. **Java工程师必备学习资源:** 一些Java工程师常用学习资源[公众号](#公众号)后台回复关键字 **“1”** 即可免费无套路获取。 -3. **《Java面试突击》:** 由本文档衍生的专为面试而生的《Java面试突击》V2.0 PDF 版本公众号后台回复 **"Java面试突击"** 即可免费领取! +3. **《Java面试突击》:** 由本文档衍生的专为面试而生的《Java面试突击》V2.0 PDF 版本[公众号](#公众号)后台回复 **"Java面试突击"** 即可免费领取! 4. **【限时福利】** 极客时间[《Java 并发编程面试必备》](#Java并发编程专栏)专栏限时特惠,购买之后的小伙伴加 [我的微信](#联系我) 报上自己的极客时间大名可以找我会把24元返现退给大家,减轻各位学习成本。 为了优化大家的阅读体验,我重新进行了排版,并且增加了较为详细的[目录](#目录)供大家参考!对本仓库提过有价值的 issue 或 pr 的小伙伴将出现在 [Contributor](#Contributor) 这里。另外, 由于我个人能力有限,很多知识点我可能没有涉及到,所以你可以对其他知识点进行补充。**对于不错的原创文章我根据你的选择给予现金奖励、付费专栏或者书籍进行奖励!所以,快提 pr 或者邮件的方式(邮件地址在主页)给我投稿吧!** 当然,我觉得奖励是次要的,最重要的是你可以从自己整理知识点的过程中学习到很多知识。 From aa8387b32d6fc880d20b9a4899f6cefd3e039451 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Tue, 5 Mar 2019 11:09:57 +0800 Subject: [PATCH 13/66] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4db9e0f3..b4c42d09 100644 --- a/README.md +++ b/README.md @@ -261,6 +261,6 @@ ### 公众号 -如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。我是 ThoughtWorks 准入职Java工程师。专注Java知识分享!开源 Java 学习指南——JavaGuide(12k+ Star)的作者。公众号多篇文章被各大技术社区转载。公众号后台回复关键字“1”可以领取一份我精选的Java资源哦!可以扫描下方二维码或者通过微信的搜一搜搜索ID:“Java_Guide”即可。 +如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。 ![我的公众号](https://user-gold-cdn.xitu.io/2018/11/28/167598cd2e17b8ec?w=258&h=258&f=jpeg&s=27334) From 57b4d8552cba0ce23ddcbc5d50ba071dc09882b9 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:22:42 +0800 Subject: [PATCH 14/66] Delete 2018 summary.md --- 其他/2018 summary.md | 174 ----------------------------------------- 1 file changed, 174 deletions(-) delete mode 100644 其他/2018 summary.md diff --git a/其他/2018 summary.md b/其他/2018 summary.md deleted file mode 100644 index 8d82e40b..00000000 --- a/其他/2018 summary.md +++ /dev/null @@ -1,174 +0,0 @@ -# 【2018总结】即使平凡,也要热爱自己的生活 - -2018 年于我而讲,虽然平凡,但是自己就是在这平凡的一年也收货了很多东西。不光是自己学到的知识,我觉得 2018 年最大的幸运有三:其一是自己拥有了一份爱情,一份甜蜜的初恋,我真的很幸运遇到我现在的女朋友,愿以后的日子都能有她;其一是在 2018 年,我拥有了一份自己还算满意的 offer,马上就要毕业了,自己也要正式进去社会了;其一是自己在 2018 年的实现了自己的经济独立,这是一件让我很高兴的事情,我觉得大在学生时代实现经济独立还算是一件很不错的事情,花了这么多年父母的辛苦钱,自己也终于能替他们分担一点了。2018 年,感恩父母,感恩老师,感恩朋友,感恩遇到的每个善良的人,同时感恩2018年那个还算努力的自己。2019 继续加油! - -## 一份甜蜜的初恋(分手) - -先说说爱情。我和我的女朋友在一起已经半年多了,准确的来说截止到今天也就是 2018-12-30 号已经 190 天了。 - -![我和傻欢](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-30/54482393.jpg) - -我俩是异地,我在荆州,她在三亚。相见一面不管是时间上还是经济上对于还是学生的我们来说都甚是不易。见过很多人议论异地恋的种种不好,但是,于我而言,一份好的感情是值得被等待的。“待每一天如初恋,互相尊重彼此生活,共同努力,等老了就退隐山林养老......”,这应该是我和她之间最好的承诺了。 - -## 还算不错的学习收获 - -再来说说学习。这一年还算是让人满意,虽然我也不知道这一年自己到底学到了什么。如果你要问我这一年在学习上做的最满意的事情是什么,我还真不好回答,下面就从下面几个维度来简单谈一谈。 - -### 开源 - -这一年自己在Github上还是挺活跃的,提交了很多的代码和文档,同时也收获了很多的star、follower、pr、issue以及fork。 - -![我的Github概览](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-30/41250517.jpg) - -![我的Github贡献概览](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-30/33580466.jpg) - -开源的Java学习/面试指南—JavaGuide 某种程度上让我挺满意的,3月份开源 ,到现在的18k+ star 也算是可以用厚积薄发来形容了。但是,JavaGuide 也有很多让我不满意的,在2019年以及以后我也会继续完善。JavaGuide 地址:[https://github.com/Snailclimb/JavaGuide](https://github.com/Snailclimb/JavaGuide) - -![JavaGuide 概览](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-24/1352784.jpg) - -### 技术博客 - -我更新的博客主要都是关于Java方面的,也更新了几篇Python的,有一篇Python的文章竟然在我的CSDN上面阅读霸榜。 -![霸榜的 Python 文章](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-30/19527688.jpg) - -在这一年,我更新了挺多技术文章,这里就不一一列举了,我贴一下自己觉得不错的文章吧! - -#### 最常见面试题系列 - -- [最最最常见的Java面试题总结——第一周](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484252&idx=1&sn=cb160d67fc1c0a95babc464b703df5e7&chksm=fd98553dcaefdc2b18f934957dd950aeaf04e90136099fa2817fffbd1e1df452b581e1caee17&token=1398134989&lang=zh_CN#rd) -- [最最最常见的Java面试题总结——第二周](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484282&idx=1&sn=7f986dc3263b6ca0f9e182145fdd40a1&chksm=fd98551bcaefdc0d5aff9577692881dc79765a339ce97e55958e23e1956aa7092dfac44b68f1&token=1398134989&lang=zh_CN#rd) -- [这几道Java集合框架面试题在面试中几乎必问](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484308&idx=1&sn=e3607919aed604be629617f867f46844&chksm=fd9855f5caefdce3f1ee72cb33b9b3bf9899fa2b64bbb92f1e820c0ef3985245b1f7dfc05358&token=1398134989&lang=zh_CN#rd) -- [如果不会这几道多线程基础题,请自觉面壁!](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484337&idx=1&sn=d5e953d4b2da7ed37a7f843bfb437ed8&chksm=fd9855d0caefdcc65cb2e5cc0c69d27f785fc41477bcf55fff2cdff3268b0b078eb1a5107726&token=1398134989&lang=zh_CN#rd) -- [值得立马保存的 synchronized 关键字总结](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484355&idx=1&sn=6da29974b6dd1a4aa0d032f44d5fa8de&chksm=fd9855a2caefdcb4c370814baafd4baca27dfccaf609c9edf82370637ba4856176ab143a375e&token=1398134989&lang=zh_CN#rd) -- [【面试必备】源码角度一步一步分析 ArrayList 扩容机制](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484400&idx=1&sn=1b6155015fedfc9f78fabecc18da7b18&chksm=fd985591caefdc870cb018d27f92e1908b6c6e22816a77ead03c4e44b2f53caec00871172b1f&token=1398134989&lang=zh_CN#rd) -- [Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484539&idx=1&sn=3500cdcd5188bdc253fb19a1bfa805e6&chksm=fd98521acaefdb0c5167247a1fa903a1a53bb4e050b558da574f894f9feda5378ec9d0fa1ac7&token=1398134989&lang=zh_CN#rd) - -#### Github - -- [近几个月Github上最热门的Java项目一览](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484188&idx=1&sn=40037de4844f62316465bbe4e910c69c&chksm=fd98557dcaefdc6bedcaeb275aae7c340d46cf6ab0dc96e49c51982f9c53d6a44de283efc9a8&token=1398134989&lang=zh_CN#rd) -- [推荐10个Java方向最热门的开源项目(8月)](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484333&idx=1&sn=8c97b029692877a537d55175a8c82977&chksm=fd9855cccaefdcdaffe0558ba5e8dca415495935b0ad1181e6b148b08e1c86ce5d841e9df901&token=1398134989&lang=zh_CN#rd) -- [Github上 Star 数相加超过 7w+ 的三个面试相关的仓库推荐](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484644&idx=1&sn=5016caaf97e498b76de2189e3f55e9dc&chksm=fd985285caefdb93f4e3c7545d30edac6ad31b99f1fcc4503350101f0b20bba9a9705ed7d124&token=1398134989&lang=zh_CN#rd) -- [11月 Github Trending 榜最热门的 10 个 Java 项目](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484730&idx=1&sn=86e35dfea1478221b6d14a263e88ac89&chksm=fd98535bcaefda4d4f03bf0cd2e0a8fd9f44b1a2b118457a0c8b3de2ff8a1f4c4b7cd083f40e&token=1398134989&lang=zh_CN#rd) -- [盘点一下Github上开源的Java面试/学习相关的仓库,看完弄懂薪资至少增加10k](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484817&idx=1&sn=12f0c254a240c40c2ccab8314653216b&chksm=fd9853f0caefdae6d191e6bf085d44ab9c73f165e3323aa0362d830e420ccbfad93aa5901021&token=1398134989&lang=zh_CN#rd) - - -#### 备战面试系列 - -- [可能是一份最适合你的后端面试指南(部分内容前端同样适用)](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484529&idx=1&sn=9c7a3d6ad124affcadc19b0ff49bf68a&chksm=fd985210caefdb0615a9643fa698cb6267e89562730423841d942cde17ec9c1280dfc3a2b933&token=1398134989&lang=zh_CN#rd) -- [【备战春招/秋招系列1】程序员的简历就该这样写](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484573&idx=1&sn=8c5965d4a3710d405d8e8cc10c7b0ce5&chksm=fd9852fccaefdbea8dfe0bc40188b7579f1cddb1e8905dc981669a3f21d2a04cadceafa9023f&token=1990180468&lang=zh_CN#rd) -- [【备战春招/秋招系列2】初出茅庐的程序员该如何准备面试?](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484578&idx=1&sn=eea72d80a2325257f00aaed21d5b226f&chksm=fd9852c3caefdbd52dd8a537cc723ed1509314401b3a669a253ef5bc0360b6fddef48b9c2e94&token=1990180468&lang=zh_CN#rd) -- [【备战春招/秋招系列3】Java程序员必备书单](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484592&idx=1&sn=6d9731ce7401be49e97c1af6ed384ecc&chksm=fd9852d1caefdbc720a361ae65a8ad9d53cfb4800b15a7c68cbdc630b313215c6c52e0934ec2&token=1990180468&lang=zh_CN#rd) -- [【备战春招/秋招系列】美团面经总结基础篇 (附详解答案)](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484601&idx=1&sn=4907b7fef0856791c565d49d788ba8cc&chksm=fd9852d8caefdbce88e51c0a10a4ec77c97f382fd2af4a840ea47cffc828bfd0f993f50d5f0d&token=1895808268&lang=zh_CN#rd) -- [【备战春招/秋招系列】美团面经总结进阶篇 (附详解答案)](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484625&idx=1&sn=9c4fa1f7d4291a5fbd7daa44bac2b012&chksm=fd9852b0caefdba6edcf9a827aa4a17ddc97bf6ad2e5ee6f7e1aa1b443b54444d05d2b76732b&token=1895808268&lang=zh_CN#rd) -- [【备战春招/秋招系列】美团Java面经总结终结篇 (附详解答案)](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484668&idx=1&sn=9d4631588393075d9c453f307410f0cd&chksm=fd98529dcaefdb8b5497d1f161834af6917c33ea3d305eb41872e522707fa94218769ca60101&token=1398134989&lang=zh_CN#rd) -- [GitHub 上四万 Star 大佬的求职回忆](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484739&idx=1&sn=25cf5b36090f69299150663bdccfeec2&chksm=fd985322caefda34df0734efa607114704d1937f083aee2230b797d1f5aa04f7d13bf2f81dc5&token=1398134989&lang=zh_CN#rd)(非原创) - - -#### 并发编程面试必备 - -- [并发编程面试必备:synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比](http://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484539&idx=1&sn=3500cdcd5188bdc253fb19a1bfa805e6&chksm=fd98521acaefdb0c5167247a1fa903a1a53bb4e050b558da574f894f9feda5378ec9d0fa1ac7&scene=21#wechat_redirect) -- [并发编程面试必备:JUC 中的 Atomic 原子类总结](http://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484553&idx=1&sn=aca9fa19f723206eff7e33a10973a887&chksm=fd9852e8caefdbfe7180c34f83bbb422a1a0bef1ed44b1e84f56924244ea3fd2da720f25c6dd#rd) -- [并发编程面试必备:AQS 原理以及 AQS 同步组件总结](http://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484559&idx=1&sn=28dae85c38c4c500201c39234d25d731&chksm=fd9852eecaefdbf80cc54a25204e7c7d81170ce659acf92b7fa4151799ca3d0d7df2225d4ff1#rd) -- [并发编程面试必备:BATJ都爱问的多线程面试题](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484564&idx=1&sn=d8467fdc5c1b3883e9b99485f7b0fb9a&chksm=fd9852f5caefdbe364d1c438865cff84acd8f40c1c9e2f9f5c8fef673b30f905b4c5f5255368&token=1398134989&lang=zh_CN#rd) - -#### 虚拟机 - -- [可能是把Java内存区域讲的最清楚的一篇文章](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484303&idx=1&sn=af0fd436cef755463f59ee4dd0720cbd&chksm=fd9855eecaefdcf8d94ac581cfda4e16c8a730bda60c3b50bc55c124b92f23b6217f7f8e58d5&token=1398134989&lang=zh_CN#rd) -- [搞定 JVM 垃圾回收就是这么简单](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484328&idx=1&sn=214f5e18a6afa096eb552fd8627e0cea&chksm=fd9855c9caefdcdf70c746c74d31f65bbb109eedaea0cfe311a1e10af666047df59ff04c873b&token=1398134989&lang=zh_CN#rd) - -#### Spring Boot - -- [超详细,新手都能看懂 !使用SpringBoot+Dubbo 搭建一个简单的分布式服务](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484706&idx=1&sn=d413fc17023482f67ca17cb6756b9ff8&chksm=fd985343caefda555969568fdf4734536e0a1745f9de337d434a7dbd04e893bd2d75f3641aab&token=1398134989&lang=zh_CN#rd) -- [基于 SpringBoot2.0+优雅整合 SpringBoot+Mybatis](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484730&idx=2&sn=9be4636dd9a416b46f9029df68fad232&chksm=fd98535bcaefda4dccf14a286a24fcd2b3d4ab0d0e4d89dfbc955df99d2b06a1e17392b3c10b&token=1398134989&lang=zh_CN#rd) -- [新手也能实现,基于SpirngBoot2.0+ 的 SpringBoot+Mybatis 多数据源配置](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484737&idx=1&sn=e39693d845f022d689437ee58948ef6a&chksm=fd985320caefda36d5ab8abd52f5516c11cc5d1104608695bcea5909602b28dc40c132d6d46c&token=1398134989&lang=zh_CN#rd) -- [SpringBoot 整合 阿里云OSS 存储服务,快来免费搭建一个自己的图床](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484745&idx=1&sn=dbeec694916d204605929244d48a6b1c&chksm=fd985328caefda3e793170d81433c7c0b7dc1c4a4ae99395cce23b1d1a239482fd5bf1d89bc6&token=1398134989&lang=zh_CN#rd) - -#### 成长 - -- [结束了我短暂的秋招,说点自己的感受](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484516&idx=1&sn=4e2320613e76dd73a130c63beebbc3ca&chksm=fd985205caefdb13b4b611ed3c604d95314d28d567ec0c3b44585b89a7dc3142bcd52bc2d4cb&token=1398134989&lang=zh_CN#rd) -- [保研之路:从双非到南大](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484477&idx=1&sn=3b597e2431611aacca2b5d671a309d85&chksm=fd98525ccaefdb4a7e3742b5958244d453efe26f61f42f9f108190a0c18313f083189f10944e&token=1398134989&lang=zh_CN#rd)(非原创) -- [【周日闲谈】最近想说的几件小事](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484650&idx=1&sn=e97ea1eeebdb5def58bae1949bec9448&chksm=fd98528bcaefdb9d76ac62fd10544f058b1fee4a40ffd06ab9312b7eb3a62f86d67ea653b88a&token=1398134989&lang=zh_CN#rd) -- [这7个问题,可能大部分Java程序员都比较关心吧!](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484836&idx=1&sn=a6ada99c9506af01dc3bb472f66c57be&chksm=fd9853c5caefdad3034dbed00cf04412ea990fc05b6168720e6828ae6c90c9a885793acd7a14&token=1398134989&lang=zh_CN#rd) - -#### Docker - -- [可能是把Docker的概念讲的最清楚的一篇文章](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484127&idx=1&sn=70ee95619ec761da884c4f9af3e83194&chksm=fd9854becaefdda81a02bf6cf9bd07a2fc879efa7cefc79691a0d319b501d8572e8bad981d87&token=1398134989&lang=zh_CN#rd) - -#### Linux - -- [后端程序员必备的Linux基础知识](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484157&idx=1&sn=8b47e623e83fb3666bce7c680e4649b8&chksm=fd98549ccaefdd8ad815f3d8eaca86cc7e7245b4f8de1d23897af3017f5fdb3f152734c40f5e&token=1398134989&lang=zh_CN#rd) -- [快速入门大厂后端面试必备的 Shell 编程](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484696&idx=1&sn=d3c1ba5abc10c10ff844cae2109a2628&chksm=fd985379caefda6faff8e050b7dfa1e92fbfe2912e44150cb4ae349aea807836166355062970&token=1398134989&lang=zh_CN#rd) - -#### ZooKeeper - -- [可能是全网把 ZooKeeper 概念讲的最清楚的一篇文章](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484379&idx=1&sn=036f5d3defa8a6979afb77acc82a9517&chksm=fd9855bacaefdcacc1462f781b634e5599f2ee9e806bd24297dae4af0e4196a70ca6bbd8c354&token=1398134989&lang=zh_CN#rd) - -#### Redis - -- [redis 总结——重构版](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484450&idx=1&sn=7ee03fa67aecd05c5becd2a8259d3631&chksm=fd985243caefdb554ebab9149e750ac0c819074c57bd208f2d7f097fbc461ed58223e71c05f1&token=1398134989&lang=zh_CN#rd) -- [史上最全Redis高可用技术解决方案大全](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484478&idx=1&sn=a1250d9b8025cd7cb6fc6a58238ab51e&chksm=fd98525fcaefdb499a027df0138c98d4b02d828f27bd6144a4d40a1c088d340c29dd53d4a026&token=1398134989&lang=zh_CN#rd)(非原创) - -#### 计算机网络 - -- [搞定计算机网络面试,看这篇就够了(补充版)](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484289&idx=1&sn=6b556843c60aac9a17b0e7c2e3cd6bca&chksm=fd9855e0caefdcf6af4123b719448c81d90c5442d4052ae01a4698047e226c0c18c14b2cc54a&token=1398134989&lang=zh_CN#rd) - -#### 数据库 - -- [【思维导图-索引篇】搞定数据库索引就是这么简单](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484486&idx=1&sn=215450f11e042bca8a58eac9f4a97686&chksm=fd985227caefdb3117b8375f150676f5824aa20d1ebfdbcfb93ff06e23e26efbafae6cf6b48e&token=1398134989&lang=zh_CN#rd) - -#### 消息队列 - -- [新手也能看懂,消息队列其实很简单](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484789&idx=1&sn=ba972f0aac39e9a28b29ddf92fc15c18&chksm=fd985314caefda0278235427d43846b6374ff32f4149352dec063287cbf9733b888acbb79923&token=1398134989&lang=zh_CN#rd) -- [一文搞懂 RabbitMQ 的重要概念以及安装](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484796&idx=1&sn=bc56fecb634732669cfe7db8d1820ded&chksm=fd98531dcaefda0b07b8a9c13429ef225d36a6e287c96c53d7aa3dfd65c62ccd60d13b22ebbf&token=1398134989&lang=zh_CN#rd) - -### 读书 - -推荐一下 2018 年看过的书籍,小部分可能2017年也看过一些。 - -#### 已看完 - -- [《图解HTTP》](https://book.douban.com/subject/25863515/)(推荐,豆瓣评分 8.1 , 1.6K+人评价): 讲漫画一样的讲HTTP,很有意思,不会觉得枯燥,大概也涵盖也HTTP常见的知识点。因为篇幅问题,内容可能不太全面。不过,如果不是专门做网络方向研究的小伙伴想研究HTTP相关知识的话,读这本书的话应该来说就差不多了。 -- [《大话数据结构》](https://book.douban.com/subject/6424904/)(推荐,豆瓣评分 7.9 , 1K+人评价):入门类型的书籍,读起来比较浅显易懂,适合没有数据结构基础或者说数据结构没学好的小伙伴用来入门数据结构。 -- [《算法图解》](https://book.douban.com/subject/26979890/)(推荐,豆瓣评分 8.4,0.6K+人评价):入门类型的书籍,读起来比较浅显易懂,适合没有算法基础或者说算法没学好的小伙伴用来入门。示例丰富,图文并茂,以让人容易理解的方式阐释了算法.读起来比较快,内容不枯燥! -- [《Java并发编程的艺术》](https://book.douban.com/subject/26591326/)(推荐,豆瓣评分 7.2,0.2K+人评价): 这本书不是很适合作为Java并发入门书籍,需要具备一定的JVM基础。我感觉有些东西讲的还是挺深入的,推荐阅读。 -- [《实战Java高并发程序设计》](https://book.douban.com/subject/26663605/)(推荐):豆瓣评分 8.3 ,书的质量没的说,推荐大家好好看一下。 -- [《深入理解Java虚拟机(第2版)周志明》](https://book.douban.com/subject/24722612/)(推荐,豆瓣评分 8.9,1.0K+人评价):建议多刷几遍,书中的所有知识点可以通过JAVA运行时区域和JAVA的内存模型与线程两个大模块罗列完全。 -- [《Netty实战》](https://book.douban.com/subject/27038538/)(推荐,豆瓣评分 7.8,92人评价):内容很细,如果想学Netty的话,推荐阅读这本书! -- [《从Paxos到Zookeeper》](https://book.douban.com/subject/26292004/)(推荐,豆瓣评分 7.8,0.3K人评价):简要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了Paxos和ZAB协议。同时,本书深入介绍了分布式一致性问题的工业解决方案——ZooKeeper,并着重向读者展示这一分布式协调框架的使用方法、内部实现及运维技巧,旨在帮助读者全面了解ZooKeeper,并更好地使用和运维ZooKeeper。 -- [《Redis实战》](https://book.douban.com/subject/26612779/):如果你想了解Redis的一些概念性知识的话,这本书真的非常不错。 -- [《Redis设计与实现》](https://book.douban.com/subject/25900156/)(推荐,豆瓣评分 8.5,0.5K+人评价) -- [《大型网站技术架构:核心原理与案例分析+李智慧》](https://book.douban.com/subject/25723064/)(推荐):这本书我读过,基本不需要你有什么基础啊~读起来特别轻松,但是却可以学到很多东西,非常推荐了。另外我写过这本书的思维导图,关注我的微信公众号:“Java面试通关手册”回复“大型网站技术架构”即可领取思维导图。 - - -#### 未看完 - - -- [《鸟哥的Linux私房菜》](https://book.douban.com/subject/4889838/)(推荐,,豆瓣评分 9.1,0.3K+人评价):本书是最具知名度的Linux入门书《鸟哥的Linux私房菜基础学习篇》的最新版,全面而详细地介绍了Linux操作系统。全书分为5个部分:第一部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linux的文件系统、文件、目录与磁盘的管理;第三部分介绍文字模式接口 shell和管理系统的好帮手shell脚本,另外还介绍了文字编辑器vi和vim的使用方法;第四部分介绍了对于系统安全非常重要的Linux账号的管理,以及主机系统与程序的管理,如查看进程、任务分配和作业管理;第五部分介绍了系统管理员(root)的管理事项,如了解系统运行状况、系统服务,针对登录文件进行解析,对系统进行备份以及核心的管理等。 -- [《亿级流量网站架构核心技术》](https://book.douban.com/subject/26999243/)(推荐):一书总结并梳理了亿级流量网站高可用和高并发原则,通过实例详细介绍了如何落地这些原则。本书分为四部分:概述、高可用原则、高并发原则、案例实战。从负载均衡、限流、降级、隔离、超时与重试、回滚机制、压测与预案、缓存、池化、异步化、扩容、队列等多方面详细介绍了亿级流量网站的架构核心技术,让读者看后能快速运用到实践项目中。 -- [《重构_改善既有代码的设计》](https://book.douban.com/subject/4262627/)(推荐):豆瓣 9.1 分,重构书籍的开山鼻祖。 -- [《深入剖析Tomcat》](https://book.douban.com/subject/10426640/)(推荐,豆瓣评分 8.4,0.2K+人评价):本书深入剖析Tomcat 4和Tomcat 5中的每个组件,并揭示其内部工作原理。通过学习本书,你将可以自行开发Tomcat组件,或者扩展已有的组件。 读完这本书,基本可以摆脱背诵面试题的尴尬。 -- [《高性能MySQL》](https://book.douban.com/subject/23008813/)(推荐,豆瓣评分 9.3,0.4K+人评价):mysql 领域的经典之作,拥有广泛的影响力。不但适合数据库管理员(dba)阅读,也适合开发人员参考学习。不管是数据库新手还是专家,相信都能从本书有所收获。 -- [深入理解Nginx(第2版)](https://book.douban.com/subject/26745255/):作者讲的非常细致,注释都写的都很工整,对于 Nginx 的开发人员非常有帮助。优点是细致,缺点是过于细致,到处都是代码片段,缺少一些抽象。 -- [《RabbitMQ实战指南》](https://book.douban.com/subject/27591386/):《RabbitMQ实战指南》从消息中间件的概念和RabbitMQ的历史切入,主要阐述RabbitMQ的安装、使用、配置、管理、运维、原理、扩展等方面的细节。如果你想浅尝RabbitMQ的使用,这本书是你最好的选择;如果你想深入RabbitMQ的原理,这本书也是你最好的选择;总之,如果你想玩转RabbitMQ,这本书一定是最值得看的书之一 -- [《Spring Cloud微服务实战》](https://book.douban.com/subject/27025912/):从时下流行的微服务架构概念出发,详细介绍了Spring Cloud针对微服务架构中几大核心要素的解决方案和基础组件。对于各个组件的介绍,《Spring Cloud微服务实战》主要以示例与源码结合的方式来帮助读者更好地理解这些组件的使用方法以及运行原理。同时,在介绍的过程中,还包含了作者在实践中所遇到的一些问题和解决思路,可供读者在实践中作为参考。 -- [《第一本Docker书》](https://book.douban.com/subject/26780404/):Docker入门书籍! -- [《Effective java 》](https://book.douban.com/subject/3360807/)(推荐,豆瓣评分 9.0,1.4K+人评价):本书介绍了在Java编程中78条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。通过对Java平台设计专家所使用的技术的全面描述,揭示了应该做什么,不应该做什么才能产生清晰、健壮和高效的代码。本书中的每条规则都以简短、独立的小文章形式出现,并通过例子代码加以进一步说明。本书内容全面,结构清晰,讲解详细。可作为技术人员的参考用书。 -- [《算法 第四版》](https://book.douban.com/subject/10432347/)(推荐,豆瓣评分 9.3,0.4K+人评价):Java语言描述,算法领域经典的参考书,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行了论述。书的内容非常多,可以说是Java程序员的必备书籍之一了。 - -## 一些个人愚见 - -### 关于读书 - -不知道大家收藏栏是不是和我一样收藏了很多文章,但是有多少篇是你真真认真看的呢?或者那几篇你认真看之后,经过一个月之后还记得这篇文章的大概内容。现在这个社会真是一个信息爆炸的社会,我个人真的深有感触,就在刚刚我还取消关注了好多微信公众号,很多公众号给我推的文章都有好几十篇了,但是我一篇都没有看,所以索性取消关注,省个位置。我个人觉得遇到好的文章,我们不光要读,而且要记录下来。就拿我本人来说,我平时喜欢用 OneNote 来记录学习笔记以及其他我感觉重要的事情比如重要人的生日啦这些。每当遇到自己喜欢的文章的时候,我都先会把文章的地址保存到我分好类的笔记本上,我会先进行第一遍阅读,第一遍我会读的很仔细,如果晦涩难懂的话我会先快速把总体看一遍,然后在细细品读。一般第二遍的时候我就会在笔记本上记录这篇文章的一些要点,以便我日后看到这些要点可以快速回忆起整篇文章的内容。如果某篇文章的知识点太过庞大的话,我会去选择采用思维导图的方式展示要点。看视频一样,看教学视频的话,如果觉得老师讲的不错,我们不妨记录下来,Onenote 或者有道云笔记都行,记录大概,够我们日后回忆就好。 - -### 关于学习 - -做事不要有功利性,我最早在掘金写文章,其实也只是为了记录自己的学习,没想到会有人喜欢自己的文章,另外我课外学的很多东西,我自己也不清楚以后工作会不会用到,反正我自己感觉即然自己感兴趣,那么就去学吧。我相信,很多东西可能暂时带给你不了带多实质性的帮助,但是总有一天它会对你有帮助。如果感到迷茫的话,就做好眼前的事(拿我们班主任的话说,如果你感到迷茫,你就学好现在的专业知识就好了),我觉得没毛病。 - -### 关于个人 - -在生活中一定要保持谦虚,保持谦虚,保持谦虚,时刻都要有反省的准备,你要记住学无止境,永远不要满足现在的现状。另外,就是一定要掌控好自己的时间,多留点时间给父母亲人,以及那些自己在乎的人。如果对别人很在乎的话,不要去装作不在乎,因为这样真的不是太好,虽然我之前也会这样,很多时候撰写的消息,最后没发出去。 - -## 最后分享一句话 - -分享给大家,我笔记本里一直保存的杨绛老先生的一句话:“我们曾如此渴望命运的波澜,到最后才发现:人生最曼妙的风景,竟是内心的淡定与从容……我们曾如此期盼外界的认可,到最后才知道:世界是自己的,与他人毫无关系!”。 From 5d72b7a9afa275943c6f8d627f1e6ae9a80f356f Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:22:45 +0800 Subject: [PATCH 15/66] =?UTF-8?q?Delete=202018=20=E7=A7=8B=E6=8B=9B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 其他/2018 秋招.md | 93 ------------------------------------------- 1 file changed, 93 deletions(-) delete mode 100644 其他/2018 秋招.md diff --git a/其他/2018 秋招.md b/其他/2018 秋招.md deleted file mode 100644 index a2b47de8..00000000 --- a/其他/2018 秋招.md +++ /dev/null @@ -1,93 +0,0 @@ - - -# 秋招历程流水账总结 - -笔主大四准毕业生,在秋招末流比较幸运地进入了一家自己非常喜欢一家公司——ThoughtWorks. - -![今天去签约在门外拍的照片](https://images.gitbook.cn/1433af10-d5f7-11e8-841a-4f0b0cc7be7b) - -从9-6号投递出去第一份简历,到10-18号左右拿到第一份 offer ,中间差不多有 1 个半月的时间了。可能自己比较随缘,而且自己所在的大学所处的位置并不是互联网比较发达的城市的原因。所以,很少会有公司愿意跑到我们学校那边来宣讲,来的公司也大多是一些自己没听过或者不太喜欢的公司。所以,在前期,我仅仅能够通过网上投递简历的方式来找工作。 - -零零总总算了一下,自己在网上投了大概有 10 份左右的简历,都是些自己还算喜欢的公司。简单说一下自己投递的一些公司:网上投递的公司有:ThoughtWorks、网易、小米、携程、爱奇艺、知乎、小红书、搜狐、欢聚时代、京东;直接邮箱投递的有:烽火、中电数据、蚂蚁金服花呗部门、今日头条;线下宣讲会投递的有:玄武科技。 - -网上投递的大部分简历都是在做完笔试之后就没有了下文了,即使有几场笔试自我感觉做的很不错的情况下,还是没有收到后续的面试邀请。还有些邮箱投递的简历,后面也都没了回应。所以,我总共也只参加了3个公司的面试,ThoughtWorks、玄武科技和中电数据,都算是拿到了 offer。拿到 ThoughtWorks 的 offer之后,后面的一些笔试和少部分面试都拒了。决定去 ThoughtWorks 了,春招的大部队会没有我的存在。 - - -我个人对 ThoughtWorks 最有好感,ThoughtWorks 也是我自己之前很想去的一家公司。不光是因为我投递简历的时候可以不用重新填一遍表格可以直接发送我已经编辑好的PDF格式简历的友好,这个公司的文化也让我很喜欢。每次投递一家公司几乎都要重新填写一遍简历真的很让人头疼,即使是用牛客网的简历助手也还是有很多东西需要自己重新填写。 - -说句实话,自己在拿到第一份 offer 之前心里还是比较空的,虽然说对自己还是比较自信。包括自己当时来到武汉的原因,也是因为自己没有 offer ,就感觉心里空空的,我相信很多人在这个时候与我也有一样的感觉。然后,我就想到武汉参加一下别的学校宣讲会。现在看来,这个决定也是不必要的,因为我最后去的公司 ThoughtWorks,虽然就在我租的房子的附近,但之前投递的时候,选择的还是远程面试。来到武汉,简单的修整了一下之后,我就去参加了玄武科技在武理工的宣讲会,顺便做了笔试,然后接着就是技术面、HR面、高管面。总体来说,玄武科技的 HR 真的很热情,为他们点个赞,虽然自己最后没能去玄武科技,然后就是技术面非常简单,HR面和高管面也都还好,不会有压抑的感觉,总体聊得很愉快。需要注意的是 玄武科技和很多公司一样都有笔试中有逻辑题,我之前没有做过类似的题,所以当时第一次做有点懵逼。高管面的时候,高管还专门在我做的逻辑题上聊了一会,让我重新做了一些做错的题,并且给他讲一些题的思路,可以看出高层对于应聘者的这项能力还是比较看重的。 - - - -中电数据的技术面试是电话进行的,花了1个多小时一点,个人感觉问的还是比较深的,感觉自己总体回答的还是比较不错的。 - -这里我着重说一下 ThoughtWorks,也算是给想去 ThoughtWorks 的同学一点小小的提示。我是 9.11 号在官网:https://join.thoughtworks.cn/ 投递的简历,9.20 日邮件通知官网下载作业,作业总体来说不难,9.21 号花了半天多的时间做完,然后就直接在9.21 号下午提交了。然后等了挺长时间的,可能是因为 ThoughtWorks 在管理方面比较扁平化的原因,所以总体来说效率可能不算高。因为我选的是远程面试,所以直接下载好 zoom 之后,等HR打电话过来告诉你一个房间号,你就可以直接进去面试就好,一般技术面试有几个人看着你。技术面试的内容,首先就是在面试官让你在你之前做的作业的基础上新增加一个或者两个功能(20分钟)。所以,你在技术面试之前一定要保证你的程序的扩展性是不错的,另外就是你在技术面试之前最好能重构一下自己写的程序。重构本身就是你自己对你写的程序的理解加强很好的一种方式,另外重构也能让你发现你的程序的一些小问题。然后,这一步完成之后,面试官可能会问你一些基础问题,比较简单,所以我觉得 ThoughtWorks 可能更看重你的代码质量。ThoughtWorks 的 HR 面和其他公司的唯一不同可能在于,他会让你用英语介绍一下自己或者说自己的技术栈啊这些。 - -![思特沃克可爱的招聘官网](https://images.gitbook.cn/83f765e0-d5f6-11e8-9c1a-919e09988420) - - -# 关于面试一些重要的问题总结 -另外,再给大家总结一些我个人想到一些关于面试非常重要的一些问题。 - -### 面试前 - -**如何准备** - - -运筹帷幄之后,决胜千里之外!不打毫无准备的仗,我觉得大家可以先从下面几个方面来准备面试: - -1. 自我介绍。(你可千万这样介绍:“我叫某某,性别,来自哪里,学校是那个,自己爱干什么”,记住:多说点简历上没有的,多说点自己哪里比别人强!) -2. 自己面试中可能涉及哪些知识点、那些知识点是重点。 -3. 面试中哪些问题会被经常问到、面试中自己改如何回答。(强烈不推荐背题,第一:通过背这种方式你能记住多少?能记住多久?第二:背题的方式的学习很难坚持下去!) -4. 自己的简历该如何写。 - - - -另外,如果你想去类似阿里巴巴、腾讯这种比较大的互联网公司的话,一定要尽早做打算。像阿里巴巴在7月份左右就开始了提前批招聘,到了9月份差不多就已经招聘完毕了。所以,秋招没有参加到阿里的面试还是很遗憾的,毕竟面试即使失败了,也能从阿里难度Max的面试中学到很多东西。 - -**关于着装** - -穿西装、打领带、小皮鞋?NO!NO!NO!这是互联网公司面试又不是去走红毯,所以你只需要穿的简单大方就好,不需要太正式。 - -**关于自我介绍** - -如果你简历上写的基本信息就不要说了,比如性别、年龄、学校。另外,你也不要一上来就说自己爱好什么这方面内容。因为,面试官根本不关心这些东西。你直接挑和你岗位相关的重要经历和自己最突出的特点讲就好了。 - - - -**提前准备** - -面试之前可以在网上找找有没有你要面试的公司的面经。在我面试 ThoughtWorks 的前几天我就在网上找了一些关于 ThoughtWorks 的技术面的一些文章。然后知道了 ThoughtWorks 的技术面会让我们在之前做的作业的基础上增加一个或两个功能,所以我提前一天就把我之前做的程序重新重构了一下。然后在技术面的时候,简单的改了几行代码之后写个测试就完事了。如果没有提前准备,我觉得 20 分钟我很大几率会完不成这项任务。 - - -### 面试中 - -面试的时候一定要自信,千万不要怕自己哪里会答不出来,或者说某个问题自己忘记怎么回答了。面试过程中,很多问题可能是你之前没有碰到过的,这个时候你就要通过自己构建的知识体系来思考这些问题。如果某些问题你回答不上来,你也可以让面试官给你简单的提示一下。总之,你要自信,你自信的前提是自己要做好充分的准备。下面给大家总结一些面试非常常见的问题: - -- SpringMVC 工作原理 -- 说一下自己对 IOC 、AOP 的理解 -- Spring 中用到了那些设计模式,讲一下自己对于这些设计模式的理解 -- Spring Bean 的作用域和生命周期了解吗 -- Spring 事务中的隔离级别 -- Spring 事务中的事务传播行为 -- 手写一个 LRU 算法 -- 知道那些排序算法,简单介绍一下快排的原理,能不能手写一下快排 -- String 为什么是不可变的?String为啥要设计为不可变的? -- Arraylist 与 LinkedList 异同 -- HashMap的底层实现 -- HashMap 的长度为什么是2的幂次方 -- ConcurrentHashMap 和 Hashtable 的区别 -- ConcurrentHashMap线程安全的具体实现方式/底层具体实现 -- 如果你的简历写了redis 、dubbo、zookeeper、docker的话,面试官还会问一下这些东西。比如redis可能会问你:为什么要用 redis、为什么要用 redis 而不用 map/guava 做缓存、redis 常见数据结构以及使用场景分析、 redis 设置过期时间、redis 内存淘汰机制、 redis 持久化机制、 缓存雪崩和缓存穿透问题、如何解决 Redis 的并发竞争 Key 问题、如何保证缓存与数据库双写时的数据一致性。 -- 一些简单的 Linux 命令。 -- 为什么要用 消息队列 -- 关于 Java多线程,在面试的时候,问的比较多的就是①悲观锁和乐观锁②synchronized 和 ReenTrantLock 区别以及 volatile 和 synchronized 的区别,③可重入锁与非可重入锁的区别、④多线程是解决什么问题的、⑤线程池解决什么问题,为什么要用线程池 ⑥Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 ReenTrantLock 对比;⑦线程池使用时的注意事项、⑧AQS 原理以及 AQS 同步组件:Semaphore、CountDownLatCh、 CyclicBarrier、ReadWriteLock、⑨ReentranLock源码,设计原理,整体过程 等等问题。 -- 关于 Java 虚拟机问的比较多的是:①Java内存区域、②虚拟机垃圾算法、③虚拟机垃圾收集器、④JVM内存管理、⑤JVM调优这些问题。 - - -### 面试后 - -如果失败,不要灰心;如果通过,切勿狂喜。面试和工作实际上是两回事,可能很多面试未通过的人,工作能力比你强的多,反之亦然。我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油! - - - From 512a31911ce8f55d61692df6dc7ef38ddda81b8a Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:22:48 +0800 Subject: [PATCH 16/66] =?UTF-8?q?Delete=20=E9=80=89=E6=8B=A9=E6=8A=80?= =?UTF-8?q?=E6=9C=AF=E6=96=B9=E5=90=91=E9=83=BD=E8=A6=81=E8=80=83=E8=99=91?= =?UTF-8?q?=E5=93=AA=E4=BA=9B=E5=9B=A0=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...择技术方向都要考虑哪些因素.md | 63 ------------------- 1 file changed, 63 deletions(-) delete mode 100644 其他/选择技术方向都要考虑哪些因素.md diff --git a/其他/选择技术方向都要考虑哪些因素.md b/其他/选择技术方向都要考虑哪些因素.md deleted file mode 100644 index fa39c7c1..00000000 --- a/其他/选择技术方向都要考虑哪些因素.md +++ /dev/null @@ -1,63 +0,0 @@ -本文主要是作者读安晓辉老师的《程序员程序员职场进阶 32 讲 》中关于“选择技术方向都要考虑哪些因素”这部分做的一些笔记和自己的思考。在这里分享给各位! - -### 选择一种技术可能会考虑到的决定因素 - -1. 就业机会 - - 选择一门就业面广的技术还是比较重要的。我的很多学PHP的同学现在都在培训班学Java,真的!!! -2. 难易程度 - - 我当时是在C/C++语言与Java中选择了Java,因为我感觉Java学起来确实要比C++简单一些。 -3. 个人兴趣 - - 兴趣是你能坚持下来的一个很重要的条件。 -4. 薪资水平 - - 薪资虽然不是人的唯一追求,但是一定是必备的追求。 -5. 发展前景 - - 你肯定不愿意看到这种情况发生:选择了一门技术,结果一年后它就没人用、没市场了。所以我们在选择时就要考虑这一点,做一些预判。 - - 选择技术时存在两种考虑:一种是选择稳定的、经典的技术;一种是卡位将来的市场缺口,选择将来可能需要用到的技术。 -6. 他人推荐 - - 我们在懵懵懂懂的时候,往往最容易听从别人的推荐,然后选择某种技术。 -7. 相近原则 - - 当我们已经掌握了一些技术,要学习新技术时,就可以根据一种新技术是否和自己已经掌握的技术比较接近来判断选择。相近的技术,学起来会更容易上手。 -8. 互补原则 - - 和相近性类似,互补性也常用在拓展我们技术能力的情景下。它指的是,有一些技术可以和你已经掌握的技术互相补充,组合在一起,形成更完整、更系统的技术图谱,给你带来更大的竞争力。关于相近原则与互补原则,我们也会在后面的文章里具体解读。 -9. 团队技术图谱 - - 我觉得这个可能就是团队开发过程中的需要。比如在做一个项目的时候,这个项目需要你去学习一下某个你没有接触过的新技术。 - -### 入行时如何选择技术方向 - - 为了明确自己的求职目标,可以问问自己下面的问题: -- 我想在哪个城市工作? -- 我想在哪些行业、领域发展? -- 我想去什么样的公司? -- 我想做什么样的产品? - -另外你要知道的是热门技术会有更多机会,相应竞争压力也会更大,并不能保证你找到合适的工作。 -冷门技术,机会相对较少,而且机会相对确定 。 - -### 构建技能树时如何选择技术方向 - -当我们过了专项能力提升的初级阶段之后,就应该开始构建自己的技能体系了。在为搭建技能树而选择技术时,通常考虑下面两个原则: -- 相近原则 -- 互补原则 - -“学习技术时一定要学对自己以后发展有用的技术”是我经常对自己强调的,另外我觉得很误导人同时也很错误的一个思想是:“只要是技术学了就会有用的”,这句话在我刚学编程时经常听到有人对我说。希望大家不要被误导,很多技术过时了就是过时了,没有必要再去花时间学。 - -我觉得相近原则和互补原则互补原则就是你主精和自己技术方向相同的的东西或者对自己技术领域有提升的东西。比如我目前暂时选择了Java为我的主要发展语言,所以我就要求自己大部分时间还是搞和Java相关的东西比如:Spring、SpingBoot、Dubbo、Mybatis等等。但是千万不要被语言所束缚,在业余时间我学的比较多的就是Python以及JS、C/C++/C#也会偶尔接触。因为我经常会接触前端另外我自己偶尔有爬虫需求或者需要用Python的一些第三库解决一些问题,所以我业余学Pyton以及JS就比较多一点,我觉得这两门技术也是对我现有技术的一个补充了。 - - -### 技术转型时的方向选择 - -我觉得对于技术转型主要有一下几点建议 - -- 与自己当前技术栈跨度不太大的领域,比如你做安卓的话转型可以选择做Java后端。 -- 真正适合自己去做的,并不是一味看着这个领域火了(比如人工智能),然后自己就不考虑实际的去转型到这个领域里去。 -- 技术转型方向尽量对自己以后的发展需要有帮助。 From 9faef98c4b8d55a96e0502dacbdfe3ac34a52aaa Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:22:51 +0800 Subject: [PATCH 17/66] =?UTF-8?q?Delete=20=E4=B8=AA=E4=BA=BA=E9=98=85?= =?UTF-8?q?=E8=AF=BB=E4=B9=A6=E7=B1=8D=E6=B8=85=E5=8D=95.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 其他/个人阅读书籍清单.md | 89 ------------------------------ 1 file changed, 89 deletions(-) delete mode 100644 其他/个人阅读书籍清单.md diff --git a/其他/个人阅读书籍清单.md b/其他/个人阅读书籍清单.md deleted file mode 100644 index f14ee33a..00000000 --- a/其他/个人阅读书籍清单.md +++ /dev/null @@ -1,89 +0,0 @@ -下面是个人阅读书籍的部分清单,我比较建议阅读的书籍前都加上了:thumbsup: 表情。 -> ### 核心基础知识 - -- :thumbsup: [《图解HTTP》](https://book.douban.com/subject/25863515/) - - 讲漫画一样的讲HTTP,很有意思,不会觉得枯燥,大概也涵盖也HTTP常见的知识点。因为篇幅问题,内容可能不太全面。不过,如果不是专门做网络方向研究的小伙伴想研究HTTP相关知识的话,读这本书的话应该来说就差不多了。 - -> ### Java相关 - -- :thumbsup: [《Head First Java.第二版》](https://book.douban.com/subject/2000732/) - - 可以说是我的Java启蒙书籍了,特别适合新手读当然也适合我们用来温故Java知识点。 - -- [《Java多线程编程核心技术》](https://book.douban.com/subject/26555197/) - - Java多线程入门级书籍还不错,但是说实话,质量不是很高,很快就可以阅读完。 - -- [《JAVA网络编程 第4版》](https://book.douban.com/subject/26259017/) - - 可以系统的学习一下网络的一些概念以及网络编程在Java中的使用。 - -- :thumbsup: [《Java核心技术卷1+卷2》](https://book.douban.com/subject/25762168/) - - 很棒的两本书,建议有点Java基础之后再读,介绍的还是比较深入的,非常推荐。这两本书我一般也会用来巩固知识点,是两本适合放在自己身边的好书。 - -- :thumbsup: [《Java编程思想(第4版)》](https://book.douban.com/subject/2130190/) - - 这本书要常读,初学者可以快速概览,中等程序员可以深入看看java,老鸟还可以用之回顾java的体系。这本书之所以厉害,因为它在无形中整合了设计模式,这本书之所以难读,也恰恰在于他对设计模式的整合是无形的。 - -- :thumbsup: [《Java并发编程的艺术》](https://book.douban.com/subject/26591326/) - - 这本书不是很适合作为Java并发入门书籍,需要具备一定的JVM基础。我感觉有些东西讲的还是挺深入的,推荐阅读。 -- :thumbsup: [《实战Java高并发程序设计》](https://book.douban.com/subject/26663605/) - - 豆瓣评分 8.3 ,书的质量没的说,推荐大家好好看一下。 - -- [《Java程序员修炼之道》](https://book.douban.com/subject/24841235/) - - 很杂,我只看了前面几章,不太推荐阅读。 - -- :thumbsup: [《深入理解Java虚拟机(第2版)周志明》](https://book.douban.com/subject/24722612/) - - 神书!神书!神书!建议多刷几遍,书中的所有知识点可以通过JAVA运行时区域和JAVA的内存模型与线程两个大模块罗列完全。 - -> ### JavaWeb相关 - -- :thumbsup: [《深入分析Java Web技术内幕》](https://book.douban.com/subject/25953851/) - - 感觉还行,涉及的东西也蛮多,推荐阅读。 - -- :thumbsup: [《Spring实战(第4版)》](https://book.douban.com/subject/26767354/) - - 不建议当做入门书籍读,入门的话可以找点国人的书或者视频看。这本定位就相当于是关于Spring的新华字典,只有一些基本概念的介绍和示例,涵盖了Spring的各个方面,但都不够深入。就像作者在最后一页写的那样:“学习Spring,这才刚刚开始”。 - -- [《Java Web整合开发王者归来》](https://book.douban.com/subject/4189495/) - - 当时刚开始学的时候就是开的这本书,基本上是完完整整的看完了。不过,我不是很推荐大家看。这本书比较老了,里面很多东西都已经算是过时了。不过,这本书的一个很大优点是:基础知识点概括全面。 - -- :thumbsup: [《Redis实战》](https://book.douban.com/subject/26612779/) - - 如果你想了解Redis的一些概念性知识的话,这本书真的非常不错。 - -> ### 架构相关 - -- :thumbsup: [《大型网站技术架构:核心原理与案例分析+李智慧》](https://book.douban.com/subject/25723064/) - - 这本书我读过,基本不需要你有什么基础啊~读起来特别轻松,但是却可以学到很多东西,非常推荐了。另外我写过这本书的思维导图,关注我的微信公众号:“Java面试通关手册”回复“大型网站技术架构”即可领取思维导图。 - -- [《架构解密从分布式到微服务(Leaderus著)》](https://book.douban.com/subject/27081188/) - - 很一般的书籍,我就是当做课后图书来阅读的。 - -> ### 代码优化 - -- :thumbsup: [《重构_改善既有代码的设计》](https://book.douban.com/subject/4262627/) - - 豆瓣 9.1 分,重构书籍的开山鼻祖。 -> ### linux操作系统相关 -- :thumbsup:[<>](https://book.douban.com/subject/25900403/) :thumbsup: [<>](https://book.douban.com/subject/1500149/) - - 对于理解linux操作系统原理非常有用,同时可以打好个人的基本功力,面试中很多公司也会问到linux知识。 -> ### 课外书籍 - -《技术奇点》 :thumbsup:《追风筝的人》 :thumbsup:《穆斯林的葬礼》 :thumbsup:《三体》 《人工智能——李开复》 -:thumbsup:《活着——余华》 - - - - From a06e6d58abec88eb6b90d8edeb70e391611962ed Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:22:54 +0800 Subject: [PATCH 18/66] Create 2018 summary.md --- 闲谈/2018 summary.md | 174 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 174 insertions(+) create mode 100644 闲谈/2018 summary.md diff --git a/闲谈/2018 summary.md b/闲谈/2018 summary.md new file mode 100644 index 00000000..8d82e40b --- /dev/null +++ b/闲谈/2018 summary.md @@ -0,0 +1,174 @@ +# 【2018总结】即使平凡,也要热爱自己的生活 + +2018 年于我而讲,虽然平凡,但是自己就是在这平凡的一年也收货了很多东西。不光是自己学到的知识,我觉得 2018 年最大的幸运有三:其一是自己拥有了一份爱情,一份甜蜜的初恋,我真的很幸运遇到我现在的女朋友,愿以后的日子都能有她;其一是在 2018 年,我拥有了一份自己还算满意的 offer,马上就要毕业了,自己也要正式进去社会了;其一是自己在 2018 年的实现了自己的经济独立,这是一件让我很高兴的事情,我觉得大在学生时代实现经济独立还算是一件很不错的事情,花了这么多年父母的辛苦钱,自己也终于能替他们分担一点了。2018 年,感恩父母,感恩老师,感恩朋友,感恩遇到的每个善良的人,同时感恩2018年那个还算努力的自己。2019 继续加油! + +## 一份甜蜜的初恋(分手) + +先说说爱情。我和我的女朋友在一起已经半年多了,准确的来说截止到今天也就是 2018-12-30 号已经 190 天了。 + +![我和傻欢](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-30/54482393.jpg) + +我俩是异地,我在荆州,她在三亚。相见一面不管是时间上还是经济上对于还是学生的我们来说都甚是不易。见过很多人议论异地恋的种种不好,但是,于我而言,一份好的感情是值得被等待的。“待每一天如初恋,互相尊重彼此生活,共同努力,等老了就退隐山林养老......”,这应该是我和她之间最好的承诺了。 + +## 还算不错的学习收获 + +再来说说学习。这一年还算是让人满意,虽然我也不知道这一年自己到底学到了什么。如果你要问我这一年在学习上做的最满意的事情是什么,我还真不好回答,下面就从下面几个维度来简单谈一谈。 + +### 开源 + +这一年自己在Github上还是挺活跃的,提交了很多的代码和文档,同时也收获了很多的star、follower、pr、issue以及fork。 + +![我的Github概览](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-30/41250517.jpg) + +![我的Github贡献概览](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-30/33580466.jpg) + +开源的Java学习/面试指南—JavaGuide 某种程度上让我挺满意的,3月份开源 ,到现在的18k+ star 也算是可以用厚积薄发来形容了。但是,JavaGuide 也有很多让我不满意的,在2019年以及以后我也会继续完善。JavaGuide 地址:[https://github.com/Snailclimb/JavaGuide](https://github.com/Snailclimb/JavaGuide) + +![JavaGuide 概览](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-24/1352784.jpg) + +### 技术博客 + +我更新的博客主要都是关于Java方面的,也更新了几篇Python的,有一篇Python的文章竟然在我的CSDN上面阅读霸榜。 +![霸榜的 Python 文章](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-30/19527688.jpg) + +在这一年,我更新了挺多技术文章,这里就不一一列举了,我贴一下自己觉得不错的文章吧! + +#### 最常见面试题系列 + +- [最最最常见的Java面试题总结——第一周](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484252&idx=1&sn=cb160d67fc1c0a95babc464b703df5e7&chksm=fd98553dcaefdc2b18f934957dd950aeaf04e90136099fa2817fffbd1e1df452b581e1caee17&token=1398134989&lang=zh_CN#rd) +- [最最最常见的Java面试题总结——第二周](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484282&idx=1&sn=7f986dc3263b6ca0f9e182145fdd40a1&chksm=fd98551bcaefdc0d5aff9577692881dc79765a339ce97e55958e23e1956aa7092dfac44b68f1&token=1398134989&lang=zh_CN#rd) +- [这几道Java集合框架面试题在面试中几乎必问](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484308&idx=1&sn=e3607919aed604be629617f867f46844&chksm=fd9855f5caefdce3f1ee72cb33b9b3bf9899fa2b64bbb92f1e820c0ef3985245b1f7dfc05358&token=1398134989&lang=zh_CN#rd) +- [如果不会这几道多线程基础题,请自觉面壁!](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484337&idx=1&sn=d5e953d4b2da7ed37a7f843bfb437ed8&chksm=fd9855d0caefdcc65cb2e5cc0c69d27f785fc41477bcf55fff2cdff3268b0b078eb1a5107726&token=1398134989&lang=zh_CN#rd) +- [值得立马保存的 synchronized 关键字总结](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484355&idx=1&sn=6da29974b6dd1a4aa0d032f44d5fa8de&chksm=fd9855a2caefdcb4c370814baafd4baca27dfccaf609c9edf82370637ba4856176ab143a375e&token=1398134989&lang=zh_CN#rd) +- [【面试必备】源码角度一步一步分析 ArrayList 扩容机制](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484400&idx=1&sn=1b6155015fedfc9f78fabecc18da7b18&chksm=fd985591caefdc870cb018d27f92e1908b6c6e22816a77ead03c4e44b2f53caec00871172b1f&token=1398134989&lang=zh_CN#rd) +- [Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484539&idx=1&sn=3500cdcd5188bdc253fb19a1bfa805e6&chksm=fd98521acaefdb0c5167247a1fa903a1a53bb4e050b558da574f894f9feda5378ec9d0fa1ac7&token=1398134989&lang=zh_CN#rd) + +#### Github + +- [近几个月Github上最热门的Java项目一览](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484188&idx=1&sn=40037de4844f62316465bbe4e910c69c&chksm=fd98557dcaefdc6bedcaeb275aae7c340d46cf6ab0dc96e49c51982f9c53d6a44de283efc9a8&token=1398134989&lang=zh_CN#rd) +- [推荐10个Java方向最热门的开源项目(8月)](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484333&idx=1&sn=8c97b029692877a537d55175a8c82977&chksm=fd9855cccaefdcdaffe0558ba5e8dca415495935b0ad1181e6b148b08e1c86ce5d841e9df901&token=1398134989&lang=zh_CN#rd) +- [Github上 Star 数相加超过 7w+ 的三个面试相关的仓库推荐](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484644&idx=1&sn=5016caaf97e498b76de2189e3f55e9dc&chksm=fd985285caefdb93f4e3c7545d30edac6ad31b99f1fcc4503350101f0b20bba9a9705ed7d124&token=1398134989&lang=zh_CN#rd) +- [11月 Github Trending 榜最热门的 10 个 Java 项目](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484730&idx=1&sn=86e35dfea1478221b6d14a263e88ac89&chksm=fd98535bcaefda4d4f03bf0cd2e0a8fd9f44b1a2b118457a0c8b3de2ff8a1f4c4b7cd083f40e&token=1398134989&lang=zh_CN#rd) +- [盘点一下Github上开源的Java面试/学习相关的仓库,看完弄懂薪资至少增加10k](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484817&idx=1&sn=12f0c254a240c40c2ccab8314653216b&chksm=fd9853f0caefdae6d191e6bf085d44ab9c73f165e3323aa0362d830e420ccbfad93aa5901021&token=1398134989&lang=zh_CN#rd) + + +#### 备战面试系列 + +- [可能是一份最适合你的后端面试指南(部分内容前端同样适用)](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484529&idx=1&sn=9c7a3d6ad124affcadc19b0ff49bf68a&chksm=fd985210caefdb0615a9643fa698cb6267e89562730423841d942cde17ec9c1280dfc3a2b933&token=1398134989&lang=zh_CN#rd) +- [【备战春招/秋招系列1】程序员的简历就该这样写](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484573&idx=1&sn=8c5965d4a3710d405d8e8cc10c7b0ce5&chksm=fd9852fccaefdbea8dfe0bc40188b7579f1cddb1e8905dc981669a3f21d2a04cadceafa9023f&token=1990180468&lang=zh_CN#rd) +- [【备战春招/秋招系列2】初出茅庐的程序员该如何准备面试?](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484578&idx=1&sn=eea72d80a2325257f00aaed21d5b226f&chksm=fd9852c3caefdbd52dd8a537cc723ed1509314401b3a669a253ef5bc0360b6fddef48b9c2e94&token=1990180468&lang=zh_CN#rd) +- [【备战春招/秋招系列3】Java程序员必备书单](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484592&idx=1&sn=6d9731ce7401be49e97c1af6ed384ecc&chksm=fd9852d1caefdbc720a361ae65a8ad9d53cfb4800b15a7c68cbdc630b313215c6c52e0934ec2&token=1990180468&lang=zh_CN#rd) +- [【备战春招/秋招系列】美团面经总结基础篇 (附详解答案)](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484601&idx=1&sn=4907b7fef0856791c565d49d788ba8cc&chksm=fd9852d8caefdbce88e51c0a10a4ec77c97f382fd2af4a840ea47cffc828bfd0f993f50d5f0d&token=1895808268&lang=zh_CN#rd) +- [【备战春招/秋招系列】美团面经总结进阶篇 (附详解答案)](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484625&idx=1&sn=9c4fa1f7d4291a5fbd7daa44bac2b012&chksm=fd9852b0caefdba6edcf9a827aa4a17ddc97bf6ad2e5ee6f7e1aa1b443b54444d05d2b76732b&token=1895808268&lang=zh_CN#rd) +- [【备战春招/秋招系列】美团Java面经总结终结篇 (附详解答案)](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484668&idx=1&sn=9d4631588393075d9c453f307410f0cd&chksm=fd98529dcaefdb8b5497d1f161834af6917c33ea3d305eb41872e522707fa94218769ca60101&token=1398134989&lang=zh_CN#rd) +- [GitHub 上四万 Star 大佬的求职回忆](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484739&idx=1&sn=25cf5b36090f69299150663bdccfeec2&chksm=fd985322caefda34df0734efa607114704d1937f083aee2230b797d1f5aa04f7d13bf2f81dc5&token=1398134989&lang=zh_CN#rd)(非原创) + + +#### 并发编程面试必备 + +- [并发编程面试必备:synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比](http://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484539&idx=1&sn=3500cdcd5188bdc253fb19a1bfa805e6&chksm=fd98521acaefdb0c5167247a1fa903a1a53bb4e050b558da574f894f9feda5378ec9d0fa1ac7&scene=21#wechat_redirect) +- [并发编程面试必备:JUC 中的 Atomic 原子类总结](http://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484553&idx=1&sn=aca9fa19f723206eff7e33a10973a887&chksm=fd9852e8caefdbfe7180c34f83bbb422a1a0bef1ed44b1e84f56924244ea3fd2da720f25c6dd#rd) +- [并发编程面试必备:AQS 原理以及 AQS 同步组件总结](http://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484559&idx=1&sn=28dae85c38c4c500201c39234d25d731&chksm=fd9852eecaefdbf80cc54a25204e7c7d81170ce659acf92b7fa4151799ca3d0d7df2225d4ff1#rd) +- [并发编程面试必备:BATJ都爱问的多线程面试题](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484564&idx=1&sn=d8467fdc5c1b3883e9b99485f7b0fb9a&chksm=fd9852f5caefdbe364d1c438865cff84acd8f40c1c9e2f9f5c8fef673b30f905b4c5f5255368&token=1398134989&lang=zh_CN#rd) + +#### 虚拟机 + +- [可能是把Java内存区域讲的最清楚的一篇文章](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484303&idx=1&sn=af0fd436cef755463f59ee4dd0720cbd&chksm=fd9855eecaefdcf8d94ac581cfda4e16c8a730bda60c3b50bc55c124b92f23b6217f7f8e58d5&token=1398134989&lang=zh_CN#rd) +- [搞定 JVM 垃圾回收就是这么简单](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484328&idx=1&sn=214f5e18a6afa096eb552fd8627e0cea&chksm=fd9855c9caefdcdf70c746c74d31f65bbb109eedaea0cfe311a1e10af666047df59ff04c873b&token=1398134989&lang=zh_CN#rd) + +#### Spring Boot + +- [超详细,新手都能看懂 !使用SpringBoot+Dubbo 搭建一个简单的分布式服务](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484706&idx=1&sn=d413fc17023482f67ca17cb6756b9ff8&chksm=fd985343caefda555969568fdf4734536e0a1745f9de337d434a7dbd04e893bd2d75f3641aab&token=1398134989&lang=zh_CN#rd) +- [基于 SpringBoot2.0+优雅整合 SpringBoot+Mybatis](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484730&idx=2&sn=9be4636dd9a416b46f9029df68fad232&chksm=fd98535bcaefda4dccf14a286a24fcd2b3d4ab0d0e4d89dfbc955df99d2b06a1e17392b3c10b&token=1398134989&lang=zh_CN#rd) +- [新手也能实现,基于SpirngBoot2.0+ 的 SpringBoot+Mybatis 多数据源配置](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484737&idx=1&sn=e39693d845f022d689437ee58948ef6a&chksm=fd985320caefda36d5ab8abd52f5516c11cc5d1104608695bcea5909602b28dc40c132d6d46c&token=1398134989&lang=zh_CN#rd) +- [SpringBoot 整合 阿里云OSS 存储服务,快来免费搭建一个自己的图床](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484745&idx=1&sn=dbeec694916d204605929244d48a6b1c&chksm=fd985328caefda3e793170d81433c7c0b7dc1c4a4ae99395cce23b1d1a239482fd5bf1d89bc6&token=1398134989&lang=zh_CN#rd) + +#### 成长 + +- [结束了我短暂的秋招,说点自己的感受](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484516&idx=1&sn=4e2320613e76dd73a130c63beebbc3ca&chksm=fd985205caefdb13b4b611ed3c604d95314d28d567ec0c3b44585b89a7dc3142bcd52bc2d4cb&token=1398134989&lang=zh_CN#rd) +- [保研之路:从双非到南大](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484477&idx=1&sn=3b597e2431611aacca2b5d671a309d85&chksm=fd98525ccaefdb4a7e3742b5958244d453efe26f61f42f9f108190a0c18313f083189f10944e&token=1398134989&lang=zh_CN#rd)(非原创) +- [【周日闲谈】最近想说的几件小事](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484650&idx=1&sn=e97ea1eeebdb5def58bae1949bec9448&chksm=fd98528bcaefdb9d76ac62fd10544f058b1fee4a40ffd06ab9312b7eb3a62f86d67ea653b88a&token=1398134989&lang=zh_CN#rd) +- [这7个问题,可能大部分Java程序员都比较关心吧!](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484836&idx=1&sn=a6ada99c9506af01dc3bb472f66c57be&chksm=fd9853c5caefdad3034dbed00cf04412ea990fc05b6168720e6828ae6c90c9a885793acd7a14&token=1398134989&lang=zh_CN#rd) + +#### Docker + +- [可能是把Docker的概念讲的最清楚的一篇文章](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484127&idx=1&sn=70ee95619ec761da884c4f9af3e83194&chksm=fd9854becaefdda81a02bf6cf9bd07a2fc879efa7cefc79691a0d319b501d8572e8bad981d87&token=1398134989&lang=zh_CN#rd) + +#### Linux + +- [后端程序员必备的Linux基础知识](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484157&idx=1&sn=8b47e623e83fb3666bce7c680e4649b8&chksm=fd98549ccaefdd8ad815f3d8eaca86cc7e7245b4f8de1d23897af3017f5fdb3f152734c40f5e&token=1398134989&lang=zh_CN#rd) +- [快速入门大厂后端面试必备的 Shell 编程](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484696&idx=1&sn=d3c1ba5abc10c10ff844cae2109a2628&chksm=fd985379caefda6faff8e050b7dfa1e92fbfe2912e44150cb4ae349aea807836166355062970&token=1398134989&lang=zh_CN#rd) + +#### ZooKeeper + +- [可能是全网把 ZooKeeper 概念讲的最清楚的一篇文章](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484379&idx=1&sn=036f5d3defa8a6979afb77acc82a9517&chksm=fd9855bacaefdcacc1462f781b634e5599f2ee9e806bd24297dae4af0e4196a70ca6bbd8c354&token=1398134989&lang=zh_CN#rd) + +#### Redis + +- [redis 总结——重构版](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484450&idx=1&sn=7ee03fa67aecd05c5becd2a8259d3631&chksm=fd985243caefdb554ebab9149e750ac0c819074c57bd208f2d7f097fbc461ed58223e71c05f1&token=1398134989&lang=zh_CN#rd) +- [史上最全Redis高可用技术解决方案大全](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484478&idx=1&sn=a1250d9b8025cd7cb6fc6a58238ab51e&chksm=fd98525fcaefdb499a027df0138c98d4b02d828f27bd6144a4d40a1c088d340c29dd53d4a026&token=1398134989&lang=zh_CN#rd)(非原创) + +#### 计算机网络 + +- [搞定计算机网络面试,看这篇就够了(补充版)](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484289&idx=1&sn=6b556843c60aac9a17b0e7c2e3cd6bca&chksm=fd9855e0caefdcf6af4123b719448c81d90c5442d4052ae01a4698047e226c0c18c14b2cc54a&token=1398134989&lang=zh_CN#rd) + +#### 数据库 + +- [【思维导图-索引篇】搞定数据库索引就是这么简单](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484486&idx=1&sn=215450f11e042bca8a58eac9f4a97686&chksm=fd985227caefdb3117b8375f150676f5824aa20d1ebfdbcfb93ff06e23e26efbafae6cf6b48e&token=1398134989&lang=zh_CN#rd) + +#### 消息队列 + +- [新手也能看懂,消息队列其实很简单](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484789&idx=1&sn=ba972f0aac39e9a28b29ddf92fc15c18&chksm=fd985314caefda0278235427d43846b6374ff32f4149352dec063287cbf9733b888acbb79923&token=1398134989&lang=zh_CN#rd) +- [一文搞懂 RabbitMQ 的重要概念以及安装](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484796&idx=1&sn=bc56fecb634732669cfe7db8d1820ded&chksm=fd98531dcaefda0b07b8a9c13429ef225d36a6e287c96c53d7aa3dfd65c62ccd60d13b22ebbf&token=1398134989&lang=zh_CN#rd) + +### 读书 + +推荐一下 2018 年看过的书籍,小部分可能2017年也看过一些。 + +#### 已看完 + +- [《图解HTTP》](https://book.douban.com/subject/25863515/)(推荐,豆瓣评分 8.1 , 1.6K+人评价): 讲漫画一样的讲HTTP,很有意思,不会觉得枯燥,大概也涵盖也HTTP常见的知识点。因为篇幅问题,内容可能不太全面。不过,如果不是专门做网络方向研究的小伙伴想研究HTTP相关知识的话,读这本书的话应该来说就差不多了。 +- [《大话数据结构》](https://book.douban.com/subject/6424904/)(推荐,豆瓣评分 7.9 , 1K+人评价):入门类型的书籍,读起来比较浅显易懂,适合没有数据结构基础或者说数据结构没学好的小伙伴用来入门数据结构。 +- [《算法图解》](https://book.douban.com/subject/26979890/)(推荐,豆瓣评分 8.4,0.6K+人评价):入门类型的书籍,读起来比较浅显易懂,适合没有算法基础或者说算法没学好的小伙伴用来入门。示例丰富,图文并茂,以让人容易理解的方式阐释了算法.读起来比较快,内容不枯燥! +- [《Java并发编程的艺术》](https://book.douban.com/subject/26591326/)(推荐,豆瓣评分 7.2,0.2K+人评价): 这本书不是很适合作为Java并发入门书籍,需要具备一定的JVM基础。我感觉有些东西讲的还是挺深入的,推荐阅读。 +- [《实战Java高并发程序设计》](https://book.douban.com/subject/26663605/)(推荐):豆瓣评分 8.3 ,书的质量没的说,推荐大家好好看一下。 +- [《深入理解Java虚拟机(第2版)周志明》](https://book.douban.com/subject/24722612/)(推荐,豆瓣评分 8.9,1.0K+人评价):建议多刷几遍,书中的所有知识点可以通过JAVA运行时区域和JAVA的内存模型与线程两个大模块罗列完全。 +- [《Netty实战》](https://book.douban.com/subject/27038538/)(推荐,豆瓣评分 7.8,92人评价):内容很细,如果想学Netty的话,推荐阅读这本书! +- [《从Paxos到Zookeeper》](https://book.douban.com/subject/26292004/)(推荐,豆瓣评分 7.8,0.3K人评价):简要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了Paxos和ZAB协议。同时,本书深入介绍了分布式一致性问题的工业解决方案——ZooKeeper,并着重向读者展示这一分布式协调框架的使用方法、内部实现及运维技巧,旨在帮助读者全面了解ZooKeeper,并更好地使用和运维ZooKeeper。 +- [《Redis实战》](https://book.douban.com/subject/26612779/):如果你想了解Redis的一些概念性知识的话,这本书真的非常不错。 +- [《Redis设计与实现》](https://book.douban.com/subject/25900156/)(推荐,豆瓣评分 8.5,0.5K+人评价) +- [《大型网站技术架构:核心原理与案例分析+李智慧》](https://book.douban.com/subject/25723064/)(推荐):这本书我读过,基本不需要你有什么基础啊~读起来特别轻松,但是却可以学到很多东西,非常推荐了。另外我写过这本书的思维导图,关注我的微信公众号:“Java面试通关手册”回复“大型网站技术架构”即可领取思维导图。 + + +#### 未看完 + + +- [《鸟哥的Linux私房菜》](https://book.douban.com/subject/4889838/)(推荐,,豆瓣评分 9.1,0.3K+人评价):本书是最具知名度的Linux入门书《鸟哥的Linux私房菜基础学习篇》的最新版,全面而详细地介绍了Linux操作系统。全书分为5个部分:第一部分着重说明Linux的起源及功能,如何规划和安装Linux主机;第二部分介绍Linux的文件系统、文件、目录与磁盘的管理;第三部分介绍文字模式接口 shell和管理系统的好帮手shell脚本,另外还介绍了文字编辑器vi和vim的使用方法;第四部分介绍了对于系统安全非常重要的Linux账号的管理,以及主机系统与程序的管理,如查看进程、任务分配和作业管理;第五部分介绍了系统管理员(root)的管理事项,如了解系统运行状况、系统服务,针对登录文件进行解析,对系统进行备份以及核心的管理等。 +- [《亿级流量网站架构核心技术》](https://book.douban.com/subject/26999243/)(推荐):一书总结并梳理了亿级流量网站高可用和高并发原则,通过实例详细介绍了如何落地这些原则。本书分为四部分:概述、高可用原则、高并发原则、案例实战。从负载均衡、限流、降级、隔离、超时与重试、回滚机制、压测与预案、缓存、池化、异步化、扩容、队列等多方面详细介绍了亿级流量网站的架构核心技术,让读者看后能快速运用到实践项目中。 +- [《重构_改善既有代码的设计》](https://book.douban.com/subject/4262627/)(推荐):豆瓣 9.1 分,重构书籍的开山鼻祖。 +- [《深入剖析Tomcat》](https://book.douban.com/subject/10426640/)(推荐,豆瓣评分 8.4,0.2K+人评价):本书深入剖析Tomcat 4和Tomcat 5中的每个组件,并揭示其内部工作原理。通过学习本书,你将可以自行开发Tomcat组件,或者扩展已有的组件。 读完这本书,基本可以摆脱背诵面试题的尴尬。 +- [《高性能MySQL》](https://book.douban.com/subject/23008813/)(推荐,豆瓣评分 9.3,0.4K+人评价):mysql 领域的经典之作,拥有广泛的影响力。不但适合数据库管理员(dba)阅读,也适合开发人员参考学习。不管是数据库新手还是专家,相信都能从本书有所收获。 +- [深入理解Nginx(第2版)](https://book.douban.com/subject/26745255/):作者讲的非常细致,注释都写的都很工整,对于 Nginx 的开发人员非常有帮助。优点是细致,缺点是过于细致,到处都是代码片段,缺少一些抽象。 +- [《RabbitMQ实战指南》](https://book.douban.com/subject/27591386/):《RabbitMQ实战指南》从消息中间件的概念和RabbitMQ的历史切入,主要阐述RabbitMQ的安装、使用、配置、管理、运维、原理、扩展等方面的细节。如果你想浅尝RabbitMQ的使用,这本书是你最好的选择;如果你想深入RabbitMQ的原理,这本书也是你最好的选择;总之,如果你想玩转RabbitMQ,这本书一定是最值得看的书之一 +- [《Spring Cloud微服务实战》](https://book.douban.com/subject/27025912/):从时下流行的微服务架构概念出发,详细介绍了Spring Cloud针对微服务架构中几大核心要素的解决方案和基础组件。对于各个组件的介绍,《Spring Cloud微服务实战》主要以示例与源码结合的方式来帮助读者更好地理解这些组件的使用方法以及运行原理。同时,在介绍的过程中,还包含了作者在实践中所遇到的一些问题和解决思路,可供读者在实践中作为参考。 +- [《第一本Docker书》](https://book.douban.com/subject/26780404/):Docker入门书籍! +- [《Effective java 》](https://book.douban.com/subject/3360807/)(推荐,豆瓣评分 9.0,1.4K+人评价):本书介绍了在Java编程中78条极具实用价值的经验规则,这些经验规则涵盖了大多数开发人员每天所面临的问题的解决方案。通过对Java平台设计专家所使用的技术的全面描述,揭示了应该做什么,不应该做什么才能产生清晰、健壮和高效的代码。本书中的每条规则都以简短、独立的小文章形式出现,并通过例子代码加以进一步说明。本书内容全面,结构清晰,讲解详细。可作为技术人员的参考用书。 +- [《算法 第四版》](https://book.douban.com/subject/10432347/)(推荐,豆瓣评分 9.3,0.4K+人评价):Java语言描述,算法领域经典的参考书,全面介绍了关于算法和数据结构的必备知识,并特别针对排序、搜索、图处理和字符串处理进行了论述。书的内容非常多,可以说是Java程序员的必备书籍之一了。 + +## 一些个人愚见 + +### 关于读书 + +不知道大家收藏栏是不是和我一样收藏了很多文章,但是有多少篇是你真真认真看的呢?或者那几篇你认真看之后,经过一个月之后还记得这篇文章的大概内容。现在这个社会真是一个信息爆炸的社会,我个人真的深有感触,就在刚刚我还取消关注了好多微信公众号,很多公众号给我推的文章都有好几十篇了,但是我一篇都没有看,所以索性取消关注,省个位置。我个人觉得遇到好的文章,我们不光要读,而且要记录下来。就拿我本人来说,我平时喜欢用 OneNote 来记录学习笔记以及其他我感觉重要的事情比如重要人的生日啦这些。每当遇到自己喜欢的文章的时候,我都先会把文章的地址保存到我分好类的笔记本上,我会先进行第一遍阅读,第一遍我会读的很仔细,如果晦涩难懂的话我会先快速把总体看一遍,然后在细细品读。一般第二遍的时候我就会在笔记本上记录这篇文章的一些要点,以便我日后看到这些要点可以快速回忆起整篇文章的内容。如果某篇文章的知识点太过庞大的话,我会去选择采用思维导图的方式展示要点。看视频一样,看教学视频的话,如果觉得老师讲的不错,我们不妨记录下来,Onenote 或者有道云笔记都行,记录大概,够我们日后回忆就好。 + +### 关于学习 + +做事不要有功利性,我最早在掘金写文章,其实也只是为了记录自己的学习,没想到会有人喜欢自己的文章,另外我课外学的很多东西,我自己也不清楚以后工作会不会用到,反正我自己感觉即然自己感兴趣,那么就去学吧。我相信,很多东西可能暂时带给你不了带多实质性的帮助,但是总有一天它会对你有帮助。如果感到迷茫的话,就做好眼前的事(拿我们班主任的话说,如果你感到迷茫,你就学好现在的专业知识就好了),我觉得没毛病。 + +### 关于个人 + +在生活中一定要保持谦虚,保持谦虚,保持谦虚,时刻都要有反省的准备,你要记住学无止境,永远不要满足现在的现状。另外,就是一定要掌控好自己的时间,多留点时间给父母亲人,以及那些自己在乎的人。如果对别人很在乎的话,不要去装作不在乎,因为这样真的不是太好,虽然我之前也会这样,很多时候撰写的消息,最后没发出去。 + +## 最后分享一句话 + +分享给大家,我笔记本里一直保存的杨绛老先生的一句话:“我们曾如此渴望命运的波澜,到最后才发现:人生最曼妙的风景,竟是内心的淡定与从容……我们曾如此期盼外界的认可,到最后才知道:世界是自己的,与他人毫无关系!”。 From 46521dda8871db207691124d3e412497ff4ffe55 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:22:57 +0800 Subject: [PATCH 19/66] =?UTF-8?q?Create=202018=20=E7=A7=8B=E6=8B=9B.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 闲谈/2018 秋招.md | 93 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 闲谈/2018 秋招.md diff --git a/闲谈/2018 秋招.md b/闲谈/2018 秋招.md new file mode 100644 index 00000000..a2b47de8 --- /dev/null +++ b/闲谈/2018 秋招.md @@ -0,0 +1,93 @@ + + +# 秋招历程流水账总结 + +笔主大四准毕业生,在秋招末流比较幸运地进入了一家自己非常喜欢一家公司——ThoughtWorks. + +![今天去签约在门外拍的照片](https://images.gitbook.cn/1433af10-d5f7-11e8-841a-4f0b0cc7be7b) + +从9-6号投递出去第一份简历,到10-18号左右拿到第一份 offer ,中间差不多有 1 个半月的时间了。可能自己比较随缘,而且自己所在的大学所处的位置并不是互联网比较发达的城市的原因。所以,很少会有公司愿意跑到我们学校那边来宣讲,来的公司也大多是一些自己没听过或者不太喜欢的公司。所以,在前期,我仅仅能够通过网上投递简历的方式来找工作。 + +零零总总算了一下,自己在网上投了大概有 10 份左右的简历,都是些自己还算喜欢的公司。简单说一下自己投递的一些公司:网上投递的公司有:ThoughtWorks、网易、小米、携程、爱奇艺、知乎、小红书、搜狐、欢聚时代、京东;直接邮箱投递的有:烽火、中电数据、蚂蚁金服花呗部门、今日头条;线下宣讲会投递的有:玄武科技。 + +网上投递的大部分简历都是在做完笔试之后就没有了下文了,即使有几场笔试自我感觉做的很不错的情况下,还是没有收到后续的面试邀请。还有些邮箱投递的简历,后面也都没了回应。所以,我总共也只参加了3个公司的面试,ThoughtWorks、玄武科技和中电数据,都算是拿到了 offer。拿到 ThoughtWorks 的 offer之后,后面的一些笔试和少部分面试都拒了。决定去 ThoughtWorks 了,春招的大部队会没有我的存在。 + + +我个人对 ThoughtWorks 最有好感,ThoughtWorks 也是我自己之前很想去的一家公司。不光是因为我投递简历的时候可以不用重新填一遍表格可以直接发送我已经编辑好的PDF格式简历的友好,这个公司的文化也让我很喜欢。每次投递一家公司几乎都要重新填写一遍简历真的很让人头疼,即使是用牛客网的简历助手也还是有很多东西需要自己重新填写。 + +说句实话,自己在拿到第一份 offer 之前心里还是比较空的,虽然说对自己还是比较自信。包括自己当时来到武汉的原因,也是因为自己没有 offer ,就感觉心里空空的,我相信很多人在这个时候与我也有一样的感觉。然后,我就想到武汉参加一下别的学校宣讲会。现在看来,这个决定也是不必要的,因为我最后去的公司 ThoughtWorks,虽然就在我租的房子的附近,但之前投递的时候,选择的还是远程面试。来到武汉,简单的修整了一下之后,我就去参加了玄武科技在武理工的宣讲会,顺便做了笔试,然后接着就是技术面、HR面、高管面。总体来说,玄武科技的 HR 真的很热情,为他们点个赞,虽然自己最后没能去玄武科技,然后就是技术面非常简单,HR面和高管面也都还好,不会有压抑的感觉,总体聊得很愉快。需要注意的是 玄武科技和很多公司一样都有笔试中有逻辑题,我之前没有做过类似的题,所以当时第一次做有点懵逼。高管面的时候,高管还专门在我做的逻辑题上聊了一会,让我重新做了一些做错的题,并且给他讲一些题的思路,可以看出高层对于应聘者的这项能力还是比较看重的。 + + + +中电数据的技术面试是电话进行的,花了1个多小时一点,个人感觉问的还是比较深的,感觉自己总体回答的还是比较不错的。 + +这里我着重说一下 ThoughtWorks,也算是给想去 ThoughtWorks 的同学一点小小的提示。我是 9.11 号在官网:https://join.thoughtworks.cn/ 投递的简历,9.20 日邮件通知官网下载作业,作业总体来说不难,9.21 号花了半天多的时间做完,然后就直接在9.21 号下午提交了。然后等了挺长时间的,可能是因为 ThoughtWorks 在管理方面比较扁平化的原因,所以总体来说效率可能不算高。因为我选的是远程面试,所以直接下载好 zoom 之后,等HR打电话过来告诉你一个房间号,你就可以直接进去面试就好,一般技术面试有几个人看着你。技术面试的内容,首先就是在面试官让你在你之前做的作业的基础上新增加一个或者两个功能(20分钟)。所以,你在技术面试之前一定要保证你的程序的扩展性是不错的,另外就是你在技术面试之前最好能重构一下自己写的程序。重构本身就是你自己对你写的程序的理解加强很好的一种方式,另外重构也能让你发现你的程序的一些小问题。然后,这一步完成之后,面试官可能会问你一些基础问题,比较简单,所以我觉得 ThoughtWorks 可能更看重你的代码质量。ThoughtWorks 的 HR 面和其他公司的唯一不同可能在于,他会让你用英语介绍一下自己或者说自己的技术栈啊这些。 + +![思特沃克可爱的招聘官网](https://images.gitbook.cn/83f765e0-d5f6-11e8-9c1a-919e09988420) + + +# 关于面试一些重要的问题总结 +另外,再给大家总结一些我个人想到一些关于面试非常重要的一些问题。 + +### 面试前 + +**如何准备** + + +运筹帷幄之后,决胜千里之外!不打毫无准备的仗,我觉得大家可以先从下面几个方面来准备面试: + +1. 自我介绍。(你可千万这样介绍:“我叫某某,性别,来自哪里,学校是那个,自己爱干什么”,记住:多说点简历上没有的,多说点自己哪里比别人强!) +2. 自己面试中可能涉及哪些知识点、那些知识点是重点。 +3. 面试中哪些问题会被经常问到、面试中自己改如何回答。(强烈不推荐背题,第一:通过背这种方式你能记住多少?能记住多久?第二:背题的方式的学习很难坚持下去!) +4. 自己的简历该如何写。 + + + +另外,如果你想去类似阿里巴巴、腾讯这种比较大的互联网公司的话,一定要尽早做打算。像阿里巴巴在7月份左右就开始了提前批招聘,到了9月份差不多就已经招聘完毕了。所以,秋招没有参加到阿里的面试还是很遗憾的,毕竟面试即使失败了,也能从阿里难度Max的面试中学到很多东西。 + +**关于着装** + +穿西装、打领带、小皮鞋?NO!NO!NO!这是互联网公司面试又不是去走红毯,所以你只需要穿的简单大方就好,不需要太正式。 + +**关于自我介绍** + +如果你简历上写的基本信息就不要说了,比如性别、年龄、学校。另外,你也不要一上来就说自己爱好什么这方面内容。因为,面试官根本不关心这些东西。你直接挑和你岗位相关的重要经历和自己最突出的特点讲就好了。 + + + +**提前准备** + +面试之前可以在网上找找有没有你要面试的公司的面经。在我面试 ThoughtWorks 的前几天我就在网上找了一些关于 ThoughtWorks 的技术面的一些文章。然后知道了 ThoughtWorks 的技术面会让我们在之前做的作业的基础上增加一个或两个功能,所以我提前一天就把我之前做的程序重新重构了一下。然后在技术面的时候,简单的改了几行代码之后写个测试就完事了。如果没有提前准备,我觉得 20 分钟我很大几率会完不成这项任务。 + + +### 面试中 + +面试的时候一定要自信,千万不要怕自己哪里会答不出来,或者说某个问题自己忘记怎么回答了。面试过程中,很多问题可能是你之前没有碰到过的,这个时候你就要通过自己构建的知识体系来思考这些问题。如果某些问题你回答不上来,你也可以让面试官给你简单的提示一下。总之,你要自信,你自信的前提是自己要做好充分的准备。下面给大家总结一些面试非常常见的问题: + +- SpringMVC 工作原理 +- 说一下自己对 IOC 、AOP 的理解 +- Spring 中用到了那些设计模式,讲一下自己对于这些设计模式的理解 +- Spring Bean 的作用域和生命周期了解吗 +- Spring 事务中的隔离级别 +- Spring 事务中的事务传播行为 +- 手写一个 LRU 算法 +- 知道那些排序算法,简单介绍一下快排的原理,能不能手写一下快排 +- String 为什么是不可变的?String为啥要设计为不可变的? +- Arraylist 与 LinkedList 异同 +- HashMap的底层实现 +- HashMap 的长度为什么是2的幂次方 +- ConcurrentHashMap 和 Hashtable 的区别 +- ConcurrentHashMap线程安全的具体实现方式/底层具体实现 +- 如果你的简历写了redis 、dubbo、zookeeper、docker的话,面试官还会问一下这些东西。比如redis可能会问你:为什么要用 redis、为什么要用 redis 而不用 map/guava 做缓存、redis 常见数据结构以及使用场景分析、 redis 设置过期时间、redis 内存淘汰机制、 redis 持久化机制、 缓存雪崩和缓存穿透问题、如何解决 Redis 的并发竞争 Key 问题、如何保证缓存与数据库双写时的数据一致性。 +- 一些简单的 Linux 命令。 +- 为什么要用 消息队列 +- 关于 Java多线程,在面试的时候,问的比较多的就是①悲观锁和乐观锁②synchronized 和 ReenTrantLock 区别以及 volatile 和 synchronized 的区别,③可重入锁与非可重入锁的区别、④多线程是解决什么问题的、⑤线程池解决什么问题,为什么要用线程池 ⑥Synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 ReenTrantLock 对比;⑦线程池使用时的注意事项、⑧AQS 原理以及 AQS 同步组件:Semaphore、CountDownLatCh、 CyclicBarrier、ReadWriteLock、⑨ReentranLock源码,设计原理,整体过程 等等问题。 +- 关于 Java 虚拟机问的比较多的是:①Java内存区域、②虚拟机垃圾算法、③虚拟机垃圾收集器、④JVM内存管理、⑤JVM调优这些问题。 + + +### 面试后 + +如果失败,不要灰心;如果通过,切勿狂喜。面试和工作实际上是两回事,可能很多面试未通过的人,工作能力比你强的多,反之亦然。我个人觉得面试也像是一场全新的征程,失败和胜利都是平常之事。所以,劝各位不要因为面试失败而灰心、丧失斗志。也不要因为面试通过而沾沾自喜,等待你的将是更美好的未来,继续加油! + + + From 4f9034af2ba19d4bfcae234484955d205e1b5bb1 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:23:00 +0800 Subject: [PATCH 20/66] Create 2018-12.md --- 闲谈/JavaGithubTrending/2018-12.md | 113 +++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 闲谈/JavaGithubTrending/2018-12.md diff --git a/闲谈/JavaGithubTrending/2018-12.md b/闲谈/JavaGithubTrending/2018-12.md new file mode 100644 index 00000000..fc433c64 --- /dev/null +++ b/闲谈/JavaGithubTrending/2018-12.md @@ -0,0 +1,113 @@ +本文数据统计于 1.1 号凌晨,由 SnailClimb 整理。 + +### 1. JavaGuide + +- **Github地址**: [https://github.com/Snailclimb/JavaGuide](https://github.com/Snailclimb/JavaGuide) +- **star**: 18.2k +- **介绍**: 【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。 + +![JavaGuide](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/96151465.jpg) + +概览: + + ![JavaGuide](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-24/1352784.jpg) + +### 2. mall + +- **Github地址**: [https://github.com/macrozheng/mall](https://github.com/macrozheng/mall) +- **star**: 3.3k +- **介绍**: mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。 后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。 + +![mall](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/11382760.jpg) + +概览: + +![mall](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/99819963.jpg) + +### 3. advanced-java + +- **Github地址**:[https://github.com/doocs/advanced-java](https://github.com/doocs/advanced-java) +- **star**: 3.3k +- **介绍**: 互联网 Java 工程师进阶知识完全扫盲 + +![advanced-java](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/95209476.jpg) + +概览: + +![advanced-java](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/18005792.jpg) + +### 4. matrix + +- **Github地址**:[https://github.com/Tencent/matrix](https://github.com/Tencent/matrix) +- **star**: 2.5k +- **介绍**: Matrix 是一款微信研发并日常使用的 APM(Application Performance Manage),当前主要运行在 Android 平台上。 Matrix 的目标是建立统一的应用性能接入框架,通过各种性能监控方案,对性能监控项的异常数据进行采集和分析,输出相应的问题分析、定位与优化建议,从而帮助开发者开发出更高质量的应用。 + +![matrix](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/8991895.jpg) + +### 5. miaosha + +- **Github地址**:[https://github.com/qiurunze123/miaosha](https://github.com/qiurunze123/miaosha) +- **star**: 2.4k +- **介绍**: 高并发大流量如何进行秒杀架构,我对这部分知识做了一个系统的整理,写了一套系统。 + +![miaosha](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/79382302.jpg) + +### 6. arthas + +- **Github地址**:[https://github.com/alibaba/arthas](https://github.com/alibaba/arthas) +- **star**: 8.2k +- **介绍**: Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。 + +![arthas](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/73394671.jpg) + +### 7 spring-boot + +- **Github地址**: [https://github.com/spring-projects/spring-boot](https://github.com/spring-projects/spring-boot) +- **star:** 32.6k +- **介绍**: 虽然Spring的组件代码是轻量级的,但它的配置却是重量级的(需要大量XML配置),不过Spring Boot 让这一切成为了过去。 另外Spring Cloud也是基于Spring Boot构建的,我个人非常有必要学习一下。 + + **关于Spring Boot官方的介绍:** + + > Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”…Most Spring Boot applications need very little Spring configuration.(Spring Boot可以轻松创建独立的生产级基于Spring的应用程序,只要通过 “just run”(可能是run ‘Application’或java -jar 或 tomcat 或 maven插件run 或 shell脚本)便可以运行项目。大部分Spring Boot项目只需要少量的配置即可) + +![spring-boot](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/29649807.jpg) + +### 8. tutorials + +- **Github地址**:[https://github.com/eugenp/tutorials](https://github.com/eugenp/tutorials) +- **star**: 10k +- **介绍**: 该项目是一系列小而专注的教程 - 每个教程都涵盖Java生态系统中单一且定义明确的开发领域。 当然,它们的重点是Spring Framework - Spring,Spring Boot和Spring Securiyt。 除了Spring之外,还有以下技术:核心Java,Jackson,HttpClient,Guava。 + +![tutorials](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/94425339.jpg) + +### 9. qmq + +- **Github地址**:[https://github.com/qunarcorp/qmq](https://github.com/qunarcorp/qmq) +- **star**: 1.1k +- **介绍**: QMQ是去哪儿网内部广泛使用的消息中间件,自2012年诞生以来在去哪儿网所有业务场景中广泛的应用,包括跟交易息息相关的订单场景; 也包括报价搜索等高吞吐量场景。 + +![arthas](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/73394671.jpg) + +### 10. symphony + +- **Github地址**:[https://github.com/b3log/symphony](https://github.com/b3log/symphony) +- **star**: 9k +- **介绍**: 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台。 + +![symphony](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/11577890.jpg) + +### 11. incubator-dubbo + +- **Github地址**:[https://github.com/apache/incubator-dubbo](https://github.com/apache/incubator-dubbo) +- **star**: 23.6k +- **介绍**: 阿里开源的一个基于Java的高性能开源RPC框架。 + +![incubator-dubbo](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/53068060.jpg) + +### 12. apollo + +- **Github地址**:[https://github.com/ctripcorp/apollo](https://github.com/ctripcorp/apollo) +- **star**: 10k +- **介绍**: Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理应用不同环境、不同集群的配置,配置修改后能够实时推送到应用端,并且具备规范的权限、流程治理等特性,适用于微服务配置管理场景。 + +![apollo](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/89386993.jpg) \ No newline at end of file From df20c96cbb49b56bf08b1eebf0e4703f9db29601 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:23:02 +0800 Subject: [PATCH 21/66] Create 2019-1.md --- 闲谈/JavaGithubTrending/2019-1.md | 114 ++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) create mode 100644 闲谈/JavaGithubTrending/2019-1.md diff --git a/闲谈/JavaGithubTrending/2019-1.md b/闲谈/JavaGithubTrending/2019-1.md new file mode 100644 index 00000000..eecc4e28 --- /dev/null +++ b/闲谈/JavaGithubTrending/2019-1.md @@ -0,0 +1,114 @@ +### 1. JavaGuide + +- **Github地址**: [https://github.com/Snailclimb/JavaGuide](https://github.com/Snailclimb/JavaGuide) +- **star**: 22.8k +- **介绍**: 【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。 + +![JavaGuide](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/JavaGuide.png) + +**概览:** + + ![JavaGuide](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-24/1352784.jpg) + +### 2. advanced-java + +- **Github地址**:[https://github.com/doocs/advanced-java](https://github.com/doocs/advanced-java) +- **star**: 7.9k +- **介绍**: 互联网 Java 工程师进阶知识完全扫盲 + +![advanced-java](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/advanced-java.png) + +**概览:** + +![advanced-java](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/18005792.jpg) + +### 3. fescar + +- **Github地址**:[https://github.com/alibaba/fescar](https://github.com/alibaba/fescar) +- **star**: 4.6k +- **介绍**: 具有 **高性能** 和 **易用性** 的 **微服务架构** 的 **分布式事务** 的解决方案。(特点:高性能且易于使用,旨在实现简单并快速的事务提交与回滚。)关于 fescar 的更详细介绍可以查看:[Github 上日获 800多 star 的阿里微服务架构分布式事务解决方案 FESCAR开源啦](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484888&idx=2&sn=ff9fe077c95959ec777c866a425bddbe&chksm=fd9853b9caefdaaf52a1b7caecc697938c2c1c5f6916527d1309ef01aba70c6546bdba6a9657&token=96044853&lang=zh_CN#rd) + +![fescar](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/fescar.png) + +### 4. mall + +- **Github地址**: [https://github.com/macrozheng/mall](https://github.com/macrozheng/mall) +- **star**: 5.6 k +- **介绍**: mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。 后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。 + +![mall](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/mall.png) + +**概览:** + +![mall](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-1/99819963.jpg) + +### 5. miaosha + +- **Github地址**:[https://github.com/qiurunze123/miaosha](https://github.com/qiurunze123/miaosha) +- **star**: 4.4k +- **介绍**: 高并发大流量如何进行秒杀架构,我对这部分知识做了一个系统的整理,写了一套系统。 + +![miaosha](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/miaosha.png) + +### 6. flink + +- **Github地址**:[https://github.com/apache/flink](https://github.com/apache/flink) +- **star**: 7.1 k +- **介绍**: Apache Flink是一个开源流处理框架,具有强大的流和批处理功能。 + +![flink](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/flink.png) + +关于Flink 更加详细的介绍可以查看这篇文章:https://www.cnblogs.com/feiyudemeng/p/8998772.html + +### 7. cim + +- **Github地址**:[https://github.com/crossoverJie/cim](https://github.com/crossoverJie/cim) +- **star**: 1.8 k +- **介绍**: cim(cross IM) 适用于开发者的即时通讯系统。 + +![cim](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/cim.png) + +**系统架构:** + +![cim系统架构](https://camo.githubusercontent.com/16f644ac7e2ab8cf8b8784408b1c70baf15634f4/68747470733a2f2f7773312e73696e61696d672e636e2f6c617267652f303036744e6252776c793166796c646769697a68756a3331356f3072346e306b2e6a7067) + +### 8. symphony + +- **Github地址**:[https://github.com/b3log/symphony](https://github.com/b3log/symphony) +- **star**: 10k +- **介绍**: 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台。 + +![symphony](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/symphony.png) + +### 9. spring-boot + +- **Github地址**: [https://github.com/spring-projects/spring-boot](https://github.com/spring-projects/spring-boot) +- **star:** 32.6k +- **介绍**: 虽然Spring的组件代码是轻量级的,但它的配置却是重量级的(需要大量XML配置),不过Spring Boot 让这一切成为了过去。 另外Spring Cloud也是基于Spring Boot构建的,我个人非常有必要学习一下。 + + **关于Spring Boot官方的介绍:** + + > Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”…Most Spring Boot applications need very little Spring configuration.(Spring Boot可以轻松创建独立的生产级基于Spring的应用程序,只要通过 “just run”(可能是run ‘Application’或java -jar 或 tomcat 或 maven插件run 或 shell脚本)便可以运行项目。大部分Spring Boot项目只需要少量的配置即可) + +![spring-boot](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/spring-boot.png) + +### 10. arthas + +- **Github地址**:[https://github.com/alibaba/arthas](https://github.com/alibaba/arthas) +- **star**: 9.5k +- **介绍**: Arthas 是Alibaba开源的Java诊断工具。 + +![arthas](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/arthas.png) + +**概览:** + +当你遇到以下类似问题而束手无策时,`Arthas`可以帮助你解决: + +0. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception? +1. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了? +2. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗? +3. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现! +4. 是否有一个全局视角来查看系统的运行状况? +5. 有什么办法可以监控到JVM的实时运行状态? + +`Arthas`支持JDK 6+,支持Linux/Mac/Winodws,采用命令行交互模式,同时提供丰富的 `Tab` 自动补全功能,进一步方便进行问题的定位和诊断。 \ No newline at end of file From 53f9754eb54fb653414bf257bde495ab2bfc0bf8 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:23:05 +0800 Subject: [PATCH 22/66] Create 2019-2.md --- 闲谈/JavaGithubTrending/2019-2.md | 64 +++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 闲谈/JavaGithubTrending/2019-2.md diff --git a/闲谈/JavaGithubTrending/2019-2.md b/闲谈/JavaGithubTrending/2019-2.md new file mode 100644 index 00000000..51d34b32 --- /dev/null +++ b/闲谈/JavaGithubTrending/2019-2.md @@ -0,0 +1,64 @@ +### 1. JavaGuide + +- **Github地址**: [https://github.com/Snailclimb/JavaGuide](https://github.com/Snailclimb/JavaGuide) +- **Star**: 27.2k (4,437 stars this month) +- **介绍**: 【Java学习+面试指南】 一份涵盖大部分Java程序员所需要掌握的核心知识。 + +### 2.DoraemonKit + +- **Github地址**: +- **Star**: 5.2k (3,786 stars this month) +- **介绍**: 简称 "DoKit" 。一款功能齐全的客户端( iOS 、Android )研发助手,你值得拥有。 + +### 3.advanced-java + +- **Github地址**:[https://github.com/doocs/advanced-java](https://github.com/doocs/advanced-java) +- **Star**:11.2k (3,042 stars this month) +- **介绍**: 互联网 Java 工程师进阶知识完全扫盲。 + +### 4. spring-boot-examples + +- **Github地址**: +- **star**: 9.6 k (1,764 stars this month) +- **介绍**: Spring Boot 教程、技术栈示例代码,快速简单上手教程。 + +### 5. mall + +- **Github地址**: [https://github.com/macrozheng/mall](https://github.com/macrozheng/mall) +- **star**: 7.4 k (1,736 stars this month) +- **介绍**: mall项目是一套电商系统,包括前台商城系统及后台管理系统,基于SpringBoot+MyBatis实现。 前台商城系统包含首页门户、商品推荐、商品搜索、商品展示、购物车、订单流程、会员中心、客户服务、帮助中心等模块。 后台管理系统包含商品管理、订单管理、会员管理、促销管理、运营管理、内容管理、统计报表、财务管理、权限管理、设置等模块。 + +### 6. fescar + +- **Github地址**:[https://github.com/alibaba/fescar](https://github.com/alibaba/fescar) +- **star**: 6.0 k (1,308 stars this month) +- **介绍**: 具有 **高性能** 和 **易用性** 的 **微服务架构** 的 **分布式事务** 的解决方案。(特点:高性能且易于使用,旨在实现简单并快速的事务提交与回滚。) + +### 7. h4cker + +- **Github地址**: +- **star**: 2.1 k (1,303 stars this month) +- **介绍**: 该仓库主要由Omar Santos维护,包括与道德黑客/渗透测试,数字取证和事件响应(DFIR),漏洞研究,漏洞利用开发,逆向工程等相关的资源。 + +### 8. spring-boot + +- **Github地址**: [https://github.com/spring-projects/spring-boot](https://github.com/spring-projects/spring-boot) +- **star:** 34.8k (1,073 stars this month) +- **介绍**: 虽然Spring的组件代码是轻量级的,但它的配置却是重量级的(需要大量XML配置),不过Spring Boot 让这一切成为了过去。 另外Spring Cloud也是基于Spring Boot构建的,我个人非常有必要学习一下。 + + **关于Spring Boot官方的介绍:** + + > Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications that you can “just run”…Most Spring Boot applications need very little Spring configuration.(Spring Boot可以轻松创建独立的生产级基于Spring的应用程序,只要通过 “just run”(可能是run ‘Application’或java -jar 或 tomcat 或 maven插件run 或 shell脚本)便可以运行项目。大部分Spring Boot项目只需要少量的配置即可) + +### 9. arthas + +- **Github地址**:[https://github.com/alibaba/arthas](https://github.com/alibaba/arthas) +- **star**: 10.5 k (970 stars this month) +- **介绍**: Arthas 是Alibaba开源的Java诊断工具。 + +### 10. tutorials + +- **Github地址**:[https://github.com/eugenp/tutorials](https://github.com/eugenp/tutorials) +- **star**: 12.1 k (789 stars this month) +- **介绍**: 该项目是一系列小而专注的教程 - 每个教程都涵盖Java生态系统中单一且定义明确的开发领域。 当然,它们的重点是Spring Framework - Spring,Spring Boot和Spring Securiyt。 除了Spring之外,还有以下技术:核心Java,Jackson,HttpClient,Guava。 + From e63d58f5b5e40b8e7dc97203eb3d1487dda922ae Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:23:08 +0800 Subject: [PATCH 23/66] Create JavaGithubTrending.md --- 闲谈/JavaGithubTrending/JavaGithubTrending.md | 2 ++ 1 file changed, 2 insertions(+) create mode 100644 闲谈/JavaGithubTrending/JavaGithubTrending.md diff --git a/闲谈/JavaGithubTrending/JavaGithubTrending.md b/闲谈/JavaGithubTrending/JavaGithubTrending.md new file mode 100644 index 00000000..203710cb --- /dev/null +++ b/闲谈/JavaGithubTrending/JavaGithubTrending.md @@ -0,0 +1,2 @@ +### 2019 年一月 + From cf17868c24b5d0e5066be77546771d1ca44edb99 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:23:10 +0800 Subject: [PATCH 24/66] =?UTF-8?q?Create=20=E4=B8=AA=E4=BA=BA=E9=98=85?= =?UTF-8?q?=E8=AF=BB=E4=B9=A6=E7=B1=8D=E6=B8=85=E5=8D=95.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 闲谈/个人阅读书籍清单.md | 89 ++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 闲谈/个人阅读书籍清单.md diff --git a/闲谈/个人阅读书籍清单.md b/闲谈/个人阅读书籍清单.md new file mode 100644 index 00000000..f14ee33a --- /dev/null +++ b/闲谈/个人阅读书籍清单.md @@ -0,0 +1,89 @@ +下面是个人阅读书籍的部分清单,我比较建议阅读的书籍前都加上了:thumbsup: 表情。 +> ### 核心基础知识 + +- :thumbsup: [《图解HTTP》](https://book.douban.com/subject/25863515/) + + 讲漫画一样的讲HTTP,很有意思,不会觉得枯燥,大概也涵盖也HTTP常见的知识点。因为篇幅问题,内容可能不太全面。不过,如果不是专门做网络方向研究的小伙伴想研究HTTP相关知识的话,读这本书的话应该来说就差不多了。 + +> ### Java相关 + +- :thumbsup: [《Head First Java.第二版》](https://book.douban.com/subject/2000732/) + + 可以说是我的Java启蒙书籍了,特别适合新手读当然也适合我们用来温故Java知识点。 + +- [《Java多线程编程核心技术》](https://book.douban.com/subject/26555197/) + + Java多线程入门级书籍还不错,但是说实话,质量不是很高,很快就可以阅读完。 + +- [《JAVA网络编程 第4版》](https://book.douban.com/subject/26259017/) + + 可以系统的学习一下网络的一些概念以及网络编程在Java中的使用。 + +- :thumbsup: [《Java核心技术卷1+卷2》](https://book.douban.com/subject/25762168/) + + 很棒的两本书,建议有点Java基础之后再读,介绍的还是比较深入的,非常推荐。这两本书我一般也会用来巩固知识点,是两本适合放在自己身边的好书。 + +- :thumbsup: [《Java编程思想(第4版)》](https://book.douban.com/subject/2130190/) + + 这本书要常读,初学者可以快速概览,中等程序员可以深入看看java,老鸟还可以用之回顾java的体系。这本书之所以厉害,因为它在无形中整合了设计模式,这本书之所以难读,也恰恰在于他对设计模式的整合是无形的。 + +- :thumbsup: [《Java并发编程的艺术》](https://book.douban.com/subject/26591326/) + + 这本书不是很适合作为Java并发入门书籍,需要具备一定的JVM基础。我感觉有些东西讲的还是挺深入的,推荐阅读。 +- :thumbsup: [《实战Java高并发程序设计》](https://book.douban.com/subject/26663605/) + + 豆瓣评分 8.3 ,书的质量没的说,推荐大家好好看一下。 + +- [《Java程序员修炼之道》](https://book.douban.com/subject/24841235/) + + 很杂,我只看了前面几章,不太推荐阅读。 + +- :thumbsup: [《深入理解Java虚拟机(第2版)周志明》](https://book.douban.com/subject/24722612/) + + 神书!神书!神书!建议多刷几遍,书中的所有知识点可以通过JAVA运行时区域和JAVA的内存模型与线程两个大模块罗列完全。 + +> ### JavaWeb相关 + +- :thumbsup: [《深入分析Java Web技术内幕》](https://book.douban.com/subject/25953851/) + + 感觉还行,涉及的东西也蛮多,推荐阅读。 + +- :thumbsup: [《Spring实战(第4版)》](https://book.douban.com/subject/26767354/) + + 不建议当做入门书籍读,入门的话可以找点国人的书或者视频看。这本定位就相当于是关于Spring的新华字典,只有一些基本概念的介绍和示例,涵盖了Spring的各个方面,但都不够深入。就像作者在最后一页写的那样:“学习Spring,这才刚刚开始”。 + +- [《Java Web整合开发王者归来》](https://book.douban.com/subject/4189495/) + + 当时刚开始学的时候就是开的这本书,基本上是完完整整的看完了。不过,我不是很推荐大家看。这本书比较老了,里面很多东西都已经算是过时了。不过,这本书的一个很大优点是:基础知识点概括全面。 + +- :thumbsup: [《Redis实战》](https://book.douban.com/subject/26612779/) + + 如果你想了解Redis的一些概念性知识的话,这本书真的非常不错。 + +> ### 架构相关 + +- :thumbsup: [《大型网站技术架构:核心原理与案例分析+李智慧》](https://book.douban.com/subject/25723064/) + + 这本书我读过,基本不需要你有什么基础啊~读起来特别轻松,但是却可以学到很多东西,非常推荐了。另外我写过这本书的思维导图,关注我的微信公众号:“Java面试通关手册”回复“大型网站技术架构”即可领取思维导图。 + +- [《架构解密从分布式到微服务(Leaderus著)》](https://book.douban.com/subject/27081188/) + + 很一般的书籍,我就是当做课后图书来阅读的。 + +> ### 代码优化 + +- :thumbsup: [《重构_改善既有代码的设计》](https://book.douban.com/subject/4262627/) + + 豆瓣 9.1 分,重构书籍的开山鼻祖。 +> ### linux操作系统相关 +- :thumbsup:[<>](https://book.douban.com/subject/25900403/) :thumbsup: [<>](https://book.douban.com/subject/1500149/) + + 对于理解linux操作系统原理非常有用,同时可以打好个人的基本功力,面试中很多公司也会问到linux知识。 +> ### 课外书籍 + +《技术奇点》 :thumbsup:《追风筝的人》 :thumbsup:《穆斯林的葬礼》 :thumbsup:《三体》 《人工智能——李开复》 +:thumbsup:《活着——余华》 + + + + From 96669987b0a3f1a4bbf9c06e5dc476db27d0fb87 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:23:14 +0800 Subject: [PATCH 25/66] =?UTF-8?q?Create=20=E9=80=89=E6=8B=A9=E6=8A=80?= =?UTF-8?q?=E6=9C=AF=E6=96=B9=E5=90=91=E9=83=BD=E8=A6=81=E8=80=83=E8=99=91?= =?UTF-8?q?=E5=93=AA=E4=BA=9B=E5=9B=A0=E7=B4=A0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...择技术方向都要考虑哪些因素.md | 63 +++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 闲谈/选择技术方向都要考虑哪些因素.md diff --git a/闲谈/选择技术方向都要考虑哪些因素.md b/闲谈/选择技术方向都要考虑哪些因素.md new file mode 100644 index 00000000..fa39c7c1 --- /dev/null +++ b/闲谈/选择技术方向都要考虑哪些因素.md @@ -0,0 +1,63 @@ +本文主要是作者读安晓辉老师的《程序员程序员职场进阶 32 讲 》中关于“选择技术方向都要考虑哪些因素”这部分做的一些笔记和自己的思考。在这里分享给各位! + +### 选择一种技术可能会考虑到的决定因素 + +1. 就业机会 + + 选择一门就业面广的技术还是比较重要的。我的很多学PHP的同学现在都在培训班学Java,真的!!! +2. 难易程度 + + 我当时是在C/C++语言与Java中选择了Java,因为我感觉Java学起来确实要比C++简单一些。 +3. 个人兴趣 + + 兴趣是你能坚持下来的一个很重要的条件。 +4. 薪资水平 + + 薪资虽然不是人的唯一追求,但是一定是必备的追求。 +5. 发展前景 + + 你肯定不愿意看到这种情况发生:选择了一门技术,结果一年后它就没人用、没市场了。所以我们在选择时就要考虑这一点,做一些预判。 + + 选择技术时存在两种考虑:一种是选择稳定的、经典的技术;一种是卡位将来的市场缺口,选择将来可能需要用到的技术。 +6. 他人推荐 + + 我们在懵懵懂懂的时候,往往最容易听从别人的推荐,然后选择某种技术。 +7. 相近原则 + + 当我们已经掌握了一些技术,要学习新技术时,就可以根据一种新技术是否和自己已经掌握的技术比较接近来判断选择。相近的技术,学起来会更容易上手。 +8. 互补原则 + + 和相近性类似,互补性也常用在拓展我们技术能力的情景下。它指的是,有一些技术可以和你已经掌握的技术互相补充,组合在一起,形成更完整、更系统的技术图谱,给你带来更大的竞争力。关于相近原则与互补原则,我们也会在后面的文章里具体解读。 +9. 团队技术图谱 + + 我觉得这个可能就是团队开发过程中的需要。比如在做一个项目的时候,这个项目需要你去学习一下某个你没有接触过的新技术。 + +### 入行时如何选择技术方向 + + 为了明确自己的求职目标,可以问问自己下面的问题: +- 我想在哪个城市工作? +- 我想在哪些行业、领域发展? +- 我想去什么样的公司? +- 我想做什么样的产品? + +另外你要知道的是热门技术会有更多机会,相应竞争压力也会更大,并不能保证你找到合适的工作。 +冷门技术,机会相对较少,而且机会相对确定 。 + +### 构建技能树时如何选择技术方向 + +当我们过了专项能力提升的初级阶段之后,就应该开始构建自己的技能体系了。在为搭建技能树而选择技术时,通常考虑下面两个原则: +- 相近原则 +- 互补原则 + +“学习技术时一定要学对自己以后发展有用的技术”是我经常对自己强调的,另外我觉得很误导人同时也很错误的一个思想是:“只要是技术学了就会有用的”,这句话在我刚学编程时经常听到有人对我说。希望大家不要被误导,很多技术过时了就是过时了,没有必要再去花时间学。 + +我觉得相近原则和互补原则互补原则就是你主精和自己技术方向相同的的东西或者对自己技术领域有提升的东西。比如我目前暂时选择了Java为我的主要发展语言,所以我就要求自己大部分时间还是搞和Java相关的东西比如:Spring、SpingBoot、Dubbo、Mybatis等等。但是千万不要被语言所束缚,在业余时间我学的比较多的就是Python以及JS、C/C++/C#也会偶尔接触。因为我经常会接触前端另外我自己偶尔有爬虫需求或者需要用Python的一些第三库解决一些问题,所以我业余学Pyton以及JS就比较多一点,我觉得这两门技术也是对我现有技术的一个补充了。 + + +### 技术转型时的方向选择 + +我觉得对于技术转型主要有一下几点建议 + +- 与自己当前技术栈跨度不太大的领域,比如你做安卓的话转型可以选择做Java后端。 +- 真正适合自己去做的,并不是一味看着这个领域火了(比如人工智能),然后自己就不考虑实际的去转型到这个领域里去。 +- 技术转型方向尽量对自己以后的发展需要有帮助。 From 1eb877211f0bd9ed01df3510df05405eb7f7bfde Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Tue, 5 Mar 2019 11:25:38 +0800 Subject: [PATCH 26/66] Update README.md --- README.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index b4c42d09..37796204 100644 --- a/README.md +++ b/README.md @@ -185,10 +185,11 @@ ## :art: 闲谈 -* [选择技术方向都要考虑哪些因素](https://github.com/Snailclimb/Java-Guide/blob/master/其他/选择技术方向都要考虑哪些因素.md) -* [结束了我短暂的秋招,说点自己的感受](https://github.com/Snailclimb/JavaGuide/blob/master/%E5%85%B6%E4%BB%96/2018%20%E7%A7%8B%E6%8B%9B.md) -* [这7个问题,可能大部分Java程序员都比较关心吧!](https://github.com/Snailclimb/JavaGuide/blob/master/%E9%9D%A2%E8%AF%95%E5%BF%85%E5%A4%87/java%20programmer%20need%20know.md) -* [【2018总结】即使平凡,也要热爱自己的生活](https://github.com/Snailclimb/JavaGuide/blob/master/%E5%85%B6%E4%BB%96/2018%20summary.md) +* [选择技术方向都要考虑哪些因素](https://github.com/Snailclimb/Java-Guide/blob/master/闲谈/选择技术方向都要考虑哪些因素.md) +* [结束了我短暂的秋招,说点自己的感受](https://github.com/Snailclimb/JavaGuide/blob/master/闲谈/2018%20%E7%A7%8B%E6%8B%9B.md) +* [这7个问题,可能大部分Java程序员都比较关心吧!](https://github.com/Snailclimb/JavaGuide/blob/master/闲谈/java%20programmer%20need%20know.md) +* [【2018总结】即使平凡,也要热爱自己的生活](https://github.com/Snailclimb/JavaGuide/blob/master/闲谈/2018%20summary.md) +* [Java项目 Github Trending 月榜](https://github.com/Snailclimb/JavaGuide/blob/master/闲谈/JavaGithubTrending/JavaGithubTrending.md) *** From cb8d1ab923f630faa820cfe9ae706a3351af91c5 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:30:12 +0800 Subject: [PATCH 27/66] Create JavaProgrammerNeedKnow.md --- 面试必备/JavaProgrammerNeedKnow.md | 81 ++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 面试必备/JavaProgrammerNeedKnow.md diff --git a/面试必备/JavaProgrammerNeedKnow.md b/面试必备/JavaProgrammerNeedKnow.md new file mode 100644 index 00000000..ef111f4c --- /dev/null +++ b/面试必备/JavaProgrammerNeedKnow.md @@ -0,0 +1,81 @@ +  身边的朋友或者公众号的粉丝很多人都向我询问过:“我是双非/三本/专科学校的,我有机会进入大厂吗?”、“非计算机专业的学生能学好吗?”、“如何学习Java?”、“Java学习该学那些东西?”、“我该如何准备Java面试?”......这些方面的问题。我会根据自己的一点经验对大部分人关心的这些问题进行答疑解惑。现在又刚好赶上考研结束,这篇文章也算是给考研结束准备往Java后端方向发展的朋友们指名一条学习之路。道理懂了如果没有实际行动,那这篇文章对你或许没有任何意义。 + +### Question1:我是双非/三本/专科学校的,我有机会进入大厂吗? + +  我自己也是非985非211学校的,结合自己的经历以及一些朋友的经历,我觉得让我回答这个问题再好不过。 + +  首先,我觉得学校歧视很正常,真的太正常了,如果要抱怨的话,你只能抱怨自己没有进入名校。但是,千万不要动不动说自己学校差,动不动拿自己学校当做自己进不了大厂的借口,学历只是筛选简历的很多标准中的一个而已,如果你够优秀,简历够丰富,你也一样可以和名校同学一起同台竞争。 + +  企业HR肯定是更喜欢高学历的人,毕竟985,211优秀人才比例肯定比普通学校高很多,HR团队肯定会优先在这些学校里选。这就好比相亲,你是愿意在很多优秀的人中选一个优秀的,还是愿意在很多普通的人中选一个优秀的呢? +   +  双非本科甚至是二本、三本甚至是专科的同学也有很多进入大厂的,不过比率相比于名校的低很多而已。从大厂招聘的结果上看,高学历人才的数量占据大头,那些成功进入BAT、美团,京东,网易等大厂的双非本科甚至是二本、三本甚至是专科的同学往往是因为具备丰富的项目经历或者在某个含金量比较高的竞赛比如ACM中取得了不错的成绩。**一部分学历不突出但能力出众的面试者能够进入大厂并不是说明学历不重要,而是学历的软肋能够通过其他的优势来弥补。** 所以,如果你的学校不够好而你自己又想去大厂的话,建议你可以从这几点来做:**①尽量在面试前最好有一个可以拿的出手的项目;②有实习条件的话,尽早出去实习,实习经历也会是你的简历的一个亮点(有能力在大厂实习最佳!);③参加一些含金量比较高的比赛,拿不拿得到名次没关系,重在锻炼。** + + +### Question2:非计算机专业的学生能学好Java后台吗?我能进大厂吗? + +  当然可以!现在非科班的程序员很多,很大一部分原因是互联网行业的工资比较高。我们学校外面的培训班里面90%都是非科班,我觉得他们很多人学的都还不错。另外,我的一个朋友本科是机械专业,大一开始自学安卓,技术贼溜,在我看来他比大部分本科是计算机的同学学的还要好。参考Question1的回答,即使你是非科班程序员,如果你想进入大厂的话,你也可以通过自己的其他优势来弥补。 + +  我觉得我们不应该因为自己的专业给自己划界限或者贴标签,说实话,很多科班的同学可能并不如你,你以为科班的同学就会认真听讲吗?还不是几乎全靠自己课下自学!不过如果你是非科班的话,你想要学好,那么注定就要舍弃自己本专业的一些学习时间,这是无可厚非的。 + +  建议非科班的同学,首先要打好计算机基础知识基础:①计算机网络、②操作系统、③数据机构与算法,我个人觉得这3个对你最重要。这些东西就像是内功,对你以后的长远发展非常有用。当然,如果你想要进大厂的话,这些知识也是一定会被问到的。另外,“一定学好数据机构与算法!一定学好数据机构与算法!一定学好数据机构与算法!”,重要的东西说3遍。 + + + +### Question3: 我没有实习经历的话找工作是不是特别艰难? + +  没有实习经历没关系,只要你有拿得出手的项目或者大赛经历的话,你依然有可能拿到大厂的 offer 。笔主当时找工作的时候就没有实习经历以及大赛获奖经历,单纯就是凭借自己的项目经验撑起了整个面试。 + +  如果你既没有实习经历,又没有拿得出手的项目或者大赛经历的话,我觉得在简历关,除非你有其他特别的亮点,不然,你应该就会被刷。 + +### Question4: 我该如何准备面试呢?面试的注意事项有哪些呢? + +下面是我总结的一些准备面试的Tips以及面试必备的注意事项: + +1. **准备一份自己的自我介绍,面试的时候根据面试对象适当进行修改**(突出重点,突出自己的优势在哪里,切忌流水账); +2. **注意随身带上自己的成绩单和简历复印件;** (有的公司在面试前都会让你交一份成绩单和简历当做面试中的参考。) +3. **如果需要笔试就提前刷一些笔试题,大部分在线笔试的类型是选择题+编程题,有的还会有简答题。**(平时空闲时间多的可以刷一下笔试题目(牛客网上有很多),但是不要只刷面试题,不动手code,程序员不是为了考试而存在的。)另外,注意抓重点,因为题目太多了,但是有很多题目几乎次次遇到,像这样的题目一定要搞定。 +4. **提前准备技术面试。** 搞清楚自己面试中可能涉及哪些知识点、那些知识点是重点。面试中哪些问题会被经常问到、自己改如何回答。(强烈不推荐背题,第一:通过背这种方式你能记住多少?能记住多久?第二:背题的方式的学习很难坚持下去!) +5. **面试之前做好定向复习。** 也就是专门针对你要面试的公司来复习。比如你在面试之前可以在网上找找有没有你要面试的公司的面经。 +6. **准备好自己的项目介绍。** 如果有项目的话,技术面试第一步,面试官一般都是让你自己介绍一下你的项目。你可以从下面几个方向来考虑:①对项目整体设计的一个感受(面试官可能会让你画系统的架构图;②在这个项目中你负责了什么、做了什么、担任了什么角色;③ 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用;④项目描述中,最好可以体现自己的综合素质,比如你是如何协调项目组成员协同开发的或者在遇到某一个棘手的问题的时候你是如何解决的又或者说你在这个项目用了什么技术实现了什么功能比如:用redis做缓存提高访问速度和并发量、使用消息队列削峰和降流等等。 +7. **面试之后记得复盘。** 面试遭遇失败是很正常的事情,所以善于总结自己的失败原因才是最重要的。如果失败,不要灰心;如果通过,切勿狂喜。 + + +**一些还算不错的 Java面试/学习相关的仓库,相信对大家准备面试一定有帮助:**[盘点一下Github上开源的Java面试/学习相关的仓库,看完弄懂薪资至少增加10k](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484817&idx=1&sn=12f0c254a240c40c2ccab8314653216b&chksm=fd9853f0caefdae6d191e6bf085d44ab9c73f165e3323aa0362d830e420ccbfad93aa5901021&token=766994974&lang=zh_CN#rd) + +### Question5: 我该自学还是报培训班呢? + +  我本人更加赞同自学(你要知道去了公司可没人手把手教你了,而且几乎所有的公司都对培训班出生的有偏见。为什么有偏见,你学个东西还要去培训班,说明什么,同等水平下,你的自学能力以及自律能力一定是比不上自学的人的)。但是如果,你连每天在寝室坚持学上8个小时以上都坚持不了,或者总是容易半途而废的话,我还是推荐你去培训班。观望身边同学去培训班的,大多是非计算机专业或者是没有自律能力以及自学能力非常差的人。 + +  另外,如果自律能力不行,你也可以通过结伴学习、参加老师的项目等方式来督促自己学习。 + +  总结:去不去培训班主要还是看自己,如果自己能坚持自学就自学,坚持不下来就去培训班。 + +### Question6: 没有项目经历/博客/Github开源项目怎么办? + +  从现在开始做! + +  网上有很多非常不错的项目视频,你就跟着一步一步做,不光要做,还要改进,改善。另外,如果你的老师有相关 Java 后台项目的话,你也可以主动申请参与进来。 + +  如果有自己的博客,也算是简历上的一个亮点。建议可以在掘金、Segmentfault、CSDN等技术交流社区写博客,当然,你也可以自己搭建一个博客(采用 Hexo+Githu Pages 搭建非常简单)。写一些什么?学习笔记、实战内容、读书笔记等等都可以。 + +  多用 Github,用好 Github,上传自己不错的项目,写好 readme 文档,在其他技术社区做好宣传。相信你也会收获一个不错的开源项目! + + +### Question7: 大厂到底青睐什么样的应届生? + +  从阿里、腾讯等大厂招聘官网对于Java后端方向/后端方向的应届实习生的要求,我们大概可以总结归纳出下面这 4 点能给简历增加很多分数: + +- 参加过竞赛(含金量超高的是ACM); +- 对数据结构与算法非常熟练; +- 参与过实际项目(比如学校网站); +- 参与过某个知名的开源项目或者自己的某个开源项目很不错; + +  除了我上面说的这三点,在面试Java工程师的时候,下面几点也提升你的个人竞争力: + +- 熟悉Python、Shell、Perl等脚本语言; +- 熟悉 Java 优化,JVM调优; +- 熟悉 SOA 模式; +- 熟悉自己所用框架的底层知识比如Spring; +- 了解分布式一些常见的理论; +- 具备高并发开发经验;大数据开发经验等等。 + From 01dceb162f7d57ed2abb48eff144ea854d4fc3a1 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:30:16 +0800 Subject: [PATCH 28/66] Delete java programmer need know.md --- 面试必备/java programmer need know.md | 81 ----------------------- 1 file changed, 81 deletions(-) delete mode 100644 面试必备/java programmer need know.md diff --git a/面试必备/java programmer need know.md b/面试必备/java programmer need know.md deleted file mode 100644 index ef111f4c..00000000 --- a/面试必备/java programmer need know.md +++ /dev/null @@ -1,81 +0,0 @@ -  身边的朋友或者公众号的粉丝很多人都向我询问过:“我是双非/三本/专科学校的,我有机会进入大厂吗?”、“非计算机专业的学生能学好吗?”、“如何学习Java?”、“Java学习该学那些东西?”、“我该如何准备Java面试?”......这些方面的问题。我会根据自己的一点经验对大部分人关心的这些问题进行答疑解惑。现在又刚好赶上考研结束,这篇文章也算是给考研结束准备往Java后端方向发展的朋友们指名一条学习之路。道理懂了如果没有实际行动,那这篇文章对你或许没有任何意义。 - -### Question1:我是双非/三本/专科学校的,我有机会进入大厂吗? - -  我自己也是非985非211学校的,结合自己的经历以及一些朋友的经历,我觉得让我回答这个问题再好不过。 - -  首先,我觉得学校歧视很正常,真的太正常了,如果要抱怨的话,你只能抱怨自己没有进入名校。但是,千万不要动不动说自己学校差,动不动拿自己学校当做自己进不了大厂的借口,学历只是筛选简历的很多标准中的一个而已,如果你够优秀,简历够丰富,你也一样可以和名校同学一起同台竞争。 - -  企业HR肯定是更喜欢高学历的人,毕竟985,211优秀人才比例肯定比普通学校高很多,HR团队肯定会优先在这些学校里选。这就好比相亲,你是愿意在很多优秀的人中选一个优秀的,还是愿意在很多普通的人中选一个优秀的呢? -   -  双非本科甚至是二本、三本甚至是专科的同学也有很多进入大厂的,不过比率相比于名校的低很多而已。从大厂招聘的结果上看,高学历人才的数量占据大头,那些成功进入BAT、美团,京东,网易等大厂的双非本科甚至是二本、三本甚至是专科的同学往往是因为具备丰富的项目经历或者在某个含金量比较高的竞赛比如ACM中取得了不错的成绩。**一部分学历不突出但能力出众的面试者能够进入大厂并不是说明学历不重要,而是学历的软肋能够通过其他的优势来弥补。** 所以,如果你的学校不够好而你自己又想去大厂的话,建议你可以从这几点来做:**①尽量在面试前最好有一个可以拿的出手的项目;②有实习条件的话,尽早出去实习,实习经历也会是你的简历的一个亮点(有能力在大厂实习最佳!);③参加一些含金量比较高的比赛,拿不拿得到名次没关系,重在锻炼。** - - -### Question2:非计算机专业的学生能学好Java后台吗?我能进大厂吗? - -  当然可以!现在非科班的程序员很多,很大一部分原因是互联网行业的工资比较高。我们学校外面的培训班里面90%都是非科班,我觉得他们很多人学的都还不错。另外,我的一个朋友本科是机械专业,大一开始自学安卓,技术贼溜,在我看来他比大部分本科是计算机的同学学的还要好。参考Question1的回答,即使你是非科班程序员,如果你想进入大厂的话,你也可以通过自己的其他优势来弥补。 - -  我觉得我们不应该因为自己的专业给自己划界限或者贴标签,说实话,很多科班的同学可能并不如你,你以为科班的同学就会认真听讲吗?还不是几乎全靠自己课下自学!不过如果你是非科班的话,你想要学好,那么注定就要舍弃自己本专业的一些学习时间,这是无可厚非的。 - -  建议非科班的同学,首先要打好计算机基础知识基础:①计算机网络、②操作系统、③数据机构与算法,我个人觉得这3个对你最重要。这些东西就像是内功,对你以后的长远发展非常有用。当然,如果你想要进大厂的话,这些知识也是一定会被问到的。另外,“一定学好数据机构与算法!一定学好数据机构与算法!一定学好数据机构与算法!”,重要的东西说3遍。 - - - -### Question3: 我没有实习经历的话找工作是不是特别艰难? - -  没有实习经历没关系,只要你有拿得出手的项目或者大赛经历的话,你依然有可能拿到大厂的 offer 。笔主当时找工作的时候就没有实习经历以及大赛获奖经历,单纯就是凭借自己的项目经验撑起了整个面试。 - -  如果你既没有实习经历,又没有拿得出手的项目或者大赛经历的话,我觉得在简历关,除非你有其他特别的亮点,不然,你应该就会被刷。 - -### Question4: 我该如何准备面试呢?面试的注意事项有哪些呢? - -下面是我总结的一些准备面试的Tips以及面试必备的注意事项: - -1. **准备一份自己的自我介绍,面试的时候根据面试对象适当进行修改**(突出重点,突出自己的优势在哪里,切忌流水账); -2. **注意随身带上自己的成绩单和简历复印件;** (有的公司在面试前都会让你交一份成绩单和简历当做面试中的参考。) -3. **如果需要笔试就提前刷一些笔试题,大部分在线笔试的类型是选择题+编程题,有的还会有简答题。**(平时空闲时间多的可以刷一下笔试题目(牛客网上有很多),但是不要只刷面试题,不动手code,程序员不是为了考试而存在的。)另外,注意抓重点,因为题目太多了,但是有很多题目几乎次次遇到,像这样的题目一定要搞定。 -4. **提前准备技术面试。** 搞清楚自己面试中可能涉及哪些知识点、那些知识点是重点。面试中哪些问题会被经常问到、自己改如何回答。(强烈不推荐背题,第一:通过背这种方式你能记住多少?能记住多久?第二:背题的方式的学习很难坚持下去!) -5. **面试之前做好定向复习。** 也就是专门针对你要面试的公司来复习。比如你在面试之前可以在网上找找有没有你要面试的公司的面经。 -6. **准备好自己的项目介绍。** 如果有项目的话,技术面试第一步,面试官一般都是让你自己介绍一下你的项目。你可以从下面几个方向来考虑:①对项目整体设计的一个感受(面试官可能会让你画系统的架构图;②在这个项目中你负责了什么、做了什么、担任了什么角色;③ 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用;④项目描述中,最好可以体现自己的综合素质,比如你是如何协调项目组成员协同开发的或者在遇到某一个棘手的问题的时候你是如何解决的又或者说你在这个项目用了什么技术实现了什么功能比如:用redis做缓存提高访问速度和并发量、使用消息队列削峰和降流等等。 -7. **面试之后记得复盘。** 面试遭遇失败是很正常的事情,所以善于总结自己的失败原因才是最重要的。如果失败,不要灰心;如果通过,切勿狂喜。 - - -**一些还算不错的 Java面试/学习相关的仓库,相信对大家准备面试一定有帮助:**[盘点一下Github上开源的Java面试/学习相关的仓库,看完弄懂薪资至少增加10k](https://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484817&idx=1&sn=12f0c254a240c40c2ccab8314653216b&chksm=fd9853f0caefdae6d191e6bf085d44ab9c73f165e3323aa0362d830e420ccbfad93aa5901021&token=766994974&lang=zh_CN#rd) - -### Question5: 我该自学还是报培训班呢? - -  我本人更加赞同自学(你要知道去了公司可没人手把手教你了,而且几乎所有的公司都对培训班出生的有偏见。为什么有偏见,你学个东西还要去培训班,说明什么,同等水平下,你的自学能力以及自律能力一定是比不上自学的人的)。但是如果,你连每天在寝室坚持学上8个小时以上都坚持不了,或者总是容易半途而废的话,我还是推荐你去培训班。观望身边同学去培训班的,大多是非计算机专业或者是没有自律能力以及自学能力非常差的人。 - -  另外,如果自律能力不行,你也可以通过结伴学习、参加老师的项目等方式来督促自己学习。 - -  总结:去不去培训班主要还是看自己,如果自己能坚持自学就自学,坚持不下来就去培训班。 - -### Question6: 没有项目经历/博客/Github开源项目怎么办? - -  从现在开始做! - -  网上有很多非常不错的项目视频,你就跟着一步一步做,不光要做,还要改进,改善。另外,如果你的老师有相关 Java 后台项目的话,你也可以主动申请参与进来。 - -  如果有自己的博客,也算是简历上的一个亮点。建议可以在掘金、Segmentfault、CSDN等技术交流社区写博客,当然,你也可以自己搭建一个博客(采用 Hexo+Githu Pages 搭建非常简单)。写一些什么?学习笔记、实战内容、读书笔记等等都可以。 - -  多用 Github,用好 Github,上传自己不错的项目,写好 readme 文档,在其他技术社区做好宣传。相信你也会收获一个不错的开源项目! - - -### Question7: 大厂到底青睐什么样的应届生? - -  从阿里、腾讯等大厂招聘官网对于Java后端方向/后端方向的应届实习生的要求,我们大概可以总结归纳出下面这 4 点能给简历增加很多分数: - -- 参加过竞赛(含金量超高的是ACM); -- 对数据结构与算法非常熟练; -- 参与过实际项目(比如学校网站); -- 参与过某个知名的开源项目或者自己的某个开源项目很不错; - -  除了我上面说的这三点,在面试Java工程师的时候,下面几点也提升你的个人竞争力: - -- 熟悉Python、Shell、Perl等脚本语言; -- 熟悉 Java 优化,JVM调优; -- 熟悉 SOA 模式; -- 熟悉自己所用框架的底层知识比如Spring; -- 了解分布式一些常见的理论; -- 具备高并发开发经验;大数据开发经验等等。 - From efe8d4770f1e117a6e447b886a251fb116db0ba3 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Tue, 5 Mar 2019 11:30:54 +0800 Subject: [PATCH 29/66] Update README.md --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 37796204..54933109 100644 --- a/README.md +++ b/README.md @@ -166,8 +166,9 @@ * [【备战面试1】程序员的简历就该这样写](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/程序员的简历之道.md) * [【备战面试2】初出茅庐的程序员该如何准备面试?](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/interviewPrepare.md) -* [【备战面试3】Java程序员必备书单](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/books.md) -* [【备战面试4】美团面试常见问题总结(附详解答案)](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/美团面试常见问题总结.md) +* [【备战面试3】初出茅庐的程序员该如何准备面试?](https://github.com/Snailclimb/JavaGuide/blob/master/面试必备/JavaProgrammerNeedKnow.md) +* [【备战面试4】Java程序员必备书单](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/books.md) +* [【备战面试5】美团面试常见问题总结(附详解答案)](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/美团面试常见问题总结.md) ### 最最最常见的Java面试题总结 @@ -187,7 +188,6 @@ * [选择技术方向都要考虑哪些因素](https://github.com/Snailclimb/Java-Guide/blob/master/闲谈/选择技术方向都要考虑哪些因素.md) * [结束了我短暂的秋招,说点自己的感受](https://github.com/Snailclimb/JavaGuide/blob/master/闲谈/2018%20%E7%A7%8B%E6%8B%9B.md) -* [这7个问题,可能大部分Java程序员都比较关心吧!](https://github.com/Snailclimb/JavaGuide/blob/master/闲谈/java%20programmer%20need%20know.md) * [【2018总结】即使平凡,也要热爱自己的生活](https://github.com/Snailclimb/JavaGuide/blob/master/闲谈/2018%20summary.md) * [Java项目 Github Trending 月榜](https://github.com/Snailclimb/JavaGuide/blob/master/闲谈/JavaGithubTrending/JavaGithubTrending.md) From a37eec46726fbae16148f56976cfb5dc60f7f834 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Tue, 5 Mar 2019 11:31:59 +0800 Subject: [PATCH 30/66] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 54933109..72f8601f 100644 --- a/README.md +++ b/README.md @@ -166,7 +166,7 @@ * [【备战面试1】程序员的简历就该这样写](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/程序员的简历之道.md) * [【备战面试2】初出茅庐的程序员该如何准备面试?](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/interviewPrepare.md) -* [【备战面试3】初出茅庐的程序员该如何准备面试?](https://github.com/Snailclimb/JavaGuide/blob/master/面试必备/JavaProgrammerNeedKnow.md) +* [【备战面试3】7个大部分程序员在面试前很关心的问题](https://github.com/Snailclimb/JavaGuide/blob/master/面试必备/JavaProgrammerNeedKnow.md) * [【备战面试4】Java程序员必备书单](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/books.md) * [【备战面试5】美团面试常见问题总结(附详解答案)](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/美团面试常见问题总结.md) From 8f1c6a107804697b6d8d5929b8057e08651db26a Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 11:36:02 +0800 Subject: [PATCH 31/66] Update JavaGithubTrending.md --- 闲谈/JavaGithubTrending/JavaGithubTrending.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/闲谈/JavaGithubTrending/JavaGithubTrending.md b/闲谈/JavaGithubTrending/JavaGithubTrending.md index 203710cb..229f6d2b 100644 --- a/闲谈/JavaGithubTrending/JavaGithubTrending.md +++ b/闲谈/JavaGithubTrending/JavaGithubTrending.md @@ -1,2 +1,4 @@ -### 2019 年一月 +- [2018 年 12 月](https://github.com/Snailclimb/JavaGuide/blob/master/闲谈/JavaGithubTrending/2018-12.md) +- [2019 年 1 月](https://github.com/Snailclimb/JavaGuide/blob/master/闲谈/JavaGithubTrending/2019-1.md) +- [2019 年 2 月](https://github.com/Snailclimb/JavaGuide/blob/master/闲谈/JavaGithubTrending/2019-2.md) From 9f1fcc236aad537812c517f1171497bcac4c8f99 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Tue, 5 Mar 2019 15:30:27 +0800 Subject: [PATCH 32/66] Update LinkedList.md --- Java相关/LinkedList.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Java相关/LinkedList.md b/Java相关/LinkedList.md index 15f67f88..31f5f483 100644 --- a/Java相关/LinkedList.md +++ b/Java相关/LinkedList.md @@ -288,7 +288,7 @@ public int lastIndexOf(Object o) { return indexOf(o) != -1; } ``` -###删除方法 +### 删除方法 **remove()** ,**removeFirst(),pop():** 删除头节点 ``` public E pop() { From ddbb405b87b5e26c0821d0104a3fc67435f8acc8 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 15:43:15 +0800 Subject: [PATCH 33/66] =?UTF-8?q?Update=20Java=E5=9F=BA=E7=A1=80=E7=9F=A5?= =?UTF-8?q?=E8=AF=86->=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Java相关/Java基础知识.md | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/Java相关/Java基础知识.md b/Java相关/Java基础知识.md index 57fa9906..68549209 100644 --- a/Java相关/Java基础知识.md +++ b/Java相关/Java基础知识.md @@ -412,9 +412,9 @@ final关键字主要用在三个地方:变量、方法、类。 ### 异常处理总结 -- try 块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。 -- catch 块:用于处理try捕获到的异常。 -- finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。 +- **try 块:**用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。 +- **catch 块:**用于处理try捕获到的异常。 +- **finally 块:**无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。 **在以下4种特殊情况下,finally块不会被执行:** @@ -423,6 +423,18 @@ final关键字主要用在三个地方:变量、方法、类。 3. 程序所在的线程死亡。 4. 关闭CPU。 +下面这部分内容来自issue:。 + +**关于返回值:** + +如果try语句里有return,返回的是try语句块中变量值。 +详细执行过程如下: + +1. 如果有返回值,就把返回值保存到局部变量中; +2. 执行jsr指令跳到finally语句里执行; +3. 执行完finally语句后,返回之前保存在局部变量表里的值。 +4. 如果try,finally语句里均有return,忽略try的return,而使用finally的return. + ## 33 Java序列化中如果有些字段不想进行序列化 怎么办 对于不想进行序列化的变量,使用transient关键字修饰。 From 940982ebffa5f376b6baddeaf9ed41c91217a6b6 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Tue, 5 Mar 2019 15:45:25 +0800 Subject: [PATCH 34/66] =?UTF-8?q?Add=20=E8=AE=BE=E8=AE=A1=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F->=E7=9B=AE=E5=BD=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 72f8601f..b85c09e1 100644 --- a/README.md +++ b/README.md @@ -22,6 +22,7 @@ * [Java 多线程](#java-多线程) * [Java BIO,NIO,AIO](#java-bionioaio) * [Java 虚拟机 jvm](#java-虚拟机-jvm) + * [设计模式](#设计模式) * [:open_file_folder: 数据结构与算法](#open_file_folder-数据结构与算法) * [数据结构](#数据结构) * [算法](#算法) From 27c9cc2b18d08de60878c11de6b755da3af938fb Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 16:34:51 +0800 Subject: [PATCH 35/66] =?UTF-8?q?Update=20=E8=AE=BE=E8=AE=A1=E6=A8=A1?= =?UTF-8?q?=E5=BC=8F=E6=94=B9=E7=89=88=E4=B8=8E=E5=86=85=E5=AE=B9=E5=AE=8C?= =?UTF-8?q?=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Java相关/设计模式.md | 106 +++++++++++-------------------------- 1 file changed, 32 insertions(+), 74 deletions(-) diff --git a/Java相关/设计模式.md b/Java相关/设计模式.md index c36bb237..e3e95860 100644 --- a/Java相关/设计模式.md +++ b/Java相关/设计模式.md @@ -1,36 +1,28 @@ +# Java 设计模式 + 下面是自己学习设计模式的时候做的总结,有些是自己的原创文章,有些是网上写的比较好的文章,保存下来细细消化吧! -## 创建型模式: +**系列文章推荐:** -> ### 创建型模式概述: +## 创建型模式 + +### 创建型模式概述 - 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系统的设计更加符合单一职责原则。 - 创建型模式在创建什么(What),由谁创建(Who),何时创建(When)等方面都为软件设计者提供了尽可能大的灵活性。创建型模式隐藏了类的实例的创建细节,通过隐藏对象如何被创建和组合在一起达到使整个系统独立的目的。 ![创建型模式](https://user-gold-cdn.xitu.io/2018/6/16/1640641afcb7559b?w=491&h=241&f=png&s=51443) -> ### 创建型模式系列文章推荐: +### 常见创建型模式详解 -- **单例模式:** +- **单例模式:** [深入理解单例模式——只有一个实例](https://blog.csdn.net/qq_34337272/article/details/80455972) +- **工厂模式:** [深入理解工厂模式——由对象工厂生成对象](https://blog.csdn.net/qq_34337272/article/details/80472071) +- **建造者模式:** [深入理解建造者模式 ——组装复杂的实例](http://blog.csdn.net/qq_34337272/article/details/80540059) +- **原型模式:** [深入理解原型模式 ——通过复制生成实例](https://blog.csdn.net/qq_34337272/article/details/80706444) -[深入理解单例模式——只有一个实例](https://blog.csdn.net/qq_34337272/article/details/80455972) +## 结构型模式 -- **工厂模式:** - -[深入理解工厂模式——由对象工厂生成对象](https://blog.csdn.net/qq_34337272/article/details/80472071) - -- **建造者模式:** - -[深入理解建造者模式 ——组装复杂的实例](http://blog.csdn.net/qq_34337272/article/details/80540059) - -- **原型模式:** - -[深入理解原型模式 ——通过复制生成实例](https://blog.csdn.net/qq_34337272/article/details/80706444) - - -## 结构型模式: - -> ### 结构型模式概述: +### 结构型模式概述 - **结构型模式(Structural Pattern):** 描述如何将类或者对象结合在一起形成更大的结构,就像搭积木,可以通过简单积木的组合形成复杂的、功能更为强大的结构 ![结构型模式(Structural Pattern)](https://user-gold-cdn.xitu.io/2018/6/16/164064d6b3c205e3?w=719&h=233&f=png&s=270293) @@ -40,48 +32,25 @@ ![结构型模式](https://user-gold-cdn.xitu.io/2018/6/16/1640655459d766d2?w=378&h=266&f=png&s=59652) -> ### 结构型模式系列文章推荐: +### 常见结构型模式详解 - **适配器模式:** - -[深入理解适配器模式——加个“适配器”以便于复用](https://segmentfault.com/a/1190000011856448) - -[适配器模式原理及实例介绍-IBM](https://www.ibm.com/developerworks/cn/java/j-lo-adapter-pattern/index.html) - -- **桥接模式:** - -[设计模式笔记16:桥接模式(Bridge Pattern)](https://blog.csdn.net/yangzl2008/article/details/7670996) - -- **组合模式:** - -[大话设计模式—组合模式](https://blog.csdn.net/lmb55/article/details/51039781) - -- **装饰模式:** - -[java模式—装饰者模式](https://www.cnblogs.com/chenxing818/p/4705919.html) - -[Java设计模式-装饰者模式](https://blog.csdn.net/cauchyweierstrass/article/details/48240147) - -- **外观模式:** - -[java设计模式之外观模式(门面模式)](https://www.cnblogs.com/lthIU/p/5860607.html) - -- **享元模式:** - -[享元模式](http://www.jasongj.com/design_pattern/flyweight/) - + - [深入理解适配器模式——加个“适配器”以便于复用](https://segmentfault.com/a/1190000011856448) + - [适配器模式原理及实例介绍-IBM](https://www.ibm.com/developerworks/cn/java/j-lo-adapter-pattern/index.html) +- **桥接模式:** [设计模式笔记16:桥接模式(Bridge Pattern)](https://blog.csdn.net/yangzl2008/article/details/7670996) +- **组合模式:** [大话设计模式—组合模式](https://blog.csdn.net/lmb55/article/details/51039781) +- **装饰模式:** [java模式—装饰者模式](https://www.cnblogs.com/chenxing818/p/4705919.html)、[Java设计模式-装饰者模式](https://blog.csdn.net/cauchyweierstrass/article/details/48240147) +- **外观模式:** [java设计模式之外观模式(门面模式)](https://www.cnblogs.com/lthIU/p/5860607.html) +- **享元模式:** [享元模式](http://www.jasongj.com/design_pattern/flyweight/) - **代理模式:** - -[代理模式原理及实例讲解 (IBM出品,很不错)](https://www.ibm.com/developerworks/cn/java/j-lo-proxy-pattern/index.html) - -[轻松学,Java 中的代理模式及动态代理](https://blog.csdn.net/briblue/article/details/73928350) - -[Java代理模式及其应用](https://blog.csdn.net/justloveyou_/article/details/74203025) + - [代理模式原理及实例讲解 (IBM出品,很不错)](https://www.ibm.com/developerworks/cn/java/j-lo-proxy-pattern/index.html) + - [轻松学,Java 中的代理模式及动态代理](https://blog.csdn.net/briblue/article/details/73928350) + - [Java代理模式及其应用](https://blog.csdn.net/justloveyou_/article/details/74203025) ## 行为型模式 -> ### 行为型模式概述: +### 行为型模式概述 - 行为型模式(Behavioral Pattern)是对在不同的对象之间划分责任和算法的抽象化。 - 行为型模式不仅仅关注类和对象的结构,而且重点关注它们之间的相互作用。 @@ -95,27 +64,16 @@ ![行为型模式](https://user-gold-cdn.xitu.io/2018/6/28/164467dd92c6172c?w=453&h=269&f=png&s=63270) - **职责链模式:** - -[Java设计模式之责任链模式、职责链模式](https://blog.csdn.net/jason0539/article/details/45091639) - -[责任链模式实现的三种方式](https://www.cnblogs.com/lizo/p/7503862.html) - -- **命令模式:** - - - -- **解释器模式:** +- [Java设计模式之责任链模式、职责链模式](https://blog.csdn.net/jason0539/article/details/45091639) +- [责任链模式实现的三种方式](https://www.cnblogs.com/lizo/p/7503862.html) +- **命令模式:** 在软件设计中,我们经常需要向某些对象发送请求,但是并不知道请求的接收者是谁,也不知道被请求的操作是哪个,我们只需在程序运行时指定具体的请求接收者即可,此时,可以使用命令模式来进行设计,使得请求发送者与请求接收者消除彼此之间的耦合,让对象之间的调用关系更加灵活。命令模式可以对发送者和接收者完全解耦,发送者与接收者之间没有直接引用关系,发送请求的对象只需要知道如何发送请求,而不必知道如何完成请求。这就是命令模式的模式动机。 +- **解释器模式:** - **迭代器模式:** - **中介者模式:** - **备忘录模式:** -- **观察者模式:** - -观察者模式也是非常常用的设计模式,下面这个博客简单介绍了观察者模式的简单定义、解决了一个什么问题,用一个气象站和气象看板的例子去描述一对多的关系中观察者模式的应用,并且还介绍了jdk内置的观察者模式接口。 - -[Java设计模式之观察者模式](https://zhanglijun1217.github.io/blog/2018/12/24/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F%E2%80%94%E2%80%94%E8%A7%82%E5%AF%9F%E8%80%85%E6%A8%A1%E5%BC%8F-md/) - -- **状态模式:** -- **策略模式:** +- **观察者模式:** +- **状态模式:** +- **策略模式:** 策略模式作为设计原则中开闭原则最典型的体现,也是经常使用的。下面这篇博客介绍了策略模式一般的组成部分和概念,并用了一个小demo去说明了策略模式的应用。 From ac8281c70eb058e989b17b33e768cf57ced8a4ff Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Tue, 5 Mar 2019 16:54:13 +0800 Subject: [PATCH 36/66] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index b85c09e1..342a1586 100644 --- a/README.md +++ b/README.md @@ -48,6 +48,7 @@ ## 待办 * [ ] Java 8 新特性总结 +* [ ] Java 多线程类别知识重构 * [x] BIO,NIO,AIO 总结 * [ ] Netty 总结 * [ ] 数据结构总结重构 From f96aaa0c805e6ecaaddf795be7bbe109bfb8a357 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Tue, 5 Mar 2019 16:54:40 +0800 Subject: [PATCH 37/66] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 342a1586..352c4659 100644 --- a/README.md +++ b/README.md @@ -73,7 +73,6 @@ ### Java 多线程 -* [多线程系列文章](https://github.com/Snailclimb/Java_Guide/blob/master/Java相关/多线程系列.md) * [并发编程面试必备:synchronized 关键字使用、底层原理、JDK1.6 之后的底层优化以及 和ReenTrantLock 的对比](https://github.com/Snailclimb/Java_Guide/blob/master/Java相关/synchronized.md) * [并发编程面试必备:乐观锁与悲观锁](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/面试必备之乐观锁与悲观锁.md) * [并发编程面试必备:JUC 中的 Atomic 原子类总结](https://github.com/Snailclimb/Java_Guide/blob/master/Java相关/Multithread/Atomic.md) From 24b1842fb4ebbdfee56c1ede0899b65349721e2e Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Tue, 5 Mar 2019 18:02:47 +0800 Subject: [PATCH 38/66] Update Atomic.md --- Java相关/Multithread/Atomic.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/Java相关/Multithread/Atomic.md b/Java相关/Multithread/Atomic.md index 5c794055..33dd7ef3 100644 --- a/Java相关/Multithread/Atomic.md +++ b/Java相关/Multithread/Atomic.md @@ -20,7 +20,7 @@ Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是 使用原子的方式更新基本类型 -- AtomicInteger:整形原子类 +- AtomicInteger:整型原子类 - AtomicLong:长整型原子类 - AtomicBoolean :布尔型原子类 @@ -29,8 +29,8 @@ Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是 使用原子的方式更新数组里的某个元素 -- AtomicIntegerArray:整形数组原子类 -- AtomicLongArray:长整形数组原子类 +- AtomicIntegerArray:整型数组原子类 +- AtomicLongArray:长整型数组原子类 - AtomicReferenceArray :引用类型数组原子类 **引用类型** @@ -41,8 +41,8 @@ Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是 **对象的属性修改类型** -- AtomicIntegerFieldUpdater:原子更新整形字段的更新器 -- AtomicLongFieldUpdater:原子更新长整形字段的更新器 +- AtomicIntegerFieldUpdater:原子更新整型字段的更新器 +- AtomicLongFieldUpdater:原子更新长整型字段的更新器 - AtomicStampedReference :原子更新带有版本号的引用类型。该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。 下面我们来详细介绍一下这些原子类。 @@ -53,7 +53,7 @@ Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是 使用原子的方式更新基本类型 -- AtomicInteger:整形原子类 +- AtomicInteger:整型原子类 - AtomicLong:长整型原子类 - AtomicBoolean :布尔型原子类 From 0df0d81e5e760116280e5b837db09a49bdd4630f Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Tue, 5 Mar 2019 18:04:31 +0800 Subject: [PATCH 39/66] =?UTF-8?q?Fix=20=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Java相关/Multithread/AQS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Java相关/Multithread/AQS.md b/Java相关/Multithread/AQS.md index 3717be6c..f405db1f 100644 --- a/Java相关/Multithread/AQS.md +++ b/Java相关/Multithread/AQS.md @@ -37,7 +37,7 @@ AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效 ### 2 AQS 原理 -> 在面试中被问到并发知识的时候,大多都会被问到“请你说一下自己对于AQS原理的理解”。下面给大家一个示例供大家参加,面试不是背题,大家一定要假如自己的思想,即使加入不了自己的思想也要保证自己能够通俗的讲出来而不是背出来。 +> 在面试中被问到并发知识的时候,大多都会被问到“请你说一下自己对于AQS原理的理解”。下面给大家一个示例供大家参加,面试不是背题,大家一定要加入自己的思想,即使加入不了自己的思想也要保证自己能够通俗的讲出来而不是背出来。 下面大部分内容其实在AQS类注释上已经给出了,不过是英语看着比较吃力一点,感兴趣的话可以看看源码。 From 55f795eaa88f3eeee3edc53a8fc30c8026d0229e Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Tue, 5 Mar 2019 18:16:03 +0800 Subject: [PATCH 40/66] =?UTF-8?q?Update=20Java=E5=9F=BA=E7=A1=80=E7=9F=A5?= =?UTF-8?q?=E8=AF=86->=E5=BC=82=E5=B8=B8=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Java相关/Java基础知识.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Java相关/Java基础知识.md b/Java相关/Java基础知识.md index 68549209..6b73f6e6 100644 --- a/Java相关/Java基础知识.md +++ b/Java相关/Java基础知识.md @@ -418,8 +418,8 @@ final关键字主要用在三个地方:变量、方法、类。 **在以下4种特殊情况下,finally块不会被执行:** -1. 在finally语句块中发生了异常。 -2. 在前面的代码中用了System.exit()退出程序。 +1. 在finally语句块第一行发生了异常。 因为在其他行,finally块还是会得到执行 +2. 在前面的代码中用了System.exit(int)已退出程序。 exit是带参函数 ;若该语句在异常语句之后,finally会执行 3. 程序所在的线程死亡。 4. 关闭CPU。 From eef1a519a8b0ead793128909f888f5947e8bbd17 Mon Sep 17 00:00:00 2001 From: forsweet Date: Wed, 6 Mar 2019 11:55:23 +0800 Subject: [PATCH 41/66] =?UTF-8?q?fix=20topic=E7=B1=BB=E5=9E=8B=E9=80=9A?= =?UTF-8?q?=E9=85=8D=E7=AC=A6=E5=8F=B7=E8=AF=B4=E6=98=8E=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- 计算机网络与数据通信/rabbitmq.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/计算机网络与数据通信/rabbitmq.md b/计算机网络与数据通信/rabbitmq.md index 7b1508f4..1ac6504c 100644 --- a/计算机网络与数据通信/rabbitmq.md +++ b/计算机网络与数据通信/rabbitmq.md @@ -123,7 +123,7 @@ direct 类型常用在处理有优先级的任务,根据任务的优先级把 - RoutingKey 为一个点号“.”分隔的字符串(被点号“.”分隔开的每一段独立的字符串称为一个单词),如 “com.rabbitmq.client”、“java.util.concurrent”、“com.hidden.client”; - BindingKey 和 RoutingKey 一样也是点号“.”分隔的字符串; -- BindingKey 中可以存在两种特殊字符串“*”和“#”,用于做模糊匹配,其中“#”用于匹配一个单词,“#”用于匹配多规格单词(可以是零个)。 +- BindingKey 中可以存在两种特殊字符串“*”和“#”,用于做模糊匹配,其中“.”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)。 ![topic 类型交换器](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-12-16/73843.jpg) From ff4e445583bf777985a51efda033787ff10f9cc5 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Wed, 6 Mar 2019 13:38:35 +0800 Subject: [PATCH 42/66] =?UTF-8?q?Update=20Java=E5=86=85=E5=AD=98=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Java内存区域图片我重新画了一遍! --- ...能是把Java内存区域讲的最清楚的一篇文章.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md b/Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md index 5235ba73..b208daf5 100644 --- a/Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md +++ b/Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md @@ -115,7 +115,7 @@ HotSpot 虚拟机中方法区也常被称为 **“永久代”**,本质上两 ### 2.7 直接内存 -直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。而且也可能导致OutOfMemoryError异常出现。 +直接内存并不是虚拟机运行时数据区的一部分,也不是虚拟机规范中定义的内存区域,但是这部分内存也被频繁地使用。而且也可能导致 OutOfMemoryError 异常出现。 JDK1.4中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**通道(Channel)** 与**缓存区(Buffer)** 的 I/O 方式,它可以直接使用Native函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样就能在一些场景中显著提高性能,因为**避免了在 Java 堆和 Native 堆之间来回复制数据**。 @@ -139,7 +139,7 @@ JDK1.4中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**通 选择以上两种方式中的哪一种,取决于 Java 堆内存是否规整。而 Java 堆内存是否规整,取决于 GC 收集器的算法是"标记-清除",还是"标记-整理"(也称作"标记-压缩"),值得注意的是,复制算法内存也是规整的 ![](https://user-gold-cdn.xitu.io/2018/8/22/16561e59a40a2c3d?w=1426&h=333&f=png&s=26346) - + **内存分配并发问题(补充内容,需要掌握)** 在创建对象的时候有一个很重要的问题,就是线程安全,因为在实际开发过程中,创建对象是很频繁的事情,作为虚拟机来说,必须要保证线程是安全的,通常来讲,虚拟机采用两种方式来保证线程安全: From d3bb1ffedc5b8b6f9c7a09fd68bb45dc6e1a176c Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Wed, 6 Mar 2019 13:40:53 +0800 Subject: [PATCH 43/66] =?UTF-8?q?Update=20Java=E5=86=85=E5=AD=98=E5=8C=BA?= =?UTF-8?q?=E5=9F=9F=E5=9B=BE=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Java内存区域图片我重新画了一遍! --- ...能是把Java内存区域讲的最清楚的一篇文章.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md b/Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md index b208daf5..61d5e722 100644 --- a/Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md +++ b/Java相关/可能是把Java内存区域讲的最清楚的一篇文章.md @@ -21,7 +21,8 @@ ## 2 运行时数据区域 Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成若干个不同的数据区域。 -![运行时数据区域](https://user-gold-cdn.xitu.io/2018/4/27/16306a34cd8a4354?w=513&h=404&f=png&s=132068) +![](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3/JVM运行时数据区域.png) + 这些组成部分一些是线程私有的,其他的则是线程共享的。 **线程私有的:** From 09ef847fcd0e9241eb41b460449c74f2c65e360b Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Wed, 6 Mar 2019 16:33:40 +0800 Subject: [PATCH 44/66] =?UTF-8?q?Add=20QQ=E7=BE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 352c4659..79c65f15 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,7 @@ # Java 学习/面试指南 +[![QQ群](https://img.shields.io/badge/QQ%E7%BE%A4-959442351-blue.svg)](https://jq.qq.com/?_wv=1027&k=5tjF8vk). +

From 8e6c79940e5063d87ef44e93950ea0ccb0a94c4b Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Wed, 6 Mar 2019 19:50:03 +0800 Subject: [PATCH 45/66] =?UTF-8?q?Update:QQ=E7=BE=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 79c65f15..17eeb6ed 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Java 学习/面试指南 -[![QQ群](https://img.shields.io/badge/QQ%E7%BE%A4-959442351-blue.svg)](https://jq.qq.com/?_wv=1027&k=5tjF8vk). +工作一年以上的朋友可以加这个群,群内有免费Java进阶架构师资料:[![QQ群](https://img.shields.io/badge/QQ%E7%BE%A4-959442351-blue.svg)](https://jq.qq.com/?_wv=1027&k=5tjF8vk).
From 7368e2f7c4ff2cfd27fc0c464d71310a93e7e293 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Thu, 7 Mar 2019 13:20:43 +0800 Subject: [PATCH 46/66] =?UTF-8?q?Update=20=E7=BA=BF=E7=A8=8B=E6=9C=89?= =?UTF-8?q?=E5=93=AA=E4=BA=9B=E7=8A=B6=E6=80=81=3F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Java相关/Java基础知识.md | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/Java相关/Java基础知识.md b/Java相关/Java基础知识.md index 6b73f6e6..8b438eb1 100644 --- a/Java相关/Java基础知识.md +++ b/Java相关/Java基础知识.md @@ -370,16 +370,26 @@ hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返 ## 30. 线程有哪些基本状态? -参考《Java 并发编程艺术》4.1.4节。 - -Java 线程在运行的生命周期中的指定时刻只可能处于下面6种不同状态的其中一个状态。 +Java 线程在运行的生命周期中的指定时刻只可能处于下面6种不同状态的其中一个状态(图源《Java 并发编程艺术》4.1.4节)。 ![Java线程的状态](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-29/Java%E7%BA%BF%E7%A8%8B%E7%9A%84%E7%8A%B6%E6%80%81.png) -线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。Java 线程状态变迁如下图所示: +线程在生命周期中并不是固定处于某一个状态而是随着代码的执行在不同状态之间切换。Java 线程状态变迁如下图所示(图源《Java 并发编程艺术》4.1.4节): ![Java线程状态变迁](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/19-1-29/Java%20%E7%BA%BF%E7%A8%8B%E7%8A%B6%E6%80%81%E5%8F%98%E8%BF%81.png) + + +由上图可以看出: + +线程创建之后它将处于 **NEW(新建)** 状态,调用 `start()` 方法后开始运行,线程这时候处于 **READY(可运行)** 状态。可运行状态的线程获得了 cpu 时间片(timeslice)后就处于 **RUNNING(运行)** 状态。 + +> 操作系统隐藏 Java虚拟机(JVM)中的 RUNNABLE 和 RUNNING 状态,它只能看到 RUNNABLE 状态(图源:[HowToDoInJava](https://howtodoinjava.com/):[Java Thread Life Cycle and Thread States](https://howtodoinjava.com/java/multi-threading/java-thread-life-cycle-and-thread-states/)),所以 Java 系统一般将这两个状态统称为 **RUNNABLE(运行中)** 状态 。 + +![RUNNABLE-VS-RUNNING](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-3/RUNNABLE-VS-RUNNING.png) + +当线程执行 `wait()`方法之后,线程进入 **WAITING(等待)**状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而 **TIME_WAITING(超时等待)** 状态相当于在等待状态的基础上增加了超时限制,比如通过 `sleep(long millis)`方法或 `wait(long millis)`方法可以将 Java 线程置于 TIMED WAITING 状态。当超时时间到达后 Java 线程将会返回到 RUNNABLE 状态。当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到 **BLOCKED(阻塞)** 状态。线程在执行 Runnable 的` run() `方法之后将会进入到 **TERMINATED(终止)** 状态。 + ## 31 关于 final 关键字的一些总结 final关键字主要用在三个地方:变量、方法、类。 From 893f4a5a801f4fe82cd067219ca9a22bdec42009 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Thu, 7 Mar 2019 14:58:16 +0800 Subject: [PATCH 47/66] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 17eeb6ed..352c4659 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,5 @@ # Java 学习/面试指南 -工作一年以上的朋友可以加这个群,群内有免费Java进阶架构师资料:[![QQ群](https://img.shields.io/badge/QQ%E7%BE%A4-959442351-blue.svg)](https://jq.qq.com/?_wv=1027&k=5tjF8vk). -

From 47a005ca55143cf797e0b7e828b4a2884b6b9708 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Fri, 8 Mar 2019 16:01:21 +0800 Subject: [PATCH 48/66] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 352c4659..8aef7455 100644 --- a/README.md +++ b/README.md @@ -10,10 +10,10 @@ 1. **加群:** 微信交流群添加 [我的微信](#联系我) 后回复关键字“加群”即可入群。 2. **Java工程师必备学习资源:** 一些Java工程师常用学习资源[公众号](#公众号)后台回复关键字 **“1”** 即可免费无套路获取。 3. **《Java面试突击》:** 由本文档衍生的专为面试而生的《Java面试突击》V2.0 PDF 版本[公众号](#公众号)后台回复 **"Java面试突击"** 即可免费领取! +4. **关于贡献者:** 对本仓库提过有价值的 issue 或 pr 的小伙伴将出现在 [Contributor](#Contributor) 这里。 +5. **欢迎投稿:** 由于我个人能力有限,很多知识点我可能没有涉及到,所以你可以对其他知识点进行补充。**对于不错的原创文章我根据你的选择给予现金(50-300)、付费专栏或者任选书籍进行奖励!所以,快提 pr 或者邮件的方式(邮件地址在主页)给我投稿吧!** 当然,我觉得奖励是次要的,最重要的是你可以从自己整理知识点的过程中学习到很多知识。 4. **【限时福利】** 极客时间[《Java 并发编程面试必备》](#Java并发编程专栏)专栏限时特惠,购买之后的小伙伴加 [我的微信](#联系我) 报上自己的极客时间大名可以找我会把24元返现退给大家,减轻各位学习成本。 -为了优化大家的阅读体验,我重新进行了排版,并且增加了较为详细的[目录](#目录)供大家参考!对本仓库提过有价值的 issue 或 pr 的小伙伴将出现在 [Contributor](#Contributor) 这里。另外, 由于我个人能力有限,很多知识点我可能没有涉及到,所以你可以对其他知识点进行补充。**对于不错的原创文章我根据你的选择给予现金奖励、付费专栏或者书籍进行奖励!所以,快提 pr 或者邮件的方式(邮件地址在主页)给我投稿吧!** 当然,我觉得奖励是次要的,最重要的是你可以从自己整理知识点的过程中学习到很多知识。 - ## 目录 * [:coffee: Java](#coffee-java) From 0701ac27b40cb3b1ed832e3c32b4251ca6319145 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Fri, 8 Mar 2019 19:03:48 +0800 Subject: [PATCH 49/66] =?UTF-8?q?Create=20=E7=AC=AC=E4=B8=80=E5=91=A8?= =?UTF-8?q?=EF=BC=882018-8-7=EF=BC=89.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改文件夹名字 --- .../第一周(2018-8-7).md | 253 ++++++++++++++++++ 1 file changed, 253 insertions(+) create mode 100644 面试必备/MostCommonJavaInterviewQuestions/第一周(2018-8-7).md diff --git a/面试必备/MostCommonJavaInterviewQuestions/第一周(2018-8-7).md b/面试必备/MostCommonJavaInterviewQuestions/第一周(2018-8-7).md new file mode 100644 index 00000000..4ca58dbf --- /dev/null +++ b/面试必备/MostCommonJavaInterviewQuestions/第一周(2018-8-7).md @@ -0,0 +1,253 @@ + + +## 一 为什么 Java 中只有值传递? + + +首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。**按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。** 它用来描述各种程序设计语言(不只是Java)中方法参数传递方式。 + +**Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,也就是说,方法不能修改传递给它的任何参数变量的内容。** + +**下面通过 3 个例子来给大家说明** + +### example 1 + + +```java +public static void main(String[] args) { + int num1 = 10; + int num2 = 20; + + swap(num1, num2); + + System.out.println("num1 = " + num1); + System.out.println("num2 = " + num2); +} + +public static void swap(int a, int b) { + int temp = a; + a = b; + b = temp; + + System.out.println("a = " + a); + System.out.println("b = " + b); +} +``` + +**结果:** + +``` +a = 20 +b = 10 +num1 = 10 +num2 = 20 +``` + +**解析:** + +![example 1 ](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-27/22191348.jpg) + +在swap方法中,a、b的值进行交换,并不会影响到 num1、num2。因为,a、b中的值,只是从 num1、num2 的复制过来的。也就是说,a、b相当于num1、num2 的副本,副本的内容无论怎么修改,都不会影响到原件本身。 + +**通过上面例子,我们已经知道了一个方法不能修改一个基本数据类型的参数,而对象引用作为参数就不一样,请看 example2.** + + +### example 2 + +```java + public static void main(String[] args) { + int[] arr = { 1, 2, 3, 4, 5 }; + System.out.println(arr[0]); + change(arr); + System.out.println(arr[0]); + } + + public static void change(int[] array) { + // 将数组的第一个元素变为0 + array[0] = 0; + } +``` + +**结果:** + +``` +1 +0 +``` + +**解析:** + +![example 2](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-27/3825204.jpg) + +array 被初始化 arr 的拷贝也就是一个对象的引用,也就是说 array 和 arr 指向的时同一个数组对象。 因此,外部对引用对象的改变会反映到所对应的对象上。 + + +**通过 example2 我们已经看到,实现一个改变对象参数状态的方法并不是一件难事。理由很简单,方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。** + +**很多程序设计语言(特别是,C++和Pascal)提供了两种参数传递的方式:值调用和引用调用。有些程序员(甚至本书的作者)认为Java程序设计语言对对象采用的是引用调用,实际上,这种理解是不对的。由于这种误解具有一定的普遍性,所以下面给出一个反例来详细地阐述一下这个问题。** + + +### example 3 + +```java +public class Test { + + public static void main(String[] args) { + // TODO Auto-generated method stub + Student s1 = new Student("小张"); + Student s2 = new Student("小李"); + Test.swap(s1, s2); + System.out.println("s1:" + s1.getName()); + System.out.println("s2:" + s2.getName()); + } + + public static void swap(Student x, Student y) { + Student temp = x; + x = y; + y = temp; + System.out.println("x:" + x.getName()); + System.out.println("y:" + y.getName()); + } +} +``` + +**结果:** + +``` +x:小李 +y:小张 +s1:小张 +s2:小李 +``` + +**解析:** + +交换之前: + +![](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-27/88729818.jpg) + +交换之后: + +![](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-27/34384414.jpg) + + +通过上面两张图可以很清晰的看出: **方法并没有改变存储在变量 s1 和 s2 中的对象引用。swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝** + +### 总结 + +Java程序设计语言对对象采用的不是引用调用,实际上,对象引用是按 +值传递的。 + +下面再总结一下Java中方法参数的使用情况: + +- 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型》 +- 一个方法可以改变一个对象参数的状态。 +- 一个方法不能让对象参数引用一个新的对象。 + + +### 参考: + +《Java核心技术卷Ⅰ》基础知识第十版第四章4.5小节 + +## 二 ==与equals(重要) + +**==** : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址) + +**equals()** : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况: + +- 情况1:类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象。 +- 情况2:类覆盖了equals()方法。一般,我们都覆盖equals()方法来两个对象的内容相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。 + + +**举个例子:** + +```java +public class test1 { + public static void main(String[] args) { + String a = new String("ab"); // a 为一个引用 + String b = new String("ab"); // b为另一个引用,对象的内容一样 + String aa = "ab"; // 放在常量池中 + String bb = "ab"; // 从常量池中查找 + if (aa == bb) // true + System.out.println("aa==bb"); + if (a == b) // false,非同一对象 + System.out.println("a==b"); + if (a.equals(b)) // true + System.out.println("aEQb"); + if (42 == 42.0) { // true + System.out.println("true"); + } + } +} +``` + +**说明:** + +- String中的equals方法是被重写过的,因为object的equals方法是比较的对象的内存地址,而String的equals方法比较的是对象的值。 +- 当创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象。 + + + +## 三 hashCode与equals(重要) + +面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” + +### hashCode()介绍 +hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。另外需要注意的是: Object 的 hashcode 方法是本地方法,也就是用 c 语言或 c++ 实现的,该方法通常用来将对象的 内存地址 转换为整数之后返回。 + +```java + /** + * Returns a hash code value for the object. This method is + * supported for the benefit of hash tables such as those provided by + * {@link java.util.HashMap}. + *

+ * As much as is reasonably practical, the hashCode method defined by + * class {@code Object} does return distinct integers for distinct + * objects. (This is typically implemented by converting the internal + * address of the object into an integer, but this implementation + * technique is not required by the + * Java™ programming language.) + * + * @return a hash code value for this object. + * @see java.lang.Object#equals(java.lang.Object) + * @see java.lang.System#identityHashCode + */ + public native int hashCode(); +``` + +散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象) + +### 为什么要有hashCode + + +**我们以“HashSet如何检查重复”为例子来说明为什么要有hashCode:** + +当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他已经加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head fist java》第二版)。这样我们就大大减少了equals的次数,相应就大大提高了执行速度。 + + + +### hashCode()与equals()的相关规定 + +1. 如果两个对象相等,则hashcode一定也是相同的 +2. 两个对象相等,对两个对象分别调用equals方法都返回true +3. 两个对象有相同的hashcode值,它们也不一定是相等的 +4. **因此,equals方法被覆盖过,则hashCode方法也必须被覆盖** +5. hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据) + +### 为什么两个对象有相同的hashcode值,它们也不一定是相等的? + +在这里解释一位小伙伴的问题。以下内容摘自《Head Fisrt Java》。 + +因为hashCode() 所使用的杂凑算法也许刚好会让多个对象传回相同的杂凑值。越糟糕的杂凑算法越容易碰撞,但这也与数据值域分布的特性有关(所谓碰撞也就是指的是不同的对象得到相同的 hashCode)。 + +我们刚刚也提到了 HashSet,如果 HashSet 在对比的时候,同样的 hashcode 有多个对象,它会使用 equals() 来判断是否真的相同。也就是说 hashcode 只是用来缩小查找成本。 + +参考: + +[https://blog.csdn.net/zhzhao999/article/details/53449504](https://blog.csdn.net/zhzhao999/article/details/53449504) + +[https://www.cnblogs.com/skywang12345/p/3324958.html](https://www.cnblogs.com/skywang12345/p/3324958.html) + +[https://www.cnblogs.com/skywang12345/p/3324958.html](https://www.cnblogs.com/skywang12345/p/3324958.html) + +[https://www.cnblogs.com/Eason-S/p/5524837.html](https://www.cnblogs.com/Eason-S/p/5524837.html) + From ea129c1dbd1d714bfd33d5051848f6471ba1b4da Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Fri, 8 Mar 2019 19:03:53 +0800 Subject: [PATCH 50/66] =?UTF-8?q?Create=20=E7=AC=AC=E4=BA=8C=E5=91=A8(2018?= =?UTF-8?q?-8-13).md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改文件夹名字 --- .../第二周(2018-8-13).md | 200 ++++++++++++++++++ 1 file changed, 200 insertions(+) create mode 100644 面试必备/MostCommonJavaInterviewQuestions/第二周(2018-8-13).md diff --git a/面试必备/MostCommonJavaInterviewQuestions/第二周(2018-8-13).md b/面试必备/MostCommonJavaInterviewQuestions/第二周(2018-8-13).md new file mode 100644 index 00000000..426498cb --- /dev/null +++ b/面试必备/MostCommonJavaInterviewQuestions/第二周(2018-8-13).md @@ -0,0 +1,200 @@ + +### String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的? + +#### String和StringBuffer、StringBuilder的区别 + +**可变性** +  + +简单的来说:String 类中使用 final 关键字字符数组保存字符串,`private final char value[]`,所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串`char[]value` 但是没有用 final 关键字修饰,所以这两种对象都是可变的。 + +StringBuilder 与 StringBuffer 的构造方法都是调用父类构造方法也就是 AbstractStringBuilder 实现的,大家可以自行查阅源码。 + +AbstractStringBuilder.java + +```java +abstract class AbstractStringBuilder implements Appendable, CharSequence { + char[] value; + int count; + AbstractStringBuilder() { + } + AbstractStringBuilder(int capacity) { + value = new char[capacity]; + } +``` + + +**线程安全性** + +String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。 +   + +**性能** + +每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。 + +**对于三者使用的总结:** +1. 操作少量的数据 = String +2. 单线程操作字符串缓冲区下操作大量数据 = StringBuilder +3. 多线程操作字符串缓冲区下操作大量数据 = StringBuffer + +#### String为什么是不可变的吗? +简单来说就是String类利用了final修饰的char类型数组存储字符,源码如下图所以: + +```java + /** The value is used for character storage. */ + private final char value[]; +``` + +#### String真的是不可变的吗? +我觉得如果别人问这个问题的话,回答不可变就可以了。 +下面只是给大家看两个有代表性的例子: + +**1) String不可变但不代表引用不可以变** +```java + String str = "Hello"; + str = str + " World"; + System.out.println("str=" + str); +``` +结果: +``` +str=Hello World +``` +解析: + +实际上,原来String的内容是不变的,只是str由原来指向"Hello"的内存地址转为指向"Hello World"的内存地址而已,也就是说多开辟了一块内存区域给"Hello World"字符串。 + +**2) 通过反射是可以修改所谓的“不可变”对象** + +```java + // 创建字符串"Hello World", 并赋给引用s + String s = "Hello World"; + + System.out.println("s = " + s); // Hello World + + // 获取String类中的value字段 + Field valueFieldOfString = String.class.getDeclaredField("value"); + + // 改变value属性的访问权限 + valueFieldOfString.setAccessible(true); + + // 获取s对象上的value属性的值 + char[] value = (char[]) valueFieldOfString.get(s); + + // 改变value所引用的数组中的第5个字符 + value[5] = '_'; + + System.out.println("s = " + s); // Hello_World +``` + +结果: + +``` +s = Hello World +s = Hello_World +``` + +解析: + +用反射可以访问私有成员, 然后反射出String对象中的value属性, 进而改变通过获得的value引用改变数组的结构。但是一般我们不会这么做,这里只是简单提一下有这个东西。 + +### 什么是反射机制?反射机制的应用场景有哪些? + +#### 反射机制介绍 + +JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 + +#### 静态编译和动态编译 + +- **静态编译:**在编译时确定类型,绑定对象 +- **动态编译:**运行时确定类型,绑定对象 + +#### 反射机制优缺点 + +- **优点:** 运行期类型的判断,动态加载类,提高代码灵活度。 +- **缺点:** 性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多。 + +#### 反射的应用场景 + +反射是框架设计的灵魂。 + +在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。 + +举例:①我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序;②Spring框架也用到很多反射机制,最经典的就是xml的配置模式。Spring 通过 XML 配置模式装载 Bean 的过程:1) 将程序内所有 XML 或 Properties 配置文件加载入内存中; + 2)Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息; 3)使用反射机制,根据这个字符串获得某个类的Class实例; 4)动态配置实例的属性 + +**推荐阅读:** + +- [Reflection:Java反射机制的应用场景](https://segmentfault.com/a/1190000010162647?utm_source=tuicool&utm_medium=referral) +- [Java基础之—反射(非常重要)](https://blog.csdn.net/sinat_38259539/article/details/71799078) +### 什么是JDK?什么是JRE?什么是JVM?三者之间的联系与区别 + +这几个是Java中很基本很基本的东西,但是我相信一定还有很多人搞不清楚!为什么呢?因为我们大多数时候在使用现成的编译工具以及环境的时候,并没有去考虑这些东西。 + +**JDK:** 顾名思义它是给开发者提供的开发工具箱,是给程序开发者用的。它除了包括完整的JRE(Java Runtime Environment),Java运行环境,还包含了其他供开发者使用的工具包。 + +**JRE:** 普通用户而只需要安装JRE(Java Runtime Environment)来运行Java程序。而程序开发者必须安装JDK来编译、调试程序。 + +**JVM:** 当我们运行一个程序时,JVM负责将字节码转换为特定机器代码,JVM提供了内存管理/垃圾回收和安全机制等。这种独立于硬件和操作系统,正是java程序可以一次编写多处执行的原因。 + +**区别与联系:** + + 1. JDK用于开发,JRE用于运行java程序 ; + 2. JDK和JRE中都包含JVM ; + 3. JVM是java编程语言的核心并且具有平台独立性。 + +### 什么是字节码?采用字节码的最大好处是什么? + +**先看下java中的编译器和解释器:**    + +Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做`字节码`(即扩展名为`.class`的文件),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。这也就是解释了Java的编译与解释并存的特点。 + + Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码---->程序运行。 + +**采用字节码的好处:**    + +Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。 + +### Java和C++的区别 + +我知道很多人没学过C++,但是面试官就是没事喜欢拿咱们Java和C++比呀!没办法!!!就算没学过C++,也要记下来! + +- 都是面向对象的语言,都支持封装、继承和多态 +- Java不提供指针来直接访问内存,程序内存更加安全 +- Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承。 +- Java有自动内存管理机制,不需要程序员手动释放无用内存 + + +### 接口和抽象类的区别是什么? + +1. 接口的方法默认是public,所有方法在接口中不能有实现,抽象类可以有非抽象的方法 +2. 接口中的实例变量默认是final类型的,而抽象类中则不一定 +3. 一个类可以实现多个接口,但最多只能实现一个抽象类 +4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定 +5. 接口不能用new实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。 + +注意:Java8 后接口可以有默认实现( default )。 + +### 成员变量与局部变量的区别有那些? + +1. 从语法形式上,看成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被public,private,static等修饰符所修饰,而局部变量不能被访问控制修饰符及static所修饰;但是,成员变量和局部变量都能被final所修饰; +2. 从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存在于堆内存,局部变量存在于栈内存 +3. 从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。 +4. 成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被final修饰但没有被static修饰的成员变量必须显示地赋值);而局部变量则不会自动赋值。 + +### 重载和重写的区别 + +**重载:** 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。    + +**重写:** 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为private则子类就不能重写该方法。 + +### 字符型常量和字符串常量的区别 +1) 形式上: +字符常量是单引号引起的一个字符 +字符串常量是双引号引起的若干个字符 +2) 含义上: +字符常量相当于一个整形值(ASCII值),可以参加表达式运算 +字符串常量代表一个地址值(该字符串在内存中存放位置) +3) 占内存大小 +字符常量只占一个字节 +字符串常量占若干个字节(至少一个字符结束标志) From bc4cec733f38fe334223369ba8d2a6e3aea36e9e Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Fri, 8 Mar 2019 19:03:58 +0800 Subject: [PATCH 51/66] =?UTF-8?q?Create=20=E7=AC=AC=E5=9B=9B=E5=91=A8(2018?= =?UTF-8?q?-8-30).md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改文件夹名字 --- .../第四周(2018-8-30).md | 195 ++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 面试必备/MostCommonJavaInterviewQuestions/第四周(2018-8-30).md diff --git a/面试必备/MostCommonJavaInterviewQuestions/第四周(2018-8-30).md b/面试必备/MostCommonJavaInterviewQuestions/第四周(2018-8-30).md new file mode 100644 index 00000000..3cb02d73 --- /dev/null +++ b/面试必备/MostCommonJavaInterviewQuestions/第四周(2018-8-30).md @@ -0,0 +1,195 @@ + +## 1. 简述线程,程序、进程的基本概念。以及他们之间关系是什么? + +**线程**与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。 + +**程序**是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。 + +**进程**是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 + +**线程** 是 **进程** 划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。 + +**线程上下文的切换比进程上下文切换要快很多** + +- 进程切换时,涉及到当前进程的CPU环境的保存和新被调度运行进程的CPU环境的设置。 +- 线程切换仅需要保存和设置少量的寄存器内容,不涉及存储管理方面的操作。 + +## 2. 线程有哪些基本状态?这些状态是如何定义的? + +1. **新建(new)**:新创建了一个线程对象。 +2. **可运行(runnable)**:线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取cpu的使用权。 +3. **运行(running)**:可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。 +4. **阻塞(block)**:阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有 机会再次获得cpu timeslice转到运行(running)状态。阻塞的情况分三种: + - **(一). 等待阻塞**:运行(running)的线程执行o.wait()方法,JVM会把该线程放 入等待队列(waiting queue)中。 + - **(二). 同步阻塞**:运行(running)的线程在获取对象的同步锁时,若该同步 锁 被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。 + - **(三). 其他阻塞**: 运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。 +5. **死亡(dead)**:线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。 + +![](https://user-gold-cdn.xitu.io/2018/8/9/1651f19d7c4e93a3?w=876&h=492&f=png&s=128092) + +备注: 可以用早起坐地铁来比喻这个过程(下面参考自牛客网某位同学的回答): + +1. 还没起床:sleeping +2. 起床收拾好了,随时可以坐地铁出发:Runnable +3. 等地铁来:Waiting +4. 地铁来了,但要排队上地铁:I/O阻塞 +5. 上了地铁,发现暂时没座位:synchronized阻塞 +6. 地铁上找到座位:Running +7. 到达目的地:Dead + + +## 3. 何为多线程? + +多线程就是多个线程同时运行或交替运行。单核CPU的话是顺序执行,也就是交替运行。多核CPU的话,因为每个CPU有自己的运算器,所以在多个CPU中可以同时运行。 + + +## 4. 为什么多线程是必要的? + +1. 使用线程可以把占据长时间的程序中的任务放到后台去处理。 +2. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。 +3. 程序的运行速度可能加快。 + +## 5 使用多线程常见的三种方式 + +### ①继承Thread类 + +MyThread.java + +```java +public class MyThread extends Thread { + @Override + public void run() { + super.run(); + System.out.println("MyThread"); + } +} +``` +Run.java + +```java +public class Run { + + public static void main(String[] args) { + MyThread mythread = new MyThread(); + mythread.start(); + System.out.println("运行结束"); + } + +} + +``` +运行结果: +![结果](https://user-gold-cdn.xitu.io/2018/3/20/16243e80f22a2d54?w=161&h=54&f=jpeg&s=7380) +从上面的运行结果可以看出:线程是一个子任务,CPU以不确定的方式,或者说是以随机的时间来调用线程中的run方法。 + +### ②实现Runnable接口 +推荐实现Runnable接口方式开发多线程,因为Java单继承但是可以实现多个接口。 + +MyRunnable.java + +```java +public class MyRunnable implements Runnable { + @Override + public void run() { + System.out.println("MyRunnable"); + } +} +``` + +Run.java + +```java +public class Run { + + public static void main(String[] args) { + Runnable runnable=new MyRunnable(); + Thread thread=new Thread(runnable); + thread.start(); + System.out.println("运行结束!"); + } + +} +``` +运行结果: +![运行结果](https://user-gold-cdn.xitu.io/2018/3/20/16243f4373c6141a?w=137&h=46&f=jpeg&s=7316) + +### ③使用线程池 + +**在《阿里巴巴Java开发手册》“并发处理”这一章节,明确指出线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。** + +**为什么呢?** + +> **使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源开销,解决资源不足的问题。如果不使用线程池,有可能会造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。** + +**另外《阿里巴巴Java开发手册》中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险** + +> Executors 返回线程池对象的弊端如下: +> +> - **FixedThreadPool 和 SingleThreadExecutor** : 允许请求的队列长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致OOM。 +> - **CachedThreadPool 和 ScheduledThreadPool** : 允许创建的线程数量为 Integer.MAX_VALUE ,可能会创建大量线程,从而导致OOM。 + +对于线程池感兴趣的可以查看我的这篇文章:[《Java多线程学习(八)线程池与Executor 框架》](http://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484042&idx=1&sn=541dbf2cb969a151d79f4a4f837ee1bd&chksm=fd9854ebcaefddfd1876bb96ab218be3ae7b12546695a403075d4ed22e5e17ff30ebdabc8bbf#rd) 点击阅读原文即可查看到该文章的最新版。 + + +## 6 线程的优先级 + +每个线程都具有各自的优先级,**线程的优先级可以在程序中表明该线程的重要性,如果有很多线程处于就绪状态,系统会根据优先级来决定首先使哪个线程进入运行状态**。但这个并不意味着低 +优先级的线程得不到运行,而只是它运行的几率比较小,如垃圾回收机制线程的优先级就比较低。所以很多垃圾得不到及时的回收处理。 + +**线程优先级具有继承特性。** 比如A线程启动B线程,则B线程的优先级和A是一样的。 + +**线程优先级具有随机性。** 也就是说线程优先级高的不一定每一次都先执行完。 + +Thread类中包含的成员变量代表了线程的某些优先级。如**Thread.MIN_PRIORITY(常数1)**,**Thread.NORM_PRIORITY(常数5)**, +**Thread.MAX_PRIORITY(常数10)**。其中每个线程的优先级都在**Thread.MIN_PRIORITY(常数1)** 到**Thread.MAX_PRIORITY(常数10)** 之间,在默认情况下优先级都是**Thread.NORM_PRIORITY(常数5)**。 + +学过操作系统这门课程的话,我们可以发现多线程优先级或多或少借鉴了操作系统对进程的管理。 + + +## 7 Java多线程分类 + +### 用户线程 + +运行在前台,执行具体的任务,如程序的主线程、连接网络的子线程等都是用户线程 + +### 守护线程 + +运行在后台,为其他前台线程服务.也可以说守护线程是JVM中非守护线程的 **“佣人”**。 + + +- **特点:** 一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作 +- **应用:** 数据库连接池中的检测线程,JVM虚拟机启动后的检测线程 +- **最常见的守护线程:** 垃圾回收线程 + + +**如何设置守护线程?** + +可以通过调用 Thead 类的 `setDaemon(true)` 方法设置当前的线程为守护线程。 + +注意事项: + + 1. setDaemon(true)必须在start()方法前执行,否则会抛出IllegalThreadStateException异常 + 2. 在守护线程中产生的新线程也是守护线程 + 3. 不是所有的任务都可以分配给守护线程来执行,比如读写操作或者计算逻辑 + + +## 8 sleep()方法和wait()方法简单对比 + +- 两者最主要的区别在于:**sleep方法没有释放锁,而wait方法释放了锁** 。 +- 两者都可以暂停线程的执行。 +- Wait通常被用于线程间交互/通信,sleep通常被用于暂停执行。 +- wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者notifyAll()方法。sleep()方法执行完成后,线程会自动苏醒。 + + +## 9 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法? + +这是另一个非常经典的java多线程面试问题,而且在面试中会经常被问到。很简单,但是很多人都会答不上来! + +new一个Thread,线程进入了新建状态;调用start()方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 +start()会执行线程的相应准备工作,然后自动执行run()方法的内容,这是真正的多线程工作。 而直接执行run()方法,会把run方法当成一个mian线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。 + +**总结: 调用start方法方可启动线程并使线程进入就绪状态,而run方法只是thread的一个普通方法调用,还是在主线程里执行。** + + + + From 5a62e9024d9191092fc4b21172fa3470ad724950 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Fri, 8 Mar 2019 19:04:10 +0800 Subject: [PATCH 52/66] =?UTF-8?q?Delete=20=E7=AC=AC=E4=B8=80=E5=91=A8?= =?UTF-8?q?=EF=BC=882018-8-7=EF=BC=89.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../第一周(2018-8-7).md | 253 ------------------ 1 file changed, 253 deletions(-) delete mode 100644 面试必备/最最最常见的Java面试题总结/第一周(2018-8-7).md diff --git a/面试必备/最最最常见的Java面试题总结/第一周(2018-8-7).md b/面试必备/最最最常见的Java面试题总结/第一周(2018-8-7).md deleted file mode 100644 index 4ca58dbf..00000000 --- a/面试必备/最最最常见的Java面试题总结/第一周(2018-8-7).md +++ /dev/null @@ -1,253 +0,0 @@ - - -## 一 为什么 Java 中只有值传递? - - -首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语。**按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(call by reference)表示方法接收的是调用者提供的变量地址。一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。** 它用来描述各种程序设计语言(不只是Java)中方法参数传递方式。 - -**Java程序设计语言总是采用按值调用。也就是说,方法得到的是所有参数值的一个拷贝,也就是说,方法不能修改传递给它的任何参数变量的内容。** - -**下面通过 3 个例子来给大家说明** - -### example 1 - - -```java -public static void main(String[] args) { - int num1 = 10; - int num2 = 20; - - swap(num1, num2); - - System.out.println("num1 = " + num1); - System.out.println("num2 = " + num2); -} - -public static void swap(int a, int b) { - int temp = a; - a = b; - b = temp; - - System.out.println("a = " + a); - System.out.println("b = " + b); -} -``` - -**结果:** - -``` -a = 20 -b = 10 -num1 = 10 -num2 = 20 -``` - -**解析:** - -![example 1 ](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-27/22191348.jpg) - -在swap方法中,a、b的值进行交换,并不会影响到 num1、num2。因为,a、b中的值,只是从 num1、num2 的复制过来的。也就是说,a、b相当于num1、num2 的副本,副本的内容无论怎么修改,都不会影响到原件本身。 - -**通过上面例子,我们已经知道了一个方法不能修改一个基本数据类型的参数,而对象引用作为参数就不一样,请看 example2.** - - -### example 2 - -```java - public static void main(String[] args) { - int[] arr = { 1, 2, 3, 4, 5 }; - System.out.println(arr[0]); - change(arr); - System.out.println(arr[0]); - } - - public static void change(int[] array) { - // 将数组的第一个元素变为0 - array[0] = 0; - } -``` - -**结果:** - -``` -1 -0 -``` - -**解析:** - -![example 2](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-27/3825204.jpg) - -array 被初始化 arr 的拷贝也就是一个对象的引用,也就是说 array 和 arr 指向的时同一个数组对象。 因此,外部对引用对象的改变会反映到所对应的对象上。 - - -**通过 example2 我们已经看到,实现一个改变对象参数状态的方法并不是一件难事。理由很简单,方法得到的是对象引用的拷贝,对象引用及其他的拷贝同时引用同一个对象。** - -**很多程序设计语言(特别是,C++和Pascal)提供了两种参数传递的方式:值调用和引用调用。有些程序员(甚至本书的作者)认为Java程序设计语言对对象采用的是引用调用,实际上,这种理解是不对的。由于这种误解具有一定的普遍性,所以下面给出一个反例来详细地阐述一下这个问题。** - - -### example 3 - -```java -public class Test { - - public static void main(String[] args) { - // TODO Auto-generated method stub - Student s1 = new Student("小张"); - Student s2 = new Student("小李"); - Test.swap(s1, s2); - System.out.println("s1:" + s1.getName()); - System.out.println("s2:" + s2.getName()); - } - - public static void swap(Student x, Student y) { - Student temp = x; - x = y; - y = temp; - System.out.println("x:" + x.getName()); - System.out.println("y:" + y.getName()); - } -} -``` - -**结果:** - -``` -x:小李 -y:小张 -s1:小张 -s2:小李 -``` - -**解析:** - -交换之前: - -![](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-27/88729818.jpg) - -交换之后: - -![](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-27/34384414.jpg) - - -通过上面两张图可以很清晰的看出: **方法并没有改变存储在变量 s1 和 s2 中的对象引用。swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝** - -### 总结 - -Java程序设计语言对对象采用的不是引用调用,实际上,对象引用是按 -值传递的。 - -下面再总结一下Java中方法参数的使用情况: - -- 一个方法不能修改一个基本数据类型的参数(即数值型或布尔型》 -- 一个方法可以改变一个对象参数的状态。 -- 一个方法不能让对象参数引用一个新的对象。 - - -### 参考: - -《Java核心技术卷Ⅰ》基础知识第十版第四章4.5小节 - -## 二 ==与equals(重要) - -**==** : 它的作用是判断两个对象的地址是不是相等。即,判断两个对象是不是同一个对象。(基本数据类型==比较的是值,引用数据类型==比较的是内存地址) - -**equals()** : 它的作用也是判断两个对象是否相等。但它一般有两种使用情况: - -- 情况1:类没有覆盖equals()方法。则通过equals()比较该类的两个对象时,等价于通过“==”比较这两个对象。 -- 情况2:类覆盖了equals()方法。一般,我们都覆盖equals()方法来两个对象的内容相等;若它们的内容相等,则返回true(即,认为这两个对象相等)。 - - -**举个例子:** - -```java -public class test1 { - public static void main(String[] args) { - String a = new String("ab"); // a 为一个引用 - String b = new String("ab"); // b为另一个引用,对象的内容一样 - String aa = "ab"; // 放在常量池中 - String bb = "ab"; // 从常量池中查找 - if (aa == bb) // true - System.out.println("aa==bb"); - if (a == b) // false,非同一对象 - System.out.println("a==b"); - if (a.equals(b)) // true - System.out.println("aEQb"); - if (42 == 42.0) { // true - System.out.println("true"); - } - } -} -``` - -**说明:** - -- String中的equals方法是被重写过的,因为object的equals方法是比较的对象的内存地址,而String的equals方法比较的是对象的值。 -- 当创建String类型的对象时,虚拟机会在常量池中查找有没有已经存在的值和要创建的值相同的对象,如果有就把它赋给当前引用。如果没有就在常量池中重新创建一个String对象。 - - - -## 三 hashCode与equals(重要) - -面试官可能会问你:“你重写过 hashcode 和 equals 么,为什么重写equals时必须重写hashCode方法?” - -### hashCode()介绍 -hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返回一个int整数。这个哈希码的作用是确定该对象在哈希表中的索引位置。hashCode() 定义在JDK的Object.java中,这就意味着Java中的任何类都包含有hashCode() 函数。另外需要注意的是: Object 的 hashcode 方法是本地方法,也就是用 c 语言或 c++ 实现的,该方法通常用来将对象的 内存地址 转换为整数之后返回。 - -```java - /** - * Returns a hash code value for the object. This method is - * supported for the benefit of hash tables such as those provided by - * {@link java.util.HashMap}. - *

- * As much as is reasonably practical, the hashCode method defined by - * class {@code Object} does return distinct integers for distinct - * objects. (This is typically implemented by converting the internal - * address of the object into an integer, but this implementation - * technique is not required by the - * Java™ programming language.) - * - * @return a hash code value for this object. - * @see java.lang.Object#equals(java.lang.Object) - * @see java.lang.System#identityHashCode - */ - public native int hashCode(); -``` - -散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。这其中就利用到了散列码!(可以快速找到所需要的对象) - -### 为什么要有hashCode - - -**我们以“HashSet如何检查重复”为例子来说明为什么要有hashCode:** - -当你把对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,同时也会与其他已经加入的对象的hashcode值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同hashcode值的对象,这时会调用equals()方法来检查hashcode相等的对象是否真的相同。如果两者相同,HashSet就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head fist java》第二版)。这样我们就大大减少了equals的次数,相应就大大提高了执行速度。 - - - -### hashCode()与equals()的相关规定 - -1. 如果两个对象相等,则hashcode一定也是相同的 -2. 两个对象相等,对两个对象分别调用equals方法都返回true -3. 两个对象有相同的hashcode值,它们也不一定是相等的 -4. **因此,equals方法被覆盖过,则hashCode方法也必须被覆盖** -5. hashCode()的默认行为是对堆上的对象产生独特值。如果没有重写hashCode(),则该class的两个对象无论如何都不会相等(即使这两个对象指向相同的数据) - -### 为什么两个对象有相同的hashcode值,它们也不一定是相等的? - -在这里解释一位小伙伴的问题。以下内容摘自《Head Fisrt Java》。 - -因为hashCode() 所使用的杂凑算法也许刚好会让多个对象传回相同的杂凑值。越糟糕的杂凑算法越容易碰撞,但这也与数据值域分布的特性有关(所谓碰撞也就是指的是不同的对象得到相同的 hashCode)。 - -我们刚刚也提到了 HashSet,如果 HashSet 在对比的时候,同样的 hashcode 有多个对象,它会使用 equals() 来判断是否真的相同。也就是说 hashcode 只是用来缩小查找成本。 - -参考: - -[https://blog.csdn.net/zhzhao999/article/details/53449504](https://blog.csdn.net/zhzhao999/article/details/53449504) - -[https://www.cnblogs.com/skywang12345/p/3324958.html](https://www.cnblogs.com/skywang12345/p/3324958.html) - -[https://www.cnblogs.com/skywang12345/p/3324958.html](https://www.cnblogs.com/skywang12345/p/3324958.html) - -[https://www.cnblogs.com/Eason-S/p/5524837.html](https://www.cnblogs.com/Eason-S/p/5524837.html) - From 04f11194c62ff4c0dd161da077aecb239f21284b Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Fri, 8 Mar 2019 19:04:16 +0800 Subject: [PATCH 53/66] =?UTF-8?q?Delete=20=E7=AC=AC=E4=BA=8C=E5=91=A8(2018?= =?UTF-8?q?-8-13).md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改文件夹名字 --- .../第二周(2018-8-13).md | 200 ------------------ 1 file changed, 200 deletions(-) delete mode 100644 面试必备/最最最常见的Java面试题总结/第二周(2018-8-13).md diff --git a/面试必备/最最最常见的Java面试题总结/第二周(2018-8-13).md b/面试必备/最最最常见的Java面试题总结/第二周(2018-8-13).md deleted file mode 100644 index 426498cb..00000000 --- a/面试必备/最最最常见的Java面试题总结/第二周(2018-8-13).md +++ /dev/null @@ -1,200 +0,0 @@ - -### String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的? - -#### String和StringBuffer、StringBuilder的区别 - -**可变性** -  - -简单的来说:String 类中使用 final 关键字字符数组保存字符串,`private final char value[]`,所以 String 对象是不可变的。而StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串`char[]value` 但是没有用 final 关键字修饰,所以这两种对象都是可变的。 - -StringBuilder 与 StringBuffer 的构造方法都是调用父类构造方法也就是 AbstractStringBuilder 实现的,大家可以自行查阅源码。 - -AbstractStringBuilder.java - -```java -abstract class AbstractStringBuilder implements Appendable, CharSequence { - char[] value; - int count; - AbstractStringBuilder() { - } - AbstractStringBuilder(int capacity) { - value = new char[capacity]; - } -``` - - -**线程安全性** - -String 中的对象是不可变的,也就可以理解为常量,线程安全。AbstractStringBuilder 是 StringBuilder 与 StringBuffer 的公共父类,定义了一些字符串的基本操作,如 expandCapacity、append、insert、indexOf 等公共方法。StringBuffer 对方法加了同步锁或者对调用的方法加了同步锁,所以是线程安全的。StringBuilder 并没有对方法进行加同步锁,所以是非线程安全的。 -   - -**性能** - -每次对 String 类型进行改变的时候,都会生成一个新的 String 对象,然后将指针指向新的 String 对象。StringBuffer 每次都会对 StringBuffer 对象本身进行操作,而不是生成新的对象并改变对象引用。相同情况下使用 StirngBuilder 相比使用 StringBuffer 仅能获得 10%~15% 左右的性能提升,但却要冒多线程不安全的风险。 - -**对于三者使用的总结:** -1. 操作少量的数据 = String -2. 单线程操作字符串缓冲区下操作大量数据 = StringBuilder -3. 多线程操作字符串缓冲区下操作大量数据 = StringBuffer - -#### String为什么是不可变的吗? -简单来说就是String类利用了final修饰的char类型数组存储字符,源码如下图所以: - -```java - /** The value is used for character storage. */ - private final char value[]; -``` - -#### String真的是不可变的吗? -我觉得如果别人问这个问题的话,回答不可变就可以了。 -下面只是给大家看两个有代表性的例子: - -**1) String不可变但不代表引用不可以变** -```java - String str = "Hello"; - str = str + " World"; - System.out.println("str=" + str); -``` -结果: -``` -str=Hello World -``` -解析: - -实际上,原来String的内容是不变的,只是str由原来指向"Hello"的内存地址转为指向"Hello World"的内存地址而已,也就是说多开辟了一块内存区域给"Hello World"字符串。 - -**2) 通过反射是可以修改所谓的“不可变”对象** - -```java - // 创建字符串"Hello World", 并赋给引用s - String s = "Hello World"; - - System.out.println("s = " + s); // Hello World - - // 获取String类中的value字段 - Field valueFieldOfString = String.class.getDeclaredField("value"); - - // 改变value属性的访问权限 - valueFieldOfString.setAccessible(true); - - // 获取s对象上的value属性的值 - char[] value = (char[]) valueFieldOfString.get(s); - - // 改变value所引用的数组中的第5个字符 - value[5] = '_'; - - System.out.println("s = " + s); // Hello_World -``` - -结果: - -``` -s = Hello World -s = Hello_World -``` - -解析: - -用反射可以访问私有成员, 然后反射出String对象中的value属性, 进而改变通过获得的value引用改变数组的结构。但是一般我们不会这么做,这里只是简单提一下有这个东西。 - -### 什么是反射机制?反射机制的应用场景有哪些? - -#### 反射机制介绍 - -JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制。 - -#### 静态编译和动态编译 - -- **静态编译:**在编译时确定类型,绑定对象 -- **动态编译:**运行时确定类型,绑定对象 - -#### 反射机制优缺点 - -- **优点:** 运行期类型的判断,动态加载类,提高代码灵活度。 -- **缺点:** 性能瓶颈:反射相当于一系列解释操作,通知 JVM 要做的事情,性能比直接的java代码要慢很多。 - -#### 反射的应用场景 - -反射是框架设计的灵魂。 - -在我们平时的项目开发过程中,基本上很少会直接使用到反射机制,但这不能说明反射机制没有用,实际上有很多设计、开发都与反射机制有关,例如模块化的开发,通过反射去调用对应的字节码;动态代理设计模式也采用了反射机制,还有我们日常使用的 Spring/Hibernate 等框架也大量使用到了反射机制。 - -举例:①我们在使用JDBC连接数据库时使用Class.forName()通过反射加载数据库的驱动程序;②Spring框架也用到很多反射机制,最经典的就是xml的配置模式。Spring 通过 XML 配置模式装载 Bean 的过程:1) 将程序内所有 XML 或 Properties 配置文件加载入内存中; - 2)Java类里面解析xml或properties里面的内容,得到对应实体类的字节码字符串以及相关的属性信息; 3)使用反射机制,根据这个字符串获得某个类的Class实例; 4)动态配置实例的属性 - -**推荐阅读:** - -- [Reflection:Java反射机制的应用场景](https://segmentfault.com/a/1190000010162647?utm_source=tuicool&utm_medium=referral) -- [Java基础之—反射(非常重要)](https://blog.csdn.net/sinat_38259539/article/details/71799078) -### 什么是JDK?什么是JRE?什么是JVM?三者之间的联系与区别 - -这几个是Java中很基本很基本的东西,但是我相信一定还有很多人搞不清楚!为什么呢?因为我们大多数时候在使用现成的编译工具以及环境的时候,并没有去考虑这些东西。 - -**JDK:** 顾名思义它是给开发者提供的开发工具箱,是给程序开发者用的。它除了包括完整的JRE(Java Runtime Environment),Java运行环境,还包含了其他供开发者使用的工具包。 - -**JRE:** 普通用户而只需要安装JRE(Java Runtime Environment)来运行Java程序。而程序开发者必须安装JDK来编译、调试程序。 - -**JVM:** 当我们运行一个程序时,JVM负责将字节码转换为特定机器代码,JVM提供了内存管理/垃圾回收和安全机制等。这种独立于硬件和操作系统,正是java程序可以一次编写多处执行的原因。 - -**区别与联系:** - - 1. JDK用于开发,JRE用于运行java程序 ; - 2. JDK和JRE中都包含JVM ; - 3. JVM是java编程语言的核心并且具有平台独立性。 - -### 什么是字节码?采用字节码的最大好处是什么? - -**先看下java中的编译器和解释器:**    - -Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟的机器在任何平台上都提供给编译程序一个的共同的接口。编译程序只需要面向虚拟机,生成虚拟机能够理解的代码,然后由解释器来将虚拟机代码转换为特定系统的机器码执行。在Java中,这种供虚拟机理解的代码叫做`字节码`(即扩展名为`.class`的文件),它不面向任何特定的处理器,只面向虚拟机。每一种平台的解释器是不同的,但是实现的虚拟机是相同的。Java源程序经过编译器编译后变成字节码,字节码由虚拟机解释执行,虚拟机将每一条要执行的字节码送给解释器,解释器将其翻译成特定机器上的机器码,然后在特定的机器上运行。这也就是解释了Java的编译与解释并存的特点。 - - Java源代码---->编译器---->jvm可执行的Java字节码(即虚拟指令)---->jvm---->jvm中解释器----->机器可执行的二进制机器码---->程序运行。 - -**采用字节码的好处:**    - -Java语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以Java程序运行时比较高效,而且,由于字节码并不专对一种特定的机器,因此,Java程序无须重新编译便可在多种不同的计算机上运行。 - -### Java和C++的区别 - -我知道很多人没学过C++,但是面试官就是没事喜欢拿咱们Java和C++比呀!没办法!!!就算没学过C++,也要记下来! - -- 都是面向对象的语言,都支持封装、继承和多态 -- Java不提供指针来直接访问内存,程序内存更加安全 -- Java的类是单继承的,C++支持多重继承;虽然Java的类不可以多继承,但是接口可以多继承。 -- Java有自动内存管理机制,不需要程序员手动释放无用内存 - - -### 接口和抽象类的区别是什么? - -1. 接口的方法默认是public,所有方法在接口中不能有实现,抽象类可以有非抽象的方法 -2. 接口中的实例变量默认是final类型的,而抽象类中则不一定 -3. 一个类可以实现多个接口,但最多只能实现一个抽象类 -4. 一个类实现接口的话要实现接口的所有方法,而抽象类不一定 -5. 接口不能用new实例化,但可以声明,但是必须引用一个实现该接口的对象 从设计层面来说,抽象是对类的抽象,是一种模板设计,接口是行为的抽象,是一种行为的规范。 - -注意:Java8 后接口可以有默认实现( default )。 - -### 成员变量与局部变量的区别有那些? - -1. 从语法形式上,看成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被public,private,static等修饰符所修饰,而局部变量不能被访问控制修饰符及static所修饰;但是,成员变量和局部变量都能被final所修饰; -2. 从变量在内存中的存储方式来看,成员变量是对象的一部分,而对象存在于堆内存,局部变量存在于栈内存 -3. 从变量在内存中的生存时间上看,成员变量是对象的一部分,它随着对象的创建而存在,而局部变量随着方法的调用而自动消失。 -4. 成员变量如果没有被赋初值,则会自动以类型的默认值而赋值(一种情况例外被final修饰但没有被static修饰的成员变量必须显示地赋值);而局部变量则不会自动赋值。 - -### 重载和重写的区别 - -**重载:** 发生在同一个类中,方法名必须相同,参数类型不同、个数不同、顺序不同,方法返回值和访问修饰符可以不同,发生在编译时。    - -**重写:** 发生在父子类中,方法名、参数列表必须相同,返回值范围小于等于父类,抛出的异常范围小于等于父类,访问修饰符范围大于等于父类;如果父类方法访问修饰符为private则子类就不能重写该方法。 - -### 字符型常量和字符串常量的区别 -1) 形式上: -字符常量是单引号引起的一个字符 -字符串常量是双引号引起的若干个字符 -2) 含义上: -字符常量相当于一个整形值(ASCII值),可以参加表达式运算 -字符串常量代表一个地址值(该字符串在内存中存放位置) -3) 占内存大小 -字符常量只占一个字节 -字符串常量占若干个字节(至少一个字符结束标志) From 11dea93f0ef3173df10affa3cb7791e95caf2153 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Fri, 8 Mar 2019 19:04:20 +0800 Subject: [PATCH 54/66] =?UTF-8?q?Delete=20=E7=AC=AC=E5=9B=9B=E5=91=A8(2018?= =?UTF-8?q?-8-30).md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改文件夹名字 --- .../第四周(2018-8-30).md | 195 ------------------ 1 file changed, 195 deletions(-) delete mode 100644 面试必备/最最最常见的Java面试题总结/第四周(2018-8-30).md diff --git a/面试必备/最最最常见的Java面试题总结/第四周(2018-8-30).md b/面试必备/最最最常见的Java面试题总结/第四周(2018-8-30).md deleted file mode 100644 index 3cb02d73..00000000 --- a/面试必备/最最最常见的Java面试题总结/第四周(2018-8-30).md +++ /dev/null @@ -1,195 +0,0 @@ - -## 1. 简述线程,程序、进程的基本概念。以及他们之间关系是什么? - -**线程**与进程相似,但线程是一个比进程更小的执行单位。一个进程在其执行的过程中可以产生多个线程。与进程不同的是同类的多个线程共享同一块内存空间和一组系统资源,所以系统在产生一个线程,或是在各个线程之间作切换工作时,负担要比进程小得多,也正因为如此,线程也被称为轻量级进程。 - -**程序**是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。 - -**进程**是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 - -**线程** 是 **进程** 划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。 - -**线程上下文的切换比进程上下文切换要快很多** - -- 进程切换时,涉及到当前进程的CPU环境的保存和新被调度运行进程的CPU环境的设置。 -- 线程切换仅需要保存和设置少量的寄存器内容,不涉及存储管理方面的操作。 - -## 2. 线程有哪些基本状态?这些状态是如何定义的? - -1. **新建(new)**:新创建了一个线程对象。 -2. **可运行(runnable)**:线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获 取cpu的使用权。 -3. **运行(running)**:可运行状态(runnable)的线程获得了cpu时间片(timeslice),执行程序代码。 -4. **阻塞(block)**:阻塞状态是指线程因为某种原因放弃了cpu使用权,也即让出了cpu timeslice,暂时停止运行。直到线程进入可运行(runnable)状态,才有 机会再次获得cpu timeslice转到运行(running)状态。阻塞的情况分三种: - - **(一). 等待阻塞**:运行(running)的线程执行o.wait()方法,JVM会把该线程放 入等待队列(waiting queue)中。 - - **(二). 同步阻塞**:运行(running)的线程在获取对象的同步锁时,若该同步 锁 被别的线程占用,则JVM会把该线程放入锁池(lock pool)中。 - - **(三). 其他阻塞**: 运行(running)的线程执行Thread.sleep(long ms)或t.join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入可运行(runnable)状态。 -5. **死亡(dead)**:线程run()、main()方法执行结束,或者因异常退出了run()方法,则该线程结束生命周期。死亡的线程不可再次复生。 - -![](https://user-gold-cdn.xitu.io/2018/8/9/1651f19d7c4e93a3?w=876&h=492&f=png&s=128092) - -备注: 可以用早起坐地铁来比喻这个过程(下面参考自牛客网某位同学的回答): - -1. 还没起床:sleeping -2. 起床收拾好了,随时可以坐地铁出发:Runnable -3. 等地铁来:Waiting -4. 地铁来了,但要排队上地铁:I/O阻塞 -5. 上了地铁,发现暂时没座位:synchronized阻塞 -6. 地铁上找到座位:Running -7. 到达目的地:Dead - - -## 3. 何为多线程? - -多线程就是多个线程同时运行或交替运行。单核CPU的话是顺序执行,也就是交替运行。多核CPU的话,因为每个CPU有自己的运算器,所以在多个CPU中可以同时运行。 - - -## 4. 为什么多线程是必要的? - -1. 使用线程可以把占据长时间的程序中的任务放到后台去处理。 -2. 用户界面可以更加吸引人,这样比如用户点击了一个按钮去触发某些事件的处理,可以弹出一个进度条来显示处理的进度。 -3. 程序的运行速度可能加快。 - -## 5 使用多线程常见的三种方式 - -### ①继承Thread类 - -MyThread.java - -```java -public class MyThread extends Thread { - @Override - public void run() { - super.run(); - System.out.println("MyThread"); - } -} -``` -Run.java - -```java -public class Run { - - public static void main(String[] args) { - MyThread mythread = new MyThread(); - mythread.start(); - System.out.println("运行结束"); - } - -} - -``` -运行结果: -![结果](https://user-gold-cdn.xitu.io/2018/3/20/16243e80f22a2d54?w=161&h=54&f=jpeg&s=7380) -从上面的运行结果可以看出:线程是一个子任务,CPU以不确定的方式,或者说是以随机的时间来调用线程中的run方法。 - -### ②实现Runnable接口 -推荐实现Runnable接口方式开发多线程,因为Java单继承但是可以实现多个接口。 - -MyRunnable.java - -```java -public class MyRunnable implements Runnable { - @Override - public void run() { - System.out.println("MyRunnable"); - } -} -``` - -Run.java - -```java -public class Run { - - public static void main(String[] args) { - Runnable runnable=new MyRunnable(); - Thread thread=new Thread(runnable); - thread.start(); - System.out.println("运行结束!"); - } - -} -``` -运行结果: -![运行结果](https://user-gold-cdn.xitu.io/2018/3/20/16243f4373c6141a?w=137&h=46&f=jpeg&s=7316) - -### ③使用线程池 - -**在《阿里巴巴Java开发手册》“并发处理”这一章节,明确指出线程资源必须通过线程池提供,不允许在应用中自行显示创建线程。** - -**为什么呢?** - -> **使用线程池的好处是减少在创建和销毁线程上所消耗的时间以及系统资源开销,解决资源不足的问题。如果不使用线程池,有可能会造成系统创建大量同类线程而导致消耗完内存或者“过度切换”的问题。** - -**另外《阿里巴巴Java开发手册》中强制线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式,这样的处理方式让写的同学更加明确线程池的运行规则,规避资源耗尽的风险** - -> Executors 返回线程池对象的弊端如下: -> -> - **FixedThreadPool 和 SingleThreadExecutor** : 允许请求的队列长度为 Integer.MAX_VALUE,可能堆积大量的请求,从而导致OOM。 -> - **CachedThreadPool 和 ScheduledThreadPool** : 允许创建的线程数量为 Integer.MAX_VALUE ,可能会创建大量线程,从而导致OOM。 - -对于线程池感兴趣的可以查看我的这篇文章:[《Java多线程学习(八)线程池与Executor 框架》](http://mp.weixin.qq.com/s?__biz=MzU4NDQ4MzU5OA==&mid=2247484042&idx=1&sn=541dbf2cb969a151d79f4a4f837ee1bd&chksm=fd9854ebcaefddfd1876bb96ab218be3ae7b12546695a403075d4ed22e5e17ff30ebdabc8bbf#rd) 点击阅读原文即可查看到该文章的最新版。 - - -## 6 线程的优先级 - -每个线程都具有各自的优先级,**线程的优先级可以在程序中表明该线程的重要性,如果有很多线程处于就绪状态,系统会根据优先级来决定首先使哪个线程进入运行状态**。但这个并不意味着低 -优先级的线程得不到运行,而只是它运行的几率比较小,如垃圾回收机制线程的优先级就比较低。所以很多垃圾得不到及时的回收处理。 - -**线程优先级具有继承特性。** 比如A线程启动B线程,则B线程的优先级和A是一样的。 - -**线程优先级具有随机性。** 也就是说线程优先级高的不一定每一次都先执行完。 - -Thread类中包含的成员变量代表了线程的某些优先级。如**Thread.MIN_PRIORITY(常数1)**,**Thread.NORM_PRIORITY(常数5)**, -**Thread.MAX_PRIORITY(常数10)**。其中每个线程的优先级都在**Thread.MIN_PRIORITY(常数1)** 到**Thread.MAX_PRIORITY(常数10)** 之间,在默认情况下优先级都是**Thread.NORM_PRIORITY(常数5)**。 - -学过操作系统这门课程的话,我们可以发现多线程优先级或多或少借鉴了操作系统对进程的管理。 - - -## 7 Java多线程分类 - -### 用户线程 - -运行在前台,执行具体的任务,如程序的主线程、连接网络的子线程等都是用户线程 - -### 守护线程 - -运行在后台,为其他前台线程服务.也可以说守护线程是JVM中非守护线程的 **“佣人”**。 - - -- **特点:** 一旦所有用户线程都结束运行,守护线程会随JVM一起结束工作 -- **应用:** 数据库连接池中的检测线程,JVM虚拟机启动后的检测线程 -- **最常见的守护线程:** 垃圾回收线程 - - -**如何设置守护线程?** - -可以通过调用 Thead 类的 `setDaemon(true)` 方法设置当前的线程为守护线程。 - -注意事项: - - 1. setDaemon(true)必须在start()方法前执行,否则会抛出IllegalThreadStateException异常 - 2. 在守护线程中产生的新线程也是守护线程 - 3. 不是所有的任务都可以分配给守护线程来执行,比如读写操作或者计算逻辑 - - -## 8 sleep()方法和wait()方法简单对比 - -- 两者最主要的区别在于:**sleep方法没有释放锁,而wait方法释放了锁** 。 -- 两者都可以暂停线程的执行。 -- Wait通常被用于线程间交互/通信,sleep通常被用于暂停执行。 -- wait()方法被调用后,线程不会自动苏醒,需要别的线程调用同一个对象上的notify()或者notifyAll()方法。sleep()方法执行完成后,线程会自动苏醒。 - - -## 9 为什么我们调用start()方法时会执行run()方法,为什么我们不能直接调用run()方法? - -这是另一个非常经典的java多线程面试问题,而且在面试中会经常被问到。很简单,但是很多人都会答不上来! - -new一个Thread,线程进入了新建状态;调用start()方法,会启动一个线程并使线程进入了就绪状态,当分配到时间片后就可以开始运行了。 -start()会执行线程的相应准备工作,然后自动执行run()方法的内容,这是真正的多线程工作。 而直接执行run()方法,会把run方法当成一个mian线程下的普通方法去执行,并不会在某个线程中执行它,所以这并不是多线程工作。 - -**总结: 调用start方法方可启动线程并使线程进入就绪状态,而run方法只是thread的一个普通方法调用,还是在主线程里执行。** - - - - From a79c561a15d0d80f4fc7564297325db760a7a418 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Fri, 8 Mar 2019 19:07:55 +0800 Subject: [PATCH 55/66] Update change file name MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改文件夹名字 --- .../JavaInterviewGithub.md | 0 .../JavaProgrammerNeedKnow.md | 0 .../MostCommonJavaInterviewQuestions/第一周(2018-8-7).md | 0 .../MostCommonJavaInterviewQuestions/第二周(2018-8-13).md | 0 .../MostCommonJavaInterviewQuestions/第四周(2018-8-30).md | 0 {面试必备 => EssentialContentForInterview}/books.md | 0 .../interviewPrepare.md | 0 .../手把手教你用Markdown写一份高质量的简历.md | 0 .../程序员的简历之道.md | 0 {面试必备 => EssentialContentForInterview}/简历模板.md | 0 .../美团面试常见问题总结.md | 0 .../面试必备之乐观锁与悲观锁.md | 0 12 files changed, 0 insertions(+), 0 deletions(-) rename {面试必备 => EssentialContentForInterview}/JavaInterviewGithub.md (100%) rename {面试必备 => EssentialContentForInterview}/JavaProgrammerNeedKnow.md (100%) rename {面试必备 => EssentialContentForInterview}/MostCommonJavaInterviewQuestions/第一周(2018-8-7).md (100%) rename {面试必备 => EssentialContentForInterview}/MostCommonJavaInterviewQuestions/第二周(2018-8-13).md (100%) rename {面试必备 => EssentialContentForInterview}/MostCommonJavaInterviewQuestions/第四周(2018-8-30).md (100%) rename {面试必备 => EssentialContentForInterview}/books.md (100%) rename {面试必备 => EssentialContentForInterview}/interviewPrepare.md (100%) rename {面试必备 => EssentialContentForInterview}/手把手教你用Markdown写一份高质量的简历.md (100%) rename {面试必备 => EssentialContentForInterview}/程序员的简历之道.md (100%) rename {面试必备 => EssentialContentForInterview}/简历模板.md (100%) rename {面试必备 => EssentialContentForInterview}/美团面试常见问题总结.md (100%) rename {面试必备 => EssentialContentForInterview}/面试必备之乐观锁与悲观锁.md (100%) diff --git a/面试必备/JavaInterviewGithub.md b/EssentialContentForInterview/JavaInterviewGithub.md similarity index 100% rename from 面试必备/JavaInterviewGithub.md rename to EssentialContentForInterview/JavaInterviewGithub.md diff --git a/面试必备/JavaProgrammerNeedKnow.md b/EssentialContentForInterview/JavaProgrammerNeedKnow.md similarity index 100% rename from 面试必备/JavaProgrammerNeedKnow.md rename to EssentialContentForInterview/JavaProgrammerNeedKnow.md diff --git a/面试必备/MostCommonJavaInterviewQuestions/第一周(2018-8-7).md b/EssentialContentForInterview/MostCommonJavaInterviewQuestions/第一周(2018-8-7).md similarity index 100% rename from 面试必备/MostCommonJavaInterviewQuestions/第一周(2018-8-7).md rename to EssentialContentForInterview/MostCommonJavaInterviewQuestions/第一周(2018-8-7).md diff --git a/面试必备/MostCommonJavaInterviewQuestions/第二周(2018-8-13).md b/EssentialContentForInterview/MostCommonJavaInterviewQuestions/第二周(2018-8-13).md similarity index 100% rename from 面试必备/MostCommonJavaInterviewQuestions/第二周(2018-8-13).md rename to EssentialContentForInterview/MostCommonJavaInterviewQuestions/第二周(2018-8-13).md diff --git a/面试必备/MostCommonJavaInterviewQuestions/第四周(2018-8-30).md b/EssentialContentForInterview/MostCommonJavaInterviewQuestions/第四周(2018-8-30).md similarity index 100% rename from 面试必备/MostCommonJavaInterviewQuestions/第四周(2018-8-30).md rename to EssentialContentForInterview/MostCommonJavaInterviewQuestions/第四周(2018-8-30).md diff --git a/面试必备/books.md b/EssentialContentForInterview/books.md similarity index 100% rename from 面试必备/books.md rename to EssentialContentForInterview/books.md diff --git a/面试必备/interviewPrepare.md b/EssentialContentForInterview/interviewPrepare.md similarity index 100% rename from 面试必备/interviewPrepare.md rename to EssentialContentForInterview/interviewPrepare.md diff --git a/面试必备/手把手教你用Markdown写一份高质量的简历.md b/EssentialContentForInterview/手把手教你用Markdown写一份高质量的简历.md similarity index 100% rename from 面试必备/手把手教你用Markdown写一份高质量的简历.md rename to EssentialContentForInterview/手把手教你用Markdown写一份高质量的简历.md diff --git a/面试必备/程序员的简历之道.md b/EssentialContentForInterview/程序员的简历之道.md similarity index 100% rename from 面试必备/程序员的简历之道.md rename to EssentialContentForInterview/程序员的简历之道.md diff --git a/面试必备/简历模板.md b/EssentialContentForInterview/简历模板.md similarity index 100% rename from 面试必备/简历模板.md rename to EssentialContentForInterview/简历模板.md diff --git a/面试必备/美团面试常见问题总结.md b/EssentialContentForInterview/美团面试常见问题总结.md similarity index 100% rename from 面试必备/美团面试常见问题总结.md rename to EssentialContentForInterview/美团面试常见问题总结.md diff --git a/面试必备/面试必备之乐观锁与悲观锁.md b/EssentialContentForInterview/面试必备之乐观锁与悲观锁.md similarity index 100% rename from 面试必备/面试必备之乐观锁与悲观锁.md rename to EssentialContentForInterview/面试必备之乐观锁与悲观锁.md From d62a018043df7b2df8ef733d5221e85f4a55a040 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Fri, 8 Mar 2019 19:11:51 +0800 Subject: [PATCH 56/66] Update change file name --- .../{ => PreparingForInterview}/JavaProgrammerNeedKnow.md | 0 EssentialContentForInterview/{ => PreparingForInterview}/books.md | 0 .../{ => PreparingForInterview}/interviewPrepare.md | 0 .../{ => PreparingForInterview}/程序员的简历之道.md | 0 .../{ => PreparingForInterview}/美团面试常见问题总结.md | 0 5 files changed, 0 insertions(+), 0 deletions(-) rename EssentialContentForInterview/{ => PreparingForInterview}/JavaProgrammerNeedKnow.md (100%) rename EssentialContentForInterview/{ => PreparingForInterview}/books.md (100%) rename EssentialContentForInterview/{ => PreparingForInterview}/interviewPrepare.md (100%) rename EssentialContentForInterview/{ => PreparingForInterview}/程序员的简历之道.md (100%) rename EssentialContentForInterview/{ => PreparingForInterview}/美团面试常见问题总结.md (100%) diff --git a/EssentialContentForInterview/JavaProgrammerNeedKnow.md b/EssentialContentForInterview/PreparingForInterview/JavaProgrammerNeedKnow.md similarity index 100% rename from EssentialContentForInterview/JavaProgrammerNeedKnow.md rename to EssentialContentForInterview/PreparingForInterview/JavaProgrammerNeedKnow.md diff --git a/EssentialContentForInterview/books.md b/EssentialContentForInterview/PreparingForInterview/books.md similarity index 100% rename from EssentialContentForInterview/books.md rename to EssentialContentForInterview/PreparingForInterview/books.md diff --git a/EssentialContentForInterview/interviewPrepare.md b/EssentialContentForInterview/PreparingForInterview/interviewPrepare.md similarity index 100% rename from EssentialContentForInterview/interviewPrepare.md rename to EssentialContentForInterview/PreparingForInterview/interviewPrepare.md diff --git a/EssentialContentForInterview/程序员的简历之道.md b/EssentialContentForInterview/PreparingForInterview/程序员的简历之道.md similarity index 100% rename from EssentialContentForInterview/程序员的简历之道.md rename to EssentialContentForInterview/PreparingForInterview/程序员的简历之道.md diff --git a/EssentialContentForInterview/美团面试常见问题总结.md b/EssentialContentForInterview/PreparingForInterview/美团面试常见问题总结.md similarity index 100% rename from EssentialContentForInterview/美团面试常见问题总结.md rename to EssentialContentForInterview/PreparingForInterview/美团面试常见问题总结.md From 75ee47edf8ee406f9ed6d1d653d0503d76c70f39 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Fri, 8 Mar 2019 19:20:01 +0800 Subject: [PATCH 57/66] Update link MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改了文件夹的名字故修改链接地址 --- README.md | 23 ++++++++++------------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/README.md b/README.md index 8aef7455..fda9aeff 100644 --- a/README.md +++ b/README.md @@ -161,25 +161,22 @@ * [8 张图读懂大型网站技术架构](https://github.com/Snailclimb/JavaGuide/blob/master/架构/8%20张图读懂大型网站技术架构.md) * [【面试精选】关于大型网站系统架构你不得不懂的10个问题](https://github.com/Snailclimb/JavaGuide/blob/master/架构/【面试精选】关于大型网站系统架构你不得不懂的10个问题.md) -## :musical_note: 面试必备 +## :musical_note: 面试必备(Essential content for the interview) ### 备战面试 -* [【备战面试1】程序员的简历就该这样写](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/程序员的简历之道.md) -* [【备战面试2】初出茅庐的程序员该如何准备面试?](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/interviewPrepare.md) -* [【备战面试3】7个大部分程序员在面试前很关心的问题](https://github.com/Snailclimb/JavaGuide/blob/master/面试必备/JavaProgrammerNeedKnow.md) -* [【备战面试4】Java程序员必备书单](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/books.md) -* [【备战面试5】美团面试常见问题总结(附详解答案)](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/美团面试常见问题总结.md) +* [【备战面试1】程序员的简历就该这样写](https://github.com/Snailclimb/JavaGuide/blob/master/EssentialContentForInterview/PreparingForInterview/程序员的简历之道.md) +* [【备战面试2】初出茅庐的程序员该如何准备面试?](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/PreparingForInterview/interviewPrepare.md) +* [【备战面试3】7个大部分程序员在面试前很关心的问题](https://github.com/Snailclimb/JavaGuide/blob/master/EssentialContentForInterview/PreparingForInterview/JavaProgrammerNeedKnow.md) +* [【备战面试4】Java程序员必备书单](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/PreparingForInterview/books.md) +* [【备战面试5】美团面试常见问题总结(附详解答案)](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/PreparingForInterview/美团面试常见问题总结.md) +### 最常见的Java面试题总结 -### 最最最常见的Java面试题总结 - -这里会分享一些出现频率极其极其高的面试题,初定周更一篇,什么时候更完什么时候停止。 - -* [第一周(2018-8-7)](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/最最最常见的Java面试题总结/第一周(2018-8-7).md) (为什么 Java 中只有值传递、==与equals、 hashCode与equals) -* [第二周(2018-8-13)](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/最最最常见的Java面试题总结/第二周(2018-8-13).md)(String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?、什么是反射机制?反射机制的应用场景有哪些?......) +* [第一周(2018-8-7)](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/MostCommonJavaInterviewQuestions/第一周(2018-8-7).md) (为什么 Java 中只有值传递、==与equals、 hashCode与equals) +* [第二周(2018-8-13)](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/MostCommonJavaInterviewQuestions/第二周(2018-8-13).md)(String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?、什么是反射机制?反射机制的应用场景有哪些?......) * [第三周(2018-08-22)](https://github.com/Snailclimb/Java-Guide/blob/master/Java相关/这几道Java集合框架面试题几乎必问.md) (Arraylist 与 LinkedList 异同、ArrayList 与 Vector 区别、HashMap的底层实现、HashMap 和 Hashtable 的区别、HashMap 的长度为什么是2的幂次方、HashSet 和 HashMap 区别、ConcurrentHashMap 和 Hashtable 的区别、ConcurrentHashMap线程安全的具体实现方式/底层具体实现、集合框架底层数据结构总结) -* [第四周(2018-8-30).md](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/最最最常见的Java面试题总结/第四周(2018-8-30).md) (主要内容是几道面试常问的多线程基础题。) +* [第四周(2018-8-30).md](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/MostCommonJavaInterviewQuestions/第四周(2018-8-30).md) (主要内容是几道面试常问的多线程基础题。) ### Java学习/面试开源仓库推荐 From 564a90c8b01263156d88e474530942cead383b07 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Fri, 8 Mar 2019 19:31:41 +0800 Subject: [PATCH 58/66] Update Modify file name and directory address --- .../JavaInterviewLibrary.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename EssentialContentForInterview/{JavaInterviewGithub.md => PreparingForInterview/JavaInterviewLibrary.md} (100%) diff --git a/EssentialContentForInterview/JavaInterviewGithub.md b/EssentialContentForInterview/PreparingForInterview/JavaInterviewLibrary.md similarity index 100% rename from EssentialContentForInterview/JavaInterviewGithub.md rename to EssentialContentForInterview/PreparingForInterview/JavaInterviewLibrary.md From 40752e158e283534fa247aa8b5f2a0e3c5acbef2 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Fri, 8 Mar 2019 19:32:23 +0800 Subject: [PATCH 59/66] Update README.md --- README.md | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index fda9aeff..ca7dee83 100644 --- a/README.md +++ b/README.md @@ -39,9 +39,9 @@ * [Redis](#redis) * [:punch: 架构](#punch-架构) * [:musical_note: 面试必备](#musical_note-面试必备) - * [备战面试](#备战面试) - * [最最最常见的Java面试题总结](#最最最常见的java面试题总结) - * [Java学习/面试开源仓库推荐](#java学习面试开源仓库推荐) +* [:musical_note: 面试必备\(Essential content for the interview\)](#musical_note-面试必备essential-content-for-the-interview) + * [备战面试\(Preparing for an interview\)](#备战面试preparing-for-an-interview) + * [最常见的Java面试题总结\(Summary of the most common Java interview questions\)](#最常见的java面试题总结summary-of-the-most-common-java-interview-questions) * [:art: 闲谈](#art-闲谈) * [:envelope: 说明](#envelope-说明) @@ -163,25 +163,22 @@ ## :musical_note: 面试必备(Essential content for the interview) -### 备战面试 +### 备战面试(Preparing for an interview) * [【备战面试1】程序员的简历就该这样写](https://github.com/Snailclimb/JavaGuide/blob/master/EssentialContentForInterview/PreparingForInterview/程序员的简历之道.md) * [【备战面试2】初出茅庐的程序员该如何准备面试?](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/PreparingForInterview/interviewPrepare.md) * [【备战面试3】7个大部分程序员在面试前很关心的问题](https://github.com/Snailclimb/JavaGuide/blob/master/EssentialContentForInterview/PreparingForInterview/JavaProgrammerNeedKnow.md) * [【备战面试4】Java程序员必备书单](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/PreparingForInterview/books.md) -* [【备战面试5】美团面试常见问题总结(附详解答案)](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/PreparingForInterview/美团面试常见问题总结.md) +* [【备战面试5】Github上开源的Java面试/学习相关的仓库推荐](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/PreparingForInterview/JavaInterviewLibrary.md) +* [【备战面试6】美团面试常见问题总结(附详解答案)](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/PreparingForInterview/美团面试常见问题总结.md) -### 最常见的Java面试题总结 +### 最常见的Java面试题总结(Summary of the most common Java interview questions) * [第一周(2018-8-7)](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/MostCommonJavaInterviewQuestions/第一周(2018-8-7).md) (为什么 Java 中只有值传递、==与equals、 hashCode与equals) * [第二周(2018-8-13)](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/MostCommonJavaInterviewQuestions/第二周(2018-8-13).md)(String和StringBuffer、StringBuilder的区别是什么?String为什么是不可变的?、什么是反射机制?反射机制的应用场景有哪些?......) * [第三周(2018-08-22)](https://github.com/Snailclimb/Java-Guide/blob/master/Java相关/这几道Java集合框架面试题几乎必问.md) (Arraylist 与 LinkedList 异同、ArrayList 与 Vector 区别、HashMap的底层实现、HashMap 和 Hashtable 的区别、HashMap 的长度为什么是2的幂次方、HashSet 和 HashMap 区别、ConcurrentHashMap 和 Hashtable 的区别、ConcurrentHashMap线程安全的具体实现方式/底层具体实现、集合框架底层数据结构总结) * [第四周(2018-8-30).md](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/MostCommonJavaInterviewQuestions/第四周(2018-8-30).md) (主要内容是几道面试常问的多线程基础题。) -### Java学习/面试开源仓库推荐 - -* [盘点一下Github上开源的Java面试/学习相关的仓库,看完弄懂薪资至少增加10k](https://github.com/Snailclimb/Java-Guide/blob/master/面试必备/JavaInterviewGithub.md) - ## :art: 闲谈 * [选择技术方向都要考虑哪些因素](https://github.com/Snailclimb/Java-Guide/blob/master/闲谈/选择技术方向都要考虑哪些因素.md) From a51182bdd6f30c52d981222fc5156a06a4e53cdd Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Fri, 8 Mar 2019 19:36:56 +0800 Subject: [PATCH 60/66] Update directory error --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index ca7dee83..520b34e3 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,6 @@ * [MySQL](#mysql) * [Redis](#redis) * [:punch: 架构](#punch-架构) -* [:musical_note: 面试必备](#musical_note-面试必备) * [:musical_note: 面试必备\(Essential content for the interview\)](#musical_note-面试必备essential-content-for-the-interview) * [备战面试\(Preparing for an interview\)](#备战面试preparing-for-an-interview) * [最常见的Java面试题总结\(Summary of the most common Java interview questions\)](#最常见的java面试题总结summary-of-the-most-common-java-interview-questions) From 8923dd0b2c1ff6b311f679a3933279df6531ebac Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Fri, 8 Mar 2019 20:13:27 +0800 Subject: [PATCH 61/66] Update directory --- README.md | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/README.md b/README.md index 520b34e3..b9948945 100644 --- a/README.md +++ b/README.md @@ -16,33 +16,33 @@ ## 目录 -* [:coffee: Java](#coffee-java) +* [Java](#java) * [Java/J2EE 基础](#javaj2ee-基础) * [Java 集合框架](#java-集合框架) * [Java 多线程](#java-多线程) * [Java BIO,NIO,AIO](#java-bionioaio) * [Java 虚拟机 jvm](#java-虚拟机-jvm) * [设计模式](#设计模式) -* [:open_file_folder: 数据结构与算法](#open_file_folder-数据结构与算法) +* [数据结构与算法](#数据结构与算法) * [数据结构](#数据结构) * [算法](#算法) -* [:computer: 计算机网络与数据通信](#computer-计算机网络与数据通信) +* [计算机网络与数据通信](#计算机网络与数据通信) * [网络相关](#网络相关) * [数据通信\(RESTful,RPC,消息队列\)总结](#数据通信restfulrpc消息队列总结) -* [:iphone: 操作系统](#iphone-操作系统) +* [操作系统](#操作系统) * [Linux相关](#linux相关) -* [:pencil2: 主流框架/软件](#pencil2-主流框架软件) +* [主流框架/软件](#主流框架软件) * [Spring](#spring) * [ZooKeeper](#zookeeper) -* [:floppy_disk: 数据存储](#floppy_disk-数据存储) +* [数据存储](#数据存储) * [MySQL](#mysql) * [Redis](#redis) -* [:punch: 架构](#punch-架构) -* [:musical_note: 面试必备\(Essential content for the interview\)](#musical_note-面试必备essential-content-for-the-interview) +* [架构](#架构) +* [面试必备\(Essential content for the interview\)](#面试必备essential-content-for-the-interview) * [备战面试\(Preparing for an interview\)](#备战面试preparing-for-an-interview) * [最常见的Java面试题总结\(Summary of the most common Java interview questions\)](#最常见的java面试题总结summary-of-the-most-common-java-interview-questions) -* [:art: 闲谈](#art-闲谈) -* [:envelope: 说明](#envelope-说明) +* [闲谈](#闲谈) +* [说明](#说明) ## 待办 @@ -52,7 +52,7 @@ * [ ] Netty 总结 * [ ] 数据结构总结重构 -## :coffee: Java +## Java ### Java/J2EE 基础 @@ -94,7 +94,7 @@ * [设计模式系列文章](https://github.com/Snailclimb/Java_Guide/blob/master/Java相关/设计模式.md) -## :open_file_folder: 数据结构与算法 +## 数据结构与算法 ### 数据结构 @@ -107,7 +107,7 @@ * [算法总结——几道常见的子符串算法题 ](https://github.com/Snailclimb/Java_Guide/blob/master/数据结构与算法/搞定BAT面试——几道常见的子符串算法题.md) * [算法总结——几道常见的链表算法题 ](https://github.com/Snailclimb/Java_Guide/blob/master/数据结构与算法/Leetcode-LinkList1.md) -## :computer: 计算机网络与数据通信 +## 计算机网络与数据通信 ### 网络相关 @@ -122,13 +122,13 @@ * [消息队列总结:新手也能看懂,消息队列其实很简单](https://github.com/Snailclimb/Java-Guide/blob/master/计算机网络与数据通信/message-queue.md) * [一文搞懂 RabbitMQ 的重要概念以及安装](https://github.com/Snailclimb/Java-Guide/blob/master/计算机网络与数据通信/rabbitmq.md) -## :iphone: 操作系统 +## 操作系统 ### Linux相关 * [后端程序员必备的 Linux 基础知识](https://github.com/Snailclimb/Java-Guide/blob/master/操作系统/后端程序员必备的Linux基础知识.md) * [Shell 编程入门](https://github.com/Snailclimb/Java-Guide/blob/master/操作系统/Shell.md) -## :pencil2: 主流框架/软件 +## 主流框架/软件 ### Spring @@ -141,7 +141,7 @@ * [可能是把 ZooKeeper 概念讲的最清楚的一篇文章](https://github.com/Snailclimb/Java_Guide/blob/master/主流框架/ZooKeeper.md) * [ZooKeeper 数据模型和常见命令了解一下,速度收藏!](https://github.com/Snailclimb/Java_Guide/blob/master/主流框架/ZooKeeper数据模型和常见命令.md) -## :floppy_disk: 数据存储 +## 数据存储 ### MySQL @@ -154,13 +154,13 @@ * [Redlock分布式锁](https://github.com/Snailclimb/Java_Guide/blob/master/数据存储/Redis/Redlock分布式锁.md) * [如何做可靠的分布式锁,Redlock真的可行么](https://github.com/Snailclimb/Java_Guide/blob/master/数据存储/Redis/如何做可靠的分布式锁,Redlock真的可行么.md) -## :punch: 架构 +## 架构 * [一文读懂分布式应该学什么](https://github.com/Snailclimb/Java_Guide/blob/master/架构/分布式.md) * [8 张图读懂大型网站技术架构](https://github.com/Snailclimb/JavaGuide/blob/master/架构/8%20张图读懂大型网站技术架构.md) * [【面试精选】关于大型网站系统架构你不得不懂的10个问题](https://github.com/Snailclimb/JavaGuide/blob/master/架构/【面试精选】关于大型网站系统架构你不得不懂的10个问题.md) -## :musical_note: 面试必备(Essential content for the interview) +## 面试必备(Essential content for the interview) ### 备战面试(Preparing for an interview) @@ -178,7 +178,7 @@ * [第三周(2018-08-22)](https://github.com/Snailclimb/Java-Guide/blob/master/Java相关/这几道Java集合框架面试题几乎必问.md) (Arraylist 与 LinkedList 异同、ArrayList 与 Vector 区别、HashMap的底层实现、HashMap 和 Hashtable 的区别、HashMap 的长度为什么是2的幂次方、HashSet 和 HashMap 区别、ConcurrentHashMap 和 Hashtable 的区别、ConcurrentHashMap线程安全的具体实现方式/底层具体实现、集合框架底层数据结构总结) * [第四周(2018-8-30).md](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/MostCommonJavaInterviewQuestions/第四周(2018-8-30).md) (主要内容是几道面试常问的多线程基础题。) -## :art: 闲谈 +## 闲谈 * [选择技术方向都要考虑哪些因素](https://github.com/Snailclimb/Java-Guide/blob/master/闲谈/选择技术方向都要考虑哪些因素.md) * [结束了我短暂的秋招,说点自己的感受](https://github.com/Snailclimb/JavaGuide/blob/master/闲谈/2018%20%E7%A7%8B%E6%8B%9B.md) @@ -187,7 +187,7 @@ *** -## :envelope: 说明 +## 说明 ### 介绍 From 852bf52cef0040573a27c14694851335da48de19 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Fri, 8 Mar 2019 20:18:26 +0800 Subject: [PATCH 62/66] =?UTF-8?q?Create=205=E9=9D=A2=E9=98=BF=E9=87=8C,?= =?UTF-8?q?=E7=BB=88=E8=8E=B7offer.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../5面阿里,终获offer.md | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 EssentialContentForInterview/BATJrealInterviewExperience/5面阿里,终获offer.md diff --git a/EssentialContentForInterview/BATJrealInterviewExperience/5面阿里,终获offer.md b/EssentialContentForInterview/BATJrealInterviewExperience/5面阿里,终获offer.md new file mode 100644 index 00000000..2a7a0431 --- /dev/null +++ b/EssentialContentForInterview/BATJrealInterviewExperience/5面阿里,终获offer.md @@ -0,0 +1,79 @@ +# 联系方式 + +- 手机: +- Email: +- 微信: + +# 个人信息 + + - 姓名/性别/出生日期 + - 本科/xxx计算机系xxx专业/英语六级 + - 技术博客:[http://snailclimb.top/](http://snailclimb.top/) + - 荣誉奖励:获得了什么奖(获奖时间) + - Github:[https://github.com/Snailclimb ](https://github.com/Snailclimb) + - Github Resume: [http://resume.github.io/?Snailclimb](http://resume.github.io/?Snailclimb) + - 期望职位:Java 研发程序员/大数据工程师(Java后台开发为首选) + - 期望城市:xxx城市 + + +# 项目经历 + +## xxx项目 + +### 项目描述 + +介绍该项目是做什么的、使用到了什么技术以及你对项目整体设计的一个感受 + +### 责任描述 + +主要可以从下面三点来写: + +1. 在这个项目中你负责了什么、做了什么、担任了什么角色 +2. 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用 +3. 另外项目描述中,最好可以体现自己的综合素质,比如你是如何协调项目组成员协同开发的或者在遇到某一个棘手的问题的时候你是如何解决的。 + +# 开源项目和技术文章 + +## 开源项目 + +- [Java-Guide](https://github.com/Snailclimb/Java-Guide) :一份涵盖大部分Java程序员所需要掌握的核心知识。Star:3.9K; Fork:0.9k。 + + +## 技术文章推荐 + +- [可能是把Java内存区域讲的最清楚的一篇文章](https://juejin.im/post/5b7d69e4e51d4538ca5730cb) +- [搞定JVM垃圾回收就是这么简单](https://juejin.im/post/5b85ea54e51d4538dd08f601) +- [前端&后端程序员必备的Linux基础知识](https://juejin.im/post/5b3b19856fb9a04fa42f8c71) +- [可能是把Docker的概念讲的最清楚的一篇文章](https://juejin.im/post/5b260ec26fb9a00e8e4b031a) + + +# 校园经历(可选) + +## 2016-2017 + +担任学校社团-致深社副会长,主要负责团队每周活动的组建以及每周例会的主持。 + +## 2017-2018 + 担任学校传媒组织:“长江大学在线信息传媒”的副站长以及安卓组成员。主要负责每周例会主持、活动策划以及学校校园通APP的研发工作。 + + +# 技能清单 + +以下均为我熟练使用的技能 + +- Web开发:PHP/Hack/Node +- Web框架:ThinkPHP/Yaf/Yii/Lavarel/LazyPHP +- 前端框架:Bootstrap/AngularJS/EmberJS/HTML5/Cocos2dJS/ionic +- 前端工具:Bower/Gulp/SaSS/LeSS/PhoneGap +- 数据库相关:MySQL/PgSQL/PDO/SQLite +- 版本管理、文档和自动化部署工具:Svn/Git/PHPDoc/Phing/Composer +- 单元测试:PHPUnit/SimpleTest/Qunit +- 云和开放平台:SAE/BAE/AWS/微博开放平台/微信应用开发 + +# 自我评价(可选) + +自我发挥。切记不要过度自夸!!! + + +### 感谢您花时间阅读我的简历,期待能有机会和您共事。 + From 5814035bcf2e1254f8df050e2615fda5754d9b61 Mon Sep 17 00:00:00 2001 From: Snailclimb Date: Fri, 8 Mar 2019 20:21:51 +0800 Subject: [PATCH 63/66] =?UTF-8?q?Update=205=E9=9D=A2=E9=98=BF=E9=87=8C,?= =?UTF-8?q?=E7=BB=88=E8=8E=B7offer.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../5面阿里,终获offer.md | 131 ++++++++++-------- 1 file changed, 72 insertions(+), 59 deletions(-) diff --git a/EssentialContentForInterview/BATJrealInterviewExperience/5面阿里,终获offer.md b/EssentialContentForInterview/BATJrealInterviewExperience/5面阿里,终获offer.md index 2a7a0431..7772891d 100644 --- a/EssentialContentForInterview/BATJrealInterviewExperience/5面阿里,终获offer.md +++ b/EssentialContentForInterview/BATJrealInterviewExperience/5面阿里,终获offer.md @@ -1,79 +1,92 @@ -# 联系方式 +> 作者:ppxyn。本文来自读者投稿,同时也欢迎各位投稿,**对于不错的原创文章我根据你的选择给予现金(50-200)、付费专栏或者任选书籍进行奖励!所以,快提 pr 或者邮件的方式(邮件地址在主页)给我投稿吧!** 当然,我觉得奖励是次要的,最重要的是你可以从自己整理知识点的过程中学习到很多知识。 -- 手机: -- Email: -- 微信: +在接触 Java 之前我接触的比较多的是硬件方面,用的比较多的语言就是C和C++。到了大三我才正式选择 Java 方向,到目前为止使用Java到现在大概有一年多的时间,所以Java算不上很好。刚开始投递的时候,实习刚辞职,也没准备笔试面试,很多东西都忘记了。所以,刚开始我并没有直接就投递阿里,毕竟心里还是有一点点小害怕的。于是,我就先投递了几个不算大的公司来练手,就是想着刷刷经验而已或者说是练练手(ps:还是挺对不起那些公司的)。面了一个月其他公司后,我找了我实验室的学长内推我,后面就有了这5次面试。 -# 个人信息 +下面简单的说一下我的这5次面试:4次技术面+1次HR面,希望我的经历能对你有所帮助。 - - 姓名/性别/出生日期 - - 本科/xxx计算机系xxx专业/英语六级 - - 技术博客:[http://snailclimb.top/](http://snailclimb.top/) - - 荣誉奖励:获得了什么奖(获奖时间) - - Github:[https://github.com/Snailclimb ](https://github.com/Snailclimb) - - Github Resume: [http://resume.github.io/?Snailclimb](http://resume.github.io/?Snailclimb) - - 期望职位:Java 研发程序员/大数据工程师(Java后台开发为首选) - - 期望城市:xxx城市 - + -# 项目经历 +- [一面\(技术面\)](#一面技术面) +- [二面\(技术面\)](#二面技术面) +- [三面\(技术面\)](#三面技术面) +- [四面\(半个技术面\)](#四面半个技术面) +- [五面\(HR面\)](#五面hr面) +- [总结](#总结) -## xxx项目 - -### 项目描述 - -介绍该项目是做什么的、使用到了什么技术以及你对项目整体设计的一个感受 - -### 责任描述 - -主要可以从下面三点来写: - -1. 在这个项目中你负责了什么、做了什么、担任了什么角色 -2. 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用 -3. 另外项目描述中,最好可以体现自己的综合素质,比如你是如何协调项目组成员协同开发的或者在遇到某一个棘手的问题的时候你是如何解决的。 - -# 开源项目和技术文章 - -## 开源项目 - -- [Java-Guide](https://github.com/Snailclimb/Java-Guide) :一份涵盖大部分Java程序员所需要掌握的核心知识。Star:3.9K; Fork:0.9k。 + -## 技术文章推荐 +### 一面(技术面) -- [可能是把Java内存区域讲的最清楚的一篇文章](https://juejin.im/post/5b7d69e4e51d4538ca5730cb) -- [搞定JVM垃圾回收就是这么简单](https://juejin.im/post/5b85ea54e51d4538dd08f601) -- [前端&后端程序员必备的Linux基础知识](https://juejin.im/post/5b3b19856fb9a04fa42f8c71) -- [可能是把Docker的概念讲的最清楚的一篇文章](https://juejin.im/post/5b260ec26fb9a00e8e4b031a) +1. 自我介绍(主要讲自己会的技术细节,项目经验,经历那些就一语带过,后面面试官会问你的)。 +2. 聊聊项目(就是一个很普通的分布式商城,自己做了一些改进),让我画了整个项目的架构图,然后针对项目抛了一系列的提高性能的问题,还问了我做项目的过程中遇到了那些问题,如何解决的,差不读就这些吧。 +3. 可能是我前面说了我会数据库优化,然后面试官就开始问索引、事务隔离级别、悲观锁和乐观锁、索引、ACID、MVVC这些问题。 +4. 浏览器输入URL发生了什么? TCP和UDP区别? TCP如何保证传输可靠性? +5. 讲下跳表怎么实现的?哈夫曼编码是怎么回事?非递归且不用额外空间(不用栈),如何遍历二叉树 +6. 后面又问了很多JVM方面的问题,比如Java内存模型、常见的垃圾回收器、双亲委派模型这些 +7. 你有什么问题要问吗? +### 二面(技术面) -# 校园经历(可选) +1. 自我介绍(主要讲自己会的技术细节,项目经验,经历那些就一语带过,后面面试官会问你的)。 +2. 操作系统的内存管理机制 +3. 进程和线程的区别 +4. 说下你对线程安全的理解 +5. volatile 有什么作用 ,sychronized和lock有什么区别 +6. ReentrantLock实现原理 +7. 用过CountDownLatch么?什么场景下用的? +8. AQS底层原理。 +9. 造成死锁的原因有哪些,如何预防? +10. 加锁会带来哪些性能问题。如何解决? +11. HashMap、ConcurrentHashMap源码。HashMap是线程安全的吗?Hashtable呢?ConcurrentHashMap有了解吗? +12. 是否可以实习? +13. 你有什么问题要问吗? -## 2016-2017 +### 三面(技术面) -担任学校社团-致深社副会长,主要负责团队每周活动的组建以及每周例会的主持。 +1. 有没有参加过 ACM 或者他竞赛,有没有拿过什么奖?( 我说我没参加过ACM,本科参加过数学建模竞赛,名次并不好,没拿过什么奖。面试官好像有点失望,然后我又赶紧补充说我和老师一起做过一个项目,目前已经投入使用。面试官还比较感兴趣,后面又和他聊了一下这个项目。) +2. 研究生期间,做过什么项目,发过论文吗?有什么成果吗? +3. 你觉得你有什么优点和缺点?你觉得你相比于那些比你更优秀的人欠缺什么? +4. 有读过什么源码吗?(我说我读过 Java 集合框架和 Netty 的,面试官说 Java 集合前几面一定问的差不多,就不问了,然后就问我 Netty的,我当时很慌啊!) +5. 介绍一下自己对 Netty 的认识,为什么要用。说说业务中,Netty 的使用场景。什么是TCP 粘包/拆包,解决办法。Netty线程模型。Dubbo 在使用 Netty 作为网络通讯时候是如何避免粘包与半包问题?讲讲Netty的零拷贝?巴拉巴拉问了好多,我记得有好几个我都没回答上来,心里想着凉凉了啊。 +6. 用到了那些开源技术、在开源领域做过贡献吗? +7. 常见的排序算法及其复杂度,现场写了快排。 +8. 红黑树,B树的一些问题。 +9. 讲讲算法及数据结构在实习项目中的用处。 +10. 自己的未来规划(就简单描述了一下自己未来的设想啊,说的还挺诚恳,面试官好像还挺满意的) +11. 你有什么问题要问吗? -## 2017-2018 - 担任学校传媒组织:“长江大学在线信息传媒”的副站长以及安卓组成员。主要负责每周例会主持、活动策划以及学校校园通APP的研发工作。 - - -# 技能清单 +### 四面(半个技术面) -以下均为我熟练使用的技能 +三面面完当天,晚上9点接到面试电话,感觉像是部门或者项目主管。 这个和之前的面试不大相同,感觉面试官主要考察的是你解决问题的能力、学习能力和团队协作能力。 -- Web开发:PHP/Hack/Node -- Web框架:ThinkPHP/Yaf/Yii/Lavarel/LazyPHP -- 前端框架:Bootstrap/AngularJS/EmberJS/HTML5/Cocos2dJS/ionic -- 前端工具:Bower/Gulp/SaSS/LeSS/PhoneGap -- 数据库相关:MySQL/PgSQL/PDO/SQLite -- 版本管理、文档和自动化部署工具:Svn/Git/PHPDoc/Phing/Composer -- 单元测试:PHPUnit/SimpleTest/Qunit -- 云和开放平台:SAE/BAE/AWS/微博开放平台/微信应用开发 +1. 让我讲一个自己觉得最不错的项目。然后就巴拉巴拉的聊,我记得主要是问了项目是如何进行协作的、遇到问题是如何解决的、与他人发生冲突是如何解决的这些。感觉聊了挺久。 +2. 出现 OOM 后你会怎么排查问题? +3. 自己平时是如何学习新技术的?除了 Java 还回去了解其他技术吗? +4. 上一段实习经历的收获。 +5. NginX如何做负载均衡、常见的负载均衡算法有哪些、一致性哈希的一致性是什么意思、一致性哈希是如何做哈希的 +6. 你有什么问题问我吗? +7. 还有一些其他的,想不起来了,感觉这一面不是偏向技术来问。 -# 自我评价(可选) +## 五面(HR面) -自我发挥。切记不要过度自夸!!! +1. 自我介绍(主要讲能突出自己的经历,会的编程技术一语带过)。 +2. 你觉得你有什么优点和缺点?如何克服这些缺点? +3. 说一件大学里你自己比较有成就感的一件事情,为此付出了那些努力。 +4. 你前面跟其他面试官讲过一些你做的项目吧?可以给我讲讲吗?你要考虑到我不是一个做技术的人,怎么让我也听得懂。项目中有什么问题,你怎么解决的?你最大的收获是什么? +5. 你目前有面试过其他公司吗?如果让你选,这些公司和阿里,你选哪个?(送分题,回答不好可能送命) +6. 你期望的工作地点是哪里? +7. 你有什么问题吗? +### 总结 -### 感谢您花时间阅读我的简历,期待能有机会和您共事。 +1. 可以看出面试官问我的很多问题都是比较常见的问题,所以记得一定要提前准备,还要深入准备,不要回答的太皮毛。很多时候一个问题可能会牵扯出很多问题,遇到不会的问题不要慌,冷静分析,如果你真的回答不上来,也不要担心自己是不是就要挂了,很可能这个问题本身就比较难。 +2. 表达能力和沟通能力太重要了,一定要提前练一下,我自身就是一个不太会说话的人,所以,面试前我对于自我介绍、项目介绍和一些常见问题都在脑子里练了好久,确保面试的时候能够很清晰和简洁的说出来。 +3. 等待面试的过程和面试的过程真的好熬人,那段时间我压力也比较大,好在我私下找到学长聊了很多,心情也好了很多。 +4. 面试之后及时总结,面的好的话,不要得意,尽快准备下一场面试吧! +我觉得我还算是比较幸运的,最后也祝大家都能获得心仪的Offer。 + + + + \ No newline at end of file From 519ff1590a2af28fe3b7c51df190cf6c613af3ee Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Fri, 8 Mar 2019 20:28:23 +0800 Subject: [PATCH 64/66] =?UTF-8?q?Add=20BATJ=E7=9C=9F=E5=AE=9E=E9=9D=A2?= =?UTF-8?q?=E7=BB=8F:5=E9=9D=A2=E9=98=BF=E9=87=8C,=E7=BB=88=E8=8E=B7offer?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index b9948945..03222e69 100644 --- a/README.md +++ b/README.md @@ -40,6 +40,7 @@ * [架构](#架构) * [面试必备\(Essential content for the interview\)](#面试必备essential-content-for-the-interview) * [备战面试\(Preparing for an interview\)](#备战面试preparing-for-an-interview) + * [BATJ真实面经\(BATJ real interview experience\)](#batj真实面经batj-real-interview-experience) * [最常见的Java面试题总结\(Summary of the most common Java interview questions\)](#最常见的java面试题总结summary-of-the-most-common-java-interview-questions) * [闲谈](#闲谈) * [说明](#说明) @@ -60,7 +61,6 @@ * [J2EE 基础知识回顾](https://github.com/Snailclimb/Java-Guide/blob/master/Java相关/J2EE基础知识.md) * [Java常见关键字总结:static、final、this、super](https://github.com/Snailclimb/Java-Guide/blob/master/Java相关/final、static、this、super.md) - ### Java 集合框架 * [这几道Java集合框架面试题几乎必问](https://github.com/Snailclimb/Java-Guide/blob/master/Java相关/这几道Java集合框架面试题几乎必问.md) @@ -171,6 +171,10 @@ * [【备战面试5】Github上开源的Java面试/学习相关的仓库推荐](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/PreparingForInterview/JavaInterviewLibrary.md) * [【备战面试6】美团面试常见问题总结(附详解答案)](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/PreparingForInterview/美团面试常见问题总结.md) +### BATJ真实面经(BATJ real interview experience) + +* [5面阿里,终获offer(2018年秋招)](https://github.com/Snailclimb/JavaGuide/blob/master/EssentialContentForInterview/BATJrealInterviewExperience/5面阿里,终获offer.md) + ### 最常见的Java面试题总结(Summary of the most common Java interview questions) * [第一周(2018-8-7)](https://github.com/Snailclimb/Java-Guide/blob/master/EssentialContentForInterview/MostCommonJavaInterviewQuestions/第一周(2018-8-7).md) (为什么 Java 中只有值传递、==与equals、 hashCode与equals) From aec4e80a75e2b1b121eb8a8036484ff4f4c46e7f Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Fri, 8 Mar 2019 20:31:48 +0800 Subject: [PATCH 65/66] =?UTF-8?q?Update=205=E9=9D=A2=E9=98=BF=E9=87=8C,?= =?UTF-8?q?=E7=BB=88=E8=8E=B7offer.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../5面阿里,终获offer.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/EssentialContentForInterview/BATJrealInterviewExperience/5面阿里,终获offer.md b/EssentialContentForInterview/BATJrealInterviewExperience/5面阿里,终获offer.md index 7772891d..9efac14f 100644 --- a/EssentialContentForInterview/BATJrealInterviewExperience/5面阿里,终获offer.md +++ b/EssentialContentForInterview/BATJrealInterviewExperience/5面阿里,终获offer.md @@ -1,11 +1,10 @@ > 作者:ppxyn。本文来自读者投稿,同时也欢迎各位投稿,**对于不错的原创文章我根据你的选择给予现金(50-200)、付费专栏或者任选书籍进行奖励!所以,快提 pr 或者邮件的方式(邮件地址在主页)给我投稿吧!** 当然,我觉得奖励是次要的,最重要的是你可以从自己整理知识点的过程中学习到很多知识。 -在接触 Java 之前我接触的比较多的是硬件方面,用的比较多的语言就是C和C++。到了大三我才正式选择 Java 方向,到目前为止使用Java到现在大概有一年多的时间,所以Java算不上很好。刚开始投递的时候,实习刚辞职,也没准备笔试面试,很多东西都忘记了。所以,刚开始我并没有直接就投递阿里,毕竟心里还是有一点点小害怕的。于是,我就先投递了几个不算大的公司来练手,就是想着刷刷经验而已或者说是练练手(ps:还是挺对不起那些公司的)。面了一个月其他公司后,我找了我实验室的学长内推我,后面就有了这5次面试。 - -下面简单的说一下我的这5次面试:4次技术面+1次HR面,希望我的经历能对你有所帮助。 +**目录** +- [前言](#前言) - [一面\(技术面\)](#一面技术面) - [二面\(技术面\)](#二面技术面) - [三面\(技术面\)](#三面技术面) @@ -15,6 +14,11 @@ +### 前言 + +在接触 Java 之前我接触的比较多的是硬件方面,用的比较多的语言就是C和C++。到了大三我才正式选择 Java 方向,到目前为止使用Java到现在大概有一年多的时间,所以Java算不上很好。刚开始投递的时候,实习刚辞职,也没准备笔试面试,很多东西都忘记了。所以,刚开始我并没有直接就投递阿里,毕竟心里还是有一点点小害怕的。于是,我就先投递了几个不算大的公司来练手,就是想着刷刷经验而已或者说是练练手(ps:还是挺对不起那些公司的)。面了一个月其他公司后,我找了我实验室的学长内推我,后面就有了这5次面试。 + +下面简单的说一下我的这5次面试:4次技术面+1次HR面,希望我的经历能对你有所帮助。 ### 一面(技术面) @@ -89,4 +93,4 @@ - \ No newline at end of file + From 9dc44e6efa2ab107a708c864aca166552e80ba36 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Sat, 9 Mar 2019 12:42:45 +0800 Subject: [PATCH 66/66] Update README.md --- README.md | 7 ------- 1 file changed, 7 deletions(-) diff --git a/README.md b/README.md index 03222e69..97dfe496 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,6 @@ 3. **《Java面试突击》:** 由本文档衍生的专为面试而生的《Java面试突击》V2.0 PDF 版本[公众号](#公众号)后台回复 **"Java面试突击"** 即可免费领取! 4. **关于贡献者:** 对本仓库提过有价值的 issue 或 pr 的小伙伴将出现在 [Contributor](#Contributor) 这里。 5. **欢迎投稿:** 由于我个人能力有限,很多知识点我可能没有涉及到,所以你可以对其他知识点进行补充。**对于不错的原创文章我根据你的选择给予现金(50-300)、付费专栏或者任选书籍进行奖励!所以,快提 pr 或者邮件的方式(邮件地址在主页)给我投稿吧!** 当然,我觉得奖励是次要的,最重要的是你可以从自己整理知识点的过程中学习到很多知识。 -4. **【限时福利】** 极客时间[《Java 并发编程面试必备》](#Java并发编程专栏)专栏限时特惠,购买之后的小伙伴加 [我的微信](#联系我) 报上自己的极客时间大名可以找我会把24元返现退给大家,减轻各位学习成本。 ## 目录 @@ -221,12 +220,6 @@ ![我的微信](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-2/JavaGuide.jpg) -### Java并发编程专栏 - -微信扫描下方二维码,购买之后我会将自己得到的24元返现都还给你,减轻各位的学习成本! - -![ Java并发编程专栏](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-2/Java并发编程实战.jpg) - ### Contributor 下面是笔主收集的一些对本仓库提过有价值的pr或者issue的朋友,人数较多,如果你也对本仓库提过不错的pr或者issue的话,你可以加我的微信与我联系。下面的排名不分先后!