From 26349991799eff40a51588503979078518ffcebc Mon Sep 17 00:00:00 2001 From: yellowgg Date: Fri, 12 Jul 2019 09:11:32 +0800 Subject: [PATCH 001/130] Update ArrayList.md Fixed markdown grammar error --- docs/java/collection/ArrayList.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/java/collection/ArrayList.md b/docs/java/collection/ArrayList.md index c3e8dd47896..f6578a7a784 100644 --- a/docs/java/collection/ArrayList.md +++ b/docs/java/collection/ArrayList.md @@ -660,7 +660,7 @@ public class ArrayList extends AbstractList (3)private class SubList extends AbstractList implements RandomAccess (4)static final class ArrayListSpliterator implements Spliterator ``` -  ArrayList有四个内部类,其中的**Itr是实现了Iterator接口**,同时重写了里面的**hasNext()**,**next()**,**remove()**等方法;其中的**ListItr**继承**Itr**,实现了**ListIterator接口**,同时重写了**hasPrevious()**,**nextIndex()**,**previousIndex()**,**previous()**,**set(E e)**,**add(E e)**等方法,所以这也可以看出了 **Iterator和ListIterator的区别:**ListIterator在Iterator的基础上增加了添加对象,修改对象,逆向遍历等方法,这些是Iterator不能实现的。 +  ArrayList有四个内部类,其中的**Itr是实现了Iterator接口**,同时重写了里面的**hasNext()**, **next()**, **remove()** 等方法;其中的**ListItr** 继承 **Itr**,实现了**ListIterator接口**,同时重写了**hasPrevious()**, **nextIndex()**, **previousIndex()**, **previous()**, **set(E e)**, **add(E e)** 等方法,所以这也可以看出了 **Iterator和ListIterator的区别:** ListIterator在Iterator的基础上增加了添加对象,修改对象,逆向遍历等方法,这些是Iterator不能实现的。 ### ArrayList经典Demo ```java From e84503a44b449b1ad1ce146ebbf4c0259f2ffa7e Mon Sep 17 00:00:00 2001 From: yellowgg Date: Sat, 13 Jul 2019 16:04:50 +0800 Subject: [PATCH 002/130] =?UTF-8?q?=E4=BF=AE=E5=A4=8Dmarkdown=E9=94=99?= =?UTF-8?q?=E8=AF=AF=EF=BC=9A=E5=B9=B6=E5=8F=91=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/java/Multithread/AQS.md | 2 +- .../JavaConcurrencyBasicsCommonInterviewQuestionsSummary.md | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/java/Multithread/AQS.md b/docs/java/Multithread/AQS.md index d1fe5df940c..8a82051bc46 100644 --- a/docs/java/Multithread/AQS.md +++ b/docs/java/Multithread/AQS.md @@ -124,7 +124,7 @@ tryReleaseShared(int)//共享方式。尝试释放资源,成功则返回true ### 3 Semaphore(信号量)-允许多个线程同时访问 -**synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源,Semaphore(信号量)可以指定多个线程同时访问某个资源。**示例代码如下: +**synchronized 和 ReentrantLock 都是一次只允许一个线程访问某个资源,Semaphore(信号量)可以指定多个线程同时访问某个资源。** 示例代码如下: ```java /** diff --git a/docs/java/Multithread/JavaConcurrencyBasicsCommonInterviewQuestionsSummary.md b/docs/java/Multithread/JavaConcurrencyBasicsCommonInterviewQuestionsSummary.md index 75db37c9d02..f7962cb6706 100644 --- a/docs/java/Multithread/JavaConcurrencyBasicsCommonInterviewQuestionsSummary.md +++ b/docs/java/Multithread/JavaConcurrencyBasicsCommonInterviewQuestionsSummary.md @@ -104,8 +104,8 @@ public class MultiThread { ### 2.3. 虚拟机栈和本地方法栈为什么是私有的? -- **虚拟机栈:**每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。 -- **本地方法栈:**和虚拟机栈所发挥的作用非常相似,区别是: **虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。** 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。 +- **虚拟机栈:** 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。 +- **本地方法栈:** 和虚拟机栈所发挥的作用非常相似,区别是: **虚拟机栈为虚拟机执行 Java 方法 (也就是字节码)服务,而本地方法栈则为虚拟机使用到的 Native 方法服务。** 在 HotSpot 虚拟机中和 Java 虚拟机栈合二为一。 所以,为了**保证线程中的局部变量不被别的线程访问到**,虚拟机栈和本地方法栈是线程私有的。 @@ -152,7 +152,7 @@ Java 线程在运行的生命周期中的指定时刻只可能处于下面 6 种 ![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(终止)** 状态。 +当线程执行 `wait()`方法之后,线程进入 **WAITING(等待)** 状态。进入等待状态的线程需要依靠其他线程的通知才能够返回到运行状态,而 **TIME_WAITING(超时等待)** 状态相当于在等待状态的基础上增加了超时限制,比如通过 `sleep(long millis)`方法或 `wait(long millis)`方法可以将 Java 线程置于 TIMED WAITING 状态。当超时时间到达后 Java 线程将会返回到 RUNNABLE 状态。当线程调用同步方法时,在没有获取到锁的情况下,线程将会进入到 **BLOCKED(阻塞)** 状态。线程在执行 Runnable 的` run() `方法之后将会进入到 **TERMINATED(终止)** 状态。 ## 7. 什么是上下文切换? From 256879fd2cb61740f2b0cc5c0c600152dc988a09 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Sun, 14 Jul 2019 14:43:03 +0800 Subject: [PATCH 003/130] =?UTF-8?q?Add=20BigDecimal=20=E4=BD=BF=E7=94=A8?= =?UTF-8?q?=E6=8C=87=E5=8D=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...va\347\226\221\351\232\276\347\202\271.md" | 92 +++++++++++++++++- images/BigDecimal.png | Bin 0 -> 303124 bytes 2 files changed, 88 insertions(+), 4 deletions(-) create mode 100644 images/BigDecimal.png diff --git "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" index 979099949d2..387d86a04f0 100644 --- "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" +++ "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" @@ -9,6 +9,87 @@ +# 基础 + +## 整形包装类值的比较 + +所有整形包装类对象值得比较必须使用equals方法。 + +先看下面这个例子: + +```java +Integer x = 3; +Integer y = 3; +System.out.println(x == y);// true +Integer a = new Integer(3); +Integer b = new Integer(3); +System.out.println(a == b);//false +System.out.println(a.equals(b));//false +``` + +当使用自动装箱方式创建一个Integer对象时,当数值在-128 ~127时,会将创建的Integer对象缓存起来,当下次再出现该数值时,直接从缓存中取出对应的Integer对象。所以上述代码中,x和y引用的是相同的Integer对象。 + +注意:如果你的IDE(IDEA/Eclipse)上安装了阿里巴巴的p3c插件,这个插件如果检测到你用 ==的话会报错提示,推荐安装一个这个插件,很不错。 + + + +## BigDecimal + +### BigDecimal 的用处 + +《阿里巴巴Java开发手册》中提到:**浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals 来判断。** 具体原理和浮点数的编码方式有关,这里就不多提了,我们下面直接上实例: + +```java +float a = 1.0f - 0.9f; +float b = 0.9f - 0.8f; +System.out.println(a);// 0.100000024 +System.out.println(b);// 0.099999964 +System.out.println(a == b);// false +``` +具有基本数学知识的我们很清楚的知道输出并不是我们想要的结果(**精度丢失**),我们如何解决这个问题呢?一种很常用的方法是:**使用使用 BigDecimal 来定义浮点数的值,再进行浮点数的运算操作。** + +```java +BigDecimal a = new BigDecimal("1.0"); +BigDecimal b = new BigDecimal("0.9"); +BigDecimal c = new BigDecimal("0.8"); +BigDecimal x = a.subtract(b);// 0.1 +BigDecimal y = b.subtract(c);// 0.1 +System.out.println(x.equals(y));// true +``` + +### BigDecimal 的大小比较 + +`a.compareTo(b)` : 返回 -1 表示小于,0 表示 等于, 1表示 大于。 + +```java +BigDecimal a = new BigDecimal("1.0"); +BigDecimal b = new BigDecimal("0.9"); +System.out.println(a.compareTo(b));// 1 +``` +### BigDecimal 保留几位小数 + +通过 `setScale`方法设置保留几位小数以及保留规则。保留规则有挺多种,不需要记,IDEA会提示。 + +```java +BigDecimal m = new BigDecimal("1.255433"); +BigDecimal n = m.setScale(3,BigDecimal.ROUND_HALF_DOWN); +System.out.println(n);// 1.255 +``` + +### BigDecimal 的使用注意事项 + +注意:我们在使用BigDecimal时,为了防止精度丢失,推荐使用它的**BigDecimal(String)**构造方法来创建对象。《阿里巴巴Java开发手册》对这部分内容也有提到如下图所示。 + +![BigDecimal](../../images/BigDecimal.png) + +### 总结 + +BigDecimal 主要用来操作(大)浮点数,BigInteger 主要用来操作大整数(超过 long 类型)。 + +BigDecimal 的实现利用到了 BigInteger, 所不同的是 BigDecimal 加入了小数位的概念 + +# 集合 + ## Arrays.asList()使用指南 最近使用`Arrays.asList()`遇到了一些坑,然后在网上看到这篇文章:[Java Array to List Examples](http://javadevnotes.com/java-array-to-list-examples) 感觉挺不错的,但是还是特别全面。所以,自己对于这块小知识点进行了简单的总结。 @@ -212,10 +293,13 @@ s=list.toArray(new String[0]);//没有指定类型的话会报错 ## 不要在 foreach 循环里进行元素的 remove/add 操作 -如果要进行remove操作,可以调用迭代器的 remove 方法而不是集合类的 remove 方法。因为如果列表在任何时间从结构上修改创建迭代器之后,以任何方式除非通过迭代器自身remove/add方法,迭代器都将抛出一个ConcurrentModificationException,这就是单线程状态下产生的 fail-fast 机制。 +如果要进行`remove`操作,可以调用迭代器的 `remove `方法而不是集合类的 remove 方法。因为如果列表在任何时间从结构上修改创建迭代器之后,以任何方式除非通过迭代器自身`remove/add`方法,迭代器都将抛出一个`ConcurrentModificationException`,这就是单线程状态下产生的 **fail-fast 机制**。 + +> **fail-fast 机制** :多个线程对 fail-fast 集合进行修改的时,可能会抛出ConcurrentModificationException,单线程下也会出现这种情况,上面已经提到过。 + +`java.util`包下面的所有的集合类都是fail-fast的,而`java.util.concurrent`包下面的所有的类都是fail-safe的。 + +![不要在 foreach 循环里进行元素的 remove/add 操作](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019/7/Screenshot 2019-07-14 at 1.31.09 PM.png) -> fail-fast 机制:多个线程对 fail-fast 集合进行修改的时,可能会抛出ConcurrentModificationException,单线程下也会出现这种情况,上面已经提到过。 -java.util包下面的所有的集合类都是fail-fast的,而java.util.concurrent包下面的所有的类都是fail-safe的。 -![不要在 foreach 循环里进行元素的 remove/add 操作](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019/7/15497724883532-1.jpg) \ No newline at end of file diff --git a/images/BigDecimal.png b/images/BigDecimal.png new file mode 100644 index 0000000000000000000000000000000000000000..b5e8a2d52fa8b176a211d9b111f7c134b69dd725 GIT binary patch literal 303124 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

Y7`OtZzg;My4NN8U;^N26GgkHT(moXt6=N(UUbd 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 z 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 Date: Sun, 14 Jul 2019 14:47:16 +0800 Subject: [PATCH 004/130] Fix picture error --- {images => docs/images}/BigDecimal.png | Bin .../Java\347\226\221\351\232\276\347\202\271.md" | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename {images => docs/images}/BigDecimal.png (100%) diff --git a/images/BigDecimal.png b/docs/images/BigDecimal.png similarity index 100% rename from images/BigDecimal.png rename to docs/images/BigDecimal.png diff --git "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" index 387d86a04f0..014c438df6a 100644 --- "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" +++ "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" @@ -80,7 +80,7 @@ System.out.println(n);// 1.255 注意:我们在使用BigDecimal时,为了防止精度丢失,推荐使用它的**BigDecimal(String)**构造方法来创建对象。《阿里巴巴Java开发手册》对这部分内容也有提到如下图所示。 -![BigDecimal](../../images/BigDecimal.png) +![BigDecimal](../images/BigDecimal.png) ### 总结 From 0cef545a90ad7bf05b6c944d35069181550e2ce7 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Sun, 14 Jul 2019 14:55:48 +0800 Subject: [PATCH 005/130] Fix pic error --- docs/images/BigDecimal.png | Bin 303124 -> 0 bytes ...ava\347\226\221\351\232\276\347\202\271.md" | 4 ++-- 2 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 docs/images/BigDecimal.png diff --git a/docs/images/BigDecimal.png b/docs/images/BigDecimal.png deleted file mode 100644 index b5e8a2d52fa8b176a211d9b111f7c134b69dd725..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 303124 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

Y7`OtZzg;My4NN8U;^N26GgkHT(moXt6=N(UUbd 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 z z;N_Jkz}LND<%wMTNZ@+kcJM7_#YvGqYNS)cmR13FR%M6T*6iGktr}dGjOSrEg^wJG zU5=70y8V=9Qa{y*vQ3^o&tKTB5_@Lp#ytnuM;;C65%8k#5fg)GEk~0P$r=x#MBt$c z{pgsb4dkJX*zFY4Zv!HlX(F|RV@n0hB_n~KqX(QHi?c2RavZa zyt#@6?HF9@G^dhi?h{Gbh?Cn*m8MCd;_W4FWu*xKZ*;dHkxi2-)a(GHO4XF8QNAP8 z^y>LkjKd_bH{Ge9NYyu0Ol%0(ZdsS2SmYcnps|V{pjNmhbR4RpK`pic)q)?q_Ke@R5cq z442`rNw8@r088{R^3)y}O$Dy~X83L}om`nBG6_2BKX!mE&J2+ni3(SCGKq|)NvF1O zoAb+XrLjOBnq*jz5z0pJpO8@-`zT~06EkXSlIH}n)~cO301Hf7Jnqf3SO6*f0L>&e zTLIuMTX=x(C|b#&fq>O-lhR%Y=45-cEA=7=p)?@3{*cyqw1psMaut2*0>DSI$yZ{rV&Ai7pJ~lq zo!;=k_TKw;<%hI?RVhBkO z|INQ=qyKg1e}&G?`1cKI4v@Tie)IkRIA5?E0CZfFJTFb|<;(xIGJhYb2g1GF2}lkq zSv;@L`Nx6_1v>7@_k5tfF~2@Zqapl{pZ)JI;Xm-X&#LZmHfjK~95MZ}SWRrJzQ+#M z6p}B8f7SVq2LC7U`sa&%IAl6d7y1jT26w_0YWV|J!;+;!0LvtGGd8)m)Aih|w*Nlb z|6GXH3nt)9qwg8~bRdn@Dj!v7f-WU_oK7TNT5axakpAb$f4=aMV*tsUVWPw6sTG^m zW_1$xmsRv~i+>*W+lu)Dn(u=%8~Wcq`uow4VQ_@#4MU~R-#`Ct=6qVfiu+zw|JOME zb3T|h!4c`6cvFJE-M@dIfaZAs@V0np{{Qf`PQVdzO+gk<|L=pf2FU(Af8lQ+`fuaB z|5~ssI3j1RjpJ|V$lorFsT$Z7YqGKb7DxWMP@)ash~YgwqW>nm|2PdMz9!%%R)?DX z-|vBRZE(bERy&QB~MeIl91(|jnL<}YV6 z)U?%9EE{8;5eo>xMc2MbSv$NWJ?&#qn~*DwD>Ikne4i>;%FN;W_tOO@fXiAo?{WEv z;F>g37qRBaDP+evb&Js6L=I{$wE+Z3npfXy;fGuM8s zjv8!uy^Dw6<7_ASLJ(pP&=_f|LsIRyH7Cj9o9UFhRo=h;tuKnxV6+n9|n2> z09IPu!Ijd#-v2(bS_MJKaN?E4yP}F_hs0#yg3>WZK`C9r3f&Zdo#gX=%_oOgs!{Ju#c`5>BYpClzioZ?CF z86a`u*OI=P@Lh>BOQN!JU6SmIitp0_77sAjJI0#&OW^Fef}Kj$-)?B14Y1l$lqq$6&OQjD zRd+|6D|L5!v$m5mWHIK5po|<$B}A`mjd0VRG+!gxd%`hZkOKOUPT8nHdg;t zWCwMwF~f6i)u%o_2$t0g{(osAf#gzv>K-EHT2Jxq+RQ8BpXgEWvEQi}i$X}baJtv% z0f4K*{V+T^VY`wc<^lm5f9AGN;nG9r=cFqJ(XB^R^ZJi)OHzeBU8iXqv6{m!TB22& zynOk4HSFotP#?b>L;dbY+uO)FMoGGAQ#F&4FI_trni`hXOQ8lm26yS^4XdOENnAQC z6Vl?&M`v}6G+wp0KWw}CqN6|EImqysyuWq9rO#uy*eq=coQkBt#pj(*GS6yYaK4y!C0x~VW7g`b#$9>Ua5*K7(Ev((vZ5`lC4?^6C*V#ie*;Q^~34v1{;cH zE5DVVc+=4Cq*@Vn|)q!!3sTMZ2n3tg95Yh`rMT>1ye7HW@YNoQF-#;i%mf_jQH; zn>)I`cg|2=o`nsTt8>@EzBn?vyPDo4_+Gu7sc#a$6s_+W67*E+01fFr>}C|0ch>?f zRsLf(eM;znzv*^slC0wM8JM%Wbl^JgUxQCqM6fuWyy(IX>eKGX+MveZSHv*aym(V{ zT-vea{Io9;WHuG`M$vxVjmc{DboKk@;pQhmai_vicYR=c#@82BF`7_ES9VNXQPK5+ zGj>F z8@swCPdefQ)L?Av%*Az(>N65_yg(ANOgq%MP_i*Dxx0SQ5PCQasWo^Bo z(glgBXfrdVzT`rIn)*|mJ!-3&Wp9=(x;uWGmlkUbR~?L9eRr3Uwqw4W5fo-hgIRgo zicuQxXAXZ1g+>YJcuCZpud=HDEL$xtqP0>z(>FMX&gbnsd~msxMTni~aKPDh;&fY5 zIpUt>$>3U80feM$_yT=T;M0FOft9u9!%?{xPpavCrsx8&+mr)k1KRSs?eEbT+P&X< z#olA)|L_<+So>=80!U}+WGJIdvyTWDoRC-?>rP_`!I7Mt(IhW>_o${_U zZCT7#_bgi|W3#OA=ZX`4zD{?746BWykH%-K8Pq&}d0d`CTg9_Fe%19hds>Io-C77> zgNF2=FK(v6UIVUG!It5}T^Q825XJU}{KB=e9l?`xb?gxfT{#XZ2wU?b$Afpzm{cJV zDO5{V6vZ>3^4kTtR*FjL3B&e1};);9ovl#aTu)=LBnby{rF} zX|a7T_d5h-#7Oor&9Vxett-!)E3*)K%DaQ36@wrvdF_hLx-OimBn5`*(+-265hpVo z(T1=g!d;*TSMqckVKz8G)KBL$IquiyZWo$G-E#7roj^b|GD`zs5z!6nzA2yfN7Emy- z2XfO&$K+hL&B_w|Pm7xzzsGtpK)y0?yk4`1`n;c$X;QE30(3i|Q{tFi7YWbr<2&P5 zcy!g3xUyd~H_^^^sfe!4udFfDv!3e&Ve79oOvEMz-45(lJ_zuuH(plobh|WpWGEB% zsPW(AwspHXX;oKv#tv-Fs%cX)ZC=k52q22i)ULI+yJFztQ#|Qvx{pkhpY={mN+tpd z$zQn)DChu!eh}$%09*R}HPv&{JAk9Y*@0&$t>B6w=^!`R{_@FR+ROXC4!EiipHAh| zPzT~Ph1=t{!%}X~0o=T%Cgq2TO7O}0-BAwpDHdZ_!=Q)kX5|r()7pv?>8w{2jaQhL z&1zR@O*d&=zhtXDtON@E3b>8rvpcWTUU;TJ)2*fGkNtp_C&~EQBZn6?5K#o7CsBZ!Odt?}H|^|I7WNO43W^mM2S9-0y#Qi%}jjxk9q}*B(tPK@eb$j;wq( zk6Lb_Xmx3zo_1&|dv~}&>P%G^hFVYBVIw?^|7PXw08OV7>B$xel--N@$=(r!Gv{a9T^LI=ia)jBIaDR7dddHh~f*n8j`i^`d;vA2I2GA&E1&_=`4ImjMV_{*T_~aiTSMgA7Ei8lP{#QgZN{wE${y36dBEv}Dj%;DhST|!WD4_CU6 z;HI>yUiWTFh>Q16>OTs^rH6J!(yl3z89B^58}_9SI4YNi&(<(q23|B1ZRIu?%8|Yv zXO6BmWQw+Cj3#FKeoY=b=dV+3ol3~-yzhY;y!)mNnzE0tM5SY?R14vE40kw7%4ic` zO%70PO!gC@<_s}WX?!SLIXywy+>qBSo}^1~fmWu9Phr>jiZ62F?8TDj$G&6!Ry0&X zUMnI_%Y6FaUuS6gUy(eb@+htv6)L#=2kgwT%IDm2E1#NAyUc(r;{j>==^@8tw1Tt70|+648$yIrUjPeM!N9~l)oz1VJQJt4le+Fg2< z9Le4IEwB0KND02h(jKBJ1h%;q4wZX?vijx+AE(u9{b}}c-T&;30JyUTIJn^5E9%C( z2kSIUD33x^1WGe|*KNiWeJ?LYzB1B6EsLVdv3{5t#ay182|BErN4Q=U$Zw)n3fV@$ z=#Lg+$SGva%C7Z_<%x%|FSiJ0nvU>pezD9P)+dfOUP#kGbN!$+MH!fLYu>4tU5WTG z0~bH_=Id94la3#Pj{-?kW=2l-G^D=}%6-O*w7`3}v?y+IhN2Yya!yt(L=@Uzj4*SP zCNe#uAcHH{;1(&@6Q@2s$3-|cVJByLnh{)kC)KtY0(;6Qr@iRyp`Xe z6-LhxAWK7Mv7;`*Hu{QP2?E?eK?_WvmOBP8vz`H6z~+I%q*GY zLcH(k>FG)(dTql1BFX2!-WOIXGn7Ji;jo&`H~bZox`YD3B0*jILdY)fadoQHCvaCU zO!Yyegxzd32N4x_{WQ3Zq&bF02})Id2mHg!&oW=NA@2p+N%>rJCd!QR0MAK7n7JCc z6^q7yCZ-JBk}zDg3m^>+1CDUfJT_&G{pq$E_+h#V-PQ+5=`en; z&|pMh1OVP2Lu#}&T3`WfhNHy&k;11p2ZOuNV`{8X?`$)YB}Ft+W+Zb0I0;j9!>QO; z%!Z@9hDtpCOeTq_SDvSPb2=8&)pAnt98x-NFn%%joF?&;jUlmy^TnV?MQX?7EG+T` zI!)SANxW)zA;p5hrPYQu4SJ-2mnn1O<_s7G_P?HA<0fQY!Q$^U;Ah-Udc00-@Dy_} zQI_)9Hzuj*;gRj(U(fE{FDZ_B6&e3p?xs{^#4U7KzHcLo$|1qjO>*+<# zW7rlNHg4&K5VaRNq$kcjEKsqnIH(O`kjCKB*oTn_zS&LhJE;@j9j}xV%M;Ezb&}ij7ySuHZx1_suD8b7F zQDJ?>bLRxO9&-Y%`}N~hR>_ThYFLmLCLC0Skz^mxD$V(fHCIMqb_6W zD32PfNfI>hDJO@DqtgLTv6~Jv1$Jfs z;jYB+hr1>d`}W3%I8#t>+GyFMlKNy*?LpD>9H(pT8AhmPEq`TWDzA$z z7Cf=Xb&q9c&Qf=q10ONv=MWOp_XXXNjgx15&uZBVvYr73^MeN3Zlg*5DM-04UbEB=E}Tc4fe>%?j%=JgVOK z8*`~QtVX>V+zy+nM@;?w7vn+!&Z(lwRaWc3upa}`HkO8iwGLnPTund$+p*Izxs{<-+Pz`n&3kJO+jvF&Mc5p-RcX{pGe}uiH^A33;gKG#L(kEz z3Sb$Zvk0j|o7NRh)w~0p|I)gS@Q>9=jlU959e2U12gbKi6*Z^w1kORKVT2 zJ)N=|PI(QlcVb#sM^S*2hmA2OlRS+WXx2y zu05l9Dxq2LV)fFq5B%m#v%|>6u%{%D!_viL}V zAV&UVbL2B@M&Xohmbs_((FKg_<{7%;VK*Y1@dj+1U4OLtZE;)|y4D+mPjngbI`k=v zzH165vsO1tgmD#f9SZ@LB0u_*dHUpn4)XF>XgtbdiX+c$`6JgZlWz6N>G^j1nmE&F zpJ5$O917RY;N4EX)8-!wAFk_Q4A71(Ra!G?^N8#AD3j?ZdZ2JN!Q&t>a96ypdPVoP zk+S{EHzU<3f!5QxvpyzIYF}ViWUfEJ9R%V3U=IGK>DKOZ{_#~{2zvH-HPy}a=b+GM zju>L+Y?OB?kB`?b&(?1~;}}n_hEl(HzOnb?n?TsBcC3?l_4o&Urmr<*q&Zc>p*Oy> zw8lRZKAAL^yOv+}_fbbVIM9iTIM0?&@p~}pl;|NY%$mP2Zf8{M&v+Xi(89kn+Yo&pz}n$@wb!VE=dY-l;8ZVc+?8mQeHl~r?kI&ZU{BFzslE*Xpoj9aEm+HOeOfywu!MH|A1~1+d=52VqrcK<87VX zl~K?Dbj5*v`jBf(@vLM)_yQS%>Ojn8jR$%C>B7zwOG9wu2u9bu<&CxmQNPHZq5ZA> zWAyNG53-&_rEZj9`49A}s#X)FnY)a2BLn*Z1r`BIh?q?!d3b}cW-xp(a@_Xog65xv z%_D`0gZ!?quZ{O+8-C!@=NsvwzZsVgxW2iuD3n=l{mv&iRIJ+?KrgsHm?`#GN@bj9wyu-eDbZyfgQj?zDvo>4sh0+#YMdZiw(y z!VOwy0iRgzdSVK`{!;PKFc1uNwpyM7H}DCqKKpgBY~ybMWxy-1hj;=~GSCdJ{LMYwS4UN)50|97t{G zu=p5reCaKvuRo84wfv5ID!@~l*R(@T49-oDcn zEwxrS;N_)Llq%~xaD8=S!RJwKOtxdFy5z<4;ZzGPEfjAr9Yu$6aDH`$t8QILHb-iN z`2hKcvWVhdodF@5LsDfTM?!OhHJib++hw}vt2D;J;u@EoV*oypj>Ix!?m|di3Hr) zXfVqfL1nUh?OnXrR;aPALf(MLLOs@-sEE7wShlV9dH4zP@Y@i$Ogv})wNFF$w`p5<1aR2mfBEV(T&QDG@XSe9_F=Es( z!O}R{G}^y7S}Rz4FZKiz@eQn;;BS9?kVIf%MKQYG&513QBZ;~k)s{qxS<>kA3d2VX zX7aH$=W5ZCc?eXZAZnXP+k_=4kLy*IzeUEkn49*#y?TSy;C=Oe>Up_~ut#A1kVGq` z>JH2_vA}dpZIhD3+5l<;0YdOK16$_Vol!{|+^~9Wb%+C6agOPky_^N|@g^;WJ(=Ej zdi^&|{T*+;l*dM8`d911A`1v%k{V_Sl$iqw+38XW0)#%O%bS19u6!eOk<+hizh)@; zeUak$gP)u!?i6H!_5DxGMSRAOi1_sb-IkDJqB?IfRn<=;Sak;J^ct1M%^!H3!}0br z%*G1UW$5yk&>?nuXQr10I)a$>=)Vfv^HKG^;ft$t)hnQt)7})=lbrGr`b>vhS8R+_ zw&w7zfOW_o?8AcpuYei9IHYOc<1bU=VIC=_Spj>oC+f%1d- zX1Lg}U;4j(x%`4U4)WlwdVUwm*J<+nQSvF@&WFo~0<$h+XpAmDxOm)Hn#XawAM&L5 ziT4xGlNm=}+j?g4%NdYSsr1b>Ac*=jW*fH-hp}0m^W;vRGQ__dSg3s3k?&LH!O8^v zIVz}=|LVxp{{(9JClY^#BSz^X$Cu1l< zAnF-5_MIXX4MUP)sR6dPVh@(&Ms`8ALxZs2TylYFpg>q?R&5MkgwOroTe8;=0u*%|!2-;3k{7zOn+9cgvc+r1t|CR1& zlg@7xm$#mm$0jNaZBLF8YU{tW)46EFr(f`VI^^rFspx^-GdLb0mf7T~;ijMBEf6lBc0jvQkE>lQosFepZ{yu`yff(Z}-XIIi#fuBvDmOhw_#R z^@iGujXXvggj2Ifsbji z2|4}{a>0u`0jrZhzl`qhppd2N|L<6v^b zts~6CpV^bqO-sV2hS~47lh6jZ8l6fXa;PyRqCLzaO=#+@jy%2$Ciz&KeCd&1smb!7 zojGK^JMt6z&r34+0yFc0Wrxx(eueA@hwX=TV~Wg}E4&jg=kaY}-_ z5lgdFw*{Tq19Q!IX4Ca;v$$>ZLtK8c<4V=@=Guo0Q^YM#h^LzBQXQqT@myIS;5*cu*YAcf8TI7Gx6Ou%gGhIhLK^FCJP! z{VslV%t>|BGa(mI)S3c`7VQdQ%)Y_(WYFWo3fgobmqY-GcQu_VVfCml z4r;y}nxO8nK#febm@kjOFj6vOI$)B@$m7wC*(wwq7fv9@f+n)nW%Wkd3JBD-&pO@7`CwnAlUq4W@aDYJU zne<>dv6#tBY@J=*>ah~~XYIIhk-9?RnbYFUuXpsDEFL^c7pG)|bsH~Q7Jo**$GA^E zar%mfVbg!rpK;ZSvMdrjP|0+D4a=atU`tQ_4K|qnIuDzEmXCLW2IC?>t!VA$6MeAh zdpA^aZ}<9PIL^{y7>83^ky7}m@ZVv*e}R0{*#OPQ8-)wK9#QM{f)za0QGRpXV9xILM zL4ycCEIs^&>u(hP1E@Pe0}D4%uimUK1r#VYX?vPZ=Lmj79~HCi`{ZZZ{H%J2H9y1} zO<%a4^5|8Rz`-i)agTKcI9BkY%u@K_7 zjP?6)BZXQT8Y9gOM2pSN&Z_Mu6Q zWoe1Wy?za(9+$^9&RXPiP^G+M;#QVjKpty(mN>76Wr>_hxkv;X$1NGN1t6OB`m?U@ zKh@?~wyFv6Ju0uie$jYk7w^qw;i)F(&7)Ix^@^ON!8LyNeT?rb;gN9*&8_6oelJh$ z==W~t*%gXz%kqgBQSW%%>7w3AhF&R@?Ww3izDBp%Qim+yEn-Cy)yj6r95xV$wvLeu zF-O2;3r%Q|3?4p?&TTs%sVy+j49)w8V{3KzM$pIfV=%(96x(xw{9Q9gE^1OgJtQNy3;a7_Jurm7!Iyz@v=w)B@FpB3EWu0w||6g z|Hq}#fz9)c_E`rt1S1&2_c4b5v>3j`8Rm`aX)#@w!0=On`&8qlj%~B?RMvyxQyaDC5|QOo+|_EV z*|aK!{rd~86%OxGh5XovKU`IT%wHj%!(tui?1x~GmwMkpj)BG5dd0EYs7n?kvyL>0 z6zns_X++e!b#ZWmQ{T6p~U0){-E-7IU(wLj(ctBl9fq|cHfn3Fquf~u-G zPqrr%);uu5QwJRPR)2{bk#`WeE{>fLPClLe8V2JzDKnk%S{B(~l!6O9sTzHE9VRO2 zcB#;;rZw6Mi!MZVH9QlEnwL8SEssL=$xZDITAN+AA<6#0K`16IvH>Rf28QF8Pv>GV z%0`JmsdB^SH3?7d;&0H#O6Sl_#k%JadxF-D2C;tz5s*@y5P?sRo#Iao!0*6yuWoco zij{=V9?LE=bQ?TXVC{)^hn^zhXG$=1(*2_>0PKgLKkd_Is#c0f6jlvb6(1~bG5eV8 zkTdv{53k-Vbtski@OQ$d7noNZpX=i?!9(nBbRhZ0yWmc|t&tyL1&nqZEkpgi3H{vSNtAxmfnWJZunIJv$mIQ7|*BPgohENHy_2 z-Hz_)=y+)Iga{&QOVl-8Z6kbV4`VxD`>t<5!%9t`DD$|ErRpjQb%n!X@(p;XM}TEV ztY26evmwH{9paCSDw497GTFKeDK)e=Z}^Rxf1<(6xvY`U#t0K!ecZyg`&84U(oA)% z{4`OZ_;ZMPLNat`FxTS=-eU`aj3-U;^ud@IRDh^6*Y0SKEv}h>B{c0%WZYsD%mOd-TXts zAKu77u>>W5@;Ex>sOB&9$n45D-{0ph?@gzk^DtfTU(o22ZZ4+jk+?7ncpZmAp0XePqnrdb=CV$Y^X*RLyH6| zb1+&ElM2jR*Vm8QzvAq~RJ`lfte%tsPlpZ;A?DI^zXT`#(K5q`g-xRO z&|O^)l})>Lw{K_nrh8JzVdddLNMPtvnR!PL#pf+&$lp4@i(Rq-GVgb*;~pV}uT?^4 z&`z=^rUZtX*RKp1hhn>Vh;bW8Jin~&5T_m8lz-4_d9ZC4(--Nh1{=IPU6cMA%Nt9N zAokARIy3a!pVIUzHITQQ9c|BM>r0|D3H?gLaE%^7EzWg#yJlAikYy9to(peXTCQuuWRhq(&E?;2Yv`Z&G6rsyG#@jcwEbI z%_w){A|hLNzKR~CqzioDZceRHr_3MM-jb_8<9jrLh+m*p7o}cqoI2y_0kmXK2;=O1 zCefbnA~JobdsdwXUu^cVf`pp%H**I z7MBFf8-arLU$~-5Cbxw})Sx3ivrj3wa|sC;6W)RPiv|S`VL0*QKcoh)l|X9X%YDS< zJY5KvK2Joykxd4buPG&Ug~i2X7sKEvg?-UklM#esk=cz$vn=g$xSTfI(51TckRV9q zoY$qi1h}qU%gSmBpP|}_W`|rE247h+54-5^>HW|v2tFc{iCOyJ#j#{wny*2t&6(=ktWWI==dc8eS zcAro#@9s(`ayz6cWJ^!rjm*Ikph+SRS6D9yku)K%a69e3v$k2KBCs5UmgIJ!mye%swjLQQXW!9NtU5 zdGg&M>t)S-A!<}zquub=zxT+(#iuKrBmtyH#Ns^^vF5X=V{}aGzD+a($y=_2BN~-` zk>Vj{<*WNe!(OH&guT1#r#h-#Clj-%*w{i-dMe4<3q9gMCEb|1$cBVOtM_( zgXt*0+4pq8g!~c7jW=1}D#hct8eZP8q(UptVc)}1!6gXQXG-84_4hNgj@!i!NAOQs zt>*>NF(8N^&v_)H87TA*P;8jyMU94YHzCeGrmMePYq5vaGOd^+!(!>&&XjAkOD@T23lPTJCaW zxJjqeKb9}Ofhf9OwAaJ5S?8Qw$pYnYM+QJOBT0j8{JiTU>bL@5>9VcbJr3e*{-DzV zQUS?&CXa7-uN#{j6UTN}AqI-RGXo7=LqWYW#aeXywkx;}S8hnDU)0H?pB zw^WQv#Ys`fi$cs*?r~RyDq3pIJx)M6Ay|>4Tx4}{Ysjd4|3SJRo#BLVxUXntK9Vk0 zqeB+XUASf&F8F(ED{zXQi?_H#Oo#_gFd>BOrf(u?l+u7>lmqkzms1~YTD8(fE>O0+Y5@|hAFex5({CQA*1dKhs>g+5`BjVdb^%frEZ zkI{8N_^AN+4u2I&IdL0;5zNR15u2fKh$zNXihx}J)o!R|Kyot5K{{!%m;p5)OFvmr zl0uko2?)UecrILr-T4MD`YkXNqE;q ziciAls;KewSy9QtWygshH|*OlOXuME0+baMKFmcEC#>Y&Soy(@&N|uAFD+8P=`f_& z3geli3|)4xA206_<+PnEUAnbd;SL3DyY_akxngtO7h3?NtgS&1xpt^i#1CD18p}Ex z7?7oF7P`qxQB9&sZn12eD|OoZ)0yEXD;;aH?gTu*@>tQ%yi{p`yNOgT)O_pX#a>Rb~S|M@8^sikDSjC{kl18n&PhpL7^p|Xw#Q{2|bL!g3LuEAYqrU7%^;C5!ZUTHG)@{^_2&|p>s*8h6{rsI#!|u znLEsbUqsX8N<~r8NiI+-56;rk%5tBPVAyxRlBr?Im;ETP=FtQ(o6#oWc;U89j*`Dm z+M3*1qI$P*d6TO?AlQlV39CtldE?Dpz=t|8WfhgS&`M(xl-*3*W1)vja5C-%XV?;G z3}|8qsFcUZ4&QAbUa7iopWE7K895g}-upK4?_K~q=ei~BXo*9D(+n8^8F(+AsZm^OsOMv!M|#OB0xG5V8kH~ ze${URV&PxCFaL5nU^!N(RiT7BEBGmEbs6Pp=iBCo`jUN`AY7aje}uoli~GC;<^t&9 zj3Mte>#UW|*3&~bt7c&RAU6JXz)Iknf~cXir{U2>f`!TFWIsM>I zJZ$ezu%LXVx&GYVV%9`RDt04{T0&NRlbzm_-p}>-7*vUt{MhC8F5Jo^v0;XY9qo*g z=LaoUJ;|WGxS|2EA5}%8eZy}Zce*FMs*pra?Wp>Se>wk^@=f$H@sdR|>PVLv_M`#M z`IL^U$?YS_)Rcb7$-(vR3HpszFP~nqaA<#YnZ|&Co9N&PrVbJQ$9BEN=M!)n7@OVm zYuyt`=SOSX6lY_f1of}q~DpybTC*J=aN_Gzzoh4VlryXH=24rAT0TU zR^_>Bmun$*_y_y>RRQOxU&xW3-wU~?9aMq`$$1~EcW8Kd==DL@7^6CcZJBvnxRDZ^zo&pG#i_dagM3WnKl|+UCD#2xYGRChPS6 zeHse7r0iH>TW(Oao_z_*3ZJ4Mii_fbUes->_SHunPkXk|z|q_{m7Egj*vO!WjR_zHNz^z|GKYwM5RqPmdt^3 zfTyiF=CE-3v2y&|_c%m{eWLGycpedY>Vxhdn9pNf*<9X3RN7;(?u*{|aTyK_nj6`9 zwF_0gT)JaEuF@&w8g116UZWSyE@ESaa=2r@w8%~HzgRVLYQEhht$hBn<|b>Npf{V2 zvTUQ`cjWqNTM}&zHFUxKbMH}!mTzF7l&o$7BNLm%1(KL?nsTGKr&6J{rxKkP>5M-T zDW>D+FA<8)=Jk4K4%gQ|Gf`GL3l3dgc#yt1a5?rZ+dA?)T2;0zoGrey2w!YkG8#w8 z?n6|h1Z5IW|C{!{;`UDdbj^zbqaO{7z}Vu$YsAv{_g%*R#4Ugt52QJ&xJ@=5#*@=< z@W*+P>juvB=Jx-5s#GpWpp+&n5;^9ZtY34Kr&+V@rExBGctm@Q%^4>dNvo`|#_HNU zDoXQ`L8!!yXGyj+dDrq>>#(ew&*F@o7ioMYVG&>Ex=Pxl4WeaJ|Jp2GrBHKVjY$kp zQB|(>0#6dQ|An3Z{%1dh3WN!-V>hmh6JSJXY&!S|u!^2h2@<}jTrT;LGh!w@+;7E@ zSGJZm;vL$ZJCIIu^!@Fq1J?d09nZB!wWsix{yii75KZ%#G*~|(#;CXsf4OBnNQUi5 zXDw_^KQ;tKV`!bfY~;}y*T!NY>d5=IxW_oCva0#t8wYeMuWf2PA~@T-ql9W7xo1Ue zPl?11m&eQBaP7E@{t|KRF#mtgH*r^g9(HEjpwcx#zFqTu3NDNCRlN? z>zzfb+6u-l>o%vSe}(PKZa%IgwLT^k}(S>;_TnkAT zMkF`<3|*F(Mcd2I6$;tP8mCbyp@`DsOo567;c|HKB=9&%+ayr8l`KSLXB+vqa46ut zSNTI-)V#Wbm~c;w}YK=^kq1TrEzK=LNm&m#c-idqM#EZGGBhiW7mDn%#EE z_QPP?{Fp%-Kqhcb!KsdJ{u#E9(auVD1xqew7lzdVG5ApuJPgX=ifw^76*%Y}?A-xS zJA0Cnl9J8ijiJq-VdRtCc%v%CEG*dhuXGa;XJEo19xs>xXOv&$?-T`4MSCrOpDMFW zopq{~VdEoehYktm$hYxcXPFFE8Mlt(On+~y8aYD?a(7S1>0p#6=6tJ^7sug5J>d|D zfNwAs8|L{LV5QOuPicL^cw6aI#27-6knnYXJbU(xFt{1r)b|0pA~4qpwfsFMP08h_ zcv@5HjS4U^_iSjHD&>a6|#~><&0cQ3o=xD#(lG!kp^0*C84f0 zGQ-IF0))D;ZwWqulT4c-mSTf4`7f3!3_<|4)OmZuAmW*cJ8X@P*c{QB@;cwaJak;hDYk^f2T770vpDOd)rNn-fNXAc~X^p$*@7ZeR@$7tEq6 zn=1`|o>cW;qqL3XGj4vE&apVFI~NfD=>~~8Ru{7z2J_pC{{^nSspeI|jDc^x-du@+TpPc7s({aK$XB7UY9N0uFmr)V)1rM#0& zpG~9uvrl&8)>oweRdff&wG8`g_`go{l@yU`K_(NMBRd-*RZz#2+h8;Q!|X{z>%@fHMKGkeqsCxa}YD-amXeP5D>- z@TI)}vp>!A|DGXDP#p&o5}~~E$DRC#GXReH=X;KM_~!`S-!1MRe)>P+g|Es0na)(= zqK-a6c~Q8?LA^EQ0nzxC9Wljtd%yopq*Ii%~WUCp2Xwy1g!CuMxhIap=)%EmAocD1W4 zsBS4KvG#?>A7b#ocu+p((0j|r%{*9;0p?Kx`gWBR3ldRtDY28*?3)e#m!E70E2>sh zQ%?2g>0MR?SGqDB>jra0-%OQ9spT!FOv|wI8SbnO47b$N9}Kf$bujJEmj!||uoenN zyRh3;;9N=e;9LdO<&-GXdtf+Smjt+wh?6+Upg%4PuxaOormoGmc#w#ZKuNc>=9|L5E?oEj z>B4VrVMT#`r+NNdsI8+T@A~2>Psk6&pdtp0XI|Fl<3|J>P$>c^iQ;U%ixR+ClmPTi zvf4oQ2nAfITD=aqlDg2x0#;Pq%5p+!U6EtLH7nimC*jHH>hIp8FBZ+o+i+UuYVPjR z$gJ4XIBhIWq!r(DU51)2^6DI^cur4%=*KC2dN04$B_Um z^4-+J!E!2V6<7fQfs>;?fjpoY$N}1F(R+vr>UneN#5%r%6;^Av7E!)PhN?4a za#(F`dFS)8nb?mb+z!&Z=&h0z*(K3h(`Bx5zOHB}9job}_sYH=I1SDHX4RB2cqyi$ zXI>vz+j+C-rh8l32K1$8iYK(0zaqqGE|qh3t$b|ZD&+?yd;cdzXui4M=T}zJdsA4j z_*xCP=~?ekSG-vZ`%WW6+5ypDSky3G=Txa~R2|9H zM`m|drBG^6Z*RN_swFwW$KsHnu27JK&fJw93?~22Yf9D z5K;30e3S!P(Yyt%Z=IlW>7pDCFJHcd0;oAxt;{eNC?iZ%pWxwTA2q8Nf;XF>r>M$( zEz#D_u8cZCV-rF-l!59FN;?f#YuP+O%u47U8UNe*{qN;!;<^T||i0$kSLA&_Gj+^dpNb zE1vksyzri=XQ#QG7V)c{LBWNfl5;9mThIpKX5q=~>veU8Q&u1VYPf&Y@-id!e0JOq*n9Z*#2kcw&|CBBl zW^JV-|6$&_4EZyi$Ng}F`3bA{+lf^(l*BWXki?4S8EfIkqvbsy6Df5CZ%oCC-U~71 z?o15D(HsV=wmpR~6)5LsPBa`wtF4KvE54BVTu4IK62dBXyR#9{ys_H6v~P9084Sf- zW-b8AVt7`|<%Snfk2K0enAr{5Za|Mi)n(5|0dv)pCHq&QMW`&&nbt}SboF;nvwJ#y6*jh-iW39mww9UgXBXrdp$8=gs`0f`% z&?9BcH&6Nw72qcb%k3-bD{M)$Xz>;OQ_m*SdWwWSV*06TY?*DR85tN}ekbG0adUT9 zU95LdJ>3`t0dJYBowZLKOb00)obPZPZqJNji2B{B9Z$O-m9Mmd7w=VFpk-zcUnNv? z#27O*f>XS5Tq$rkErM)KoZ=WowNZ*3=(4ER}>+iz4He z2WomF515-hSf`rR@{=U0uI2Sr)7{9M9&Bl&35A)uj@nHjK3ds%dGBJFQxl;ds7rPp z98J#wU7|9}R_!k56sV-*jX*?sfk|Mu0#^VeA}Bav&n^YGdE~)C_V6PPXT`juy+*y^ zkt$V}t1agzIxvL_fx|tmR2W6wp6knkLVp~yy4}XWs8xf|%~s|PXpW!;CWC&a4w*4b z7;0T1irpr~gEc9dz9V=Tact~S@X)P|qDokDVW>4=5FRTO#mEFQv8;NUB;Q&}MVC0L zt}B)m28fr%!K)5jhsy z-W7|faml7plPZn&YnZ2&2+ITYd?;86PL|EH52t>%_F1jNI_Uit!FRg|rk~A&LLY~s zpoPYk_#_0`L&J;dZgB@jJ-E5hrU~h)s}l~@jJN9z>ru043wCm3#5L~_oRgJM_BJqz zw-#pLP^I8AVVPe^v?6c99_V8`++EoKbWLnBLo9^!k_!DNVgF-on}N@){!XYU z8mOXDq=i3bHMf?1yA}Vg%FH2%_;HQH;X$O*Y^gBqCgIfHnKhrnMfhd3x0sT62Nkjj zqPV!OfEK~TT*ji`ld&|k>(4{Y`2_cNG6+btd8=KEs)v_-dBZ|QX*$!34ZWo>)Rh#& z2cM4A7#Rr58~R^MxS;&c0*ir~^#pQpuvqYUIHgF3q6vh5x_QzS8xpo5;CMvo>+74% zRhpUs#pP)qbydGuZB>6UQ{?2a5xqhOHb6qbRQ@ z@_R|xk#FCEk8>4>;LAWir#58}H(o+Iu1kfSExS#t zH8r6bR(^S?^6V=3^PDQ_9@CSo#mpCSS!R(>SwwW4zagrLzkU05E|gB#LoVddq~x0$ z;eS_vVZaV0au*cjK=~I0GGTM9&iCy^1RmCNw&{I&(v^QK^dyhM6JvxmRM7B<%}Zz8 z$bk)>+Spwz6(+2`19!4mKz}C}1=ei$LZO6t zW$RW-A9E;erm%D?vM{omhgdM)uPed5p>H~(v$;Ts$^(5U)GTL8-#Q#F=`@6P&fmY1?XFLo>?MOg|zHP~AYau|UPA&sq$x!%2PVy^I)m5$_A;7O3rdAJ61Z z#fA;T53F$}%&+I9hP8_Yk_lQ7!)3?L!Lzci0ZlaC^3>kw}&5WC$EgCJoOx5*B|V3~LooVWfPju{BaD zo1U{tqLe3BKA9%(`kBvX-ZZh#Q!uM)okV}9E5C2cA*T+emE4ogEUpU|*O zjAvy^fOIK=H0yB_zLUCLqTu76qH9aa8V-xd{T0a*0;QmiCupxA9fDmyf0~)+HGVyv zON~7Ihx6Dc8E_CZ>Nky$<56l=)x#qtE%EpylRUasoR4^ZT0p6*rn2~v*;F}udWhwG z_t1N1V3zLuLMwZM(8B*yDvZHjN$fYj+gSdC#E$wGiT(B8BzBid?u8CfxTc=pg{TP5 z1O+ZU&vQ2~NA+o7`v8*Si;o(d&%?6gY;3ZsUHzd_QC4}>64a_D8a{%Gl|cu0B4kU0+iD^&VrRal#03OVSMBndQ|FK|uoQi$ z5NFgV6|OO5=!E&HlCLC|j%n3={W($tZW~to!f_usH~wAO6aY`#83O)Z#xubB4mSebgYF4F1x%H5-S+C)JPY-VqDkZ*~Mf zO2Sh!mn_O1uEo3FnhREVJes^NI9MCabyw->v!st*%*8iZ64t8!&E!C6mc}d&$6r@r z)*!N%3`c5*q{dnoLa2yBY4OYHC>r&Wx99u`-Kr}z=joR^m4mStD%b%p{O78b4*a78 zt(4)!fAL{#&%8b8Ld~Zdu2%Htei@#LSG^CTb!MRlqw*gAD>$BxP*-2m33?Z~Gv$pq z@To!$jbeIO1Hu=$hZG)uI;f6r&Y8$OPps$ph?zD#xGnR`P7UAVMjzc_A%vj1cVkZm zQq%H699s+LLm?zZ{dz}LJ)Oky)fpFS@UOXKmZ{fo&DTCo7#v5H$Z@EiWmnffO|b*d zb9|V#6Q&&vf5X0;R)I`E&c@jIi)zd~hiXbkJ#=i)EWTpv-ucV!Oi96HTLhZQXu`Vc zDKim6Qv@Evi&tAK!hnxcQHc&icUl05wFg)jibEK! z=;TwhJCDREJS((b?femDk-8-_3M z!1nxkwNKjr(%ig3&Tqw1YfOJHGXrrZ9i){(X3BkUciQfU#4PgDTQaTkkoNzW0qlVm zmPk*;rU;Hs4t(&4PfK~?#t2V|o)L`Blo{rK>Wy?6h|dJ6`>`0L++ZO~BZt*yK%#Z1}!rz@mHlhcq?rjtyEe}QcXQZ!A#KMHGn3;SF z%@v&^GBuuMmo-u+U4a40M<w9dEec&mT^X4 zkxOwI7mc`AOqugq4Q_p+Wu;H}GN@J5f7`_8C!%IG?Xq}fo<4+_ za9yIb#RjK0RuC?^{(nkZm{o(Vl?tap{f&$OoGZXowzZJ|^6Zv*GEcSN=P8D*`HbzE z9(C~da{rewbOq`Y*&BnXnlSC%)vd@1>)pqy`M?bK(L{ZsTE(|7iHYHfz;bjf z15}i`Ng)Z9&~dZtD_6e=v*$1{5Hyo5%!hy6R?wcl)ow7b*OM20efACGH0ztEO0KPu z01-^>zp-!>ul`MK<;CFu%yrsU#tEC>tvW#nWE;czVipM5!|(xR2)JJ@Erki25=XDc zW!c{wT)MM6sWHB0k;bUjizow(bA8F4oMZ=ebv0$R^K*|1HRde%2^bfcH2bX)?-@(9 zGF1#lo%-m1bKzDM6)FB4So*IiPcARzZDpyL2@YWs1JFst@5K256!?wXgp*OXIccui zvfvihgw1$}H1VW2wC!c4FY^X#xfn`WHiiH=cb|c3nYpAd0<)Esl@8m>m*UJ`WiP@J z+4tvbasiQnOCaU$?ryr;`HgrEhPZT>h1caQuS(33TEc=dqdV}F6xVyEyo*=PQ71l*!#nCIa+Z?h#Sl|(rzVD3{>x}){$;xxqn1)eJ zGZqq38ym-{mE(z7djNY4Lop5q@Jf^*Q5}J{;GR^V4bSfM&S{Y1gF~<2IQJBWYsg zCFjvg|HAVO8F%rB%YOImxx5y-xy#@xEAA3~V$tOOR7h@+Xl~)A_ME;XZn;^*m+9P7 z;Uam1_Y7jU+Bv1kfm<6-J(}N0!kM5E-Ny+AtVPfcDc>ctfGLfjZ1N>2w8hNy(e?J@ zZi%)Yys137#wI4R+edpmwiNY$YdJAKd*JOJ0}n#)FBj zARTuxf|cu75+ZE6kw#hk z9&g=GG|F{mH&E$1Pcv>tT$*+9I2n9jaUUqfGY+@ISn1EJ*wonOp?7B{w``{!OUV_Tz{MMi(> zk-Laz-r4v+;bop1CedN`V>?>?3o^I<56D~w_G~a7{w!1{Zxk5mISScekO;~LdijS2 zlKKnHXa(%_52y<}z}{4X)U}6~FdkO}uI!e}eXzX`ImBn9(y$u?T^v>hR?=p0O_Oy4 zVVYs-y(cKQpD$!15dBKfsI$!uD7~^gKUmbd9ACgxzl3*}9}UQ-HeEV$QmWe5;rx-& zA*y2;aQM2KKpa%+_HLbbycIt`JXG8WVhG!;_oEOaBDe{~7(9cU&Fxv+L{38{5aoKX zB7gDj-8KUZiK4Mv&|;$^oYn-*&t>--aBi}3mq}o(4+@v1JPzG@W0g~}8FFzR-I>I1uasMzJWW>+Mmm|U_l%^D zUALz0e^1}b6zzu!ZSG#oAdp>BhP69VPSE8ud@eKdZ4Aw zl6~~U*F70@NF$@onC}(6L(Ny*Bx& zQX6P4yG3#X-%nM^XD%-L`YGEb`u!G|`#$=q5u3GTlL?P7<3h`CIh~r&9}0bnhqalu zo4a1<*p_xRmWGMhw4&WUK_k>4&@V2<;xXt%Mh_XdE_KEzAZmpqaG3A-6P|wEGfXEt z>YB|6fkhs{C=?p_vK>j{>&|zvJZR|WfV&XIv*SBE2Cv2s#mn2qZaVO)TNlLR|*(~NvwIhc_m8$rP5eqYTcwQxEz4!-QebY7yxJ*X{NV|b9q~66xGn`xUR<3|Al@97FJ$4{N*X0e!Y%yH@4aAHB|G zl*%&HLO_4+Sf}j!1_zn2C;qmyYrqWLS7pwo-3GUoA-*zU!nt#v28*f&-T6(Y3jxMf zWM)T;`D$4q_(x}UOn$blj)So0jjh+03*SFZ(V{la@~N{X z#@>y(_EU!ewZYBvq0#!ub9QT1cx>ZV+<);`bfH{X|Vp2n(y(nts*eeorrdbXrUf2F2C(kvr?w~lHcL% zFrcifAKV1Bad7Ov6-;pf{9udcX_eld@s4{^iMb_8$HC~+Y17Z~)?7o_zPQ!3-m4fzcCK7;i6U7r4~l z_4>!i8P`0ZHoMX_vnTWZ8A}U4EoU`!8{~b_I5bvTyNFx+O4IQjo>F;H*M`9(vvpvB zfyC;`3m_#z7d|KYbl-}^{vVgaDHbA!jg~etaS_0ftABPP6H6q{T*)jRc&W9D_2WBr zvl8H6@@+EVq&PJw+5{*F3Sa|Ql!i-r+gTx)$0-AbHjSygXqnCKx4hbPup@67$QLQ9 zr@YLWBv3*mtaSq8nM;SPqxHV|AzXkB>lkQtEetgKsaOu{!vGBya`IT4mWw%aKZIA* zMtCefw=A6>t)mCf9)aC06RfGqppFw|p|KzV!Kxq+n2bnCl}qlK)Ib7W{TyJ1-l>P_ zg^`YwK}3d)2V3s%mHoohEjAeLJ^vm}BOMFfg6=omjl~gGpqS?3q5td>^a5K6m$NQI z2BD=m$DuH?$u9;RzLN{se^dutD>KT$CRPnH!PioI;1o*=|JyLq&ivp`A)!rHYte9| zL=nOv+p1$u48L>L_<*t~0-@$Jr>a#9XPp zo%(Pr?aN%&D6juPF7r+*1j8+f-xX71c^|~41Y(VMlRG{q!1R(FCXW@n4kZ4a3+iRF ze_+#UOEY0hikePlk!vk)MvJ~5^CBby^;&a1l6sY(u;XKdO^^tig%yIb4|i7y1X6d> zgAJ^Zp4os?y2Dv0R*~k%xPdj7!^Pj-4o(mdY~v*ord_7T+EbcmI$vGn0Y5#O%?FNM zP?h{hM=c~S^NVdj#Iw6ySzA&n=P6L42bSu61eBB6cn&(~e`ZJgTz}yQ0z~lP%8)Fo zwb|+_%%AEEejmQ4^*pfxee?Xz*<}p)@l8Q}?1`oIz*2HbW;MicgHw@-n|p?P{b;`sZu84SE0DTCELl^G+=YVAg?e10uQ-}r+ z<_W+SB7pCK!c#)O0b@5+#=wFUfqC)W64~we`mje@5Vf&|hqw)w?=!!`DK&P%67-3( zV63R_l5VX1A@nj&m~a>!xN;&Q*t@M-nFUVa8Gj5p&ZLf?*G!lEz;tLq zyvA(&*&@eu-F1swJolwlsnGt36RbFs%!_CL?KKqy?#NMh{<_Qg5p4u<7;=#L#=C^+ zg=&BuN}=9`c*hMdt~G10eca8UfLOY5(^9&@^v=|>2#M*}(w62}`AFhhrfoe+4qN9J zjyCH#hWM0I3U1NagUR#6BX8vKC-(*JKPjTO!T3hbD0 zKce3Ee|Y*~Eh|$l*Wx>mLCfZKkviam83i4RGv=j++IwcX-@rZ8!5NOthkc04Rpuca zSp=gY^^M*qL@&^$CJa4Zl*g`}15($qkoyF(r;lwwP3a*no;9N7ZU4~vlDFK(16nPU zd!eZPzOrA(8lR}w{qCSi!2R-g4<2%`?#}P_h=MNOs7oRYDoc8oAt-a9S}U02&#KQR z4;FFS4>h-8+58J$_+5_g(>SVMK;Fqu;)#&FYNTu;f6{%VPA~ zD5Mg8uCBaS^*n5zy&o>=CN!sXQNl7f2MAisAQmFlQEKz>&`Npg3depTZmLNTgiM7l zdgheMI5BoW_^;kW^j)_3bd84%*`O-sUL<;A> zmEGsGf4q0J!%Of}mlH6V@z(OheD%R$v&z*Fr2C^L^VY4A<^aDdVU0%j^B5fa4L`eS z%hE4qmz4-BpQ8OoPhL3WDR#isyElIQ?k@trn#4U8U+-831I1t_nEtZCGW5H823a0G zX}~D7R$RPkNT>png%`-%VW)8B5wt1JKAc|`B(33nVRppX8Ymk8EXiv0pHRNRGXUk6 zHBdv^v@g0m*NC63Ngv=IM`IZxO&7dgk7f8E0{q1*G?lLt%!lafR5^?i2k>dscP0 zS8l_K^=EC?XhE>0znmq+gD;vt*fR@Qe;)uP_ zd+qQT=@ZB2IGND8vNLtZK|B!etvHZvj(63Bpq7p~N}7n=N;@0c7F_knucD!;vv*%q zjZ=TJ{v?>+V~NP)B=v3pb+Iw-Zs}TDixc62+gC5tNDg3FwcGFBH+6*&MwPr;N~;SS z37Iz4N^N0h(Y*PsP~W&-dtK=uwAUwlLd>nYsdcYrQ*L%k3P8w>-% z>hHO8`i3SeP4Ew{#d6Th22#ElEg6{f3h?ND@nRHbOqqoG%4?BBppv*VIj&SJwFXyd z;$iu^l+_o%wkh#V1pzScOoLfR4vks^d;i!a2*$^Db4ZNC{C6fONlvr$m|T|YzPY)| zw5@N7WkkhUiL_zLme;^TznW3129+0fOIvipzRwhTm5%$GW}_MYj`s*o+Ue<1gn5I{ zS3kl~*J}Fo^R^}e1I*6M)1hLc+qKVFzP0az_E)5R93}zG2%UeQPrBqo&gWPd=Biwz z$&tWqlOg+W!hhor;g9ey!XM^82!BO9K=^wt{wYkrNP`IpDB1Gybvo0Pe+%hZBrrnS8!<+^KI-BwEG{NAoiGisI?#YJ z8z|4q;pjaPwliFX3-KRrEqfvyHTOg&9~1)03!0mMcc`fZRp3#i*xn_ZEWhR@z|&sT z+39C`a3p;{b{P#Y$6%mcQlN(>!Ja=s)T5;>&dfKeA77qy9Y0=H<0DsM3=R9CKnIX}jzv7MtjgCx%!3@6qVtb&gzuAar{{0yFcy02k6T{dcivNWfAK&V#p3qkEmSA0M+@&au<07n2Sfek3zSJlG(8(dbQzgJTfN<5v!f0Xe|<5!ukd=dd&J z4bYqGd3n{SYz)2%!|ncP4tp=7cNgm3v~~T+{8TID8$)mcP=~gciLb*upH`0%f2aSK zYe5)K{U*o_@YsdRpmQD}y>@MB^GnyugZ&XkvJD~vgLppU)-5p1)cP}kr_N*=@&mg9 znW_G-nE|WCMu_%OOm$}Zz{)T+$IE{IuQA4UD;RcbU^_*oNXtAD!|eGob;y@a?~Wby z&J?l1@Ye5386W4WYbj4#QKDxHD{;>g+ojsH`HgWrPuip}L)z(U#MvAH5%}D!&L~%5 zMJY^3bCs~>&s&LFE}P}xATX^WTn8^(YLM)n=6F1<+Avf9T8)2q%joT(@8l|_hc#Vd zNQs`3wtH!0PTN{GQ{ZGcKReNFDPA6+9{8C01@}0~=Otr?UrgBYtSO6 z**hakgi332Eu;7OQXS33S&Nhl|q-hxaXqP<^S5 zAGxkts$(a*m@LdqGsE;AD<(df$Qbm$wRVz8tUeF-aX6PRZC0YVx8FTpxb-i%%2!+B zR#Og-J$`AT9}(hi#PYy!cz=IuaoQbPM7h5bpKvjrQqR3#ejO2xw7pnU!rqhU=P|7o z#+i5;I7cd7u1cJKRZES3+AGwy@DjYstC8KI&0U|x74xDg{ zP7Qz?dx{4kSK9hpr<83OH)N#5?pcVWMq20vsrbwWX3Kh_#Ml5(jjS9Gmn?_(M|9y?_0af{gR0C*+9Rb zMCb+)z2~O;xXM94;go&G0B;CtuAtEhJC9bN;@UA=B46(Ywok8(i*-)}MAD@^%$YxkaM``_OP-(Syv&2gM3+~McdCr14aUE6tMx2kUSLlkpB zm3CIXsADUhw~qgI(tA9h<*I;Gyf&4Rl(xNgeRGq<&8one-fSS(PJQ<7UCHN%AINt}wR zYJ^UnPr<5IZriPS-kUDbtG>C<{K{w^-22%3+IzX|zOx!Wr}^x?!y7y$tH$F1fyWho zR3>LHLy!@@0W`HYzvg`|*NkzV!~W%EjRQ*v8AV_uz_I3s9lx@CMR(RSOh_Iz{jla| zvc)O&-hQ`X*gmPZ9+4@5^JgS;lP{r? zs21JF1=F$p3)f;N>q{<*9N)7XL$Do0X5FRx6JF#RC%HYkn%Y+8DXKN;yxh5pKsdb# z;tha1$HU`H(l;M4ebe|cwWvNt-%?f@bV$P;`<;&D+OwsoL&L)(KH+UI-uB?Rpv`zn zh}WC*9ZDm(#HiEoQ}VNTVRJ)vMur%@Jco>Xllp^!N-)0wpZd>7RW2>exrMp{H3H^W zu};$}LB&$vpg$_D$}V(H+2;*i*E{>qBp4YGvYVjc0bmQXzui*6)`y&kY^8G)>Z3@F|Ykn5}MwCF&2yAl$x5eayOpa8k3 zZVFFr;O@qsL23cX!~^67VOWaY;eQI@`v)2B#UrQB75^k9LgymD7W^A8{O$p* z{`P;>Z@uDkI*0}+=r`Uc_HK>Up85It7dpu>7c(GEq8D_Iez^lF@770E&kknzQ2uU$ z754b983qPZQR>}Wm8?zWibWwt#z9+Xem*w(FXK8h?l*jL$~o^NzAUrV)UWZ*fV%cqqmoe~8J9K*h==r{$Q=?5btJWE-u1~CqDG13`H7HSS*c=cYy0k$ z@Eh;yCjj7NU{HT3)$`T{?2Kb7fP3fdXoQ4xt#y9!O9+s~G#u3Tf28H!OwxG2w!Fjd zu>z@!ICVB2T>HTL-D=eC{N8cXCW$s8>2%ZO-f4G=8rt|h>#oI^pY9k+?V1RZ;&YXQ2J8xK{Id@&7dHH6rMqZ<+ zD)k_?e0{f4m-fXz5|{Kwv=pW5N^|xQ-fX=?K~tPz);4zt9FhbZy>o@buars^AWHeF#m{E=kL#Zkj?P0R;Z8rK`5xJCm> zy|AwRjuhqdn46Y0=c^QhurCH3LaP^N-jSVlUbR*iTIo=BpzR+(=6*r(=ELIq(Ol;TJ-Aa`lw}1&OEORwqekR)aXP_W+HWF&+ z()nXE(d6-^Q6+%5P{rKX6NlLa8DzeI;T;y1nnlM%)!gSL3fA5@DDsrl5`!ykz7B2% z@ZD=Og@p`upuy%dhb07x9CPPEH5>oNcRfGgt0G!-bcCxc~T5^KXgdfq#ng5EjRBty8< zeuFKi73%JNl&a5?HNRthHXaI`smU)Ki+;RtPrcbFp{S&%@blz5lOIk9o+OdICq#PR zyQ-U7)sAdgnb)4Xu|~Gh)51`GE^1k6H71&~QcOE=9H*v%Am5b``uQ;{aIlTVA3IDP zDe&z>c2vpz6yAbBhk77=-o^HV!V5}cI#^6GWdrNZO~%W1GmOW z@+y>j@!Kt{!Kq}Z*BJlXeQQw?-E5Y2!P?vsorWpkL~73)M-Zy|kcJ1P=l}A+e#ls{ z+J`j2tbD*yLh~r8DiKvwzvY>tsZW1NhDKL#7sEcup@A?~uBd3ItS9#IV(L{cle(lIRLo2QYLNyUWdmoRg)99}vo=AHA z|f^H9ucFK+{l|caE_5pQ5c}tGrd9$fwR892;4Q*)c2G zBK~GC<+vO5n2t(Anq{sqrxudLJzFT>>8f%}$!0B_@yWOg3fIHP=Q!0{aT+GQL?QQW zgEz8k_!3=_?JfF5N>S-+&Ywn>{!IzYy&mEeRIl)iTCuIY*(|? zOPr+Z$ES94Ar(%(xTca0x2`5%z|xLesc^oPk)&Gu z_;4dgv zn0%_jze7`InMO{>dX&hkZ9x_>^K485M5yo(><~B%Xpp3nkCuL|7SHoNl9rdBwxgS+ z5BEtZrx^7-!)37lrHhJ+%Fwd6XR!@@#_p&jZg=jd6o*0>h5h~g`!>!Q6p$mh@6}9VgfEVcKDa-$#w}096F1y_zWm{oyBM49m15c| zS}Mgp;(hnlG8Qq33cGe9y`oBQK`?0?G;ofAmr&GwTwC#l?2GKxqEpF2db8DfV-0*P zJZ|wA$&Z%vMVAzGzCMpzUR2#$hh;mYHT3ZN7o5c9xA{sa(AD&ss?OlF=Jx4M9fT8H66C~ zEqaE;#O@9;Y8oV~E}uiRCgt?rmsaC6@Zw$#vLkI$#{EDLi|t zIIlKZ>NHj;U6KQJDIkUNeSFm`F#aN2KDN_ADthMAzV200uIDbh+O~Ub+B=mmIXjsj z>vao6#^)!fWI4!9N1Mf!7NGRL<*zo*u6Zx z^~PZb%@S#eLfoIcFWSj)$sEphEyg)lh_IUkW*n&+<^9-!o?3MCdc(b`MB)zVt)$pZ zmu?*KC(-fbP=Q|{oLk84s`PmlW0FKiAZ8p0Z1mf=*-+m-^QD$f#VU79u9N9uo}qXV z=`M^cqxaF)?&R59Cn@gOp9>=VS!zLTJbth32PFCjAAy-_+ybvaXH1^~t zOs;T*efkpwSN(?M)Bd(dypTC!%m>G7Y_CjYo~!UpS}v|>s687S8!0ASa5aFEdO%CH zq8-8=x;)4oLZ4Dz?g%q?RConTWT3!Z_bF(>_1Ec*Wf`Vo0d`8P_52>|XZb-)o8{yA_4;ID*S0kAMjDe%E-wTY6BMk<1CTNzQr9wks zd!bapaRK5bd-IzSp%f~;NE9iN!NCO2_~{fs5B9|L3iZ7^i<2oF(YODGPS+p`N0=mB zNea%(T7d}|nQ8=gzxm;iUubA+Ga&y8U<2EU#NFYqu{R7pZ%me(-4ldP;vJr}ef+KP zl<6Tn1X(QDO%u7HN8~S06a}8FI!ApohV;`eT9NsEQCF#}zuxPC#Y;9MzO9GtxnDG2lYxE~oUERHn`?9dtpIcb9U-#^Vi zLtsS%&YpH2>kzJHwn{`?k;4BVMm;2SNJe|KsJ3ZGD7~?VW2UAB;hS0so}L Date: Sun, 14 Jul 2019 15:56:27 +0800 Subject: [PATCH 006/130] =?UTF-8?q?Add=20=E5=9F=BA=E6=9C=AC=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=B1=BB=E5=9E=8B=E4=B8=8E=E5=8C=85=E8=A3=85=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E7=B1=BB=E5=9E=8B=E7=9A=84=E4=BD=BF=E7=94=A8=E6=A0=87?= =?UTF-8?q?=E5=87=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...va\347\226\221\351\232\276\347\202\271.md" | 123 ++++++++++++++---- 1 file changed, 97 insertions(+), 26 deletions(-) diff --git "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" index 6f9aaff822e..066d01fb89b 100644 --- "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" +++ "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" @@ -1,17 +1,71 @@ -- [Arrays.asList()使用指南](#arraysaslist使用指南) - - [简介](#简介) - - [《阿里巴巴Java 开发手册》对其的描述](#阿里巴巴java-开发手册对其的描述) - - [使用时的注意事项总结](#使用时的注意事项总结) - - [如何正确的将数组转换为ArrayList?](#如何正确的将数组转换为arraylist) -- [`Collection.toArray()`方法使用的坑&如何反转数组](#collectiontoarray方法使用的坑如何反转数组) +- [1. 基础](#1-基础) + - [1.1. 正确使用 equals 方法](#11-正确使用-equals-方法) + - [1.2. 整形包装类值的比较](#12-整形包装类值的比较) + - [1.3. BigDecimal](#13-bigdecimal) + - [1.3.1. BigDecimal 的用处](#131-bigdecimal-的用处) + - [1.3.2. BigDecimal 的大小比较](#132-bigdecimal-的大小比较) + - [1.3.3. BigDecimal 保留几位小数](#133-bigdecimal-保留几位小数) + - [1.3.4. BigDecimal 的使用注意事项](#134-bigdecimal-的使用注意事项) + - [1.3.5. 总结](#135-总结) + - [1.4. 基本数据类型与包装数据类型的使用标准](#14-基本数据类型与包装数据类型的使用标准) +- [2. 集合](#2-集合) + - [2.1. Arrays.asList()使用指南](#21-arraysaslist使用指南) + - [2.1.1. 简介](#211-简介) + - [2.1.2. 《阿里巴巴Java 开发手册》对其的描述](#212-阿里巴巴java-开发手册对其的描述) + - [2.1.3. 使用时的注意事项总结](#213-使用时的注意事项总结) + - [2.1.4. 如何正确的将数组转换为ArrayList?](#214-如何正确的将数组转换为arraylist) + - [2.2. Collection.toArray()方法使用的坑&如何反转数组](#22-collectiontoarray方法使用的坑如何反转数组) + - [2.3. 不要在 foreach 循环里进行元素的 remove/add 操作](#23-不要在-foreach-循环里进行元素的-removeadd-操作) -# 基础 +# 1. 基础 -## 整形包装类值的比较 +## 1.1. 正确使用 equals 方法 + +Object的equals方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。 + +举个例子: + +```java +// 不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常 +String str = null; +if (str.equals("SnailClimb")) { + ... +} else { + .. +} +``` + +运行上面的程序会抛出空指针异常,但是我们把第二行的条件判断语句改为下面这样的话,就不会抛出空指针异常,else 语句块得到执行。: + +```java +"SnailClimb".equals(str);// false +``` +不过更推荐使用 `java.util.Objects#equals`(JDK7 引入的工具类)。 + +```java +Objects.equals(null,"SnailClimb");// false +``` +我们看一下`java.util.Objects#equals`的源码就知道原因了。 +```java +public static boolean equals(Object a, Object b) { + // 可以避免空指针异常。如果a==null的话此时a.equals(b)就不会得到执行,避免出现空指针异常。 + return (a == b) || (a != null && a.equals(b)); + } +``` + +**注意:** + +Reference:[Java中equals方法造成空指针异常的原因及解决方案](https://blog.csdn.net/tick_tock97/article/details/72824894) + +- 每种原始类型都有默认值一样,如int默认值为0,boolean的默认值为false,null是任何引用类型的默认值,不严格的说是所有object类型的默认值。 +- 可以使用==或者!=操作来比较null值,但是不能使用其他算法或者逻辑操作。在Java中`null==null`将返回true。 +- 不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常 + +## 1.2. 整形包装类值的比较 所有整形包装类对象值得比较必须使用equals方法。 @@ -29,13 +83,11 @@ System.out.println(a.equals(b));//false 当使用自动装箱方式创建一个Integer对象时,当数值在-128 ~127时,会将创建的Integer对象缓存起来,当下次再出现该数值时,直接从缓存中取出对应的Integer对象。所以上述代码中,x和y引用的是相同的Integer对象。 -注意:如果你的IDE(IDEA/Eclipse)上安装了阿里巴巴的p3c插件,这个插件如果检测到你用 ==的话会报错提示,推荐安装一个这个插件,很不错。 - - +**注意:**如果你的IDE(IDEA/Eclipse)上安装了阿里巴巴的p3c插件,这个插件如果检测到你用 ==的话会报错提示,推荐安装一个这个插件,很不错。 -## BigDecimal +## 1.3. BigDecimal -### BigDecimal 的用处 +### 1.3.1. BigDecimal 的用处 《阿里巴巴Java开发手册》中提到:**浮点数之间的等值判断,基本数据类型不能用==来比较,包装数据类型不能用 equals 来判断。** 具体原理和浮点数的编码方式有关,这里就不多提了,我们下面直接上实例: @@ -57,7 +109,7 @@ BigDecimal y = b.subtract(c);// 0.1 System.out.println(x.equals(y));// true ``` -### BigDecimal 的大小比较 +### 1.3.2. BigDecimal 的大小比较 `a.compareTo(b)` : 返回 -1 表示小于,0 表示 等于, 1表示 大于。 @@ -66,7 +118,7 @@ BigDecimal a = new BigDecimal("1.0"); BigDecimal b = new BigDecimal("0.9"); System.out.println(a.compareTo(b));// 1 ``` -### BigDecimal 保留几位小数 +### 1.3.3. BigDecimal 保留几位小数 通过 `setScale`方法设置保留几位小数以及保留规则。保留规则有挺多种,不需要记,IDEA会提示。 @@ -76,25 +128,44 @@ BigDecimal n = m.setScale(3,BigDecimal.ROUND_HALF_DOWN); System.out.println(n);// 1.255 ``` -### BigDecimal 的使用注意事项 +### 1.3.4. BigDecimal 的使用注意事项 -注意:我们在使用BigDecimal时,为了防止精度丢失,推荐使用它的**BigDecimal(String)**构造方法来创建对象。《阿里巴巴Java开发手册》对这部分内容也有提到如下图所示。 +注意:我们在使用BigDecimal时,为了防止精度丢失,推荐使用它的 **BigDecimal(String)** 构造方法来创建对象。《阿里巴巴Java开发手册》对这部分内容也有提到如下图所示。 ![《阿里巴巴Java开发手册》对这部分BigDecimal的描述](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019/7/BigDecimal.png) -### 总结 +### 1.3.5. 总结 BigDecimal 主要用来操作(大)浮点数,BigInteger 主要用来操作大整数(超过 long 类型)。 BigDecimal 的实现利用到了 BigInteger, 所不同的是 BigDecimal 加入了小数位的概念 -# 集合 +## 1.4. 基本数据类型与包装数据类型的使用标准 + +Reference:《阿里巴巴Java开发手册》 + +- 【强制】所有的 POJO 类属性必须使用包装数据类型。 +- 【强制】RPC 方法的返回值和参数必须使用包装数据类型。 +- 【推荐】所有的局部变量使用基本数据类型。 + +比如我们如果自定义了一个Student类,其中有一个属性是成绩score,如果用Integer而不用int定义,一次考试,学生可能没考,值是null,也可能考了,但考了0分,值是0,这两个表达的状态明显不一样. + +**说明** :POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何 NPE 问题,或 +者入库检查,都由使用者来保证。 + +**正例** : 数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险。 + +**反例** : 比如显示成交总额涨跌情况,即正负 x%,x 为基本数据类型,调用的 RPC 服务,调用不成功时, +返回的是默认值,页面显示为 0%,这是不合理的,应该显示成中划线。所以包装数据类型的 null 值,能 +够表示额外的信息,如:远程调用失败,异常退出。 + +# 2. 集合 -## Arrays.asList()使用指南 +## 2.1. Arrays.asList()使用指南 最近使用`Arrays.asList()`遇到了一些坑,然后在网上看到这篇文章:[Java Array to List Examples](http://javadevnotes.com/java-array-to-list-examples) 感觉挺不错的,但是还是特别全面。所以,自己对于这块小知识点进行了简单的总结。 -### 简介 +### 2.1.1. 简介 `Arrays.asList()`在平时开发中还是比较常见的,我们可以使用它将一个数组转换为一个List集合。 @@ -116,13 +187,13 @@ public static List asList(T... a) { } ``` -### 《阿里巴巴Java 开发手册》对其的描述 +### 2.1.2. 《阿里巴巴Java 开发手册》对其的描述 `Arrays.asList()`将数组转换为集合后,底层其实还是数组,《阿里巴巴Java 开发手册》对于这个方法有如下描述: ![阿里巴巴Java开发手-Arrays.asList()方法](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/阿里巴巴Java开发手-Arrays.asList()方法.png) -### 使用时的注意事项总结 +### 2.1.3. 使用时的注意事项总结 **传递的数组必须是对象数组,而不是基本类型。** @@ -214,7 +285,7 @@ public E remove(int index) { } ``` -### 如何正确的将数组转换为ArrayList? +### 2.1.4. 如何正确的将数组转换为ArrayList? stackoverflow:https://dwz.cn/vcBkTiTW @@ -276,7 +347,7 @@ List list = new ArrayList(); CollectionUtils.addAll(list, str); ``` -## Collection.toArray()方法使用的坑&如何反转数组 +## 2.2. Collection.toArray()方法使用的坑&如何反转数组 该方法是一个泛型方法:` T[] toArray(T[] a);` 如果`toArray`方法中没有传递任何参数的话返回的是`Object`类型数组。 @@ -291,7 +362,7 @@ s=list.toArray(new String[0]);//没有指定类型的话会报错 由于JVM优化,`new String[0]`作为`Collection.toArray()`方法的参数现在使用更好,`new String[0]`就是起一个模板的作用,指定了返回数组的类型,0是为了节省空间,因为它只是为了说明返回的类型。详见: -## 不要在 foreach 循环里进行元素的 remove/add 操作 +## 2.3. 不要在 foreach 循环里进行元素的 remove/add 操作 如果要进行`remove`操作,可以调用迭代器的 `remove `方法而不是集合类的 remove 方法。因为如果列表在任何时间从结构上修改创建迭代器之后,以任何方式除非通过迭代器自身`remove/add`方法,迭代器都将抛出一个`ConcurrentModificationException`,这就是单线程状态下产生的 **fail-fast 机制**。 From 2f0a9934c0a814965c9c9c2dff22a8de353ba3bb Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Sun, 14 Jul 2019 17:56:03 +0800 Subject: [PATCH 007/130] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 704c2921c07..96a459b6da8 100644 --- a/README.md +++ b/README.md @@ -73,6 +73,7 @@ * [Java 基础知识回顾](docs/java/Java基础知识.md) * [Java 基础知识疑难点/易错点](docs/java/Java疑难点.md) +* [一些重要的Java程序设计题](docs/java/Java程序设计题.md) * [J2EE 基础知识回顾](docs/java/J2EE基础知识.md) ### 容器 From 78813345a39efc808a4206bcf00aecca378ec249 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Sun, 14 Jul 2019 17:56:30 +0800 Subject: [PATCH 008/130] =?UTF-8?q?Create=20Java=E7=A8=8B=E5=BA=8F?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1=E9=A2=98.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17\350\256\276\350\256\241\351\242\230.md" | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 "docs/java/Java\347\250\213\345\272\217\350\256\276\350\256\241\351\242\230.md" diff --git "a/docs/java/Java\347\250\213\345\272\217\350\256\276\350\256\241\351\242\230.md" "b/docs/java/Java\347\250\213\345\272\217\350\256\276\350\256\241\351\242\230.md" new file mode 100644 index 00000000000..46c9c16994b --- /dev/null +++ "b/docs/java/Java\347\250\213\345\272\217\350\256\276\350\256\241\351\242\230.md" @@ -0,0 +1,125 @@ +## 泛型的实际应用 + +### 实现最小值函数 + +自己设计一个泛型的获取数组最小值的函数.并且这个方法只能接受Number的子类并且实现了Comparable接口。 + +```java +//注意:Number并没有实现Comparable +private static > T min(T[] values) { + if (values == null || values.length == 0) return null; + T min = values[0]; + for (int i = 1; i < values.length; i++) { + if (min.compareTo(values[i]) > 0) min = values[i]; + } + return min; +} +``` + +测试: + +```java +int minInteger = min(new Integer[]{1, 2, 3});//result:1 +double minDouble = min(new Double[]{1.2, 2.2, -1d});//result:-1d +String typeError = min(new String[]{"1","3"});//报错 +``` + +## 数据结构 + +### 使用数组实现栈 + +**自己实现一个栈,要求这个栈具有`push()`、`pop()`(返回栈顶元素并出栈)、`peek()` (返回栈顶元素不出栈)、`isEmpty()`、`size()`这些基本的方法。** + +提示:每次入栈之前先判断栈的容量是否够用,如果不够用就用`Arrays.copyOf()`进行扩容; + +```java +public class MyStack { + private int[] storage;//存放栈中元素的数组 + private int capacity;//栈的容量 + private int count;//栈中元素数量 + private static final int GROW_FACTOR = 2; + + //TODO:不带初始容量的构造方法。默认容量为8 + public MyStack() { + this.capacity = 8; + this.storage=new int[8]; + this.count = 0; + } + + //TODO:带初始容量的构造方法 + public MyStack(int initialCapacity) { + if (initialCapacity < 1) + throw new IllegalArgumentException("Capacity too small."); + + this.capacity = initialCapacity; + this.storage = new int[initialCapacity]; + this.count = 0; + } + + //TODO:入栈 + public void push(int value) { + if (count == capacity) { + ensureCapacity(); + } + storage[count++] = value; + } + + //TODO:确保容量大小 + private void ensureCapacity() { + int newCapacity = capacity * GROW_FACTOR; + storage = Arrays.copyOf(storage, newCapacity); + capacity = newCapacity; + } + + //TODO:返回栈顶元素并出栈 + private int pop() { + count--; + if (count == -1) + throw new IllegalArgumentException("Stack is empty."); + + return storage[count]; + } + + //TODO:返回栈顶元素不出栈 + private int peek() { + if (count == 0){ + throw new IllegalArgumentException("Stack is empty."); + }else { + return storage[count-1]; + } + } + + //TODO:判断栈是否为空 + private boolean isEmpty() { + return count == 0; + } + + //TODO:返回栈中元素的个数 + private int size() { + return count; + } + +} + +``` + +验证 + +```java +MyStack myStack = new MyStack(3); +myStack.push(1); +myStack.push(2); +myStack.push(3); +myStack.push(4); +myStack.push(5); +myStack.push(6); +myStack.push(7); +myStack.push(8); +System.out.println(myStack.peek());//8 +System.out.println(myStack.size());//8 +for (int i = 0; i < 8; i++) { + System.out.println(myStack.pop()); +} +System.out.println(myStack.isEmpty());//true +myStack.pop();//报错:java.lang.IllegalArgumentException: Stack is empty. +``` \ No newline at end of file From 18e80a8fcf57359c458d69cc00cd63814dd595e5 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Sun, 14 Jul 2019 22:17:24 +0800 Subject: [PATCH 009/130] =?UTF-8?q?Update=20Java=E7=96=91=E9=9A=BE?= =?UTF-8?q?=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "docs/java/Java\347\226\221\351\232\276\347\202\271.md" | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" index 066d01fb89b..e13c982b796 100644 --- "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" +++ "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" @@ -61,7 +61,7 @@ public static boolean equals(Object a, Object b) { Reference:[Java中equals方法造成空指针异常的原因及解决方案](https://blog.csdn.net/tick_tock97/article/details/72824894) -- 每种原始类型都有默认值一样,如int默认值为0,boolean的默认值为false,null是任何引用类型的默认值,不严格的说是所有object类型的默认值。 +- 每种原始类型都有默认值一样,如int默认值为 0,boolean 的默认值为 false,null 是任何引用类型的默认值,不严格的说是所有 Object 类型的默认值。 - 可以使用==或者!=操作来比较null值,但是不能使用其他算法或者逻辑操作。在Java中`null==null`将返回true。 - 不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常 @@ -81,7 +81,7 @@ System.out.println(a == b);//false System.out.println(a.equals(b));//false ``` -当使用自动装箱方式创建一个Integer对象时,当数值在-128 ~127时,会将创建的Integer对象缓存起来,当下次再出现该数值时,直接从缓存中取出对应的Integer对象。所以上述代码中,x和y引用的是相同的Integer对象。 +当使用自动装箱方式创建一个Integer对象时,当数值在-128 ~127时,会将创建的 Integer 对象缓存起来,当下次再出现该数值时,直接从缓存中取出对应的Integer对象。所以上述代码中,x和y引用的是相同的Integer对象。 **注意:**如果你的IDE(IDEA/Eclipse)上安装了阿里巴巴的p3c插件,这个插件如果检测到你用 ==的话会报错提示,推荐安装一个这个插件,很不错。 @@ -155,9 +155,7 @@ Reference:《阿里巴巴Java开发手册》 **正例** : 数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险。 -**反例** : 比如显示成交总额涨跌情况,即正负 x%,x 为基本数据类型,调用的 RPC 服务,调用不成功时, -返回的是默认值,页面显示为 0%,这是不合理的,应该显示成中划线。所以包装数据类型的 null 值,能 -够表示额外的信息,如:远程调用失败,异常退出。 +**反例** : 比如显示成交总额涨跌情况,即正负 x%,x 为基本数据类型,调用的 RPC 服务,调用不成功时,返回的是默认值,页面显示为 0%,这是不合理的,应该显示成中划线。所以包装数据类型的 null 值,能够表示额外的信息,如:远程调用失败,异常退出。 # 2. 集合 From cdb447ccf5c2a1a90bde5ed54051e6d269b16951 Mon Sep 17 00:00:00 2001 From: yellowgg Date: Mon, 15 Jul 2019 08:18:15 +0800 Subject: [PATCH 010/130] =?UTF-8?q?fix:markdown=E9=94=99=E8=AF=AF->JVM?= =?UTF-8?q?=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Java\345\206\205\345\255\230\345\214\272\345\237\237.md" | 4 ++-- .../jvm/\347\261\273\345\212\240\350\275\275\345\231\250.md" | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" index f944a6b2314..449898843c9 100644 --- "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" +++ "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" @@ -149,7 +149,7 @@ Java 堆是垃圾收集器管理的主要区域,因此也被称作**GC 堆(G #### 2.5.1 方法区和永久代的关系 -> 《Java 虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。那么,在不同的 JVM 上方法区的实现肯定是不同的了。 **方法区和永久代的关系很像 Java 中接口和类的关系,类实现了接口,而永久代就是 HotSpot 虚拟机对虚拟机规范中方法区的一种实现方式。** 也就是说,永久代是 HotSpot 的概念,方法区是 Java 虚拟机规范中的定义,是一种规范,而永久代是一种实现,一个是标准一个是实现,其他的虚拟机实现并没有永久带这一说法。 +> 《Java 虚拟机规范》只是规定了有方法区这么个概念和它的作用,并没有规定如何去实现它。那么,在不同的 JVM 上方法区的实现肯定是不同的了。 **方法区和永久代的关系很像 Java 中接口和类的关系,类实现了接口,而永久代就是 HotSpot 虚拟机对虚拟机规范中方法区的一种实现方式。** 也就是说,永久代是 HotSpot 的概念,方法区是 Java 虚拟机规范中的定义,是一种规范,而永久代是一种实现,一个是标准一个是实现,其他的虚拟机实现并没有永久代这一说法。 #### 2.5.2 常用参数 @@ -160,7 +160,7 @@ JDK 1.8 之前永久代还没被彻底移除的时候通常通过下面这些参 -XX:MaxPermSize=N //方法区 (永久代) 最大大小,超过这个值将会抛出 OutOfMemoryError 异常:java.lang.OutOfMemoryError: PermGen ``` -相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入方法区后就“永久存在”了。** +相对而言,垃圾收集行为在这个区域是比较少出现的,但并非数据进入方法区后就“永久存在”了。 JDK 1.8 的时候,方法区(HotSpot 的永久代)被彻底移除了(JDK1.7 就已经开始了),取而代之是元空间,元空间使用的是直接内存。 diff --git "a/docs/java/jvm/\347\261\273\345\212\240\350\275\275\345\231\250.md" "b/docs/java/jvm/\347\261\273\345\212\240\350\275\275\345\231\250.md" index 1edbd940ef8..b380716c603 100644 --- "a/docs/java/jvm/\347\261\273\345\212\240\350\275\275\345\231\250.md" +++ "b/docs/java/jvm/\347\261\273\345\212\240\350\275\275\345\231\250.md" @@ -38,7 +38,7 @@ JVM 中内置了三个重要的 ClassLoader,除了 BootstrapClassLoader 其他 ### 双亲委派模型介绍 -每一个类都有一个对应它的类加载器。系统中的 ClassLoder 在协同工作的时候会默认使用 **双亲委派模型** 。即在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载。**加载的时候,首先会把该请求委派该父类加载器的 `loadClass()` 处理,因此所有的请求最终都应该传送到顶层的启动类加载器 `BootstrapClassLoader` 中。当父类加载器无法处理时,才由自己来处理。**当父类加载器为null时,会使用启动类加载器 `BootstrapClassLoader` 作为父类加载器。 +每一个类都有一个对应它的类加载器。系统中的 ClassLoder 在协同工作的时候会默认使用 **双亲委派模型** 。即在类加载的时候,系统会首先判断当前类是否被加载过。已经被加载的类会直接返回,否则才会尝试加载。加载的时候,首先会把该请求委派该父类加载器的 `loadClass()` 处理,因此所有的请求最终都应该传送到顶层的启动类加载器 `BootstrapClassLoader` 中。当父类加载器无法处理时,才由自己来处理。当父类加载器为null时,会使用启动类加载器 `BootstrapClassLoader` 作为父类加载器。 ![ClassLoader](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/classloader_WPS图片.png) From ef53ce3d4f0bc14d1b89ce476cf7d1e5346679e0 Mon Sep 17 00:00:00 2001 From: yellowgg Date: Tue, 16 Jul 2019 16:59:10 +0800 Subject: [PATCH 011/130] =?UTF-8?q?fix:=E6=8B=BC=E5=86=99=E9=94=99?= =?UTF-8?q?=E8=AF=AF->=E7=BD=91=E7=BB=9C=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...73\234\347\237\245\350\257\206\346\200\273\347\273\223.md" | 4 ++-- ...56\241\347\256\227\346\234\272\347\275\221\347\273\234.md" | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git "a/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" "b/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" index 2a2a4a8b693..84a8631ab6f 100644 --- "a/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" +++ "b/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" @@ -54,13 +54,13 @@ 3,路由器是实现分组交换的关键构件,其任务是转发收到的分组,这是网络核心部分最重要的功能。分组交换采用存储转发技术,表示把一个报文(要发送的整块数据)分为几个分组后再进行传送。在发送报文之前,先把较长的报文划分成为一个个更小的等长数据段。在每个数据端的前面加上一些由必要的控制信息组成的首部后,就构成了一个分组。分组又称为包。分组是在互联网中传送的数据单元,正是由于分组的头部包含了诸如目的地址和源地址等重要控制信息,每一个分组才能在互联网中独立的选择传输路径,并正确地交付到分组传输的终点。 -4,互联网按工作方式可划分为边缘部分和核心部分。主机在网络的边缘部分,其作用是进行信息处理。由大量网络和连接这些网络的路由西组成边缘部分,其作用是提供连通性和交换。 +4,互联网按工作方式可划分为边缘部分和核心部分。主机在网络的边缘部分,其作用是进行信息处理。由大量网络和连接这些网络的路由器组成边缘部分,其作用是提供连通性和交换。 5,计算机通信是计算机中进程(即运行着的程序)之间的通信。计算机网络采用的通信方式是客户-服务器方式(C/S方式)和对等连接方式(P2P方式)。 6,客户和服务器都是指通信中所涉及的应用进程。客户是服务请求方,服务器是服务提供方。 -7,按照作用范围的不同,计算机网络分为广域网WAN,城域网MAN,局域网LAN,个人区域网PAN。 +7,按照作用范围的不同,计算机网络分为广域网WAN,城域网MAN,局域网LAN,个人区域网PAN。 8,计算机网络最常用的性能指标是:速率,带宽,吞吐量,时延(发送时延,处理时延,排队时延),时延带宽积,往返时间和信道利用率。 diff --git "a/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" "b/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" index c5bce5a067a..aa378af9234 100644 --- "a/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" +++ "b/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" @@ -302,8 +302,8 @@ HTTP1.0最早在网页中使用是在1996年,那个时候只是使用一些较 ## 十二 URI和URL的区别是什么? -- URI(Uniform Resource Identifier) 是同一资源标志符,可以唯一标识一个资源。 -- URL(Uniform Resource Location) 是同一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。 +- URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。 +- URL(Uniform Resource Location) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI,即 URL 可以用来标识一个资源,而且还指明了如何 locate 这个资源。 URI的作用像身份证号一样,URL的作用更像家庭住址一样。URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。 From 10ae230a618a3a9bd6eec33373642f818d428400 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Wed, 17 Jul 2019 17:20:17 +0800 Subject: [PATCH 012/130] =?UTF-8?q?Update=20Java=E7=96=91=E9=9A=BE?= =?UTF-8?q?=E7=82=B9.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "docs/java/Java\347\226\221\351\232\276\347\202\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" index e13c982b796..8abad01b9ea 100644 --- "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" +++ "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" @@ -78,7 +78,7 @@ System.out.println(x == y);// true Integer a = new Integer(3); Integer b = new Integer(3); System.out.println(a == b);//false -System.out.println(a.equals(b));//false +System.out.println(a.equals(b));//true ``` 当使用自动装箱方式创建一个Integer对象时,当数值在-128 ~127时,会将创建的 Integer 对象缓存起来,当下次再出现该数值时,直接从缓存中取出对应的Integer对象。所以上述代码中,x和y引用的是相同的Integer对象。 From a128881d4599a7871d2c041f9b1cb2e8dc7595a3 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Thu, 18 Jul 2019 23:16:12 +0800 Subject: [PATCH 013/130] Update Spring.md --- docs/system-design/framework/spring/Spring.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/docs/system-design/framework/spring/Spring.md b/docs/system-design/framework/spring/Spring.md index 7f4db10c16e..d6d073c2f59 100644 --- a/docs/system-design/framework/spring/Spring.md +++ b/docs/system-design/framework/spring/Spring.md @@ -4,9 +4,8 @@ ### 官网相关 -- [Spring官网](https://spring.io/) -- [Spring系列主要项目](https://spring.io/projects) -- [Spring官网指南](https://spring.io/guides) +- [Spring官网](https://spring.io/)、[Spring系列主要项目](https://spring.io/projects)、[Spring官网指南](https://spring.io/guides)、[官方文档](https://spring.io/docs/reference) +- [spring-framework-reference](https://docs.spring.io/spring/docs/5.0.14.RELEASE/spring-framework-reference/index.html) - [Spring Framework 4.3.17.RELEASE API](https://docs.spring.io/spring/docs/4.3.17.RELEASE/javadoc-api/) ## 系统学习教程 From bff76b0fa9b84059622913d14e2ee632878d6ba5 Mon Sep 17 00:00:00 2001 From: yellowgg Date: Fri, 19 Jul 2019 10:43:08 +0800 Subject: [PATCH 014/130] =?UTF-8?q?fix:=E6=8B=BC=E5=86=99=E9=94=99?= =?UTF-8?q?=E8=AF=AF->=E6=93=8D=E4=BD=9C=E7=B3=BB=E7=BB=9F=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/operating-system/Shell.md | 2 +- ...204Linux\345\237\272\347\241\200\347\237\245\350\257\206.md" | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/operating-system/Shell.md b/docs/operating-system/Shell.md index 0f11b0ae47d..7ed6aad498f 100644 --- a/docs/operating-system/Shell.md +++ b/docs/operating-system/Shell.md @@ -78,7 +78,7 @@ echo "helloworld!" shell中 # 符号表示注释。**shell 的第一行比较特殊,一般都会以#!开始来指定使用的 shell 类型。在linux中,除了bash shell以外,还有很多版本的shell, 例如zsh、dash等等...不过bash shell还是我们使用最多的。** -(4) 运行脚本:`./helloworld.sh` 。(注意,一定要写成 `./helloworld.sh` ,而不是 `helloworld.sh` ,运行其它二进制的程序也一样,直接写 `helloworld.sh` ,linux 系统会去 PATH 里寻找有没有叫 test.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 `helloworld.sh` 是会找不到命令的,要用`./helloworld.sh` 告诉系统说,就在当前目录找。) +(4) 运行脚本:`./helloworld.sh` 。(注意,一定要写成 `./helloworld.sh` ,而不是 `helloworld.sh` ,运行其它二进制的程序也一样,直接写 `helloworld.sh` ,linux 系统会去 PATH 里寻找有没有叫 helloworld.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 `helloworld.sh` 是会找不到命令的,要用`./helloworld.sh` 告诉系统说,就在当前目录找。) ![shell 编程Hello World](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-11-16/55296212.jpg) diff --git "a/docs/operating-system/\345\220\216\347\253\257\347\250\213\345\272\217\345\221\230\345\277\205\345\244\207\347\232\204Linux\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/operating-system/\345\220\216\347\253\257\347\250\213\345\272\217\345\221\230\345\277\205\345\244\207\347\232\204Linux\345\237\272\347\241\200\347\237\245\350\257\206.md" index 66ed1d605eb..4272501eca7 100644 --- "a/docs/operating-system/\345\220\216\347\253\257\347\250\213\345\272\217\345\221\230\345\277\205\345\244\207\347\232\204Linux\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/docs/operating-system/\345\220\216\347\253\257\347\250\213\345\272\217\345\221\230\345\277\205\345\244\207\347\232\204Linux\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -206,7 +206,7 @@ Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.g 1 将/test下的test.tar.gz解压到当前目录下可以使用命令:**`tar -xvf test.tar.gz`** -2 将/test下的test.tar.gz解压到根目录/usr下:**`tar -xvf xxx.tar.gz -C /usr`**(- C代表指定解压的位置) +2 将/test下的test.tar.gz解压到根目录/usr下:**`tar -xvf test.tar.gz -C /usr`**(- C代表指定解压的位置) ### 4.5 Linux的权限命令 From 9df5b02b8757acd8f2972a87fd8dd94563f94e67 Mon Sep 17 00:00:00 2001 From: yellowgg Date: Sat, 20 Jul 2019 10:56:51 +0800 Subject: [PATCH 015/130] =?UTF-8?q?fix:=E4=B9=A6=E5=86=99=E9=94=99?= =?UTF-8?q?=E8=AF=AF->Mysql=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/database/MySQL.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/database/MySQL.md b/docs/database/MySQL.md index 4d38d8b63bd..c9a8d6e637e 100644 --- a/docs/database/MySQL.md +++ b/docs/database/MySQL.md @@ -174,7 +174,7 @@ select sql_no_cache count(*) from usr; - **不可重复读(Unrepeatableread):** 指在一个事务内多次读同一数据。在这个事务还没有结束时,另一个事务也访问该数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改导致第一个事务两次读取的数据可能不太一样。这就发生了在一个事务内两次读到的数据是不一样的情况,因此称为不可重复读。 - **幻读(Phantom read):** 幻读与不可重复读类似。它发生在一个事务(T1)读取了几行数据,接着另一个并发事务(T2)插入了一些数据时。在随后的查询中,第一个事务(T1)就会发现多了一些原本不存在的记录,就好像发生了幻觉一样,所以称为幻读。 -**不可重复度和幻读区别:** +**不可重复读和幻读区别:** 不可重复读的重点是修改比如多次读取一条记录发现其中某些列的值被修改,幻读的重点在于新增或者删除比如多次读取一条记录发现记录增多或减少了。 @@ -207,11 +207,13 @@ mysql> SELECT @@tx_isolation; +-----------------+ ``` -这里需要注意的是:与 SQL 标准不同的地方在于 InnoDB 存储引擎在 **REPEATABLE-READ(可重读)**事务隔离级别下使用的是Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server)是不同的。所以说InnoDB 存储引擎的默认支持的隔离级别是 **REPEATABLE-READ(可重读)** 已经可以完全保证事务的隔离性要求,即达到了 SQL标准的**SERIALIZABLE(可串行化)**隔离级别。 +这里需要注意的是:与 SQL 标准不同的地方在于 InnoDB 存储引擎在 **REPEATABLE-READ(可重读)** +事务隔离级别下使用的是Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server) +是不同的。所以说InnoDB 存储引擎的默认支持的隔离级别是 **REPEATABLE-READ(可重读)** 已经可以完全保证事务的隔离性要求,即达到了 + SQL标准的 **SERIALIZABLE(可串行化)** 隔离级别。因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 **READ-COMMITTED(读取提交内容) +**,但是你要知道的是InnoDB 存储引擎默认使用 **REPEAaTABLE-READ(可重读)** 并不会有任何性能损失。 -因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是**READ-COMMITTED(读取提交内容):**,但是你要知道的是InnoDB 存储引擎默认使用 **REPEATABLE-READ(可重读)**并不会有任何性能损失。 - -InnoDB 存储引擎在 **分布式事务** 的情况下一般会用到**SERIALIZABLE(可串行化)**隔离级别。 +InnoDB 存储引擎在 **分布式事务** 的情况下一般会用到 **SERIALIZABLE(可串行化)** 隔离级别。 ### 锁机制与InnoDB锁算法 From de85bf4521d2957ece27455914220458f5b4e04b Mon Sep 17 00:00:00 2001 From: yellowgg Date: Sat, 20 Jul 2019 11:12:17 +0800 Subject: [PATCH 016/130] Update MySQL.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修复辽。。 --- docs/database/MySQL.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/database/MySQL.md b/docs/database/MySQL.md index c9a8d6e637e..ba5a5fa94b2 100644 --- a/docs/database/MySQL.md +++ b/docs/database/MySQL.md @@ -210,8 +210,7 @@ mysql> SELECT @@tx_isolation; 这里需要注意的是:与 SQL 标准不同的地方在于 InnoDB 存储引擎在 **REPEATABLE-READ(可重读)** 事务隔离级别下使用的是Next-Key Lock 锁算法,因此可以避免幻读的产生,这与其他数据库系统(如 SQL Server) 是不同的。所以说InnoDB 存储引擎的默认支持的隔离级别是 **REPEATABLE-READ(可重读)** 已经可以完全保证事务的隔离性要求,即达到了 - SQL标准的 **SERIALIZABLE(可串行化)** 隔离级别。因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 **READ-COMMITTED(读取提交内容) -**,但是你要知道的是InnoDB 存储引擎默认使用 **REPEAaTABLE-READ(可重读)** 并不会有任何性能损失。 + SQL标准的 **SERIALIZABLE(可串行化)** 隔离级别。因为隔离级别越低,事务请求的锁越少,所以大部分数据库系统的隔离级别都是 **READ-COMMITTED(读取提交内容)** ,但是你要知道的是InnoDB 存储引擎默认使用 **REPEAaTABLE-READ(可重读)** 并不会有任何性能损失。 InnoDB 存储引擎在 **分布式事务** 的情况下一般会用到 **SERIALIZABLE(可串行化)** 隔离级别。 From 6537533ded31acbf53b01a5cd1c515478d90c871 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Sat, 20 Jul 2019 13:30:21 +0800 Subject: [PATCH 017/130] =?UTF-8?q?Update=20=E5=87=A0=E9=81=93=E5=B8=B8?= =?UTF-8?q?=E8=A7=81=E7=9A=84=E5=AD=90=E7=AC=A6=E4=B8=B2=E7=AE=97=E6=B3=95?= =?UTF-8?q?=E9=A2=98.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\254\246\344\270\262\347\256\227\346\263\225\351\242\230.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\345\255\220\347\254\246\344\270\262\347\256\227\346\263\225\351\242\230.md" "b/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\345\255\220\347\254\246\344\270\262\347\256\227\346\263\225\351\242\230.md" index c85c1b74f2c..cd2a3e31e2b 100644 --- "a/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\345\255\220\347\254\246\344\270\262\347\256\227\346\263\225\351\242\230.md" +++ "b/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\345\255\220\347\254\246\344\270\262\347\256\227\346\263\225\351\242\230.md" @@ -459,7 +459,7 @@ public class Main { return 0; } } - return flag == 1 ? res : -res; + return flag != 2 ? res : -res; } From 8d4d5c1cf72f24224375cfe3de49abb620018a48 Mon Sep 17 00:00:00 2001 From: vayci Date: Tue, 23 Jul 2019 11:25:54 +0800 Subject: [PATCH 018/130] =?UTF-8?q?=E4=BF=AE=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 --- .../jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md" "b/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md" index 1941b455b65..65e9d098353 100644 --- "a/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md" +++ "b/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md" @@ -287,7 +287,7 @@ JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引 **如果说收集算法是内存回收的方法论,那么垃圾收集器就是内存回收的具体实现。** -虽然我们对各个收集器进行比较,但并非要挑选出一个最好的收集器。因为知道现在为止还没有最好的垃圾收集器出现,更加没有万能的垃圾收集器,**我们能做的就是根据具体应用场景选择适合自己的垃圾收集器**。试想一下:如果有一种四海之内、任何场景下都适用的完美收集器存在,那么我们的 HotSpot 虚拟机就不会实现那么多不同的垃圾收集器了。 +虽然我们对各个收集器进行比较,但并非要挑选出一个最好的收集器。因为直到现在为止还没有最好的垃圾收集器出现,更加没有万能的垃圾收集器,**我们能做的就是根据具体应用场景选择适合自己的垃圾收集器**。试想一下:如果有一种四海之内、任何场景下都适用的完美收集器存在,那么我们的 HotSpot 虚拟机就不会实现那么多不同的垃圾收集器了。 ### 4.1 Serial 收集器 From ba53fa4d26f1864601a71923e8b9c44bad5e4e97 Mon Sep 17 00:00:00 2001 From: ipofss <274694451@qq.com> Date: Tue, 23 Jul 2019 14:44:37 +0800 Subject: [PATCH 019/130] =?UTF-8?q?=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" "b/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" index 84a8631ab6f..05061757d1b 100644 --- "a/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" +++ "b/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" @@ -38,7 +38,7 @@ #### 分组(packet ): 因特网中传送的数据单元。由首部header和数据段组成。分组又称为包,首部可称为包头。 #### 存储转发(store and forward ): - 路由器收到一个分组,先存储下来,再检查气首部,查找转发表,按照首部中的目的地址,找到合适的接口转发出去。 + 路由器收到一个分组,先存储下来,再检查其首部,查找转发表,按照首部中的目的地址,找到合适的接口转发出去。 #### 带宽(bandwidth): 在计算机网络中,表示在单位时间内从网络中的某一点到另一点所能通过的“最高数据率”。常用来表示网络的通信线路所能传送数据的能力。单位是“比特每秒”,记为b/s。 #### 吞吐量(throughput ): From 95530a843f23746b3829def21eb45d10d6788b93 Mon Sep 17 00:00:00 2001 From: ipofss <274694451@qq.com> Date: Tue, 23 Jul 2019 15:09:50 +0800 Subject: [PATCH 020/130] =?UTF-8?q?=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" "b/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" index 84a8631ab6f..b493919dcef 100644 --- "a/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" +++ "b/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" @@ -193,7 +193,7 @@ 12,以太网的适配器具有过滤功能,它只接收单播帧,广播帧和多播帧。 -13,使用集线器可以在物理层扩展以太网(扩展后的以太网任然是一个网络) +13,使用集线器可以在物理层扩展以太网(扩展后的以太网仍然是一个网络) ### (3),最重要的知识点 #### ① 数据链路层的点对点信道和广播信道的特点,以及这两种信道所使用的协议(PPP协议以及CSMA/CD协议)的特点 #### ② 数据链路层的三个基本问题:**封装成帧**,**透明传输**,**差错检测** From 787c31907c950d7389ff36001e2ec2ab0c427578 Mon Sep 17 00:00:00 2001 From: yellowgg Date: Tue, 23 Jul 2019 15:42:48 +0800 Subject: [PATCH 021/130] =?UTF-8?q?fix:=E4=B9=A6=E5=86=99=E9=94=99?= =?UTF-8?q?=E8=AF=AF->Spring=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../framework/spring/SpringInterviewQuestions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index 9295681bfaa..9d7b2d50096 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -43,7 +43,7 @@ Spring 官网列出的 Spring 的 6 个特征: ![Spring主要模块](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/Spring主要模块.png) - **Spring Core:** 基础,可以说 Spring 其他所有的功能都需要依赖于该类库。主要提供 IoC 依赖注入功能。 -- **Spring Aspects ** : 该模块为与AspectJ的集成提供支持。 +- **Spring Aspects** : 该模块为与AspectJ的集成提供支持。 - **Spring AOP** :提供了面向方面的编程实现。 - **Spring JDBC** : Java数据库连接。 - **Spring JMS** :Java消息服务。 @@ -227,7 +227,7 @@ public OneService getService(status) { 我们一般使用 `@Autowired` 注解自动装配 bean,要想把类标识成可用于 `@Autowired` 注解自动装配的 bean 的类,采用以下注解可实现: -- `@Component` :通用的注解,可标注任意类为 `Spring` 组件。如果一个Bean不知道属于拿个层,可以使用`@Component` 注解标注。 +- `@Component` :通用的注解,可标注任意类为 `Spring` 组件。如果一个Bean不知道属于哪个层,可以使用`@Component` 注解标注。 - `@Repository` : 对应持久层即 Dao 层,主要用于数据库相关操作。 - `@Service` : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。 - `@Controller` : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。 From e4db22afe97c70d783d5935e0d6edc11a991d90a Mon Sep 17 00:00:00 2001 From: yellowgg Date: Tue, 23 Jul 2019 15:43:02 +0800 Subject: [PATCH 022/130] =?UTF-8?q?fix:=E4=B9=A6=E5=86=99=E9=94=99?= =?UTF-8?q?=E8=AF=AF->Git=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/tools/Git.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/tools/Git.md b/docs/tools/Git.md index e58f13b63aa..37e1f4465c7 100644 --- a/docs/tools/Git.md +++ b/docs/tools/Git.md @@ -112,7 +112,7 @@ Git 有三种状态,你的文件可能处于其中之一: 2. **已修改(modified)**:已修改表示修改了文件,但还没保存到数据库中。 3. **已暂存(staged)**:表示对一个已修改文件的当前版本做了标记,使之包含在下次提交的快照中。 -由此引入 Git 项目的三个工作区域的概念:**Git 仓库(.git directoty) **、**工作目录(Working Directory)** 以及 **暂存区域(Staging Area)** 。 +由此引入 Git 项目的三个工作区域的概念:**Git 仓库(.git directoty)**、**工作目录(Working Directory)** 以及 **暂存区域(Staging Area)** 。

From c13dda24686aafbddcedbb8f5647ea298e694693 Mon Sep 17 00:00:00 2001 From: vayci Date: Tue, 23 Jul 2019 17:03:17 +0800 Subject: [PATCH 023/130] =?UTF-8?q?=E4=BF=AE=E6=AD=A3"=E6=BB=A1=E4=BA=8C?= =?UTF-8?q?=E5=8F=89=E6=A0=91"=E7=99=BE=E5=BA=A6=E7=99=BE=E7=A7=91?= =?UTF-8?q?=E9=93=BE=E6=8E=A5=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\346\225\260\346\215\256\347\273\223\346\236\204.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/dataStructures-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md" "b/docs/dataStructures-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md" index 6bb19abaaa1..f3696d2cd38 100644 --- "a/docs/dataStructures-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md" +++ "b/docs/dataStructures-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md" @@ -104,7 +104,7 @@ Set 继承于 Collection 接口,是一个不允许出现重复元素,并且 (1)[完全二叉树](https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91)——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。 - (2)[满二叉树](https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91)——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。 + (2)[满二叉树](https://baike.baidu.com/item/%E6%BB%A1%E4%BA%8C%E5%8F%89%E6%A0%91)——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。 (3)[平衡二叉树](https://baike.baidu.com/item/%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91/10421057)——平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。 From 5c405998c5c2a43174efbe1f14ea410a93934bef Mon Sep 17 00:00:00 2001 From: wangxiaowu Date: Tue, 23 Jul 2019 18:14:25 +0800 Subject: [PATCH 024/130] Update SpringInterviewQuestions.md --- docs/system-design/framework/spring/SpringInterviewQuestions.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index 9295681bfaa..1eaa7656af1 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -44,7 +44,7 @@ Spring 官网列出的 Spring 的 6 个特征: - **Spring Core:** 基础,可以说 Spring 其他所有的功能都需要依赖于该类库。主要提供 IoC 依赖注入功能。 - **Spring Aspects ** : 该模块为与AspectJ的集成提供支持。 -- **Spring AOP** :提供了面向方面的编程实现。 +- **Spring AOP** :提供了面向切面的编程实现。 - **Spring JDBC** : Java数据库连接。 - **Spring JMS** :Java消息服务。 - **Spring ORM** : 用于支持Hibernate等ORM工具。 From 382fc23361e46444eff17a30594a14ce906314ef Mon Sep 17 00:00:00 2001 From: ipofss <274694451@qq.com> Date: Wed, 24 Jul 2019 10:12:54 +0800 Subject: [PATCH 025/130] =?UTF-8?q?=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...4Linux\345\237\272\347\241\200\347\237\245\350\257\206.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/docs/operating-system/\345\220\216\347\253\257\347\250\213\345\272\217\345\221\230\345\277\205\345\244\207\347\232\204Linux\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/operating-system/\345\220\216\347\253\257\347\250\213\345\272\217\345\221\230\345\277\205\345\244\207\347\232\204Linux\345\237\272\347\241\200\347\237\245\350\257\206.md" index 4272501eca7..199bfc9b35a 100644 --- "a/docs/operating-system/\345\220\216\347\253\257\347\250\213\345\272\217\345\221\230\345\277\205\345\244\207\347\232\204Linux\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/docs/operating-system/\345\220\216\347\253\257\347\250\213\345\272\217\345\221\230\345\277\205\345\244\207\347\232\204Linux\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -32,7 +32,7 @@ ### 1.1 操作系统简介 -我通过以下四点介绍什么操作系统: +我通过以下四点介绍什么是操作系统: - **操作系统(Operation System,简称OS)是管理计算机硬件与软件资源的程序,是计算机系统的内核与基石;** - **操作系统本质上是运行在计算机上的软件程序 ;** @@ -193,7 +193,7 @@ Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.g f:指定文件名 -比如:加入test目录下有三个文件分别是:aaa.txt bbb.txt ccc.txt,如果我们要打包test目录并指定压缩后的压缩包名称为test.tar.gz可以使用命令:**`tar -zcvf test.tar.gz aaa.txt bbb.txt ccc.txt`或:`tar -zcvf test.tar.gz /test/`** +比如:假如test目录下有三个文件分别是:aaa.txt bbb.txt ccc.txt,如果我们要打包test目录并指定压缩后的压缩包名称为test.tar.gz可以使用命令:**`tar -zcvf test.tar.gz aaa.txt bbb.txt ccc.txt`或:`tar -zcvf test.tar.gz /test/`** **2)解压压缩包:** From 229377c6866e288d5532f1f98f5e7323f6855bfe Mon Sep 17 00:00:00 2001 From: ipofss <274694451@qq.com> Date: Wed, 24 Jul 2019 15:37:05 +0800 Subject: [PATCH 026/130] =?UTF-8?q?=E5=8A=A0=E5=85=A5=E6=8F=90=E7=A4=BA?= =?UTF-8?q?=E8=AF=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/operating-system/Shell.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/operating-system/Shell.md b/docs/operating-system/Shell.md index 7ed6aad498f..e58f5c409e4 100644 --- a/docs/operating-system/Shell.md +++ b/docs/operating-system/Shell.md @@ -260,7 +260,7 @@ echo $length #输出:5 echo $length2 #输出:5 # 输出数组第三个元素 echo ${array[2]} #输出:3 -unset array[1]# 删除下表为1的元素也就是删除第二个元素 +unset array[1]# 删除下标为1的元素也就是删除第二个元素 for i in ${array[@]};do echo $i ;done # 遍历数组,输出: 1 3 4 5 unset arr_number; # 删除数组中的所有元素 for i in ${array[@]};do echo $i ;done # 遍历数组,数组元素为空,没有任何输出内容 @@ -283,7 +283,7 @@ for i in ${array[@]};do echo $i ;done # 遍历数组,数组元素为空,没 ![算数运算符](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-11-22/4937342.jpg) -我以加法运算符做一个简单的示例: +我以加法运算符做一个简单的示例(注意:不是单引号,是反引号): ```shell #!/bin/bash From a2b1e00c7e31e12f1e545e54ab72cc37be9ee1a9 Mon Sep 17 00:00:00 2001 From: ipofss <274694451@qq.com> Date: Wed, 24 Jul 2019 16:02:12 +0800 Subject: [PATCH 027/130] =?UTF-8?q?=E6=8C=87=E5=90=91=E6=96=B0=E9=93=BE?= =?UTF-8?q?=E6=8E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../\346\225\260\346\215\256\347\273\223\346\236\204.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/docs/dataStructures-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md" "b/docs/dataStructures-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md" index 6bb19abaaa1..eaf665536c8 100644 --- "a/docs/dataStructures-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md" +++ "b/docs/dataStructures-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md" @@ -83,8 +83,8 @@ Set 继承于 Collection 接口,是一个不允许出现重复元素,并且 ### ArrayList 和 LinkedList 源码学习 -- [ArrayList 源码学习](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/ArrayList.md) -- [LinkedList 源码学习](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/LinkedList.md) +- [ArrayList 源码学习](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/ArrayList.md) +- [LinkedList 源码学习](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/LinkedList.md) ### 推荐阅读 From 3d770ea5732c75e3c3cf972ab5ae6362f2d6c88c Mon Sep 17 00:00:00 2001 From: Anthony <136936954@qq.com> Date: Thu, 25 Jul 2019 09:56:23 +0800 Subject: [PATCH 028/130] =?UTF-8?q?redis=E7=BA=BF=E7=A8=8B=E6=A8=A1?= =?UTF-8?q?=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/database/Redis/Redis.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/docs/database/Redis/Redis.md b/docs/database/Redis/Redis.md index 559e0a5aae3..52efa5ad02c 100644 --- a/docs/database/Redis/Redis.md +++ b/docs/database/Redis/Redis.md @@ -54,6 +54,21 @@ 使用 redis 或 memcached 之类的称为分布式缓存,在多实例的情况下,各实例共用一份缓存数据,缓存具有一致性。缺点是需要保持 redis 或 memcached服务的高可用,整个程序架构上较为复杂。 +### redis 的线程模型 + +> 参考地址:https://www.javazhiyin.com/22943.html + +redis 内部使用文件事件处理器 `file event handler`,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。 + +文件事件处理器的结构包含 4 个部分: + +- 多个 socket +- IO 多路复用程序 +- 文件事件分派器 +- 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器) + +多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。 + ### redis 和 memcached 的区别 From 47776dbf467264c1d8b066cd6c74afe15bb0a5c9 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: Thu, 25 Jul 2019 10:17:15 +0800 Subject: [PATCH 029/130] =?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=E6=95=B0=E7=BB=84=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E5=87=BD=E6=95=B0=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原文中的校验,存在边界问题,当 String[] strs = {};或者 String[] strs = null;时仍然会报错。 --- ...62\347\256\227\346\263\225\351\242\230.md" | 25 +++++++++++-------- 1 file changed, 14 insertions(+), 11 deletions(-) diff --git "a/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\345\255\220\347\254\246\344\270\262\347\256\227\346\263\225\351\242\230.md" "b/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\345\255\220\347\254\246\344\270\262\347\256\227\346\263\225\351\242\230.md" index cd2a3e31e2b..aa06e90073f 100644 --- "a/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\345\255\220\347\254\246\344\270\262\347\256\227\346\263\225\351\242\230.md" +++ "b/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\345\255\220\347\254\246\344\270\262\347\256\227\346\263\225\351\242\230.md" @@ -135,17 +135,20 @@ public class Main { } - private static boolean checkStrs(String[] strs) { - if (strs != null) { - // 遍历strs检查元素值 - for (int i = 0; i < strs.length; i++) { - if (strs[i] == null || strs[i].length() == 0) { - return false; - } - } - } - return true; - } + 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) { From 45e24a816ec5d9e6bf2e0f22515cc995409051bf 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: Thu, 25 Jul 2019 14:51:09 +0800 Subject: [PATCH 030/130] =?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=E6=95=B0=E7=BB=84=E6=A3=80?= =?UTF-8?q?=E6=B5=8B=E5=87=BD=E6=95=B0=E4=BF=AE=E5=A4=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原文中的校验,存在边界问题,当 String[] strs = {};或者 String[] strs = null;时仍然会报错。 --- ...7\254\246\344\270\262\347\256\227\346\263\225\351\242\230.md" | 1 + 1 file changed, 1 insertion(+) diff --git "a/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\345\255\220\347\254\246\344\270\262\347\256\227\346\263\225\351\242\230.md" "b/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\345\255\220\347\254\246\344\270\262\347\256\227\346\263\225\351\242\230.md" index aa06e90073f..8489082b2f3 100644 --- "a/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\345\255\220\347\254\246\344\270\262\347\256\227\346\263\225\351\242\230.md" +++ "b/docs/dataStructures-algorithms/\345\207\240\351\201\223\345\270\270\350\247\201\347\232\204\345\255\220\347\254\246\344\270\262\347\256\227\346\263\225\351\242\230.md" @@ -144,6 +144,7 @@ public class Main { flag = true; } else { flag = false; + break; } } } From d6ec462f22aff400faefc4e4af794dc185417061 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Thu, 25 Jul 2019 22:16:53 +0800 Subject: [PATCH 031/130] Update README.md --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 96a459b6da8..10081046d97 100644 --- a/README.md +++ b/README.md @@ -290,7 +290,10 @@ Markdown 格式参考:[Github Markdown格式](https://guides.github.com/featur - + + + + @@ -339,4 +342,4 @@ Markdown 格式参考:[Github Markdown格式](https://guides.github.com/featur **Java工程师必备学习资源:** 一些Java工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。 -![我的公众号](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/167598cd2e17b8ec.png) \ No newline at end of file +![我的公众号](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/167598cd2e17b8ec.png) From d85fa9900ace510115917f6681f1dcec202792f6 Mon Sep 17 00:00:00 2001 From: ipofss <274694451@qq.com> Date: Fri, 26 Jul 2019 10:23:41 +0800 Subject: [PATCH 032/130] Update MySQL.md --- docs/database/MySQL.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/database/MySQL.md b/docs/database/MySQL.md index ba5a5fa94b2..01ce0a71339 100644 --- a/docs/database/MySQL.md +++ b/docs/database/MySQL.md @@ -95,7 +95,7 @@ MyISAM是MySQL的默认数据库引擎(5.5版之前)。虽然性能极佳, **两者的对比:** 1. **是否支持行级锁** : MyISAM 只有表级锁(table-level locking),而InnoDB 支持行级锁(row-level locking)和表级锁,默认为行级锁。 -2. **是否支持事务和崩溃后的安全恢复: MyISAM** 强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。但是**InnoDB** 提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。 +2. **是否支持事务和崩溃后的安全恢复: MyISAM** 强调的是性能,每次查询具有原子性,其执行速度比InnoDB类型更快,但是不提供事务支持。但是**InnoDB** 提供事务支持事务,外部键等高级数据库功能。 具有事务(commit)、回滚(rollback)和崩溃修复能力(crash recovery capabilities)的事务安全(transaction-safe (ACID compliant))型表。 3. **是否支持外键:** MyISAM不支持,而InnoDB支持。 4. **是否支持MVCC** :仅 InnoDB 支持。应对高并发事务, MVCC比单纯的加锁更高效;MVCC只在 `READ COMMITTED` 和 `REPEATABLE READ` 两个隔离级别下工作;MVCC可以使用 乐观(optimistic)锁 和 悲观(pessimistic)锁来实现;各数据库中MVCC实现并不统一。推荐阅读:[MySQL-InnoDB-MVCC多版本并发控制](https://segmentfault.com/a/1190000012650596) 5. ...... @@ -104,7 +104,7 @@ MyISAM是MySQL的默认数据库引擎(5.5版之前)。虽然性能极佳, > 不要轻易相信“MyISAM比InnoDB快”之类的经验之谈,这个结论往往不是绝对的。在很多我们已知场景中,InnoDB的速度都可以让MyISAM望尘莫及,尤其是用到了聚簇索引,或者需要访问的数据都可以放入内存的应用。 -一般情况下我们选择 InnoDB 都是没有问题的,但是某事情况下你并不在乎可扩展能力和并发能力,也不需要事务支持,也不在乎崩溃后的安全恢复问题的话,选择MyISAM也是一个不错的选择。但是一般情况下,我们都是需要考虑到这些问题的。 +一般情况下我们选择 InnoDB 都是没有问题的,但是某些情况下你并不在乎可扩展能力和并发能力,也不需要事务支持,也不在乎崩溃后的安全恢复问题的话,选择MyISAM也是一个不错的选择。但是一般情况下,我们都是需要考虑到这些问题的。 ### 字符集及校对规则 @@ -160,14 +160,14 @@ select sql_no_cache count(*) from usr; ![事物的特性](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/事务特性.png) -1. **原子性:** 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; -2. **一致性:** 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的; -3. **隔离性:** 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的; -4. **持久性:** 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。 +1. **原子性(Atomicity):** 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; +2. **一致性(Consistency):** 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的; +3. **隔离性(Isolation):** 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的; +4. **持久性(Durability):** 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。 ### 并发事务带来哪些问题? -在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。 +在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对同一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。 - **脏读(Dirty read):** 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。 - **丢失修改(Lost to modify):** 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。 From 9af5efdd68cfe7ab9d00409f7b383df378e47988 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Sat, 27 Jul 2019 19:53:27 +0800 Subject: [PATCH 033/130] Update rabbitmq.md --- docs/system-design/data-communication/rabbitmq.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/system-design/data-communication/rabbitmq.md b/docs/system-design/data-communication/rabbitmq.md index 825f71239c6..28407cce610 100644 --- a/docs/system-design/data-communication/rabbitmq.md +++ b/docs/system-design/data-communication/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) @@ -177,7 +177,7 @@ erlang 官网下载:[http://www.erlang.org/downloads](http://www.erlang.org/do ```shell [root@SnailClimb local]#yum -y install make gcc gcc-c++ kernel-devel m4 ncurses-devel openssl-devel unixODBC-devel -``` +``` **5 进入erlang 安装包解压文件对 erlang 进行安装环境的配置** From e54ae79404bbb8054a7b93f90cdf4a33bb7610e7 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Sun, 28 Jul 2019 14:35:02 +0800 Subject: [PATCH 034/130] Update MySQL.md --- docs/database/MySQL.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/docs/database/MySQL.md b/docs/database/MySQL.md index 01ce0a71339..d8d31ada3b1 100644 --- a/docs/database/MySQL.md +++ b/docs/database/MySQL.md @@ -36,9 +36,13 @@ ## 文字教程推荐 -[MySQL 教程(菜鸟教程)](http://www.runoob.com/MySQL/MySQL-tutorial.html) +- [Github-MySQL入门教程(MySQL tutorial book)](https://github.com/jaywcjlove/mysql-tutorial) (从零开始学习MySQL,主要是面向MySQL数据库管理系统初学者) +- [官方教程](https://dev.mysql.com/doc/refman/5.7/) +- [MySQL 教程(菜鸟教程)](http://www.runoob.com/MySQL/MySQL-tutorial.html) -[MySQL教程(易百教程)](https://www.yiibai.com/MySQL/) +## 相关资源推荐 + +- [中国5级行政区域mysql库](https://github.com/kakuilan/china_area_mysql) ## 视频教程推荐 From 136584326d5d47dec249a71b750cdd96208362b1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=88=98=E5=B8=85?= <18392154300@163.com> Date: Mon, 29 Jul 2019 14:07:35 +0800 Subject: [PATCH 035/130] =?UTF-8?q?hasMap=20=20=E6=9B=B4=E6=AD=A3=E4=B8=BA?= =?UTF-8?q?=20=20hashMap?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit hasMap 更正为 hashMap --- ...\270\270\350\247\201\351\235\242\350\257\225\351\242\230.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\346\241\206\346\236\266\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230.md" "b/docs/java/collection/Java\351\233\206\345\220\210\346\241\206\346\236\266\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230.md" index 031f82e80d7..070b2af464e 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\346\241\206\346\236\266\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\346\241\206\346\236\266\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230.md" @@ -109,7 +109,7 @@ public interface RandomAccess { 4. **初始容量大小和每次扩充容量大小的不同 :** ①创建时如果不指定容量初始值,Hashtable 默认的初始大小为11,之后每次扩充,容量变为原来的2n+1。HashMap 默认的初始化大小为16。之后每次扩充,容量变为原来的2倍。②创建时如果给定了容量初始值,那么 Hashtable 会直接使用你给定的大小,而 HashMap 会将其扩充为2的幂次方大小(HashMap 中的`tableSizeFor()`方法保证,下面给出了源代码)。也就是说 HashMap 总是使用2的幂作为哈希表的大小,后面会介绍到为什么是2的幂次方。 5. **底层数据结构:** JDK1.8 以后的 HashMap 在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。Hashtable 没有这样的机制。 -**HasMap 中带有初始容量的构造函数:** +**HashMap 中带有初始容量的构造函数:** ```java public HashMap(int initialCapacity, float loadFactor) { From a19795a37fe27136f5aa9605ee547cadd2198124 Mon Sep 17 00:00:00 2001 From: CoderZZ Date: Mon, 29 Jul 2019 15:28:26 +0800 Subject: [PATCH 036/130] =?UTF-8?q?Update=20Java=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改2.1 程序计数器下"等功能都需要依赖这个计数器来完"->"等功能都需要依赖这个计数器来完成" --- .../Java\345\206\205\345\255\230\345\214\272\345\237\237.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" index 449898843c9..42d80a1cb43 100644 --- "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" +++ "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" @@ -84,7 +84,7 @@ Java 虚拟机在执行 Java 程序的过程中会把它管理的内存划分成 - 直接内存 (非运行时数据区的一部分) ### 2.1 程序计数器 -程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。**字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完。** +程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。**字节码解释器工作时通过改变这个计数器的值来选取下一条需要执行的字节码指令,分支、循环、跳转、异常处理、线程恢复等功能都需要依赖这个计数器来完成。** 另外,**为了线程切换后能恢复到正确的执行位置,每条线程都需要有一个独立的程序计数器,各线程之间计数器互不影响,独立存储,我们称这类内存区域为“线程私有”的内存。** From fe75d0132e69afbba5316c0477ed341aef9b834b Mon Sep 17 00:00:00 2001 From: yellowgg Date: Mon, 29 Jul 2019 15:30:44 +0800 Subject: [PATCH 037/130] =?UTF-8?q?fix:=E6=8B=BC=E5=86=99=E9=94=99?= =?UTF-8?q?=E8=AF=AF->j2EE=E5=9F=BA=E7=A1=80=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../J2EE\345\237\272\347\241\200\347\237\245\350\257\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/java/J2EE\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/J2EE\345\237\272\347\241\200\347\237\245\350\257\206.md" index fc9fac22c0b..c1dff59bd00 100644 --- "a/docs/java/J2EE\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/docs/java/J2EE\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -59,7 +59,7 @@ Servlet接口定义了5个方法,其中**前三个方法与Servlet生命周期 - `void init(ServletConfig config) throws ServletException` - `void service(ServletRequest req, ServletResponse resp) throws ServletException, java.io.IOException` -- `void destory()` +- `void destroy()` - `java.lang.String getServletInfo()` - `ServletConfig getServletConfig()` From 1723074201fdb4f783f5687014cdcd57469c40bd Mon Sep 17 00:00:00 2001 From: yellowgg Date: Mon, 29 Jul 2019 15:31:55 +0800 Subject: [PATCH 038/130] =?UTF-8?q?fix:markdown=E9=94=99=E8=AF=AF->java?= =?UTF-8?q?=E5=9F=BA=E7=A1=80=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ava\345\237\272\347\241\200\347\237\245\350\257\206.md" | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" index 6ec548e5eb4..c975ba01414 100644 --- "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -419,9 +419,10 @@ 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块不会被执行:** From 780b7d6f427ed099ba446f1483edfb92ff25637a Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Tue, 30 Jul 2019 08:56:43 +0800 Subject: [PATCH 039/130] Update MySQL.md --- docs/database/MySQL.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/database/MySQL.md b/docs/database/MySQL.md index d8d31ada3b1..446eb899bd5 100644 --- a/docs/database/MySQL.md +++ b/docs/database/MySQL.md @@ -36,6 +36,7 @@ ## 文字教程推荐 +- [SQL Tutorial](https://www.w3schools.com/sql/default.asp) (SQL语句学习)、[SQL语句在线练习](https://www.w3schools.com/sql/exercise.asp) (非常不错) - [Github-MySQL入门教程(MySQL tutorial book)](https://github.com/jaywcjlove/mysql-tutorial) (从零开始学习MySQL,主要是面向MySQL数据库管理系统初学者) - [官方教程](https://dev.mysql.com/doc/refman/5.7/) - [MySQL 教程(菜鸟教程)](http://www.runoob.com/MySQL/MySQL-tutorial.html) From 8a9fdb59de56800613c77b75942a918e57577c04 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Wed, 31 Jul 2019 09:13:01 +0800 Subject: [PATCH 040/130] Update MySQL.md --- docs/database/MySQL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/database/MySQL.md b/docs/database/MySQL.md index 446eb899bd5..d18118388d3 100644 --- a/docs/database/MySQL.md +++ b/docs/database/MySQL.md @@ -36,7 +36,7 @@ ## 文字教程推荐 -- [SQL Tutorial](https://www.w3schools.com/sql/default.asp) (SQL语句学习)、[SQL语句在线练习](https://www.w3schools.com/sql/exercise.asp) (非常不错) +- [SQL Tutorial](https://www.w3schools.com/sql/default.asp) (SQL语句学习,英文)、[SQL Tutorial](https://www.w3school.com.cn/sql/index.asp)(SQL语句学习,中文)、[SQL语句在线练习](https://www.w3schools.com/sql/exercise.asp) (非常不错) - [Github-MySQL入门教程(MySQL tutorial book)](https://github.com/jaywcjlove/mysql-tutorial) (从零开始学习MySQL,主要是面向MySQL数据库管理系统初学者) - [官方教程](https://dev.mysql.com/doc/refman/5.7/) - [MySQL 教程(菜鸟教程)](http://www.runoob.com/MySQL/MySQL-tutorial.html) From 757795fca0cafd7bfdc90dc003f8f1fdb8cee727 Mon Sep 17 00:00:00 2001 From: BQ Date: Thu, 1 Aug 2019 10:59:36 +0800 Subject: [PATCH 041/130] =?UTF-8?q?Update=20=E7=BE=8E=E5=9B=A2=E9=9D=A2?= =?UTF-8?q?=E8=AF=95=E5=B8=B8=E8=A7=81=E9=97=AE=E9=A2=98=E6=80=BB=E7=BB=93?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/essential-content-for-interview/PreparingForInterview/\347\276\216\345\233\242\351\235\242\350\257\225\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" "b/docs/essential-content-for-interview/PreparingForInterview/\347\276\216\345\233\242\351\235\242\350\257\225\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" index 46996cdb3e9..e0d34cb6255 100644 --- "a/docs/essential-content-for-interview/PreparingForInterview/\347\276\216\345\233\242\351\235\242\350\257\225\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" +++ "b/docs/essential-content-for-interview/PreparingForInterview/\347\276\216\345\233\242\351\235\242\350\257\225\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" @@ -484,7 +484,7 @@ TransactionDefinition 接口中定义了五个表示隔离级别的常量: ### 2.2 关于两者的总结 -MyISAM更适合读密集的表,而InnoDB更适合写密集的的表。 在数据库做主从分离的情况下,经常选择MyISAM作为主库的存储引擎。 +MyISAM更适合读密集的表,而InnoDB更适合写密集的表。 在数据库做主从分离的情况下,经常选择MyISAM作为主库的存储引擎。 一般来说,如果需要事务支持,并且有较高的并发读取频率(MyISAM的表锁的粒度太大,所以当该表写并发量较高时,要等待的查询就会很多了),InnoDB是不错的选择。如果你的数据量很大(MyISAM支持压缩特性可以减少磁盘的空间占用),而且不需要支持事务时,MyISAM是最好的选择。 From 4a819663a4e9f540b4802cff285210df4a97e2aa Mon Sep 17 00:00:00 2001 From: BQ Date: Thu, 1 Aug 2019 11:03:34 +0800 Subject: [PATCH 042/130] =?UTF-8?q?Update=20=E7=BE=8E=E5=9B=A2=E9=9D=A2?= =?UTF-8?q?=E8=AF=95=E5=B8=B8=E8=A7=81=E9=97=AE=E9=A2=98=E6=80=BB=E7=BB=93?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/essential-content-for-interview/PreparingForInterview/\347\276\216\345\233\242\351\235\242\350\257\225\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" "b/docs/essential-content-for-interview/PreparingForInterview/\347\276\216\345\233\242\351\235\242\350\257\225\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" index e0d34cb6255..6cf8973f2d9 100644 --- "a/docs/essential-content-for-interview/PreparingForInterview/\347\276\216\345\233\242\351\235\242\350\257\225\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" +++ "b/docs/essential-content-for-interview/PreparingForInterview/\347\276\216\345\233\242\351\235\242\350\257\225\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" @@ -32,7 +32,7 @@ - [2.1 两者的对比](#21-两者的对比) - [2.2 关于两者的总结](#22-关于两者的总结) - [3 聊聊 Java 中的集合吧!](#3-聊聊-java-中的集合吧) - - [3.1 Arraylist 与 LinkedList 有什么不同?\(注意加上从数据结构分析的内容\)](#31-arraylist-与-linkedlist-有什么不同注意加上从数据结构分析的内容) + - [3.1 ArrayList 与 LinkedList 有什么不同?\(注意加上从数据结构分析的内容\)](#31-arraylist-与-linkedlist-有什么不同注意加上从数据结构分析的内容) - [3.2 HashMap的底层实现](#32-hashmap的底层实现) - [1)JDK1.8之前](#1jdk18之前) - [2)JDK1.8之后](#2jdk18之后) From be248d48392827e0c5cd101e8200a442842ee3e7 Mon Sep 17 00:00:00 2001 From: yidasanqian Date: Thu, 1 Aug 2019 20:04:37 +0800 Subject: [PATCH 043/130] =?UTF-8?q?=E4=B9=A6=E5=86=99=E6=9B=B4=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70\270\350\247\201\351\235\242\350\257\225\351\242\230.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/docs/java/collection/Java\351\233\206\345\220\210\346\241\206\346\236\266\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230.md" "b/docs/java/collection/Java\351\233\206\345\220\210\346\241\206\346\236\266\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230.md" index 031f82e80d7..1789930f232 100644 --- "a/docs/java/collection/Java\351\233\206\345\220\210\346\241\206\346\236\266\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230.md" +++ "b/docs/java/collection/Java\351\233\206\345\220\210\346\241\206\346\236\266\345\270\270\350\247\201\351\235\242\350\257\225\351\242\230.md" @@ -431,8 +431,8 @@ Output: #### 2. Set - **HashSet(无序,唯一):** 基于 HashMap 实现的,底层采用 HashMap 来保存元素 -- **LinkedHashSet:** LinkedHashSet 继承与 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 Hashmap 实现一样,不过还是有一点点区别的。 -- **TreeSet(有序,唯一):** 红黑树(自平衡的排序二叉树。) +- **LinkedHashSet:** LinkedHashSet 继承于 HashSet,并且其内部是通过 LinkedHashMap 来实现的。有点类似于我们之前说的LinkedHashMap 其内部是基于 HashMap 实现一样,不过还是有一点点区别的 +- **TreeSet(有序,唯一):** 红黑树(自平衡的排序二叉树) ### Map From 836bd75985135957376219aefd7b77d3c1a90c98 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Sat, 3 Aug 2019 20:33:32 +0800 Subject: [PATCH 044/130] Update HomePage.md --- docs/HomePage.md | 6 ------ 1 file changed, 6 deletions(-) diff --git a/docs/HomePage.md b/docs/HomePage.md index 55000c08dee..43a338951fc 100644 --- a/docs/HomePage.md +++ b/docs/HomePage.md @@ -225,12 +225,6 @@ - [ ] Netty 总结(---正在进行中---) - [ ] 数据结构总结重构(---正在进行中---) -## 联系我 - -添加我的微信备注“Github”,回复关键字 **“加群”** 即可入群。 - -![我的微信](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-2/JavaGuide.jpg) - ## 公众号 - 如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。 From 566fbccced3adc4a90aac672abc2d872d355c8f3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9D=B3=E5=88=9A=E5=90=8C=E5=AD=A6?= Date: Sun, 4 Aug 2019 00:51:12 +0800 Subject: [PATCH 045/130] =?UTF-8?q?=E6=B7=BB=E5=8A=A0kafka=E7=B3=BB?= =?UTF-8?q?=E7=BB=9F=E8=AE=BE=E8=AE=A1=E5=BC=80=E7=AF=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\345\260\261\345\244\237\344\272\206.md" | 283 ++++++++++++++++++ 1 file changed, 283 insertions(+) create mode 100644 "docs/mq/Kafka/Kafka\347\263\273\347\273\237\350\256\276\350\256\241\345\274\200\347\257\207-\351\235\242\350\257\225\347\234\213\350\277\231\347\257\207\345\260\261\345\244\237\344\272\206.md" diff --git "a/docs/mq/Kafka/Kafka\347\263\273\347\273\237\350\256\276\350\256\241\345\274\200\347\257\207-\351\235\242\350\257\225\347\234\213\350\277\231\347\257\207\345\260\261\345\244\237\344\272\206.md" "b/docs/mq/Kafka/Kafka\347\263\273\347\273\237\350\256\276\350\256\241\345\274\200\347\257\207-\351\235\242\350\257\225\347\234\213\350\277\231\347\257\207\345\260\261\345\244\237\344\272\206.md" new file mode 100644 index 00000000000..f6fed8f6f9a --- /dev/null +++ "b/docs/mq/Kafka/Kafka\347\263\273\347\273\237\350\256\276\350\256\241\345\274\200\347\257\207-\351\235\242\350\257\225\347\234\213\350\277\231\347\257\207\345\260\261\345\244\237\344\272\206.md" @@ -0,0 +1,283 @@ +## 原文链接:https://mp.weixin.qq.com/s/zxPz_aFEMrshApZQ727h4g** + +## 引言 + +MQ(消息队列)是跨进程通信的方式之一,可理解为异步rpc,上游系统对调用结果的态度往往是重要不紧急。使用消息队列有以下好处:业务解耦、流量削峰、灵活扩展。接下来介绍消息中间件Kafka。 + +## Kafka是什么? + +Kafka是一个分布式的消息引擎。具有以下特征 + +能够发布和订阅消息流(类似于消息队列) +以容错的、持久的方式存储消息流 +多分区概念,提高了并行能力 + +## Kafka架构总览 + +![Kafka系统架构](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/kafka%E6%9E%B6%E6%9E%84.png) + +## Topic + +消息的主题、队列,每一个消息都有它的topic,Kafka通过topic对消息进行归类。Kafka中可以将Topic从物理上划分成一个或多个分区(Partition),每个分区在物理上对应一个文件夹,以”topicName_partitionIndex”的命名方式命名,该dir包含了这个分区的所有消息(.log)和索引文件(.index),这使得Kafka的吞吐率可以水平扩展。 + +## Partition + +每个分区都是一个 顺序的、不可变的消息队列, 并且可以持续的添加;分区中的消息都被分了一个序列号,称之为偏移量(offset),在每个分区中此偏移量都是唯一的。 +producer在发布消息的时候,可以为每条消息指定Key,这样消息被发送到broker时,会根据分区算法把消息存储到对应的分区中(一个分区存储多个消息),如果分区规则设置的合理,那么所有的消息将会被均匀的分布到不同的分区中,这样就实现了负载均衡。 +![partition_info](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/partition.jpg) + +## Broker + +Kafka server,用来存储消息,Kafka集群中的每一个服务器都是一个Broker,消费者将从broker拉取订阅的消息 +Producer +向Kafka发送消息,生产者会根据topic分发消息。生产者也负责把消息关联到Topic上的哪一个分区。最简单的方式从分区列表中轮流选择。也可以根据某种算法依照权重选择分区。算法可由开发者定义。 + +## Cousumer + +Consermer实例可以是独立的进程,负责订阅和消费消息。消费者用consumerGroup来标识自己。同一个消费组可以并发地消费多个分区的消息,同一个partition也可以由多个consumerGroup并发消费,但是在consumerGroup中一个partition只能由一个consumer消费 + +## CousumerGroup + +Consumer Group:同一个Consumer Group中的Consumers,Kafka将相应Topic中的每个消息只发送给其中一个Consumer + +# Kafka producer 设计原理 + +## 发送消息的流程 + +![partition_info](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/sendMsg.jpg) +**1.序列化消息&&.计算partition** +根据key和value的配置对消息进行序列化,然后计算partition: +ProducerRecord对象中如果指定了partition,就使用这个partition。否则根据key和topic的partition数目取余,如果key也没有的话就随机生成一个counter,使用这个counter来和partition数目取余。这个counter每次使用的时候递增。 + +**2发送到batch&&唤醒Sender 线程** +根据topic-partition获取对应的batchs(Dueue),然后将消息append到batch中.如果有batch满了则唤醒Sender 线程。队列的操作是加锁执行,所以batch内消息时有序的。后续的Sender操作当前方法异步操作。 +![send_msg](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/send2Batch1.png)![send_msg2](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/send2Batch2.png) + + + +**3.Sender把消息有序发到 broker(tp replia leader)** +**3.1 确定tp relica leader 所在的broker** + +Kafka中 每台broker都保存了kafka集群的metadata信息,metadata信息里包括了每个topic的所有partition的信息: leader, leader_epoch, controller_epoch, isr, replicas等;Kafka客户端从任一broker都可以获取到需要的metadata信息;sender线程通过metadata信息可以知道tp leader的brokerId +producer也保存了metada信息,同时根据metadata更新策略(定期更新metadata.max.age.ms、失效检测,强制更新:检查到metadata失效以后,调用metadata.requestUpdate()强制更新 + +``` +public class PartitionInfo { + private final String topic; private final int partition; + private final Node leader; private final Node[] replicas; + private final Node[] inSyncReplicas; private final Node[] offlineReplicas; +} +``` + +**3.2 幂等性发送** + +为实现Producer的幂等性,Kafka引入了Producer ID(即PID)和Sequence Number。对于每个PID,该Producer发送消息的每个都对应一个单调递增的Sequence Number。同样,Broker端也会为每个维护一个序号,并且每Commit一条消息时将其对应序号递增。对于接收的每条消息,如果其序号比Broker维护的序号)大一,则Broker会接受它,否则将其丢弃: + +如果消息序号比Broker维护的序号差值比一大,说明中间有数据尚未写入,即乱序,此时Broker拒绝该消息,Producer抛出InvalidSequenceNumber +如果消息序号小于等于Broker维护的序号,说明该消息已被保存,即为重复消息,Broker直接丢弃该消息,Producer抛出DuplicateSequenceNumber +Sender发送失败后会重试,这样可以保证每个消息都被发送到broker + +**4. Sender处理broker发来的produce response** +一旦broker处理完Sender的produce请求,就会发送produce response给Sender,此时producer将执行我们为send()设置的回调函数。至此producer的send执行完毕。 + +## 吞吐性&&延时: + +buffer.memory:buffer设置大了有助于提升吞吐性,但是batch太大会增大延迟,可搭配linger_ms参数使用 +linger_ms:如果batch太大,或者producer qps不高,batch添加的会很慢,我们可以强制在linger_ms时间后发送batch数据 +ack:producer收到多少broker的答复才算真的发送成功 +0表示producer无需等待leader的确认(吞吐最高、数据可靠性最差) +1代表需要leader确认写入它的本地log并立即确认 +-1/all 代表所有的ISR都完成后确认(吞吐最低、数据可靠性最高) + +## Sender线程和长连接 + +每初始化一个producer实例,都会初始化一个Sender实例,新增到broker的长连接。 +代码角度:每初始化一次KafkaProducer,都赋一个空的client + +``` +public KafkaProducer(final Map configs) { + this(configs, null, null, null, null, null, Time.SYSTEM); +} +``` + +![Sender_io](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/SenderIO.jpg) + +终端查看TCP连接数: +lsof -p portNum -np | grep TCP + +# Consumer设计原理 + +## poll消息 + +![consumer-pool](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/consumerPoll.jpg) + +- 消费者通过fetch线程拉消息(单线程) +- 消费者通过心跳线程来与broker发送心跳。超时会认为挂掉 +- 每个consumer + group在broker上都有一个coordnator来管理,消费者加入和退出,以及消费消息的位移都由coordnator处理。 + +## 位移管理 + +consumer的消息位移代表了当前group对topic-partition的消费进度,consumer宕机重启后可以继续从该offset开始消费。 +在kafka0.8之前,位移信息存放在zookeeper上,由于zookeeper不适合高并发的读写,新版本Kafka把位移信息当成消息,发往__consumers_offsets 这个topic所在的broker,__consumers_offsets默认有50个分区。 +消息的key 是groupId+topic_partition,value 是offset. + +![consumerOffsetDat](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/consumerOffsetData.jpg)![consumerOffsetView](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/consumerOffsetView.jpg) + + + +## Kafka Group 状态 + +![groupState](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/groupState.jpg) + +- Empty:初始状态,Group 没有任何成员,如果所有的 offsets 都过期的话就会变成 Dead +- PreparingRebalance:Group 正在准备进行 Rebalance +- AwaitingSync:Group 正在等待来 group leader 的 分配方案 +- Stable:稳定的状态(Group is stable); +- Dead:Group 内已经没有成员,并且它的 Metadata 已经被移除 + +## 重平衡reblance + +当一些原因导致consumer对partition消费不再均匀时,kafka会自动执行reblance,使得consumer对partition的消费再次平衡。 +什么时候发生rebalance?: + +- 组订阅topic数变更 +- topic partition数变更 +- consumer成员变更 +- consumer 加入群组或者离开群组的时候 +- consumer被检测为崩溃的时候 + +## reblance过程 + +举例1 consumer被检测为崩溃引起的reblance +比如心跳线程在timeout时间内没和broker发送心跳,此时coordnator认为该group应该进行reblance。接下来其他consumer发来fetch请求后,coordnator将回复他们进行reblance通知。当consumer成员收到请求后,只有leader会根据分配策略进行分配,然后把各自的分配结果返回给coordnator。这个时候只有consumer leader返回的是实质数据,其他返回的都为空。收到分配方法后,consumer将会把分配策略同步给各consumer + +举例2 consumer加入引起的reblance + +使用join协议,表示有consumer 要加入到group中 +使用sync 协议,根据分配规则进行分配 +![reblance-join](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/reblance-join.jpg)![reblance-sync](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/reblance-sync.jpg) + +(上图图片摘自网络) + +## 引申:以上reblance机制存在的问题 + +在大型系统中,一个topic可能对应数百个consumer实例。这些consumer陆续加入到一个空消费组将导致多次的rebalance;此外consumer 实例启动的时间不可控,很有可能超出coordinator确定的rebalance timeout(即max.poll.interval.ms),将会再次触发rebalance,而每次rebalance的代价又相当地大,因为很多状态都需要在rebalance前被持久化,而在rebalance后被重新初始化。 + +## 新版本改进 + +**通过延迟进入PreparingRebalance状态减少reblance次数** + +![groupStateOfNewVersion](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/groupStateOfNewVersion.jpg) + +新版本新增了group.initial.rebalance.delay.ms参数。空消费组接受到成员加入请求时,不立即转化到PreparingRebalance状态来开启reblance。当时间超过group.initial.rebalance.delay.ms后,再把group状态改为PreparingRebalance(开启reblance)。实现机制是在coordinator底层新增一个group状态:InitialReblance。假设此时有多个consumer陆续启动,那么group状态先转化为InitialReblance,待group.initial.rebalance.delay.ms时间后,再转换为PreparingRebalance(开启reblance) + + + +# Broker设计原理 + +Broker 是Kafka 集群中的节点。负责处理生产者发送过来的消息,消费者消费的请求。以及集群节点的管理等。由于涉及内容较多,先简单介绍,后续专门抽出一篇文章分享 + +## broker zk注册 + +![brokersInZk](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/brokersInZk.jpg) + +## broker消息存储 + +Kafka的消息以二进制的方式紧凑地存储,节省了很大空间 +此外消息存在ByteBuffer而不是堆,这样broker进程挂掉时,数据不会丢失,同时避免了gc问题 +通过零拷贝和顺序寻址,让消息存储和读取速度都非常快 +处理fetch请求的时候通过zero-copy 加快速度 + +## broker状态数据 + +broker设计中,每台机器都保存了相同的状态数据。主要包括以下: + +controller所在的broker ID,即保存了当前集群中controller是哪台broker +集群中所有broker的信息:比如每台broker的ID、机架信息以及配置的若干组连接信息 +集群中所有节点的信息:严格来说,它和上一个有些重复,不过此项是按照broker ID和***类型进行分组的。对于超大集群来说,使用这一项缓存可以快速地定位和查找给定节点信息,而无需遍历上一项中的内容,算是一个优化吧 +集群中所有分区的信息:所谓分区信息指的是分区的leader、ISR和AR信息以及当前处于offline状态的副本集合。这部分数据按照topic-partitionID进行分组,可以快速地查找到每个分区的当前状态。(注:AR表示assigned replicas,即创建topic时为该分区分配的副本集合) + +## broker负载均衡 + +**分区数量负载**:各台broker的partition数量应该均匀 +partition Replica分配算法如下: + +将所有Broker(假设共n个Broker)和待分配的Partition排序 +将第i个Partition分配到第(i mod n)个Broker上 +将第i个Partition的第j个Replica分配到第((i + j) mod n)个Broker上 + +**容量大小负载:**每台broker的硬盘占用大小应该均匀 +在kafka1.1之前,Kafka能够保证各台broker上partition数量均匀,但由于每个partition内的消息数不同,可能存在不同硬盘之间内存占用差异大的情况。在Kafka1.1中增加了副本跨路径迁移功能kafka-reassign-partitions.sh,我们可以结合它和监控系统,实现自动化的负载均衡 + +# Kafka高可用 + +在介绍kafka高可用之前先介绍几个概念 + +同步复制:要求所有能工作的Follower都复制完,这条消息才会被认为commit,这种复制方式极大的影响了吞吐率 +异步复制:Follower异步的从Leader pull数据,data只要被Leader写入log认为已经commit,这种情况下如果Follower落后于Leader的比较多,如果Leader突然宕机,会丢失数据 + +## Isr + +Kafka结合同步复制和异步复制,使用ISR(与Partition Leader保持同步的Replica列表)的方式在确保数据不丢失和吞吐率之间做了平衡。Producer只需把消息发送到Partition Leader,Leader将消息写入本地Log。Follower则从Leader pull数据。Follower在收到该消息向Leader发送ACK。一旦Leader收到了ISR中所有Replica的ACK,该消息就被认为已经commit了,Leader将增加HW并且向Producer发送ACK。这样如果leader挂了,只要Isr中有一个replica存活,就不会丢数据。 + +## Isr动态更新 + +Leader会跟踪ISR,如果ISR中一个Follower宕机,或者落后太多,Leader将把它从ISR中移除。这里所描述的“落后太多”指Follower复制的消息落后于Leader后的条数超过预定值(replica.lag.max.messages)或者Follower超过一定时间(replica.lag.time.max.ms)未向Leader发送fetch请求。 + +broker Nodes In Zookeeper +/brokers/topics/[topic]/partitions/[partition]/state 保存了topic-partition的leader和Isr等信息 + +![partitionStateInZk](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/partitionStateInZk.jpg) + +## Controller负责broker故障检查&&故障转移(fail/recover) + +1. Controller在Zookeeper上注册Watch,一旦有Broker宕机,其在Zookeeper对应的znode会自动被删除,Zookeeper会触发 + Controller注册的watch,Controller读取最新的Broker信息 +2. Controller确定set_p,该集合包含了宕机的所有Broker上的所有Partition +3. 对set_p中的每一个Partition,选举出新的leader、Isr,并更新结果。 + +3.1 从/brokers/topics/[topic]/partitions/[partition]/state读取该Partition当前的ISR + +3.2 决定该Partition的新Leader和Isr。如果当前ISR中有至少一个Replica还幸存,则选择其中一个作为新Leader,新的ISR则包含当前ISR中所有幸存的Replica。否则选择该Partition中任意一个幸存的Replica作为新的Leader以及ISR(该场景下可能会有潜在的数据丢失) + +![electLeader](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/kafka/electLeader.jpg) +3.3 更新Leader、ISR、leader_epoch、controller_epoch:写入/brokers/topics/[topic]/partitions/[partition]/state + +4. 直接通过RPC向set_p相关的Broker发送LeaderAndISRRequest命令。Controller可以在一个RPC操作中发送多个命令从而提高效率。 + +## Controller挂掉 + +每个 broker 都会在 zookeeper 的临时节点 "/controller" 注册 watcher,当 controller 宕机时 "/controller" 会消失,触发broker的watch,每个 broker 都尝试创建新的 controller path,只有一个竞选成功并当选为 controller。 + +# 使用Kafka如何保证幂等性 + +不丢消息 + +首先kafka保证了对已提交消息的at least保证 +Sender有重试机制 +producer业务方在使用producer发送消息时,注册回调函数。在onError方法中重发消息 +consumer 拉取到消息后,处理完毕再commit,保证commit的消息一定被处理完毕 + +不重复 + +consumer拉取到消息先保存,commit成功后删除缓存数据 + +# Kafka高性能 + +partition提升了并发 +zero-copy +顺序写入 +消息聚集batch +页缓存 +业务方对 Kafka producer的优化 + +增大producer数量 +ack配置 +batch + +## 原文链接:https://mp.weixin.qq.com/s/zxPz_aFEMrshApZQ727h4g ** + +如果喜欢我的文章,欢迎扫码关注 + +![wechat](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/qrcode_for_gh_2f3803598393_258.jpg) \ No newline at end of file From 3711f487e59ccf9aa1d0258b37b8daa047dd1a95 Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Sun, 4 Aug 2019 16:47:36 +0800 Subject: [PATCH 046/130] =?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 --- ...345\256\271\345\231\250\346\200\273\347\273\223.md" | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git "a/docs/java/Multithread/\345\271\266\345\217\221\345\256\271\345\231\250\346\200\273\347\273\223.md" "b/docs/java/Multithread/\345\271\266\345\217\221\345\256\271\345\231\250\346\200\273\347\273\223.md" index 645b279b121..243001efe59 100644 --- "a/docs/java/Multithread/\345\271\266\345\217\221\345\256\271\345\231\250\346\200\273\347\273\223.md" +++ "b/docs/java/Multithread/\345\271\266\345\217\221\345\256\271\345\231\250\346\200\273\347\273\223.md" @@ -38,12 +38,10 @@ JDK提供的这些容器大部分在 `java.util.concurrent` 包中。 所以就有了 HashMap 的线程安全版本—— ConcurrentHashMap 的诞生。在ConcurrentHashMap中,无论是读操作还是写操作都能保证很高的性能:在进行读操作时(几乎)不需要加锁,而在写操作时通过锁分段技术只对所操作的段加锁而不影响客户端对其它段的访问。 -关于 ConcurrentHashMap 相关问题,我在 [《这几道Java集合框架面试题几乎必问》](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/Java%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98%E6%80%BB%E7%BB%93.md) 这篇文章中已经提到过。下面梳理一下关于 ConcurrentHashMap 比较重要的问题: - -- [ConcurrentHashMap 和 Hashtable 的区别](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/%E8%BF%99%E5%87%A0%E9%81%93Java%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6%E9%9D%A2%E8%AF%95%E9%A2%98%E5%87%A0%E4%B9%8E%E5%BF%85%E9%97%AE.md#concurrenthashmap-%E5%92%8C-hashtable-%E7%9A%84%E5%8C%BA%E5%88%AB) -- [ConcurrentHashMap线程安全的具体实现方式/底层具体实现](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/%E8%BF%99%E5%87%A0%E9%81%93Java%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6%E9%9D%A2%E8%AF%95%E9%A2%98%E5%87%A0%E4%B9%8E%E5%BF%85%E9%97%AE.md#concurrenthashmap%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%E5%85%B7%E4%BD%93%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F%E5%BA%95%E5%B1%82%E5%85%B7%E4%BD%93%E5%AE%9E%E7%8E%B0) - +关于 ConcurrentHashMap 相关问题,我在 [Java集合框架常见面试题](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/Java%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98.md) 这篇文章中已经提到过。下面梳理一下关于 ConcurrentHashMap 比较重要的问题: +- [ConcurrentHashMap 和 Hashtable 的区别](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/Java%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98.md#concurrenthashmap-%E5%92%8C-hashtable-%E7%9A%84%E5%8C%BA%E5%88%AB) +- [ConcurrentHashMap线程安全的具体实现方式/底层具体实现](https://github.com/Snailclimb/JavaGuide/blob/master/docs/java/collection/Java%E9%9B%86%E5%90%88%E6%A1%86%E6%9E%B6%E5%B8%B8%E8%A7%81%E9%9D%A2%E8%AF%95%E9%A2%98.md#concurrenthashmap%E7%BA%BF%E7%A8%8B%E5%AE%89%E5%85%A8%E7%9A%84%E5%85%B7%E4%BD%93%E5%AE%9E%E7%8E%B0%E6%96%B9%E5%BC%8F%E5%BA%95%E5%B1%82%E5%85%B7%E4%BD%93%E5%AE%9E%E7%8E%B0) ## 三 CopyOnWriteArrayList @@ -229,4 +227,4 @@ PriorityBlockingQueue 并发控制采用的是 **ReentrantLock**,队列为无 **Java工程师必备学习资源:** 一些Java工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。 -![我的公众号](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/167598cd2e17b8ec.png) \ No newline at end of file +![我的公众号](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/167598cd2e17b8ec.png) From 92a9f41acb7dc586bdd399bfa249f031c7bb3559 Mon Sep 17 00:00:00 2001 From: yidasanqian Date: Mon, 5 Aug 2019 18:09:36 +0800 Subject: [PATCH 047/130] =?UTF-8?q?=E4=B9=A6=E5=86=99=E6=9B=B4=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../JavaConcurrencyAdvancedCommonInterviewQuestions.md | 2 +- ...\250\213\345\237\272\347\241\200\347\237\245\350\257\206.md" | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename "docs/java/Multithread/1\345\271\266\345\217\221\347\274\226\347\250\213\345\237\272\347\241\200\347\237\245\350\257\206.md" => "docs/java/Multithread/\345\271\266\345\217\221\347\274\226\347\250\213\345\237\272\347\241\200\347\237\245\350\257\206.md" (100%) diff --git a/docs/java/Multithread/JavaConcurrencyAdvancedCommonInterviewQuestions.md b/docs/java/Multithread/JavaConcurrencyAdvancedCommonInterviewQuestions.md index 16ccbe19add..7ee0f5d8cf2 100644 --- a/docs/java/Multithread/JavaConcurrencyAdvancedCommonInterviewQuestions.md +++ b/docs/java/Multithread/JavaConcurrencyAdvancedCommonInterviewQuestions.md @@ -514,7 +514,7 @@ AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效 AQS 原理这部分参考了部分博客,在5.2节末尾放了链接。 -> 在面试中被问到并发知识的时候,大多都会被问到“请你说一下自己对于AQS原理的理解”。下面给大家一个示例供大家参加,面试不是背题,大家一定要假如自己的思想,即使加入不了自己的思想也要保证自己能够通俗的讲出来而不是背出来。 +> 在面试中被问到并发知识的时候,大多都会被问到“请你说一下自己对于AQS原理的理解”。下面给大家一个示例供大家参加,面试不是背题,大家一定要加入自己的思想,即使加入不了自己的思想也要保证自己能够通俗的讲出来而不是背出来。 下面大部分内容其实在AQS类注释上已经给出了,不过是英语看着比较吃力一点,感兴趣的话可以看看源码。 diff --git "a/docs/java/Multithread/1\345\271\266\345\217\221\347\274\226\347\250\213\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/Multithread/\345\271\266\345\217\221\347\274\226\347\250\213\345\237\272\347\241\200\347\237\245\350\257\206.md" similarity index 100% rename from "docs/java/Multithread/1\345\271\266\345\217\221\347\274\226\347\250\213\345\237\272\347\241\200\347\237\245\350\257\206.md" rename to "docs/java/Multithread/\345\271\266\345\217\221\347\274\226\347\250\213\345\237\272\347\241\200\347\237\245\350\257\206.md" From 3f0e3dbd67cbd39cd38ccbd4d3883bf47cbb8e1a Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Tue, 6 Aug 2019 23:51:06 +0800 Subject: [PATCH 048/130] add :kafka --- README.md | 1 + ...77\231\347\257\207\345\260\261\345\244\237\344\272\206.md" | 4 +--- 2 files changed, 2 insertions(+), 3 deletions(-) rename "docs/mq/Kafka/Kafka\347\263\273\347\273\237\350\256\276\350\256\241\345\274\200\347\257\207-\351\235\242\350\257\225\347\234\213\350\277\231\347\257\207\345\260\261\345\244\237\344\272\206.md" => "docs/system-design/data-communication/Kafka\347\263\273\347\273\237\350\256\276\350\256\241\345\274\200\347\257\207-\351\235\242\350\257\225\347\234\213\350\277\231\347\257\207\345\260\261\345\244\237\344\272\206.md" (99%) diff --git a/README.md b/README.md index 10081046d97..58e2ee0e079 100644 --- a/README.md +++ b/README.md @@ -188,6 +188,7 @@ - [消息队列总结](docs/system-design/data-communication/message-queue.md) - [RabbitMQ 入门](docs/system-design/data-communication/rabbitmq.md) - [RocketMQ的几个简单问题与答案](docs/system-design/data-communication/RocketMQ-Questions.md) +- [Kafka系统设计开篇-面试看这篇就够了](docs/system-design/data-communication/Kafka系统设计开篇-面试看这篇就够了.md) ### 网站架构 diff --git "a/docs/mq/Kafka/Kafka\347\263\273\347\273\237\350\256\276\350\256\241\345\274\200\347\257\207-\351\235\242\350\257\225\347\234\213\350\277\231\347\257\207\345\260\261\345\244\237\344\272\206.md" "b/docs/system-design/data-communication/Kafka\347\263\273\347\273\237\350\256\276\350\256\241\345\274\200\347\257\207-\351\235\242\350\257\225\347\234\213\350\277\231\347\257\207\345\260\261\345\244\237\344\272\206.md" similarity index 99% rename from "docs/mq/Kafka/Kafka\347\263\273\347\273\237\350\256\276\350\256\241\345\274\200\347\257\207-\351\235\242\350\257\225\347\234\213\350\277\231\347\257\207\345\260\261\345\244\237\344\272\206.md" rename to "docs/system-design/data-communication/Kafka\347\263\273\347\273\237\350\256\276\350\256\241\345\274\200\347\257\207-\351\235\242\350\257\225\347\234\213\350\277\231\347\257\207\345\260\261\345\244\237\344\272\206.md" index f6fed8f6f9a..e617c3b368e 100644 --- "a/docs/mq/Kafka/Kafka\347\263\273\347\273\237\350\256\276\350\256\241\345\274\200\347\257\207-\351\235\242\350\257\225\347\234\213\350\277\231\347\257\207\345\260\261\345\244\237\344\272\206.md" +++ "b/docs/system-design/data-communication/Kafka\347\263\273\347\273\237\350\256\276\350\256\241\345\274\200\347\257\207-\351\235\242\350\257\225\347\234\213\350\277\231\347\257\207\345\260\261\345\244\237\344\272\206.md" @@ -1,4 +1,4 @@ -## 原文链接:https://mp.weixin.qq.com/s/zxPz_aFEMrshApZQ727h4g** +> 原文链接:https://mp.weixin.qq.com/s/zxPz_aFEMrshApZQ727h4g ## 引言 @@ -276,8 +276,6 @@ zero-copy ack配置 batch -## 原文链接:https://mp.weixin.qq.com/s/zxPz_aFEMrshApZQ727h4g ** - 如果喜欢我的文章,欢迎扫码关注 ![wechat](https://blog-article-resource.oss-cn-beijing.aliyuncs.com/qrcode_for_gh_2f3803598393_258.jpg) \ No newline at end of file From eef847ea4dac15f1b6f3e6937c2cb2940477e594 Mon Sep 17 00:00:00 2001 From: yidasanqian Date: Wed, 7 Aug 2019 09:52:52 +0800 Subject: [PATCH 049/130] =?UTF-8?q?=E4=B9=A6=E5=86=99=E6=9B=B4=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/java/BIO-NIO-AIO.md | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/docs/java/BIO-NIO-AIO.md b/docs/java/BIO-NIO-AIO.md index b1e101d0539..ee8e751cd6d 100644 --- a/docs/java/BIO-NIO-AIO.md +++ b/docs/java/BIO-NIO-AIO.md @@ -202,13 +202,13 @@ NIO 通过Channel(通道) 进行读写。 通道是双向的,可读也可写,而流的读写是单向的。无论读写,通道只能和Buffer交互。因为 Buffer,通道可以异步地读写。 -#### 4)Selectors(选择器) +#### 4)Selector (选择器) NIO有选择器,而IO没有。 选择器用于使用单个线程处理多个通道。因此,它需要较少的线程来处理这些通道。线程之间的切换对于操作系统来说是昂贵的。 因此,为了提高系统效率选择器是有用的。 -![一个单线程中Slector维护3个Channel的示意图](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-2/Slector.png) +![一个单线程中Selector维护3个Channel的示意图](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-2/Slector.png) ### 2.3 NIO 读数据和写数据方式 通常来说NIO中的所有IO都是从 Channel(通道) 开始的。 @@ -273,8 +273,7 @@ public class NIOServer { if (key.isAcceptable()) { try { - // (1) - // 每来一个新连接,不需要创建一个线程,而是直接注册到clientSelector + // (1) 每来一个新连接,不需要创建一个线程,而是直接注册到clientSelector SocketChannel clientChannel = ((ServerSocketChannel) key.channel()).accept(); clientChannel.configureBlocking(false); clientChannel.register(clientSelector, SelectionKey.OP_READ); From e3803f2decd18f90d3cfb956f9dd20a919e564a6 Mon Sep 17 00:00:00 2001 From: q276240802 <276240802@qq.com> Date: Wed, 7 Aug 2019 11:35:50 +0800 Subject: [PATCH 050/130] =?UTF-8?q?=E5=8B=98=E8=AF=AF=EF=BC=9A=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=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不要写成Java 意思应该是: Java不要写成java --- ...\232\204\347\256\200\345\216\206\344\271\213\351\201\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/essential-content-for-interview/PreparingForInterview/\347\250\213\345\272\217\345\221\230\347\232\204\347\256\200\345\216\206\344\271\213\351\201\223.md" "b/docs/essential-content-for-interview/PreparingForInterview/\347\250\213\345\272\217\345\221\230\347\232\204\347\256\200\345\216\206\344\271\213\351\201\223.md" index f0627de96e2..7feead7d8bd 100644 --- "a/docs/essential-content-for-interview/PreparingForInterview/\347\250\213\345\272\217\345\221\230\347\232\204\347\256\200\345\216\206\344\271\213\351\201\223.md" +++ "b/docs/essential-content-for-interview/PreparingForInterview/\347\250\213\345\272\217\345\221\230\347\232\204\347\256\200\345\216\206\344\271\213\351\201\223.md" @@ -102,7 +102,7 @@ ## 排版注意事项 1. 尽量简洁,不要太花里胡哨; -2. 一些技术名词不要弄错了大小写比如MySQL不要写成mysql,Java不要写成Java。这个在我看来还是比较忌讳的,所以一定要注意这个细节; +2. 一些技术名词不要弄错了大小写比如MySQL不要写成mysql,Java不要写成java。这个在我看来还是比较忌讳的,所以一定要注意这个细节; 3. 中文和数字英文之间加上空格的话看起来会舒服一点; ## 其他的一些小tips From b61b1f694a7ac689f57138ab28d91a75ee65bf5d Mon Sep 17 00:00:00 2001 From: zhangchao Date: Wed, 7 Aug 2019 18:43:33 +0800 Subject: [PATCH 051/130] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=81=BF=E5=85=8D?= =?UTF-8?q?=E6=AD=BB=E9=94=81=E4=B8=BA=E9=A2=84=E9=98=B2=E6=AD=BB=E9=94=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\250\213\345\237\272\347\241\200\347\237\245\350\257\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/java/Multithread/\345\271\266\345\217\221\347\274\226\347\250\213\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/Multithread/\345\271\266\345\217\221\347\274\226\347\250\213\345\237\272\347\241\200\347\237\245\350\257\206.md" index 66c26fd7d01..68509cdc066 100644 --- "a/docs/java/Multithread/\345\271\266\345\217\221\347\274\226\347\250\213\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/docs/java/Multithread/\345\271\266\345\217\221\347\274\226\347\250\213\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -340,7 +340,7 @@ Thread[线程 2,5,main]waiting get resource1 1. 不剥夺条件:线程已获得的资源在末使用完之前不能被其他线程强行剥夺,只有自己使用完毕后才释放资源。 1. 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。 -### 如何避免线程死锁? +### 如何预防线程死锁? 我们只要破坏产生死锁的四个条件中的其中一个就可以了。 From be07d328edc9010fbfa45baf7a6c43921b899bc1 Mon Sep 17 00:00:00 2001 From: Lingxu Meng Date: Thu, 8 Aug 2019 22:27:33 +1000 Subject: [PATCH 052/130] =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 应该是‘不是特别全面’,所以有了后续更多的解释和说明 --- "docs/java/Java\347\226\221\351\232\276\347\202\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" index 8abad01b9ea..8f36fb3990a 100644 --- "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" +++ "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" @@ -161,7 +161,7 @@ Reference:《阿里巴巴Java开发手册》 ## 2.1. Arrays.asList()使用指南 -最近使用`Arrays.asList()`遇到了一些坑,然后在网上看到这篇文章:[Java Array to List Examples](http://javadevnotes.com/java-array-to-list-examples) 感觉挺不错的,但是还是特别全面。所以,自己对于这块小知识点进行了简单的总结。 +最近使用`Arrays.asList()`遇到了一些坑,然后在网上看到这篇文章:[Java Array to List Examples](http://javadevnotes.com/java-array-to-list-examples) 感觉挺不错的,但是还不是特别全面。所以,自己对于这块小知识点进行了简单的总结。 ### 2.1.1. 简介 From 6e09b6effb4aeaef7029adc72fcab81ff22be0c4 Mon Sep 17 00:00:00 2001 From: threewater2 <1271312039@qq.com> Date: Fri, 9 Aug 2019 09:13:25 +0800 Subject: [PATCH 053/130] =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E4=B8=80=E4=B8=AA?= =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/system-design/framework/spring/Spring.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/system-design/framework/spring/Spring.md b/docs/system-design/framework/spring/Spring.md index d6d073c2f59..52f195a305f 100644 --- a/docs/system-design/framework/spring/Spring.md +++ b/docs/system-design/framework/spring/Spring.md @@ -71,7 +71,7 @@ Spring IOC的初始化过程: ### Spring源码阅读 -阅读源码不仅可以加深我们对Spring设计思想的理解,提高自己的编码水品,还可以让自己在面试中如鱼得水。下面的是Github上的一个开源的Spring源码阅读,大家有时间可以看一下,当然你如果有时间也可以自己慢慢研究源码。 +阅读源码不仅可以加深我们对Spring设计思想的理解,提高自己的编码水平,还可以让自己在面试中如鱼得水。下面的是Github上的一个开源的Spring源码阅读,大家有时间可以看一下,当然你如果有时间也可以自己慢慢研究源码。 - [spring-core](https://github.com/seaswalker/Spring/blob/master/note/Spring.md) - [spring-aop](https://github.com/seaswalker/Spring/blob/master/note/spring-aop.md) From 1cb42c2256f596a2c5f11fb5b3da06c24abafcc5 Mon Sep 17 00:00:00 2001 From: hughyu Date: Fri, 9 Aug 2019 09:47:21 +0800 Subject: [PATCH 054/130] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97&=E4=BF=AE=E6=AD=A3=E8=AF=AD=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...237\272\347\241\200\347\237\245\350\257\206.md" | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" index c975ba01414..06239b4f6da 100644 --- "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -12,7 +12,7 @@ - [4. Oracle JDK 和 OpenJDK 的对比](#4-oracle-jdk-和-openjdk-的对比) - [5. Java和C++的区别?](#5-java和c的区别) - [6. 什么是 Java 程序的主类 应用程序和小程序的主类有何不同?](#6-什么是-java-程序的主类-应用程序和小程序的主类有何不同) -- [7. Java 应用程序与小程序之间有那些差别?](#7-java-应用程序与小程序之间有那些差别) +- [7. Java 应用程序与小程序之间有哪些差别?](#7-java-应用程序与小程序之间有哪些差别) - [8. 字符型常量和字符串常量的区别?](#8-字符型常量和字符串常量的区别) - [9. 构造器 Constructor 是否可被 override?](#9-构造器-constructor-是否可被-override) - [10. 重载和重写的区别](#10-重载和重写的区别) @@ -26,7 +26,7 @@ - [15. 在 Java 中定义一个不做事且没有参数的构造方法的作用](#15-在-java-中定义一个不做事且没有参数的构造方法的作用) - [16. import java和javax有什么区别?](#16-import-java和javax有什么区别) - [17. 接口和抽象类的区别是什么?](#17-接口和抽象类的区别是什么) -- [18. 成员变量与局部变量的区别有那些?](#18-成员变量与局部变量的区别有那些) +- [18. 成员变量与局部变量的区别有哪些?](#18-成员变量与局部变量的区别有哪些) - [19. 创建一个对象用什么运算符?对象实体与对象引用有何不同?](#19-创建一个对象用什么运算符对象实体与对象引用有何不同) - [20. 什么是方法的返回值?返回值在类的方法里的作用是什么?](#20-什么是方法的返回值返回值在类的方法里的作用是什么) - [21. 一个类的构造方法的作用是什么? 若一个类没有声明构造方法,该程序能正确执行吗? 为什么?](#21-一个类的构造方法的作用是什么-若一个类没有声明构造方法该程序能正确执行吗-为什么) @@ -138,7 +138,7 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有 一个程序中可以有多个类,但只能有一个类是主类。在 Java 应用程序中,这个主类是指包含 main()方法的类。而在 Java 小程序中,这个主类是一个继承自系统类 JApplet 或 Applet 的子类。应用程序的主类不一定要求是 public 类,但小程序的主类要求必须是 public 类。主类是 Java 程序执行的入口点。 -## 7. Java 应用程序与小程序之间有那些差别? +## 7. Java 应用程序与小程序之间有哪些差别? 简单说应用程序是从主线程启动(也就是 `main()` 方法)。applet 小程序没有 `main()` 方法,主要是嵌在浏览器页面上运行(调用`init()`或者`run()`来启动),嵌入浏览器这点跟 flash 的小游戏类似。 @@ -247,7 +247,7 @@ Java 程序在执行子类的构造方法之前,如果没有用 `super() `来 备注:在JDK8中,接口也可以定义静态方法,可以直接用接口名调用。实现类和实现是不可以调用的。如果同时实现两个接口,接口中定义了一样的默认方法,则必须重写,不然会报错。(详见issue:[https://github.com/Snailclimb/JavaGuide/issues/146](https://github.com/Snailclimb/JavaGuide/issues/146)) -## 18. 成员变量与局部变量的区别有那些? +## 18. 成员变量与局部变量的区别有哪些? 1. 从语法形式上看:成员变量是属于类的,而局部变量是在方法中定义的变量或是方法的参数;成员变量可以被 public,private,static 等修饰符所修饰,而局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。 2. 从变量在内存中的存储方式来看:如果成员变量是使用`static`修饰的,那么这个成员变量是属于类的,如果没有使用`static`修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量则存在于栈内存。 @@ -359,7 +359,7 @@ hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返 **程序**是含有指令和数据的文件,被存储在磁盘或其他的数据存储设备中,也就是说程序是静态的代码。 -**进程**是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 +**进程**是程序的一次执行过程,是系统运行程序的基本单位,因此进程是动态的。系统运行一个程序即是一个进程从创建,运行到消亡的过程。简单来说,一个进程就是一个执行中的程序,它在计算机中一个指令接着一个指令地执行着,同时,每个进程还占有某些系统资源如CPU时间,内存空间,文件,输入输出设备的使用权等等。换句话说,当程序在执行时,将会被操作系统载入内存中。 线程是进程划分成的更小的运行单位。线程和进程最大的不同在于基本上各进程是独立的,而各线程则不一定,因为同一进程中的线程极有可能会相互影响。从另一角度来说,进程属于操作系统的范畴,主要是同一段时间内,可以同时执行一个以上的程序,而线程则是在同一程序内几乎同时执行一个以上的程序段。 ## 30. 线程有哪些基本状态? @@ -408,7 +408,7 @@ final关键字主要用在三个地方:变量、方法、类。 **Exception(异常):是程序本身可以处理的异常**。Exception 类有一个重要的子类 **RuntimeException**。RuntimeException 异常由Java虚拟机抛出。**NullPointerException**(要访问的变量没有引用任何对象时,抛出该异常)、**ArithmeticException**(算术运算异常,一个整数除以0时,抛出该异常)和 **ArrayIndexOutOfBoundsException** (下标越界异常)。 -**注意:异常和错误的区别:异常能被程序本身可以处理,错误是无法处理。** +**注意:异常和错误的区别:异常能被程序本身处理,错误是无法处理。** ### Throwable类常用方法 @@ -455,7 +455,7 @@ final关键字主要用在三个地方:变量、方法、类。 transient关键字的作用是:阻止实例中那些用此关键字修饰的的变量序列化;当对象被反序列化时,被transient修饰的变量值不会被持久化和恢复。transient只能修饰变量,不能修饰类和方法。 -## 34 获取用键盘输入常用的的两种方法 +## 34 获取用键盘输入常用的两种方法 方法1:通过 Scanner From 51e082a8878c570b2da91d27be6dd1a060625746 Mon Sep 17 00:00:00 2001 From: yidasanqian Date: Fri, 9 Aug 2019 14:14:53 +0800 Subject: [PATCH 055/130] =?UTF-8?q?=E4=B9=A6=E5=86=99=E6=9B=B4=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Java\345\206\205\345\255\230\345\214\272\345\237\237.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" index 449898843c9..03b6dd0c0c1 100644 --- "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" +++ "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" @@ -197,7 +197,7 @@ JDK 1.8 的时候,方法区(HotSpot 的永久代)被彻底移除了(JDK1 JDK1.4 中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**通道(Channel)** 与**缓存区(Buffer)** 的 I/O 方式,它可以直接使用 Native 函数库直接分配堆外内存,然后通过一个存储在 Java 堆中的 DirectByteBuffer 对象作为这块内存的引用进行操作。这样就能在一些场景中显著提高性能,因为**避免了在 Java 堆和 Native 堆之间来回复制数据**。 -本机直接内存的分配不会收到 Java 堆的限制,但是,既然是内存就会受到本机总内存大小以及处理器寻址空间的限制。 +本机直接内存的分配不会受到 Java 堆的限制,但是,既然是内存就会受到本机总内存大小以及处理器寻址空间的限制。 ## 三 HotSpot 虚拟机对象探秘 @@ -253,7 +253,7 @@ JDK1.4 中新加入的 **NIO(New Input/Output) 类**,引入了一种基于** **对齐填充部分不是必然存在的,也没有什么特别的含义,仅仅起占位作用。** 因为 Hotspot 虚拟机的自动内存管理系统要求对象起始地址必须是 8 字节的整数倍,换句话说就是对象的大小必须是 8 字节的整数倍。而对象头部分正好是 8 字节的倍数(1 倍或 2 倍),因此,当对象实例数据部分没有对齐时,就需要通过对齐填充来补全。 ### 3.3 对象的访问定位 -建立对象就是为了使用对象,我们的 Java 程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问方式有虚拟机实现而定,目前主流的访问方式有**①使用句柄**和**②直接指针**两种: +建立对象就是为了使用对象,我们的 Java 程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问方式由虚拟机实现而定,目前主流的访问方式有**①使用句柄**和**②直接指针**两种: 1. **句柄:** 如果使用句柄的话,那么 Java 堆中将会划分出一块内存来作为句柄池,reference 中存储的就是对象的句柄地址,而句柄中包含了对象实例数据与类型数据各自的具体地址信息; @@ -322,7 +322,7 @@ System.out.println(str2==str3);//false 尽量避免多个字符串拼接,因为这样会重新创建对象。如果需要改变字符串的话,可以使用 StringBuilder 或者 StringBuffer。 ### 4.2 String s1 = new String("abc");这句话创建了几个字符串对象? -**将创建 1 或 2 个字符串。如果池中已存在字符串文字“abc”,则池中只会创建一个字符串“s1”。如果池中没有字符串文字“abc”,那么它将首先在池中创建,然后在堆空间中创建,因此将创建总共 2 个字符串对象。** +**将创建 1 或 2 个字符串。如果池中已存在字符串常量“abc”,则只会在堆空间创建一个字符串常量“abc”。如果池中没有字符串常量“abc”,那么它将首先在池中创建,然后在堆空间中创建,因此将创建总共 2 个字符串对象。** **验证:** From 1f0544bdb1fef12fbf461670e6c53644234e05fe Mon Sep 17 00:00:00 2001 From: zachary957 Date: Sun, 11 Aug 2019 17:05:52 +0800 Subject: [PATCH 056/130] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=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 --- ...\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" "b/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" index aa378af9234..d61fa8ec7c5 100644 --- "a/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" +++ "b/docs/network/\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234.md" @@ -77,7 +77,7 @@ 互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议(Intert Protocol)和许多路由选择协议,因此互联网的网络层也叫做**网际层**或**IP层**。 ### 1.4 数据链路层 -**数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。** 在两个相邻节点之间传送数据时,**数据链路层将网络层交下来的 IP 数据报组装程帧**,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。 +**数据链路层(data link layer)通常简称为链路层。两台主机之间的数据传输,总是在一段一段的链路上传送的,这就需要使用专门的链路层的协议。** 在两个相邻节点之间传送数据时,**数据链路层将网络层交下来的 IP 数据报组装成帧**,在两个相邻节点间的链路上传送帧。每一帧包括数据和必要的控制信息(如同步信息,地址信息,差错控制等)。 在接收数据时,控制信息使接收端能够知道一个帧从哪个比特开始和到哪个比特结束。这样,数据链路层在收到一个帧后,就可从中提出数据部分,上交给网络层。 控制信息还使接收端能够检测到所收到的帧中有误差错。如果发现差错,数据链路层就简单地丢弃这个出了差错的帧,以避免继续在网络中传送下去白白浪费网络资源。如果需要改正数据在链路层传输时出现差错(这就是说,数据链路层不仅要检错,而且还要纠错),那么就要采用可靠性传输协议来纠正出现的差错。这种方法会使链路层的协议复杂些。 From 2b28b1286ffa510288aa91d635d2072dd4b85c94 Mon Sep 17 00:00:00 2001 From: yidasanqian Date: Wed, 14 Aug 2019 13:47:36 +0800 Subject: [PATCH 057/130] =?UTF-8?q?=E4=B9=A6=E5=86=99=E6=9B=B4=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...236\203\345\234\276\345\233\236\346\224\266.md" | 14 +++++++------- ...261\273\345\212\240\350\275\275\345\231\250.md" | 2 +- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git "a/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md" "b/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md" index 65e9d098353..e575f149885 100644 --- "a/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md" +++ "b/docs/java/jvm/JVM\345\236\203\345\234\276\345\233\236\346\224\266.md" @@ -56,7 +56,7 @@ ![](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-8-26/29176325.jpg) -当需要排查各种 内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。 +当需要排查各种内存溢出问题、当垃圾收集成为系统达到更高并发的瓶颈时,我们就需要对这些“自动化”的技术实施必要的监控和调节。 ## 1 揭开 JVM 内存分配与回收的神秘面纱 @@ -196,7 +196,7 @@ JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引 **1.强引用** -以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于**必不可少的生活用品**,垃圾回收器绝不会回收它。当内存空 间不足,Java 虚拟机宁愿抛出 OutOfMemoryError 错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。 +以前我们使用的大部分引用实际上都是强引用,这是使用最普遍的引用。如果一个对象具有强引用,那就类似于**必不可少的生活用品**,垃圾回收器绝不会回收它。当内存空间不足,Java 虚拟机宁愿抛出 OutOfMemoryError 错误,使程序异常终止,也不会靠随意回收具有强引用的对象来解决内存不足问题。 **2.软引用(SoftReference)** @@ -206,7 +206,7 @@ JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引 **3.弱引用(WeakReference)** -如果一个对象只具有弱引用,那就类似于**可有可无的生活用品**。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它 所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。 +如果一个对象只具有弱引用,那就类似于**可有可无的生活用品**。弱引用与软引用的区别在于:只具有弱引用的对象拥有更短暂的生命周期。在垃圾回收器线程扫描它所管辖的内存区域的过程中,一旦发现了只具有弱引用的对象,不管当前内存空间足够与否,都会回收它的内存。不过,由于垃圾回收器是一个优先级很低的线程, 因此不一定会很快发现那些只具有弱引用的对象。 弱引用可以和一个引用队列(ReferenceQueue)联合使用,如果弱引用所引用的对象被垃圾回收,Java 虚拟机就会把这个弱引用加入到与之关联的引用队列中。 @@ -216,7 +216,7 @@ JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引 **虚引用主要用来跟踪对象被垃圾回收的活动**。 -**虚引用与软引用和弱引用的一个区别在于:** 虚引用必须和引用队列(ReferenceQueue)联合使用。当垃 圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是 否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。 +**虚引用与软引用和弱引用的一个区别在于:** 虚引用必须和引用队列(ReferenceQueue)联合使用。当垃圾回收器准备回收一个对象时,如果发现它还有虚引用,就会在回收对象的内存之前,把这个虚引用加入到与之关联的引用队列中。程序可以通过判断引用队列中是否已经加入了虚引用,来了解被引用的对象是否将要被垃圾回收。程序如果发现某个虚引用已经被加入到引用队列,那么就可以在所引用的对象的内存被回收之前采取必要的行动。 特别注意,在程序设计中一般很少使用弱引用与虚引用,使用软引用的情况较多,这是因为**软引用可以加速 JVM 对垃圾内存的回收速度,可以维护系统的运行安全,防止内存溢出(OutOfMemory)等问题的产生**。 @@ -267,7 +267,7 @@ JDK1.2 以后,Java 对引用的概念进行了扩充,将引用分为强引 公众号 ### 3.3 标记-整理算法 -根据老年代的特点特出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。 +根据老年代的特点提出的一种标记算法,标记过程仍然与“标记-清除”算法一样,但后续步骤不是直接对可回收对象回收,而是让所有存活的对象向一端移动,然后直接清理掉端边界以外的内存。 ![标记-整理算法 ](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-8-27/94057049.jpg) @@ -330,7 +330,7 @@ Parallel Scavenge 收集器也是使用复制算法的多线程收集器,它 ``` -**Parallel Scavenge 收集器关注点是吞吐量(高效率的利用 CPU)。CMS 等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)。所谓吞吐量就是 CPU 中用于运行用户代码的时间与 CPU 总消耗时间的比值。** Parallel Scavenge 收集器提供了很多参数供用户找到最合适的停顿时间或最大吞吐量,如果对于收集器运作不太了解的话,手工优化存在的话可以选择把内存管理优化交给虚拟机去完成也是一个不错的选择。 +**Parallel Scavenge 收集器关注点是吞吐量(高效率的利用 CPU)。CMS 等垃圾收集器的关注点更多的是用户线程的停顿时间(提高用户体验)。所谓吞吐量就是 CPU 中用于运行用户代码的时间与 CPU 总消耗时间的比值。** Parallel Scavenge 收集器提供了很多参数供用户找到最合适的停顿时间或最大吞吐量,如果对于收集器运作不太了解的话,手工优化存在困难的话可以选择把内存管理优化交给虚拟机去完成也是一个不错的选择。 **新生代采用复制算法,老年代采用标记-整理算法。** ![Parallel Scavenge 收集器 ](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-8-27/22018368.jpg) @@ -344,7 +344,7 @@ Parallel Scavenge 收集器也是使用复制算法的多线程收集器,它 ### 4.6 CMS 收集器 -**CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它而非常符合在注重用户体验的应用上使用。** +**CMS(Concurrent Mark Sweep)收集器是一种以获取最短回收停顿时间为目标的收集器。它非常符合在注重用户体验的应用上使用。** **CMS(Concurrent Mark Sweep)收集器是 HotSpot 虚拟机第一款真正意义上的并发收集器,它第一次实现了让垃圾收集线程与用户线程(基本上)同时工作。** diff --git "a/docs/java/jvm/\347\261\273\345\212\240\350\275\275\345\231\250.md" "b/docs/java/jvm/\347\261\273\345\212\240\350\275\275\345\231\250.md" index b380716c603..1edbe714ee3 100644 --- "a/docs/java/jvm/\347\261\273\345\212\240\350\275\275\345\231\250.md" +++ "b/docs/java/jvm/\347\261\273\345\212\240\350\275\275\345\231\250.md" @@ -63,7 +63,7 @@ The GrandParent of ClassLodarDemo's ClassLoader is null ``` `AppClassLoader`的父类加载器为`ExtClassLoader` -`ExtClassLoader`的父类加载器为null,**null并不代表`ExtClassLoader`没有父类加载器,而是 `Bootstrap ClassLoader`** 。 +`ExtClassLoader`的父类加载器为null,**null并不代表`ExtClassLoader`没有父类加载器,而是 `BootstrapClassLoader`** 。 其实这个双亲翻译的容易让别人误解,我们一般理解的双亲都是父母,这里的双亲更多地表达的是“父母这一辈”的人而已,并不是说真的有一个 Mother ClassLoader 和一个 Father ClassLoader 。另外,类加载器之间的“父子”关系也不是通过继承来体现的,是由“优先级”来决定。官方API文档对这部分的描述如下: From dc0a9ba40aec44178dfe47cbeaf46e2ec36a8585 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sun, 18 Aug 2019 18:09:53 +0800 Subject: [PATCH 058/130] fix:error link --- .../\345\210\206\345\270\203\345\274\217.md" | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git "a/docs/system-design/website-architecture/\345\210\206\345\270\203\345\274\217.md" "b/docs/system-design/website-architecture/\345\210\206\345\270\203\345\274\217.md" index f9d9f76737c..d5632f5b87e 100644 --- "a/docs/system-design/website-architecture/\345\210\206\345\270\203\345\274\217.md" +++ "b/docs/system-design/website-architecture/\345\210\206\345\270\203\345\274\217.md" @@ -3,30 +3,30 @@ [分布式系统的经典基础理论](https://blog.csdn.net/qq_34337272/article/details/80444032) 本文主要是简单的介绍了三个常见的概念: **分布式系统设计理念** 、 **CAP定理** 、 **BASE理论** ,关于分布式系统的还有很多很多东西。 - ![分布式系统的经典基础理论总结](https://user-gold-cdn.xitu.io/2018/5/24/1639234237ec9805?w=791&h=466&f=png&s=55908) + ![分布式系统的经典基础理论总结](https://user-gold-cdn.xitu.io/2018/5/24/1639234237ec9805?w=791&h=466&f=png&s=55908) - ### 二 分布式事务 分布式事务就是指事务的参与者、支持事务的服务器、资源服务器以及事务管理器分别位于不同的分布式系统的不同节点之上。以上是百度百科的解释,简单的说,就是一次大的操作由不同的小操作组成,这些小的操作分布在不同的服务器上,且属于不同的应用,分布式事务需要保证这些小操作要么全部成功,要么全部失败。本质上来说,分布式事务就是为了保证不同数据库的数据一致性。 * [深入理解分布式事务](http://www.codeceo.com/article/distributed-transaction.html) * [分布式事务?No, 最终一致性](https://zhuanlan.zhihu.com/p/25933039) * [聊聊分布式事务,再说说解决方案](https://www.cnblogs.com/savorboard/p/distributed-system-transaction-consistency.html) -   + - ### 三 分布式系统一致性 [分布式服务化系统一致性的“最佳实干”](https://www.jianshu.com/p/1156151e20c8) - ### 四 一致性协议/算法 早在1898年就诞生了著名的 **Paxos经典算法** (**Zookeeper就采用了Paxos算法的近亲兄弟Zab算法**),但由于Paxos算法非常难以理解、实现、排错。所以不断有人尝试简化这一算法,直到2013年才有了重大突破:斯坦福的Diego Ongaro、John Ousterhout以易懂性为目标设计了新的一致性算法—— **Raft算法** ,并发布了对应的论文《In Search of an Understandable Consensus Algorithm》,到现在有十多种语言实现的Raft算法框架,较为出名的有以Go语言实现的Etcd,它的功能类似于Zookeeper,但采用了更为主流的Rest接口。 - * [图解 Paxos 一致性协议](http://blog.xiaohansong.com/2016/09/30/Paxos/) + * [图解 Paxos 一致性协议](https://mp.weixin.qq.com/s?__biz=MzI0NDI0MTgyOA==&mid=2652037784&idx=1&sn=d8c4f31a9cfb49ee91d05bb374e5cdd5&chksm=f2868653c5f10f45fc4a64d15a5f4163c3e66c00ed2ad334fa93edb46671f42db6752001f6c0#rd) * [图解分布式协议-RAFT](http://ifeve.com/raft/) - * [Zookeeper ZAB 协议分析](http://blog.xiaohansong.com/2016/08/25/zab/) + * [Zookeeper ZAB 协议分析](https://dbaplus.cn/news-141-1875-1.html) - ### 五 分布式存储 **分布式存储系统将数据分散存储在多台独立的设备上**。传统的网络存储系统采用集中的存储服务器存放所有数据,存储服务器成为系统性能的瓶颈,也是可靠性和安全性的焦点,不能满足大规模存储应用的需要。分布式网络存储系统采用可扩展的系统结构,利用多台存储服务器分担存储负荷,利用位置服务器定位存储信息,它不但提高了系统的可靠性、可用性和存取效率,还易于扩展。 * [分布式存储系统概要](http://witchiman.top/2017/05/05/distributed-system/) - + - ### 六 分布式计算 **所谓分布式计算是一门计算机科学,它研究如何把一个需要非常巨大的计算能力才能解决的问题分成许多小的部分,然后把这些部分分配给许多计算机进行处理,最后把这些计算结果综合起来得到最终的结果。** From 1ee3877bb2d0595d65bf6eef20cdb20e578a72ac Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sun, 18 Aug 2019 18:18:11 +0800 Subject: [PATCH 059/130] fix:typo --- docs/database/MySQL.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/database/MySQL.md b/docs/database/MySQL.md index d18118388d3..144607da393 100644 --- a/docs/database/MySQL.md +++ b/docs/database/MySQL.md @@ -95,7 +95,7 @@ show table status like "table_name" ; MyISAM是MySQL的默认数据库引擎(5.5版之前)。虽然性能极佳,而且提供了大量的特性,包括全文索引、压缩、空间函数等,但MyISAM不支持事务和行级锁,而且最大的缺陷就是崩溃后无法安全恢复。不过,5.5版本之后,MySQL引入了InnoDB(事务性数据库引擎),MySQL 5.5版本后默认的存储引擎为InnoDB。 -大多数时候我们使用的都是 InnoDB 存储引擎,但是在某些情况下使用 MyISAM 也是合适的比如读密集的情况下。(如果你不介意 MyISAM 崩溃回复问题的话)。 +大多数时候我们使用的都是 InnoDB 存储引擎,但是在某些情况下使用 MyISAM 也是合适的比如读密集的情况下。(如果你不介意 MyISAM 崩溃恢复问题的话)。 **两者的对比:** From a6fe08016b6fcf7aac567a877c3b7e626c453597 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sun, 18 Aug 2019 18:18:19 +0800 Subject: [PATCH 060/130] add : issue --- ...va\345\237\272\347\241\200\347\237\245\350\257\206.md" | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" index 06239b4f6da..4d410ce71d9 100644 --- "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -61,9 +61,15 @@ ## 1. 面向对象和面向过程的区别 -- **面向过程** :**面向过程性能比面向对象高。** 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发。但是,**面向过程没有面向对象易维护、易复用、易扩展。** +- **面向过程** :**面向过程性能比面向对象高。** 因为类调用时需要实例化,开销比较大,比较消耗资源,所以当性能是最重要的考量因素的时候,比如单片机、嵌入式开发、Linux/Unix等一般采用面向过程开发。但是,**面向过程没有面向对象易维护、易复用、易扩展。** - **面向对象** :**面向对象易维护、易复用、易扩展。** 因为面向对象有封装、继承、多态性的特性,所以可以设计出低耦合的系统,使系统更加灵活、更加易于维护。但是,**面向对象性能比面向过程低**。 +参见 issue : [面向过程 :面向过程性能比面向对象高??](https://github.com/Snailclimb/JavaGuide/issues/431) + +> 这个并不是根本原因,面向过程也需要分配内存,计算内存偏移量,Java性能差的主要原因并不是因为它是面向对象语言,而是Java是半编译语言,最终的执行代码并不是可以直接被CPU执行的二进制机械码。 +> +> 而面向过程语言大多都是直接编译成机械码在电脑上执行,并且其它一些面向过程的脚本语言性能也并不一定比Java好。 + ## 2. Java 语言有哪些特点? 1. 简单易学; From b42d76bf68f44a173ee2235e66d3858a4070338a Mon Sep 17 00:00:00 2001 From: RyzeZhao <38486503+Ryze-Zhao@users.noreply.github.com> Date: Mon, 19 Aug 2019 09:45:58 +0800 Subject: [PATCH 061/130] =?UTF-8?q?=E2=80=9C=E6=97=A0=E9=99=90=E5=BE=AA?= =?UTF-8?q?=E7=8E=AF=E2=80=9D=E6=89=93=E9=94=99=E4=B8=BA=E2=80=9C=E6=97=A0?= =?UTF-8?q?=E7=BA=BF=E5=BE=AA=E7=8E=AF=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit “无限循环”打错为“无线循环” --- docs/operating-system/Shell.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/operating-system/Shell.md b/docs/operating-system/Shell.md index e58f5c409e4..c79c4c7e5ff 100644 --- a/docs/operating-system/Shell.md +++ b/docs/operating-system/Shell.md @@ -467,7 +467,7 @@ done 是的!变形金刚 是一个好电影 ``` -**无线循环:** +**无限循环:** ```shell while true From 5ec9e60c794aafa4a4f6b26bbbd7e15d2556b668 Mon Sep 17 00:00:00 2001 From: hughyu Date: Mon, 19 Aug 2019 14:54:13 +0800 Subject: [PATCH 062/130] =?UTF-8?q?=E4=BF=AE=E6=94=B9=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\345\237\272\347\241\200\347\237\245\350\257\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" index 4d410ce71d9..ad4987229d2 100644 --- "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -48,7 +48,7 @@ - [Throwable类常用方法](#throwable类常用方法) - [异常处理总结](#异常处理总结) - [33 Java序列化中如果有些字段不想进行序列化,怎么办?](#33-java序列化中如果有些字段不想进行序列化怎么办) -- [34 获取用键盘输入常用的的两种方法](#34-获取用键盘输入常用的的两种方法) +- [34 获取用键盘输入常用的两种方法](#34-获取用键盘输入常用的两种方法) - [35 Java 中 IO 流分为几种?BIO,NIO,AIO 有什么区别?](#35-java-中-io-流分为几种bionioaio-有什么区别) - [java 中 IO 流分为几种?](#java-中-io-流分为几种) - [BIO,NIO,AIO 有什么区别?](#bionioaio-有什么区别) From 85078ebbc1964b7684eb7eeaf364000fa3ec23ab Mon Sep 17 00:00:00 2001 From: chengchen <823607596@qq.com> Date: Mon, 19 Aug 2019 15:32:44 +0800 Subject: [PATCH 063/130] Update Atomic.md --- docs/java/Multithread/Atomic.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/java/Multithread/Atomic.md b/docs/java/Multithread/Atomic.md index 05f4f2c9199..7f832568f65 100644 --- a/docs/java/Multithread/Atomic.md +++ b/docs/java/Multithread/Atomic.md @@ -56,7 +56,7 @@ Atomic 翻译成中文是原子的意思。在化学上,我们知道原子是 **引用类型** - AtomicReference:引用类型原子类 -- AtomicStampedReference:原子更新引用类型里的字段原子类 +- AtomicReferenceFieldUpdater:原子更新引用类型里的字段 - AtomicMarkableReference :原子更新带有标记位的引用类型 **对象的属性修改类型** @@ -553,4 +553,4 @@ class User { **Java工程师必备学习资源:** 一些Java工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。 -![我的公众号](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/167598cd2e17b8ec.png) \ No newline at end of file +![我的公众号](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/167598cd2e17b8ec.png) From e5fd8dfe2155a2757620bf18224ea8375fcda470 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Tue, 20 Aug 2019 16:28:37 +0800 Subject: [PATCH 064/130] Create RestControllerVS Controller.md --- .../spring/RestControllerVS Controller.md | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 docs/system-design/framework/spring/RestControllerVS Controller.md diff --git a/docs/system-design/framework/spring/RestControllerVS Controller.md b/docs/system-design/framework/spring/RestControllerVS Controller.md new file mode 100644 index 00000000000..de9de0c87c7 --- /dev/null +++ b/docs/system-design/framework/spring/RestControllerVS Controller.md @@ -0,0 +1,145 @@ +周末的时候分享了一个技术session,讲到了@RestController 和 @Controller,当时没有太讲清楚,因为 team 里很多同事之前不是做 Java的,所以对这两个东西不太熟悉,于是写了篇文章整理了一下。 + +## @RestController vs @Controller + +### Controller 返回一个页面 + +单独使用 `@Controller` 不加 `@ResponseBody`的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况。 + +![SpringMVC 传统工作流程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringMVC传统工作流程.png) + +### @RestController 返回JSON 或 XML 形式数据 + +但`@RestController`只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。 + +![SpringMVC+RestController](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringMVCRestController.png) + +### @Controller +@ResponseBody 返回JSON 或 XML 形式数据 + +如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用`@Controller` 并结合`@ResponseBody`注解,也就是说`@Controller` +`@ResponseBody`= `@RestController`(Spring 4 之后新加的注解)。 + +> `@ResponseBody` 注解的作用是将 `Controller` 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到HTTP 响应(Response)对象的 body 中,通常用来返回 JSON 或者 XML 数据,返回 JSON 数据的情况比较多。 + +![Spring3.xMVC RESTfulWeb服务工作流程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Spring3.xMVCRESTfulWeb服务工作流程.png) + +Reference: + +- https://dzone.com/articles/spring-framework-restcontroller-vs-controller(图片来源) +- https://javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html?m=1 + +### 示例1: @Controller 返回一个页面 + +当我们需要直接在后端返回一个页面的时候,Spring 推荐使用 Thymeleaf 模板引擎。Spring MVC中`@Controller`中的方法可以直接返回模板名称,接下来 Thymeleaf 模板引擎会自动进行渲染,模板中的表达式支持Spring表达式语言(Spring EL)。**如果需要用到 Thymeleaf 模板引擎,注意添加依赖!不然会报错。** + +Gradle: + +```groovy + compile 'org.springframework.boot:spring-boot-starter-thymeleaf' +``` + +Maven: + +```xml + + org.springframework.boot + spring-boot-starter-thymeleaf + +``` + +`src/main/java/com/example/demo/controller/HelloController.java` + +```java +@Controller +public class HelloController { + @GetMapping("/hello") + public String greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) { + model.addAttribute("name", name); + return "hello"; + } +} +``` +`src/main/resources/templates/hello.html` + +Spring 会去 resources 目录下 templates 目录下找,所以建议把页面放在 resources/templates 目录下 + +```html + + + + Getting Started: Serving Web Content + + + +

+ + +``` + +访问:http://localhost:8999/hello?name=team-c ,你将看到下面的内容 + +``` +Hello, team-c! +``` + +如果要对页面在templates目录下的hello文件夹中的话,返回页面的时候像下面这样写就可以了。 + +`src/main/resources/templates/hello/hello.html` + +```java + return "hello/hello"; +``` + +### 示例2: @Controller+@ResponseBody 返回 JSON 格式数据 + +**SpringBoot 默认集成了 jackson ,对于此需求你不需要添加任何相关依赖。** + +`src/main/java/com/example/demo/controller/Person.java` + +```java +public class Person { + private String name; + private Integer age; + ...... + 省略getter/setter ,有参和无参的construtor方法 +} + +``` + +`src/main/java/com/example/demo/controller/HelloController.java` + +```java +@Controller +public class HelloController { + @PostMapping("/hello") + @ResponseBody + public Person greeting(@RequestBody Person person) { + return person; + } + +} +``` + +使用 post 请求访问 http://localhost:8080/hello ,body 中附带以下参数,后端会以json 格式将 person 对象返回。 + +```json +{ + "name": "teamc", + "age": 1 +} +``` + +### 示例3: @RestController 返回 JSON 格式数据 + +只需要将`HelloController`改为如下形式: + +```java +@RestController +public class HelloController { + @PostMapping("/hello") + public Person greeting(@RequestBody Person person) { + return person; + } + +} +``` + From d0a85ba5668458fc58e61d4846d791430dfee143 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Tue, 20 Aug 2019 16:33:25 +0800 Subject: [PATCH 065/130] Delete RestControllerVS Controller.md --- .../spring/RestControllerVS Controller.md | 145 ------------------ 1 file changed, 145 deletions(-) delete mode 100644 docs/system-design/framework/spring/RestControllerVS Controller.md diff --git a/docs/system-design/framework/spring/RestControllerVS Controller.md b/docs/system-design/framework/spring/RestControllerVS Controller.md deleted file mode 100644 index de9de0c87c7..00000000000 --- a/docs/system-design/framework/spring/RestControllerVS Controller.md +++ /dev/null @@ -1,145 +0,0 @@ -周末的时候分享了一个技术session,讲到了@RestController 和 @Controller,当时没有太讲清楚,因为 team 里很多同事之前不是做 Java的,所以对这两个东西不太熟悉,于是写了篇文章整理了一下。 - -## @RestController vs @Controller - -### Controller 返回一个页面 - -单独使用 `@Controller` 不加 `@ResponseBody`的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况。 - -![SpringMVC 传统工作流程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringMVC传统工作流程.png) - -### @RestController 返回JSON 或 XML 形式数据 - -但`@RestController`只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。 - -![SpringMVC+RestController](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringMVCRestController.png) - -### @Controller +@ResponseBody 返回JSON 或 XML 形式数据 - -如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用`@Controller` 并结合`@ResponseBody`注解,也就是说`@Controller` +`@ResponseBody`= `@RestController`(Spring 4 之后新加的注解)。 - -> `@ResponseBody` 注解的作用是将 `Controller` 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到HTTP 响应(Response)对象的 body 中,通常用来返回 JSON 或者 XML 数据,返回 JSON 数据的情况比较多。 - -![Spring3.xMVC RESTfulWeb服务工作流程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Spring3.xMVCRESTfulWeb服务工作流程.png) - -Reference: - -- https://dzone.com/articles/spring-framework-restcontroller-vs-controller(图片来源) -- https://javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html?m=1 - -### 示例1: @Controller 返回一个页面 - -当我们需要直接在后端返回一个页面的时候,Spring 推荐使用 Thymeleaf 模板引擎。Spring MVC中`@Controller`中的方法可以直接返回模板名称,接下来 Thymeleaf 模板引擎会自动进行渲染,模板中的表达式支持Spring表达式语言(Spring EL)。**如果需要用到 Thymeleaf 模板引擎,注意添加依赖!不然会报错。** - -Gradle: - -```groovy - compile 'org.springframework.boot:spring-boot-starter-thymeleaf' -``` - -Maven: - -```xml - - org.springframework.boot - spring-boot-starter-thymeleaf - -``` - -`src/main/java/com/example/demo/controller/HelloController.java` - -```java -@Controller -public class HelloController { - @GetMapping("/hello") - public String greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) { - model.addAttribute("name", name); - return "hello"; - } -} -``` -`src/main/resources/templates/hello.html` - -Spring 会去 resources 目录下 templates 目录下找,所以建议把页面放在 resources/templates 目录下 - -```html - - - - Getting Started: Serving Web Content - - - -

- - -``` - -访问:http://localhost:8999/hello?name=team-c ,你将看到下面的内容 - -``` -Hello, team-c! -``` - -如果要对页面在templates目录下的hello文件夹中的话,返回页面的时候像下面这样写就可以了。 - -`src/main/resources/templates/hello/hello.html` - -```java - return "hello/hello"; -``` - -### 示例2: @Controller+@ResponseBody 返回 JSON 格式数据 - -**SpringBoot 默认集成了 jackson ,对于此需求你不需要添加任何相关依赖。** - -`src/main/java/com/example/demo/controller/Person.java` - -```java -public class Person { - private String name; - private Integer age; - ...... - 省略getter/setter ,有参和无参的construtor方法 -} - -``` - -`src/main/java/com/example/demo/controller/HelloController.java` - -```java -@Controller -public class HelloController { - @PostMapping("/hello") - @ResponseBody - public Person greeting(@RequestBody Person person) { - return person; - } - -} -``` - -使用 post 请求访问 http://localhost:8080/hello ,body 中附带以下参数,后端会以json 格式将 person 对象返回。 - -```json -{ - "name": "teamc", - "age": 1 -} -``` - -### 示例3: @RestController 返回 JSON 格式数据 - -只需要将`HelloController`改为如下形式: - -```java -@RestController -public class HelloController { - @PostMapping("/hello") - public Person greeting(@RequestBody Person person) { - return person; - } - -} -``` - From ba4340e8236f64d742c4fa001e393cc29a1ae284 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Tue, 20 Aug 2019 16:33:27 +0800 Subject: [PATCH 066/130] Create RestControllerVSController.md --- .../spring/RestControllerVSController.md | 145 ++++++++++++++++++ 1 file changed, 145 insertions(+) create mode 100644 docs/system-design/framework/spring/RestControllerVSController.md diff --git a/docs/system-design/framework/spring/RestControllerVSController.md b/docs/system-design/framework/spring/RestControllerVSController.md new file mode 100644 index 00000000000..de9de0c87c7 --- /dev/null +++ b/docs/system-design/framework/spring/RestControllerVSController.md @@ -0,0 +1,145 @@ +周末的时候分享了一个技术session,讲到了@RestController 和 @Controller,当时没有太讲清楚,因为 team 里很多同事之前不是做 Java的,所以对这两个东西不太熟悉,于是写了篇文章整理了一下。 + +## @RestController vs @Controller + +### Controller 返回一个页面 + +单独使用 `@Controller` 不加 `@ResponseBody`的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况。 + +![SpringMVC 传统工作流程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringMVC传统工作流程.png) + +### @RestController 返回JSON 或 XML 形式数据 + +但`@RestController`只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。 + +![SpringMVC+RestController](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringMVCRestController.png) + +### @Controller +@ResponseBody 返回JSON 或 XML 形式数据 + +如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用`@Controller` 并结合`@ResponseBody`注解,也就是说`@Controller` +`@ResponseBody`= `@RestController`(Spring 4 之后新加的注解)。 + +> `@ResponseBody` 注解的作用是将 `Controller` 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到HTTP 响应(Response)对象的 body 中,通常用来返回 JSON 或者 XML 数据,返回 JSON 数据的情况比较多。 + +![Spring3.xMVC RESTfulWeb服务工作流程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Spring3.xMVCRESTfulWeb服务工作流程.png) + +Reference: + +- https://dzone.com/articles/spring-framework-restcontroller-vs-controller(图片来源) +- https://javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html?m=1 + +### 示例1: @Controller 返回一个页面 + +当我们需要直接在后端返回一个页面的时候,Spring 推荐使用 Thymeleaf 模板引擎。Spring MVC中`@Controller`中的方法可以直接返回模板名称,接下来 Thymeleaf 模板引擎会自动进行渲染,模板中的表达式支持Spring表达式语言(Spring EL)。**如果需要用到 Thymeleaf 模板引擎,注意添加依赖!不然会报错。** + +Gradle: + +```groovy + compile 'org.springframework.boot:spring-boot-starter-thymeleaf' +``` + +Maven: + +```xml + + org.springframework.boot + spring-boot-starter-thymeleaf + +``` + +`src/main/java/com/example/demo/controller/HelloController.java` + +```java +@Controller +public class HelloController { + @GetMapping("/hello") + public String greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) { + model.addAttribute("name", name); + return "hello"; + } +} +``` +`src/main/resources/templates/hello.html` + +Spring 会去 resources 目录下 templates 目录下找,所以建议把页面放在 resources/templates 目录下 + +```html + + + + Getting Started: Serving Web Content + + + +

+ + +``` + +访问:http://localhost:8999/hello?name=team-c ,你将看到下面的内容 + +``` +Hello, team-c! +``` + +如果要对页面在templates目录下的hello文件夹中的话,返回页面的时候像下面这样写就可以了。 + +`src/main/resources/templates/hello/hello.html` + +```java + return "hello/hello"; +``` + +### 示例2: @Controller+@ResponseBody 返回 JSON 格式数据 + +**SpringBoot 默认集成了 jackson ,对于此需求你不需要添加任何相关依赖。** + +`src/main/java/com/example/demo/controller/Person.java` + +```java +public class Person { + private String name; + private Integer age; + ...... + 省略getter/setter ,有参和无参的construtor方法 +} + +``` + +`src/main/java/com/example/demo/controller/HelloController.java` + +```java +@Controller +public class HelloController { + @PostMapping("/hello") + @ResponseBody + public Person greeting(@RequestBody Person person) { + return person; + } + +} +``` + +使用 post 请求访问 http://localhost:8080/hello ,body 中附带以下参数,后端会以json 格式将 person 对象返回。 + +```json +{ + "name": "teamc", + "age": 1 +} +``` + +### 示例3: @RestController 返回 JSON 格式数据 + +只需要将`HelloController`改为如下形式: + +```java +@RestController +public class HelloController { + @PostMapping("/hello") + public Person greeting(@RequestBody Person person) { + return person; + } + +} +``` + From 7b0756a80a6df5a644cc99ddc31c2171ff530e79 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Tue, 20 Aug 2019 16:33:29 +0800 Subject: [PATCH 067/130] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 58e2ee0e079..9b48d692ff6 100644 --- a/README.md +++ b/README.md @@ -175,6 +175,7 @@ - [Spring中bean的作用域与生命周期](docs/system-design/framework/spring/SpringBean.md) - [SpringMVC 工作原理详解](docs/system-design/framework/spring/SpringMVC-Principle.md) - [Spring中都用到了那些设计模式?](docs/system-design/framework/spring/Spring-Design-Patterns.md) +- [RestControllerVSController](docs/system-design/framework/spring/RestControllerVSController.md) #### ZooKeeper From d5dd6a1324dbeffbb015334e7499545e9abad441 Mon Sep 17 00:00:00 2001 From: LicoCode <30888949+LicoCode@users.noreply.github.com> Date: Wed, 21 Aug 2019 10:33:30 +0800 Subject: [PATCH 068/130] =?UTF-8?q?Update=20Java=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 补充说明String intern --- .../Java\345\206\205\345\255\230\345\214\272\345\237\237.md" | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" index b2b775c1dfb..79c3b2fe7e4 100644 --- "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" +++ "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" @@ -294,7 +294,7 @@ System.out.println(str2==str3);//false **String 类型的常量池比较特殊。它的主要使用方法有两种:** - 直接使用双引号声明出来的 String 对象会直接存储在常量池中。 -- 如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern 方法。String.intern() 是一个 Native 方法,它的作用是:如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,则在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用。 +- 如果不是用双引号声明的 String 对象,可以使用 String 提供的 intern 方法。String.intern() 是一个 Native 方法,它的作用是:如果运行时常量池中已经包含一个等于此 String 对象内容的字符串,则返回常量池中该字符串的引用;如果没有,JDK1.7之前(不包含1.7)的处理方式是在常量池中创建与此 String 内容相同的字符串,并返回常量池中创建的字符串的引用,JDK1.7以及之后的处理方式是在常量池中记录此字符串的引用,并返回该引用。 ```java String s1 = new String("计算机"); @@ -421,6 +421,7 @@ i4=i5+i6 true - - - +- 深入解析String#intern ## 公众号 From 034a8442cbfc555e00cac391793b41caf362d55e Mon Sep 17 00:00:00 2001 From: Jim Han Date: Wed, 21 Aug 2019 17:49:54 +0800 Subject: [PATCH 069/130] =?UTF-8?q?=E4=BF=AE=E6=94=B9=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\345\206\205\345\255\230\345\214\272\345\237\237.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" index b2b775c1dfb..6954fad375f 100644 --- "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" +++ "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" @@ -175,7 +175,7 @@ JDK 1.8 的时候,方法区(HotSpot 的永久代)被彻底移除了(JDK1 #### 2.5.3 为什么要将永久代 (PermGen) 替换为元空间 (MetaSpace) 呢? -整个永久代有一个 JVM 本身设置固定大小上线,无法进行调整,而元空间使用的是直接内存,受本机可用内存的限制,并且永远不会得到 java.lang.OutOfMemoryError。你可以使用 `-XX:MaxMetaspaceSize` 标志设置最大元空间大小,默认值为 unlimited,这意味着它只受系统内存的限制。`-XX:MetaspaceSize` 调整标志定义元空间的初始大小如果未指定此标志,则 Metaspace 将根据运行时的应用程序需求动态地重新调整大小。 +整个永久代有一个 JVM 本身设置固定大小上限,无法进行调整,而元空间使用的是直接内存,受本机可用内存的限制,并且永远不会得到 java.lang.OutOfMemoryError。你可以使用 `-XX:MaxMetaspaceSize` 标志设置最大元空间大小,默认值为 unlimited,这意味着它只受系统内存的限制。`-XX:MetaspaceSize` 调整标志定义元空间的初始大小如果未指定此标志,则 Metaspace 将根据运行时的应用程序需求动态地重新调整大小。 当然这只是其中一个原因,还有很多底层的原因,这里就不提了。 @@ -183,7 +183,7 @@ JDK 1.8 的时候,方法区(HotSpot 的永久代)被彻底移除了(JDK1 运行时常量池是方法区的一部分。Class 文件中除了有类的版本、字段、方法、接口等描述信息外,还有常量池信息(用于存放编译期生成的各种字面量和符号引用) -既然运行时常量池时方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时会抛出 OutOfMemoryError 异常。 +既然运行时常量池是方法区的一部分,自然受到方法区内存的限制,当常量池无法再申请到内存时会抛出 OutOfMemoryError 异常。 **JDK1.7 及之后版本的 JVM 已经将运行时常量池从方法区中移了出来,在 Java 堆(Heap)中开辟了一块区域存放运行时常量池。** From cf2e639218aaacf49d1bc5cd9c815b96f5ca5b8c Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Wed, 21 Aug 2019 21:44:04 +0800 Subject: [PATCH 070/130] refractor:optimize file --- ...30\350\256\244\346\226\271\346\263\225.md" | 163 ----- .../Java8foreach\346\214\207\345\215\227.md" | 139 +++++ ...da\350\241\250\350\276\276\345\274\217.md" | 235 -------- docs/java/What's New in JDK8/README.md | 556 ------------------ docs/java/What's New in JDK8/Stream.md | 75 --- ...73\345\236\213\346\216\250\346\226\255.md" | 30 - ...02\346\225\260\344\277\241\346\201\257.md" | 79 --- 7 files changed, 139 insertions(+), 1138 deletions(-) delete mode 100644 "docs/java/What's New in JDK8/JDK8\346\216\245\345\217\243\350\247\204\350\214\203-\351\235\231\346\200\201\343\200\201\351\273\230\350\256\244\346\226\271\346\263\225.md" create mode 100644 "docs/java/What's New in JDK8/Java8foreach\346\214\207\345\215\227.md" delete mode 100644 "docs/java/What's New in JDK8/Lambda\350\241\250\350\276\276\345\274\217.md" delete mode 100644 docs/java/What's New in JDK8/README.md delete mode 100644 docs/java/What's New in JDK8/Stream.md delete mode 100644 "docs/java/What's New in JDK8/\346\224\271\350\277\233\347\232\204\347\261\273\345\236\213\346\216\250\346\226\255.md" delete mode 100644 "docs/java/What's New in JDK8/\351\200\232\350\277\207\345\217\215\345\260\204\350\216\267\345\276\227\346\226\271\346\263\225\347\232\204\345\217\202\346\225\260\344\277\241\346\201\257.md" diff --git "a/docs/java/What's New in JDK8/JDK8\346\216\245\345\217\243\350\247\204\350\214\203-\351\235\231\346\200\201\343\200\201\351\273\230\350\256\244\346\226\271\346\263\225.md" "b/docs/java/What's New in JDK8/JDK8\346\216\245\345\217\243\350\247\204\350\214\203-\351\235\231\346\200\201\343\200\201\351\273\230\350\256\244\346\226\271\346\263\225.md" deleted file mode 100644 index ee1dd8c2448..00000000000 --- "a/docs/java/What's New in JDK8/JDK8\346\216\245\345\217\243\350\247\204\350\214\203-\351\235\231\346\200\201\343\200\201\351\273\230\350\256\244\346\226\271\346\263\225.md" +++ /dev/null @@ -1,163 +0,0 @@ -JDK8接口规范 -=== -在JDK8中引入了lambda表达式,出现了函数式接口的概念,为了在扩展接口时保持向前兼容性(比如泛型也是为了保持兼容性而失去了在一些别的语言泛型拥有的功能),Java接口规范发生了一些改变。。 ---- -## 1.JDK8以前的接口规范 -- JDK8以前接口可以定义的变量和方法 - - 所有变量(Field)不论是否显式 的声明为```public static final```,它实际上都是```public static final```的。 - - 所有方法(Method)不论是否显示 的声明为```public abstract```,它实际上都是```public abstract```的。 -```java -public interface AInterfaceBeforeJDK8 { - int FIELD = 0; - void simpleMethod(); -} -``` -以上接口信息反编译以后可以看到字节码信息里Filed是public static final的,而方法是public abstract的,即是你没有显示的去声明它。 -```java -{ - public static final int FIELD; - descriptor: I - flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL - ConstantValue: int 0 - - public abstract void simpleMethod(); - descriptor: ()V - flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT -} -``` -## 2.JDK8之后的接口规范 -- JDK8之后接口可以定义的变量和方法 - - 变量(Field)仍然必须是 ```java public static final```的 - - 方法(Method)除了可以是public abstract之外,还可以是public static或者是default(相当于仅public修饰的实例方法)的。 -从以上改变不难看出,修改接口的规范主要是为了能在扩展接口时保持向前兼容。 -
下面是一个JDK8之后的接口例子 -```java -public interface AInterfaceInJDK8 { - int simpleFiled = 0; - static int staticField = 1; - - public static void main(String[] args) { - } - static void staticMethod(){} - - default void defaultMethod(){} - - void simpleMethod() throws IOException; - -} -``` -进行反编译(去除了一些没用信息) -```java -{ - public static final int simpleFiled; - flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL - - public static final int staticField; - flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL - - public static void main(java.lang.String[]); - flags: (0x0009) ACC_PUBLIC, ACC_STATIC - - public static void staticMethod(); - flags: (0x0009) ACC_PUBLIC, ACC_STATIC - - public void defaultMethod(); - flags: (0x0001) ACC_PUBLIC - - public abstract void simpleMethod() throws java.io.IOException; - flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT - Exceptions: - throws java.io.IOException -} -``` -可以看到 default关键字修饰的方法是像实例方法一样定义的,所以我们来定义一个只有default的方法并且实现一下试一试。 -```java -interface Default { - default int defaultMethod() { - return 4396; - } -} - -public class DefaultMethod implements Default { - public static void main(String[] args) { - DefaultMethod defaultMethod = new DefaultMethod(); - System.out.println(defaultMethod.defaultMethod()); - //compile error : Non-static method 'defaultMethod()' cannot be referenced from a static context - //! DefaultMethod.defaultMethod(); - } -} -``` -可以看到default方法确实像实例方法一样,必须有实例对象才能调用,并且子类在实现接口时,可以不用实现default方法,也可以覆盖该方法。 -这有点像子类继承父类实例方法。 -
-接口静态方法就像是类静态方法,唯一的区别是**接口静态方法只能通过接口名调用,而类静态方法既可以通过类名调用也可以通过实例调用** -```java -interface Static { - static int staticMethod() { - return 4396; - } -} - ... main(String...args) - //!compile error: Static method may be invoked on containing interface class only - //!aInstanceOfStatic.staticMethod(); - ... -``` -另一个问题是多继承问题,大家知道Java中类是不支持多继承的,但是接口是多继承和多实现(implements后跟多个接口)的, -那么如果一个接口继承另一个接口,两个接口都有同名的default方法会怎么样呢?答案是会像类继承一样覆写(@Override),以下代码在IDE中可以顺利编译 -```java -interface Default { - default int defaultMethod() { - return 4396; - } -} -interface Default2 extends Default { - @Override - default int defaultMethod() { - return 9527; - } -} -public class DefaultMethod implements Default,Default2 { - public static void main(String[] args) { - DefaultMethod defaultMethod = new DefaultMethod(); - System.out.println(defaultMethod.defaultMethod()); - } -} - -输出 : 9527 -``` -出现上面的情况时,会优先找继承树上近的方法,类似于“短路优先”。 -
-那么如果一个类实现了两个没有继承关系的接口,且这两个接口有同名方法的话会怎么样呢?IDE会要求你重写这个冲突的方法,让你自己选择去执行哪个方法,因为IDE它 -还没智能到你不告诉它,它就知道你想执行哪个方法。可以通过```java 接口名.super```指针来访问接口中定义的实例(default)方法。 -```java -interface Default { - default int defaultMethod() { - return 4396; - } -} - -interface Default2 { - default int defaultMethod() { - return 9527; - } -} -//如果不重写 -//compile error : defaults.DefaultMethod inherits unrelated defaults for defaultMethod() from types defaults.Default and defaults.Default2 -public class DefaultMethod implements Default,Default2 { -@Override - public int defaultMethod() { - System.out.println(Default.super.defaultMethod()); - System.out.println(Default2.super.defaultMethod()); - return 996; - } - public static void main(String[] args) { - DefaultMethod defaultMethod = new DefaultMethod(); - System.out.println(defaultMethod.defaultMethod()); - } -} - -运行输出 : -4396 -9527 -996 -``` diff --git "a/docs/java/What's New in JDK8/Java8foreach\346\214\207\345\215\227.md" "b/docs/java/What's New in JDK8/Java8foreach\346\214\207\345\215\227.md" new file mode 100644 index 00000000000..48cda3abfd9 --- /dev/null +++ "b/docs/java/What's New in JDK8/Java8foreach\346\214\207\345\215\227.md" @@ -0,0 +1,139 @@ +> 本文由 JavaGuide 翻译,原文地址:https://www.baeldung.com/foreach-java + +## 1 概述 + +在Java 8中引入的*forEach*循环为程序员提供了一种新的,简洁而有趣的迭代集合的方式。 + +在本文中,我们将看到如何将*forEach*与集合*一起*使用,它采用何种参数以及此循环与增强的*for*循环的不同之处。 + +## 2 基础知识 + +```Java +public interface Collection extends Iterable +``` + +Collection 接口实现了 Iterable 接口,而 Iterable 接口在 Java 8开始具有一个新的 API: + +```java +void forEach(Consumer action)//对 Iterable的每个元素执行给定的操作,直到所有元素都被处理或动作引发异常。 +``` + +使用*forEach*,我们可以迭代一个集合并对每个元素执行给定的操作,就像任何其他*迭代器一样。* + +例如,迭代和打印字符串集合*的*for循环版本: + +```java +for (String name : names) { + System.out.println(name); +} +``` + +我们可以使用*forEach*写这个 : + +```java +names.forEach(name -> { + System.out.println(name); +}); +``` + +## 3.使用forEach方法 + +### 3.1 匿名类 + +我们使用 *forEach*迭代集合并对每个元素执行特定操作。**要执行的操作包含在实现Consumer接口的类中,并作为参数传递给forEach 。** + +所述*消费者*接口是一个功能接口(具有单个抽象方法的接口)。它接受输入并且不返回任何结果。 + +Consumer 接口定义如下: + +```java +@FunctionalInterface +public interface Consumer { + void accept(T t); +} +``` +任何实现,例如,只是打印字符串的消费者: + +```java +Consumer printConsumer = new Consumer() { + public void accept(String name) { + System.out.println(name); + }; +}; +``` + +可以作为参数传递给*forEach*: + +```java +names.forEach(printConsumer); +``` + +但这不是通过消费者和使用*forEach* API 创建操作的唯一方法。让我们看看我们将使用*forEach*方法的另外2种最流行的方式: + +### 3.2 Lambda表达式 + +Java 8功能接口的主要优点是我们可以使用Lambda表达式来实例化它们,并避免使用庞大的匿名类实现。 + +由于 Consumer 接口属于函数式接口,我们可以通过以下形式在Lambda中表达它: + +```java +(argument) -> { body } +name -> System.out.println(name) +names.forEach(name -> System.out.println(name)); +``` + +### 3.3 方法参考 + +我们可以使用方法引用语法而不是普通的Lambda语法,其中已存在一个方法来对类执行操作: + +```java +names.forEach(System.out::println); +``` + +## 4.forEach在集合中的使用 + +### 4.1.迭代集合 + +**任何类型Collection的可迭代 - 列表,集合,队列 等都具有使用forEach的相同语法。** + +因此,正如我们已经看到的,迭代列表的元素: + +```java +List names = Arrays.asList("Larry", "Steve", "James"); + +names.forEach(System.out::println); +``` + +同样对于一组: + +```java +Set uniqueNames = new HashSet<>(Arrays.asList("Larry", "Steve", "James")); + +uniqueNames.forEach(System.out::println); +``` + +或者让我们说一个*队列*也是一个*集合*: + +```java +Queue namesQueue = new ArrayDeque<>(Arrays.asList("Larry", "Steve", "James")); + +namesQueue.forEach(System.out::println); +``` + +### 4.2.迭代Map - 使用Map的forEach + +Map没有实现Iterable接口,但它**提供了自己的forEach 变体,它接受BiConsumer**。* + +```java +Map namesMap = new HashMap<>(); +namesMap.put(1, "Larry"); +namesMap.put(2, "Steve"); +namesMap.put(3, "James"); +namesMap.forEach((key, value) -> System.out.println(key + " " + value)); +``` + +### 4.3.迭代一个Map - 通过迭代entrySet + +```java +namesMap.entrySet().forEach(entry -> System.out.println(entry.getKey() + " " + entry.getValue())); +``` \ No newline at end of file diff --git "a/docs/java/What's New in JDK8/Lambda\350\241\250\350\276\276\345\274\217.md" "b/docs/java/What's New in JDK8/Lambda\350\241\250\350\276\276\345\274\217.md" deleted file mode 100644 index 359c4714473..00000000000 --- "a/docs/java/What's New in JDK8/Lambda\350\241\250\350\276\276\345\274\217.md" +++ /dev/null @@ -1,235 +0,0 @@ -JDK8--Lambda表达式 -=== -## 1.什么是Lambda表达式 -**Lambda表达式实质上是一个可传递的代码块,Lambda又称为闭包或者匿名函数,是函数式编程语法,让方法可以像普通参数一样传递** - -## 2.Lambda表达式语法 -```(参数列表) -> {执行代码块}``` -
参数列表可以为空```()->{}``` -
可以加类型声明比如```(String para1, int para2) -> {return para1 + para2;}```我们可以看到,lambda同样可以有返回值. -
在编译器可以推断出类型的时候,可以将类型声明省略,比如```(para1, para2) -> {return para1 + para2;}``` -
(lambda有点像动态类型语言语法。lambda在字节码层面是用invokedynamic实现的,而这条指令就是为了让JVM更好的支持运行在其上的动态类型语言) - -## 3.函数式接口 -在了解Lambda表达式之前,有必要先了解什么是函数式接口```(@FunctionalInterface)```
-**函数式接口指的是有且只有一个抽象(abstract)方法的接口**
-当需要一个函数式接口的对象时,就可以用Lambda表达式来实现,举个常用的例子: -
-```java - Thread thread = new Thread(() -> { - System.out.println("This is JDK8's Lambda!"); - }); -``` -这段代码和函数式接口有啥关系?我们回忆一下,Thread类的构造函数里是不是有一个以Runnable接口为参数的? -```java -public Thread(Runnable target) {...} - -/** - * Runnable Interface - */ -@FunctionalInterface -public interface Runnable { - public abstract void run(); -} -``` -到这里大家可能已经明白了,**Lambda表达式相当于一个匿名类或者说是一个匿名方法**。上面Thread的例子相当于 -```java - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - System.out.println("Anonymous class"); - } - }); -``` -也就是说,上面的lambda表达式相当于实现了这个run()方法,然后当做参数传入(个人感觉可以这么理解,lambda表达式就是一个函数,只不过它的返回值、参数列表都 -由编译器帮我们推断,因此可以减少很多代码量)。 -
Lambda也可以这样用 : -```java - Runnable runnable = () -> {...}; -``` -其实这和上面的用法没有什么本质上的区别。 -
至此大家应该明白什么是函数式接口以及函数式接口和lambda表达式之间的关系了。在JDK8中修改了接口的规范, -目的是为了在给接口添加新的功能时保持向前兼容(个人理解),比如一个已经定义了的函数式接口,某天我们想给它添加新功能,那么就不能保持向前兼容了, -因为在旧的接口规范下,添加新功能必定会破坏这个函数式接口[(JDK8中接口规范)]() -
-除了上面说的Runnable接口之外,JDK中已经存在了很多函数式接口 -比如(当然不止这些): -- ```java.util.concurrent.Callable``` -- ```java.util.Comparator``` -- ```java.io.FileFilter``` -
**关于JDK中的预定义的函数式接口** - -- JDK在```java.util.function```下预定义了很多函数式接口 - - ```Function {R apply(T t);}``` 接受一个T对象,然后返回一个R对象,就像普通的函数。 - - ```Consumer {void accept(T t);}``` 消费者 接受一个T对象,没有返回值。 - - ```Predicate {boolean test(T t);}``` 判断,接受一个T对象,返回一个布尔值。 - - ```Supplier {T get();} 提供者(工厂)``` 返回一个T对象。 - - 其他的跟上面的相似,大家可以看一下function包下的具体接口。 -## 4.变量作用域 -```java -public class VaraibleHide { - @FunctionalInterface - interface IInner { - void printInt(int x); - } - public static void main(String[] args) { - int x = 20; - IInner inner = new IInner() { - int x = 10; - @Override - public void printInt(int x) { - System.out.println(x); - } - }; - inner.printInt(30); - - inner = (s) -> { - //Variable used in lambda expression should be final or effectively final - //!int x = 10; - //!x= 50; error - System.out.print(x); - }; - inner.printInt(30); - } -} -输出 : -30 -20 -``` -对于lambda表达式```java inner = (s) -> {System.out.print(x);};```,变量x并不是在lambda表达式中定义的,像这样并不是在lambda中定义或者通过lambda的参数列表()获取的变量成为自由变量,它是被lambda表达式捕获的。 -
lambda表达式和内部类一样,对外部自由变量捕获时,外部自由变量必须为final或者是最终变量(effectively final)的,也就是说这个变量初始化后就不能为它赋新值, -同时lambda不像内部类/匿名类,lambda表达式与外围嵌套块有着相同的作用域,因此对变量命名的有关规则对lambda同样适用。大家阅读上面的代码对这些概念应该 -不难理解。 -## 5.方法引用 -**只需要提供方法的名字,具体的调用过程由Lambda和函数式接口来确定,这样的方法调用成为方法引用。** -
下面的例子会打印list中的每个元素: -```java -List list = new ArrayList<>(); - for (int i = 0; i < 10; ++i) { - list.add(i); - } - list.forEach(System.out::println); -``` -其中```System.out::println```这个就是一个方法引用,等价于Lambda表达式 ```(para)->{System.out.println(para);}``` -
我们看一下List#forEach方法 ```default void forEach(Consumer action)```可以看到它的参数是一个Consumer接口,该接口是一个函数式接口 -```java -@FunctionalInterface -public interface Consumer { - void accept(T t); -``` -大家能发现这个函数接口的方法和```System.out::println```有什么相似的么?没错,它们有着相似的参数列表和返回值。 -
我们自己定义一个方法,看看能不能像标准输出的打印函数一样被调用 -```java -public class MethodReference { - public static void main(String[] args) { - List list = new ArrayList<>(); - for (int i = 0; i < 10; ++i) { - list.add(i); - } - list.forEach(MethodReference::myPrint); - } - - static void myPrint(int i) { - System.out.print(i + ", "); - } -} - -输出: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -``` -可以看到,我们自己定义的方法也可以当做方法引用。 -
到这里大家多少对方法引用有了一定的了解,我们再来说一下方法引用的形式。 -- 方法引用 - - 类名::静态方法名 - - 类名::实例方法名 - - 类名::new (构造方法引用) - - 实例名::实例方法名 -可以看出,方法引用是通过(方法归属名)::(方法名)来调用的。通过上面的例子已经讲解了一个`类名::静态方法名`的使用方法了,下面再依次介绍其余的几种 -方法引用的使用方法。
-**类名::实例方法名**
-先来看一段代码 -```java - String[] strings = new String[10]; - Arrays.sort(strings, String::compareToIgnoreCase); -``` -**上面的String::compareToIgnoreCase等价于(x, y) -> {return x.compareToIgnoreCase(y);}**
-我们看一下`Arrays#sort`方法`public static void sort(T[] a, Comparator c)`, -可以看到第二个参数是一个Comparator接口,该接口也是一个函数式接口,其中的抽象方法是`int compare(T o1, T o2);`,再看一下 -`String#compareToIgnoreCase`方法,`public int compareToIgnoreCase(String str)`,这个方法好像和上面讲方法引用中`类名::静态方法名`不大一样啊,它 -的参数列表和函数式接口的参数列表不一样啊,虽然它的返回值一样? -
是的,确实不一样但是别忘了,String类的这个方法是个实例方法,而不是静态方法,也就是说,这个方法是需要有一个接收者的。所谓接收者就是 -instance.method(x)中的instance, -它是某个类的实例,有的朋友可能已经明白了。上面函数式接口的`compare(T o1, T o2)`中的第一个参数作为了实例方法的接收者,而第二个参数作为了实例方法的 -参数。我们再举一个自己实现的例子: -```java -public class MethodReference { - static Random random = new Random(47); - public static void main(String[] args) { - MethodReference[] methodReferences = new MethodReference[10]; - Arrays.sort(methodReferences, MethodReference::myCompare); - } - int myCompare(MethodReference o) { - return random.nextInt(2) - 1; - } -} -``` -上面的例子可以在IDE里通过编译,大家有兴趣的可以模仿上面的例子自己写一个程序,打印出排序后的结果。 -
**构造器引用**
-构造器引用仍然需要与特定的函数式接口配合使用,并不能像下面这样直接使用。IDE会提示String不是一个函数式接口 -```java - //compile error : String is not a functional interface - String str = String::new; -``` -下面是一个使用构造器引用的例子,可以看出构造器引用可以和这种工厂型的函数式接口一起使用的。 -```java - interface IFunctional { - T func(); -} - -public class ConstructorReference { - - public ConstructorReference() { - } - - public static void main(String[] args) { - Supplier supplier0 = () -> new ConstructorReference(); - Supplier supplier1 = ConstructorReference::new; - IFunctional functional = () -> new ConstructorReference(); - IFunctional functional1 = ConstructorReference::new; - } -} -``` -下面是一个JDK官方的例子 -```java - public static , DEST extends Collection> - DEST transferElements( - SOURCE sourceCollection, - Supplier collectionFactory) { - - DEST result = collectionFactory.get(); - for (T t : sourceCollection) { - result.add(t); - } - return result; - } - - ... - - Set rosterSet = transferElements( - roster, HashSet::new); -``` - -**实例::实例方法** -
-其实开始那个例子就是一个实例::实例方法的引用 -```java -List list = new ArrayList<>(); - for (int i = 0; i < 10; ++i) { - list.add(i); - } - list.forEach(System.out::println); -``` -其中System.out就是一个实例,println是一个实例方法。相信不用再给大家做解释了。 -## 总结 -Lambda表达式是JDK8引入Java的函数式编程语法,使用Lambda需要直接或者间接的与函数式接口配合,在开发中使用Lambda可以减少代码量, -但是并不是说必须要使用Lambda(虽然它是一个很酷的东西)。有些情况下使用Lambda会使代码的可读性急剧下降,并且也节省不了多少代码, -所以在实际开发中还是需要仔细斟酌是否要使用Lambda。和Lambda相似的还有JDK10中加入的var类型推断,同样对于这个特性需要斟酌使用。 diff --git a/docs/java/What's New in JDK8/README.md b/docs/java/What's New in JDK8/README.md deleted file mode 100644 index fa71e907410..00000000000 --- a/docs/java/What's New in JDK8/README.md +++ /dev/null @@ -1,556 +0,0 @@ -JDK8新特性总结 -====== -总结了部分JDK8新特性,另外一些新特性可以通过Oracle的官方文档查看,毕竟是官方文档,各种新特性都会介绍,有兴趣的可以去看。
-[Oracle官方文档:What's New in JDK8](https://www.oracle.com/technetwork/java/javase/8-whats-new-2157071.html) ------ -- [Java语言特性](#JavaProgrammingLanguage) - - [Lambda表达式是一个新的语言特性,已经在JDK8中加入。它是一个可以传递的代码块,你也可以把它们当做方法参数。 - Lambda表达式允许您更紧凑地创建单虚方法接口(称为功能接口)的实例。](#LambdaExpressions) - - - [方法引用为已经存在的具名方法提供易于阅读的Lambda表达式](#MethodReferences) - - - [默认方法允许将新功能添加到库的接口,并确保与为这些接口的旧版本编写的代码的二进制兼容性。](#DefaultMethods) - - - [改进的类型推断。](#ImprovedTypeInference) - - - [方法参数反射(通过反射获得方法参数信息)](#MethodParameterReflection) - -- [流(stream)](#stream) - - [新java.util.stream包中的类提供Stream API以支持对元素流的功能样式操作。流(stream)和I/O里的流不是同一个概念 - ,使用stream API可以更方便的操作集合。]() - -- [国际化]() - - 待办 -- 待办 -___ - - - - - - - -##              Lambda表达式 -### 1.什么是Lambda表达式 -**Lambda表达式实质上是一个可传递的代码块,Lambda又称为闭包或者匿名函数,是函数式编程语法,让方法可以像普通参数一样传递** - -### 2.Lambda表达式语法 -```(参数列表) -> {执行代码块}``` -
参数列表可以为空```()->{}``` -
可以加类型声明比如```(String para1, int para2) -> {return para1 + para2;}```我们可以看到,lambda同样可以有返回值. -
在编译器可以推断出类型的时候,可以将类型声明省略,比如```(para1, para2) -> {return para1 + para2;}``` -
(lambda有点像动态类型语言语法。lambda在字节码层面是用invokedynamic实现的,而这条指令就是为了让JVM更好的支持运行在其上的动态类型语言) - -### 3.函数式接口 -在了解Lambda表达式之前,有必要先了解什么是函数式接口```(@FunctionalInterface)```
-**函数式接口指的是有且只有一个抽象(abstract)方法的接口**
-当需要一个函数式接口的对象时,就可以用Lambda表达式来实现,举个常用的例子: -
-```java - Thread thread = new Thread(() -> { - System.out.println("This is JDK8's Lambda!"); - }); -``` -这段代码和函数式接口有啥关系?我们回忆一下,Thread类的构造函数里是不是有一个以Runnable接口为参数的? -```java -public Thread(Runnable target) {...} - -/** - * Runnable Interface - */ -@FunctionalInterface -public interface Runnable { - public abstract void run(); -} -``` -到这里大家可能已经明白了,**Lambda表达式相当于一个匿名类或者说是一个匿名方法**。上面Thread的例子相当于 -```java - Thread thread = new Thread(new Runnable() { - @Override - public void run() { - System.out.println("Anonymous class"); - } - }); -``` -也就是说,上面的lambda表达式相当于实现了这个run()方法,然后当做参数传入(个人感觉可以这么理解,lambda表达式就是一个函数,只不过它的返回值、参数列表都 -由编译器帮我们推断,因此可以减少很多代码量)。 -
Lambda也可以这样用 : -```java - Runnable runnable = () -> {...}; -``` -其实这和上面的用法没有什么本质上的区别。 -
至此大家应该明白什么是函数式接口以及函数式接口和lambda表达式之间的关系了。在JDK8中修改了接口的规范, -目的是为了在给接口添加新的功能时保持向前兼容(个人理解),比如一个已经定义了的函数式接口,某天我们想给它添加新功能,那么就不能保持向前兼容了, -因为在旧的接口规范下,添加新功能必定会破坏这个函数式接口[(JDK8中接口规范)]() -
-除了上面说的Runnable接口之外,JDK中已经存在了很多函数式接口 -比如(当然不止这些): -- ```java.util.concurrent.Callable``` -- ```java.util.Comparator``` -- ```java.io.FileFilter``` -
**关于JDK中的预定义的函数式接口** - -- JDK在```java.util.function```下预定义了很多函数式接口 - - ```Function {R apply(T t);}``` 接受一个T对象,然后返回一个R对象,就像普通的函数。 - - ```Consumer {void accept(T t);}``` 消费者 接受一个T对象,没有返回值。 - - ```Predicate {boolean test(T t);}``` 判断,接受一个T对象,返回一个布尔值。 - - ```Supplier {T get();} 提供者(工厂)``` 返回一个T对象。 - - 其他的跟上面的相似,大家可以看一下function包下的具体接口。 -### 4.变量作用域 -```java -public class VaraibleHide { - @FunctionalInterface - interface IInner { - void printInt(int x); - } - public static void main(String[] args) { - int x = 20; - IInner inner = new IInner() { - int x = 10; - @Override - public void printInt(int x) { - System.out.println(x); - } - }; - inner.printInt(30); - - inner = (s) -> { - //Variable used in lambda expression should be final or effectively final - //!int x = 10; - //!x= 50; error - System.out.print(x); - }; - inner.printInt(30); - } -} -输出 : -30 -20 -``` -对于lambda表达式```java inner = (s) -> {System.out.print(x);};```,变量x并不是在lambda表达式中定义的,像这样并不是在lambda中定义或者通过lambda -的参数列表()获取的变量成为自由变量,它是被lambda表达式捕获的。 -
lambda表达式和内部类一样,对外部自由变量捕获时,外部自由变量必须为final或者是最终变量(effectively final)的,也就是说这个变量初始化后就不能为它赋新值,同时lambda不像内部类/匿名类,lambda表达式与外围嵌套块有着相同的作用域,因此对变量命名的有关规则对lambda同样适用。大家阅读上面的代码对这些概念应该不难理解。 - -### 5.方法引用 -**只需要提供方法的名字,具体的调用过程由Lambda和函数式接口来确定,这样的方法调用成为方法引用。** -
下面的例子会打印list中的每个元素: -```java -List list = new ArrayList<>(); - for (int i = 0; i < 10; ++i) { - list.add(i); - } - list.forEach(System.out::println); -``` -其中```System.out::println```这个就是一个方法引用,等价于Lambda表达式 ```(para)->{System.out.println(para);}``` -
我们看一下List#forEach方法 ```default void forEach(Consumer action)```可以看到它的参数是一个Consumer接口,该接口是一个函数式接口 -```java -@FunctionalInterface -public interface Consumer { - void accept(T t); -``` -大家能发现这个函数接口的方法和```System.out::println```有什么相似的么?没错,它们有着相似的参数列表和返回值。 -
我们自己定义一个方法,看看能不能像标准输出的打印函数一样被调用 -```java -public class MethodReference { - public static void main(String[] args) { - List list = new ArrayList<>(); - for (int i = 0; i < 10; ++i) { - list.add(i); - } - list.forEach(MethodReference::myPrint); - } - - static void myPrint(int i) { - System.out.print(i + ", "); - } -} - -输出: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -``` -可以看到,我们自己定义的方法也可以当做方法引用。 -
到这里大家多少对方法引用有了一定的了解,我们再来说一下方法引用的形式。 -- 方法引用 - - 类名::静态方法名 - - 类名::实例方法名 - - 类名::new (构造方法引用) - - 实例名::实例方法名 -可以看出,方法引用是通过(方法归属名)::(方法名)来调用的。通过上面的例子已经讲解了一个`类名::静态方法名`的使用方法了,下面再依次介绍其余的几种 -方法引用的使用方法。
-**类名::实例方法名**
-先来看一段代码 -```java - String[] strings = new String[10]; - Arrays.sort(strings, String::compareToIgnoreCase); -``` -**上面的String::compareToIgnoreCase等价于(x, y) -> {return x.compareToIgnoreCase(y);}**
-我们看一下`Arrays#sort`方法`public static void sort(T[] a, Comparator c)`, -可以看到第二个参数是一个Comparator接口,该接口也是一个函数式接口,其中的抽象方法是`int compare(T o1, T o2);`,再看一下 -`String#compareToIgnoreCase`方法,`public int compareToIgnoreCase(String str)`,这个方法好像和上面讲方法引用中`类名::静态方法名`不大一样啊,它 -的参数列表和函数式接口的参数列表不一样啊,虽然它的返回值一样? -
是的,确实不一样但是别忘了,String类的这个方法是个实例方法,而不是静态方法,也就是说,这个方法是需要有一个接收者的。所谓接收者就是 -instance.method(x)中的instance, -它是某个类的实例,有的朋友可能已经明白了。上面函数式接口的`compare(T o1, T o2)`中的第一个参数作为了实例方法的接收者,而第二个参数作为了实例方法的 -参数。我们再举一个自己实现的例子: -```java -public class MethodReference { - static Random random = new Random(47); - public static void main(String[] args) { - MethodReference[] methodReferences = new MethodReference[10]; - Arrays.sort(methodReferences, MethodReference::myCompare); - } - int myCompare(MethodReference o) { - return random.nextInt(2) - 1; - } -} -``` -上面的例子可以在IDE里通过编译,大家有兴趣的可以模仿上面的例子自己写一个程序,打印出排序后的结果。 -
**构造器引用**
-构造器引用仍然需要与特定的函数式接口配合使用,并不能像下面这样直接使用。IDE会提示String不是一个函数式接口 -```java - //compile error : String is not a functional interface - String str = String::new; -``` -下面是一个使用构造器引用的例子,可以看出构造器引用可以和这种工厂型的函数式接口一起使用的。 -```java - interface IFunctional { - T func(); -} - -public class ConstructorReference { - - public ConstructorReference() { - } - - public static void main(String[] args) { - Supplier supplier0 = () -> new ConstructorReference(); - Supplier supplier1 = ConstructorReference::new; - IFunctional functional = () -> new ConstructorReference(); - IFunctional functional1 = ConstructorReference::new; - } -} -``` -下面是一个JDK官方的例子 -```java - public static , DEST extends Collection> - DEST transferElements( - SOURCE sourceCollection, - Supplier collectionFactory) { - - DEST result = collectionFactory.get(); - for (T t : sourceCollection) { - result.add(t); - } - return result; - } - - ... - - Set rosterSet = transferElements( - roster, HashSet::new); -``` - -**实例::实例方法** -
-其实开始那个例子就是一个实例::实例方法的引用 -```java -List list = new ArrayList<>(); - for (int i = 0; i < 10; ++i) { - list.add(i); - } - list.forEach(System.out::println); -``` -其中System.out就是一个实例,println是一个实例方法。相信不用再给大家做解释了。 -### 总结 -Lambda表达式是JDK8引入Java的函数式编程语法,使用Lambda需要直接或者间接的与函数式接口配合,在开发中使用Lambda可以减少代码量, -但是并不是说必须要使用Lambda(虽然它是一个很酷的东西)。有些情况下使用Lambda会使代码的可读性急剧下降,并且也节省不了多少代码, -所以在实际开发中还是需要仔细斟酌是否要使用Lambda。和Lambda相似的还有JDK10中加入的var类型推断,同样对于这个特性需要斟酌使用。 - - -___ - - -##              JDK8接口规范 -### 在JDK8中引入了lambda表达式,出现了函数式接口的概念,为了在扩展接口时保持向前兼容性(JDK8之前扩展接口会使得实现了该接口的类必须实现添加的方法,否则会报错。为了保持兼容性而做出妥协的特性还有泛型,泛型也是为了保持兼容性而失去了在一些别的语言泛型拥有的功能),Java接口规范发生了一些改变。 -### 1.JDK8以前的接口规范 -- JDK8以前接口可以定义的变量和方法 - - 所有变量(Field)不论是否显式 的声明为```public static final```,它实际上都是```public static final```的。 - - 所有方法(Method)不论是否显示 的声明为```public abstract```,它实际上都是```public abstract```的。 -```java -public interface AInterfaceBeforeJDK8 { - int FIELD = 0; - void simpleMethod(); -} -``` -以上接口信息反编译以后可以看到字节码信息里Filed是public static final的,而方法是public abstract的,即是你没有显示的去声明它。 -```java -{ - public static final int FIELD; - descriptor: I - flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL - ConstantValue: int 0 - - public abstract void simpleMethod(); - descriptor: ()V - flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT -} -``` -### 2.JDK8之后的接口规范 -- JDK8之后接口可以定义的变量和方法 - - 变量(Field)仍然必须是 ```java public static final```的 - - 方法(Method)除了可以是public abstract之外,还可以是public static或者是default(相当于仅public修饰的实例方法)的。 -从以上改变不难看出,修改接口的规范主要是为了能在扩展接口时保持向前兼容。 -
下面是一个JDK8之后的接口例子 -```java -public interface AInterfaceInJDK8 { - int simpleFiled = 0; - static int staticField = 1; - - public static void main(String[] args) { - } - static void staticMethod(){} - - default void defaultMethod(){} - - void simpleMethod() throws IOException; - -} -``` -进行反编译(去除了一些没用信息) -```java -{ - public static final int simpleFiled; - flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL - - public static final int staticField; - flags: (0x0019) ACC_PUBLIC, ACC_STATIC, ACC_FINAL - - public static void main(java.lang.String[]); - flags: (0x0009) ACC_PUBLIC, ACC_STATIC - - public static void staticMethod(); - flags: (0x0009) ACC_PUBLIC, ACC_STATIC - - public void defaultMethod(); - flags: (0x0001) ACC_PUBLIC - - public abstract void simpleMethod() throws java.io.IOException; - flags: (0x0401) ACC_PUBLIC, ACC_ABSTRACT - Exceptions: - throws java.io.IOException -} -``` -可以看到 default关键字修饰的方法是像实例方法(就是普通类中定义的普通方法)一样定义的,所以我们来定义一个只有default方法的接口并且实现一下这个接口试一 -试。 -```java -interface Default { - default int defaultMethod() { - return 4396; - } -} - -public class DefaultMethod implements Default { - public static void main(String[] args) { - DefaultMethod defaultMethod = new DefaultMethod(); - System.out.println(defaultMethod.defaultMethod()); - //compile error : Non-static method 'defaultMethod()' cannot be referenced from a static context - //! DefaultMethod.defaultMethod(); - } -} -``` -可以看到default方法确实像实例方法一样,必须有实例对象才能调用,并且子类在实现接口时,可以不用实现default方法,也可以选择覆盖该方法。 -这有点像子类继承父类实例方法。 -
-接口静态方法就像是类静态方法,唯一的区别是**接口静态方法只能通过接口名调用,而类静态方法既可以通过类名调用也可以通过实例调用** -```java -interface Static { - static int staticMethod() { - return 4396; - } -} - ... main(String...args) - //!compile error: Static method may be invoked on containing interface class only - //!aInstanceOfStatic.staticMethod(); - ... -``` -另一个问题是多继承问题,大家知道Java中类是不支持多继承的,但是接口是多继承和多实现(implements后跟多个接口)的, -那么如果一个接口继承另一个接口,两个接口都有同名的default方法会怎么样呢?答案是会像类继承一样覆写(@Override),以下代码在IDE中可以顺利编译 -```java -interface Default { - default int defaultMethod() { - return 4396; - } -} -interface Default2 extends Default { - @Override - default int defaultMethod() { - return 9527; - } -} -public class DefaultMethod implements Default,Default2 { - public static void main(String[] args) { - DefaultMethod defaultMethod = new DefaultMethod(); - System.out.println(defaultMethod.defaultMethod()); - } -} - -输出 : 9527 -``` -出现上面的情况时,会优先找继承树上近的方法,类似于“短路优先”。 -
-那么如果一个类实现了两个没有继承关系的接口,且这两个接口有同名方法的话会怎么样呢?IDE会要求你重写这个冲突的方法,让你自己选择去执行哪个方法,因为IDE它还没智能到你不告诉它,它就知道你想执行哪个方法。可以通过```java 接口名.super```指针来访问接口中定义的实例(default)方法。 -```java -interface Default { - default int defaultMethod() { - return 4396; - } -} - -interface Default2 { - default int defaultMethod() { - return 9527; - } -} -//如果不重写 -//compile error : defaults.DefaultMethod inherits unrelated defaults for defaultMethod() from types defaults.Default and defaults.Default2 -public class DefaultMethod implements Default,Default2 { -@Override - public int defaultMethod() { - System.out.println(Default.super.defaultMethod()); - System.out.println(Default2.super.defaultMethod()); - return 996; - } - public static void main(String[] args) { - DefaultMethod defaultMethod = new DefaultMethod(); - System.out.println(defaultMethod.defaultMethod()); - } -} - -运行输出 : -4396 -9527 -996 -``` - - -___ - - -##              改进的类型推断 -### 1.什么是类型推断 -类型推断就像它的字面意思一样,编译器根据你显示声明的已知的信息 推断出你没有显示声明的类型,这就是类型推断。 -看过《Java编程思想 第四版》的朋友可能还记得里面讲解泛型一章的时候,里面很多例子是下面这样的: -```java - Map map = new Map(); -``` -而我们平常写的都是这样的: -```java - Map map = new Map<>(); -``` -这就是类型推断,《Java编程思想 第四版》这本书出书的时候最新的JDK只有1.6(JDK7推出的类型推断),在Java编程思想里Bruce Eckel大叔还提到过这个问题 -(可能JDK的官方人员看了Bruce Eckel大叔的Thinking in Java才加的类型推断,☺),在JDK7中推出了上面这样的类型推断,可以减少一些无用的代码。 -(Java编程思想到现在还只有第四版,是不是因为Bruce Eckel大叔觉得Java新推出的语言特性“然并卵”呢?/滑稽) -
-在JDK7中,类型推断只有上面例子的那样的能力,即只有在使用**赋值语句**时才能自动推断出泛型参数信息(即<>里的信息),下面的官方文档里的例子在JDK7里会编译 -错误 -```java - List stringList = new ArrayList<>(); - stringList.add("A"); - //error : addAll(java.util.Collection)in List cannot be applied to (java.util.List) - stringList.addAll(Arrays.asList()); -``` -但是上面的代码在JDK8里可以通过,也就说,JDK8里,类型推断不仅可以用于赋值语句,而且可以根据代码中上下文里的信息推断出更多的信息,因此我们需要些的代码 -会更少。加强的类型推断还有一个就是用于Lambda表达式了。 -
-大家其实不必细究类型推断,在日常使用中IDE会自动判断,当IDE自己无法推断出足够的信息时,就需要我们额外做一下工作,比如在<>里添加更多的类型信息, -相信随着Java的进化,这些便利的功能会越来越强大。 - - -____ - - -##              通过反射获得方法的参数信息 -JDK8之前 .class文件是不会存储方法参数信息的,因此也就无法通过反射获取该信息(想想反射获取类信息的入口是什么?当然就是Class类了)。即是是在JDK11里 -也不会默认生成这些信息,可以通过在javac加上-parameters参数来让javac生成这些信息(javac就是java编译器,可以把java文件编译成.class文件)。生成额外 -的信息(运行时非必须信息)会消耗内存并且有可能公布敏感信息(某些方法参数比如password,JDK文档里这么说的),并且确实很多信息javac并不会为我们生成,比如 -LocalVariableTable,javac就不会默认生成,需要你加上 -g:vars来强制让编译器生成,同样的,方法参数信息也需要加上 --parameters来让javac为你在.class文件中生成这些信息,否则运行时反射是无法获取到这些信息的。在讲解Java语言层面的方法之前,先看一下javac加上该 -参数和不加生成的信息有什么区别(不感兴趣想直接看运行代码的可以跳过这段)。下面是随便写的一个类。 -```java -public class ByteCodeParameters { - public String simpleMethod(String canUGetMyName, Object yesICan) { - return "9527"; - } -} -``` -先来不加参数编译和反编译一下这个类javac ByteCodeParameters.java , javap -v ByteCodeParameters: -```java - //只截取了部分信息 - public java.lang.String simpleMethod(java.lang.String, java.lang.Object); - descriptor: (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String; - flags: (0x0001) ACC_PUBLIC - Code: - stack=1, locals=3, args_size=3 - 0: ldc #2 // String 9527 - 2: areturn - LineNumberTable: - line 5: 0 - //这个方法的描述到这里就结束了 -``` -接下来我们加上参数javac -parameters ByteCodeParameters.java 再来看反编译的信息: -```java - public java.lang.String simpleMethod(java.lang.String, java.lang.Object); - descriptor: (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String; - flags: (0x0001) ACC_PUBLIC - Code: - stack=1, locals=3, args_size=3 - 0: ldc #2 // String 9527 - 2: areturn - LineNumberTable: - line 8: 0 - MethodParameters: - Name Flags - canUGetMyName - yesICan -``` -可以看到.class文件里多了一个MethodParameters信息,这就是参数的名字,可以看到默认是不保存的。 -
下面看一下在Intelj Idea里运行的这个例子,我们试一下通过反射获取方法名 : -```java -public class ByteCodeParameters { - public String simpleMethod(String canUGetMyName, Object yesICan) { - return "9527"; - } - - public static void main(String[] args) throws NoSuchMethodException { - Class clazz = ByteCodeParameters.class; - Method simple = clazz.getDeclaredMethod("simpleMethod", String.class, Object.class); - Parameter[] parameters = simple.getParameters(); - for (Parameter p : parameters) { - System.out.println(p.getName()); - } - } -} -输出 : -arg0 -arg1 -``` -???说好的方法名呢????别急,哈哈。前面说了,默认是不生成参数名信息的,因此我们需要做一些配置,我们找到IDEA的settings里的Java Compiler选项,在 -Additional command line parameters:一行加上-parameters(Eclipse 也是找到Java Compiler选中Stoer information about method parameters),或者自 -己编译一个.class文件放在IDEA的out下,然后再来运行 : -```java -输出 : -canUGetMyName -yesICan -``` -这样我们就通过反射获取到参数信息了。想要了解更多的同学可以自己研究一下 [官方文档] -(https://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html) -
-## 总结与补充 -在JDK8之后,可以通过-parameters参数来让编译器生成参数信息然后在运行时通过反射获取方法参数信息,其实在SpringFramework -里面也有一个LocalVariableTableParameterNameDiscoverer对象可以获取方法参数名信息,有兴趣的同学可以自行百度(这个类在打印日志时可能会比较有用吧,个人感觉)。 - -____ - - - - -___ diff --git a/docs/java/What's New in JDK8/Stream.md b/docs/java/What's New in JDK8/Stream.md deleted file mode 100644 index de7c86e3f2e..00000000000 --- a/docs/java/What's New in JDK8/Stream.md +++ /dev/null @@ -1,75 +0,0 @@ -Stream API 旨在让编码更高效率、干净、简洁。 - -### 从迭代器到Stream操作 - -当使用 `Stream` 时,我们一般会通过三个阶段建立一个流水线: - -1. 创建一个 `Stream`; -2. 进行一个或多个中间操作; -3. 使用终止操作产生一个结果,`Stream` 就不会再被使用了。 - -**案例1:统计 List 中的单词长度大于6的个数** - -```java -/** -* 案例1:统计 List 中的单词长度大于6的个数 -*/ -ArrayList wordsList = new ArrayList(); -wordsList.add("Charles"); -wordsList.add("Vincent"); -wordsList.add("William"); -wordsList.add("Joseph"); -wordsList.add("Henry"); -wordsList.add("Bill"); -wordsList.add("Joan"); -wordsList.add("Linda"); -int count = 0; -``` -Java8之前我们通常用迭代方法来完成上面的需求: - -```java -//迭代(Java8之前的常用方法) -//迭代不好的地方:1. 代码多;2 很难被并行运算。 -for (String word : wordsList) { - if (word.length() > 6) { - count++; - } -} -System.out.println(count);//3 -``` -Java8之前我们使用 `Stream` 一行代码就能解决了,而且可以瞬间转换为并行执行的效果: - -```java -//Stream -//将stream()改为parallelStream()就可以瞬间将代码编程并行执行的效果 -long count2=wordsList.stream() - .filter(w->w.length()>6) - .count(); -long count3=wordsList.parallelStream() - .filter(w->w.length()>6) - .count(); -System.out.println(count2); -System.out.println(count3); -``` - -### `distinct()` - -去除 List 中重复的 String - -```java -List list = list.stream() - .distinct() - .collect(Collectors.toList()); -``` - -### `map` - -map 方法用于映射每个元素到对应的结果,以下代码片段使用 map 输出了元素对应的平方数: - -```java -List numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); -// 获取 List 中每个元素对应的平方数并去重 -List squaresList = numbers.stream().map( i -> i*i).distinct().collect(Collectors.toList()); -System.out.println(squaresList.toString());//[9, 4, 49, 25] -``` - diff --git "a/docs/java/What's New in JDK8/\346\224\271\350\277\233\347\232\204\347\261\273\345\236\213\346\216\250\346\226\255.md" "b/docs/java/What's New in JDK8/\346\224\271\350\277\233\347\232\204\347\261\273\345\236\213\346\216\250\346\226\255.md" deleted file mode 100644 index b5cff7bb0c0..00000000000 --- "a/docs/java/What's New in JDK8/\346\224\271\350\277\233\347\232\204\347\261\273\345\236\213\346\216\250\346\226\255.md" +++ /dev/null @@ -1,30 +0,0 @@ -##              改进的类型推断 -### 1.什么是类型推断 -类型推断就像它的字面意思一样,编译器根据你显示声明的已知的信息 推断出你没有显示声明的类型,这就是类型推断。 -看过《Java编程思想 第四版》的朋友可能还记得里面讲解泛型一章的时候,里面很多例子是下面这样的: -```java - Map map = new Map(); -``` -而我们平常写的都是这样的: -```java - Map map = new Map<>(); -``` -这就是类型推断,《Java编程思想 第四版》这本书出书的时候最新的JDK只有1.6(JDK7推出的类型推断),在Java编程思想里Bruce Eckel大叔还提到过这个问题 -(可能JDK的官方人员看了Bruce Eckel大叔的Thinking in Java才加的类型推断,☺),在JDK7中推出了上面这样的类型推断,可以减少一些无用的代码。 -(Java编程思想到现在还只有第四版,是不是因为Bruce Eckel大叔觉得Java新推出的语言特性“然并卵”呢?/滑稽) -
-在JDK7中,类型推断只有上面例子的那样的能力,即只有在使用**赋值语句**时才能自动推断出泛型参数信息(即<>里的信息),下面的官方文档里的例子在JDK7里会编译 -错误 -```java - List stringList = new ArrayList<>(); - stringList.add("A"); - //error : addAll(java.util.Collection)in List cannot be applied to (java.util.List) - stringList.addAll(Arrays.asList()); -``` -但是上面的代码在JDK8里可以通过,也就说,JDK8里,类型推断不仅可以用于赋值语句,而且可以根据代码中上下文里的信息推断出更多的信息,因此我们需要些的代码 -会更少。加强的类型推断还有一个就是用于Lambda表达式了。 -
-大家其实不必细究类型推断,在日常使用中IDE会自动判断,当IDE自己无法推断出足够的信息时,就需要我们额外做一下工作,比如在<>里添加更多的类型信息, -相信随着Java的进化,这些便利的功能会越来越强大。 - - diff --git "a/docs/java/What's New in JDK8/\351\200\232\350\277\207\345\217\215\345\260\204\350\216\267\345\276\227\346\226\271\346\263\225\347\232\204\345\217\202\346\225\260\344\277\241\346\201\257.md" "b/docs/java/What's New in JDK8/\351\200\232\350\277\207\345\217\215\345\260\204\350\216\267\345\276\227\346\226\271\346\263\225\347\232\204\345\217\202\346\225\260\344\277\241\346\201\257.md" deleted file mode 100644 index a1d91c4b2fe..00000000000 --- "a/docs/java/What's New in JDK8/\351\200\232\350\277\207\345\217\215\345\260\204\350\216\267\345\276\227\346\226\271\346\263\225\347\232\204\345\217\202\346\225\260\344\277\241\346\201\257.md" +++ /dev/null @@ -1,79 +0,0 @@ -##              通过反射获得方法的参数信息 -JDK8之前 .class文件是不会存储方法参数信息的,因此也就无法通过反射获取该信息(想想反射获取类信息的入口是什么?当然就是Class类了)。即是是在JDK11里 -也不会默认生成这些信息,可以通过在javac加上-parameters参数来让javac生成这些信息(javac就是java编译器,可以把java文件编译成.class文件)。生成额外 -的信息(运行时非必须信息)会消耗内存并且有可能公布敏感信息(某些方法参数比如password,JDK文档里这么说的),并且确实很多信息javac并不会为我们生成,比如 -LocalVariableTable,javac就不会默认生成,需要你加上 -g:vars来强制让编译器生成,同样的,方法参数信息也需要加上 --parameters来让javac为你在.class文件中生成这些信息,否则运行时反射是无法获取到这些信息的。在讲解Java语言层面的方法之前,先看一下javac加上该 -参数和不加生成的信息有什么区别(不感兴趣想直接看运行代码的可以跳过这段)。下面是随便写的一个类。 -```java -public class ByteCodeParameters { - public String simpleMethod(String canUGetMyName, Object yesICan) { - return "9527"; - } -} -``` -先来不加参数编译和反编译一下这个类javac ByteCodeParameters.java , javap -v ByteCodeParameters: -```java - //只截取了部分信息 - public java.lang.String simpleMethod(java.lang.String, java.lang.Object); - descriptor: (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String; - flags: (0x0001) ACC_PUBLIC - Code: - stack=1, locals=3, args_size=3 - 0: ldc #2 // String 9527 - 2: areturn - LineNumberTable: - line 5: 0 - //这个方法的描述到这里就结束了 -``` -接下来我们加上参数javac -parameters ByteCodeParameters.java 再来看反编译的信息: -```java - public java.lang.String simpleMethod(java.lang.String, java.lang.Object); - descriptor: (Ljava/lang/String;Ljava/lang/Object;)Ljava/lang/String; - flags: (0x0001) ACC_PUBLIC - Code: - stack=1, locals=3, args_size=3 - 0: ldc #2 // String 9527 - 2: areturn - LineNumberTable: - line 8: 0 - MethodParameters: - Name Flags - canUGetMyName - yesICan -``` -可以看到.class文件里多了一个MethodParameters信息,这就是参数的名字,可以看到默认是不保存的。 -
下面看一下在Intelj Idea里运行的这个例子,我们试一下通过反射获取方法名 : -```java -public class ByteCodeParameters { - public String simpleMethod(String canUGetMyName, Object yesICan) { - return "9527"; - } - - public static void main(String[] args) throws NoSuchMethodException { - Class clazz = ByteCodeParameters.class; - Method simple = clazz.getDeclaredMethod("simpleMethod", String.class, Object.class); - Parameter[] parameters = simple.getParameters(); - for (Parameter p : parameters) { - System.out.println(p.getName()); - } - } -} -输出 : -arg0 -arg1 -``` -???说好的方法名呢????别急,哈哈。前面说了,默认是不生成参数名信息的,因此我们需要做一些配置,我们找到IDEA的settings里的Java Compiler选项,在 -Additional command line parameters:一行加上-parameters(Eclipse 也是找到Java Compiler选中Stoer information about method parameters),或者自 -己编译一个.class文件放在IDEA的out下,然后再来运行 : -```java -输出 : -canUGetMyName -yesICan -``` -这样我们就通过反射获取到参数信息了。想要了解更多的同学可以自己研究一下 [官方文档] -(https://docs.oracle.com/javase/tutorial/reflect/member/methodparameterreflection.html) -
-## 总结与补充 -在JDK8之后,可以通过-parameters参数来让编译器生成参数信息然后在运行时通过反射获取方法参数信息,其实在SpringFramework -里面也有一个LocalVariableTableParameterNameDiscoverer对象可以获取方法参数名信息,有兴趣的同学可以自行百度(这个类在打印日志时可能会比较有用吧,个人感觉)。 From 8705227daf39fa097b6f65ab3b028ffe4a9160ac Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Wed, 21 Aug 2019 21:46:20 +0800 Subject: [PATCH 071/130] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 9b48d692ff6..412acc615e2 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,7 @@ * [Java 8 新特性总结](docs/java/What's%20New%20in%20JDK8/Java8Tutorial.md) * [Java 8 学习资源推荐](docs/java/What's%20New%20in%20JDK8/Java8教程推荐.md) +* [Java8 forEach 指南](docs/java/What's%20New%20in%20JDK8/Java8foreach指南.md) ### 编程规范 From 27f8743a0a329ebb79ce70acd5da5627e8fee325 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sat, 24 Aug 2019 15:10:00 +0800 Subject: [PATCH 072/130] Update SpringInterviewQuestions.md --- .../framework/spring/SpringInterviewQuestions.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index 3f97330b012..335af8b2411 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -270,12 +270,21 @@ public OneService getService(status) { - **TransactionDefinition.PROPAGATION_NESTED:** 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。 +## @Transactional(rollbackFor = Exception.class)注解了解吗? + +我们知道:Exception分为运行时异常RuntimeException和非运行时异常。事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。 + +当`@Transactional`注解作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。如果类或者方法加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。 + +在`@Transactional`注解中如果不配置`rollbackFor`属性,那么事物只会在遇到`RuntimeException`的时候才会回滚,加上`rollbackFor=Exception.class`,可以让事物在遇到非运行时异常时也回滚 + ## 参考 - 《Spring 技术内幕》 - - - +- https://www.cnblogs.com/clwydjgs/p/9317849.html - - - From 2bab5955fc89631eba4e2f72b4d07efb1c8c47da Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sat, 24 Aug 2019 16:14:43 +0800 Subject: [PATCH 073/130] Update SpringInterviewQuestions.md --- .../spring/SpringInterviewQuestions.md | 40 ++++++++++++++++++- 1 file changed, 39 insertions(+), 1 deletion(-) diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index 335af8b2411..f1a4a625926 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -51,6 +51,8 @@ Spring 官网列出的 Spring 的 6 个特征: - **Spring Web** : 为创建Web应用程序提供支持。 - **Spring Test** : 提供了对 JUnit 和 TestNG 测试的支持。 + + ## 谈谈自己对于 Spring IoC 和 AOP 的理解 ### IoC @@ -276,7 +278,43 @@ public OneService getService(status) { 当`@Transactional`注解作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。如果类或者方法加了这个注解,那么这个类里面的方法抛出异常,就会回滚,数据库里面的数据也会回滚。 -在`@Transactional`注解中如果不配置`rollbackFor`属性,那么事物只会在遇到`RuntimeException`的时候才会回滚,加上`rollbackFor=Exception.class`,可以让事物在遇到非运行时异常时也回滚 +在`@Transactional`注解中如果不配置`rollbackFor`属性,那么事物只会在遇到`RuntimeException`的时候才会回滚,加上`rollbackFor=Exception.class`,可以让事物在遇到非运行时异常时也回滚。 + +## 如何使用JPA在数据库中非持久化一个字段? + +假如我们有有下面一个类: + +```java +Entity(name="USER") +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.AUTO) + @Column(name = "ID") + private Long id; + + @Column(name="USER_NAME") + private String userName; + + @Column(name="PASSWORD") + private String password; + + private String secrect; + +} +``` + +如果我们想让`secrect` 这个字段不被持久化,也就是不被数据库存储怎么办?我们可以采用下面几种方法: + +```java +static String transient1; // not persistent because of static +final String transient2 = “Satish”; // not persistent because of final +transient String transient3; // not persistent because of transient +@Transient +String transient4; // not persistent because of @Transient +``` + +一般使用后面两种方式比较多,我个人使用注解的方式比较多。 ## 参考 From 2c1fa99d4a8f61d4967b9aa9095c21d544588487 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sat, 24 Aug 2019 16:14:47 +0800 Subject: [PATCH 074/130] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 412acc615e2..732d65b598b 100644 --- a/README.md +++ b/README.md @@ -176,7 +176,6 @@ - [Spring中bean的作用域与生命周期](docs/system-design/framework/spring/SpringBean.md) - [SpringMVC 工作原理详解](docs/system-design/framework/spring/SpringMVC-Principle.md) - [Spring中都用到了那些设计模式?](docs/system-design/framework/spring/Spring-Design-Patterns.md) -- [RestControllerVSController](docs/system-design/framework/spring/RestControllerVSController.md) #### ZooKeeper From 2d57ac92413f6f8a3ab42f9328bb240a813daf9f Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sat, 24 Aug 2019 16:15:27 +0800 Subject: [PATCH 075/130] Delete RestControllerVSController.md --- .../spring/RestControllerVSController.md | 145 ------------------ 1 file changed, 145 deletions(-) delete mode 100644 docs/system-design/framework/spring/RestControllerVSController.md diff --git a/docs/system-design/framework/spring/RestControllerVSController.md b/docs/system-design/framework/spring/RestControllerVSController.md deleted file mode 100644 index de9de0c87c7..00000000000 --- a/docs/system-design/framework/spring/RestControllerVSController.md +++ /dev/null @@ -1,145 +0,0 @@ -周末的时候分享了一个技术session,讲到了@RestController 和 @Controller,当时没有太讲清楚,因为 team 里很多同事之前不是做 Java的,所以对这两个东西不太熟悉,于是写了篇文章整理了一下。 - -## @RestController vs @Controller - -### Controller 返回一个页面 - -单独使用 `@Controller` 不加 `@ResponseBody`的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况。 - -![SpringMVC 传统工作流程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringMVC传统工作流程.png) - -### @RestController 返回JSON 或 XML 形式数据 - -但`@RestController`只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。 - -![SpringMVC+RestController](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringMVCRestController.png) - -### @Controller +@ResponseBody 返回JSON 或 XML 形式数据 - -如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用`@Controller` 并结合`@ResponseBody`注解,也就是说`@Controller` +`@ResponseBody`= `@RestController`(Spring 4 之后新加的注解)。 - -> `@ResponseBody` 注解的作用是将 `Controller` 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到HTTP 响应(Response)对象的 body 中,通常用来返回 JSON 或者 XML 数据,返回 JSON 数据的情况比较多。 - -![Spring3.xMVC RESTfulWeb服务工作流程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Spring3.xMVCRESTfulWeb服务工作流程.png) - -Reference: - -- https://dzone.com/articles/spring-framework-restcontroller-vs-controller(图片来源) -- https://javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html?m=1 - -### 示例1: @Controller 返回一个页面 - -当我们需要直接在后端返回一个页面的时候,Spring 推荐使用 Thymeleaf 模板引擎。Spring MVC中`@Controller`中的方法可以直接返回模板名称,接下来 Thymeleaf 模板引擎会自动进行渲染,模板中的表达式支持Spring表达式语言(Spring EL)。**如果需要用到 Thymeleaf 模板引擎,注意添加依赖!不然会报错。** - -Gradle: - -```groovy - compile 'org.springframework.boot:spring-boot-starter-thymeleaf' -``` - -Maven: - -```xml - - org.springframework.boot - spring-boot-starter-thymeleaf - -``` - -`src/main/java/com/example/demo/controller/HelloController.java` - -```java -@Controller -public class HelloController { - @GetMapping("/hello") - public String greeting(@RequestParam(name = "name", required = false, defaultValue = "World") String name, Model model) { - model.addAttribute("name", name); - return "hello"; - } -} -``` -`src/main/resources/templates/hello.html` - -Spring 会去 resources 目录下 templates 目录下找,所以建议把页面放在 resources/templates 目录下 - -```html - - - - Getting Started: Serving Web Content - - - -

- - -``` - -访问:http://localhost:8999/hello?name=team-c ,你将看到下面的内容 - -``` -Hello, team-c! -``` - -如果要对页面在templates目录下的hello文件夹中的话,返回页面的时候像下面这样写就可以了。 - -`src/main/resources/templates/hello/hello.html` - -```java - return "hello/hello"; -``` - -### 示例2: @Controller+@ResponseBody 返回 JSON 格式数据 - -**SpringBoot 默认集成了 jackson ,对于此需求你不需要添加任何相关依赖。** - -`src/main/java/com/example/demo/controller/Person.java` - -```java -public class Person { - private String name; - private Integer age; - ...... - 省略getter/setter ,有参和无参的construtor方法 -} - -``` - -`src/main/java/com/example/demo/controller/HelloController.java` - -```java -@Controller -public class HelloController { - @PostMapping("/hello") - @ResponseBody - public Person greeting(@RequestBody Person person) { - return person; - } - -} -``` - -使用 post 请求访问 http://localhost:8080/hello ,body 中附带以下参数,后端会以json 格式将 person 对象返回。 - -```json -{ - "name": "teamc", - "age": 1 -} -``` - -### 示例3: @RestController 返回 JSON 格式数据 - -只需要将`HelloController`改为如下形式: - -```java -@RestController -public class HelloController { - @PostMapping("/hello") - public Person greeting(@RequestBody Person person) { - return person; - } - -} -``` - From d8d16a729fe1d6d3185ac82943da428e959483bf Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sat, 24 Aug 2019 16:21:11 +0800 Subject: [PATCH 076/130] Update SpringInterviewQuestions.md --- .../spring/SpringInterviewQuestions.md | 37 ++++++++++++++++++- 1 file changed, 36 insertions(+), 1 deletion(-) diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index f1a4a625926..d62924add14 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -2,7 +2,13 @@ - [什么是 Spring 框架?](#什么是-spring-框架) - [列举一些重要的Spring模块?](#列举一些重要的spring模块) +- [@RestController vs @Controller](#restcontroller-vs-controller) + - [Controller 返回一个页面](#controller-返回一个页面) + - [@RestController 返回JSON 或 XML 形式数据](#restcontroller-返回json-或-xml-形式数据) + - [@Controller +@ResponseBody 返回JSON 或 XML 形式数据](#controller-responsebody-返回json-或-xml-形式数据) - [谈谈自己对于 Spring IoC 和 AOP 的理解](#谈谈自己对于-spring-ioc-和-aop-的理解) + - [IoC](#ioc) + - [AOP](#aop) - [Spring AOP 和 AspectJ AOP 有什么区别?](#spring-aop-和-aspectj-aop-有什么区别) - [Spring 中的 bean 的作用域有哪些?](#spring-中的-bean-的作用域有哪些) - [Spring 中的单例 bean 的线程安全问题了解吗?](#spring-中的单例-bean-的线程安全问题了解吗) @@ -15,7 +21,10 @@ - [Spring 管理事务的方式有几种?](#spring-管理事务的方式有几种) - [Spring 事务中的隔离级别有哪几种?](#spring-事务中的隔离级别有哪几种) - [Spring 事务中哪几种事务传播行为?](#spring-事务中哪几种事务传播行为) +- [@Transactional(rollbackFor = Exception.class)注解了解吗?](#transactionalrollbackfor--exceptionclass注解了解吗) +- [如何使用JPA在数据库中非持久化一个字段?](#如何使用jpa在数据库中非持久化一个字段) - [参考](#参考) +- [公众号](#公众号) @@ -51,7 +60,32 @@ Spring 官网列出的 Spring 的 6 个特征: - **Spring Web** : 为创建Web应用程序提供支持。 - **Spring Test** : 提供了对 JUnit 和 TestNG 测试的支持。 +## @RestController vs @Controller +### Controller 返回一个页面 + +单独使用 `@Controller` 不加 `@ResponseBody`的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况。 + +![SpringMVC 传统工作流程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringMVC传统工作流程.png) + +### @RestController 返回JSON 或 XML 形式数据 + +但`@RestController`只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。 + +![SpringMVC+RestController](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringMVCRestController.png) + +### @Controller +@ResponseBody 返回JSON 或 XML 形式数据 + +如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用`@Controller` 并结合`@ResponseBody`注解,也就是说`@Controller` +`@ResponseBody`= `@RestController`(Spring 4 之后新加的注解)。 + +> `@ResponseBody` 注解的作用是将 `Controller` 的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到HTTP 响应(Response)对象的 body 中,通常用来返回 JSON 或者 XML 数据,返回 JSON 数据的情况比较多。 + +![Spring3.xMVC RESTfulWeb服务工作流程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Spring3.xMVCRESTfulWeb服务工作流程.png) + +Reference: + +- https://dzone.com/articles/spring-framework-restcontroller-vs-controller(图片来源) +- https://javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html?m=1 ## 谈谈自己对于 Spring IoC 和 AOP 的理解 @@ -327,7 +361,7 @@ String transient4; // not persistent because of @Transient - - -### 公众号 +## 公众号 如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。 @@ -336,3 +370,4 @@ String transient4; // not persistent because of @Transient **Java工程师必备学习资源:** 一些Java工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。 ![我的公众号](https://user-gold-cdn.xitu.io/2018/11/28/167598cd2e17b8ec?w=258&h=258&f=jpeg&s=27334) + From 79cfdc14c6a922992ce0a39e009683182567aa62 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sat, 24 Aug 2019 17:58:32 +0800 Subject: [PATCH 077/130] Update HashMap.md --- docs/java/collection/HashMap.md | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/java/collection/HashMap.md b/docs/java/collection/HashMap.md index 716bb1f34a5..80cd8b571bc 100644 --- a/docs/java/collection/HashMap.md +++ b/docs/java/collection/HashMap.md @@ -56,7 +56,7 @@ static int hash(int h) { 所谓 **“拉链法”** 就是:将链表和数组相结合。也就是说创建一个链表数组,数组中每一格就是一个链表。若遇到哈希冲突,则将冲突的值加到链表中即可。 -![jdk1.8之前的内部结构](https://user-gold-cdn.xitu.io/2018/3/20/16240dbcc303d872?w=348&h=427&f=png&s=10991) +![jdk1.8之前的内部结构](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/jdk1.8之前的内部结构.png) ### JDK1.8之后 相比于之前的版本,jdk1.8在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间。 @@ -170,7 +170,9 @@ static final class TreeNode extends LinkedHashMap.Entry { ``` ## HashMap源码分析 ### 构造方法 -![四个构造方法](https://user-gold-cdn.xitu.io/2018/3/20/162410d912a2e0e1?w=336&h=90&f=jpeg&s=26744) + +HashMap 中有四个构造方法,它们分别如下: + ```java // 默认构造函数。 public HashMap() { @@ -237,9 +239,7 @@ HashMap只提供了put用于添加元素,putVal方法只是给put方法调用 - ①如果定位到的数组位置没有元素 就直接插入。 - ②如果定位到的数组位置有元素就和要插入的key比较,如果key相同就直接覆盖,如果key不相同,就判断p是否是一个树节点,如果是就调用`e = ((TreeNode)p).putTreeVal(this, tab, hash, key, value)`将元素添加进入。如果不是就遍历链表插入(插入的是链表尾部)。 - - -![put方法](https://user-gold-cdn.xitu.io/2018/9/2/16598bf758c747e6?w=999&h=679&f=png&s=54486) +![put方法](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/put方法.png) ```java public V put(K key, V value) { From 2c5a0603d4069ec62aaf6df609022927d0f14b5f Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sun, 25 Aug 2019 11:35:11 +0800 Subject: [PATCH 078/130] Update README.md --- README.md | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 732d65b598b..2d5e0d41548 100644 --- a/README.md +++ b/README.md @@ -61,7 +61,7 @@ - [工具](#工具) - [Git](#git) - [Docker](#Docker) -- [资料](#资料) +- [资源](#资源) - [书单](#书单) - [Github榜单](#Github榜单) - [待办](#待办) @@ -232,13 +232,17 @@ * [Docker 入门](docs/tools/Docker.md) * [一文搞懂 Docker 镜像的常用操作!](docs/tools/Docker-Image.md) -## 资料 +## 资源 ### 书单 - [Java程序员必备书单](docs/data/java-recommended-books.md) -### Github榜单 +### 实战项目推荐 + +- [onemall](https://github.com/YunaiV/onemall) : mall 商城,基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba 。 + +### Github 历史榜单 - [Java 项目月榜单](docs/github-trending/JavaGithubTrending.md) From c3b7445b02a288de20cf177af5451592b83a32d2 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Mon, 26 Aug 2019 23:42:18 +0800 Subject: [PATCH 079/130] =?UTF-8?q?Update=20=E7=BE=8E=E5=9B=A2=E9=9D=A2?= =?UTF-8?q?=E8=AF=95=E5=B8=B8=E8=A7=81=E9=97=AE=E9=A2=98=E6=80=BB=E7=BB=93?= =?UTF-8?q?.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/essential-content-for-interview/PreparingForInterview/\347\276\216\345\233\242\351\235\242\350\257\225\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" "b/docs/essential-content-for-interview/PreparingForInterview/\347\276\216\345\233\242\351\235\242\350\257\225\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" index 6cf8973f2d9..a76eed84b81 100644 --- "a/docs/essential-content-for-interview/PreparingForInterview/\347\276\216\345\233\242\351\235\242\350\257\225\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" +++ "b/docs/essential-content-for-interview/PreparingForInterview/\347\276\216\345\233\242\351\235\242\350\257\225\345\270\270\350\247\201\351\227\256\351\242\230\346\200\273\347\273\223.md" @@ -108,7 +108,7 @@ request.getRequestDispatcher("login_success.jsp").forward(request, response); ``` -**重定向(Redirect)** 是利用服务器返回的状态吗来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过HttpServletRequestResponse的setStatus(int status)方法设置状态码。如果服务器返回301或者302,则浏览器会到新的网址重新请求该资源。 +**重定向(Redirect)** 是利用服务器返回的状态码来实现的。客户端浏览器请求服务器的时候,服务器会返回一个状态码。服务器通过HttpServletRequestResponse的setStatus(int status)方法设置状态码。如果服务器返回301或者302,则浏览器会到新的网址重新请求该资源。 1. **从地址栏显示来说**:forward是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器。浏览器根本不知道服务器发送的内容从哪里来的,所以它的地址栏还是原来的地址。redirect是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址。所以地址栏显示的是新的URL。 2. **从数据共享来说**:forward:转发页面和转发到的页面可以共享request里面的数据。redirect:不能共享数据。 From 1ecb96da0f004bc11439d4a0b36a5f2be709d3dd Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Mon, 26 Aug 2019 23:42:21 +0800 Subject: [PATCH 080/130] Update Shell.md --- docs/operating-system/Shell.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/operating-system/Shell.md b/docs/operating-system/Shell.md index c79c4c7e5ff..4a89061fc27 100644 --- a/docs/operating-system/Shell.md +++ b/docs/operating-system/Shell.md @@ -290,7 +290,7 @@ for i in ${array[@]};do echo $i ;done # 遍历数组,数组元素为空,没 a=3;b=3; val=`expr $a + $b` #输出:Total value : 6 -echo "Total value : $val +echo "Total value : $val" ``` From 9ff5f0114ac1785b2f5b90cd034ce2dbe7119bb0 Mon Sep 17 00:00:00 2001 From: Art Date: Tue, 27 Aug 2019 09:16:34 +0800 Subject: [PATCH 081/130] =?UTF-8?q?Update=20=E5=B9=B2=E8=B4=A7=EF=BC=9A?= =?UTF-8?q?=E8=AE=A1=E7=AE=97=E6=9C=BA=E7=BD=91=E7=BB=9C=E7=9F=A5=E8=AF=86?= =?UTF-8?q?=E6=80=BB=E7=BB=93.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" "b/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" index eb4a501f008..216a1a22f3c 100644 --- "a/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" +++ "b/docs/network/\345\271\262\350\264\247\357\274\232\350\256\241\347\256\227\346\234\272\347\275\221\347\273\234\347\237\245\350\257\206\346\200\273\347\273\223.md" @@ -54,7 +54,7 @@ 3,路由器是实现分组交换的关键构件,其任务是转发收到的分组,这是网络核心部分最重要的功能。分组交换采用存储转发技术,表示把一个报文(要发送的整块数据)分为几个分组后再进行传送。在发送报文之前,先把较长的报文划分成为一个个更小的等长数据段。在每个数据端的前面加上一些由必要的控制信息组成的首部后,就构成了一个分组。分组又称为包。分组是在互联网中传送的数据单元,正是由于分组的头部包含了诸如目的地址和源地址等重要控制信息,每一个分组才能在互联网中独立的选择传输路径,并正确地交付到分组传输的终点。 -4,互联网按工作方式可划分为边缘部分和核心部分。主机在网络的边缘部分,其作用是进行信息处理。由大量网络和连接这些网络的路由器组成边缘部分,其作用是提供连通性和交换。 +4,互联网按工作方式可划分为边缘部分和核心部分。主机在网络的边缘部分,其作用是进行信息处理。由大量网络和连接这些网络的路由器组成核心部分,其作用是提供连通性和交换。 5,计算机通信是计算机中进程(即运行着的程序)之间的通信。计算机网络采用的通信方式是客户-服务器方式(C/S方式)和对等连接方式(P2P方式)。 From 4286fc005e85085a0d9785932ce6b6dfdd71885f Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Wed, 28 Aug 2019 10:25:33 +0800 Subject: [PATCH 082/130] Update README.md --- README.md | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/README.md b/README.md index 2d5e0d41548..4d77af090c3 100644 --- a/README.md +++ b/README.md @@ -16,18 +16,6 @@ 投稿

-

Special Sponsors

-

- - - 零成本开启敏捷研发 - -

- 推荐使用 https://snailclimb.top/JavaGuide/ 在线阅读(访问速度慢的话,请使用 https://snailclimb.gitee.io/javaguide ),在线阅读内容本仓库同步一致。这种方式阅读的优势在于:有侧边栏阅读体验更好,Gitee pages 的访问速度相对来说也比较快。 ## 目录 From 1e1ded75544873856aff03cee23b601ee7a193f4 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Wed, 28 Aug 2019 23:02:25 +0800 Subject: [PATCH 083/130] Create springboot-questions.md --- .../framework/spring/springboot-questions.md | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 docs/system-design/framework/spring/springboot-questions.md diff --git a/docs/system-design/framework/spring/springboot-questions.md b/docs/system-design/framework/spring/springboot-questions.md new file mode 100644 index 00000000000..0ffa647b112 --- /dev/null +++ b/docs/system-design/framework/spring/springboot-questions.md @@ -0,0 +1,27 @@ + + +> 本文由JavaGuide整理翻译自(做了适当删减和修改): +> +> - https://www.javaguides.net/2018/11/spring-boot-interview-questions-and-answers.html +> - https://www.algrim.co/posts/101-spring-boot-interview-questions + +### 1. 什么是 Spring Boot? + +首先,重要的是要理解 Spring Boot 并不是一个框架,它是一种创建独立应用程序的更简单方法,只需要很少或没有配置(相比于 Spring 来说)。Spring Boot最好的特性之一是它利用现有的 Spring 项目和第三方项目来开发适合生产的应用程序。 + +### 2. 说出使用Spring Boot的主要优点 + +1. 开发基于 Spring 的应用程序很容易。 +2. Spring Boot 项目所需的开发或工程时间明显减少,通常会提高整体生产力。 +3. Spring Boot不需要编写大量样板代码、XML配置和注释。 +4. Spring引导应用程序可以很容易地与Spring生态系统集成,如Spring JDBC、Spring ORM、Spring Data、Spring Security等。 +5. Spring Boot遵循“固执己见的默认配置”,以减少开发工作(默认配置可以修改)。 +6. Spring Boot 应用程序提供嵌入式HTTP服务器,如Tomcat和Jetty,可以轻松地开发和测试web应用程序。(这点很赞!普通运行Java程序的方式就能运行基于Spring Boot web 项目,省事很多) +7. Spring Boot提供命令行接口(CLI)工具,用于开发和测试Spring Boot应用程序,如Java或Groovy。 +8. Spring Boot提供了多种插件,可以使用内置工具(如Maven和Gradle)开发和测试Spring Boot应用程序。 + +### 为什么需要Spring Boot? + +Spring Framework旨在简化J2EE企业应用程序开发。Spring Boot Framework旨在简化Spring开发。 + +![why-we-need-springboot](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/why-we-need-springboot.png) \ No newline at end of file From 3ef9627a2ac2ea39f4b62708395a92d5507ffa2e Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Thu, 29 Aug 2019 14:06:42 +0800 Subject: [PATCH 084/130] Update springboot-questions.md --- docs/system-design/framework/spring/springboot-questions.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/docs/system-design/framework/spring/springboot-questions.md b/docs/system-design/framework/spring/springboot-questions.md index 0ffa647b112..dee84784ba8 100644 --- a/docs/system-design/framework/spring/springboot-questions.md +++ b/docs/system-design/framework/spring/springboot-questions.md @@ -24,4 +24,8 @@ Spring Framework旨在简化J2EE企业应用程序开发。Spring Boot Framework旨在简化Spring开发。 -![why-we-need-springboot](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/why-we-need-springboot.png) \ No newline at end of file +![why-we-need-springboot](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/why-we-need-springboot.png) + +### 什么是 Spring Boot Starters? + +Spring Boot Starters 是一系列 \ No newline at end of file From 5720352f4f6ceb8e0b776117127c1f0e56de762e Mon Sep 17 00:00:00 2001 From: HanSai Date: Fri, 30 Aug 2019 11:53:43 +0800 Subject: [PATCH 085/130] Update MySQL Index.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit MySQLS.7 改为 MySQL 5.7 --- docs/database/MySQL Index.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/database/MySQL Index.md b/docs/database/MySQL Index.md index e2e9dc534db..b25589fc7d2 100644 --- a/docs/database/MySQL Index.md +++ b/docs/database/MySQL Index.md @@ -70,7 +70,7 @@ select * from user where city=xx ; // 无法命中索引 冗余索引指的是索引的功能相同,能够命中 就肯定能命中 ,那么 就是冗余索引如(name,city )和(name )这两个索引就是冗余索引,能够命中后者的查询肯定是能够命中前者的 在大多数情况下,都应该尽量扩展已有的索引而不是创建新索引。 -MySQLS.7 版本后,可以通过查询 sys 库的 `schema_redundant_indexes` 表来查看冗余索引 +MySQL 5.7 版本后,可以通过查询 sys 库的 `schema_redundant_indexes` 表来查看冗余索引 ### Mysql如何为表字段添加索引??? From 277157338bab5979c194e34b366939ffd340f17c Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Mon, 2 Sep 2019 10:32:48 +0800 Subject: [PATCH 086/130] Update Redis.md --- docs/database/Redis/Redis.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/database/Redis/Redis.md b/docs/database/Redis/Redis.md index 52efa5ad02c..5aaf549f964 100644 --- a/docs/database/Redis/Redis.md +++ b/docs/database/Redis/Redis.md @@ -251,6 +251,11 @@ Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务(transaction)功能。 在传统的关系式数据库中,常常用 ACID 性质来检验事务功能的可靠性和安全性。在 Redis 中,事务总是具有原子性(Atomicity)、一致性(Consistency)和隔离性(Isolation),并且当 Redis 运行在某种特定的持久化模式下时,事务也具有持久性(Durability)。 +补充内容: + +> 1. redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。(来自[issue:关于Redis事务不是原子性问题](https://github.com/Snailclimb/JavaGuide/issues/452) ) +> 2. + ### 缓存雪崩和缓存穿透问题解决方案 **缓存雪崩** From 90883996fab6a4edefba9c7ce4d08e72c15126c6 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Tue, 3 Sep 2019 09:04:23 +0800 Subject: [PATCH 087/130] Update SpringInterviewQuestions.md --- .../framework/spring/SpringInterviewQuestions.md | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index d62924add14..abf57c502d1 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -28,7 +28,7 @@ -这篇文章主要是想通过一些问题,加深大家对于 Spring 的理解,所以不会涉及太多的代码!这篇文章整理了挺长时间,下面的很多问题我自己在使用 Spring 的过程中也并没有注意,自己也是临时查阅了很多资料和书籍补上的。网上也有一些很多关于 Spring 常见问题/面试题整理的文章,我感觉大部分都是互相 copy,而且很多问题也不是很汗,有些回答也存在问题。所以,自己花了一周的业余时间整理了一下,希望对大家有帮助。 +这篇文章主要是想通过一些问题,加深大家对于 Spring 的理解,所以不会涉及太多的代码!这篇文章整理了挺长时间,下面的很多问题我自己在使用 Spring 的过程中也并没有注意,自己也是临时查阅了很多资料和书籍补上的。网上也有一些很多关于 Spring 常见问题/面试题整理的文章,我感觉大部分都是互相 copy,而且很多问题也不是很好,有些回答也存在问题。所以,自己花了一周的业余时间整理了一下,希望对大家有帮助。 ## 什么是 Spring 框架? @@ -100,7 +100,8 @@ Spring 时代我们一般通过 XML 文件来配置 Bean,后来开发人员觉 推荐阅读:https://www.zhihu.com/question/23277575/answer/169698662 **Spring IoC的初始化过程:** -![Spring IoC的初始化过程](https://user-gold-cdn.xitu.io/2018/9/22/165fea36b569d4f4?w=709&h=56&f=png&s=4673) + +![Spring IoC的初始化过程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringIOC初始化过程.png) IoC源码阅读 @@ -177,7 +178,7 @@ AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无 - **Model1 时代** : 很多学 Java 后端比较晚的朋友可能并没有接触过 Model1 模式下的 JavaWeb 应用开发。在 Model1 模式下,整个 Web 应用几乎全部用 JSP 页面组成,只用少量的 JavaBean 来处理数据库连接、访问等操作。这个模式下 JSP 即是控制层又是表现层。显而易见,这种模式存在很多问题。比如①将控制逻辑和表现逻辑混杂在一起,导致代码重用率极低;②前端和后端相互依赖,难以进行测试并且开发效率极低; - **Model2 时代** :学过 Servlet 并做过相关 Demo 的朋友应该了解“Java Bean(Model)+ JSP(View,)+Servlet(Controller) ”这种开发模式,这就是早期的 JavaWeb MVC 开发模式。Model:系统涉及的数据,也就是 dao 和 bean。View:展示模型中的数据,只是用来展示。Controller:处理用户请求都发送给 ,返回数据给 JSP 并展示给用户。 -Model2 模式下还存在很多问题,Model2的抽象和封装程度还远远不够,使用Model2进行开发时不可避免地会重复造轮子,这就大大降低了程序的可维护性和复用性。于是很多JavaWeb开发相关的 MVC 框架营运而生比如Struts2,但是 Struts2 比较笨重。随着 Spring 轻量级开发框架的流行,Spring 生态圈出现了 Spring MVC 框架, Spring MVC 是当前最优秀的 MVC 框架。相比于 Struts2 , Spring MVC 使用更加简单和方便,开发效率更高,并且 Spring MVC 运行速度更快。 +Model2 模式下还存在很多问题,Model2的抽象和封装程度还远远不够,使用Model2进行开发时不可避免地会重复造轮子,这就大大降低了程序的可维护性和复用性。于是很多JavaWeb开发相关的 MVC 框架应运而生比如Struts2,但是 Struts2 比较笨重。随着 Spring 轻量级开发框架的流行,Spring 生态圈出现了 Spring MVC 框架, Spring MVC 是当前最优秀的 MVC 框架。相比于 Struts2 , Spring MVC 使用更加简单和方便,开发效率更高,并且 Spring MVC 运行速度更快。 MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring MVC 可以帮助我们进行更简洁的Web层的开发,并且它天生与 Spring 框架集成。Spring MVC 下我们一般把后端项目分为 Service层(处理业务)、Dao层(数据库操作)、Entity层(实体类)、Controller层(控制层,返回数据给前台页面)。 @@ -369,5 +370,5 @@ String transient4; // not persistent because of @Transient **Java工程师必备学习资源:** 一些Java工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。 -![我的公众号](https://user-gold-cdn.xitu.io/2018/11/28/167598cd2e17b8ec?w=258&h=258&f=jpeg&s=27334) +![公众号](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/javaguide1.jpg) From 16831e78db4bdcab75381e96887dad700d467286 Mon Sep 17 00:00:00 2001 From: hughyu Date: Wed, 4 Sep 2019 16:02:12 +0800 Subject: [PATCH 088/130] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97=EF=BC=8C=E5=8E=BB=E6=8E=89=E5=A4=9A=E4=BD=99=E7=A9=BA?= =?UTF-8?q?=E6=A0=BC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "docs/java/Java\347\226\221\351\232\276\347\202\271.md" | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" index 8f36fb3990a..a8ed579cefc 100644 --- "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" +++ "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" @@ -67,7 +67,7 @@ Reference:[Java中equals方法造成空指针异常的原因及解决方案](htt ## 1.2. 整形包装类值的比较 -所有整形包装类对象值得比较必须使用equals方法。 +所有整形包装类对象值的比较必须使用equals方法。 先看下面这个例子: @@ -150,8 +150,7 @@ Reference:《阿里巴巴Java开发手册》 比如我们如果自定义了一个Student类,其中有一个属性是成绩score,如果用Integer而不用int定义,一次考试,学生可能没考,值是null,也可能考了,但考了0分,值是0,这两个表达的状态明显不一样. -**说明** :POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何 NPE 问题,或 -者入库检查,都由使用者来保证。 +**说明** :POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何 NPE 问题,或者入库检查,都由使用者来保证。 **正例** : 数据库的查询结果可能是 null,因为自动拆箱,用基本数据类型接收有 NPE 风险。 From 80b40becb316a1c5f68b1fcdd7d46b7fc87ef611 Mon Sep 17 00:00:00 2001 From: Stefrex Date: Wed, 4 Sep 2019 16:11:36 +0800 Subject: [PATCH 089/130] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E2=80=9C=E7=AC=A6?= =?UTF-8?q?=E5=90=88=E2=80=9D=E4=B8=BA"=E5=A4=8D=E5=90=88"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...200\345\215\203\350\241\214MySQL\345\221\275\344\273\244.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/database/\344\270\200\345\215\203\350\241\214MySQL\345\221\275\344\273\244.md" "b/docs/database/\344\270\200\345\215\203\350\241\214MySQL\345\221\275\344\273\244.md" index acbfda3d7ac..c0c4a99d938 100644 --- "a/docs/database/\344\270\200\345\215\203\350\241\214MySQL\345\221\275\344\273\244.md" +++ "b/docs/database/\344\270\200\345\215\203\350\241\214MySQL\345\221\275\344\273\244.md" @@ -363,7 +363,7 @@ set(val1, val2, val3...) 字段不能再分,就满足第一范式。 -- 2NF, 第二范式 满足第一范式的前提下,不能出现部分依赖。 - 消除符合主键就可以避免部分依赖。增加单列关键字。 + 消除复合主键就可以避免部分依赖。增加单列关键字。 -- 3NF, 第三范式 满足第二范式的前提下,不能出现传递依赖。 某个字段依赖于主键,而有其他字段依赖于该字段。这就是传递依赖。 From 5ea438d2bd1981f6560bc10edbab44331721f723 Mon Sep 17 00:00:00 2001 From: lee <454884446@qq.com> Date: Mon, 9 Sep 2019 15:47:25 +0800 Subject: [PATCH 090/130] =?UTF-8?q?docs/java/Java=E7=96=91=E9=9A=BE?= =?UTF-8?q?=E7=82=B9.md=20line:65=20"=20=3D=3D=20"=E7=AC=A6=E5=8F=B7?= =?UTF-8?q?=E4=B8=8Emd=E8=AF=AD=E6=B3=95=E4=B8=AD=E7=9A=84=E9=AB=98?= =?UTF-8?q?=E4=BA=AE=E8=AF=AD=E6=B3=95=E5=86=B2=E7=AA=81,=E9=80=A0?= =?UTF-8?q?=E6=88=90=E6=AD=A7=E4=B9=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- "docs/java/Java\347\226\221\351\232\276\347\202\271.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" index a8ed579cefc..a26c0b77895 100644 --- "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" +++ "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" @@ -62,7 +62,7 @@ public static boolean equals(Object a, Object b) { Reference:[Java中equals方法造成空指针异常的原因及解决方案](https://blog.csdn.net/tick_tock97/article/details/72824894) - 每种原始类型都有默认值一样,如int默认值为 0,boolean 的默认值为 false,null 是任何引用类型的默认值,不严格的说是所有 Object 类型的默认值。 -- 可以使用==或者!=操作来比较null值,但是不能使用其他算法或者逻辑操作。在Java中`null==null`将返回true。 +- 可以使用 == 或者 != 操作来比较null值,但是不能使用其他算法或者逻辑操作。在Java中`null == null`将返回true。 - 不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常 ## 1.2. 整形包装类值的比较 From 91978683628352c24cf9e4c85208d2d6a30348a0 Mon Sep 17 00:00:00 2001 From: hughyu Date: Mon, 9 Sep 2019 18:17:38 +0800 Subject: [PATCH 091/130] =?UTF-8?q?=E4=BF=AE=E6=94=B9=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 --- "docs/java/Java\347\226\221\351\232\276\347\202\271.md" | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" index a8ed579cefc..d25c59110a1 100644 --- "a/docs/java/Java\347\226\221\351\232\276\347\202\271.md" +++ "b/docs/java/Java\347\226\221\351\232\276\347\202\271.md" @@ -2,7 +2,7 @@ - [1. 基础](#1-基础) - [1.1. 正确使用 equals 方法](#11-正确使用-equals-方法) - - [1.2. 整形包装类值的比较](#12-整形包装类值的比较) + - [1.2. 整型包装类值的比较](#12-整型包装类值的比较) - [1.3. BigDecimal](#13-bigdecimal) - [1.3.1. BigDecimal 的用处](#131-bigdecimal-的用处) - [1.3.2. BigDecimal 的大小比较](#132-bigdecimal-的大小比较) @@ -65,9 +65,9 @@ Reference:[Java中equals方法造成空指针异常的原因及解决方案](htt - 可以使用==或者!=操作来比较null值,但是不能使用其他算法或者逻辑操作。在Java中`null==null`将返回true。 - 不能使用一个值为null的引用类型变量来调用非静态方法,否则会抛出异常 -## 1.2. 整形包装类值的比较 +## 1.2. 整型包装类值的比较 -所有整形包装类对象值的比较必须使用equals方法。 +所有整型包装类对象值的比较必须使用equals方法。 先看下面这个例子: From 9753c38bcd83f028abdb5dde1dc0195147a58c6b Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Tue, 10 Sep 2019 14:33:50 +0800 Subject: [PATCH 092/130] =?UTF-8?q?Create=20=E5=85=AC=E4=BC=97=E5=8F=B7?= =?UTF-8?q?=E5=8E=86=E5=8F=B2=E6=96=87=E7=AB=A0=E6=B1=87=E6=80=BB.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...07\347\253\240\346\261\207\346\200\273.md" | 209 ++++++++++++++++++ 1 file changed, 209 insertions(+) create mode 100644 "docs/\345\205\254\344\274\227\345\217\267\345\216\206\345\217\262\346\226\207\347\253\240\346\261\207\346\200\273.md" diff --git "a/docs/\345\205\254\344\274\227\345\217\267\345\216\206\345\217\262\346\226\207\347\253\240\346\261\207\346\200\273.md" "b/docs/\345\205\254\344\274\227\345\217\267\345\216\206\345\217\262\346\226\207\347\253\240\346\261\207\346\200\273.md" new file mode 100644 index 00000000000..da66dbc9c13 --- /dev/null +++ "b/docs/\345\205\254\344\274\227\345\217\267\345\216\206\345\217\262\346\226\207\347\253\240\346\261\207\346\200\273.md" @@ -0,0 +1,209 @@ +## 热文 + + + +- [盘点阿里巴巴 15 款开发者工具](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485159&idx=1&sn=c97c087c45ad6dfc0ef61d80a9d0f702&scene=21#wechat_redirect) +- [蚂蚁金服2019实习生面经总结(已拿口头offer)](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485147&idx=1&sn=90e525a83a451d8c20298a7ef2d35ab9&scene=21#wechat_redirect) +- [一千行 MySQL 学习笔记](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485025&idx=1&sn=1f4e19fc77af28f6795feff6ce7465b9&scene=21#wechat_redirect) +- [可能是把Java内存区域讲的最清楚的一篇文章](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485068&idx=1&sn=c37267fe59978dbfcd6a9a54eee1c502&scene=21#wechat_redirect) +- [搞定 JVM 垃圾回收就是这么简单](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484877&idx=1&sn=f54d41b68f0cd6cc7c0348a2fddbda9f&chksm=cea24a06f9d5c3102bfef946ba6c7cc5df9a503ccb14b9b141c54e179617e4923c260c0b0a01&token=1082669959&lang=zh_CN&scene=21#wechat_redirect) +- [【原创】Java学习路线以及方法推荐](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485290&idx=1&sn=569fa9724aae83bff3a353aefc5b7f1c&scene=21#wechat_redirect) +- [技术面试复习大纲](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485505&idx=1&sn=f7d916334c078bc3fdc2933f889b5016&chksm=cea2478af9d5ce9cafcfe9a053e49e84296d8b1929f79844bba59c8c3d8b56753f34a2c2f6a9&token=1701499214&lang=zh_CN&scene=21#wechat_redirect) + +## Java + +### 必看书籍 + +- [Java学习必备书籍推荐终极版!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485113&idx=1&sn=e4dd1bb22778e4e9139bf29d98a7492b&chksm=cea24972f9d5c064e5b454b84b9bc0d42f4aec007f20f79b564398e6dec7c0cdcda0e64193b5&token=1482344439&lang=zh_CN&scene=21#wechat_redirect) + +### 基础 + +- [关于Java基础你不得不会的34个问题](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485015&idx=1&sn=5daa243c3359b88fc88b951f9d08b273&chksm=cea2499cf9d5c08a7698559a2fc27078c6b35856bc2d3588172bf64708c115d4b35d3de80cd9&token=1913747689&lang=zh_CN&scene=21#wechat_redirect) +- [剖析面试最常见问题之 Java 基础知识](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485173&idx=1&sn=9605f89ed0893b674d14b0c8cf4dc942&chksm=cea2493ef9d5c028a969bb89b53f48fbdd72b975319a844319e3111b15d5dbbc350d91ea5b5a&token=1667678311&lang=zh_CN&scene=21#wechat_redirect) + +### Java8新特性 + +- [Java 8 新特性最佳指南](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484744&idx=1&sn=9db31dca13d327678845054af75efb74&chksm=cea24a83f9d5c3956f4feb9956b068624ab2fdd6c4a75fe52d5df5dca356a016577301399548&token=1082669959&lang=zh_CN&scene=21#wechat_redirect) +- [看完这篇文章,别说自己不会用Lambda表达式了!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485425&idx=1&sn=3cc01bc7c42549b6b6aa62b3656e02d1&chksm=cea2483af9d5c12cd10174dac4465a631b14a6d6a09495b018a98e01c698e86368d26b3be03d&token=1667678311&lang=zh_CN&scene=21#wechat_redirect) + +### JVM + +- [Java内存区域](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485068&idx=1&sn=c37267fe59978dbfcd6a9a54eee1c502&scene=21#wechat_redirect) +- [垃圾回收](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484877&idx=1&sn=f54d41b68f0cd6cc7c0348a2fddbda9f&chksm=cea24a06f9d5c3102bfef946ba6c7cc5df9a503ccb14b9b141c54e179617e4923c260c0b0a01&token=1082669959&lang=zh_CN&scene=21#wechat_redirect) +- [谈Java类文件结构](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485250&idx=2&sn=33793bcce3f2ff31b83cf2f9c32df153&scene=21#wechat_redirect) +- [类加载过程](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485264&idx=2&sn=8c97f7e7d7ad36bc50e713572dbd1529&scene=21#wechat_redirect) + +### 并发编程 + +- [并发编程面试必备:JUC 中的 Atomic 原子类总结](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484834&idx=1&sn=7d3835091af8125c13fc6db765f4c5bd&chksm=cea24a69f9d5c37ff88a8328214cb48b06afb9dc82e46cd924d2595f109ea28922212f9e653c&token=1082669959&lang=zh_CN&scene=21#wechat_redirect) +- [并发编程面试必备:AQS 原理以及 AQS 同步组件总结](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484832&idx=1&sn=f902febd050eac59d67fc0804d7e1ad5&chksm=cea24a6bf9d5c37d6b505fe1d43e4fb709729149f1f77344b4a0f5956cab5020a2e102f2adf2&token=1082669959&lang=zh_CN&scene=21#wechat_redirect) +- [BATJ都爱问的多线程面试题](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484831&idx=1&sn=e22d2832a436dbb94233272429d4c4c4&chksm=cea24a54f9d5c3420e96aa94e3d893f4cf825852fff0b4a7e4e241cc229f4666f3dc4d53955e&token=1082669959&lang=zh_CN&scene=21#wechat_redirect) +- [通俗易懂,JDK 并发容器总结](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484797&idx=1&sn=e28462eec497e38053d9fb9ba17ff022&chksm=cea24ab6f9d5c3a05b5ad36111e93d824ce964442366bc8add1cd77cb432057e4995592c8024&token=1082669959&lang=zh_CN&scene=21#wechat_redirect) + +### 代码质量 + +- [八点建议助您写出优雅的Java代码](https://mp.weixin.qq.com/s/o3BGTdAa8VufcIKU0ScBqA) +- [十分钟搞懂Java效率工具Lombok使用与原理](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485385&idx=2&sn=a7c3fb4485ffd8c019e5541e9b1580cd&chksm=cea24802f9d5c1144eee0da52cfc0cc5e8ee3590990de3bb642df4d4b2a8cd07f12dd54947b9&token=1667678311&lang=zh_CN#rd) +- [如何写出让同事无法维护的代码?](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485413&idx=2&sn=70336d94018ad93d67cfacb4aeceb01b&chksm=cea2482ef9d5c1382d8a009e2ecd680c3b6ac3c7c02810af8901970e69c431273113ca7e4447&token=1667678311&lang=zh_CN#rd) +- [Code Review最佳实践](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485494&idx=1&sn=c7f160fd1bb13a20b887493003acbbf9&chksm=cea247fdf9d5ceebf3b98bd7c524d0ecc672d4bcb10a70fae90390abd862538aa3283c93375b&token=1701499214&lang=zh_CN&scene=21#wechat_redirect) +- [后端开发必备的 RestFul API 知识](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485510&idx=1&sn=e9273322ae638c8465a606737109ab97&chksm=cea2478df9d5ce9b58b9ff1f1e2ecca99e961b911adcec3d5a579b41e01151160cfb2891d91b&token=1701499214&lang=zh_CN&scene=21#wechat_redirect) + +## 网络 + +- [搞定计算机网络面试,看这篇就够了(补充版)](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484889&idx=1&sn=5f9e6f5c29f9514701c246573d15d9fa&chksm=cea24a12f9d5c3041efd5cf864eb69b76aea6ef9c000a72b16d54794aab97d4fb53515a77147&token=1082669959&lang=zh_CN#rd) + +## 系统设计 + +### Spring + +- [Spring常见问题总结(补充版)](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485576&idx=1&sn=f993349f12650a68904e1d99d2465131&chksm=cea24743f9d5ce55ffe543a0feaf2c566382024b625b59283482da6ab0cbcf2a3c9dc5b64a53&token=2133161636&lang=zh_CN#rd) +- [面试官:“谈谈Spring中都用到了那些设计模式?”。](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485303&idx=1&sn=9e4626a1e3f001f9b0d84a6fa0cff04a&chksm=cea248bcf9d5c1aaf48b67cc52bac74eb29d6037848d6cf213b0e5466f2d1fda970db700ba41&token=1667678311&lang=zh_CN#rd) +- [可能是最漂亮的Spring事务管理详解](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484943&idx=1&sn=46b9082af4ec223137df7d1c8303ca24&chksm=cea249c4f9d5c0d2b8212a17252cbfb74e5fbe5488b76d829827421c53332326d1ec360f5d63&token=1082669959&lang=zh_CN#rd) +- [SpringMVC 工作原理详解](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484846&idx=1&sn=490014ea65669c1a1e73e25d7b9fa569&chksm=cea24a65f9d5c373d31d6cdd61297db21de63462c1c03c34b7025a0d0b93f1182b2ad7e33cab&token=1082669959&lang=zh_CN#rd) +- [Spring编程式和声明式事务实例讲解](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484942&idx=1&sn=b0d9e6f1af243bbf7f34ede5a6d2277d&chksm=cea249c5f9d5c0d3da9206b753bb7734d47d8d8b43edcc02bdf6f139e34e1db512cf5ed32217&token=1082669959&lang=zh_CN#rd) +- [一文轻松搞懂Spring中bean的作用域与生命周期](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484865&idx=2&sn=178c6e64e6c12172e77efdd669eb86a7&chksm=cea24a0af9d5c31c389ae7817613a336f00c330021f73c90afe383c8caf6ea07a9e1f949c68d&token=1082669959&lang=zh_CN#rd) + +### SpringBoot + +- [超详细,新手都能看懂 !使用SpringBoot+Dubbo 搭建一个简单的分布式服务](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484809&idx=1&sn=a789eba40404e6501d51b24345b28906&chksm=cea24a42f9d5c3544babde7f33790fc54f02ebc2f589ce9fa116bbb9c7b0c0cfb1bc314d17de&token=1082669959&lang=zh_CN#rd) +- [基于 SpringBoot2.0+优雅整合 SpringBoot+Mybatis](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484805&idx=2&sn=0e148af5baebae53b3fd365cff689046&chksm=cea24a4ef9d5c35862efc9c67b0619f7e8ade4b75e1001189ededccd8fd35ca5cd19fda074b9&token=1082669959&lang=zh_CN#rd) +- [新手也能实现,基于SpirngBoot2.0+ 的 SpringBoot+Mybatis 多数据源配置](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484803&idx=1&sn=9179890db39721a59bb815b7f985ec2d&chksm=cea24a48f9d5c35e73d3df4b29d340e1a4c76d43b220c0f9535e77b43a74ff049ee7b89a4a38&token=1082669959&lang=zh_CN#rd) +- [SpringBoot 整合 阿里云OSS 存储服务,快来免费搭建一个自己的图床](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484801&idx=1&sn=22d97f9c963d45820559d7226874e33f&chksm=cea24a4af9d5c35cac3177921801287b1ad983eabb6e18cf30302fc235b7f699401510ea2a59&token=1082669959&lang=zh_CN#rd) +- [Spring Boot 实现热部署的一种简单方式](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485586&idx=2&sn=01788bf8c64de91d085a01c1f4f5159d&chksm=cea24759f9d5ce4fe914aa43e517f16b7f4066de3096be09d01500596ca63ad9f1eef4b8fffa&token=2133161636&lang=zh_CN#rd) +- [SpringBoot 处理异常的几种常见姿势](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485568&idx=2&sn=c5ba880fd0c5d82e39531fa42cb036ac&chksm=cea2474bf9d5ce5dcbc6a5f6580198fdce4bc92ef577579183a729cb5d1430e4994720d59b34&token=2133161636&lang=zh_CN#rd) +- [5分钟搞懂如何在Spring Boot中Schedule Tasks](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485563&idx=1&sn=7419341f04036a10b141b74624a3f8c9&chksm=cea247b0f9d5cea6440759e6d49b4e77d06f4c99470243a10c1463834e873ca90266413fbc92&token=2133161636&lang=zh_CN#rd) + +### MyBatis + +- [面试官:“谈谈MyBatis中都用到了那些设计模式?”。](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485369&idx=1&sn=a493d646e126cd1c19ce9f1fc9c724c9&chksm=cea24872f9d5c16462d82f033699d7ad3177964100f8c8958ce9b8e0872e246f552ae6ac423f&token=1667678311&lang=zh_CN#rd) + +## 数据库 + +### MySQL + +- [MySQL知识点总结[修订版]](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485390&idx=1&sn=43511395093d2e0deb64f89c8af1805e&chksm=cea24805f9d5c113026292c7681238b1c65c09958588aa5c70e37249e384f5c965f87ef438ad&token=1667678311&lang=zh_CN#rd) +- [【思维导图-索引篇】搞定数据库索引就是这么简单](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484848&idx=1&sn=77a0e6e82944ec385f5df17e91ce3bf2&chksm=cea24a7bf9d5c36d4b289cccb017292f9f36da9f3c887fd2b93ecd6af021fcf30121ba09799f&token=1082669959&lang=zh_CN#rd) +- [一条SQL语句在MySQL中如何执行的](https://mp.weixin.qq.com/s/QU4-RSqVC88xRyMA31khMg) +- [一文带你轻松搞懂事务隔离级别(图文详解)](https://mp.weixin.qq.com/s/WhK3SrkMDTj1_o2zp64ArQ) +- [详记一次MySQL千万级大表优化过程!](https://mp.weixin.qq.com/s/SbpM_q_-nIKJn7_TSmrW8A) + +### Redis + +- [史上最全Redis高可用技术解决方案大全](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484850&idx=1&sn=3238360bfa8105cf758dcf7354af2814&chksm=cea24a79f9d5c36fb2399aafa91d7fb2699b5006d8d037fe8aaf2e5577ff20ae322868b04a87&token=1082669959&lang=zh_CN#rd) +- [redis 总结——重构版](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484858&idx=1&sn=8e222ea6115e0b69cac91af14d2caf36&chksm=cea24a71f9d5c367148dccec3d5ddecf5ecd8ea096b5c5ec32f22080e66ac3c343e99151c9e0&token=1082669959&lang=zh_CN#rd) + +## 面试相关 + +- [面试中常见的几道智力题 来看看你会做几道?](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484923&idx=1&sn=e1fd890a1a7290f996dc8d7ca4b2d599&chksm=cea24a30f9d5c326f5498929decb7b2d9e39d8806b74c823ccf46fe9fba778d5d9aa644292db&token=1082669959&lang=zh_CN#rd) +- [面试中常见的几道智力题 来看看你会做几道(2)?](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484917&idx=1&sn=8587b384b42927618067c0e3a56083a9&chksm=cea24a3ef9d5c328a5fd97441de1ccfaf42f9296e5f491b1fa4be9422431d6f26dac36a75e16&token=1082669959&lang=zh_CN#rd) +- [[算法总结] 搞定 BAT 面试——几道常见的子符串算法题](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484869&idx=1&sn=785d0dce653aa1abdbc542007da830e8&chksm=cea24a0ef9d5c31853ae1114844041f12daf88ef753fb019980e466f32922c50d332e1d1fc2c&token=1082669959&lang=zh_CN#rd) +- [[BAT面试必备] ——几道常见的链表算法题](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484862&idx=1&sn=015a4eb2f66978010d68c1305a46cfb5&chksm=cea24a75f9d5c363683aadf3ac434b8baf9ff5be8d2939d7875ebb3a742780b568a0926a2cc4&token=1082669959&lang=zh_CN#rd) +- [如何判断一个元素在亿级数据中是否存在?](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484796&idx=1&sn=25c190a95ac53b81063f7acda936c994&chksm=cea24ab7f9d5c3a1819605008bfc92834eddf37ca3ad24b913fab558b5d00ed5306c5d6aab55&token=1082669959&lang=zh_CN#rd) +- [可能是一份最适合你的后端面试指南(部分内容前端同样适用)](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484840&idx=1&sn=cf4611ac290ae3cbb381fe52aa76b60b&chksm=cea24a63f9d5c375215f7539ff0f3d6320f091d5f8b73e95c724ec9a31d3b5baa98c3f5a1012&token=1082669959&lang=zh_CN#rd) +- [GitHub 上四万 Star 大佬的求职回忆](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484802&idx=1&sn=58e204718559f6cf94d3d9cd9614ebc2&chksm=cea24a49f9d5c35f8d53f79801aea21fdd3c06ff4b6c16167e8211f627eea8c5a0ce334fd240&token=1082669959&lang=zh_CN#rd) +- [这7个问题,可能大部分Java程序员都比较关心吧!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484786&idx=1&sn=4f61c62c0213602a106ce20db7768a93&chksm=cea24ab9f9d5c3afe7b5c90f6a8782adef93e916a46685aa8c46b752fddadf88273748c7f1ab&token=1082669959&lang=zh_CN#rd) +- [2018年BATJ面试题精选](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484774&idx=1&sn=2aaaafcecd2bc6b519a11fa0fc1f66fa&chksm=cea24aadf9d5c3bb69359b0973930387885de75b444837df4f34ac14eebbabe498605660ae48&token=1082669959&lang=zh_CN#rd) +- [一位大佬的亲身经历总结:简历和面试的技巧](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485409&idx=1&sn=47b09ec432929306d39762b13364b04b&chksm=cea2482af9d5c13cc91e8e679f0b823e667b616866519af1523d1d8b4e550cfdaa2f57b21bf3&token=1667678311&lang=zh_CN#rd) +- [包装严重的IT行业,作为面试官,我是如何甄别应聘者的包装程度](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485404&idx=1&sn=b0c5b9e55bb6f7e71585c1b2e769fd87&chksm=cea24817f9d5c101cfa45a5d2707445030259f030d91f48c068450c5a280457ee25fa51b3f24&token=1667678311&lang=zh_CN#rd) +- [面试官:你是如何使用JDK来实现自己的缓存(支持高并发)?](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485347&idx=1&sn=8da3919089909d39dbf0745225ca0dad&chksm=cea24868f9d5c17eaec7eba2a4a3b63ed46dff87cb08b3f5d491e96890d8f375735cfcc77562&token=1667678311&lang=zh_CN#rd) + +### 面经 + +- [5面阿里,终获offer](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484747&idx=1&sn=bff601fd1d314f670cb44171ea1925dd&chksm=cea24a80f9d5c396619acaa9f77207019f72d43749559b5a401359915e01b51598a687c48203&token=1082669959&lang=zh_CN#rd) +- [记一次蚂蚁金服的面试经历](https://mp.weixin.qq.com/s/LIhtyspty9Kz1qRg1b8N-w) +- [2019年蚂蚁金服、头条、拼多多的面试总结](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485167&idx=1&sn=a35fad235a6bb2b6e31f1ff37e72bfd7&chksm=cea24924f9d5c032cbbeffc87cd366e9aa7b209897a26ad5c7f7b1b766b3c34a2c9b6870006c&token=1667678311&lang=zh_CN#rd) +- [蚂蚁金服2019实习生面经总结(已拿口头offer)](https://mp.weixin.qq.com/s/ktq2UOvi5qI1FymWIgp8jw) +- [2019年蚂蚁金服面经(已拿Offer)!附答案!!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485251&idx=1&sn=21e5da0d76dd71d165f19015ebeba780&chksm=cea24888f9d5c19e041a145e6da3d4fa94f63b34c71d43f10c29340c7d51a4a23971904d19b5&token=1667678311&lang=zh_CN#rd) + +### 备战面试系列 + +- [【备战春招/秋招系列】程序员的简历就该这样写](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484830&idx=1&sn=2e868311f79f4a52a0f3be383050c810&source=41#wechat_redirect) +- [【备战春招/秋招系列】初出茅庐的程序员该如何准备面试?](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484829&idx=1&sn=29e0e08d9da0f343f14c16bb3ac92beb&chksm=cea24a56f9d5c340ecb67a186b3c8fb5ef30ff481bfbdec3249f2145b3f376fd2d6dc19fbefc&token=1082669959&lang=zh_CN#rd) +- [【备战春招/秋招系列】Java程序员必备书单](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484826&idx=1&sn=cf015aca00e420d476c3cb456a11d994&chksm=cea24a51f9d5c34730dcdb538c99cb58d23496ebe8c51fb191dd629ab28c802f97662aef3366&token=1082669959&lang=zh_CN#rd) +- [【备战春招/秋招系列】面试官问你“有什么问题问我吗?”,你该如何回答?](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484755&idx=1&sn=4a09256062642c714f83ed03cb083846&chksm=cea24a98f9d5c38e8e040c332bf58ccac48a93190e059b9f39e4249eae579b8d32238cea88dd&token=1082669959&lang=zh_CN#rd) +- [【备战春招/秋招系列】美团面经总结基础篇 (附详解答案)](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484825&idx=1&sn=a0ec65a5f2b268a6f4d22c3bb9790126&chksm=cea24a52f9d5c344922e4dcd4b9650d63ad5c4d843208e3fb7f21bcffa144a6bab0d748cdfbb&token=1082669959&lang=zh_CN#rd) +- [【备战春招/秋招系列】美团面经总结进阶篇 (附详解答案)](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484822&idx=1&sn=efefe8a5a1ff9a54a57601edab134a04&chksm=cea24a5df9d5c34b36e8b12beb574ca31ae771de3881237c4f02be61b52e38f763d2d6137dd3&token=1082669959&lang=zh_CN#rd) +- [【备战春招/秋招系列】美团Java面经总结终结篇 (附详解答案)](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484815&idx=1&sn=4dd1a280fb95c59366c73897c77049fb&chksm=cea24a44f9d5c3524b301ecf313382ea78b6ac821b4d5e9f9cf51346fc10839c1e234e7cb3ed&token=1082669959&lang=zh_CN#rd) + +### 面试现场 + +- [【面试现场】如何实现可以获取最小值的栈?](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484863&idx=2&sn=ac674bb0cf29b782aa0e6e9365defa4b&chksm=cea24a74f9d5c362b22459ceda77e635366a17175cd30bbdce14bc729e5417b137175a90331b&token=1082669959&lang=zh_CN#rd) +- [【面试现场】为什么要分稳定排序和非稳定排序?](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484856&idx=2&sn=af47a53a913b42b064a6e158d165fd2f&chksm=cea24a73f9d5c365084c65d30372f1ae35893ad3ec751da71e14ce5fda07b17ab5f0da90f663&token=1082669959&lang=zh_CN#rd) +- [【面试现场】如何找到字符串中的最长回文子串?](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484855&idx=1&sn=e75a06c56fe3b8802f18b04ef4df1c43&chksm=cea24a7cf9d5c36ab8090506442fa131a3d332343e953567c5f78dbef5aed0b6ed317b25af9f&token=1082669959&lang=zh_CN#rd) +- [【面试现场】如何在10亿数中找出前1000大的数](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484845&idx=1&sn=6a235c6181c0f46630a9a22ef762a23b&chksm=cea24a66f9d5c3709e9618a1e418535d467053273123b81fda3897b4431a02a105703fd22644&token=1082669959&lang=zh_CN#rd) + +## 算法 + +- [【算法技巧】位运算装逼指南](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485292&idx=1&sn=330e7f8c972bd7ed368aca7ccb434493&chksm=cea248a7f9d5c1b1f5387adbda961f0aa02c6f575fd9367937b9c15be1b241222b340f61dc5e&token=1667678311&lang=zh_CN#rd) + +## Github 热门Java项目推荐 + +- [近几个月Github上最热门的Java项目一览](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484908&idx=1&sn=a95d37194f03b7e4aae1612e1785bf44&chksm=cea24a27f9d5c331d818fa1b2b564f9d5e9ff245a969a50e98944b909d6e45c0ebde544f982e&token=1082669959&lang=zh_CN#rd)(2018-07-20) +- [推荐10个Java方向最热门的开源项目(8月)](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484876&idx=1&sn=3cab92ee5bda6b47bf7232724461f6a3&chksm=cea24a07f9d5c31106d0806b1bd8bae8821511b0a32879fb4f4b3bec7823db1f62e23821b07b&token=1082669959&lang=zh_CN#rd)( 2018-08-28) +- [Github上 Star 数相加超过 7w+ 的三个面试相关的仓库推荐](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484819&idx=1&sn=6d83101ee504a6ab19ef07fb32650876&chksm=cea24a58f9d5c34ef9f3a7374c5147b1ff85e18ca4e59e21c4edf7d63bc1bd8c5c241e0c532b&token=1082669959&lang=zh_CN#rd)( 2018-11-17) +- [11月 Github Trending 榜最热门的 10 个 Java 项目](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484805&idx=1&sn=acee5bd6c3f861c65be3a2fb8843e1f5&chksm=cea24a4ef9d5c358c263cb4605acc6b6254635c28c496a9a10aee0dc80293f457a9af2e90d1c&token=1082669959&lang=zh_CN#rd)( 2018-12-01) +- [盘点一下Github上开源的Java面试/学习相关的仓库,看完弄懂薪资至少增加10k](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484789&idx=1&sn=2ad9fabb8fc7fae3bd3756ea05594344&chksm=cea24abef9d5c3a889b6cb8e00cb18abbb694d189c84a24fa1ed337ad4c56194cd39316dc6a5&token=1082669959&lang=zh_CN#rd)( 2018-12-24) +- [12月GithubTrending榜Java项目总结,多了几个新面孔](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484784&idx=1&sn=3c98b2e6aa97014a8fb4bf837be40f52&chksm=cea24abbf9d5c3ad3ab779749f6a75ed9bc4321986056a65f5f04033c9cc626a382ebe597278&token=1082669959&lang=zh_CN#rd)(2019-01-02) +- [1月份Github上收获最多star的10个项目](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484761&idx=1&sn=db6441c08f5ae8d75978384108cc852d&chksm=cea24a92f9d5c3846858a91aa7dc6b258f91407e2a22a1c7b2e46a8e5dd4d9a9ef443eed3b0e&token=1082669959&lang=zh_CN#rd)(2019-02-01) +- [2019年2月份Github上收获最多Star的10个Java项目](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484749&idx=1&sn=a66a1e3707839454539d93499dcadfad&chksm=cea24a86f9d5c3902d07fc4614347606200536ddf9ee7464fe12bbbce5c1bd186ad9894f13e3&token=1082669959&lang=zh_CN#rd)(2019-03-05) +- [3月Github最热门的10个Java开源项目](https://mp.weixin.qq.com/s/HYXFWeko2tGPCWhy-yrtEw) +- [五一假期充电指南:4月Github最热门的Java项目推荐](https://mp.weixin.qq.com/s/3485Z0cbD1FvcWZMQTnRsw) + +## 架构 + +- [8 张图读懂大型网站技术架构](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484863&idx=1&sn=8b7c8ce77f5927564d69587688114c79&chksm=cea24a74f9d5c362b7140d18bfc198e7f39572b938e597d1725e4dcf541a12b33d8db6ac1b45&token=1082669959&lang=zh_CN#rd) +- [【面试精选】关于大型网站系统架构你不得不懂的10个问题](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484760&idx=1&sn=c41df36f538ab3d8907e23bf8f6d2cd5&chksm=cea24a93f9d5c3851f8a699fdf068f767e3571c38e1b2995297a3e5725f9ad024c6de2bcb100&token=1082669959&lang=zh_CN#rd) +- [分布式系统的经典基础理论](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484941&idx=1&sn=e0812a9ccfde06550e24c23c4bb5ef1d&chksm=cea249c6f9d5c0d0bd16fc26c7af606c775868f1f06d81fbff2f8093d2a686c3b3befe9b971c&token=1082669959&lang=zh_CN#rd) +- [软件开发的七条原则](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484938&idx=1&sn=597b1aec42d22caad051b3694816fb27&chksm=cea249c1f9d5c0d73bcedc02499cb44822f6b5ab9dcccd7f1a03f830aed158a1b9abec416efc&token=1082669959&lang=zh_CN#rd) +- [关于分布式计算的一些概念](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484935&idx=2&sn=2394583a73b41cca431e392a28b0b4cb&chksm=cea249ccf9d5c0da5d1d4b8cf2dffb00ae1b6b605afe6da426112f3208898c2cca6249865146&token=1082669959&lang=zh_CN#rd) + +## 工具 + +- [Git入门看这一篇就够了!](https://mp.weixin.qq.com/s/ylyHOuEPX4tDvOc7-SxMmw) +- [团队开发中的 Git 实践](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485550&idx=1&sn=a0fa847b009c3c8c60c20773f0870dbf&chksm=cea247a5f9d5ceb317906f37d7dfbd44aebbe2206764cd8b50a25110c3125c7be3507ce3729e&token=2133161636&lang=zh_CN#rd) +- [IDEA中的Git操作,看这一篇就够了!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485578&idx=1&sn=8f8ab9d597e1448053e5da380fff3e54&chksm=cea24741f9d5ce5791722dd3da12dfa3de5aa9d742e0cc78d0b72a89d75a48e6d84512265c30&token=2133161636&lang=zh_CN#rd) +- [一文搞懂如何在Intellij IDEA中使用Debug,超级详细!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485250&idx=1&sn=9e1f270996441094104a06fc909c60f5&chksm=cea24889f9d5c19fbc6024779ca476a3ee141efa457fc86cc8c33a8f06a1c2b1e7b4922426c2&token=1667678311&lang=zh_CN#rd) +- [十分钟搞懂Java效率工具Lombok使用与原理](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485385&idx=2&sn=a7c3fb4485ffd8c019e5541e9b1580cd&chksm=cea24802f9d5c1144eee0da52cfc0cc5e8ee3590990de3bb642df4d4b2a8cd07f12dd54947b9&token=913106598&lang=zh_CN&scene=21#wechat_redirect) + +## 效率 + +- [推荐几个可以提升工作效率的Chrome插件](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485315&idx=1&sn=f5e91a9386a6911acbff4d7721065563&chksm=cea24848f9d5c15ec3bc0efab93351ca7481a609e901d9c9c07816a7a9737cdcdc1b5f6497db&token=1667678311&lang=zh_CN#rd) + +## 思维开阔 + +- [不就是个短信登录API嘛,有这么复杂吗?](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485181&idx=1&sn=7a7a7ce0671e8c5456add8da098501c2&chksm=cea24936f9d5c020fa1e339a819a17e7ae6099f1c5072d9ea235cf9fca45437d96cb117f7f10&token=1667678311&lang=zh_CN#rd) + +## 进阶 + +- [可能是把Docker的概念讲的最清楚的一篇文章](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484921&idx=1&sn=d40518712a04b3c37d7c8fcd3e696e90&chksm=cea24a32f9d5c3243db78a227ba4e77618e679bbc856cf1974fccbd474c44847672f21658147&token=1082669959&lang=zh_CN#rd) +- [后端必备——数据通信知识(RPC、消息队列)一站式总结](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484920&idx=1&sn=c7167df0b36522935896565973d02cc9&chksm=cea24a33f9d5c325fc663c95ebc221060ae2d5eeee254472558a99fdfc2837b31d3b9ae51a12&token=1082669959&lang=zh_CN#rd) +- [可能是全网把 ZooKeeper 概念讲的最清楚的一篇文章](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484868&idx=1&sn=af1e49c5f7dc89355255a4d46bafc005&chksm=cea24a0ff9d5c3195a690d2c85f09cd8901717674f52e10b0e6fd588d69de15de76b8184307d&token=1082669959&lang=zh_CN#rd) +- [外行人都能看懂的SpringCloud,错过了血亏!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484813&idx=1&sn=d87c01aff031f35be6b88a61f5782da5&chksm=cea24a46f9d5c35023a54e20fa1319b4cd31c33b094e2fd161bb8667ab77b8b403af62cfb3b5&token=1082669959&lang=zh_CN#rd) +- [关于 Dubbo 的重要入门知识点总结](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484753&idx=1&sn=32d987bf9f6208e30326877b111cad61&chksm=cea24a9af9d5c38cc7eb4d9bfeaa07e72003a1bf304a0fedc3fabb2a87f01c98b5a7d1c80d53&token=1082669959&lang=zh_CN#rd) +- [Java 工程师成神之路 | 2019正式版](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484759&idx=1&sn=5a706091c1db2b585f0a93c75bca14da&chksm=cea24a9cf9d5c38a245bdc63a0c90934b02f582c34a8dfb4ef01cd149d4829d799cb9e9bd464&token=1082669959&lang=zh_CN#rd) +- [聊一聊开发常用小工具](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484769&idx=1&sn=0968ce79f4d31d982b9f1ce24b051432&chksm=cea24aaaf9d5c3bc5feb0ef4e814990c9e108b72a0691193b1dda29642ee2ff74da5026016f6&token=1082669959&lang=zh_CN#rd) +- [新手也能看懂,消息队列其实很简单](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484794&idx=1&sn=61585fe69eedb3654ee2f9c9cd67e1a1&chksm=cea24ab1f9d5c3a7fd07dd49244f69fc85a5a523ee5353fc9e442dcad2ca0dd1137ed563fcbe&token=1082669959&lang=zh_CN#rd) + +## 杂文闲记 + +- [一只准准程序员的唠叨](http://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484932&idx=1&sn=a4f3057ecd4412cb8b18e92058b29680&chksm=cea249cff9d5c0d97580310f6666a4e0c42cfd1ba13dd759850e489c9386dce8c5c35b0a1a95&token=1082669959&lang=zh_CN#rd)(2018-06-09) +- [说几件近期的小事](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484900&idx=1&sn=745e8f6027da369ef5f8e349cb5d6657&chksm=cea24a2ff9d5c339c925322ffacdc72dd37bda63238dfb3452540085c1695681e2e79070e2a7&token=1082669959&lang=zh_CN#rd)(2018-08-02) +- [选择技术方向都要考虑哪些因素](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484898&idx=1&sn=fd2ebf9ffd37ab5de1de09cd3272ac0a&chksm=cea24a29f9d5c33fa48f5a57de864cd9382a730578fb18d78b7f06b45504aede18b235b9bc9e&token=1082669959&lang=zh_CN#rd)(2018-08-04) +- [结束了我短暂的秋招,说点自己的感受](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484842&idx=1&sn=4489dfab0ef2479122b71407855afc71&chksm=cea24a61f9d5c3774a8ed67c5fcc3234cb0741fbe831152986e5d1c8fb4f36a003f4fb2f247e&token=1082669959&lang=zh_CN#rd)(2018-10-22) +- [【周日闲谈】最近想说的几件小事](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484818&idx=1&sn=e14b0a08537456eb15ba49cf5e70ff74&chksm=cea24a59f9d5c34fe0a9e0567d867b85a81d1f19b0ea8e6a3c14161e436508de9adfeb2a5e6a&token=1082669959&lang=zh_CN#rd)(2018-11-18) +- [做公众号这一年的经历和一件“大事”](http://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484746&idx=1&sn=a519a9e3d638bff5c65008f7de167e4b&chksm=cea24a81f9d5c397ca9ac5668ba6cb18b38065e0e282a34ebc077a2dea98de3f1eb285ea5f09&token=1082669959&lang=zh_CN#rd)(2019-03-10) +- [几经周折,公众号终于留言功能啦!](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485007&idx=1&sn=096a436cd6a9251c23b8effc3cfa5076&chksm=cea24984f9d5c092d1f7740d1c3e0ea347562ba0aa597507ce275c5bdf1c8bd608328ee756ba&token=1082669959&lang=zh_CN#rd)(2019-03-15) +- [写在毕业季的大学总结!细数一下大学干过的“傻事”。](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485358&idx=1&sn=3aaf1163fe13351e06c76b70f2bd33bd&chksm=cea24865f9d5c1735b51c707c8f5ade16af7eca304540205ab0fb1284f99034d418b9858d7db&token=1667678311&lang=zh_CN#rd) (2019-06-11) +- [入职一个月的职场小白,谈谈自己这段时间的感受](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485540&idx=1&sn=4492eece8f7738e99350118040e14a79&chksm=cea247aff9d5ceb9e7c67f418d8a8518c550fd7dd269bf2c9bdef83309502273b4b9f1e7021f&token=1333232257&lang=zh_CN&scene=21#wechat_redirect) + +## 其他好文推荐 + +- [谈恋爱也要懂https](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484821&idx=1&sn=e6ce4ec607a6c9b20edbd64fbeb0f6c5&chksm=cea24a5ef9d5c3480d3de284fc1038b51c2464152e25a350960efd81acd21f71d7e0eeb78c77&token=1082669959&lang=zh_CN#rd) +- [快速入门大厂后端面试必备的 Shell 编程](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484810&idx=1&sn=0b622ae617b863ef1cc3a32c17b8b755&chksm=cea24a41f9d5c357199073c1e4692b7da7dcbd1809cf634a6cfec8c64c12250efc5274992f06&token=1082669959&lang=zh_CN#rd) +- [为什么阿里巴巴禁止工程师直接使用日志系统(Log4j、Logback)中的 API](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484808&idx=1&sn=4774ecc18069e4ddc85f68877cff1ae3&chksm=cea24a43f9d5c35520a454d51e72c6084d38f505969835011f4dd36f76c78303af46780802c9&token=1082669959&lang=zh_CN#rd) +- [一文搞懂 RabbitMQ 的重要概念以及安装](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484792&idx=1&sn=d34fdbb6cb21c231361038a7317ac2a4&chksm=cea24ab3f9d5c3a5c742de10cd0f7c77425b2144c86d2515d3e5d2011f4d16af12110c2de986&token=1082669959&lang=zh_CN#rd) +- [漫话:如何给女朋友解释什么是RPC](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484795&idx=1&sn=64eb2dcac07cf6904ca79b14f408df9e&chksm=cea24ab0f9d5c3a6970c3fbbdcaa16d5230b51abed9bacd1cd2ea3192cccea4aba0ef2d1a9de&token=1082669959&lang=zh_CN#rd) +- [Java人才市场年度盘点:转折与终局](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484779&idx=1&sn=a930b09a1783bca68e927cbe7d7a54a6&chksm=cea24aa0f9d5c3b6864ab3585a4cc5de1fa89ffc07538f2c55382776bfee0c369d7d74af7c79&token=1082669959&lang=zh_CN#rd) +- [Github 上日获 800多 star 的阿里微服务架构分布式事务解决方案 FESCAR开源啦](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484776&idx=2&sn=bcd1cf6d72653bfff83724f1dbae0425&chksm=cea24aa3f9d5c3b5e9667f1e15f295d323efb3b2c8da6c9059f5e8b5e176b9cb1bf80cd1a78f&token=1082669959&lang=zh_CN#rd) +- [Cloud Toolkit新版本发布,开发效率 “biu” 起来了](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247484771&idx=2&sn=0eef929baacca950099ea8651f0e5cb2&chksm=cea24aa8f9d5c3bed5f359e6da981ac950dca8f31a93f1fe321d7de7908d843855604e79a4da&token=1082669959&lang=zh_CN#rd) +- [我觉得技术人员该有的提问方式](https://mp.weixin.qq.com/s/eTEah5WOdfC3EAPbhpOKBA) \ No newline at end of file From e3ad38a3a683ee3ed045e1f6f09ec4dcb65b0dd8 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Wed, 11 Sep 2019 21:08:37 +0800 Subject: [PATCH 093/130] =?UTF-8?q?Update=20Java=E5=9F=BA=E7=A1=80?= =?UTF-8?q?=E7=9F=A5=E8=AF=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Java\345\237\272\347\241\200\347\237\245\350\257\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" index ad4987229d2..d8f1cad101d 100644 --- "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -123,7 +123,7 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有 **总结:** -1. Oracle JDK版本将每三年发布一次,而OpenJDK版本每三个月发布一次; +1. Oracle JDK大概没6个月发一次主要版本,而OpenJDK版本大概每三个月发布一次。但这不是固定的,我觉得了解这个没啥用处。详情参见:https://blogs.oracle.com/java-platform-group/update-and-faq-on-the-java-se-release-cadence。 2. OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是OpenJDK的一个实现,并不是完全开源的; 3. Oracle JDK 比 OpenJDK 更稳定。OpenJDK和Oracle JDK的代码几乎相同,但Oracle JDK有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到Oracle JDK就可以解决问题; 4. 在响应性和JVM性能方面,Oracle JDK与OpenJDK相比提供了更好的性能; From 338662e4dfc0342e039a1bb0abf28dc5b62ddd9f Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Wed, 11 Sep 2019 21:09:43 +0800 Subject: [PATCH 094/130] Update springboot-questions.md --- .../framework/spring/springboot-questions.md | 85 ++++++++++++++++++- 1 file changed, 82 insertions(+), 3 deletions(-) diff --git a/docs/system-design/framework/spring/springboot-questions.md b/docs/system-design/framework/spring/springboot-questions.md index dee84784ba8..fc09e0910f6 100644 --- a/docs/system-design/framework/spring/springboot-questions.md +++ b/docs/system-design/framework/spring/springboot-questions.md @@ -20,12 +20,91 @@ 7. Spring Boot提供命令行接口(CLI)工具,用于开发和测试Spring Boot应用程序,如Java或Groovy。 8. Spring Boot提供了多种插件,可以使用内置工具(如Maven和Gradle)开发和测试Spring Boot应用程序。 -### 为什么需要Spring Boot? +### 3. 为什么需要Spring Boot? Spring Framework旨在简化J2EE企业应用程序开发。Spring Boot Framework旨在简化Spring开发。 ![why-we-need-springboot](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/why-we-need-springboot.png) -### 什么是 Spring Boot Starters? +### 4. 什么是 Spring Boot Starters? + +Spring Boot Starters 是一系列依赖关系的集合,因为它的存在,项目的依赖之间的关系对我们来说变的更加简单了。举个例子:在没有Spring Boot Starters之前,我们开发REST服务或Web应用程序时; 我们需要使用像Spring MVC,Tomcat和Jackson这样的库,这些依赖我们需要手动一个一个添加。但是,有了 Spring Boot Starters 我们只需要一个只需添加一个**spring-boot-starter-web**一个依赖就可以了,这个依赖包含的字依赖中包含了我们开发REST 服务需要的所有依赖。 + +```xml + + org.springframework.boot + spring-boot-starter-web + +``` + +### 如何在Spring Boot应用程序中使用Jetty而不是Tomcat? + +Spring Boot Web starter使用Tomcat作为默认的嵌入式servlet容器, 如果你想使用 Jetty 的话只需要修改pom.xml(Maven)或者build.gradle(Gradle)就可以了。 + +**Maven:** + +```xml + + + org.springframework.boot + spring-boot-starter-web + + + org.springframework.boot + spring-boot-starter-tomcat + + + + + + org.springframework.boot + spring-boot-starter-jetty + +``` + +**Gradle:** + +```groovy +compile("org.springframework.boot:spring-boot-starter-web") { + exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat' +} +compile("org.springframework.boot:spring-boot-starter-jetty") +``` + +说个题外话,从上面可以看出使用 Gradle 更加简洁明了,但是国内目前还是 Maven 使用的多一点,我个人觉得 Gradle 在很多方面都要好很多。 + +### 介绍一下@SpringBootApplication注解 + +```java +package org.springframework.boot.autoconfigure; +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Inherited +@SpringBootConfiguration +@EnableAutoConfiguration +@ComponentScan(excludeFilters = { + @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), + @Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) }) +public @interface SpringBootApplication { + ...... +} +``` + +```java +package org.springframework.boot; +@Target(ElementType.TYPE) +@Retention(RetentionPolicy.RUNTIME) +@Documented +@Configuration +public @interface SpringBootConfiguration { + +} +``` + +可以看出大概可以把 `@SpringBootApplication `看作是 `@Configuration`、`@EnableAutoConfiguration`、`@ComponentScan ` 注解的集合。根据 SpringBoot官网,这三个注解的作用分别是: + +- `@EnableAutoConfiguration`:启用 SpringBoot 的自动配置机制 +- `@ComponentScan`: 扫描被`@Component` (`@Service`,`@Controller`)注解的bean,注解默认会扫描该类所在的包下所有的类。 +- `@Configuration`:允许在上下文中注册额外的bean或导入其他配置类 -Spring Boot Starters 是一系列 \ No newline at end of file From 94b994860dd74080b3af2a85c5cc7e41fecf0f4d Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Wed, 11 Sep 2019 21:13:51 +0800 Subject: [PATCH 095/130] Update Redis.md --- docs/database/Redis/Redis.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/docs/database/Redis/Redis.md b/docs/database/Redis/Redis.md index 5aaf549f964..33790b266a4 100644 --- a/docs/database/Redis/Redis.md +++ b/docs/database/Redis/Redis.md @@ -32,7 +32,7 @@ **高性能:** -假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可! +假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在缓存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可! ![](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-24/54316596.jpg) @@ -254,7 +254,6 @@ Redis 通过 MULTI、EXEC、WATCH 等命令来实现事务(transaction)功能。 补充内容: > 1. redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。(来自[issue:关于Redis事务不是原子性问题](https://github.com/Snailclimb/JavaGuide/issues/452) ) -> 2. ### 缓存雪崩和缓存穿透问题解决方案 From 5140c0e526c0574d20f4c28aa6fa82910f4f5de3 Mon Sep 17 00:00:00 2001 From: Kai Date: Thu, 12 Sep 2019 10:14:06 +0800 Subject: [PATCH 096/130] =?UTF-8?q?=E4=BF=AE=E6=94=B9=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\345\237\272\347\241\200\347\237\245\350\257\206.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" index d8f1cad101d..f6f0eb41688 100644 --- "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" +++ "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" @@ -123,7 +123,7 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有 **总结:** -1. Oracle JDK大概没6个月发一次主要版本,而OpenJDK版本大概每三个月发布一次。但这不是固定的,我觉得了解这个没啥用处。详情参见:https://blogs.oracle.com/java-platform-group/update-and-faq-on-the-java-se-release-cadence。 +1. Oracle JDK大概每6个月发一次主要版本,而OpenJDK版本大概每三个月发布一次。但这不是固定的,我觉得了解这个没啥用处。详情参见:https://blogs.oracle.com/java-platform-group/update-and-faq-on-the-java-se-release-cadence。 2. OpenJDK 是一个参考模型并且是完全开源的,而Oracle JDK是OpenJDK的一个实现,并不是完全开源的; 3. Oracle JDK 比 OpenJDK 更稳定。OpenJDK和Oracle JDK的代码几乎相同,但Oracle JDK有更多的类和一些错误修复。因此,如果您想开发企业/商业软件,我建议您选择Oracle JDK,因为它经过了彻底的测试和稳定。某些情况下,有些人提到在使用OpenJDK 可能会遇到了许多应用程序崩溃的问题,但是,只需切换到Oracle JDK就可以解决问题; 4. 在响应性和JVM性能方面,Oracle JDK与OpenJDK相比提供了更好的性能; From 08b820ede5c9e4ee1c304851372ddd884292d9b1 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sun, 15 Sep 2019 16:56:10 +0800 Subject: [PATCH 097/130] Update SpringInterviewQuestions.md --- .../system-design/framework/spring/SpringInterviewQuestions.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index abf57c502d1..cc16267638f 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -351,6 +351,8 @@ String transient4; // not persistent because of @Transient 一般使用后面两种方式比较多,我个人使用注解的方式比较多。 +# 认证 (authentication) 和授权 (authorization) + ## 参考 - 《Spring 技术内幕》 @@ -371,4 +373,3 @@ String transient4; // not persistent because of @Transient **Java工程师必备学习资源:** 一些Java工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。 ![公众号](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/javaguide1.jpg) - From e94679c700ed2201346c416434144503c5c5f495 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sun, 15 Sep 2019 17:20:46 +0800 Subject: [PATCH 098/130] Update SpringInterviewQuestions.md --- .../spring/SpringInterviewQuestions.md | 169 ++++++++++-------- 1 file changed, 96 insertions(+), 73 deletions(-) diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index cc16267638f..06ed96fd596 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -30,7 +30,7 @@ 这篇文章主要是想通过一些问题,加深大家对于 Spring 的理解,所以不会涉及太多的代码!这篇文章整理了挺长时间,下面的很多问题我自己在使用 Spring 的过程中也并没有注意,自己也是临时查阅了很多资料和书籍补上的。网上也有一些很多关于 Spring 常见问题/面试题整理的文章,我感觉大部分都是互相 copy,而且很多问题也不是很好,有些回答也存在问题。所以,自己花了一周的业余时间整理了一下,希望对大家有帮助。 -## 什么是 Spring 框架? +## 1. 什么是 Spring 框架? Spring 是一种轻量级开发框架,旨在提高开发人员的开发效率以及系统的可维护性。Spring 官网:。 @@ -45,7 +45,7 @@ Spring 官网列出的 Spring 的 6 个特征: - **集成** :远程处理,JMS,JCA,JMX,电子邮件,任务,调度,缓存。 - **语言** :Kotlin,Groovy,动态语言。 -## 列举一些重要的Spring模块? +## 2. 列举一些重要的Spring模块? 下图对应的是 Spring4.x 版本。目前最新的5.x版本中 Web 模块的 Portlet 组件已经被废弃掉,同时增加了用于异步响应式处理的 WebFlux 组件。 @@ -60,21 +60,21 @@ Spring 官网列出的 Spring 的 6 个特征: - **Spring Web** : 为创建Web应用程序提供支持。 - **Spring Test** : 提供了对 JUnit 和 TestNG 测试的支持。 -## @RestController vs @Controller +## 3. @RestController vs @Controller -### Controller 返回一个页面 +**`Controller` 返回一个页面** 单独使用 `@Controller` 不加 `@ResponseBody`的话一般使用在要返回一个视图的情况,这种情况属于比较传统的Spring MVC 的应用,对应于前后端不分离的情况。 ![SpringMVC 传统工作流程](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringMVC传统工作流程.png) -### @RestController 返回JSON 或 XML 形式数据 +**`@RestController` 返回JSON 或 XML 形式数据** 但`@RestController`只返回对象,对象数据直接以 JSON 或 XML 形式写入 HTTP 响应(Response)中,这种情况属于 RESTful Web服务,这也是目前日常开发所接触的最常用的情况(前后端分离)。 ![SpringMVC+RestController](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/SpringMVCRestController.png) -### @Controller +@ResponseBody 返回JSON 或 XML 形式数据 +**`@Controller +@ResponseBody` 返回JSON 或 XML 形式数据** 如果你需要在Spring4之前开发 RESTful Web服务的话,你需要使用`@Controller` 并结合`@ResponseBody`注解,也就是说`@Controller` +`@ResponseBody`= `@RestController`(Spring 4 之后新加的注解)。 @@ -87,9 +87,11 @@ Reference: - https://dzone.com/articles/spring-framework-restcontroller-vs-controller(图片来源) - https://javarevisited.blogspot.com/2017/08/difference-between-restcontroller-and-controller-annotations-spring-mvc-rest.html?m=1 -## 谈谈自己对于 Spring IoC 和 AOP 的理解 +## 4. Spring IOC & AOP -### IoC +### 4.1 谈谈自己对于 Spring IoC 和 AOP 的理解 + +#### IoC IoC(Inverse of Control:控制反转)是一种**设计思想**,就是 **将原本在程序中手动创建对象的控制权,交由Spring框架来管理。** IoC 在其他语言中也有应用,并非 Spirng 特有。 **IoC 容器是 Spring 用来实现 IoC 的载体, IoC 容器实际上就是个Map(key,value),Map 中存放的是各种对象。** @@ -107,7 +109,7 @@ IoC源码阅读 - https://javadoop.com/post/spring-ioc -### AOP +#### AOP AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无关,**却为业务模块所共同调用的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来**,便于**减少系统的重复代码**,**降低模块间的耦合度**,并**有利于未来的可拓展性和可维护性**。 @@ -119,7 +121,7 @@ AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无 使用 AOP 之后我们可以把一些通用功能抽象出来,在需要用到的地方直接使用即可,这样大大简化了代码量。我们需要增加新功能时也方便,这样也提高了系统扩展性。日志功能、事务管理等等场景都用到了 AOP 。 -## Spring AOP 和 AspectJ AOP 有什么区别? +### 4.2 Spring AOP 和 AspectJ AOP 有什么区别? **Spring AOP 属于运行时增强,而 AspectJ 是编译时增强。** Spring AOP 基于代理(Proxying),而 AspectJ 基于字节码操作(Bytecode Manipulation)。 @@ -127,7 +129,9 @@ AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无 如果我们的切面比较少,那么两者性能差异不大。但是,当切面太多的话,最好选择 AspectJ ,它比Spring AOP 快很多。 -## Spring 中的 bean 的作用域有哪些? +## 5. Spring bean + +### 5.1 Spring 中的 bean 的作用域有哪些? - singleton : 唯一 bean 实例,Spring 中的 bean 默认都是单例的。 - prototype : 每次请求都会创建一个新的 bean 实例。 @@ -135,7 +139,7 @@ AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无 - session : 每一次HTTP请求都会产生一个新的 bean,该bean仅在当前 HTTP session 内有效。 - global-session: 全局session作用域,仅仅在基于portlet的web应用中才有意义,Spring5已经没有了。Portlet是能够生成语义代码(例如:HTML)片段的小型Java Web插件。它们基于portlet容器,可以像servlet一样处理HTTP请求。但是,与 servlet 不同,每个 portlet 都有不同的会话 -## Spring 中的单例 bean 的线程安全问题了解吗? +### 5.2 Spring 中的单例 bean 的线程安全问题了解吗? 大部分时候我们并没有在系统中使用多线程,所以很少有人会关注这个问题。单例 bean 存在线程问题,主要是因为当多个线程操作同一个对象的时候,对这个对象的非静态成员变量的写操作会存在线程安全问题。 @@ -145,7 +149,60 @@ AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无 2. 在类中定义一个ThreadLocal成员变量,将需要的可变成员变量保存在 ThreadLocal 中(推荐的一种方式)。 -## Spring 中的 bean 生命周期? + +### 5.3 @Component 和 @Bean 的区别是什么? + +1. 作用对象不同: `@Component` 注解作用于类,而`@Bean`注解作用于方法。 +2. `@Component`通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用 `@ComponentScan` 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。`@Bean` 注解通常是我们在标有该注解的方法中定义产生这个 bean,`@Bean`告诉了Spring这是某个类的示例,当我需要用它的时候还给我。 +3. `@Bean` 注解比 `Component` 注解的自定义性更强,而且很多地方我们只能通过 `@Bean` 注解来注册bean。比如当我们引用第三方库中的类需要装配到 `Spring`容器时,则只能通过 `@Bean`来实现。 + +`@Bean`注解使用示例: + +```java +@Configuration +public class AppConfig { + @Bean + public TransferService transferService() { + return new TransferServiceImpl(); + } + +} +``` + + 上面的代码相当于下面的 xml 配置 + +```xml + + + +``` + +下面这个例子是通过 `@Component` 无法实现的。 + +```java +@Bean +public OneService getService(status) { + case (status) { + when 1: + return new serviceImpl1(); + when 2: + return new serviceImpl2(); + when 3: + return new serviceImpl3(); + } +} +``` + +### 5.4 将一个类声明为Spring的 bean 的注解有哪些? + +我们一般使用 `@Autowired` 注解自动装配 bean,要想把类标识成可用于 `@Autowired` 注解自动装配的 bean 的类,采用以下注解可实现: + +- `@Component` :通用的注解,可标注任意类为 `Spring` 组件。如果一个Bean不知道属于哪个层,可以使用`@Component` 注解标注。 +- `@Repository` : 对应持久层即 Dao 层,主要用于数据库相关操作。 +- `@Service` : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。 +- `@Controller` : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。 + +### 5.5 Spring 中的 bean 生命周期? 这部分网上有很多文章都讲到了,下面的内容整理自: ,除了这篇文章,再推荐一篇很不错的文章 : 。 @@ -171,7 +228,9 @@ AOP(Aspect-Oriented Programming:面向切面编程)能够将那些与业务无 ![Spring Bean 生命周期](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-9-17/5496407.jpg) -## 说说自己对于 Spring MVC 了解? +## 6. Spring MVC + +### 6.1 说说自己对于 Spring MVC 了解? 谈到这个问题,我们不得不提提之前 Model1 和 Model2 这两个没有 Spring MVC 的时代。 @@ -186,7 +245,7 @@ MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring M ![](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-10-11/60679444.jpg) -## SpringMVC 工作原理了解吗? +### 6.2 SpringMVC 工作原理了解吗? **原理如下图所示:** ![SpringMVC运行原理](http://my-blog-to-use.oss-cn-beijing.aliyuncs.com/18-10-11/49790288.jpg) @@ -204,7 +263,7 @@ MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring M 7. `DispaterServlet` 把返回的 `Model` 传给 `View`(视图渲染)。 8. 把 `View` 返回给请求者(浏览器) -## Spring 框架中用到了哪些设计模式? +## 7. Spring 框架中用到了哪些设计模式? 关于下面一些设计模式的详细介绍,可以看笔主前段时间的原创文章[《面试官:“谈谈Spring中都用到了那些设计模式?”。》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485303&idx=1&sn=9e4626a1e3f001f9b0d84a6fa0cff04a&chksm=cea248bcf9d5c1aaf48b67cc52bac74eb29d6037848d6cf213b0e5466f2d1fda970db700ba41&token=255050878&lang=zh_CN#rd) 。 @@ -217,59 +276,9 @@ MVC 是一种设计模式,Spring MVC 是一款很优秀的 MVC 框架。Spring M - **适配器模式** :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配`Controller`。 - ...... -## @Component 和 @Bean 的区别是什么? +## 8. Spring 事务 -1. 作用对象不同: `@Component` 注解作用于类,而`@Bean`注解作用于方法。 -2. `@Component`通常是通过类路径扫描来自动侦测以及自动装配到Spring容器中(我们可以使用 `@ComponentScan` 注解定义要扫描的路径从中找出标识了需要装配的类自动装配到 Spring 的 bean 容器中)。`@Bean` 注解通常是我们在标有该注解的方法中定义产生这个 bean,`@Bean`告诉了Spring这是某个类的示例,当我需要用它的时候还给我。 -3. `@Bean` 注解比 `Component` 注解的自定义性更强,而且很多地方我们只能通过 `@Bean` 注解来注册bean。比如当我们引用第三方库中的类需要装配到 `Spring`容器时,则只能通过 `@Bean`来实现。 - -`@Bean`注解使用示例: - -```java -@Configuration -public class AppConfig { - @Bean - public TransferService transferService() { - return new TransferServiceImpl(); - } - -} -``` - - 上面的代码相当于下面的 xml 配置 - -```xml - - - -``` - -下面这个例子是通过 `@Component` 无法实现的。 - -```java -@Bean -public OneService getService(status) { - case (status) { - when 1: - return new serviceImpl1(); - when 2: - return new serviceImpl2(); - when 3: - return new serviceImpl3(); - } -} -``` - -## 将一个类声明为Spring的 bean 的注解有哪些? - -我们一般使用 `@Autowired` 注解自动装配 bean,要想把类标识成可用于 `@Autowired` 注解自动装配的 bean 的类,采用以下注解可实现: - -- `@Component` :通用的注解,可标注任意类为 `Spring` 组件。如果一个Bean不知道属于哪个层,可以使用`@Component` 注解标注。 -- `@Repository` : 对应持久层即 Dao 层,主要用于数据库相关操作。 -- `@Service` : 对应服务层,主要涉及一些复杂的逻辑,需要用到 Dao层。 -- `@Controller` : 对应 Spring MVC 控制层,主要用户接受用户请求并调用 Service 层返回数据给前端页面。 - -## Spring 管理事务的方式有几种? +### 8.1 Spring 管理事务的方式有几种? 1. 编程式事务,在代码中硬编码。(不推荐使用) 2. 声明式事务,在配置文件中配置(推荐使用) @@ -279,7 +288,7 @@ public OneService getService(status) { 1. 基于XML的声明式事务 2. 基于注解的声明式事务 -## Spring 事务中的隔离级别有哪几种? +### 8.2 Spring 事务中的隔离级别有哪几种? **TransactionDefinition 接口中定义了五个表示隔离级别的常量:** @@ -289,7 +298,7 @@ public OneService getService(status) { - **TransactionDefinition.ISOLATION_REPEATABLE_READ:** 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,**可以阻止脏读和不可重复读,但幻读仍有可能发生。** - **TransactionDefinition.ISOLATION_SERIALIZABLE:** 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,**该级别可以防止脏读、不可重复读以及幻读**。但是这将严重影响程序的性能。通常情况下也不会用到该级别。 -## Spring 事务中哪几种事务传播行为? +### 8.3 Spring 事务中哪几种事务传播行为? **支持当前事务的情况:** @@ -307,7 +316,7 @@ public OneService getService(status) { - **TransactionDefinition.PROPAGATION_NESTED:** 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。 -## @Transactional(rollbackFor = Exception.class)注解了解吗? +### 8.4 @Transactional(rollbackFor = Exception.class)注解了解吗? 我们知道:Exception分为运行时异常RuntimeException和非运行时异常。事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。 @@ -315,7 +324,9 @@ public OneService getService(status) { 在`@Transactional`注解中如果不配置`rollbackFor`属性,那么事物只会在遇到`RuntimeException`的时候才会回滚,加上`rollbackFor=Exception.class`,可以让事物在遇到非运行时异常时也回滚。 -## 如何使用JPA在数据库中非持久化一个字段? +## 9. JPA + +### 9.1 如何使用JPA在数据库中非持久化一个字段? 假如我们有有下面一个类: @@ -351,7 +362,19 @@ String transient4; // not persistent because of @Transient 一般使用后面两种方式比较多,我个人使用注解的方式比较多。 -# 认证 (authentication) 和授权 (authorization) +## 10. Spring Security + +### 10.1 认证 (Authentication) 和授权 (Authorization) + +这是一个绝大多数人都会混淆的问题。首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么。 + +**Authentication(认证)** 是验证您的身份的凭据(例如用户名/用户ID和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。 + +**Authorization(授权)** 发生在 **Authentication(认证)**之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。 + +这两个一般在我们的系统中被结合在一起使用,目的就是为了保护我们系统的安全性。 + + ## 参考 From e5df8a62d0225d5fa2610ea6e72362cb175c426c Mon Sep 17 00:00:00 2001 From: ice Date: Sun, 15 Sep 2019 22:07:57 +0800 Subject: [PATCH 099/130] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E9=94=99=E5=88=AB?= =?UTF-8?q?=E5=AD=97=EF=BC=8C=E2=80=9C=E5=8F=82=E5=8A=A0=E2=80=9D=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E4=B8=BA=E2=80=9C=E5=8F=82=E8=80=83=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/java/Multithread/AQS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/java/Multithread/AQS.md b/docs/java/Multithread/AQS.md index 8a82051bc46..287116d7da2 100644 --- a/docs/java/Multithread/AQS.md +++ b/docs/java/Multithread/AQS.md @@ -33,7 +33,7 @@ AQS是一个用来构建锁和同步器的框架,使用AQS能简单且高效 ### 2 AQS 原理 -> 在面试中被问到并发知识的时候,大多都会被问到“请你说一下自己对于AQS原理的理解”。下面给大家一个示例供大家参加,面试不是背题,大家一定要加入自己的思想,即使加入不了自己的思想也要保证自己能够通俗的讲出来而不是背出来。 +> 在面试中被问到并发知识的时候,大多都会被问到“请你说一下自己对于AQS原理的理解”。下面给大家一个示例供大家参考,面试不是背题,大家一定要加入自己的思想,即使加入不了自己的思想也要保证自己能够通俗的讲出来而不是背出来。 下面大部分内容其实在AQS类注释上已经给出了,不过是英语看着比较吃力一点,感兴趣的话可以看看源码。 From d42d4c197fcd8f99b776be857a4a888bdf1d9e42 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Mon, 16 Sep 2019 20:29:00 +0800 Subject: [PATCH 100/130] Update SpringInterviewQuestions.md --- .../framework/spring/SpringInterviewQuestions.md | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index 06ed96fd596..5ae5ea53c7b 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -374,7 +374,19 @@ String transient4; // not persistent because of @Transient 这两个一般在我们的系统中被结合在一起使用,目的就是为了保护我们系统的安全性。 +### Cookie的作用是什么?和Session有什么区别? +Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。 + + **Cookie 一般用来保存用户信息** 比如①我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了;②一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写);③登录一次网站后访问网站其他页面不需要重新登录。**Session 的主要作用就是通过服务端记录用户的状态。** 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。 + +Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。 + +Cookie 存储在客户端中,而Session存储在服务器上,相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。 + +### 什么是JWT? + +> JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted. ——[JSON Web Token (JWT)](https://tools.ietf.org/html/rfc7519) ## 参考 From b275a98ea588a898250edd84749affdf362b79ba Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Mon, 16 Sep 2019 20:29:13 +0800 Subject: [PATCH 101/130] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4d77af090c3..946f3c4b77a 100644 --- a/README.md +++ b/README.md @@ -276,7 +276,7 @@ Markdown 格式参考:[Github Markdown格式](https://guides.github.com/featur 添加我的微信备注“Github”,回复关键字 **“加群”** 即可入群。 -![我的微信](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-6/wechat1.jpg) +![个人微信](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/wechat3.jpeg) ### Contributor From 3bb6f59ac0072e0ef6f3ce38a14f59fa13ceb229 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Mon, 16 Sep 2019 22:58:14 +0800 Subject: [PATCH 102/130] =?UTF-8?q?Update=20Java=E5=86=85=E5=AD=98?= =?UTF-8?q?=E5=8C=BA=E5=9F=9F.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Java\345\206\205\345\255\230\345\214\272\345\237\237.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" index 5feb79a035a..1a7eab5c639 100644 --- "a/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" +++ "b/docs/java/jvm/Java\345\206\205\345\255\230\345\214\272\345\237\237.md" @@ -342,7 +342,7 @@ true ### 4.3 8 种基本类型的包装类和常量池 -- **Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte,Short,Integer,Long,Character,Boolean;这 5 种包装类默认创建了数值[-128,127] 的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。** +- **Java 基本类型的包装类的大部分都实现了常量池技术,即 Byte,Short,Integer,Long,Character,Boolean;这 5 种包装类默认创建了数值[-128,127] 的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。** 为啥把缓存设置为[-128,127]区间?([参见issue/461](https://github.com/Snailclimb/JavaGuide/issues/461))性能和资源之间的权衡。 - **两种浮点数类型的包装类 Float,Double 并没有实现常量池技术。** ```java From d19525771ff17f47d5ad3a998c259b13004e5291 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Mon, 16 Sep 2019 22:58:18 +0800 Subject: [PATCH 103/130] Update ThredLocal.md --- docs/java/Multithread/ThredLocal.md | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/docs/java/Multithread/ThredLocal.md b/docs/java/Multithread/ThredLocal.md index 590cf754a2e..84d619df728 100644 --- a/docs/java/Multithread/ThredLocal.md +++ b/docs/java/Multithread/ThredLocal.md @@ -129,7 +129,19 @@ ThreadLocal.ThreadLocalMap inheritableThreadLocals = null; 通过上面这些内容,我们足以通过猜测得出结论:**最终的变量是放在了当前线程的 `ThreadLocalMap` 中,并不是存在 `ThreadLocal` 上,ThreadLocal 可以理解为只是ThreadLocalMap的封装,传递了变量值。** -**每个`Thread`中都具备一个`ThreadLocalMap`,而`ThreadLocalMap`可以存储以`ThreadLocal`为key的键值对。这里解释了为什么每个线程访问同一个`ThreadLocal`,得到的确是不同的数值。另外,`ThreadLocal` 是 map结构是为了让每个线程可以关联多个 `ThreadLocal`变量。** +**每个Thread中都具备一个ThreadLocalMap,而ThreadLocalMap可以存储以ThreadLocal为key的键值对。** 比如我们在同一个线程中声明了两个 `ThreadLocal` 对象的话,会使用 `Thread`内部都是使用仅有那个`ThreadLocalMap` 存放数据的,`ThreadLocalMap`的 key 就是 `ThreadLocal`对象,value 就是 `ThreadLocal` 对象调用`set`方法设置的值。`ThreadLocal` 是 map结构是为了让每个线程可以关联多个 `ThreadLocal`变量。这也就解释了ThreadLocal声明的变量为什么在每一个线程都有自己的专属本地变量。 + +```java +public class Thread implements Runnable { + ...... +//与此线程有关的ThreadLocal值。由ThreadLocal类维护 +ThreadLocal.ThreadLocalMap threadLocals = null; + +//与此线程有关的InheritableThreadLocal值。由InheritableThreadLocal类维护 +ThreadLocal.ThreadLocalMap inheritableThreadLocals = null; + ...... +} +``` `ThreadLocalMap`是`ThreadLocal`的静态内部类。 From e8dcd0d6b8b8624dc8b2396249fc9d066fd76d95 Mon Sep 17 00:00:00 2001 From: lee <454884446@qq.com> Date: Tue, 17 Sep 2019 11:27:12 +0800 Subject: [PATCH 104/130] =?UTF-8?q?=E9=94=99=E5=88=AB=E5=AD=97=E5=8B=98?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0\345\215\203\350\241\214MySQL\345\221\275\344\273\244.md" | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git "a/docs/database/\344\270\200\345\215\203\350\241\214MySQL\345\221\275\344\273\244.md" "b/docs/database/\344\270\200\345\215\203\350\241\214MySQL\345\221\275\344\273\244.md" index c0c4a99d938..1ddc9ade2c6 100644 --- "a/docs/database/\344\270\200\345\215\203\350\241\214MySQL\345\221\275\344\273\244.md" +++ "b/docs/database/\344\270\200\345\215\203\350\241\214MySQL\345\221\275\344\273\244.md" @@ -104,7 +104,7 @@ SHOW VARIABLES -- 显示系统变量信息 -- 查看所有表 SHOW TABLES[ LIKE 'pattern'] SHOW TABLES FROM 库名 --- 查看表机构 +-- 查看表结构 SHOW CREATE TABLE 表名 (信息更详细) DESC 表名 / DESCRIBE 表名 / EXPLAIN 表名 / SHOW COLUMNS FROM 表名 [LIKE 'PATTERN'] SHOW TABLE STATUS [FROM db_name] [LIKE 'pattern'] @@ -590,7 +590,7 @@ CREATE [OR REPLACE] [ALGORITHM = {UNDEFINED | MERGE | TEMPTABLE}] VIEW view_name ```mysql 事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全成功要不全失败。 - 支持连续SQL的集体成功或集体撤销。 - - 事务是数据库在数据晚自习方面的一个功能。 + - 事务是数据库在数据完整性方面的一个功能。 - 需要利用 InnoDB 或 BDB 存储引擎,对自动提交的特性支持完成。 - InnoDB被称为事务安全型引擎。 -- 事务开启 From 7e2b3e0742e39150714fcc8d55c5f5723443387c Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Tue, 17 Sep 2019 13:43:14 +0800 Subject: [PATCH 105/130] Update SpringInterviewQuestions.md --- docs/system-design/framework/spring/SpringInterviewQuestions.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index 5ae5ea53c7b..d1af5e3e6e3 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -388,6 +388,8 @@ Cookie 存储在客户端中,而Session存储在服务器上,相对来说 Se > JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted. ——[JSON Web Token (JWT)](https://tools.ietf.org/html/rfc7519) + + ## 参考 - 《Spring 技术内幕》 From 156befeba9f2700216d3d3a515e166fb473e34d8 Mon Sep 17 00:00:00 2001 From: hunghv-0939 Date: Thu, 19 Sep 2019 23:06:05 +0700 Subject: [PATCH 106/130] Test Backtracking NQueens --- docs/test/test_backtracking_nqueen.jav | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 docs/test/test_backtracking_nqueen.jav diff --git a/docs/test/test_backtracking_nqueen.jav b/docs/test/test_backtracking_nqueen.jav new file mode 100644 index 00000000000..0bd6ab17b0a --- /dev/null +++ b/docs/test/test_backtracking_nqueen.jav @@ -0,0 +1,26 @@ +package com.gpcoder.junit.util; +import org.junit.Assert; +import org.junit.Test; +public class solveNQueensTest { + public void dfsTest() { + List> resultList = new LinkedList<>(); + final int[] expected = [2, 4, 6, 8, 3, 1, 7, 5]; + final int[] result = new int[8]; + dfs(resultList, result, 0, 8); + Assert.assertArrayEquals(expected, result); + } + public void dfsTest2() { + List> resultList = new LinkedList<>(); + final int[] expected = [2, 4, 1, 3]; + final int[] result = new int[4]; + dfs(resultList, result, 0, 4); + Assert.assertArrayEquals(expected, result); + } + public void dfsTest3() { + List> resultList = new LinkedList<>(); + final int[] expected = []; + final int[] result = new int[3]; + dfs(resultList, result, 0, 3); + Assert.assertArrayEquals(expected, result); + } +} From 5c4413ae83625d7e800a8c1215a1073e7efa4050 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Fri, 20 Sep 2019 09:16:58 +0800 Subject: [PATCH 107/130] Update SpringInterviewQuestions.md --- .../spring/SpringInterviewQuestions.md | 81 +++++++++++-------- 1 file changed, 46 insertions(+), 35 deletions(-) diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index d1af5e3e6e3..5cea90f9394 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -1,33 +1,3 @@ - - -- [什么是 Spring 框架?](#什么是-spring-框架) -- [列举一些重要的Spring模块?](#列举一些重要的spring模块) -- [@RestController vs @Controller](#restcontroller-vs-controller) - - [Controller 返回一个页面](#controller-返回一个页面) - - [@RestController 返回JSON 或 XML 形式数据](#restcontroller-返回json-或-xml-形式数据) - - [@Controller +@ResponseBody 返回JSON 或 XML 形式数据](#controller-responsebody-返回json-或-xml-形式数据) -- [谈谈自己对于 Spring IoC 和 AOP 的理解](#谈谈自己对于-spring-ioc-和-aop-的理解) - - [IoC](#ioc) - - [AOP](#aop) -- [Spring AOP 和 AspectJ AOP 有什么区别?](#spring-aop-和-aspectj-aop-有什么区别) -- [Spring 中的 bean 的作用域有哪些?](#spring-中的-bean-的作用域有哪些) -- [Spring 中的单例 bean 的线程安全问题了解吗?](#spring-中的单例-bean-的线程安全问题了解吗) -- [Spring 中的 bean 生命周期?](#spring-中的-bean-生命周期) -- [说说自己对于 Spring MVC 了解?](#说说自己对于-spring-mvc-了解) -- [SpringMVC 工作原理了解吗?](#springmvc-工作原理了解吗) -- [Spring 框架中用到了哪些设计模式?](#spring-框架中用到了哪些设计模式) -- [@Component 和 @Bean 的区别是什么?](#component-和-bean-的区别是什么) -- [将一个类声明为Spring的 bean 的注解有哪些?](#将一个类声明为spring的-bean-的注解有哪些) -- [Spring 管理事务的方式有几种?](#spring-管理事务的方式有几种) -- [Spring 事务中的隔离级别有哪几种?](#spring-事务中的隔离级别有哪几种) -- [Spring 事务中哪几种事务传播行为?](#spring-事务中哪几种事务传播行为) -- [@Transactional(rollbackFor = Exception.class)注解了解吗?](#transactionalrollbackfor--exceptionclass注解了解吗) -- [如何使用JPA在数据库中非持久化一个字段?](#如何使用jpa在数据库中非持久化一个字段) -- [参考](#参考) -- [公众号](#公众号) - - - 这篇文章主要是想通过一些问题,加深大家对于 Spring 的理解,所以不会涉及太多的代码!这篇文章整理了挺长时间,下面的很多问题我自己在使用 Spring 的过程中也并没有注意,自己也是临时查阅了很多资料和书籍补上的。网上也有一些很多关于 Spring 常见问题/面试题整理的文章,我感觉大部分都是互相 copy,而且很多问题也不是很好,有些回答也存在问题。所以,自己花了一周的业余时间整理了一下,希望对大家有帮助。 ## 1. 什么是 Spring 框架? @@ -374,22 +344,63 @@ String transient4; // not persistent because of @Transient 这两个一般在我们的系统中被结合在一起使用,目的就是为了保护我们系统的安全性。 -### Cookie的作用是什么?和Session有什么区别? +### 10.2 Cookie的作用是什么?和Session有什么区别? Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。 - **Cookie 一般用来保存用户信息** 比如①我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了;②一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写);③登录一次网站后访问网站其他页面不需要重新登录。**Session 的主要作用就是通过服务端记录用户的状态。** 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。 + **Cookie 一般用来保存用户信息**。下面是 Cookie 的一些应用案例: + +1. 我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了; +2. 一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写); +3. 登录一次网站后访问网站其他页面不需要重新登录。 + +**Session 的主要作用就是通过服务端记录用户的状态。** 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。 + +很多时候我们都是通过 SessionID 来实现特定的用户,SessionID 一般会选择存放在 Redis 中。举个例子:用户成功登陆系统,然后返回给客户端具有 SessionID 的 Cookie,当用户向后端发起请求的时候会把 SessionID 带上,这样后端就知道你的身份状态了。关于这种认证方式更详细的过程如下: + +![Session Based Authentication flow](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Session-Based-Authentication-flow.png) + +1. 用户向服务器发送用户名和密码用于登陆系统。 +2. 服务器验证通过后,服务器为用户创建一个 Session,并将 Session信息存储 起来。 +3. 服务器向用户返回一个 SessionID,写入用户的 Cookie。 +4. 当用户保持登录状态时,Cookie 将与每个后续请求一起被发送出去。 +5. 服务器可以将存储在 Cookie 上的 Session ID 与存储在内存中或者数据库中的 Session 信息进行比较,以验证用户的身份,返回给用户客户端响应信息的时候会附带用户当前的状态。 + +另外,Spring Session提供了一种跨多个应用程序或实例管理用户会话信息的机制。如果想详细了解可以查看下面几篇很不错的文章: + +- [Getting Started with Spring Session](https://codeboje.de/spring-session-tutorial/) +- [Guide to Spring Session](https://www.baeldung.com/spring-session) +- [Sticky Sessions with Spring Session & Redis](https://medium.com/@gvnix/sticky-sessions-with-spring-session-redis-bdc6f7438cc3) -Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。 +Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。 + +### 10.3 什么是JWT? + +我们在上一个问题中探讨了使用 Session 来鉴别用户的身份,并且给出了几个 Spring Session 的案例分享。 我们知道 Session 信息需要保存一份在服务器端。这种方式会带来一些麻烦,比如需要我们保证保存 Session 信息服务器的可用性、不适合移动端(依赖Cookie)等等。 + +有没有一种不需要自己存放 Session 信息就能实现身份验证的方式呢?当然!JWT (JSON Web Token) 就是一个很不错的解决办法。通过这种方式服务器端就不需要保存 Session 数据了,扩展性得到提升。 + +在基于 Token 进行身份验证的的应用程序中,服务器通过有效负载(`payload`)和一个密钥(`secret`)创建 令牌(`Token`)并将 `Token` 发送给客户端,客户端将 `Token` 保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization字段中:` Authorization: Bearer Token`。 + +![Token Based Authentication flow](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Token-Based-Authentication.png) + +1. 用户向服务器发送用户名和密码用于登陆系统。 +2. 身份验证服务响应并返回了签名的 JWT,上面包含了用户是谁的内容。 +3. 用户以后每次向后端发请求都在Header中带上 JWT。 +4. 服务端检查 JWT 并从中获取用户相关信息。 -Cookie 存储在客户端中,而Session存储在服务器上,相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。 -### 什么是JWT? > JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted. ——[JSON Web Token (JWT)](https://tools.ietf.org/html/rfc7519) +推荐阅读: + +- [JWT (JSON Web Tokens) Are Better Than Session Cookies](https://dzone.com/articles/jwtjson-web-tokens-are-better-than-session-cookies) +- [JSON Web Tokens (JWT) 与 Sessions](https://juejin.im/entry/577b7b56a3413100618c2938) +- [JSON Web Token 入门教程](https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html) + ## 参考 - 《Spring 技术内幕》 From 41fdc3031fb42b4ae17efb71e9d3a9695429c073 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sat, 21 Sep 2019 10:29:35 +0800 Subject: [PATCH 108/130] Update SpringInterviewQuestions.md --- .../spring/SpringInterviewQuestions.md | 33 ++++++++++++++----- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index 5cea90f9394..3a72085d3ef 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -334,7 +334,7 @@ String transient4; // not persistent because of @Transient ## 10. Spring Security -### 10.1 认证 (Authentication) 和授权 (Authorization) +### 10.1 区分认证 (Authentication) 和授权 (Authorization) 这是一个绝大多数人都会混淆的问题。首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么。 @@ -374,13 +374,25 @@ Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但 Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。 -### 10.3 什么是JWT? +### 10.3 什么是 Token?什么是 JWT? 我们在上一个问题中探讨了使用 Session 来鉴别用户的身份,并且给出了几个 Spring Session 的案例分享。 我们知道 Session 信息需要保存一份在服务器端。这种方式会带来一些麻烦,比如需要我们保证保存 Session 信息服务器的可用性、不适合移动端(依赖Cookie)等等。 -有没有一种不需要自己存放 Session 信息就能实现身份验证的方式呢?当然!JWT (JSON Web Token) 就是一个很不错的解决办法。通过这种方式服务器端就不需要保存 Session 数据了,扩展性得到提升。 +有没有一种不需要自己存放 Session 信息就能实现身份验证的方式呢?使用 Token 即可!JWT (JSON Web Token) 就是这种方式的实现,通过这种方式服务器端就不需要保存 Session 数据了,只用在客户端保存服务端返回给客户的 Token 就可以了,扩展性得到提升。 -在基于 Token 进行身份验证的的应用程序中,服务器通过有效负载(`payload`)和一个密钥(`secret`)创建 令牌(`Token`)并将 `Token` 发送给客户端,客户端将 `Token` 保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization字段中:` Authorization: Bearer Token`。 +**JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。** + +下面是 [RFC 7519](https://link.juejin.im/?target=https%3A%2F%2Ftools.ietf.org%2Fhtml%2Frfc7519) 对 JWT 做的较为正式的定义。 + +> JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted. ——[JSON Web Token (JWT)](https://tools.ietf.org/html/rfc7519) + +JWT 由 3 部分构成: + +1. Header :描述 JWT 的元数据。定义了生成签名的算法以及 Token 的类型。 +2. Payload(负载):用来存放实际需要传递的数据 +3. Signature(签名):服务器通过`Payload`、`Header`和一个密钥(`secret`)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。 + +在基于 Token 进行身份验证的的应用程序中,服务器通过`Payload`、`Header`和一个密钥(`secret`)创建令牌(`Token`)并将 `Token` 发送给客户端,客户端将 `Token` 保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization字段中:` Authorization: Bearer Token`。 ![Token Based Authentication flow](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Token-Based-Authentication.png) @@ -390,16 +402,19 @@ Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器 4. 服务端检查 JWT 并从中获取用户相关信息。 - -> JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted. ——[JSON Web Token (JWT)](https://tools.ietf.org/html/rfc7519) - - - 推荐阅读: - [JWT (JSON Web Tokens) Are Better Than Session Cookies](https://dzone.com/articles/jwtjson-web-tokens-are-better-than-session-cookies) - [JSON Web Tokens (JWT) 与 Sessions](https://juejin.im/entry/577b7b56a3413100618c2938) - [JSON Web Token 入门教程](https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html) +- [彻底理解Cookie,Session,Token](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485603&idx=1&sn=c8d324f44d6102e7b44554733da10bb7&chksm=cea24768f9d5ce7efe7291ddabce02b68db34073c7e7d9a7dc9a7f01c5a80cebe33ac75248df&token=844918801&lang=zh_CN#rd) + +### 10.4 Session vs Token + + + +### 10.5 什么是OAuth 2.0 + ## 参考 From 01ac4823c53d51fdedc943313038c98d19fb3119 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Tue, 24 Sep 2019 21:53:45 +0800 Subject: [PATCH 109/130] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 946f3c4b77a..9cdea774c63 100644 --- a/README.md +++ b/README.md @@ -164,6 +164,8 @@ - [Spring中bean的作用域与生命周期](docs/system-design/framework/spring/SpringBean.md) - [SpringMVC 工作原理详解](docs/system-design/framework/spring/SpringMVC-Principle.md) - [Spring中都用到了那些设计模式?](docs/system-design/framework/spring/Spring-Design-Patterns.md) +- [SpringBoot 使用指南](https://github.com/Snailclimb/springboot-guide) +- [Spring Security with JWT](https://github.com/Snailclimb/spring-security-jwt-guide) #### ZooKeeper From baf3989f222bc5d18f406dc7884eed6578da85bf Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Tue, 24 Sep 2019 22:07:34 +0800 Subject: [PATCH 110/130] Update Git.md --- docs/tools/Git.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/tools/Git.md b/docs/tools/Git.md index 37e1f4465c7..b6329f8775a 100644 --- a/docs/tools/Git.md +++ b/docs/tools/Git.md @@ -256,3 +256,4 @@ git push origin - [图解Git](http://marklodato.github.io/visual-git-guide/index-zh-cn.html) - [猴子都能懂得Git入门](https://backlog.com/git-tutorial/cn/intro/intro1_1.html) - https://git-scm.com/book/en/v2 +- [Generating a new SSH key and adding it to the ssh-agent](https://help.github.com/en/articles/generating-a-new-ssh-key-and-adding-it-to-the-ssh-agent) From 9618b37c0d1ddee7318c94d7c7318a792dbae1be Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Fri, 27 Sep 2019 14:09:33 +0800 Subject: [PATCH 111/130] Update README.md --- README.md | 18 ++++++++++++------ 1 file changed, 12 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 9cdea774c63..12e457a69ff 100644 --- a/README.md +++ b/README.md @@ -38,8 +38,9 @@ - [MySQL](#mysql) - [Redis](#redis) - [系统设计](#系统设计) - - [设计模式(工厂模式、单例模式 ... )](#设计模式) - [常用框架(Spring、Zookeeper ... )](#常用框架) + - [权限认证](#权限认证) + - [设计模式(工厂模式、单例模式 ... )](#设计模式) - [数据通信(消息队列、Dubbo ... )](#数据通信) - [网站架构](#网站架构) - [面试指南](#面试指南) @@ -151,10 +152,6 @@ ## 系统设计 -### 设计模式 - -- [设计模式系列文章](docs/system-design/设计模式.md) - ### 常用框架 #### Spring @@ -165,13 +162,22 @@ - [SpringMVC 工作原理详解](docs/system-design/framework/spring/SpringMVC-Principle.md) - [Spring中都用到了那些设计模式?](docs/system-design/framework/spring/Spring-Design-Patterns.md) - [SpringBoot 使用指南](https://github.com/Snailclimb/springboot-guide) -- [Spring Security with JWT](https://github.com/Snailclimb/spring-security-jwt-guide) +- #### ZooKeeper - [ZooKeeper 相关概念总结](docs/system-design/framework/ZooKeeper.md) - [ZooKeeper 数据模型和常见命令](docs/system-design/framework/ZooKeeper数据模型和常见命令.md) +### 权限认证 + +- [权限认证基础:]() +- [适合初学者入门 Spring Security With JWT 的 Demo](https://github.com/Snailclimb/spring-security-jwt-guide) + +### 设计模式 + +- [设计模式系列文章](docs/system-design/设计模式.md) + ### 数据通信 - [数据通信(RESTful、RPC、消息队列)相关知识点总结](docs/system-design/data-communication/summary.md) From c5a96c4069acc186d800ecfc22b369f45f228061 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Fri, 27 Sep 2019 14:16:10 +0800 Subject: [PATCH 112/130] Delete test_backtracking_nqueen.jav --- docs/test/test_backtracking_nqueen.jav | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 docs/test/test_backtracking_nqueen.jav diff --git a/docs/test/test_backtracking_nqueen.jav b/docs/test/test_backtracking_nqueen.jav deleted file mode 100644 index 0bd6ab17b0a..00000000000 --- a/docs/test/test_backtracking_nqueen.jav +++ /dev/null @@ -1,26 +0,0 @@ -package com.gpcoder.junit.util; -import org.junit.Assert; -import org.junit.Test; -public class solveNQueensTest { - public void dfsTest() { - List> resultList = new LinkedList<>(); - final int[] expected = [2, 4, 6, 8, 3, 1, 7, 5]; - final int[] result = new int[8]; - dfs(resultList, result, 0, 8); - Assert.assertArrayEquals(expected, result); - } - public void dfsTest2() { - List> resultList = new LinkedList<>(); - final int[] expected = [2, 4, 1, 3]; - final int[] result = new int[4]; - dfs(resultList, result, 0, 4); - Assert.assertArrayEquals(expected, result); - } - public void dfsTest3() { - List> resultList = new LinkedList<>(); - final int[] expected = []; - final int[] result = new int[3]; - dfs(resultList, result, 0, 3); - Assert.assertArrayEquals(expected, result); - } -} From f8e493d95ad5a8d4e26e748815458c555d23e2be Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Fri, 27 Sep 2019 14:24:09 +0800 Subject: [PATCH 113/130] feat:add authority-certification --- README.md | 2 +- .../basis-of-authority-certification.md | 79 ++++++++++++++++++ .../spring/SpringInterviewQuestions.md | 83 ------------------- 3 files changed, 80 insertions(+), 84 deletions(-) create mode 100644 docs/system-design/authority-certification/basis-of-authority-certification.md diff --git a/README.md b/README.md index 12e457a69ff..df57797c35c 100644 --- a/README.md +++ b/README.md @@ -171,7 +171,7 @@ ### 权限认证 -- [权限认证基础:]() +- [权限认证基础:区分Authentication,Authorization以及Cookie、Session、Token](docs/system-design/authority-certification/basis-of-authority-certification.md) - [适合初学者入门 Spring Security With JWT 的 Demo](https://github.com/Snailclimb/spring-security-jwt-guide) ### 设计模式 diff --git a/docs/system-design/authority-certification/basis-of-authority-certification.md b/docs/system-design/authority-certification/basis-of-authority-certification.md new file mode 100644 index 00000000000..18b7b3b7026 --- /dev/null +++ b/docs/system-design/authority-certification/basis-of-authority-certification.md @@ -0,0 +1,79 @@ +### 1 区分认证 (Authentication) 和授权 (Authorization) + +这是一个绝大多数人都会混淆的问题。首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么。 + + +**Authorization(授权)** 发生在 **Authentication(认证)**之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。 + +这两个一般在我们的系统中被结合在一起使用,目的就是为了保护我们系统的安全性。 + +### 2 Cookie的作用是什么?和Session有什么区别? + +Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。 + + **Cookie 一般用来保存用户信息**。下面是 Cookie 的一些应用案例: + +1. 我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了; +2. 一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写); +3. 登录一次网站后访问网站其他页面不需要重新登录。 + +**Session 的主要作用就是通过服务端记录用户的状态。** 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。 + +很多时候我们都是通过 SessionID 来实现特定的用户,SessionID 一般会选择存放在 Redis 中。举个例子:用户成功登陆系统,然后返回给客户端具有 SessionID 的 Cookie,当用户向后端发起请求的时候会把 SessionID 带上,这样后端就知道你的身份状态了。关于这种认证方式更详细的过程如下: + +![Session Based Authentication flow](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Session-Based-Authentication-flow.png) + +1. 用户向服务器发送用户名和密码用于登陆系统。 +2. 服务器验证通过后,服务器为用户创建一个 Session,并将 Session信息存储 起来。 +3. 服务器向用户返回一个 SessionID,写入用户的 Cookie。 +4. 当用户保持登录状态时,Cookie 将与每个后续请求一起被发送出去。 +5. 服务器可以将存储在 Cookie 上的 Session ID 与存储在内存中或者数据库中的 Session 信息进行比较,以验证用户的身份,返回给用户客户端响应信息的时候会附带用户当前的状态。 + +另外,Spring Session提供了一种跨多个应用程序或实例管理用户会话信息的机制。如果想详细了解可以查看下面几篇很不错的文章: + +- [Getting Started with Spring Session](https://codeboje.de/spring-session-tutorial/) +- [Guide to Spring Session](https://www.baeldung.com/spring-session) +- [Sticky Sessions with Spring Session & Redis](https://medium.com/@gvnix/sticky-sessions-with-spring-session-redis-bdc6f7438cc3) + +Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。 + +### 3 什么是 Token?什么是 JWT? + +我们在上一个问题中探讨了使用 Session 来鉴别用户的身份,并且给出了几个 Spring Session 的案例分享。 我们知道 Session 信息需要保存一份在服务器端。这种方式会带来一些麻烦,比如需要我们保证保存 Session 信息服务器的可用性、不适合移动端(依赖Cookie)等等。 + +有没有一种不需要自己存放 Session 信息就能实现身份验证的方式呢?使用 Token 即可!JWT (JSON Web Token) 就是这种方式的实现,通过这种方式服务器端就不需要保存 Session 数据了,只用在客户端保存服务端返回给客户的 Token 就可以了,扩展性得到提升。 + +**JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。** + +下面是 [RFC 7519](https://link.juejin.im/?target=https%3A%2F%2Ftools.ietf.org%2Fhtml%2Frfc7519) 对 JWT 做的较为正式的定义。 + +> JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted. ——[JSON Web Token (JWT)](https://tools.ietf.org/html/rfc7519) + +JWT 由 3 部分构成: + +1. Header :描述 JWT 的元数据。定义了生成签名的算法以及 Token 的类型。 +2. Payload(负载):用来存放实际需要传递的数据 +3. Signature(签名):服务器通过`Payload`、`Header`和一个密钥(`secret`)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。 + +在基于 Token 进行身份验证的的应用程序中,服务器通过`Payload`、`Header`和一个密钥(`secret`)创建令牌(`Token`)并将 `Token` 发送给客户端,客户端将 `Token` 保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization字段中:` Authorization: Bearer Token`。 + +![Token Based Authentication flow](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Token-Based-Authentication.png) + +1. 用户向服务器发送用户名和密码用于登陆系统。 +2. 身份验证服务响应并返回了签名的 JWT,上面包含了用户是谁的内容。 +3. 用户以后每次向后端发请求都在Header中带上 JWT。 +4. 服务端检查 JWT 并从中获取用户相关信息。 + + +推荐阅读: + +- [JWT (JSON Web Tokens) Are Better Than Session Cookies](https://dzone.com/articles/jwtjson-web-tokens-are-better-than-session-cookies) +- [JSON Web Tokens (JWT) 与 Sessions](https://juejin.im/entry/577b7b56a3413100618c2938) +- [JSON Web Token 入门教程](https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html) +- [彻底理解Cookie,Session,Token](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485603&idx=1&sn=c8d324f44d6102e7b44554733da10bb7&chksm=cea24768f9d5ce7efe7291ddabce02b68db34073c7e7d9a7dc9a7f01c5a80cebe33ac75248df&token=844918801&lang=zh_CN#rd) + +### 4 Session vs Token + + + +### 10.5 什么是OAuth 2.0 \ No newline at end of file diff --git a/docs/system-design/framework/spring/SpringInterviewQuestions.md b/docs/system-design/framework/spring/SpringInterviewQuestions.md index 3a72085d3ef..6d71f8a8cc3 100644 --- a/docs/system-design/framework/spring/SpringInterviewQuestions.md +++ b/docs/system-design/framework/spring/SpringInterviewQuestions.md @@ -332,89 +332,6 @@ String transient4; // not persistent because of @Transient 一般使用后面两种方式比较多,我个人使用注解的方式比较多。 -## 10. Spring Security - -### 10.1 区分认证 (Authentication) 和授权 (Authorization) - -这是一个绝大多数人都会混淆的问题。首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么。 - -**Authentication(认证)** 是验证您的身份的凭据(例如用户名/用户ID和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。 - -**Authorization(授权)** 发生在 **Authentication(认证)**之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。 - -这两个一般在我们的系统中被结合在一起使用,目的就是为了保护我们系统的安全性。 - -### 10.2 Cookie的作用是什么?和Session有什么区别? - -Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。 - - **Cookie 一般用来保存用户信息**。下面是 Cookie 的一些应用案例: - -1. 我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了; -2. 一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写); -3. 登录一次网站后访问网站其他页面不需要重新登录。 - -**Session 的主要作用就是通过服务端记录用户的状态。** 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。 - -很多时候我们都是通过 SessionID 来实现特定的用户,SessionID 一般会选择存放在 Redis 中。举个例子:用户成功登陆系统,然后返回给客户端具有 SessionID 的 Cookie,当用户向后端发起请求的时候会把 SessionID 带上,这样后端就知道你的身份状态了。关于这种认证方式更详细的过程如下: - -![Session Based Authentication flow](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Session-Based-Authentication-flow.png) - -1. 用户向服务器发送用户名和密码用于登陆系统。 -2. 服务器验证通过后,服务器为用户创建一个 Session,并将 Session信息存储 起来。 -3. 服务器向用户返回一个 SessionID,写入用户的 Cookie。 -4. 当用户保持登录状态时,Cookie 将与每个后续请求一起被发送出去。 -5. 服务器可以将存储在 Cookie 上的 Session ID 与存储在内存中或者数据库中的 Session 信息进行比较,以验证用户的身份,返回给用户客户端响应信息的时候会附带用户当前的状态。 - -另外,Spring Session提供了一种跨多个应用程序或实例管理用户会话信息的机制。如果想详细了解可以查看下面几篇很不错的文章: - -- [Getting Started with Spring Session](https://codeboje.de/spring-session-tutorial/) -- [Guide to Spring Session](https://www.baeldung.com/spring-session) -- [Sticky Sessions with Spring Session & Redis](https://medium.com/@gvnix/sticky-sessions-with-spring-session-redis-bdc6f7438cc3) - -Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。 - -### 10.3 什么是 Token?什么是 JWT? - -我们在上一个问题中探讨了使用 Session 来鉴别用户的身份,并且给出了几个 Spring Session 的案例分享。 我们知道 Session 信息需要保存一份在服务器端。这种方式会带来一些麻烦,比如需要我们保证保存 Session 信息服务器的可用性、不适合移动端(依赖Cookie)等等。 - -有没有一种不需要自己存放 Session 信息就能实现身份验证的方式呢?使用 Token 即可!JWT (JSON Web Token) 就是这种方式的实现,通过这种方式服务器端就不需要保存 Session 数据了,只用在客户端保存服务端返回给客户的 Token 就可以了,扩展性得到提升。 - -**JWT 本质上就一段签名的 JSON 格式的数据。由于它是带有签名的,因此接收者便可以验证它的真实性。** - -下面是 [RFC 7519](https://link.juejin.im/?target=https%3A%2F%2Ftools.ietf.org%2Fhtml%2Frfc7519) 对 JWT 做的较为正式的定义。 - -> JSON Web Token (JWT) is a compact, URL-safe means of representing claims to be transferred between two parties. The claims in a JWT are encoded as a JSON object that is used as the payload of a JSON Web Signature (JWS) structure or as the plaintext of a JSON Web Encryption (JWE) structure, enabling the claims to be digitally signed or integrity protected with a Message Authentication Code (MAC) and/or encrypted. ——[JSON Web Token (JWT)](https://tools.ietf.org/html/rfc7519) - -JWT 由 3 部分构成: - -1. Header :描述 JWT 的元数据。定义了生成签名的算法以及 Token 的类型。 -2. Payload(负载):用来存放实际需要传递的数据 -3. Signature(签名):服务器通过`Payload`、`Header`和一个密钥(`secret`)使用 Header 里面指定的签名算法(默认是 HMAC SHA256)生成。 - -在基于 Token 进行身份验证的的应用程序中,服务器通过`Payload`、`Header`和一个密钥(`secret`)创建令牌(`Token`)并将 `Token` 发送给客户端,客户端将 `Token` 保存在 Cookie 或者 localStorage 里面,以后客户端发出的所有请求都会携带这个令牌。你可以把它放在 Cookie 里面自动发送,但是这样不能跨域,所以更好的做法是放在 HTTP Header 的 Authorization字段中:` Authorization: Bearer Token`。 - -![Token Based Authentication flow](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Token-Based-Authentication.png) - -1. 用户向服务器发送用户名和密码用于登陆系统。 -2. 身份验证服务响应并返回了签名的 JWT,上面包含了用户是谁的内容。 -3. 用户以后每次向后端发请求都在Header中带上 JWT。 -4. 服务端检查 JWT 并从中获取用户相关信息。 - - -推荐阅读: - -- [JWT (JSON Web Tokens) Are Better Than Session Cookies](https://dzone.com/articles/jwtjson-web-tokens-are-better-than-session-cookies) -- [JSON Web Tokens (JWT) 与 Sessions](https://juejin.im/entry/577b7b56a3413100618c2938) -- [JSON Web Token 入门教程](https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html) -- [彻底理解Cookie,Session,Token](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485603&idx=1&sn=c8d324f44d6102e7b44554733da10bb7&chksm=cea24768f9d5ce7efe7291ddabce02b68db34073c7e7d9a7dc9a7f01c5a80cebe33ac75248df&token=844918801&lang=zh_CN#rd) - -### 10.4 Session vs Token - - - -### 10.5 什么是OAuth 2.0 - ## 参考 From d7c984b45e5dfbedad0c1979c07235e20026cbe6 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Fri, 27 Sep 2019 14:24:12 +0800 Subject: [PATCH 114/130] Update basis-of-authority-certification.md --- .../authority-certification/basis-of-authority-certification.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/system-design/authority-certification/basis-of-authority-certification.md b/docs/system-design/authority-certification/basis-of-authority-certification.md index 18b7b3b7026..c5b3467acbb 100644 --- a/docs/system-design/authority-certification/basis-of-authority-certification.md +++ b/docs/system-design/authority-certification/basis-of-authority-certification.md @@ -2,6 +2,7 @@ 这是一个绝大多数人都会混淆的问题。首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么。 +**Authentication(认证)** 是验证您的身份的凭据(例如用户名/用户ID和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。 **Authorization(授权)** 发生在 **Authentication(认证)**之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。 From efbc582a049904390bfc9418560843813241ec6d Mon Sep 17 00:00:00 2001 From: ChenTao-Ji Date: Fri, 27 Sep 2019 16:20:56 +0800 Subject: [PATCH 115/130] =?UTF-8?q?Update=20=E6=95=B0=E6=8D=AE=E7=BB=93?= =?UTF-8?q?=E6=9E=84.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Set集合子类HashSet与TreeSet去除重复实现。 --- .../\346\225\260\346\215\256\347\273\223\346\236\204.md" | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git "a/docs/dataStructures-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md" "b/docs/dataStructures-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md" index 2632a9e2183..dfb5bc18586 100644 --- "a/docs/dataStructures-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md" +++ "b/docs/dataStructures-algorithms/\346\225\260\346\215\256\347\273\223\346\236\204.md" @@ -47,7 +47,7 @@ Queue 用来存放 等待处理元素 的集合,这种场景一般用于缓冲 ### 什么是 Set Set 继承于 Collection 接口,是一个不允许出现重复元素,并且无序的集合,主要 HashSet 和 TreeSet 两大实现类。 -在判断重复元素的时候,Set 集合会调用 hashCode()和 equal()方法来实现。 +在判断重复元素的时候,HashSet 集合会调用 hashCode()和 equal()方法来实现;TreeSet 集合会调用compareTo方法来实现。 ### 补充:有序集合与无序集合说明 - 有序集合:集合里的元素可以根据 key 或 index 访问 (List、Map) From e8fe9b618bd563d45520964d3b6f16650bbbb8ba Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sat, 28 Sep 2019 17:23:56 +0800 Subject: [PATCH 116/130] Update basis-of-authority-certification.md --- .../basis-of-authority-certification.md | 87 +++++++++++++++---- 1 file changed, 71 insertions(+), 16 deletions(-) diff --git a/docs/system-design/authority-certification/basis-of-authority-certification.md b/docs/system-design/authority-certification/basis-of-authority-certification.md index c5b3467acbb..68bc353c403 100644 --- a/docs/system-design/authority-certification/basis-of-authority-certification.md +++ b/docs/system-design/authority-certification/basis-of-authority-certification.md @@ -1,25 +1,86 @@ -### 1 区分认证 (Authentication) 和授权 (Authorization) +## 1. 认证 (Authentication) 和授权 (Authorization)的区别是什么? 这是一个绝大多数人都会混淆的问题。首先先从读音上来认识这两个名词,很多人都会把它俩的读音搞混,所以我建议你先先去查一查这两个单词到底该怎么读,他们的具体含义是什么。 -**Authentication(认证)** 是验证您的身份的凭据(例如用户名/用户ID和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。 +说简单点就是: -**Authorization(授权)** 发生在 **Authentication(认证)**之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。 +- **认证 (Authentication):** 你是谁。 +- **授权 (Authorization):** 你有权限干什么。 + +稍微正式点(啰嗦点)的说法就是: + +- **Authentication(认证)** 是验证您的身份的凭据(例如用户名/用户ID和密码),通过这个凭据,系统得以知道你就是你,也就是说系统存在你这个用户。所以,Authentication 被称为身份/用户验证。 +- **Authorization(授权)** 发生在 **Authentication(认证)**之后。授权嘛,光看意思大家应该就明白,它主要掌管我们访问系统的权限。比如有些特定资源只能具有特定权限的人才能访问比如admin,有些对系统资源操作比如删除、添加、更新只能特定人才具有。 这两个一般在我们的系统中被结合在一起使用,目的就是为了保护我们系统的安全性。 -### 2 Cookie的作用是什么?和Session有什么区别? +## 2. 什么是Cookie ? Cookie的作用是什么?如何在服务端使用 Cookie ? + +### 2.1 什么是Cookie ? Cookie的作用是什么? Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但是两者的应用场景不太一样。 - **Cookie 一般用来保存用户信息**。下面是 Cookie 的一些应用案例: +维基百科是这样定义 Cookie 的:Cookies是某些网站为了辨别用户身份而储存在用户本地终端上的数据(通常经过加密)。简单来说: **Cookie 存放在客户端,一般用来保存用户信息**。 + +下面是 Cookie 的一些应用案例: + +1. 我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了。除此之外,Cookie 还能保存用户首选项,主题和其他设置信息。 +2. 使用Cookie 保存 session 或者 token ,向后端发送请求的时候带上 Cookie,这样后端就能取到session或者token了。这样就能记录用户当前的状态了,因为 HTTP 协议是无状态的。 +3. Cookie 还可以用来记录和分析用户行为。举个简单的例子你在网上购物的时候,因为HTTP协议是没有状态的,如果服务器想要获取你在某个页面的停留状态或者看了哪些商品,一种常用的实现方式就是将这些信息存放在Cookie + +### 2.2 如何能在 服务端使用 Cookie 呢? + +这部分内容参考:https://attacomsian.com/blog/cookies-spring-boot,更多如何在Spring Boot中使用Cookie 的内容可以查看这篇文章。 + +**1)设置cookie返回给客户端** + +```java +@GetMapping("/change-username") +public String setCookie(HttpServletResponse response) { + // 创建一个 cookie + Cookie cookie = new Cookie("username", "Jovan"); + //设置 cookie过期时间 + cookie.setMaxAge(7 * 24 * 60 * 60); // expires in 7 days + //添加到 response 中 + response.addCookie(cookie); + + return "Username is changed!"; +} +``` + +**2) 使用Spring框架提供的`@CookieValue`注解获取特定的 cookie的值** -1. 我们在 Cookie 中保存已经登录过得用户信息,下次访问网站的时候页面可以自动帮你登录的一些基本信息给填了; -2. 一般的网站都会有保持登录也就是说下次你再访问网站的时候就不需要重新登录了,这是因为用户登录的时候我们可以存放了一个 Token 在 Cookie 中,下次登录的时候只需要根据 Token 值来查找用户即可(为了安全考虑,重新登录一般要将 Token 重写); -3. 登录一次网站后访问网站其他页面不需要重新登录。 +```java +@GetMapping("/") +public String readCookie(@CookieValue(value = "username", defaultValue = "Atta") String username) { + return "Hey! My username is " + username; +} +``` + +**3) 读取所有的 Cookie 值** + +```java +@GetMapping("/all-cookies") +public String readAllCookies(HttpServletRequest request) { + + Cookie[] cookies = request.getCookies(); + if (cookies != null) { + return Arrays.stream(cookies) + .map(c -> c.getName() + "=" + c.getValue()).collect(Collectors.joining(", ")); + } + + return "No cookies"; +} +``` + +## 3. Cookie 和 Session 有什么区别?如何使用Session进行身份验证? **Session 的主要作用就是通过服务端记录用户的状态。** 典型的场景是购物车,当你要添加商品到购物车的时候,系统不知道是哪个用户操作的,因为 HTTP 协议是无状态的。服务端给特定的用户创建特定的 Session 之后就可以标识这个用户并且跟踪这个用户了。 +**Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。** + +**那么,如何使用Session进行身份验证?** + 很多时候我们都是通过 SessionID 来实现特定的用户,SessionID 一般会选择存放在 Redis 中。举个例子:用户成功登陆系统,然后返回给客户端具有 SessionID 的 Cookie,当用户向后端发起请求的时候会把 SessionID 带上,这样后端就知道你的身份状态了。关于这种认证方式更详细的过程如下: ![Session Based Authentication flow](https://my-blog-to-use.oss-cn-beijing.aliyuncs.com/2019-7/Session-Based-Authentication-flow.png) @@ -36,9 +97,7 @@ Cookie 和 Session都是用来跟踪浏览器用户身份的会话方式,但 - [Guide to Spring Session](https://www.baeldung.com/spring-session) - [Sticky Sessions with Spring Session & Redis](https://medium.com/@gvnix/sticky-sessions-with-spring-session-redis-bdc6f7438cc3) -Cookie 数据保存在客户端(浏览器端),Session 数据保存在服务器端。相对来说 Session 安全性更高。如果使用 Cookie 的一些敏感信息不要写入 Cookie 中,最好能将 Cookie 信息加密然后使用到的时候再去服务器端解密。 - -### 3 什么是 Token?什么是 JWT? +## 4. 什么是 Token?什么是 JWT?如何基于Token进行身份验证? 我们在上一个问题中探讨了使用 Session 来鉴别用户的身份,并且给出了几个 Spring Session 的案例分享。 我们知道 Session 信息需要保存一份在服务器端。这种方式会带来一些麻烦,比如需要我们保证保存 Session 信息服务器的可用性、不适合移动端(依赖Cookie)等等。 @@ -73,8 +132,4 @@ JWT 由 3 部分构成: - [JSON Web Token 入门教程](https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html) - [彻底理解Cookie,Session,Token](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485603&idx=1&sn=c8d324f44d6102e7b44554733da10bb7&chksm=cea24768f9d5ce7efe7291ddabce02b68db34073c7e7d9a7dc9a7f01c5a80cebe33ac75248df&token=844918801&lang=zh_CN#rd) -### 4 Session vs Token - - - -### 10.5 什么是OAuth 2.0 \ No newline at end of file +## 5 什么是OAuth 2.0 \ No newline at end of file From 3e7c312e7cd36ea5f06044efd1ea08118ae21dd1 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Sun, 29 Sep 2019 18:28:06 +0800 Subject: [PATCH 117/130] Update basis-of-authority-certification.md --- .../basis-of-authority-certification.md | 21 ++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/docs/system-design/authority-certification/basis-of-authority-certification.md b/docs/system-design/authority-certification/basis-of-authority-certification.md index 68bc353c403..2850a55e7de 100644 --- a/docs/system-design/authority-certification/basis-of-authority-certification.md +++ b/docs/system-design/authority-certification/basis-of-authority-certification.md @@ -132,4 +132,23 @@ JWT 由 3 部分构成: - [JSON Web Token 入门教程](https://www.ruanyifeng.com/blog/2018/07/json_web_token-tutorial.html) - [彻底理解Cookie,Session,Token](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485603&idx=1&sn=c8d324f44d6102e7b44554733da10bb7&chksm=cea24768f9d5ce7efe7291ddabce02b68db34073c7e7d9a7dc9a7f01c5a80cebe33ac75248df&token=844918801&lang=zh_CN#rd) -## 5 什么是OAuth 2.0 \ No newline at end of file +## 5 什么是OAuth 2.0? + +OAuth 是一个行业的标准授权协议,主要用来授权第三方应用获取有限的权限。而 OAuth 2.0是对 OAuth 1.0 的完全重新设计,OAuth 2.0更快,更容易实现,OAuth 1.0 已经被废弃。详情请见:[rfc6749](https://tools.ietf.org/html/rfc6749)。 + +实际上它就是一种授权机制,它的最终目的是为第三方应用颁发一个有时效性的令牌 token,使得第三方应用能够通过该令牌获取相关的资源。 + +OAuth 2.0 比较常用的场景就是第三方登录,当你的网站接入了第三方登录的时候一般就是使用的 OAuth 2.0 协议。 + +推荐阅读: + +- [OAuth 2.0 的一个简单解释](http://www.ruanyifeng.com/blog/2019/04/oauth_design.html) +- [10 分钟理解什么是 OAuth 2.0 协议](https://deepzz.com/post/what-is-oauth2-protocol.html) +- [OAuth 2.0 的四种方式](http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html) +- [GitHub OAuth 第三方登录示例教程](http://www.ruanyifeng.com/blog/2019/04/github-oauth.html) + +## 参考 + +- https://medium.com/@sherryhsu/session-vs-token-based-authentication-11a6c5ac45e4 +- https://www.varonis.com/blog/what-is-oauth/ +- https://tools.ietf.org/html/rfc6749 \ No newline at end of file From 8c134e8d473b3b04d8a724601772a6d0240bc28a Mon Sep 17 00:00:00 2001 From: RyzeZhao <38486503+Ryze-Zhao@users.noreply.github.com> Date: Mon, 30 Sep 2019 09:49:09 +0800 Subject: [PATCH 118/130] =?UTF-8?q?=E6=9B=B4=E6=94=B9=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 /docs/java/What's New in JDK8/Java8Tutorial.md->Map(映射)->“讲”改为“将” --- docs/java/What's New in JDK8/Java8Tutorial.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/java/What's New in JDK8/Java8Tutorial.md b/docs/java/What's New in JDK8/Java8Tutorial.md index 9b473ea7d03..56e7f52d5b0 100644 --- a/docs/java/What's New in JDK8/Java8Tutorial.md +++ b/docs/java/What's New in JDK8/Java8Tutorial.md @@ -494,7 +494,7 @@ forEach 是为 Lambda 而设计的,保持了最紧凑的风格。而且 Lambda 中间操作 map 会将元素根据指定的 Function 接口来依次将元素转成另外的对象。 -下面的示例展示了将字符串转换为大写字符串。你也可以通过map来讲对象转换成其他类型,map返回的Stream类型是根据你map传递进去的函数的返回值决定的。 +下面的示例展示了将字符串转换为大写字符串。你也可以通过map来将对象转换成其他类型,map返回的Stream类型是根据你map传递进去的函数的返回值决定的。 ```java // 测试 Map 操作 @@ -930,4 +930,4 @@ System.out.println(hints2.length); // 2 **Java工程师必备学习资源:** 一些Java工程师常用学习资源[公众号](#公众号)后台回复关键字 **“1”** 即可免费无套路获取。 -![我的公众号](https://user-gold-cdn.xitu.io/2018/11/28/167598cd2e17b8ec?w=258&h=258&f=jpeg&s=27334) \ No newline at end of file +![我的公众号](https://user-gold-cdn.xitu.io/2018/11/28/167598cd2e17b8ec?w=258&h=258&f=jpeg&s=27334) From c67a99c9c6e26362ca736802bfad3a1349b5cd83 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Mon, 30 Sep 2019 10:23:47 +0800 Subject: [PATCH 119/130] Update README.md --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index df57797c35c..78f7716aea2 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,6 @@ - [SpringMVC 工作原理详解](docs/system-design/framework/spring/SpringMVC-Principle.md) - [Spring中都用到了那些设计模式?](docs/system-design/framework/spring/Spring-Design-Patterns.md) - [SpringBoot 使用指南](https://github.com/Snailclimb/springboot-guide) -- #### ZooKeeper From f3b8ab708233f3926c3c44f48a481bde5702ae5f Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Wed, 2 Oct 2019 16:49:12 +0800 Subject: [PATCH 120/130] =?UTF-8?q?=E5=B0=86=E9=87=8D=E8=A6=81=E7=9A=84?= =?UTF-8?q?=E4=B8=80=E4=BA=9B=E5=86=85=E5=AE=B9=E5=8A=A0=E7=B2=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 47 ++++++++++++++++++++++++----------------------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 78f7716aea2..65441ecdf00 100644 --- a/README.md +++ b/README.md @@ -38,7 +38,7 @@ - [MySQL](#mysql) - [Redis](#redis) - [系统设计](#系统设计) - - [常用框架(Spring、Zookeeper ... )](#常用框架) + - [常用框架(Spring/SpringBoot、Zookeeper ... )](#常用框架) - [权限认证](#权限认证) - [设计模式(工厂模式、单例模式 ... )](#设计模式) - [数据通信(消息队列、Dubbo ... )](#数据通信) @@ -60,22 +60,22 @@ ### 基础 -* [Java 基础知识回顾](docs/java/Java基础知识.md) -* [Java 基础知识疑难点/易错点](docs/java/Java疑难点.md) -* [一些重要的Java程序设计题](docs/java/Java程序设计题.md) +* **[Java 基础知识回顾](docs/java/Java基础知识.md)** +* **[Java 基础知识疑难点/易错点](docs/java/Java疑难点.md)** +* **[一些重要的Java程序设计题](docs/java/Java程序设计题.md)** * [J2EE 基础知识回顾](docs/java/J2EE基础知识.md) ### 容器 -* [Java容器常见面试题/知识点总结](docs/java/collection/Java集合框架常见面试题.md) +* **[Java容器常见面试题/知识点总结](docs/java/collection/Java集合框架常见面试题.md)** * [ArrayList 源码学习](docs/java/collection/ArrayList.md) * [LinkedList 源码学习](docs/java/collection/LinkedList.md) * [HashMap(JDK1.8)源码学习](docs/java/collection/HashMap.md) ### 并发 -* [Java 并发基础常见面试题总结](docs/java/Multithread/JavaConcurrencyBasicsCommonInterviewQuestionsSummary.md) -* [Java 并发进阶常见面试题总结](docs/java/Multithread/JavaConcurrencyAdvancedCommonInterviewQuestions.md) +* **[Java 并发基础常见面试题总结](docs/java/Multithread/JavaConcurrencyBasicsCommonInterviewQuestionsSummary.md)** +* **[Java 并发进阶常见面试题总结](docs/java/Multithread/JavaConcurrencyAdvancedCommonInterviewQuestions.md)** * [并发容器总结](docs/java/Multithread/并发容器总结.md) * [乐观锁与悲观锁](docs/essential-content-for-interview/面试必备之乐观锁与悲观锁.md) * [JUC 中的 Atomic 原子类总结](docs/java/Multithread/Atomic.md) @@ -83,11 +83,11 @@ ### JVM -* [一 Java内存区域](docs/java/jvm/Java内存区域.md) -* [二 JVM垃圾回收](docs/java/jvm/JVM垃圾回收.md) +* **[一 Java内存区域](docs/java/jvm/Java内存区域.md)** +* **[二 JVM垃圾回收](docs/java/jvm/JVM垃圾回收.md)** * [三 JDK 监控和故障处理工具](docs/java/jvm/JDK监控和故障处理工具总结.md) * [四 类文件结构](docs/java/jvm/类文件结构.md) -* [五 类加载过程](docs/java/jvm/类加载过程.md) +* **[五 类加载过程](docs/java/jvm/类加载过程.md)** * [六 类加载器](docs/java/jvm/类加载器.md) ### I/O @@ -137,8 +137,8 @@ ### MySQL -* [MySQL 学习与面试](docs/database/MySQL.md) -* [一千行MySQL学习笔记](docs/database/一千行MySQL命令.md) +* **[MySQL 学习与面试](docs/database/MySQL.md)** +* **[一千行MySQL学习笔记](docs/database/一千行MySQL命令.md)** * [MySQL高性能优化规范建议](docs/database/MySQL高性能优化规范建议.md) * [数据库索引总结](docs/database/MySQL%20Index.md) * [事务隔离级别(图文详解)](docs/database/事务隔离级别(图文详解).md) @@ -154,14 +154,14 @@ ### 常用框架 -#### Spring +#### Spring/SpringBoot - [Spring 学习与面试](docs/system-design/framework/spring/Spring.md) -- [Spring 常见问题总结](docs/system-design/framework/spring/SpringInterviewQuestions.md) +- **[Spring 常见问题总结](docs/system-design/framework/spring/SpringInterviewQuestions.md)** +- **[SpringBoot 指南/常见面试题总结](https://github.com/Snailclimb/springboot-guide)** - [Spring中bean的作用域与生命周期](docs/system-design/framework/spring/SpringBean.md) - [SpringMVC 工作原理详解](docs/system-design/framework/spring/SpringMVC-Principle.md) - [Spring中都用到了那些设计模式?](docs/system-design/framework/spring/Spring-Design-Patterns.md) -- [SpringBoot 使用指南](https://github.com/Snailclimb/springboot-guide) #### ZooKeeper @@ -170,8 +170,8 @@ ### 权限认证 -- [权限认证基础:区分Authentication,Authorization以及Cookie、Session、Token](docs/system-design/authority-certification/basis-of-authority-certification.md) -- [适合初学者入门 Spring Security With JWT 的 Demo](https://github.com/Snailclimb/spring-security-jwt-guide) +- **[权限认证基础:区分Authentication,Authorization以及Cookie、Session、Token](docs/system-design/authority-certification/basis-of-authority-certification.md)** +- **[适合初学者入门 Spring Security With JWT 的 Demo](https://github.com/Snailclimb/spring-security-jwt-guide)** ### 设计模式 @@ -196,12 +196,12 @@ ### 备战面试 -* [【备战面试1】程序员的简历就该这样写](docs/essential-content-for-interview/PreparingForInterview/程序员的简历之道.md) -* [【备战面试2】初出茅庐的程序员该如何准备面试?](docs/essential-content-for-interview/PreparingForInterview/interviewPrepare.md) -* [【备战面试3】7个大部分程序员在面试前很关心的问题](docs/essential-content-for-interview/PreparingForInterview/JavaProgrammerNeedKnow.md) -* [【备战面试4】Github上开源的Java面试/学习相关的仓库推荐](docs/essential-content-for-interview/PreparingForInterview/JavaInterviewLibrary.md) -* [【备战面试5】如果面试官问你“你有什么问题问我吗?”时,你该如何回答](docs/essential-content-for-interview/PreparingForInterview/如果面试官问你“你有什么问题问我吗?”时,你该如何回答.md) -* [【备战面试6】美团面试常见问题总结(附详解答案)](docs/essential-content-for-interview/PreparingForInterview/美团面试常见问题总结.md) +* **[【备战面试1】程序员的简历就该这样写](docs/essential-content-for-interview/PreparingForInterview/程序员的简历之道.md)** +* **[【备战面试2】初出茅庐的程序员该如何准备面试?](docs/essential-content-for-interview/PreparingForInterview/interviewPrepare.md)** +* **[【备战面试3】7个大部分程序员在面试前很关心的问题](docs/essential-content-for-interview/PreparingForInterview/JavaProgrammerNeedKnow.md)** +* **[【备战面试4】Github上开源的Java面试/学习相关的仓库推荐](docs/essential-content-for-interview/PreparingForInterview/JavaInterviewLibrary.md)** +* **[【备战面试5】如果面试官问你“你有什么问题问我吗?”时,你该如何回答](docs/essential-content-for-interview/PreparingForInterview/如果面试官问你"你有什么问题问我吗?"时,你该如何回答.md)** +* **[【备战面试6】美团面试常见问题总结(附详解答案)](docs/essential-content-for-interview/PreparingForInterview/美团面试常见问题总结.md)** ### 常见面试题总结 @@ -236,6 +236,7 @@ ### 实战项目推荐 - [onemall](https://github.com/YunaiV/onemall) : mall 商城,基于微服务的思想,构建在 B2C 电商场景下的项目实战。核心技术栈,是 Spring Boot + Dubbo 。未来,会重构成 Spring Cloud Alibaba 。 +- ### Github 历史榜单 From e5ed295760ba8aa9771c4ab27be4a55de1192dda Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Wed, 2 Oct 2019 22:52:47 +0800 Subject: [PATCH 121/130] Update _coverpage.md --- docs/_coverpage.md | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/_coverpage.md b/docs/_coverpage.md index 612cd2160ec..730241144c6 100644 --- a/docs/_coverpage.md +++ b/docs/_coverpage.md @@ -3,7 +3,6 @@

Java 学习/面试指南

- [常用资源](https://shimo.im/docs/MuiACIg1HlYfVxrj/) [GitHub]() [开始阅读](#java) From 1013e57fee2a910e1bb362f5c716083d0b1ef34c Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Wed, 2 Oct 2019 23:12:22 +0800 Subject: [PATCH 122/130] Update _coverpage.md --- docs/_coverpage.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/_coverpage.md b/docs/_coverpage.md index 730241144c6..612cd2160ec 100644 --- a/docs/_coverpage.md +++ b/docs/_coverpage.md @@ -3,6 +3,7 @@

Java 学习/面试指南

+ [常用资源](https://shimo.im/docs/MuiACIg1HlYfVxrj/) [GitHub]() [开始阅读](#java) From bff6774dc76e4204d923dbfc69f36a96bf9b56a7 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Wed, 2 Oct 2019 23:12:26 +0800 Subject: [PATCH 123/130] Update README.md --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index 65441ecdf00..0d1c7d5c0dd 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,3 @@ -点击订阅[Java面试进阶指南](https://xiaozhuanlan.com/javainterview?rel=javaguide)(专为Java面试方向准备)。[为什么要弄这个专栏?](https://shimo.im/docs/9BJjNsNg7S4dCnz3/) - 点击关注[公众号](#公众号)及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。

From 18f3c4616e8f8d9b0e5ae30f325ed4cd8338a25a Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Wed, 2 Oct 2019 23:53:09 +0800 Subject: [PATCH 124/130] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 0d1c7d5c0dd..73df6a77f8c 100644 --- a/README.md +++ b/README.md @@ -12,6 +12,7 @@ 公众号 公众号 投稿 + 投稿

推荐使用 https://snailclimb.top/JavaGuide/ 在线阅读(访问速度慢的话,请使用 https://snailclimb.gitee.io/javaguide ),在线阅读内容本仓库同步一致。这种方式阅读的优势在于:有侧边栏阅读体验更好,Gitee pages 的访问速度相对来说也比较快。 From 2cd46a04f2025db9ef36e8c4e5ec4f3c90702ddb Mon Sep 17 00:00:00 2001 From: SnailClimb Date: Thu, 3 Oct 2019 10:07:49 +0800 Subject: [PATCH 125/130] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index 73df6a77f8c..55eae603d23 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,11 @@ 点击关注[公众号](#公众号)及时获取笔主最新更新文章,并可免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源。 +作者的其他开源项目推荐: + +1. [springboot-guide](https://github.com/Snailclimb/springboot-guide) : 适合新手入门以及有经验的开发人员查阅的 Spring Boot 教程(业余时间维护中,欢迎一起维护)。 +2. [programmer-advancement](https://github.com/Snailclimb/programmer-advancement) : 我觉得技术人员应该有的一些好习惯! +3. [spring-security-jwt-guide](https://github.com/Snailclimb/spring-security-jwt-guide) :从零入门 !Spring Security With JWT(含权限验证)后端部分代码。 +

From 8bad2674bbe28de9f4be75a49a05e36e4cccf357 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Mon, 7 Oct 2019 12:44:29 +0800 Subject: [PATCH 126/130] =?UTF-8?q?Create=20JWT=E4=BC=98=E5=8A=A3=E5=8A=BF?= =?UTF-8?q?=E5=88=86=E6=9E=90.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...43\345\212\277\345\210\206\346\236\220.md" | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 "docs/system-design/authority-certification/JWT\344\274\230\345\212\243\345\212\277\345\210\206\346\236\220.md" diff --git "a/docs/system-design/authority-certification/JWT\344\274\230\345\212\243\345\212\277\345\210\206\346\236\220.md" "b/docs/system-design/authority-certification/JWT\344\274\230\345\212\243\345\212\277\345\210\206\346\236\220.md" new file mode 100644 index 00000000000..c5c7f51a063 --- /dev/null +++ "b/docs/system-design/authority-certification/JWT\344\274\230\345\212\243\345\212\277\345\210\206\346\236\220.md" @@ -0,0 +1,85 @@ +# JWT 优缺点分析以及常见问题解决方案 + +## Token 认证的优势 + + 相比于 Session 认证的方式来说,使用 token 进行身份认证主要有下面三个优势: + +### 1.无状态 + +token 自身包含了身份验证所需要的所有信息,使得我们的服务器不需要存储 Session 信息,这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。但是,也正是由于 token 的无状态,也导致了它最大的缺点:当后端 在token 有效期内废弃一个 token 或者更改它的权限的话,不会立即生效,一般需要等到有效期过后才可以。另外,当用户 Logout 的话,token 也还有效。除非,我们在后端增加额外的处理逻辑。 + +### 2.有效避免了CSRF 攻击 + +**CSRF(Cross Site Request Forgery)**一般被翻译为 **跨站请求伪造**,属于网络攻击领域范围。相比于 SQL 脚本注入、XSS等等安全攻击方式,CSRF 的知名度并没有它们高。但是,它的确是每个系统都要考虑的安全隐患,就连技术帝国 Google 的 Gmail 在早些年也被曝出过存在 CSRF 漏洞,这给 Gmail 的用户造成了很大的损失。 + +那么究竟什么是 **跨站请求伪造** 呢?说简单用你的身份去发送一些对你不友好的请求。举个简单的例子: + +小壮登录了某网上银行,它来到了网上银行的帖子区,看到一个帖子下面有一个链接写着“科学理财,年盈利率过万”,小壮好奇的点开了这个链接,结果发现自己的账户少了10000元。这是这么回事呢?原来黑客在链接中藏了一个请求,这个请求直接利用小壮的身份给银行发送了一个转账请求,也就是通过你的 Cookie 向银行发出请求。 + +```html +科学理财,年盈利率过万 +``` + +导致这个问题很大的愿意就是: Session 认证中 Cookie 中的 session_id 是由浏览器发送到服务端的,借助这个特性,攻击者就可以通过让用户误点攻击链接,达到攻击效果。 + +**那为什么 token 不会存在这种问题呢?** + +我是这样理解的:一般情况下我们使用 JWT 的话,在我们登录成功获得 token 之后,一般会选择存放在 local storage 中。然后我们在前端通过某些方式会给每个发到后端的请求加上这个 token,这样就不会出现 CSRF 漏洞的问题。因为,即使有个你点击了非法链接发送了请求到服务端,这个非法请求是不会携带 token 的,所以这个请求将是非法的。 + +但是这样会存在 XSS 攻击中被盗的风险,为了避免 XSS 攻击,你可以选择将 token 存储在标记为`httpOnly` 的cookie 中。但是,这样有导致了你必须自己提供CSRF保护。 + +具体采用上面哪两种方式存储 token 呢,大部分情况下存放在 local storage 下都是最好的选择,某些情况下可能需要存放在标记为`httpOnly` 的cookie 中会更好。 + +### 3.适合移动端应用 + +使用 Session 进行身份认证的话,需要保存一份信息在服务器端,而且这种方式会依赖到 Cookie(需要 Cookie 保存 SessionId),所以不适合移动端。 + +但是,使用 token 进行身份认证就不会存在这种问题,因为只要 token 可以被客户端存储就能够使用,而且 token 还可以跨语言使用。 + +### 4.单点登录友好 + +使用 Session 进行身份认证的话,实现单点登录,需要我们把用户的 Session 信息保存在一台电脑上,并且还会遇到常见的 Cookie 跨域的问题。但是,使用 token 进行认证的话, token 被保存在客户端,不会存在这些问题。 + +## Token 认证常见问题以及解决办法 + +### 1.注销登录等场景下 token 还有效 + +与之类似的具体相关场景有: + +1. 退出登录; +2. 修改密码; +3. 服务端修改了某个用户具有的权限或者角色; +4. 用户的帐户被删除/暂停。 +5. 用户由管理员注销; + +这个问题不存在于 Session 认证方式中,因为在 Session 认证方式中,遇到这种情况的话服务端删除对应的 Session 记录即可。但是,使用 token 认证的方式就不好解决了。我们也说过了,token 一旦派发出去,如果后端不增加其他逻辑的话,它在失效之前都是有效的。那么,我们如何解决这个问题呢?查阅了很多资料,总结了下面几种方案: + +- **将 token 存入内存数据库**:将 token 存入 DB 中,redis 内存数据库在这里是是不错的选择。如果需要让某个 token 失效就直接从 redis 中删除这个 token 即可。但是,这样会导致每次使用 token 发送请求都要先从 DB 中查询 token 是否存在的步骤,而且违背了 JWT 的无状态原则。 +- **黑名单机制**:和上面的方式类似,使用内存数据库比如 redis 维护一个黑名单,如果想让某个 token 失效的话就直接将这个 token 加入到 **黑名单** 即可。然后,每次使用 token 进行请求的话都会先判断这个 token 是否存在于黑名单中。 +- **修改密钥 (Secret)** : 我们为每个用户都创建一个专属密钥,如果我们想让某个 token 失效,我们直接修改对应用户的密钥即可。但是,这样相比于前两种引入内存数据库带来了危害更大,比如:1⃣️如果服务是分布式的,则每次发出新的 token 时都必须在多台机器同步密钥。为此,你需要将必须将机密存储在数据库或其他外部服务中,这样和 Session 认证就没太大区别了。2⃣️如果用户同时在两个浏览器打开系统,或者在手机端也打开了系统,如果它从一个地方将账号退出,那么其他地方都要重新进行登录,这是不可取的。 +- **保持令牌的有效期限短并经常轮换** :很简单的一种方式。但是,会导致用户登录状态不会被持久记录,而且需要用户经常登录。 + +对于修改密码后 token 还有效问题的解决还是比较容易的,说一种我觉得比较好的方式:**使用用户的密码的哈希值对 token 进行签名。因此,如果密码更改,则任何先前的令牌将自动无法验证。** + +### 2.token 的续签问题 + +token 有效期一般都建议设置的不太长,那么 token 过期后如何认证,如何实现动态刷新 token,避免用户经常需要重新登录? + +我们先来看看在 Session 认证中一般的做法:**假如 session 的有效期30分钟,如果 30 分钟内用户有访问,就把 session 有效期被延长30分钟。** + +1. **类似于 Session 认证中的做法**:这种方案满足于大部分场景。假设服务端给的 token 有效期设置为30分钟,服务端每次进行校验时,如果发现 token 的有效期马上快过期了,服务端就重新生成 token 给客户端。客户端每次请求都检查新旧token,如果不一致,则更新本地的token。这种做法的问题是仅仅在快过期的时候请求才会更新 token ,对客户端不是很友好。 +2. **每次请求都返回新 token** :这种方案的的思路很简单,但是,很明显,开销会比较大。 +3. **token 有效期设置到半夜** :这种方案是一种折衷的方案,保证了大部分用户白天可以正常登录,适用于对安全性要求不高的系统。 +4. **用户登录返回两个 token** :第一个是 acessToken ,它的过期时间 token 本身的过期时间比如半个小时,另外一个是 refreshToken 它的过期时间更长一点比如为1天。客户端登录后,将 accessToken和refreshToken 保存在本地,每次访问将 accessToken 传给服务端。服务端校验 accessToken 的有效性,如果过期的话,就将 refreshToken 传给服务端。如果有效,服务端就生成新的 accessToken 给客户端。否则,客户端就重新登录即可。该方案的不足是:1⃣️需要客户端来配合;2⃣️用户注销的时候需要同时保证两个 token 都无效;3⃣️重新请求获取 token 的过程中会有短暂 token 不可用的情况(可以通过在客户端设置定时器,当accessToken 快过期的时候,提前去通过 refreshToken 获取新的accessToken)。 + +## 总结 + +JWT 最适合的场景是无状态的场景,如果考虑到 token 注销和 token 续签的场景话,没有特别好的解决方案,大部分解决方案都给 token 加上了状态,这就有点类似 Session 认证了。 + +## Reference + +- https://medium.com/devgorilla/how-to-log-out-when-using-jwt-a8c7823e8a6 +- [JWT 超详细分析](https://learnku.com/articles/17883?order_by=vote_count&) +- https://medium.com/@agungsantoso/csrf-protection-with-json-web-tokens-83e0f2fcbcc +- [Invalidating JSON Web Tokens](https://stackoverflow.com/questions/21978658/invalidating-json-web-tokens) + From b1bda0762bf09cd4286c1a3d3ffcdb07d0361117 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Mon, 7 Oct 2019 12:46:44 +0800 Subject: [PATCH 127/130] =?UTF-8?q?JWT=20=E4=BC=98=E5=8A=A3=E5=8A=BF?= =?UTF-8?q?=E5=88=86=E6=9E=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 1 + .../authority-certification/JWT-advantages-and-disadvantages.md | 0 2 files changed, 1 insertion(+) rename "docs/system-design/authority-certification/JWT\344\274\230\345\212\243\345\212\277\345\210\206\346\236\220.md" => docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md (100%) diff --git a/README.md b/README.md index 55eae603d23..f93391c231b 100644 --- a/README.md +++ b/README.md @@ -176,6 +176,7 @@ ### 权限认证 - **[权限认证基础:区分Authentication,Authorization以及Cookie、Session、Token](docs/system-design/authority-certification/basis-of-authority-certification.md)** +- **[JWT 优劣势分析](docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md)** - **[适合初学者入门 Spring Security With JWT 的 Demo](https://github.com/Snailclimb/spring-security-jwt-guide)** ### 设计模式 diff --git "a/docs/system-design/authority-certification/JWT\344\274\230\345\212\243\345\212\277\345\210\206\346\236\220.md" b/docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md similarity index 100% rename from "docs/system-design/authority-certification/JWT\344\274\230\345\212\243\345\212\277\345\210\206\346\236\220.md" rename to docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md From 9ceb6ea385460b3df2ef910e16222ae0c9557510 Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Mon, 7 Oct 2019 12:47:35 +0800 Subject: [PATCH 128/130] Update JWT-advantages-and-disadvantages.md --- .../authority-certification/JWT-advantages-and-disadvantages.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md b/docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md index c5c7f51a063..076666af73c 100644 --- a/docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md +++ b/docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md @@ -78,8 +78,8 @@ JWT 最适合的场景是无状态的场景,如果考虑到 token 注销和 to ## Reference +- [JWT 超详细分析](https://learnku.com/articles/17883?order_by=vote_count&) - https://medium.com/devgorilla/how-to-log-out-when-using-jwt-a8c7823e8a6 -- [JWT 超详细分析](https://learnku.com/articles/17883?order_by=vote_count&) - https://medium.com/@agungsantoso/csrf-protection-with-json-web-tokens-83e0f2fcbcc - [Invalidating JSON Web Tokens](https://stackoverflow.com/questions/21978658/invalidating-json-web-tokens) From 39c4a8299f7a7cd2d92b760b792372f1c112b5cb Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Mon, 7 Oct 2019 12:48:16 +0800 Subject: [PATCH 129/130] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index f93391c231b..21a458b0480 100644 --- a/README.md +++ b/README.md @@ -176,7 +176,7 @@ ### 权限认证 - **[权限认证基础:区分Authentication,Authorization以及Cookie、Session、Token](docs/system-design/authority-certification/basis-of-authority-certification.md)** -- **[JWT 优劣势分析](docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md)** +- **[JWT 优缺点分析以及常见问题解决方案](docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md)** - **[适合初学者入门 Spring Security With JWT 的 Demo](https://github.com/Snailclimb/spring-security-jwt-guide)** ### 设计模式 From 403937c0575e57e5a7d3c3bae159b105bbcbdafa Mon Sep 17 00:00:00 2001 From: Kou Shuang Date: Tue, 8 Oct 2019 21:05:51 +0800 Subject: [PATCH 130/130] Update JWT-advantages-and-disadvantages.md --- .../JWT-advantages-and-disadvantages.md | 20 +++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md b/docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md index 076666af73c..4d16c413727 100644 --- a/docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md +++ b/docs/system-design/authority-certification/JWT-advantages-and-disadvantages.md @@ -1,4 +1,12 @@ -# JWT 优缺点分析以及常见问题解决方案 +# JWT 身份认证优缺点分析以及常见问题解决方案 + +之前分享了一个使用 Spring Security 实现 JWT 身份认证的 Demo,文章地址:[适合初学者入门 Spring Security With JWT 的 Demo](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485622&idx=1&sn=e9750ed63c47457ba1896db8dfceac6a&chksm=cea2477df9d5ce6b7af20e582c6c60b7408a6459b05b849394c45f04664d1651510bdee029f7&token=684071313&lang=zh_CN&scene=21#wechat_redirect)。 Demo 非常简单,没有介绍到 JWT 存在的一些问题。所以,单独抽了一篇文章出来介绍。为了完成这篇文章,我查阅了很多资料和文献,我觉得应该对大家有帮助。 + +相关阅读: + +- [《一问带你区分清楚Authentication,Authorization以及Cookie、Session、Token》](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485626&idx=1&sn=3247aa9000693dd692de8a04ccffeec1&chksm=cea24771f9d5ce675ea0203633a95b68bfe412dc6a9d05f22d221161147b76161d1b470d54b3&token=684071313&lang=zh_CN&scene=21#wechat_redirect) +- [适合初学者入门 Spring Security With JWT 的 Demo](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485622&idx=1&sn=e9750ed63c47457ba1896db8dfceac6a&chksm=cea2477df9d5ce6b7af20e582c6c60b7408a6459b05b849394c45f04664d1651510bdee029f7&token=684071313&lang=zh_CN&scene=21#wechat_redirect) +- [Spring Boot 使用 JWT 进行身份和权限验证](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247485640&idx=1&sn=0ff147808318d53b371f16bb730c96ef&chksm=cea24703f9d5ce156ba67662f6f3f482330e8e6ebd9d44c61bf623083e9b941d8a180db6b0ea&token=1533246333&lang=zh_CN#rd) ## Token 认证的优势 @@ -6,7 +14,7 @@ ### 1.无状态 -token 自身包含了身份验证所需要的所有信息,使得我们的服务器不需要存储 Session 信息,这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。但是,也正是由于 token 的无状态,也导致了它最大的缺点:当后端 在token 有效期内废弃一个 token 或者更改它的权限的话,不会立即生效,一般需要等到有效期过后才可以。另外,当用户 Logout 的话,token 也还有效。除非,我们在后端增加额外的处理逻辑。 +token 自身包含了身份验证所需要的所有信息,使得我们的服务器不需要存储 Session 信息,这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。但是,也正是由于 token 的无状态,也导致了它最大的缺点:当后端在token 有效期内废弃一个 token 或者更改它的权限的话,不会立即生效,一般需要等到有效期过后才可以。另外,当用户 Logout 的话,token 也还有效。除非,我们在后端增加额外的处理逻辑。 ### 2.有效避免了CSRF 攻击 @@ -14,19 +22,19 @@ token 自身包含了身份验证所需要的所有信息,使得我们的服 那么究竟什么是 **跨站请求伪造** 呢?说简单用你的身份去发送一些对你不友好的请求。举个简单的例子: -小壮登录了某网上银行,它来到了网上银行的帖子区,看到一个帖子下面有一个链接写着“科学理财,年盈利率过万”,小壮好奇的点开了这个链接,结果发现自己的账户少了10000元。这是这么回事呢?原来黑客在链接中藏了一个请求,这个请求直接利用小壮的身份给银行发送了一个转账请求,也就是通过你的 Cookie 向银行发出请求。 +小壮登录了某网上银行,他来到了网上银行的帖子区,看到一个帖子下面有一个链接写着“科学理财,年盈利率过万”,小壮好奇的点开了这个链接,结果发现自己的账户少了10000元。这是这么回事呢?原来黑客在链接中藏了一个请求,这个请求直接利用小壮的身份给银行发送了一个转账请求,也就是通过你的 Cookie 向银行发出请求。 ```html 科学理财,年盈利率过万 ``` -导致这个问题很大的愿意就是: Session 认证中 Cookie 中的 session_id 是由浏览器发送到服务端的,借助这个特性,攻击者就可以通过让用户误点攻击链接,达到攻击效果。 +导致这个问题很大的原因就是: Session 认证中 Cookie 中的 session_id 是由浏览器发送到服务端的,借助这个特性,攻击者就可以通过让用户误点攻击链接,达到攻击效果。 **那为什么 token 不会存在这种问题呢?** 我是这样理解的:一般情况下我们使用 JWT 的话,在我们登录成功获得 token 之后,一般会选择存放在 local storage 中。然后我们在前端通过某些方式会给每个发到后端的请求加上这个 token,这样就不会出现 CSRF 漏洞的问题。因为,即使有个你点击了非法链接发送了请求到服务端,这个非法请求是不会携带 token 的,所以这个请求将是非法的。 -但是这样会存在 XSS 攻击中被盗的风险,为了避免 XSS 攻击,你可以选择将 token 存储在标记为`httpOnly` 的cookie 中。但是,这样有导致了你必须自己提供CSRF保护。 +但是这样会存在 XSS 攻击中被盗的风险,为了避免 XSS 攻击,你可以选择将 token 存储在标记为`httpOnly` 的cookie 中。但是,这样又导致了你必须自己提供CSRF保护。 具体采用上面哪两种方式存储 token 呢,大部分情况下存放在 local storage 下都是最好的选择,某些情况下可能需要存放在标记为`httpOnly` 的cookie 中会更好。 @@ -74,7 +82,7 @@ token 有效期一般都建议设置的不太长,那么 token 过期后如何 ## 总结 -JWT 最适合的场景是无状态的场景,如果考虑到 token 注销和 token 续签的场景话,没有特别好的解决方案,大部分解决方案都给 token 加上了状态,这就有点类似 Session 认证了。 +JWT 最适合的场景是不需要服务端保存用户状态的场景,比如如果考虑到 token 注销和 token 续签的场景话,没有特别好的解决方案,大部分解决方案都给 token 加上了状态,这就有点类似 Session 认证了。 ## Reference