From 07dff03dd49c3fb7d60ad9946bad0a878d67bc01 Mon Sep 17 00:00:00 2001 From: Yongtao Zhang Date: Tue, 11 Sep 2018 14:32:05 +0800 Subject: [PATCH 01/17] =?UTF-8?q?Update=20=E6=95=B0=E6=8D=AE=E5=BA=93?= =?UTF-8?q?=E7=B3=BB=E7=BB=9F=E5=8E=9F=E7=90=86.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 高性能 MYSQL 在事务隔离级别中还有一个概念为加锁读。 --- notes/数据库系统原理.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index 1bcd2533..1ce774fa 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -294,12 +294,12 @@ SELECT ... FOR UPDATE; ---- -| 隔离级别 | 脏读 | 不可重复读 | 幻影读 | -| :---: | :---: | :---:| :---: | -| 未提交读 | √ | √ | √ | -| 提交读 | × | √ | √ | -| 可重复读 | × | × | √ | -| 可串行化 | × | × | × | +| 隔离级别 | 脏读 | 不可重复读 | 幻影读 | 加锁读 | +| :---: | :---: | :---:| :---: | :---: | +| 未提交读 | √ | √ | √ | × | +| 提交读 | × | √ | √ | × | +| 可重复读 | × | × | √ | × | +| 可串行化 | × | × | × | √ | # 五、多版本并发控制 From b88cef16b9032c0a8c98fa0cd01a55ac49307337 Mon Sep 17 00:00:00 2001 From: Yif_Corleone Date: Thu, 13 Sep 2018 18:08:37 +0800 Subject: [PATCH 02/17] =?UTF-8?q?Java=20=E5=9F=BA=E7=A1=80=20219=E8=A1=8C?= =?UTF-8?q?=E7=AC=94=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 应是 s5 == s6 --- notes/Java 基础.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 9da25851..22c94e60 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -216,7 +216,7 @@ System.out.println(s3 == s4); // true ```java String s5 = "bbb"; String s6 = "bbb"; -System.out.println(s4 == s5); // true +System.out.println(s5 == s6); // true ``` 在 Java 7 之前,String Pool 被放在运行时常量池中,它属于永久代。而在 Java 7,String Pool 被移到堆中。这是因为永久代的空间有限,在大量使用字符串的场景下会导致 OutOfMemoryError 错误。 From d167aaf9961f7346afe850a49f903c6be819d658 Mon Sep 17 00:00:00 2001 From: Yif_Corleone Date: Thu, 13 Sep 2018 18:24:14 +0800 Subject: [PATCH 03/17] =?UTF-8?q?String=20poll=E7=AC=94=E8=AF=AF=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=20227~272=E8=A1=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Java 基础.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 9da25851..8dcbff2a 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -226,9 +226,9 @@ System.out.println(s4 == s5); // true ## new String("abc") -使用这种方式一共会创建两个字符串对象(前提是 String Poll 中还没有 "abc" 字符串对象)。 +使用这种方式一共会创建两个字符串对象(前提是 String Pool 中还没有 "abc" 字符串对象)。 -- "abc" 属于字符串字面量,因此编译时期会在 String Poll 中创建一个字符串对象,指向这个 "abc" 字符串字面量; +- "abc" 属于字符串字面量,因此编译时期会在 String Pool 中创建一个字符串对象,指向这个 "abc" 字符串字面量; - 而使用 new 的方式会在堆中创建一个字符串对象。 创建一个测试类,其 main 方法中使用这种方式来创建字符串对象。 @@ -267,7 +267,7 @@ Constant pool: // ... ``` -在 Constant Poll 中,#19 存储这字符串字面量 "abc",#3 是 String Poll 的字符串对象,它指向 #19 这个字符串字面量。在 main 方法中,0: 行使用 new #2 在堆中创建一个字符串对象,并且使用 ldc #3 将 String Poll 中的字符串对象作为 String 构造函数的参数。 +在 Constant Pool 中,#19 存储这字符串字面量 "abc",#3 是 String Pool 的字符串对象,它指向 #19 这个字符串字面量。在 main 方法中,0: 行使用 new #2 在堆中创建一个字符串对象,并且使用 ldc #3 将 String Pool 中的字符串对象作为 String 构造函数的参数。 以下是 String 构造函数的源码,可以看到,在将一个字符串对象作为另一个字符串对象的构造函数参数时,并不会完全复制 value 数组内容,而是都会指向同一个 value 数组。 From b751fc80239a6ef8991c2c8019937bee2a87883b Mon Sep 17 00:00:00 2001 From: Yif_Corleone Date: Fri, 14 Sep 2018 11:32:07 +0800 Subject: [PATCH 04/17] =?UTF-8?q?Java=20=E5=9F=BA=E7=A1=80=EF=BC=8C?= =?UTF-8?q?=E5=AF=B9final=E5=85=B3=E9=94=AE=E5=AD=97=E8=A1=A5=E5=85=85?= =?UTF-8?q?=E6=9E=84=E9=80=A0=E5=99=A8=E7=9B=B8=E5=85=B3=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Java 基础.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/notes/Java 基础.md b/notes/Java 基础.md index bc856d4d..c5aac14e 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -1042,6 +1042,10 @@ private 方法隐式地被指定为 final,如果在子类中定义的方法和 声明类不允许被继承。 +**4. 构造器** + +声明类不允许被`new`实例化,多用于`Singleton`模式中。如果该类有子类需要继承,若该类无其他构造器,则不允许被继承。 + ## static **1. 静态变量** From f2e8961f3706020cd17dd4e758851c7c9f4a312e Mon Sep 17 00:00:00 2001 From: Yif_Corleone Date: Fri, 14 Sep 2018 14:13:33 +0800 Subject: [PATCH 05/17] =?UTF-8?q?Java=20=E5=9F=BA=E7=A1=80=20=E2=80=9C?= =?UTF-8?q?=E9=9A=90=E5=BC=8F=E7=B1=BB=E5=9E=8B=E8=BD=AC=E6=8D=A2=E2=80=9D?= =?UTF-8?q?=E4=B8=AD++=E5=92=8C+=3D=E6=95=88=E6=9E=9C=E4=B8=80=E6=A0=B7?= =?UTF-8?q?=EF=BC=8C=E4=B9=9F=E4=BC=9A=E6=89=A7=E8=A1=8C=E9=9A=90=E5=BC=8F?= =?UTF-8?q?=E7=9A=84=E7=B1=BB=E5=9E=8B=E8=BD=AC=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/Java 基础.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/notes/Java 基础.md b/notes/Java 基础.md index c5aac14e..9992d1ec 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -368,10 +368,11 @@ short s1 = 1; // s1 = s1 + 1; ``` -但是使用 += 运算符可以执行隐式类型转换。 +但是使用 += 或 ++ 运算符可以执行隐式类型转换。 ```java s1 += 1; +// s1++; ``` 上面的语句相当于将 s1 + 1 的计算结果进行了向下转型: From 60ed4f498ca07d3ef6058dd5f783c8156ab97413 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Fri, 14 Sep 2018 21:35:10 +0800 Subject: [PATCH 06/17] auto commit --- notes/Java IO.md | 7 ++++--- notes/Java 基础.md | 21 +++++++++++++-------- notes/Java 并发.md | 5 +++++ notes/剑指 offer 题解.md | 2 +- notes/数据库系统原理.md | 12 ++++++------ notes/缓存.md | 4 +++- 6 files changed, 32 insertions(+), 19 deletions(-) diff --git a/notes/Java IO.md b/notes/Java IO.md index acb95b36..a2dd668b 100644 --- a/notes/Java IO.md +++ b/notes/Java IO.md @@ -69,16 +69,17 @@ public static void listAllFiles(File dir) { ```java public static void copyFile(String src, String dist) throws IOException { - FileInputStream in = new FileInputStream(src); FileOutputStream out = new FileOutputStream(dist); + byte[] buffer = new byte[20 * 1024]; + int cnt; // read() 最多读取 buffer.length 个字节 // 返回的是实际读取的个数 // 返回 -1 的时候表示读到 eof,即文件尾 - while (in.read(buffer, 0, buffer.length) != -1) { - out.write(buffer); + while ((cnt = in.read(buffer, 0, buffer.length)) != -1) { + out.write(buffer, 0, cnt); } in.close(); diff --git a/notes/Java 基础.md b/notes/Java 基础.md index d8f17cef..0087fde7 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -196,9 +196,9 @@ String 不可变性天生具备线程安全,可以在多个线程中安全地 ## String Pool -字符串常量池(String Poll)保存着所有字符串字面量(literal strings),这些字面量在编译时期就确定。不仅如此,还可以使用 String 的 intern() 方法在运行过程中将字符串添加到 String Poll 中。 +字符串常量池(String Pool)保存着所有字符串字面量(literal strings),这些字面量在编译时期就确定。不仅如此,还可以使用 String 的 intern() 方法在运行过程中将字符串添加到 String Pool 中。 -当一个字符串调用 intern() 方法时,如果 String Poll 中已经存在一个字符串和该字符串值相等(使用 equals() 方法进行确定),那么就会返回 String Poll 中字符串的引用;否则,就会在 String Poll 中添加一个新的字符串,并返回这个新字符串的引用。 +当一个字符串调用 intern() 方法时,如果 String Pool 中已经存在一个字符串和该字符串值相等(使用 equals() 方法进行确定),那么就会返回 String Pool 中字符串的引用;否则,就会在 String Pool 中添加一个新的字符串,并返回这个新字符串的引用。 下面示例中,s1 和 s2 采用 new String() 的方式新建了两个不同字符串,而 s3 和 s4 是通过 s1.intern() 方法取得一个字符串引用。intern() 首先把 s1 引用的字符串放到 String Pool 中,然后返回这个字符串引用。因此 s3 和 s4 引用的是同一个字符串。 @@ -216,19 +216,19 @@ System.out.println(s3 == s4); // true ```java String s5 = "bbb"; String s6 = "bbb"; -System.out.println(s4 == s5); // true +System.out.println(s5 == s6); // true ``` -在 Java 7 之前,String Poll 被放在运行时常量池中,它属于永久代。而在 Java 7,String Poll 被移到堆中。这是因为永久代的空间有限,在大量使用字符串的场景下会导致 OutOfMemoryError 错误。 +在 Java 7 之前,String Pool 被放在运行时常量池中,它属于永久代。而在 Java 7,String Pool 被移到堆中。这是因为永久代的空间有限,在大量使用字符串的场景下会导致 OutOfMemoryError 错误。 - [StackOverflow : What is String interning?](https://stackoverflow.com/questions/10578984/what-is-string-interning) - [深入解析 String#intern](https://tech.meituan.com/in_depth_understanding_string_intern.html) ## new String("abc") -使用这种方式一共会创建两个字符串对象(前提是 String Poll 中还没有 "abc" 字符串对象)。 +使用这种方式一共会创建两个字符串对象(前提是 String Pool 中还没有 "abc" 字符串对象)。 -- "abc" 属于字符串字面量,因此编译时期会在 String Poll 中创建一个字符串对象,指向这个 "abc" 字符串字面量; +- "abc" 属于字符串字面量,因此编译时期会在 String Pool 中创建一个字符串对象,指向这个 "abc" 字符串字面量; - 而使用 new 的方式会在堆中创建一个字符串对象。 创建一个测试类,其 main 方法中使用这种方式来创建字符串对象。 @@ -267,7 +267,7 @@ Constant pool: // ... ``` -在 Constant Poll 中,#19 存储这字符串字面量 "abc",#3 是 String Poll 的字符串对象,它指向 #19 这个字符串字面量。在 main 方法中,0: 行使用 new #2 在堆中创建一个字符串对象,并且使用 ldc #3 将 String Poll 中的字符串对象作为 String 构造函数的参数。 +在 Constant Pool 中,#19 存储这字符串字面量 "abc",#3 是 String Pool 的字符串对象,它指向 #19 这个字符串字面量。在 main 方法中,0: 行使用 new #2 在堆中创建一个字符串对象,并且使用 ldc #3 将 String Pool 中的字符串对象作为 String 构造函数的参数。 以下是 String 构造函数的源码,可以看到,在将一个字符串对象作为另一个字符串对象的构造函数参数时,并不会完全复制 value 数组内容,而是都会指向同一个 value 数组。 @@ -368,10 +368,11 @@ short s1 = 1; // s1 = s1 + 1; ``` -但是使用 += 运算符可以执行隐式类型转换。 +但是使用 += 或者 ++ 运算符可以执行隐式类型转换。 ```java s1 += 1; +// s1++; ``` 上面的语句相当于将 s1 + 1 的计算结果进行了向下转型: @@ -1042,6 +1043,10 @@ private 方法隐式地被指定为 final,如果在子类中定义的方法和 声明类不允许被继承。 +**4. 构造器** + +声明类不允许被 `new` 实例化,多用于 `Singleton` 模式中。如果该类有子类需要继承,若该类无其他构造器,则不允许被继承。 + ## static **1. 静态变量** diff --git a/notes/Java 并发.md b/notes/Java 并发.md index 977d85f2..add3982a 100644 --- a/notes/Java 并发.md +++ b/notes/Java 并发.md @@ -740,6 +740,7 @@ java.util.concurrent(J.U.C)大大提高了并发性能,AQS 被认为是 J. ```java public class CountdownLatchExample { + public static void main(String[] args) throws InterruptedException { final int totalThread = 10; CountDownLatch countDownLatch = new CountDownLatch(totalThread); @@ -788,6 +789,7 @@ public CyclicBarrier(int parties) { ```java public class CyclicBarrierExample { + public static void main(String[] args) { final int totalThread = 10; CyclicBarrier cyclicBarrier = new CyclicBarrier(totalThread); @@ -822,6 +824,7 @@ Semaphore 类似于操作系统中的信号量,可以控制对互斥资源的 ```java public class SemaphoreExample { + public static void main(String[] args) { final int clientCount = 3; final int totalRequestCount = 10; @@ -866,6 +869,7 @@ FutureTask 可用于异步获取执行结果或取消执行任务的场景。当 ```java public class FutureTaskExample { + public static void main(String[] args) throws ExecutionException, InterruptedException { FutureTask futureTask = new FutureTask(new Callable() { @Override @@ -971,6 +975,7 @@ produce..produce..consume..consume..produce..consume..produce..consume..produce. ```java public class ForkJoinExample extends RecursiveTask { + private final int threshold = 5; private int first; private int last; diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 2c8f2822..2c2be5b2 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -1154,7 +1154,7 @@ public ListNode FindKthToTail(ListNode head, int k) { ## 解题思路 -使用双指针,一个指针 fast 每次移动两个节点,一个指针 slow 每次移动一个节点。因为存在环,所以两个指针必定相遇在环中的某个节点上。假设相遇点在下图的 z1 位置,此时 fast 移动的节点数为 x+2y+z,slow 为 x+y,由于 fast 速度比 slow 快一倍,因此 x+2y+z=2(x+y),得到 x=z。 +使用双指针,一个指针 fast 每次移动两个节点,一个指针 slow 每次移动一个节点。因为存在环,所以两个指针必定相遇在环中的某个节点上。假设相遇点在下图的 y4 位置,此时 fast 移动的节点数为 x+2y+z,slow 为 x+y,由于 fast 速度比 slow 快一倍,因此 x+2y+z=2(x+y),得到 x=z。 在相遇点,slow 要到环的入口点还需要移动 z 个节点,如果让 fast 重新从头开始移动,并且速度变为每次移动一个节点,那么它到环入口点还需要移动 x 个节点。在上面已经推导出 x=z,因此 fast 和 slow 将在环入口点相遇。 diff --git a/notes/数据库系统原理.md b/notes/数据库系统原理.md index 1bcd2533..1ce774fa 100644 --- a/notes/数据库系统原理.md +++ b/notes/数据库系统原理.md @@ -294,12 +294,12 @@ SELECT ... FOR UPDATE; ---- -| 隔离级别 | 脏读 | 不可重复读 | 幻影读 | -| :---: | :---: | :---:| :---: | -| 未提交读 | √ | √ | √ | -| 提交读 | × | √ | √ | -| 可重复读 | × | × | √ | -| 可串行化 | × | × | × | +| 隔离级别 | 脏读 | 不可重复读 | 幻影读 | 加锁读 | +| :---: | :---: | :---:| :---: | :---: | +| 未提交读 | √ | √ | √ | × | +| 提交读 | × | √ | √ | × | +| 可重复读 | × | × | √ | × | +| 可串行化 | × | × | × | √ | # 五、多版本并发控制 diff --git a/notes/缓存.md b/notes/缓存.md index 8f7449bf..07a9e866 100644 --- a/notes/缓存.md +++ b/notes/缓存.md @@ -99,7 +99,7 @@ public class LRU implements Iterable { if (map.size() > maxSize) { Node toRemove = removeTail(); - map.remove(toRemove); + map.remove(toRemove.k); } } @@ -114,6 +114,7 @@ public class LRU implements Iterable { private void appendHead(Node node) { node.next = head.next; + node.next.pre = node; node.pre = head; head.next = node; } @@ -122,6 +123,7 @@ public class LRU implements Iterable { private Node removeTail() { Node node = tail.pre; tail.pre = node.pre; + node.pre.next = tail; return node; } From 325595d41bd597a57a102b75150e939aafa7e42f Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Fri, 14 Sep 2018 22:13:46 +0800 Subject: [PATCH 07/17] auto commit --- notes/Java 基础.md | 2 +- notes/剑指 offer 题解.md | 2 +- pics/70fa1f83-dae7-456d-b94b-ce28963b2ba1.png | Bin 0 -> 17408 bytes 3 files changed, 2 insertions(+), 2 deletions(-) create mode 100644 pics/70fa1f83-dae7-456d-b94b-ce28963b2ba1.png diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 5bb41ea6..0087fde7 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -1045,7 +1045,7 @@ private 方法隐式地被指定为 final,如果在子类中定义的方法和 **4. 构造器** -声明类不允许被`new`实例化,多用于`Singleton`模式中。如果该类有子类需要继承,若该类无其他构造器,则不允许被继承。 +声明类不允许被 `new` 实例化,多用于 `Singleton` 模式中。如果该类有子类需要继承,若该类无其他构造器,则不允许被继承。 ## static diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 2c2be5b2..a797eaa1 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -1158,7 +1158,7 @@ public ListNode FindKthToTail(ListNode head, int k) { 在相遇点,slow 要到环的入口点还需要移动 z 个节点,如果让 fast 重新从头开始移动,并且速度变为每次移动一个节点,那么它到环入口点还需要移动 x 个节点。在上面已经推导出 x=z,因此 fast 和 slow 将在环入口点相遇。 -

+

```java public ListNode EntryNodeOfLoop(ListNode pHead) { diff --git a/pics/70fa1f83-dae7-456d-b94b-ce28963b2ba1.png b/pics/70fa1f83-dae7-456d-b94b-ce28963b2ba1.png new file mode 100644 index 0000000000000000000000000000000000000000..0d28e99622f41e6d1d67f1d1d4f94cef7505530b GIT binary patch literal 17408 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 literal 0 HcmV?d00001 From 170f0fc3eb056c5b8ad4f16f5bac5396bcad250e Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Fri, 14 Sep 2018 22:14:52 +0800 Subject: [PATCH 08/17] auto commit --- notes/剑指 offer 题解.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index a797eaa1..4af993dd 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -1154,7 +1154,7 @@ public ListNode FindKthToTail(ListNode head, int k) { ## 解题思路 -使用双指针,一个指针 fast 每次移动两个节点,一个指针 slow 每次移动一个节点。因为存在环,所以两个指针必定相遇在环中的某个节点上。假设相遇点在下图的 y4 位置,此时 fast 移动的节点数为 x+2y+z,slow 为 x+y,由于 fast 速度比 slow 快一倍,因此 x+2y+z=2(x+y),得到 x=z。 +使用双指针,一个指针 fast 每次移动两个节点,一个指针 slow 每次移动一个节点。因为存在环,所以两个指针必定相遇在环中的某个节点上。假设相遇点在下图的 y6 位置,此时 fast 移动的节点数为 x+2y+z,slow 为 x+y,由于 fast 速度比 slow 快一倍,因此 x+2y+z=2(x+y),得到 x=z。 在相遇点,slow 要到环的入口点还需要移动 z 个节点,如果让 fast 重新从头开始移动,并且速度变为每次移动一个节点,那么它到环入口点还需要移动 x 个节点。在上面已经推导出 x=z,因此 fast 和 slow 将在环入口点相遇。 From b802b8add8fa367d09494c37fe20c13e123b14a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=81=AA=E5=A8=81?= Date: Sun, 16 Sep 2018 14:17:21 +0800 Subject: [PATCH 09/17] =?UTF-8?q?Update=20=E5=89=91=E6=8C=87=20offer=20?= =?UTF-8?q?=E9=A2=98=E8=A7=A3.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- notes/剑指 offer 题解.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 4af993dd..e1a87b5b 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -1559,7 +1559,7 @@ public ArrayList> Print(TreeNode pRoot) { 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入的数组的任意两个数字都互不相同。 -例如,下图是后序遍历序列 3,1,2 所对应的二叉搜索树。 +例如,下图是后序遍历序列 1,3,2 所对应的二叉搜索树。

From 55f1d4e2f53effb4e75e349ccf9b278060bf62f3 Mon Sep 17 00:00:00 2001 From: 0xl2oot <0xl2oot@gmail.com> Date: Mon, 17 Sep 2018 21:42:01 +0800 Subject: [PATCH 10/17] Update SUMMARY.md --- SUMMARY.md | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/SUMMARY.md b/SUMMARY.md index 69b6103c..a864c37f 100644 --- a/SUMMARY.md +++ b/SUMMARY.md @@ -27,10 +27,23 @@ This file used to generate gitbook catalogue. * [Java 虚拟机](/notes/Java 虚拟机.md) * [Java 并发](/notes/Java 并发.md) * [Java 容器](/notes/Java 容器.md) - * [Java I/O](/notes/Java I/O.md) -* 分布式 - * [一致性](/notes/一致性.md) - * [分布式问题分析](/notes/分布式问题分析.md) - - + * [Java I/O](/notes/Java IO.md) +* 系统设计 + * [系统设计基础](/notes/系统设计基础.md) + * [分布式](/notes/分布式.md) + * [集群](/notes/集群.md) + * [攻击技术](/notes/攻击技术.md) + * [缓存](/notes/缓存.md) + * [消息队列](/notes/消息队列.md) +* 工具 + * [Git](/notes/Git.md) + * [Docker](/notes/Docker.md) + * [正则表达式](/notes/正则表达式.md) + * [构建工具](/notes/构建工具.md) +* 编码实践 + * [重构](/notes/重构.md) + * [代码可读性](/notes/代码可读性.md) + * [代码风格规范](/notes/代码风格规范.md) +* 参考书目 + * [BOOKLIST](/BOOKLIST.md) From e56a80629286fad24633654a1b27494081952b53 Mon Sep 17 00:00:00 2001 From: Yif_Corleone Date: Tue, 18 Sep 2018 00:44:56 +0800 Subject: [PATCH 11/17] Java --- notes/Java 基础.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 0087fde7..eb3572cd 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -1043,10 +1043,6 @@ private 方法隐式地被指定为 final,如果在子类中定义的方法和 声明类不允许被继承。 -**4. 构造器** - -声明类不允许被 `new` 实例化,多用于 `Singleton` 模式中。如果该类有子类需要继承,若该类无其他构造器,则不允许被继承。 - ## static **1. 静态变量** From 338d0bff7fab7d27537b91b1c48a1d035991e527 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 18 Sep 2018 09:31:50 +0800 Subject: [PATCH 12/17] auto commit --- notes/Java 基础.md | 4 ---- notes/剑指 offer 题解.md | 2 +- notes/计算机操作系统.md | 2 +- notes/设计模式.md | 2 +- 4 files changed, 3 insertions(+), 7 deletions(-) diff --git a/notes/Java 基础.md b/notes/Java 基础.md index 0087fde7..eb3572cd 100644 --- a/notes/Java 基础.md +++ b/notes/Java 基础.md @@ -1043,10 +1043,6 @@ private 方法隐式地被指定为 final,如果在子类中定义的方法和 声明类不允许被继承。 -**4. 构造器** - -声明类不允许被 `new` 实例化,多用于 `Singleton` 模式中。如果该类有子类需要继承,若该类无其他构造器,则不允许被继承。 - ## static **1. 静态变量** diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 4af993dd..e1a87b5b 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -1559,7 +1559,7 @@ public ArrayList> Print(TreeNode pRoot) { 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历的结果。假设输入的数组的任意两个数字都互不相同。 -例如,下图是后序遍历序列 3,1,2 所对应的二叉搜索树。 +例如,下图是后序遍历序列 1,3,2 所对应的二叉搜索树。

diff --git a/notes/计算机操作系统.md b/notes/计算机操作系统.md index e6c462a6..c0c4364e 100644 --- a/notes/计算机操作系统.md +++ b/notes/计算机操作系统.md @@ -1038,7 +1038,7 @@ gcc -o hello hello.c ## 静态链接 -静态连接器以一组可重定向目标文件为输入,生成一个完全链接的可执行目标文件作为输出。链接器主要完成以下两个任务: +静态链接器以一组可重定向目标文件为输入,生成一个完全链接的可执行目标文件作为输出。链接器主要完成以下两个任务: - 符号解析:每个符号对应于一个函数、一个全局变量或一个静态变量,符号解析的目的是将每个符号引用与一个符号定义关联起来。 - 重定位:链接器通过把每个符号定义与一个内存位置关联起来,然后修改所有对这些符号的引用,使得它们指向这个内存位置。 diff --git a/notes/设计模式.md b/notes/设计模式.md index d44d0e33..3b53a66a 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -177,7 +177,7 @@ public class Singleton { #### Ⅵ 枚举实现 - ```java +```java public enum Singleton { INSTANCE; From 57a741092b3d04dcb7f4019e1fa7cbcd47a6db17 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 18 Sep 2018 09:33:33 +0800 Subject: [PATCH 13/17] auto commit --- notes/设计模式.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/设计模式.md b/notes/设计模式.md index 3b53a66a..8c9f0b22 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -217,7 +217,7 @@ public enum Singleton { } } } - ``` +``` 该实现在多次序列化再进行反序列化之后,不会得到多个实例。而其它实现,为了保证不会出现反序列化之后出现多个实例,需要使用 transient 修饰所有字段,并且实现序列化和反序列化的方法。 From f89ef4cf591d2ef04f89e3428fc2af34be56617d Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Tue, 18 Sep 2018 09:42:24 +0800 Subject: [PATCH 14/17] auto commit --- notes/设计模式.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/notes/设计模式.md b/notes/设计模式.md index 8c9f0b22..c177ff92 100644 --- a/notes/设计模式.md +++ b/notes/设计模式.md @@ -276,6 +276,7 @@ public class ConcreteProduct2 implements Product { ```java public class Client { + public static void main(String[] args) { int type = 1; Product product; @@ -295,6 +296,7 @@ public class Client { ```java public class SimpleFactory { + public Product createProduct(int type) { if (type == 1) { return new ConcreteProduct1(); @@ -308,6 +310,7 @@ public class SimpleFactory { ```java public class Client { + public static void main(String[] args) { SimpleFactory simpleFactory = new SimpleFactory(); Product product = simpleFactory.createProduct(1); From e3c63b6637f4a95981c4a6b54286667daab01c06 Mon Sep 17 00:00:00 2001 From: Yutong Wang Date: Mon, 17 Sep 2018 21:50:19 -0700 Subject: [PATCH 15/17] Simplify House Robber solution --- notes/Leetcode 题解.md | 31 +++++++++++-------------------- 1 file changed, 11 insertions(+), 20 deletions(-) diff --git a/notes/Leetcode 题解.md b/notes/Leetcode 题解.md index 04a751c7..2d6b2d5f 100644 --- a/notes/Leetcode 题解.md +++ b/notes/Leetcode 题解.md @@ -2415,27 +2415,19 @@ public int climbStairs(int n) { 定义 dp 数组用来存储最大的抢劫量,其中 dp[i] 表示抢到第 i 个住户时的最大抢劫量。 由于不能抢劫邻近住户,因此如果抢劫了第 i 个住户那么只能抢劫 i - 2 或者 i - 3 的住户,所以 - -

+dp[i] = max(dp[i-1], dp[i-2] + nums[i])
```java public int rob(int[] nums) { - int n = nums.length; - if (n == 0) { - return 0; - } - if (n == 1) { - return nums[0]; - } - int pre3 = 0, pre2 = 0, pre1 = 0; - for (int i = 0; i < n; i++) { - int cur = Math.max(pre2, pre3) + nums[i]; - pre3 = pre2; + int pre2 = 0, pre1 = 0; + for (int i = 0; i < nums.length; i++) { + int cur = Math.max(pre2 + nums[i], pre1); pre2 = pre1; pre1 = cur; } - return Math.max(pre1, pre2); + return pre1; } + ``` **强盗在环形街区抢劫** @@ -2443,7 +2435,7 @@ public int rob(int[] nums) { [213. House Robber II (Medium)](https://leetcode.com/problems/house-robber-ii/description/) ```java -public int rob(int[] nums) { +public int rob(int[] nums) { if (nums == null || nums.length == 0) { return 0; } @@ -2454,15 +2446,14 @@ public int rob(int[] nums) { return Math.max(rob(nums, 0, n - 2), rob(nums, 1, n - 1)); } -private int rob(int[] nums, int first, int last) { - int pre3 = 0, pre2 = 0, pre1 = 0; +private int rob(int[] nums, int first, int last) { + int pre2 = 0, pre1 = 0; for (int i = first; i <= last; i++) { - int cur = Math.max(pre3, pre2) + nums[i]; - pre3 = pre2; + int cur = Math.max(pre1, pre2 + nums[i]); pre2 = pre1; pre1 = cur; } - return Math.max(pre2, pre1); + return pre1; } ``` From 497812bd4232da65e88b9e7628a0e7de5abb3030 Mon Sep 17 00:00:00 2001 From: Yutong Wang Date: Mon, 17 Sep 2018 23:40:06 -0700 Subject: [PATCH 16/17] Fix a bug in the Minimum Path Sum solution Check boundary --- notes/Leetcode 题解.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/notes/Leetcode 题解.md b/notes/Leetcode 题解.md index 2d6b2d5f..d09ff18d 100644 --- a/notes/Leetcode 题解.md +++ b/notes/Leetcode 题解.md @@ -2505,9 +2505,9 @@ public int minPathSum(int[][] grid) { for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (i == 0) { - dp[j] = dp[j - 1]; + if (j>0) dp[j] = dp[j - 1]; } else { - dp[j] = Math.min(dp[j - 1], dp[j]); + if (j>0) dp[j] = Math.min(dp[j - 1], dp[j]); } dp[j] += grid[i][j]; } From 177a4325950ebebbfcc69c9c9a41d31ddba091d3 Mon Sep 17 00:00:00 2001 From: Jingui Ren <1198980993@qq.com> Date: Tue, 18 Sep 2018 10:31:09 +0000 Subject: [PATCH 17/17] =?UTF-8?q?mask=E8=AE=A1=E7=AE=97=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当mask = 11011000的时候,mask |= mask >> 2这个时候的值应该为11111110 --- notes/Java 容器.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/notes/Java 容器.md b/notes/Java 容器.md index 84189928..e42a42f0 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -738,7 +738,7 @@ HashMap 构造函数允许用户传入的容量不是 2 的 n 次方,因为它 ``` mask |= mask >> 1 11011000 -mask |= mask >> 2 11111100 +mask |= mask >> 2 11111110 mask |= mask >> 4 11111111 ```