diff --git a/notes/2016 校招真题题解.md b/notes/2016 校招真题题解.md index 0285debe..b50cce0c 100644 --- a/notes/2016 校招真题题解.md +++ b/notes/2016 校招真题题解.md @@ -1,33 +1,33 @@ -* [ǰÑÔ](#ǰÑÔ) -* [1. СÃ×-СÃ×Git](#1-СÃ×-СÃ×git) -* [2. СÃ×-¶®¶þ½øÖÆ](#2-СÃ×-¶®¶þ½øÖÆ) -* [3. СÃ×-ÖйúÅ£ÊÐ](#3-СÃ×-ÖйúÅ£ÊÐ) -* [4. ΢Èí-LUCKY STRING](#4-΢Èí-lucky-string) -* [5. ΢Èí-Numeric Keypad](#5-΢Èí-numeric-keypad) -* [6. ΢Èí-Spring Outing](#6-΢Èí-spring-outing) -* [7. ΢Èí-S-expression](#7-΢Èí-s-expression) -* [8. »ªÎª-×î¸ß·ÖÊǶàÉÙ](#8-»ªÎª-×î¸ß·ÖÊǶàÉÙ) -* [9. »ªÎª-¼òµ¥´íÎó¼Ç¼](#9-»ªÎª-¼òµ¥´íÎó¼Ç¼) -* [10. »ªÎª-ÆË¿ËÅÆ´óС](#10-»ªÎª-ÆË¿ËÅÆ´óС) -* [11. È¥ÄĶù-¶þ·Ö²éÕÒ](#11-È¥ÄĶù-¶þ·Ö²éÕÒ) -* [12. È¥ÄĶù-Ê׸öÖØ¸´×Ö·û](#12-È¥ÄĶù-Ê׸öÖØ¸´×Ö·û) -* [13. È¥ÄĶù-ѰÕÒCoder](#13-È¥ÄĶù-ѰÕÒcoder) -* [14. ÃÀÍÅ-×î´ó²îÖµ](#14-ÃÀÍÅ-×î´ó²îÖµ) -* [15. ÃÀÍÅ-Æå×Ó·­×ª](#15-ÃÀÍÅ-Æå×Ó·­×ª) -* [16. ÃÀÍÅ-°Ý·Ã](#16-ÃÀÍÅ-°Ý·Ã) -* [17. ÃÀÍÅ-Ö±·½Í¼ÄÚ×î´ó¾ØÐÎ](#17-ÃÀÍÅ-Ö±·½Í¼ÄÚ×î´ó¾ØÐÎ) -* [18. ÃÀÍÅ-×Ö·û´®¼ÆÊý](#18-ÃÀÍÅ-×Ö·û´®¼ÆÊý) -* [19. ÃÀÍÅ-ƽ¾ùÄêÁä](#19-ÃÀÍÅ-ƽ¾ùÄêÁä) -* [20. °Ù¶È-×ï·¸×ªÒÆ](#20-°Ù¶È-×ï·¸×ªÒÆ) -* [22. °Ù¶È-²Ã¼õÍø¸ñÖ½](#22-°Ù¶È-²Ã¼õÍø¸ñÖ½) -* [23. °Ù¶È-µöÓã±ÈÈü](#23-°Ù¶È-µöÓã±ÈÈü) -* [24. °Ù¶È-Ä¢¹½Õó](#24-°Ù¶È-Ä¢¹½Õó) +* [???](#???) +* [1. §³??-§³??Git](#1-§ã??-§ã??git) +* [2. §³??-????????](#2-§ã??-????????) +* [3. §³??-?§Û????](#3-§ã??-?§Û????) +* [4. ???-LUCKY STRING](#4-???-lucky-string) +* [5. ???-Numeric Keypad](#5-???-numeric-keypad) +* [6. ???-Spring Outing](#6-???-spring-outing) +* [7. ???-S-expression](#7-???-s-expression) +* [8. ???-?????????](#8-???-?????????) +* [9. ???-???????](#9-???-???????) +* [10. ???-??????§³](#10-???-??????§ã) +* [11. ????-???????](#11-????-???????) +* [12. ????-?????????](#12-????-?????????) +* [13. ????-???Coder](#13-????-???coder) +* [14. ????-?????](#14-????-?????) +* [15. ????-??????](#15-????-??????) +* [16. ????-???](#16-????-???) +* [17. ????-????????????](#17-????-????????????) +* [18. ????-?????????](#18-????-?????????) +* [19. ????-???????](#19-????-???????) +* [20. ???-?????](#20-???-?????) +* [22. ???-?¨¹??????](#22-???-?¨¹??????) +* [23. ???-???????](#23-???-???????) +* [24. ???-?????](#24-???-?????) -# ǰÑÔ +# ??? -Ê¡ÂԵĴúÂ룺 +??????? ```java import java.util.*; @@ -48,10 +48,10 @@ public class Main { } ``` -# 1. СÃ×-СÃ×Git +# 1. §³??-§³??Git -- ÖØ½¨¶à²æÊ÷ -- ʹÓà LCA +- ???????? +- ??? LCA ```java private class TreeNode { @@ -65,7 +65,7 @@ private class TreeNode { public int getSplitNode(String[] matrix, int indexA, int indexB) { int n = matrix.length; - boolean[][] linked = new boolean[n][n]; // ÖØ½¨ÁÚ½Ó¾ØÕó + boolean[][] linked = new boolean[n][n]; // ????????? for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { linked[i][j] = matrix[i].charAt(j) == '1'; @@ -80,7 +80,7 @@ private TreeNode constructTree(boolean[][] linked, int root) { TreeNode tree = new TreeNode(root); for (int i = 0; i < linked[root].length; i++) { if (linked[root][i]) { - linked[i][root] = false; // ÒòΪÌâÄ¿¸øµÄÁÚ½Ó¾ØÕóÊÇË«ÏòµÄ£¬ÔÚÕâÀïÐèÒª°ÑËüתΪµ¥ÏòµÄ + linked[i][root] = false; // ??????????????????????????????????????????? tree.childs.add(constructTree(links, i)); } } @@ -102,9 +102,9 @@ private TreeNode LCA(TreeNode root, TreeNode p, TreeNode q) { } ``` -# 2. СÃ×-¶®¶þ½øÖÆ +# 2. §³??-???????? -¶ÔÁ½¸öÊý½øÐÐÒì»ò£¬½á¹ûµÄ¶þ½øÖƱíʾΪ 1 µÄÄÇһλ¾ÍÊÇÁ½¸öÊý²»Í¬µÄλ¡£ +??????????????????????????? 1 ?????¦Ë???????????????¦Ë?? ```java public int countBitDiff(int m, int n) { @@ -112,11 +112,11 @@ public int countBitDiff(int m, int n) { } ``` -# 3. СÃ×-ÖйúÅ£ÊÐ +# 3. §³??-?§Û???? -±³°üÎÊÌ⣬¿ÉÒÔÉèÒ»¸ö´óСΪ 2 µÄ±³°ü¡£ +???????????????????§³? 2 ??????? -×´Ì¬×ªÒÆ·½³ÌÈçÏ£º +????????????? ```html dp[i, j] = max(dp[i, j-1], prices[j] - prices[jj] + dp[i-1, jj]) { jj in range of [0, j-1] } = max(dp[i, j-1], prices[j] + max(dp[i-1, jj] - prices[jj])) @@ -137,10 +137,10 @@ public int calculateMax(int[] prices) { } ``` -# 4. ΢Èí-LUCKY STRING +# 4. ???-LUCKY STRING -- ì³²¨ÄÇÆõÊýÁпÉÒÔÔ¤¼ÆË㣻 -- ´ÓÍ·µ½Î²±éÀú×Ö·û´®µÄ¹ý³Ì£¬Ã¿Ò»ÂÖÑ­»·¶¼Ê¹ÓÃÒ»¸ö Set À´±£´æ´Ó i µ½ j ³öÏÖµÄ×Ö·û£¬²¢ÇÒ Set ±£Ö¤ÁË×Ö·û¶¼²»Í¬£¬Òò´Ë Set µÄ´óС¾ÍÊDz»Í¬×Ö·ûµÄ¸öÊý¡£ +- ?????????§á???????? +- ?????¦Â?????????????????????????????? Set ??????? i ?? j ?????????????? Set ?????????????????? Set ???§³???????????????? ```java Set fibSet = new HashSet<>(Arrays.asList(1, 2, 3, 5, 8, 13, 21, 34, 55, 89)); @@ -165,7 +165,7 @@ for (String s : arr) { } ``` -# 5. ΢Èí-Numeric Keypad +# 5. ???-Numeric Keypad ```java private static int[][] canReach = { @@ -209,17 +209,17 @@ public static void main(String[] args) { } ``` -# 6. ΢Èí-Spring Outing +# 6. ???-Spring Outing -ÏÂÃæÒÔ N = 3£¬K = 4 À´½øÐÐÌÖÂÛ¡£ +?????? N = 3??K = 4 ??????????? -³õʼʱ£¬ÁîµÚ 0 ¸öµØ·½³ÉΪ´ý¶¨µØµã£¬Ò²¾ÍÊÇ´ôÔÚ¼ÒÀï¡£ +????????? 0 ?????????????????????????? -´ÓµÚ 4 ¸öµØµã¿ªÊ¼Í¶Æ±£¬Ã¿¸öÈËÖ»ÐèÒª±È½ÏµÚ 4 ¸öµØ·½ºÍµÚ 0 ¸öµØ·½µÄÓÅÏȼ¶£¬ÀÈç¹û³¬¹ý°ëÊýµÄÈËÑ¡ÔñÁËµÚ 4 ¸öµØ·½£¬ÄÇô¸üÐÂµÚ 4 ¸öµØ·½³ÉΪ´ý¶¨µØµã¡£ +??? 4 ??????????????????????? 4 ???????? 0 ????????????????????????????????????? 4 ??????????????? 4 ??????????????? -´ÓºóÍùǰ²»¶ÏÖØ¸´ÒÔÉϲ½Ö裬²»¶Ï¸üдý¶¨µØµã£¬Ö±µ½ËùÓеط½¶¼ÒѾ­Í¶Æ±¡£ +???????????????????Ñk???????????????????§Ö??????????? -ÉÏÃæµÄÌÖÂÛÖУ¬ÏÈÁîµÚ 0 ¸öµØµã³ÉΪ´ý¶¨µØµã£¬ÊÇÒòΪÕâÑùµÄ»°µÚ 4 ¸öµØµã¾ÍÖ»ÐèÒªºÍÕâ¸öµØµã½øÐбȽϣ¬¶ø²»Óÿ¼ÂÇÆäËüÇé¿ö¡£Èç¹û×ʼÏÈÁîµÚ 1 ¸öµØµã³ÉΪ´ý¶¨µØµã£¬ÄÇôÔÚ¶ÔµÚ 2 ¸öµØµã½øÐÐͶƱʱ£¬Ã¿¸öÈ˲»½öÒª¿¼ÂÇµÚ 2 ¸öµØµãÓëµÚ 1 ¸öµØµãµÄÓÅÏȼ¶£¬Ò²Òª¿¼ÂÇÓëÆäºóͶƱµØµãµÄÓÅÏȼ¶¡£ +??????????§µ?????? 0 ???????????????????????????? 4 ????????????????????§Ò???????????????????????????????? 1 ????????????????????? 2 ??????????????????????????? 2 ???????? 1 ????????????????????????????????????? ```java int N = in.nextInt(); @@ -246,9 +246,9 @@ for (int place = K; place > 0; place--) { System.out.println(ret == 0 ? "otaku" : ret); ``` -# 7. ΢Èí-S-expression +# 7. ???-S-expression -# 8. »ªÎª-×î¸ß·ÖÊǶàÉÙ +# 8. ???-????????? ```java int N = in.nextInt(); @@ -280,7 +280,7 @@ for (int i = 0; i < M; i++) { } ``` -# 9. »ªÎª-¼òµ¥´íÎó¼Ç¼ +# 9. ???-??????? ```java HashMap map = new LinkedHashMap<>(); @@ -300,7 +300,7 @@ for (int i = 0; i < 8 && i < list.size(); i++) { } ``` -# 10. »ªÎª-ÆË¿ËÅÆ´óС +# 10. ???-??????§³ ```java public class Main { @@ -391,12 +391,12 @@ public class Main { } ``` -# 11. È¥ÄĶù-¶þ·Ö²éÕÒ +# 11. ????-??????? -¶ÔÓÚÓÐÖØ¸´ÔªËصÄÓÐÐòÊý×飬¶þ·Ö²éÕÒÐèҪעÒâÒÔÏÂÒªµã£º +????????????????????ï…???????????????????? - if (val <= A[m]) h = m; -- ÒòΪ h µÄ¸³ÖµÎª m ¶ø²»ÊÇ m - 1£¬Òò´Ë while Ñ­»·µÄÌõ¼þÒ²¾ÍΪ l < h¡££¨Èç¹ûÊÇ m - 1 Ñ­»·Ìõ¼þΪ l <= h£© +- ??? h ????? m ?????? m - 1????? while ????????????? l < h????????? m - 1 ???????? l <= h?? ```java public int getPos(int[] A, int n, int val) { @@ -410,7 +410,7 @@ public int getPos(int[] A, int n, int val) { } ``` -# 12. È¥ÄĶù-Ê׸öÖØ¸´×Ö·û +# 12. ????-????????? ```java public char findFirstRepeat(String A, int n) { @@ -424,7 +424,7 @@ public char findFirstRepeat(String A, int n) { } ``` -# 13. È¥ÄĶù-ѰÕÒCoder +# 13. ????-???Coder ```java public String[] findCoder(String[] A, int n) { @@ -450,7 +450,7 @@ public String[] findCoder(String[] A, int n) { return ret; } -// Å£¿ÍÍøÎÞ·¨µ¼Èë javafx.util.Pair£¬ÕâÀï¾Í×Ô¼ºÊµÏÖһϠPair Àà +// ???????????? javafx.util.Pair???????????????? Pair ?? private class Pair { T t; K k; @@ -470,9 +470,9 @@ private class Pair { } ``` -# 14. ÃÀÍÅ-×î´ó²îÖµ +# 14. ????-????? -̰ÐIJßÂÔ¡£ +??????? ```java public int getDis(int[] A, int n) { @@ -486,7 +486,7 @@ public int getDis(int[] A, int n) { } ``` -# 15. ÃÀÍÅ-Æå×Ó·­×ª +# 15. ????-?????? ```java public int[][] flipChess(int[][] A, int[][] f) { @@ -502,7 +502,7 @@ public int[][] flipChess(int[][] A, int[][] f) { } ``` -# 16. ÃÀÍÅ-°Ý·Ã +# 16. ????-??? ```java private Set paths; @@ -554,7 +554,7 @@ private void backtracking(int[][] map, int n, int m, int r, int c, int[][] direc } ``` -# 17. ÃÀÍÅ-Ö±·½Í¼ÄÚ×î´ó¾ØÐÎ +# 17. ????-???????????? ```java public int countArea(int[] A, int n) { @@ -570,15 +570,15 @@ public int countArea(int[] A, int n) { } ``` -# 18. ÃÀÍÅ-×Ö·û´®¼ÆÊý +# 18. ????-????????? -×Ö·û´®¶¼ÊÇСд×Ö·û£¬¿ÉÒÔ°Ñ×Ö·û´®µ±³ÉÊÇ 26 ½øÖÆ¡£µ«ÊÇ×ÖµäÐòµÄ±È½ÏºÍÆÕͨµÄÕûÊý±È½Ï²»Í¬£¬ÊÇ´Ó×óÍùÓÒ½øÐбȽϣ¬ÀýÈç "ac" ºÍ "abc"£¬×ÖµäÐòµÄ±È½Ï½á¹ûΪ "ac" > "abc"£¬Èç¹û°´ÕÕÕûÊý·½·¨±È½Ï£¬ÒòΪ "abc" ÊÇÈýλÊý£¬ÏÔÈ»¸ü´ó¡£ +?????????§³§Õ????????????????????? 26 ?????????????????????????????????????????????§Ò??????? "ac" ?? "abc"????????????? "ac" > "abc"???????????????????????? "abc" ????¦Ë??????????? -ÓÉÓÚÁ½¸ö×Ö·û´®µÄ³¤¶È¿ÉÄܲ»ÏëµÈ£¬ÔÚ s1 ¿Õ°×²¿·ÖºÍ s2 ¶ÔÓ¦²¿·Ö½øÐбȽÏʱ£¬Ó¦¸Ã°Ñ s1 µÄ¿Õ°×²¿·Ö¿´³ÉÊÇ 'a' ×Ö·û½øÐÐÌî³äµÄ¡£ +???????????????????????????? s1 ??????? s2 ?????????§Ò????????? s1 ???????????? 'a' ???????????? -»¹ÓÐÒ»µãҪעÒâµÄÊÇ£¬s1 µ½ s2 ³¤¶ÈΪ leni µÄ×Ö·û´®¸öÊýÖ»±È½ÏÇ°Ãæ i ¸ö×Ö·û¡£ÀýÈç 'aaa' ºÍ 'bbb' £¬³¤¶ÈΪ 2 µÄ¸öÊýΪ 'aa' µ½ 'bb' µÄ×Ö·û´®¸öÊý£¬²»ÐèÒª¿¼ÂǺóÃæ²¿·ÖµÄ×Ö·û¡£ +???????????????s1 ?? s2 ????? leni ?????????????????? i ??????????? 'aaa' ?? 'bbb' ??????? 2 ?????? 'aa' ?? 'bb' ????????????????????????ÑØ???????? -ÔÚͳ¼Æ¸öÊýʱ£¬´Ó len1 ¿ªÊ¼Ò»Ö±±éÀúµ½×î´óºÏ·¨³¤¶È£¬Ã¿´ÎÑ­»·¶¼Í³¼Æ³¤¶ÈΪ i µÄ×Ó×Ö·û´®¸öÊý¡£ +????????????? len1 ???????????????????????????????????? i ??????????????? ```java String s1 = in.next(); @@ -601,7 +601,7 @@ for (int i = len1; i <= len; i++) { System.out.println(ret - 1); ``` -# 19. ÃÀÍÅ-ƽ¾ùÄêÁä +# 19. ????-??????? ```java int W = in.nextInt(); @@ -609,15 +609,15 @@ double Y = in.nextDouble(); double x = in.nextDouble(); int N = in.nextInt(); while (N-- > 0) { - Y++; // ÀÏÔ±¹¤Ã¿ÄêÄêÁä¶¼Òª¼Ó 1 + Y++; // ??????????????? 1 Y += (21 - Y) * x; } System.out.println((int) Math.ceil(Y)); ``` -# 20. °Ù¶È-×ï·¸×ªÒÆ +# 20. ???-????? -²¿·ÖºÍÎÊÌ⣬½«Ã¿´ÎÇóµÄ²¿·ÖºÍ»º´æÆðÀ´¡£ +?????????????????????????????? ```java int n = in.nextInt(); @@ -640,7 +640,7 @@ for (int s = 0, e = c - 1; e < n; s++, e++) { System.out.println(cnt); ``` -# 22. °Ù¶È-²Ã¼õÍø¸ñÖ½ +# 22. ???-?¨¹?????? ```java int n = in.nextInt(); @@ -658,11 +658,11 @@ for (int i = 0; i < n; i++) { System.out.println((int) Math.pow(Math.max(maxX - minX, maxY - minY), 2)); ``` -# 23. °Ù¶È-µöÓã±ÈÈü +# 23. ???-??????? -P ( ÖÁÉÙµöÒ»ÌõÓã ) = 1 - P ( Ò»ÌõÒ²µö²»µ½ ) +P ( ?????????? ) = 1 - P ( ?????????? ) -¿Ó£º¶ÁÈ¡¸ÅÂʾØÕóµÄʱºò£¬ÐèÒªÒ»ÐÐÒ»ÐнøÐжÁÈ¡£¬¶ø²»ÄÜÖ±½ÓÓà in.nextDouble()¡£ +?????????????????????????§ß??§Ø??????????????? in.nextDouble()?? ```java public static void main(String[] args) { @@ -673,11 +673,11 @@ public static void main(String[] args) { int x = in.nextInt(); int y = in.nextInt(); int t = in.nextInt(); - in.nextLine(); // ¿Ó + in.nextLine(); // ?? double pcc = 0.0; double sum = 0.0; for (int i = 1; i <= n; i++) { - String[] token = in.nextLine().split(" "); // ¿Ó + String[] token = in.nextLine().split(" "); // ?? for (int j = 1; j <= m; j++) { double p = Double.parseDouble(token[j - 1]); // double p = in.nextDouble(); @@ -701,13 +701,13 @@ private static double computePOfIRT(double p, int t) { } ``` -# 24. °Ù¶È-Ä¢¹½Õó +# 24. ???-????? -ÕâÌâÓûØËݻᳬʱ£¬ÐèÒªÓà DP¡£ +?????????????????? DP?? -dp[i][j] ±íʾµ½´ï (i,j) λÖò»»á´¥ÅöÄ¢¹½µÄ¸ÅÂÊ¡£¶ÔÓÚ N\*M ¾ØÕó£¬Èç¹û i == N || j == M£¬ÄÇô (i,j) Ö»ÄÜÓÐÒ»¸öÒÆ¶¯·½Ïò£»ÆäËüÇé¿öÏÂÄÜÓÐÁ½¸öÒÆ¶¯·½Ïò¡£ +dp[i][j] ??????? (i,j) ¦Ë?¨°?????????????????? N\*M ??????? i == N || j == M????? (i,j) ??????????????????????????????????????? -¿¼ÂÇÒÔϾØÕ󣬯äÖÐµÚ 3 ÐÐºÍµÚ 3 ÁÐÖ»ÄÜÍùÒ»¸ö·½ÏòÒÆ¶¯£¬¶øÆäËüλÖÿÉÒÔÓÐÁ½¸ö·½ÏòÒÆ¶¯¡£ +??????????????§Ö? 3 ?§Ü?? 3 ?????????????????????????¦Ë???????????????????? ```java diff --git a/notes/HTTP.md b/notes/HTTP.md index f17b79c6..b29f4a31 100644 --- a/notes/HTTP.md +++ b/notes/HTTP.md @@ -1,83 +1,83 @@ -* [»ù´¡¸ÅÄî](#»ù´¡¸ÅÄî) - * [Web»ù´¡](#web»ù´¡) +* [????????](#????????) + * [Web????](#web????) * [URL](#url) - * [ÇëÇóºÍÏìÓ¦±¨ÎÄ](#ÇëÇóºÍÏìÓ¦±¨ÎÄ) -* [HTTP ·½·¨](#http-·½·¨) - * [GET£º»ñÈ¡×ÊÔ´](#get»ñÈ¡×ÊÔ´) - * [POST£º´«ÊäʵÌåÖ÷Ìå](#post´«ÊäʵÌåÖ÷Ìå) - * [HEAD£º»ñÈ¡±¨ÎÄÊײ¿](#head»ñÈ¡±¨ÎÄÊײ¿) - * [PUT£ºÉÏ´«Îļþ](#putÉÏ´«Îļþ) - * [DELETE£ºÉ¾³ýÎļþ](#deleteɾ³ýÎļþ) - * [OPTIONS£º²éѯ֧³ÖµÄ·½·¨](#options²éѯ֧³ÖµÄ·½·¨) - * [RACE£º×·×Ù·¾¶](#race×·×Ù·¾¶) - * [CONNECT£ºÒªÇóÓÃËíµÀЭÒéÁ¬½Ó´úÀí](#connectÒªÇóÓÃËíµÀЭÒéÁ¬½Ó´úÀí) -* [HTTP ״̬Âë](#http-״̬Âë) - * [2XX ³É¹¦](#2xx-³É¹¦) - * [3XX ÖØ¶¨Ïò](#3xx-ÖØ¶¨Ïò) - * [4XX ¿Í»§¶Ë´íÎó](#4xx-¿Í»§¶Ë´íÎó) - * [5XX ·þÎñÆ÷´íÎó](#5xx-·þÎñÆ÷´íÎó) -* [HTTPÊײ¿](#httpÊײ¿) - * [ͨÓÃÊײ¿×Ö¶Î](#ͨÓÃÊײ¿×Ö¶Î) - * [ÇëÇóÊײ¿×Ö¶Î](#ÇëÇóÊײ¿×Ö¶Î) - * [ÏìÓ¦Êײ¿×Ö¶Î](#ÏìÓ¦Êײ¿×Ö¶Î) - * [ʵÌåÊײ¿×Ö¶Î](#ʵÌåÊײ¿×Ö¶Î) -* [¾ßÌåÓ¦ÓÃ](#¾ßÌåÓ¦ÓÃ) + * [????????????](#????????????) +* [HTTP ????](#http-????) + * [GET????????](#get????????) + * [POST?????????????](#post?????????????) + * [HEAD????????????](#head????????????) + * [PUT????????](#put???¦È????) + * [DELETE????????](#delete????????) + * [OPTIONS????????????](#options????????????) + * [RACE?????¡¤??](#race?????¡¤??) + * [CONNECT??????????§¿?????????](#connect??????????§ï?????????) +* [HTTP ????](#http-????) + * [2XX ???](#2xx-???) + * [3XX ?????](#3xx-?????) + * [4XX ????????](#4xx-????????) + * [5XX ??????????](#5xx-??????????) +* [HTTP???](#http???) + * [?????????](#?????????) + * [??????????](#??????????) + * [?????????](#?????????) + * [?????????](#?????????) +* [???????](#???????) * [Cookie](#cookie) - * [»º´æ](#»º´æ) - * [³Ö¾ÃÁ¬½Ó](#³Ö¾ÃÁ¬½Ó) - * [±àÂë](#±àÂë) - * [·Ö¿é´«Êä](#·Ö¿é´«Êä) - * [¶à²¿·Ö¶ÔÏ󼯺Ï](#¶à²¿·Ö¶ÔÏ󼯺Ï) - * [·¶Î§ÇëÇó](#·¶Î§ÇëÇó) - * [ÄÚÈÝЭÉÌ](#ÄÚÈÝЭÉÌ) - * [ÐéÄâÖ÷»ú](#ÐéÄâÖ÷»ú) - * [ͨÐÅÊý¾Ýת·¢](#ͨÐÅÊý¾Ýת·¢) + * [????](#????) + * [???????](#???????) + * [????](#????) + * [??ø‰??](#??ø‰??) + * [????????](#????????) + * [??¦¶????](#??¦Ö????) + * [????§¿??](#????§ï??) + * [????????](#????????) + * [??????????](#??????????) * [HTTPs](#https) - * [¼ÓÃÜ](#¼ÓÃÜ) - * [ÈÏÖ¤](#ÈÏÖ¤) - * [ÍêÕûÐÔ](#ÍêÕûÐÔ) + * [????](#????) + * [???](#???) + * [??????](#??????) -# »ù´¡¸ÅÄî +# ???????? -## Web»ù´¡ +## Web???? -HTTP£¨HyperText Transfer Protocol£¬³¬Îª±¾´«ÊäЭÒ飩¡£ +HTTP??HyperText Transfer Protocol???????????§¿?ï‚?? -WWW£¨Word Wide Web£©µÄÈýÖÖ¼¼Êõ£ºHTML¡¢HTTP¡¢URL¡£ +WWW??Word Wide Web?????????????HTML??HTTP??URL?? -RFC£¨Request for Comments£¬Õ÷ÇóÐÞÕýÒâ¼ûÊ飩£¬»¥ÁªÍøµÄÉè¼ÆÎĵµ¡£ +RFC??Request for Comments??????????????ï‚?????????????????? ## URL -URI£¨Uniform Resource Indentifier£¬Í³Ò»×ÊÔ´±êʶ·û£©£¬URL£¨Uniform Resource Locator£¬Í³Ò»×ÊÔ´¶¨Î»·û£©£¬URN£¨Uniform Resource Name£¬Í³Ò»×ÊÔ´Ãû³Æ£©£¬ÀýÈç urn:isbn:0-486-27557-4 ¡£URI °üº¬ URL ºÍ URN£¬Ä¿Ç° WEB Ö»ÓÐ URL ±È½ÏÁ÷ÐУ¬ËùÒÔ¼ûµ½µÄ»ù±¾¶¼ÊÇ URL¡£ +URI??Uniform Resource Indentifier????????????????URL??Uniform Resource Locator?????????¦Ë??????URN??Uniform Resource Name?????????????????? urn:isbn:0-486-27557-4 ??URI ???? URL ?? URN???? WEB ??? URL ??????§µ????????????????? URL?? -URL¸ñʽ£º +URL????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/4102b7d0-39b9-48d8-82ae-ac4addb7ebfb.jpg) -## ÇëÇóºÍÏìÓ¦±¨ÎÄ +## ???????????? -**ÇëÇó±¨ÎÄ** +**??????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/9dbb5fc2-936b-4c6d-b3a7-9617aae45080.jpg) -**ÏìÓ¦±¨ÎÄ** +**???????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c634b5ed-a14b-4302-b40e-3ee387dd3c8a.jpg) -# HTTP ·½·¨ +# HTTP ???? -¿Í»§¶Ë·¢Ë͵ÄÇëÇó±¨ÎĵÚÒ»ÐÐΪÇëÇóÐУ¬°üº¬ÁË·½·¨×ֶΡ£ +?????????????????????????§µ????????????¦±? -## GET£º»ñÈ¡×ÊÔ´ +## GET???????? -## POST£º´«ÊäʵÌåÖ÷Ìå +## POST????????????? -POST Ö÷ҪĿµÄ²»ÊÇ»ñÈ¡×ÊÔ´£¬¶øÊÇ´«ÊäʵÌåÖ÷ÌåÊý¾Ý¡£ +POST ??????????????????????????????????? -GET ºÍ POST µÄÇëÇó¶¼ÄÜʹÓöîÍâµÄ²ÎÊý£¬µ«ÊÇ GET µÄ²ÎÊýÊÇÒÔ²éѯ×Ö·û´®³öÏÖÔÚ URLÖУ¬¶ø POST µÄ²ÎÊý´æ´¢ÔÚʵÌåÖ÷Ì岿·Ö¡£ +GET ?? POST ???????????????????????? GET ?????????????????????? URL?§µ??? POST ??????›¥????????¿ù??? ``` GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1 @@ -88,312 +88,312 @@ Host: w3schools.com name1=value1&name2=value2 ``` -GET µÄ´«²Î·½Ê½Ïà±ÈÓÚ POST °²È«ÐԽϲÒòΪ GET ´«µÄ²ÎÊýÔÚ URL ÊǿɼûµÄ£¬¿ÉÄÜ»áй¶˽ÃÜÐÅÏ¢¡£²¢ÇÒ GET Ö»Ö§³Ö ASCII ×Ö·û£¬Èç¹û²ÎÊýΪÖÐÎÄÔò¿ÉÄÜ»á³öÏÖÂÒÂ룬¶ø POST Ö§³Ö±ê×¼×Ö·û¼¯¡£ +GET ????¦Ç??????? POST ?????????? GET ????????? URL ????????????§Û????????????? GET ???? ASCII ???????????????????????????????? POST ???????????? -## HEAD£º»ñÈ¡±¨ÎÄÊײ¿ +## HEAD???????????? -ºÍ GET ·½·¨Ò»Ñù£¬µ«ÊDz»·µ»Ø±¨ÎÄʵÌåÖ÷Ì岿·Ö¡£ +?? GET ???????????????????????????¿ù??? -Ö÷ÒªÓÃÓÚÈ·ÈÏ URL µÄÓÐЧÐÔÒÔ¼°×ÊÔ´¸üеÄÈÕÆÚʱ¼äµÈ¡£ +?????????? URL ????§¹?????????????????????? -## PUT£ºÉÏ´«Îļþ +## PUT???????? -ÓÉÓÚ×ÔÉí²»´øÑéÖ¤»úÖÆ£¬ÈκÎÈ˶¼¿ÉÒÔÉÏ´«Îļþ£¬Òò´Ë´æÔÚ°²È«ÐÔÎÊÌ⣬һ°ã WEB ÍøÕ¾²»Ê¹Óø÷½·¨¡£ +???????????????????¦Ê????????????????????????????????? WEB ????????¡Â????? -## DELETE£ºÉ¾³ýÎļþ +## DELETE???????? -Óë PUT ¹¦ÄÜÏà·´£¬²¢ÇÒͬÑù²»´øÑéÖ¤»úÖÆ¡£ +?? PUT ??????????????????????????? -## OPTIONS£º²éѯ֧³ÖµÄ·½·¨ +## OPTIONS???????????? -²éѯָ¶¨µÄ URL Äܹ»Ö§³ÖµÄ·½·¨¡£ +???????? URL ???????????? -»á·µ»Ø Allow: GET, POST, HEAD, OPTIONS ÕâÑùµÄÄÚÈÝ¡£ +???? Allow: GET, POST, HEAD, OPTIONS ??????????? -## RACE£º×·×Ù·¾¶ +## RACE?????¡¤?? -·þÎñÆ÷»á½«Í¨ÐÅ·¾¶·µ»Ø¸ø¿Í»§¶Ë¡£ +???????????¡¤????????????? -·¢ËÍÇëÇóʱ£¬ÔÚ Max-Forwards Êײ¿×Ö¶ÎÖÐÌîÈëÊýÖµ£¬Ã¿¾­¹ýÒ»¸ö·þÎñÆ÷¾Í»á¼õ 1£¬µ±ÊýֵΪ 0 ʱ¾ÍÍ£Ö¹´«Êä¡£ +????????????? Max-Forwards ??????????????????????????????????? 1???????? 0 ????????? -TRACE Ò»°ã²»»áʹÓ㬲¢ÇÒËüÈÝÒ×Êܵ½ XST ¹¥»÷£¨Cross-Site Tracing£¬¿çÕ¾×·×Ù£©£¬Òò´Ë¸ü²»»áȥʹÓÃËü¡£ +TRACE ?????????????????????? XST ??????Cross-Site Tracing??????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ca711108-e937-4d7d-99aa-61b325c61f1a.jpg) -## CONNECT£ºÒªÇóÓÃËíµÀЭÒéÁ¬½Ó´úÀí +## CONNECT??????????§¿????????? -ÓÃËíµÀЭÒé½øÐÐ TCP ͨÐÅ¡£ +?????§¿????? TCP ???? -Ö÷ҪʹÓà SSL£¨Secure Sokets Layer£¬°²È«Ì×½Ó×Ö£©ºÍ TLS£¨Transport Layer Security£¬´«Êä²ã°²È«£©Ð­Òé°ÑͨÐÅÄÚÈݼÓÃܺó¾­ÍøÂçËíµÀ´«Êä¡£ +?????? SSL??Secure Sokets Layer????????????? TLS??Transport Layer Security??????????§¿????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/d8355d56-aa2b-4452-8001-8475cc095af1.jpg) -# HTTP ״̬Âë +# HTTP ???? -·þÎñÆ÷·µ»ØµÄÏìÓ¦±¨ÎÄÖеÚÒ»ÐÐΪ״̬ÐУ¬°üº¬ÁË״̬ÂëÒÔ¼°Ô­Òò¶ÌÓÀ´¸æÖª¿Í»§¶ËÇëÇóµÄ½á¹û¡£ +???????????????????§Ö????????§µ??????????????????????????????????????? -| ״̬Âë | Àà±ð | Ô­Òò¶ÌÓï | +| ???? | ??? | ?????? | | --- | --- | --- | -| 1XX | Informational£¨ÐÅÏ¢ÐÔ״̬Â룩 | ½ÓÊÕµÄÇëÇóÕýÔÚ´¦Àí | -| 2XX | Success£¨³É¹¦×´Ì¬Â룩 | ÇëÇóÕý³£´¦ÀíÍê±Ï | -| 3XX | Redirection£¨Öض¨Ïò״̬Â룩 | ÐèÒª½øÐи½¼Ó²Ù×÷ÒÔÍê³ÉÇëÇó | -| 4XX | Client Error£¨¿Í»§¶Ë´íÎó״̬Â룩 | ·þÎñÆ÷ÎÞ·¨´¦ÀíÇëÇó | -| 5XX | Server Error£¨·þÎñÆ÷´íÎó״̬Â룩 | ·þÎñÆ÷´¦ÀíÇëÇó³ö´í | +| 1XX | Informational??????????? | ???????????????? | +| 2XX | Success????????? | ??????????????? | +| 3XX | Redirection??????????? | ??????§Ú??????????????? | +| 4XX | Client Error?????????????? | ????????????????? | +| 5XX | Server Error???????????????? | ????????????????? | -## 2XX ³É¹¦ +## 2XX ??? **200 OK** -**204 No Content**£ºÇëÇóÒѾ­³É¹¦´¦Àí£¬µ«ÊÇ·µ»ØµÄÏìÓ¦±¨ÎIJ»°üº¬ÊµÌåµÄÖ÷Ì岿·Ö¡£Ò»°ãÔÚÖ»ÐèÒª´Ó¿Í»§¶ËÍù·þÎñÆ÷·¢ËÍÐÅÏ¢£¬¶ø²»ÐèÒª·µ»ØÊý¾ÝʱʹÓᣠ+**204 No Content**???????????????????????????????????????????¿ù?????????????????????????????????????????????????????¨¢? **206 Partial Content** -## 3XX ÖØ¶¨Ïò +## 3XX ????? -**301 Moved Permanently**£ºÓÀ¾ÃÐÔÖØ¶¨Ïò +**301 Moved Permanently**????????????? -**302 Found**£ºÁÙʱÐÔÖØ¶¨Ïò +**302 Found**???????????? **303 See Other** -×¢£ºËäÈ» HTTP ЭÒ鹿¶¨ 301¡¢302 ״̬ÏÂÖØ¶¨Ïòʱ²»ÔÊÐí°Ñ POST ·½·¨¸Ä³É GET ·½·¨£¬µ«ÊÇ´ó¶àÊýä¯ÀÀÆ÷¶¼»á°Ñ 301¡¢302 ºÍ 303 ״̬ϵÄÖØ¶¨Ïò°Ñ POST ·½·¨¸Ä³É GET ·½·¨¡£ +?????? HTTP §¿??ÕÇ 301??302 ????????????????? POST ??????? GET ???????????????????????? 301??302 ?? 303 ??????????? POST ??????? GET ?????? -**304 Not Modified**£ºÈç¹ûÇëÇó±¨ÎÄÊײ¿°üº¬Ò»Ð©Ìõ¼þ£¬ÀýÈ磺If-Match£¬If-ModifiedSince£¬If-None-Match£¬If-Range£¬If-Unmodified-Since£¬µ«ÊDz»Âú×ãÌõ¼þ£¬Ôò·þÎñÆ÷»á·µ»Ø 304 ״̬Âë¡£ +**304 Not Modified**???????????????????§»?????????»ÇIf-Match??If-ModifiedSince??If-None-Match??If-Range??If-Unmodified-Since???????????????????????????? 304 ???? -**307 Temporary Redirect**£ºÁÙÊ±ÖØ¶¨Ïò£¬Óë 302 µÄº¬ÒåÀàËÆ£¬µ«ÊÇ 307 ÒªÇóä¯ÀÀÆ÷²»»á°ÑÖØ¶¨ÏòÇëÇóµÄ POST ·½·¨¸Ä³É GET ·½·¨¡£ +**307 Temporary Redirect**???????????? 302 ?????????????? 307 ??????????????????????? POST ??????? GET ?????? -## 4XX ¿Í»§¶Ë´íÎó +## 4XX ???????? -**400 Bad Request**£ºÇëÇó±¨ÎÄÖдæÔÚÓï·¨´íÎó +**400 Bad Request**?????????§Õ????????? -**401 Unauthorized**£º¸Ã״̬Âë±íʾ·¢Ë͵ÄÇëÇóÐèÒªÓÐͨ¹ý HTTP ÈÏÖ¤£¨BASIC ÈÏÖ¤¡¢DIGEST ÈÏÖ¤£©µÄÈÏÖ¤ÐÅÏ¢¡£Èç¹û֮ǰÒѽøÐйýÒ»´ÎÇëÇó£¬Ôò±íʾÓû§ÈÏ֤ʧ°Ü¡£ +**401 Unauthorized**??????????????????????????? HTTP ?????BASIC ?????DIGEST ????????????????????????§Û?????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/b1b4cf7d-c54a-4ff1-9741-cd2eea331123.jpg) -**403 Forbidden**£ºÇëÇ󱻾ܾø£¬·þÎñÆ÷¶ËûÓбØÒª¸ø³ö¾Ü¾øµÄÏêϸÀíÓÉ¡£ +**403 Forbidden**????????????????????§Ò?????????????????¨À? **404 Not Found** -## 5XX ·þÎñÆ÷´íÎó +## 5XX ?????????? -**500 Internal Server Error**£º·þÎñÆ÷ÕýÔÚÖ´ÐÐÇëÇóʱ·¢Éú´íÎó +**500 Internal Server Error**???????????????????????????? -**503 Service Unavilable**£º¸Ã״̬Âë±íÃ÷·þÎñÆ÷ÔÝʱ´¦ÓÚ³¬¸ºÔØ»òÕýÔÚ½øÐÐÍ£»úά»¤£¬ÏÖÔÚÎÞ·¨´¦ÀíÇëÇó¡£ +**503 Service Unavilable**???????????????????????????????????????????????????????????? -# HTTPÊײ¿ +# HTTP??? -HTTP ±¨Îİüº¬ÁËÊײ¿ºÍÖ÷ÌåÁ½²¿·Ö¡£ÓÐ 4 ÖÖÀàÐ͵ÄÊײ¿×ֶΣºÍ¨ÓÃÊײ¿×ֶΡ¢ÇëÇóÊײ¿×ֶΡ¢ÏìÓ¦Êײ¿×ֶκÍʵÌåÊײ¿×ֶΡ£¸÷ÖÖÊײ¿×ֶμ°Æäº¬ÒåÈçÏ£¨²»ÐèҪȫ¼Ç£¬½ö¹©²éÔÄ£©£º +HTTP ??????????????????????????? 4 ????????????¦²?????????¦±??????????¦±?????????¦Ê?????????¦±??????????¦Ì??¾©??????????????????????????? -## ͨÓÃÊײ¿×Ö¶Î +## ????????? -| Êײ¿×Ö¶ÎÃû | ˵Ã÷ | +| ???????? | ??? | | -- | -- | -| Cache-Control | ¿ØÖÆ»º´æµÄÐÐΪ | -| Connection | ÖðÌøÊײ¿¡¢ Á¬½ÓµÄ¹ÜÀí | -| Date | ´´½¨±¨ÎĵÄÈÕÆÚʱ¼ä | -| Pragma | ±¨ÎÄÖ¸Áî | -| Trailer | ±¨ÎÄÄ©¶ËµÄÊײ¿Ò»ÀÀ | -| Transfer-Encoding | Ö¸¶¨±¨ÎÄÖ÷ÌåµÄ´«Êä±àÂ뷽ʽ | -| Upgrade | Éý¼¶ÎªÆäËûЭÒé | -| Via | ´úÀí·þÎñÆ÷µÄÏà¹ØÐÅÏ¢ | -| Warning | ´íÎó֪ͨ | +| Cache-Control | ??????????? | +| Connection | ????????? ???????? | +| Date | ???????????????? | +| Pragma | ??????? | +| Trailer | ?????????????? | +| Transfer-Encoding | ??????????????????? | +| Upgrade | ?????????§¿?? | +| Via | ????????????????? | +| Warning | ?????? | -## ÇëÇóÊײ¿×Ö¶Î +## ?????????? -| Êײ¿×Ö¶ÎÃû | ˵Ã÷ | +| ???????? | ??? | | -- | -- | -| Accept | Óû§´úÀí¿É´¦ÀíµÄýÌåÀàÐÍ | -| Accept-Charset | ÓÅÏȵÄ×Ö·û¼¯ | -| Accept-Encoding | ÓÅÏȵÄÄÚÈݱàÂë | -| Accept-Language | ÓÅÏȵÄÓïÑÔ£¨×ÔÈ»ÓïÑÔ£© | -| Authorization | WebÈÏÖ¤ÐÅÏ¢ | -| Expect | ÆÚ´ý·þÎñÆ÷µÄÌØ¶¨ÐÐΪ | -| From | Óû§µÄµç×ÓÓÊÏ䵨ַ | -| Host | ÇëÇó×ÊÔ´ËùÔÚ·þÎñÆ÷ | -| If-Match | ±È½ÏʵÌå±ê¼Ç£¨ETag£© | -| If-Modified-Since | ±È½Ï×ÊÔ´µÄ¸üÐÂʱ¼ä | -| If-None-Match | ±È½ÏʵÌå±ê¼Ç£¨Óë If-Match Ïà·´£© | -| If-Range | ×ÊԴδ¸üÐÂʱ·¢ËÍʵÌå Byte µÄ·¶Î§ÇëÇó | -| If-Unmodified-Since | ±È½Ï×ÊÔ´µÄ¸üÐÂʱ¼ä£¨ÓëIf-Modified-SinceÏà·´£© | -| Max-Forwards | ×î´ó´«ÊäÖðÌøÊý | -| Proxy-Authorization | ´úÀí·þÎñÆ÷ÒªÇó¿Í»§¶ËµÄÈÏÖ¤ÐÅÏ¢ | -| Range | ʵÌåµÄ×Ö½Ú·¶Î§ÇëÇó | -| Referer | ¶ÔÇëÇóÖÐ URI µÄԭʼ»ñÈ¡·½ | -| TE | ´«Êä±àÂëµÄÓÅÏȼ¶ | -| User-Agent | HTTP ¿Í»§¶Ë³ÌÐòµÄÐÅÏ¢ | +| Accept | ??????????????????? | +| Accept-Charset | ?????????? | +| Accept-Encoding | ???????????? | +| Accept-Language | ?????????????????? | +| Authorization | Web?????? | +| Expect | ????????????????? | +| From | ?????????????? | +| Host | ???????????????? | +| If-Match | ?????????ETag?? | +| If-Modified-Since | ?????????????? | +| If-None-Match | ??????????? If-Match ???? | +| If-Range | ???¦Ä???????????? Byte ???¦¶???? | +| If-Unmodified-Since | ????????????????If-Modified-Since???? | +| Max-Forwards | ??????????? | +| Proxy-Authorization | ??????????????????????? | +| Range | ????????¦¶???? | +| Referer | ???????? URI ????????? | +| TE | ????????????? | +| User-Agent | HTTP ???????????? | -## ÏìÓ¦Êײ¿×Ö¶Î +## ????????? -| Êײ¿×Ö¶ÎÃû | ˵Ã÷ | +| ???????? | ??? | | -- | -- | -| Accept-Ranges | ÊÇ·ñ½ÓÊÜ×Ö½Ú·¶Î§ÇëÇó | -| Age | ÍÆËã×ÊÔ´´´½¨¾­¹ýʱ¼ä | -| ETag | ×ÊÔ´µÄÆ¥ÅäÐÅÏ¢ | -| Location | Áî¿Í»§¶ËÖØ¶¨ÏòÖÁÖ¸¶¨URI | -| Proxy-Authenticate | ´úÀí·þÎñÆ÷¶Ô¿Í»§¶ËµÄÈÏÖ¤ÐÅÏ¢ | -| Retry-After | ¶ÔÔٴη¢ÆðÇëÇóµÄʱ»úÒªÇó | -| Server | HTTP·þÎñÆ÷µÄ°²×°ÐÅÏ¢ | -| Vary | ´úÀí·þÎñÆ÷»º´æµÄ¹ÜÀíÐÅÏ¢ | -| WWW-Authenticate | ·þÎñÆ÷¶Ô¿Í»§¶ËµÄÈÏÖ¤ÐÅÏ¢ | +| Accept-Ranges | ??????????¦¶???? | +| Age | ?????????????????? | +| ETag | ??????????? | +| Location | ????????????????URI | +| Proxy-Authenticate | ?????????????????????? | +| Retry-After | ????¦Ç?????????????? | +| Server | HTTP????????????? | +| Vary | ???????????????????? | +| WWW-Authenticate | ??????????????????? | -## ʵÌåÊײ¿×Ö¶Î +## ????????? -| Êײ¿×Ö¶ÎÃû | ˵Ã÷ | +| ???????? | ??? | | -- | -- | -| Allow | ×ÊÔ´¿ÉÖ§³ÖµÄHTTP·½·¨ | -| Content-Encoding | ʵÌåÖ÷ÌåÊÊÓõıàÂ뷽ʽ | -| Content-Language | ʵÌåÖ÷ÌåµÄ×ÔÈ»ÓïÑÔ | -| Content-Length | ʵÌåÖ÷ÌåµÄ´óС£¨µ¥Î»£º ×Ö½Ú£© | -| Content-Location | Ìæ´ú¶ÔÓ¦×ÊÔ´µÄURI | -| Content-MD5 | ʵÌåÖ÷ÌåµÄ±¨ÎÄÕªÒª | -| Content-Range | ʵÌåÖ÷ÌåµÄλÖ÷¶Î§ | -| Content-Type | ʵÌåÖ÷ÌåµÄýÌåÀàÐÍ | -| Expires | ʵÌåÖ÷Ìå¹ýÆÚµÄÈÕÆÚʱ¼ä | -| Last-Modified | ×ÊÔ´µÄ×îºóÐÞ¸ÄÈÕÆÚʱ¼ä | +| Allow | ?????????HTTP???? | +| Content-Encoding | ???????????????? | +| Content-Language | ??????????????? | +| Content-Length | ?????????§³????¦Ë?? ???? | +| Content-Location | ???????????URI | +| Content-MD5 | ????????????? | +| Content-Range | ????????¦Ë?¡Â?¦¶ | +| Content-Type | ??????????????? | +| Expires | ?????????????????? | +| Last-Modified | ?????????????????? | -# ¾ßÌåÓ¦Óà +# ??????? ## Cookie -HTTP ЭÒéÊÇÎÞ״̬µÄ£¬Ö÷ÒªÊÇΪÁËÈà HTTP ЭÒ龡¿ÉÄܼòµ¥£¬Ê¹µÃËüÄܹ»´¦Àí´óÁ¿ÊÂÎñ¡£HTTP/1.1 ÒýÈë Cookie À´±£´æ×´Ì¬ÐÅÏ¢¡£ +HTTP §¿????????????????????? HTTP §¿?ý—?????????????????????????HTTP/1.1 ???? Cookie ????????????? -·þÎñÆ÷»á·¢Ë͵ÄÏìÓ¦±¨Îİüº¬ Set-Cookie ×ֶΣ¬¿Í»§¶ËµÃµ½¸ÃÏàÓ¦ºó°Ñ Cookie ÄÚÈݱ£´æµ½ä¯ÀÀÆ÷ÖС£Ï´ÎÔÙ·¢ËÍÇëÇóʱ£¬´Óä¯ÀÀÆ÷ÖжÁ³ö Cookie Öµ£¬ÔÚÇëÇó±¨ÎÄÖаüº¬ Cookie ×ֶΣ¬ÕâÑù·þÎñÆ÷¾ÍÖªµÀ¿Í»§¶ËµÄ״̬ÐÅÏ¢ÁË¡£Cookie ״̬ÐÅÏ¢±£´æÔÚ¿Í»§¶Ëä¯ÀÀÆ÷ÖУ¬¶ø²»ÊÇ·þÎñÆ÷ÉÏ¡£ +????????????????????? Set-Cookie ??¦²???????????????? Cookie ??????›Ô??????§³????????????????????????§Ø??? Cookie ????????????§Ñ??? Cookie ??¦²??????????????????????????????Cookie ?????????????????????§µ??????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ff17c103-750a-4bb8-9afa-576327023af9.png) -Set-Cookie ×Ö¶ÎÓÐÒÔÏÂÊôÐÔ£º +Set-Cookie ?????????????? -| ÊôÐÔ | ˵Ã÷ | +| ???? | ??? | | -- | -- | -| NAME=VALUE | ¸³Óè Cookie µÄÃû³ÆºÍÆäÖµ£¨±ØÐèÏ | -| expires=DATE | Cookie µÄÓÐЧÆÚ£¨Èô²»Ã÷È·Ö¸¶¨ÔòĬÈÏΪä¯ÀÀÆ÷¹Ø±ÕǰΪֹ£© | -| path=PATH | ½«·þÎñÆ÷ÉϵÄÎļþĿ¼×÷Ϊ Cookie µÄÊÊÓöÔÏó£¨Èô²»Ö¸¶¨ÔòĬÈÏΪÎĵµËùÔÚµÄÎļþĿ¼£© | -| domain=ÓòÃû | ×÷Ϊ Cookie ÊÊÓöÔÏóµÄÓòÃû£¨Èô²»Ö¸¶¨ÔòĬÈÏΪ´´½¨ Cookie µÄ·þÎñÆ÷µÄÓòÃû£© | -| Secure | ½öÔÚ HTTPS °²È«Í¨ÐÅʱ²Å»á·¢ËÍ Cookie | -| HttpOnly | ¼ÓÒÔÏÞÖÆ£¬Ê¹ Cookie ²»Äܱ» JavaScript ½Å±¾·ÃÎÊ | +| NAME=VALUE | ???? Cookie ?????????????????? | +| expires=DATE | Cookie ????§¹???????????????????????????????? | +| path=PATH | ??????????????????? Cookie ????????????????????????????????????? | +| domain=???? | ??? Cookie ??????????????????????????????? Cookie ??????????????? | +| Secure | ???? HTTPS ???????????? Cookie | +| HttpOnly | ?????????? Cookie ????? JavaScript ??????? | -**Session ºÍ Cookie Çø±ð** +**Session ?? Cookie ????** -Session ÊÇ·þÎñÆ÷ÓÃÀ´¸ú×ÙÓû§µÄÒ»ÖÖÊֶΣ¬Ã¿¸ö Session ¶¼ÓÐÒ»¸öΨһ±êʶ£ºSession ID¡£µ±·þÎñÆ÷´´½¨ÁËÒ»¸ö Session ʱ£¬¸ø¿Í»§¶Ë·¢Ë͵ÄÏìÓ¦±¨ÎľͰüº¬ÁË Set-Cookie ×ֶΣ¬ÆäÖÐÓÐÒ»¸öÃûΪ sid µÄ¼üÖµ¶Ô£¬Õâ¸ö¼üÖµ¶Ô¾ÍÊÇ Session ID¡£¿Í»§¶ËÊÕµ½ºó¾Í°Ñ Cookie ±£´æÔÚä¯ÀÀÆ÷ÖУ¬²¢ÇÒÖ®ºó·¢Ë͵ÄÇëÇó±¨Îͼ°üº¬ Session ID¡£HTTP ¾ÍÊÇ Session ºÍ Cookie ÕâÁ½ÖÖ·½Ê½Ò»ÆðºÏ×÷À´ÊµÏÖ¸ú×ÙÓû§×´Ì¬µÄ£¬¶ø Session ÓÃÓÚ·þÎñÆ÷¶Ë£¬Cookie ÓÃÓÚ¿Í»§¶Ë¡£ +Session ?????????????????????????¦²???? Session ???????¦·??????Session ID??????????????????? Session ??????????????????????????? Set-Cookie ??¦²????????????? sid ?????????????????? Session ID?????????????? Cookie ????????????§µ?????????????????????? Session ID??HTTP ???? Session ?? Cookie ???????????????????????????????? Session ????????????Cookie ????????? -**ä¯ÀÀÆ÷½ûÓà Cookie µÄÇé¿ö** +**????????? Cookie ?????** -»áʹÓà URL ÖØÐ´¼¼Êõ£¬ÔÚ URL ºóÃæ¼ÓÉÏ sid=xxx ¡£ +????? URL ??§Õ???????? URL ??????? sid=xxx ?? -**ʹÓà Cookie ʵÏÖÓû§ÃûºÍÃÜÂëµÄ×Ô¶¯Ìîд** +**??? Cookie ????????????????????§Õ** -ÍøÕ¾½Å±¾»á×Ô¶¯´Ó Cookie ÖжÁÈ¡Óû§ÃûºÍÃÜÂ룬´Ó¶øÊµÏÖ×Ô¶¯Ìîд¡£ +????????????? Cookie ?§Ø????????????????????????§Õ?? -## »º´æ +## ???? -ÓÐÁ½ÖÖ»º´æ·½·¨£ºÈôúÀí·þÎñÆ÷½øÐлº´æºÍÈÿͻ§¶Ëä¯ÀÀÆ÷½øÐлº´æ¡£ +????????œ]?????????????????§Ý??????????????????§Ý??µµ -Cache-Control ÓÃÓÚ¿ØÖÆ»º´æµÄÐÐΪ¡£ +Cache-Control ???????????????? -Cache-Control: no-cache ÓÐÁ½ÖÖº¬Ò壬Èç¹ûÊǿͻ§¶ËÏò»º´æ·þÎñÆ÷·¢Ë͵ÄÇëÇó±¨ÎÄÖк¬ÓиÃÖ¸Á±íʾ¿Í»§¶Ë²»ÏëÒª»º´æµÄ×ÊÔ´£»Èç¹ûÊÇÔ´·þÎñÆ÷Ïò»º´æ·þÎñÆ÷·¢Ë͵ÄÏìÓ¦±¨ÎÄÖк¬ÓиÃÖ¸Á±íʾ»º´æ·þÎñÆ÷²»ÄܶÔ×ÊÔ´½øÐлº´æ¡£ +Cache-Control: no-cache ????????ÈÉ?????????????????????????????§Ü??§Ú???????????????????????????????????????????????????????????§Ü??§Ú???????????????????????????§Ý??µµ -Expires ×ֶοÉÒÔÓÃÓÚ¸æÖª»º´æ·þÎñÆ÷¸Ã×ÊԴʲôʱºò»á¹ýÆÚ¡£µ±Êײ¿×Ö¶Î Cache-Control ÓÐÖ¸¶¨ max-age Ö¸Áîʱ£¬±ÈÆðÊײ¿×Ö¶Î Expires£¬»áÓÅÏÈ´¦Àí max-age Ö¸Áî¡£ +Expires ??¦Ï????????????????????????????????????????? Cache-Control ????? max-age ???????????????? Expires??????????? max-age ??þŸ -## ³Ö¾ÃÁ¬½Ó +## ??????? -µ±ä¯ÀÀÆ÷·ÃÎÊÒ»¸ö°üº¬¶àÕÅͼƬµÄ HTML Ò³ÃæÊ±£¬³ýÁËÇëÇó·ÃÎÊ HTML Ò³Ãæ×ÊÔ´£¬»¹»áÇëÇóͼƬ×ÊÔ´£¬Èç¹ûÿ½øÐÐÒ»´Î HTTP ͨОÍÒª¶Ï¿ªÒ»´Î TCP Á¬½Ó£¬Á¬½Ó½¨Á¢ºÍ¶Ï¿ªµÄ¿ªÏú»áºÜ´ó¡£**³Ö¾ÃÁ¬½Ó** Ö»ÐèÒª½øÐÐÒ»´Î TCP Á¬½Ó¾ÍÄܽøÐжà´Î HTTP ͨÐÅ¡£HTTP/1.1¿ªÊ¼£¬ËùÓеÄÁ¬½ÓĬÈ϶¼Êdz־ÃÁ¬½Ó¡£ +?????????????????????????? HTML ????????????????? HTML ?????????????????????????????????? HTTP ??????????? TCP ?????????????????????????**???????** ??????????? TCP ?????????§Ø?? HTTP ????HTTP/1.1????????§Ö?????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c73a0b78-5f46-4d2d-a009-dab2a999b5d8.jpg) -³Ö¾ÃÁ¬½ÓÐèҪʹÓà Connection Êײ¿×ֶνøÐйÜÀí¡£HTTP/1.1 ¿ªÊ¼HTTP ĬÈÏÊdz־û¯Á¬½ÓµÄ£¬Èç¹ûÒª¶Ï¿ª TCP Á¬½Ó£¬ÐèÒªÓɿͻ§¶Ë»òÕß·þÎñÆ÷¶ËÌá³ö¶Ï¿ª£¬Ê¹Óà Connection: close £»¶øÔÚHTTP/1.1֮ǰĬÈÏÊǷdz־û¯Á¬½ÓµÄ£¬Èç¹ûҪά³Ö³ÖÐøÁ¬½Ó£¬ÐèҪʹÓà Keep-Alive¡£ +????????????? Connection ?????¦Í??§Û???HTTP/1.1 ???HTTP ????????????????????? TCP ??????????????????????????????????? Connection: close ??????HTTP/1.1?????????????????????????????????????? Keep-Alive?? -¹ÜÏß»¯·½Ê½¿ÉÒÔͬʱ·¢ËͶà¸öÇëÇóºÍÏìÓ¦£¬¶ø²»ÐèÒª·¢ËÍÒ»¸öÇëÇóÈ»ºóµÈ´ýÏìÓ¦Ö®ºóÔÙ·¢ÏÂÒ»¸öÇëÇó¡£ +??????????????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/6943e2af-5a70-4004-8bee-b33d60f39da3.jpg) -## ±àÂë +## ???? -±àÂ루Encoding£©Ö÷ÒªÊÇΪÁ˶ÔʵÌå½øÐÐѹËõ¡£³£ÓõıàÂëÓУºgzip¡¢compress¡¢deflate¡¢identity£¬ÆäÖÐ identity ±íʾ²»Ö´ÐÐѹËõµÄ±àÂë¸ñʽ¡£ +????Encoding???????????????????????????????§µ?gzip??compress??deflate??identity?????? identity ???????????????????? -## ·Ö¿é´«Êä +## ??ø‰?? -·Ö¿é´«Ê䣨Chunked Transfer Coding£©¿ÉÒÔ°ÑÊý¾Ý·Ö¸î³É¶à¿é£¬ÈÃä¯ÀÀÆ÷Öð²½ÏÔÊ¾Ò³Ãæ¡£ +??ø‰??Chunked Transfer Coding???????????????ï…??????????????µµ -## ¶à²¿·Ö¶ÔÏó¼¯ºÏ +## ???????? -Ò»·Ý±¨ÎÄÖ÷ÌåÄڿɺ¬ÓжàÀàÐ͵ÄʵÌåͬʱ·¢ËÍ£¬Ã¿¸ö²¿·ÖÖ®¼äÓà boundary ×ֶζ¨ÒåµÄ·Ö¸ô·û½øÐзָô£»Ã¿¸ö²¿·Ö¶¼¿ÉÒÔÓÐÊײ¿×ֶΡ£ +???????????????§Ø???????????????????????????? boundary ??¦Æ???????????§Ù???????????????????????¦±? -ÀýÈ磬ÉÏ´«¶à¸ö±íµ¥Ê±¿ÉÒÔʹÓÃÈçÏ·½Ê½£º +???íà???????????????????¡¤???? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/decb0936-e83c-4a55-840a-fe8aa101ac61.png) -## ·¶Î§ÇëÇó +## ??¦¶???? -Èç¹ûÍøÂç³öÏÖÖжϣ¬·þÎñÆ÷Ö»·¢ËÍÁËÒ»²¿·ÖÊý¾Ý£¬·¶Î§ÇëÇóʹµÃ¿Í»§¶ËÄܹ»Ö»ÇëÇóδ·¢Ë͵ÄÄDz¿·ÖÊý¾Ý£¬´Ó¶ø±ÜÃâ·þÎñÆ÷¶ËÖØÐ·¢ËÍËùÓÐÊý¾Ý¡£ +???????????§Ø???????????????????????????¦¶???????????????????¦Ä????????????????????????????????¡¤???????????? -ÔÚÇëÇó±¨ÎÄÊײ¿ÖÐÌí¼Ó Range ×ֶΣ¬È»ºóÖ¸¶¨ÇëÇóµÄ·¶Î§£¬ÀýÈç Range : bytes = 5001-10000¡£ÇëÇó³É¹¦µÄ»°·þÎñÆ÷·¢ËÍ 206 Partial Content ״̬¡£ +???????????????? Range ??¦²?????????????¦¶?????? Range : bytes = 5001-10000????????????????????? 206 Partial Content ???? -## ÄÚÈÝЭÉÌ +## ????§¿?? -ͨ¹ýÄÚÈÝЭÉÌ·µ»Ø×îºÏÊʵÄÄÚÈÝ£¬ÀýÈç¸ù¾Ýä¯ÀÀÆ÷µÄĬÈÏÓïÑÔÑ¡Ôñ·µ»ØÖÐÎĽçÃæ»¹ÊÇÓ¢ÎĽçÃæ¡£ +???????§¿???????????????????????????????????????????????äï???????µµ -Éæ¼°ÒÔÏÂÊײ¿×ֶΣºAccept¡¢Accept-Charset¡¢Accept-Encoding¡¢Accept-Language¡¢Content-Language¡£ +?�p?????????¦²?Accept??Accept-Charset??Accept-Encoding??Accept-Language??Content-Language?? -## ÐéÄâÖ÷»ú +## ???????? -ʹÓÃÐéÄâÖ÷»ú¼¼Êõ£¬Ê¹µÃһ̨·þÎñÆ÷ÓµÓжà¸öÓòÃû£¬²¢ÇÒÔÚÂß¼­ÉÏ¿ÉÒÔ¿´³É¶à¸ö·þÎñÆ÷¡£ +??????????????????????????????§Ø??????????????????????????????????? -## ͨÐÅÊý¾Ýת·¢ +## ?????????? -**´úÀí** +**????** -´úÀí·þÎñÆ÷½ÓÊܿͻ§¶ËµÄÇëÇ󣬲¢ÇÒת·¢¸øÆäËü·þÎñÆ÷¡£´úÀí·þÎñÆ÷Ò»°ãÊÇ͸Ã÷µÄ£¬²»»á¸Ä±ä URL¡£ +???????????????????????????????????????????????????????????????????? URL?? -ʹÓôúÀíµÄÖ÷ҪĿµÄÊÇ£º»º´æ¡¢ÍøÂç·ÃÎÊ¿ØÖÆÒÔ¼°¼Ç¼·ÃÎÊÈÕÖ¾¡£ +???????????????????èå????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c07035c3-a9ba-4508-8e3c-d8ae4c6ee9ee.jpg) -**Íø¹Ø** +**????** -Óë´úÀí·þÎñÆ÷²»Í¬µÄÊÇ£¬Íø¹Ø·þÎñÆ÷»á½« HTTP ת»¯ÎªÆäËüЭÒé½øÐÐͨÐÅ£¬´Ó¶øÆäËü·Ç HTTP ·þÎñÆ÷µÄ·þÎñ¡£ +????????????????????????????? HTTP ????????§¿?????????????????? HTTP ??????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/81375888-6be1-476f-9521-42eea3e3154f.jpg) -**ËíµÀ** +**???** -ʹÓà SSL µÈ¼ÓÃÜÊֶΣ¬Îª¿Í»§¶ËºÍ·þÎñÆ÷Ö®¼ä½¨Á¢Ò»Ìõ°²È«µÄͨÐÅÏß·¡£ +??? SSL ???????¦²???????????????�Ü???????????????¡¤?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/64b95403-d976-421a-8b45-bac89c0b5185.jpg) # HTTPs -HTTP ÓÐÒÔϰ²È«ÐÔÎÊÌ⣺ +HTTP ?????¡ã???????? -1. ͨÐÅʹÓÃÃ÷ÎÄ£¬ÄÚÈÝ¿ÉÄܻᱻÇÔÌý£» -2. ²»Ñé֤ͨÐÅ·½µÄÉí·Ý£¬Òò´ËÓпÉÄÜÔâÓöαװ£» -3. ÎÞ·¨Ö¤Ã÷±¨ÎĵÄÍêÕûÐÔ£¬ËùÒÔÓпÉÄÜÒÑÔâ´Û¸Ä¡£ +1. ????????????????????????? +2. ???????????????????§á???????¦Á??? +3. ???????????????????????§á?????????? -HTTPs ²¢²»ÊÇÐÂЭÒ飬¶øÊÇ HTTP ÏÈºÍ SSL£¨Secure Socket Layer£©Í¨ÐÅ£¬ÔÙÓÉ SSL ºÍ TCP ͨÐÅ¡£Í¨¹ýʹÓà SSL£¬HTTPs ÌṩÁ˼ÓÃÜ¡¢ÈÏÖ¤ºÍÍêÕûÐÔ±£»¤¡£ +HTTPs ????????§¿?ï…???? HTTP ??? SSL??Secure Socket Layer?????????? SSL ?? TCP ?????????? SSL??HTTPs ???????????????????????? -## ¼ÓÃÜ +## ???? -ÓÐÁ½ÖÖ¼ÓÃÜ·½Ê½£º¶Ô³ÆÃÜÔ¿¼ÓÃܺ͹«¿ªÃÜÔ¿¼ÓÃÜ¡£¶Ô³ÆÃÜÔ¿¼ÓÃܵļÓÃܺͽâÃÜʹÓÃͬһÃÜÔ¿£¬¶ø¹«¿ªÃÜÔ¿¼ÓÃÜʹÓÃÒ»¶ÔÃÜÔ¿ÓÃÓÚ¼ÓÃܺͽâÃÜ£¬·Ö±ðΪ¹«¿ªÃÜÔ¿ºÍ˽ÓÐÃÜÔ¿¡£¹«¿ªÃÜÔ¿ËùÓÐÈ˶¼¿ÉÒÔ»ñµÃ£¬Í¨ÐÅ·¢ËÍ·½»ñµÃ½ÓÊÕ·½µÄ¹«¿ªÃÜÔ¿Ö®ºó£¬¾Í¿ÉÒÔʹÓù«¿ªÃÜÔ¿½øÐмÓÃÜ£¬½ÓÊÕ·½ÊÕµ½Í¨ÐÅÄÚÈݺóʹÓÃ˽ÓÐÃÜÔ¿½âÃÜ¡£ +??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????¨´?????????§Þ?????????????????????????????????? -¶Ô³ÆÃÜÔ¿¼ÓÃܵÄȱµã£ºÎÞ·¨°²È«´«ÊäÃÜÔ¿£»¹«¿ªÃÜÔ¿¼ÓÃܵÄȱµã£ºÏà¶ÔÀ´Ëµ¸üºÄʱ¡£ +????????????????????????????????????????????????????????? -HTTPs ²ÉÓà **»ìºÏµÄ¼ÓÃÜ»úÖÆ**£¬Ê¹Óù«¿ªÃÜÔ¿¼ÓÃÜÓÃÓÚ´«Êä¶Ô³ÆÃÜÔ¿£¬Ö®ºóʹÓöԳÆÃÜÔ¿¼ÓÃܽøÐÐͨÐÅ¡££¨ÏÂͼÖУ¬¹²ÏíÃÜÔ¿¼´¶Ô³ÆÃÜÔ¿£© +HTTPs ???? **??????????**????¨´????????????????????????????????????????????????????§µ?????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/110b1a9b-87cd-45c3-a21d-824623715b33.jpg) -## ÈÏÖ¤ +## ??? -ͨ¹ýʹÓà **Ö¤Êé** À´¶ÔͨÐÅ·½½øÐÐÈÏÖ¤¡£Ö¤ÊéÖÐÓй«¿ªÃÜÔ¿Êý¾Ý£¬Èç¹û¿ÉÒÔÑéÖ¤¹«¿ªÃÜÔ¿µÄÈ·ÊôÓÚͨÐÅ·½µÄ£¬ÄÇô¾Í¿ÉÒÔÈ·¶¨Í¨ÐÅ·½Êǿɿ¿µÄ¡£ +?????? **???** ???????????????????????§Û???????????????????????????????????????????????????????????????? -Êý×ÖÖ¤ÊéÈÏÖ¤»ú¹¹£¨CA£¬Certificate -Authority£©°ä·¢µÄ¹«¿ªÃÜÔ¿Ö¤Ê飬¿ÉÒÔͨ¹ý CA ¶ÔÆä½øÐÐÑéÖ¤¡£ +????????????????CA??Certificate +Authority??????????????ï…??????? CA ???????????? -½øÐÐ HTTPs ͨÐÅʱ£¬·þÎñÆ÷»á°ÑÖ¤Êé·¢Ë͸ø¿Í»§¶Ë£¬¿Í»§¶ËÈ¡µÃÆäÖеĹ«¿ªÃÜÔ¿Ö®ºó£¬¾Í¿ÉÒÔ¿ªÊ¼¼ÓÃܹý³Ì¡£ +???? HTTPs ?????????????????ú€????????????????????§Ö???????????????????????? -ʹÓà OpenSSL ÕâÌ׿ªÔ´³ÌÐò£¬Ã¿¸öÈ˶¼¿ÉÒÔ¹¹½¨Ò»Ì×ÊôÓÚ×Ô¼ºµÄÈÏÖ¤»ú¹¹£¬´Ó¶ø×Ô¼º¸ø×Ô¼º°ä·¢·þÎñÆ÷Ö¤Êé¡£ä¯ÀÀÆ÷ÔÚ·ÃÎʸ÷þÎñÆ÷ʱ£¬»áÏÔʾ¡°ÎÞ·¨È·ÈÏÁ¬½Ó°²È«ÐÔ¡±»ò¡°¸ÃÍøÕ¾µÄ°²È«Ö¤Êé´æÔÚÎÊÌ⡱µÈ¾¯¸æÏûÏ¢¡£ +??? OpenSSL ?????????????????????????????????????????????????????????????????î•??????????¡Â???????????????????????????????????????????????????????????? -¿Í»§¶ËÖ¤ÊéÐèÒªÓû§×ÔÐа²×°£¬Ö»ÓÐÔÚÒµÎñÐèÒª·Ç³£¸ß°²È«ÐÔʱ²ÅʹÓÿͻ§¶ËÖ¤Ê飬ÀýÈçÍøÉÏÒøÐС£ +?????????????????§Ñ????????????????????????????????????ï…???????????§³? -## ÍêÕûÐÔ +## ?????? -SSL ÌṩժҪ¹¦ÄÜÀ´ÑéÖ¤ÍêÕûÐÔ¡£ +SSL ???????????????????? diff --git a/notes/JVM.md b/notes/JVM.md index 597eda7c..344d5a65 100644 --- a/notes/JVM.md +++ b/notes/JVM.md @@ -1,166 +1,166 @@ -* [ÄÚ´æÄ£ÐÍ](#ÄÚ´æÄ£ÐÍ) - * [1. ³ÌÐò¼ÆÊýÆ÷](#1-³ÌÐò¼ÆÊýÆ÷) - * [2. Java ÐéÄâ»úÕ»](#2-java-ÐéÄâ»úÕ») - * [3. ±¾µØ·½·¨Õ»](#3-±¾µØ·½·¨Õ») - * [4. Java ¶Ñ](#4-java-¶Ñ) - * [5. ·½·¨Çø](#5-·½·¨Çø) - * [6. ÔËÐÐʱ³£Á¿³Ø](#6-ÔËÐÐʱ³£Á¿³Ø) - * [7. Ö±½ÓÄÚ´æ](#7-Ö±½ÓÄÚ´æ) -* [À¬»øÊÕ¼¯](#À¬»øÊÕ¼¯) - * [1. ÅжÏÒ»¸ö¶ÔÏóÊÇ·ñ¿É»ØÊÕ](#1-ÅжÏÒ»¸ö¶ÔÏóÊÇ·ñ¿É»ØÊÕ) - * [1.1 ÒýÓüÆÊý](#11-ÒýÓüÆÊý) - * [1.2 ¿É´ïÐÔ](#12-¿É´ïÐÔ) - * [1.3 ÒýÓÃÀàÐÍ](#13-ÒýÓÃÀàÐÍ) - * [1.3.1 Ç¿ÒýÓÃ](#131-Ç¿ÒýÓÃ) - * [1.3.2 ÈíÒýÓÃ](#132-ÈíÒýÓÃ) - * [1.3.3 ÈõÒýÓÃ](#133-ÈõÒýÓÃ) - * [1.3.4 ÐéÒýÓÃ](#134-ÐéÒýÓÃ) - * [1.3 ·½·¨ÇøµÄ»ØÊÕ](#13-·½·¨ÇøµÄ»ØÊÕ) +* [??????](#??????) + * [1. ?????????](#1-?????????) + * [2. Java ??????](#2-java-??????) + * [3. ????????](#3-????????) + * [4. Java ??](#4-java-??) + * [5. ??????](#5-??????) + * [6. ???????????](#6-???????????) + * [7. ??????](#7-??????) +* [???????](#???????) + * [1. ?§Ø???????????????](#1-?§Ø???????????????) + * [1.1 ???¨¹???](#11-???¨¹???) + * [1.2 ?????](#12-?????) + * [1.3 ????????](#13-????????) + * [1.3.1 ?????](#131-?????) + * [1.3.2 ??????](#132-??????) + * [1.3.3 ??????](#133-??????) + * [1.3.4 ??????](#134-??????) + * [1.3 ???????????](#13-???????????) * [1.4 finalize()](#14-finalize) - * [2. À¬»øÊÕ¼¯Ëã·¨](#2-À¬»øÊÕ¼¯Ëã·¨) - * [2.1 ±ê¼Ç - Çå³ýËã·¨](#21-±ê¼Ç---Çå³ýËã·¨) - * [2.2 ¸´ÖÆËã·¨](#22-¸´ÖÆËã·¨) - * [2.3 ±ê¼Ç - ÕûÀíËã·¨](#23-±ê¼Ç---ÕûÀíËã·¨) - * [2.4 ·Ö´úÊÕ¼¯Ëã·¨](#24-·Ö´úÊÕ¼¯Ëã·¨) - * [3. À¬»øÊÕ¼¯Æ÷](#3-À¬»øÊÕ¼¯Æ÷) - * [3.1 Serial ÊÕ¼¯Æ÷](#31-serial-ÊÕ¼¯Æ÷) - * [3.2 ParNew ÊÕ¼¯Æ÷](#32-parnew-ÊÕ¼¯Æ÷) - * [3.3 Parallel Scavenge ÊÕ¼¯Æ÷](#33-parallel-scavenge-ÊÕ¼¯Æ÷) - * [3.4 Serial Old ÊÕ¼¯Æ÷](#34-serial-old-ÊÕ¼¯Æ÷) - * [3.5 Parallel Old ÊÕ¼¯Æ÷](#35-parallel-old-ÊÕ¼¯Æ÷) - * [3.6 CMS ÊÕ¼¯Æ÷](#36-cms-ÊÕ¼¯Æ÷) - * [3.7 G1 ÊÕ¼¯Æ÷](#37-g1-ÊÕ¼¯Æ÷) - * [3.8 ÆßÖÖÀ¬»øÊÕ¼¯Æ÷µÄ±È½Ï](#38-ÆßÖÖÀ¬»øÊÕ¼¯Æ÷µÄ±È½Ï) - * [4. ÄÚ´æ·ÖÅäÓë»ØÊÕ²ßÂÔ](#4-ÄÚ´æ·ÖÅäÓë»ØÊÕ²ßÂÔ) - * [4.1 ÓÅÏÈÔÚ Eden ·ÖÅä](#41-ÓÅÏÈÔÚ-eden-·ÖÅä) - * [4.2 ´ó¶ÔÏóÖ±½Ó½øÈëÀÏÄê´ú](#42-´ó¶ÔÏóÖ±½Ó½øÈëÀÏÄê´ú) - * [4.3 ³¤ÆÚ´æ»îµÄ¶ÔÏó½øÈëÀÏÄê´ú](#43-³¤ÆÚ´æ»îµÄ¶ÔÏó½øÈëÀÏÄê´ú) - * [4.4 ¶¯Ì¬¶ÔÏóÄêÁäÅж¨](#44-¶¯Ì¬¶ÔÏóÄêÁäÅж¨) - * [4.5 ¿Õ¼ä·ÖÅäµ£±£](#45-¿Õ¼ä·ÖÅäµ£±£) - * [4.6 Full GC µÄ´¥·¢Ìõ¼þ](#46-full-gc-µÄ´¥·¢Ìõ¼þ) - * [4.6.1 µ÷Óà System.gc()](#461-µ÷ÓÃ-systemgc) - * [4.6.2 ÀÏÄê´ú¿Õ¼ä²»×ã](#462-ÀÏÄê´ú¿Õ¼ä²»×ã) - * [4.6.3 ¿Õ¼ä·ÖÅäµ£±£Ê§°Ü](#463-¿Õ¼ä·ÖÅäµ£±£Ê§°Ü) - * [4.6.4 JDK 1.7 ¼°ÒÔǰµÄÓÀ¾Ã´ú¿Õ¼ä²»×ã](#464-jdk-17-¼°ÒÔǰµÄÓÀ¾Ã´ú¿Õ¼ä²»×ã) + * [2. ?????????](#2-?????????) + * [2.1 ??? - ?????](#21-???---?????) + * [2.2 ??????](#22-??????) + * [2.3 ??? - ??????](#23-???---??????) + * [2.4 ????????](#24-????????) + * [3. ?????????](#3-?????????) + * [3.1 Serial ?????](#31-serial-?????) + * [3.2 ParNew ?????](#32-parnew-?????) + * [3.3 Parallel Scavenge ?????](#33-parallel-scavenge-?????) + * [3.4 Serial Old ?????](#34-serial-old-?????) + * [3.5 Parallel Old ?????](#35-parallel-old-?????) + * [3.6 CMS ?????](#36-cms-?????) + * [3.7 G1 ?????](#37-g1-?????) + * [3.8 ?????????????????](#38-?????????????????) + * [4. ??????????????](#4-??????????????) + * [4.1 ?????? Eden ????](#41-??????-eden-????) + * [4.2 ????????????????](#42-????????????????) + * [4.3 ??????????????????](#43-??????????????????) + * [4.4 ????????????§Ø?](#44-????????????§Ø?) + * [4.5 ????????](#45-????????) + * [4.6 Full GC ?????????](#46-full-gc-?????????) + * [4.6.1 ???? System.gc()](#461-????-systemgc) + * [4.6.2 ??????????](#462-??????????) + * [4.6.3 ???????????](#463-???????????) + * [4.6.4 JDK 1.7 ?????????????????](#464-jdk-17-?????????????????) * [4.6.5 Concurrent Mode Failure](#465-concurrent-mode-failure) -* [Àà¼ÓÔØ»úÖÆ](#Àà¼ÓÔØ»úÖÆ) - * [1 ÀàµÄÉúÃüÖÜÆÚ](#1-ÀàµÄÉúÃüÖÜÆÚ) - * [2. Àà³õʼ»¯Ê±»ú](#2-Àà³õʼ»¯Ê±»ú) - * [3. Àà¼ÓÔØ¹ý³Ì](#3-Àà¼ÓÔØ¹ý³Ì) - * [3.1 ¼ÓÔØ](#31-¼ÓÔØ) - * [3.2 ÑéÖ¤](#32-ÑéÖ¤) - * [3.3 ×¼±¸](#33-×¼±¸) - * [3.4 ½âÎö](#34-½âÎö) - * [3.5 ³õʼ»¯](#35-³õʼ»¯) - * [4. Àà¼ÓÔØÆ÷](#4-Àà¼ÓÔØÆ÷) - * [4.1 ÀàÓëÀà¼ÓÔØÆ÷](#41-ÀàÓëÀà¼ÓÔØÆ÷) - * [4.2 Àà¼ÓÔØÆ÷·ÖÀà](#42-Àà¼ÓÔØÆ÷·ÖÀà) - * [4.3 Ë«Ç×ίÅÉÄ£ÐÍ](#43-Ë«Ç×ίÅÉÄ£ÐÍ) -* [JVM ²ÎÊý](#jvm-²ÎÊý) - * [GC ÓÅ»¯ÅäÖÃ](#gc-ÓÅ»¯ÅäÖÃ) - * [GC ÀàÐÍÉèÖÃ](#gc-ÀàÐÍÉèÖÃ) +* [????????](#????????) + * [1 ???????????](#1-???????????) + * [2. ?????????](#2-?????????) + * [3. ????????](#3-????????) + * [3.1 ????](#31-????) + * [3.2 ???](#32-???) + * [3.3 ???](#33-???) + * [3.4 ????](#34-????) + * [3.5 ?????](#35-?????) + * [4. ???????](#4-???????) + * [4.1 ???????????](#41-???????????) + * [4.2 ???????????](#42-???????????) + * [4.3 ?????????](#43-?????????) +* [JVM ????](#jvm-????) + * [GC ???????](#gc-???????) + * [GC ????????](#gc-????????) -# ÄÚ´æÄ£ÐÍ +# ?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/dc695f48-4189-4fc7-b950-ed25f6c80f82.jpg) -×¢£º°×É«ÇøÓòΪÏß³Ì˽Óеģ¬À¶É«ÇøÓòΪÏ̹߳²ÏíµÄ¡£ +????????????????§Ö?????????????????? -## 1. ³ÌÐò¼ÆÊýÆ÷ +## 1. ????????? -¼Ç¼ÕýÔÚÖ´ÐеÄÐéÄâ»ú×Ö½ÚÂëÖ¸ÁîµÄµØÖ·£¨Èç¹ûÕýÔÚÖ´ÐеÄÊÇ Native ·½·¨ÔòΪ¿Õ£©¡£ +?????????§Ö????????????????????????????§Ö??? Native ???????????? -## 2. Java ÐéÄâ»úÕ» +## 2. Java ?????? -ÿ¸ö Java ·½·¨ÔÚÖ´ÐеÄͬʱ»á´´½¨Ò»¸öÕ»Ö¡ÓÃÓÚ´æ´¢¾Ö²¿±äÁ¿±í¡¢²Ù×÷ÊýÕ»¡¢¶¯Ì¬Á´½Ó¡¢·½·¨³ö¿ÚµÈÐÅÏ¢¡£Ã¿Ò»¸ö·½·¨´Óµ÷ÓÃÖ±ÖÁÖ´ÐÐÍê³ÉµÄ¹ý³Ì£¬¾Í¶ÔÓ¦×ÅÒ»¸öÕ»Ö¡ÔÚ Java ÐéÄâ»úÕ»ÖÐÈëÕ»ºÍ³öÕ»µÄ¹ý³Ì¡£ +??? Java ????????§Ö????????????????›¥???????????????????????????????????????????????????????????????????????????????? Java ????????????????????? -¸ÃÇøÓò¿ÉÄÜÅ׳öÒÔÏÂÒì³££º +???????????????????? -1. µ±Ïß³ÌÇëÇóµÄÕ»Éî¶È³¬¹ý×î´óÖµ£¬»áÅ׳ö StackOverflowError Òì³££» -2. Õ»½øÐж¯Ì¬À©Õ¹Ê±Èç¹ûÎÞ·¨ÉêÇëµ¼×ã¹»Äڴ棬»áÅ׳ö OutOfMemoryError Òì³£¡£ +1. ???????????????????????????? StackOverflowError ???? +2. ????§Ø????????????????????—¨????? OutOfMemoryError ???? -## 3. ±¾µØ·½·¨Õ» +## 3. ???????? -Óë Java ÐéÄâ»úÕ»ÀàËÆ£¬ËüÃÇÖ®¼äµÄÇø±ðÖ»²»¹ýÊDZ¾µØ·½·¨Õ»Îª±¾µØ·½·¨·þÎñ¡£ +?? Java ????????????????????????????????????????????????? -## 4. Java ¶Ñ +## 4. Java ?? -ËùÓжÔÏóʵÀý¶¼ÔÚÕâÀï·ÖÅäÄÚ´æ¡£ +???§Ø???????????????????µµ -Õâ¿éÇøÓòÊÇÀ¬»øÊÕ¼¯Æ÷¹ÜÀíµÄÖ÷񻂿Óò£¨"GC ¶Ñ "£©¡£ÏÖÔÚÊÕ¼¯Æ÷»ù±¾¶¼ÊDzÉÓ÷ִúÊÕ¼¯Ëã·¨£¬Java ¶Ñ»¹¿ÉÒԷֳɣºÐÂÉú´úºÍÀÏÄê´ú£¨ÐÂÉú´ú»¹¿ÉÒÔ·Ö³É Eden ¿Õ¼ä¡¢From Survivor ¿Õ¼ä¡¢To Survivor ¿Õ¼äµÈ£©¡£ +??????????????????????????????"GC ?? "???????????????????????¡Â?????????Java ??????????????????????????????????????? Eden ???From Survivor ???To Survivor ??????? -²»ÐèÒªÁ¬ÐøÄڴ棬¿ÉÒÔͨ¹ý -Xmx ºÍ -Xms À´¿ØÖƶ¯Ì¬À©Õ¹ÄÚ´æ´óС£¬Èç¹û¶¯Ì¬À©Õ¹Ê§°Ü»áÅ׳ö OutOfMemoryError Òì³£¡£ +???????????—¨??????? -Xmx ?? -Xms ???????????????§³?????????????????? OutOfMemoryError ???? -## 5. ·½·¨Çø +## 5. ?????? -ÓÃÓÚ´æ·ÅÒѱ»ÐéÄâ»ú¼ÓÔØµÄÀàÐÅÏ¢¡¢³£Á¿¡¢¾²Ì¬±äÁ¿¡¢¼´Ê±±àÒëÆ÷±àÒëºóµÄ´úÂëµÈÊý¾Ý¡£ +????????????????????????????????????????????????????????????????? -ºÍ Java ¶ÑÒ»Ñù²»ÐèÒªÁ¬ÐøµÄÄڴ棬²¢ÇÒ¿ÉÒÔ¶¯Ì¬À©Õ¹£¬¶¯Ì¬À©Õ¹Ê§°ÜÒ»Ñù»áÅ׳ö OutOfMemoryError Òì³£¡£ +?? Java ??????????????????—¨??????????????????????????????? OutOfMemoryError ???? -¶ÔÕâ¿éÇøÓò½øÐÐÀ¬»ø»ØÊÕµÄÖ÷ҪĿ±êÊǶԳ£Á¿³ØµÄ»ØÊպͶÔÀàµÄÐ¶ÔØ£¬µ«ÊÇÒ»°ã±È½ÏÄÑʵÏÖ£¬HotSpot ÐéÄâ»ú°ÑËüµ±³ÉÓÀ¾Ã´úÀ´½øÐÐÀ¬»ø»ØÊÕ¡£ +????????????????????????????????????????????§Ø??????????????????HotSpot ????????????????????????????????? -## 6. ÔËÐÐʱ³£Á¿³Ø +## 6. ??????????? -ÔËÐÐʱ³£Á¿³ØÊÇ·½·¨ÇøµÄÒ»²¿·Ö¡£ +?????????????????????????? -Àà¼ÓÔØºó£¬Class ÎļþÖеij£Á¿³Ø£¨ÓÃÓÚ´æ·Å±àÒëÆÚÉú³ÉµÄ¸÷ÖÖ×ÖÃæÁ¿ºÍ·ûºÅÒýÓ㩾ͻᱻ·Åµ½Õâ¸öÇøÓò¡£ +??????Class ????§Ö??????????????????????????????????????????????????????? -ÔÚÔËÐÐÆÚ¼äÒ²¿ÉÒÔÓùý String ÀàµÄ intern() ·½·¨½«Ðµij£Á¿·ÅÈë¸ÃÇøÓò¡£ +???????????????¨´? String ??? intern() ????????????????????? -## 7. Ö±½ÓÄÚ´æ +## 7. ?????? -ÔÚ JDK 1.4 ÖÐмÓÈëÁË NIO À࣬ÒýÈëÁËÒ»ÖÖ»ùÓÚͨµÀ£¨Channel£©Ó뻺³åÇø£¨Buffer£©µÄ I/O ·½Ê½£¬Ëü¿ÉÒÔʹÓà Native º¯Êý¿âÖ±½Ó·ÖÅä¶ÑÍâÄڴ棬Ȼºóͨ¹ýÒ»¸ö´æ´¢ÔÚ Java ¶ÑÀïµÄ DirectByteBuffer ¶ÔÏó×÷ΪÕâ¿éÄÚ´æµÄÒýÓýøÐвÙ×÷¡£ÕâÑùÄÜÔÚһЩ³¡¾°ÖÐÏÔÖøÌá¸ßÐÔÄÜ£¬ÒòΪ±ÜÃâÁËÔÚ Java ¶ÑºÍ Native ¶ÑÖÐÀ´»Ø¸´ÖÆÊý¾Ý¡£ +?? JDK 1.4 ????????? NIO ???????????????????Channel??????????Buffer???? I/O ?????????????? Native ?????????????????—¨??????????›¥?? Java ????? DirectByteBuffer ????????????????????§Ó??????????????§»????????????????????????????? Java ??? Native ???????????????? -# À¬»øÊÕ¼¯ +# ??????? -³ÌÐò¼ÆÊýÆ÷¡¢ÐéÄâ»úÕ»ºÍ±¾µØ·½·¨Õ»ÕâÈý¸öÇøÓòÊôÓÚÏß³Ì˽Óеģ¬Ö»´æÔÚÓÚÏ̵߳ÄÉúÃüÖÜÆÚÄÚ£¬Ï߳̽áÊøÖ®ºóÒ²»áÏûʧ£¬Òò´Ë²»ÐèÒª¶ÔÕâÈý¸öÇøÓò½øÐÐÀ¬»ø»ØÊÕ¡£ +?????????????????????????????????????????????§Ö???????????????????????????????????????????????????????????????????????? -À¬»ø»ØÊÕÖ÷ÒªÊÇÕë¶Ô Java ¶ÑºÍ·½·¨Çø½øÐС£ +???????????????? Java ???????????§³? -## 1. ÅжÏÒ»¸ö¶ÔÏóÊÇ·ñ¿É»ØÊÕ +## 1. ?§Ø??????????????? -### 1.1 ÒýÓüÆÊý +### 1.1 ???¨¹??? -¸ø¶ÔÏóÌí¼ÓÒ»¸öÒýÓüÆÊýÆ÷£¬µ±¶ÔÏóÔö¼ÓÒ»¸öÒýÓÃʱ¼ÆÊýÆ÷¼Ó 1£¬ÒýÓÃʧЧʱ¼ÆÊýÆ÷¼õ 1¡£ +???????????????¨¹????????????????????????????????? 1???????§¹????????? 1?? -ÒýÓüÆÊýΪ 0 µÄ¶ÔÏó¿É±»»ØÊÕ¡£ +???¨¹???? 0 ???????????? -Á½¸ö¶ÔÏó»á³öÏÖÑ­»·ÒýÓÃÎÊÌ⣬´ËʱÒýÓüÆÊýÆ÷ÓÀÔ¶²»Îª 0£¬µ¼Ö GC ÊÕ¼¯Æ÷ÎÞ·¨»ØÊÕ¡£ +?????????????????????????????¨¹??????????? 0?????? GC ????????????? ```java objA.instance = objB; objB.instance = objA; ``` -### 1.2 ¿É´ïÐÔ +### 1.2 ????? -ͨ¹ý GC Roots ×÷ΪÆðʼµã½øÐÐËÑË÷£¬Äܹ»µ½´ïµ½µÄ¶ÔÏó¶¼ÊǶ¼ÊÇ¿ÉÓõ쬲»¿É´ïµÄ¶ÔÏó¿É±»»ØÊÕ¡£ +??? GC Roots ??????????????????????????????????????????????????????? -GC Roots Ò»°ã°üº¬ÒÔÏÂÄÚÈÝ£º +GC Roots ??????????????? -1. ÐéÄâ»úÕ»ÖÐÒýÓõĶÔÏó -2. ·½·¨ÇøÖÐÀྲ̬ÊôÐÔÒýÓõĶÔÏó -3. ·½·¨ÇøÖеij£Á¿ÒýÓõĶÔÏó -4. ±¾µØ·½·¨Õ»ÖÐÒýÓõĶÔÏó +1. ???????????????? +2. ??????????????????????? +3. ???????§Ö???????????? +4. ?????????????????? -### 1.3 ÒýÓÃÀàÐÍ +### 1.3 ???????? -ÎÞÂÛÊÇͨ¹ýÒýÓüÆËãËã·¨Åж϶ÔÏóµÄÒýÓÃÊýÁ¿£¬»¹ÊÇͨ¹ý¿É´ïÐÔ·ÖÎöËã·¨Åж϶ÔÏóµÄÒýÓÃÁ´ÊÇ·ñ¿É´ï£¬Åж¨¶ÀÏíÊÇ·ñ´æ»î¶¼Óë¡°ÒýÓá±Óйء£ +????????????¨¹??????§Ø?????????????????????????????????§Ø?????????????????§Ø???????????????¨¢??§Û?? -#### 1.3.1 Ç¿ÒýÓà +#### 1.3.1 ????? -ֻҪǿÒýÓôæÔÚ£¬À¬»ø»ØÊÕÆ÷ÓÀÔ¶²»»á»ØÊÕµ÷µô±»ÒýÓõĶÔÏó¡£ +???????????????????????????????????????????? ```java Object obj = new Object(); ``` -#### 1.3.2 ÈíÒýÓà +#### 1.3.2 ?????? -·Ç±ØÐëÒýÓã¬ÄÚ´æÒç³ö֮ǰ½øÐлØÊÕ¡£ +?????????????????????§Ý???? ```java Object obj = new Object(); @@ -169,14 +169,14 @@ obj = null; sf.get(); ``` -sf ÊÇ¶Ô obj µÄÒ»¸öÈíÒýÓã¬Í¨¹ý sf.get() ·½·¨¿ÉÒÔÈ¡µ½Õâ¸ö¶ÔÏ󣬵±È»£¬µ±Õâ¸ö¶ÔÏó±»±ê¼ÇΪÐèÒª»ØÊյĶÔÏóʱ£¬Ôò·µ»Ø null£» +sf ??? obj ??????????????? sf.get() ??????????????????????????????????????????????????? null?? -ÈíÒýÓÃÖ÷ÒªÓû§ÊµÏÖÀàËÆ»º´æµÄ¹¦ÄÜ£¬ÔÚÄÚ´æ×ã¹»µÄÇé¿öÏÂÖ±½Óͨ¹ýÈíÒýÓÃȡֵ£¬ÎÞÐè´Ó·±Ã¦µÄÕæÊµÀ´Ô´²éѯÊý¾Ý£¬ÌáÉýËÙ¶È£»µ±ÄÚ´æ²»×ãʱ£¬×Ô¶¯É¾³ýÕⲿ·Ö»º´æÊý¾Ý£¬´ÓÕæÕýµÄÀ´Ô´²éѯÕâЩÊý¾Ý¡£ +????????????????????????????????????????????????????????????????????????????????????????????ÖÎ???????????????????????????????????????§»????? -#### 1.3.3 ÈõÒýÓà +#### 1.3.3 ?????? -Ö»ÄÜÉú´æµ½ÏÂÒ»´ÎÀ¬»øÊÕ¼¯·¢Éú֮ǰ£¬µ±À¬»øÊÕ¼¯Æ÷¹¤×÷ʱ£¬ÎÞÂÛµ±Ç°ÄÚ´æÊÇ·ñ×ã¹»£¬¶¼»á±»»ØÊÕ¡£ +??????›Ô??????????????????????????????????????????????????????????????? ```java Object obj = new Object(); @@ -186,9 +186,9 @@ wf.get(); wf.isEnQueued(); ``` -#### 1.3.4 ÐéÒýÓà +#### 1.3.4 ?????? -ÓÖ³ÆÎªÓÄÁéÒýÓûòÕß»ÃÓ°ÒýÓã¬Ò»¸ö¶ÔÏóÊÇ·ñÓÐÐéÒýÓõĴæÔÚ£¬ÍêÈ«²»»á¶ÔÆäÉú´æÊ±¼ä¹¹³ÉÓ°Ï죬ҲÎÞ·¨Í¨¹ýÐéÒýÓÃÈ¡µÃÒ»¸ö¶ÔÏóʵÀý¡£ÎªÒ»¸ö¶ÔÏóÉèÖÃÐéÒýÓùØÁªµÄΨһĿµÄ¾ÍÊÇÄÜÔÚÕâ¸ö¶ÔÏó±»ÊÕ¼¯Æ÷»ØÊÕʱÊÕµ½Ò»¸öϵͳ֪ͨ¡£ +?????????????????????????????????????????????????????????????�q??????????????????????????????????????????????????¨´?????¦·???????????????????????????????????????? ```java Object obj = new Object(); @@ -198,367 +198,367 @@ pf.get(); pf.isEnQueued(); ``` -### 1.3 ·½·¨ÇøµÄ»ØÊÕ +### 1.3 ??????????? -ÔÚ·½·¨ÇøÖ÷ÒªÊǶԳ£Á¿³ØµÄ»ØÊպͶÔÀàµÄÐ¶ÔØ¡£ +???????????????????????????§Ø??? -³£Á¿³ØµÄ»ØÊպͶÑÖжÔÏó»ØÊÕÀàËÆ¡£ +?????????????§Ø??????????? -ÀàµÄÐ¶ÔØÌõ¼þºÜ¶à£¬ÐèÒªÂú×ãÒÔÏÂÈý¸öÌõ¼þ£¬²¢ÇÒÂú×ãÁËÒ²²»Ò»¶¨»á±»Ð¶ÔØ£º +???§Ø????????????????????????????????????????????????§Ø??? -1. ¸ÃÀàËùÓеÄʵÀý¶¼ÒѾ­±»»ØÊÕ£¬Ò²¾ÍÊÇ Java ¶ÑÖв»´æÔÚ¸ÃÀàµÄÈκÎʵÀý¡£ -2. ¼ÓÔØ¸ÃÀàµÄ ClassLoader ÒѾ­±»»ØÊÕ¡£ -3. ¸ÃÀà¶ÔÓ¦µÄ java.lang.Class ¶ÔÏóûÓÐÔÚÈκεط½±»ÒýÓã¬Ò²¾ÍÎÞ·¨ÔÚÈκεط½Í¨¹ý·´Éä·ÃÎʸÃÀà·½·¨¡£ +1. ???????§Ö????????????????????? Java ???§Ó??????????¦Ê?????? +2. ???????? ClassLoader ?????????? +3. ???????? java.lang.Class ??????????¦Ê¦Å??????????????????¦Ê¦Å??????????????????? -¿ÉÒÔͨ¹ý -Xnoclassgc ²ÎÊýÀ´¿ØÖÆÊÇ·ñ¶ÔÀà½øÐÐÐ¶ÔØ¡£ +??????? -Xnoclassgc ???????????????????§Ø??? -ÔÚ´óÁ¿Ê¹Ó÷´Éä¡¢¶¯Ì¬´úÀí¡¢CGLib µÈ ByteCode ¿ò¼Ü¡¢¶¯Ì¬Éú³É JSP ÒÔ¼° OSGo ÕâÀàÆµ·±×Ô¶¨Òå ClassLoader µÄ³¡¾°¶¼ÐèÒªÐéÄâ»ú¾ß±¸ÀàÐ¶ÔØ¹¦ÄÜ£¬ÒÔ±£Ö¤²»»á³öÏÖÄÚ´æÒç³ö¡£ +???????¡Â??????????CGLib ?? ByteCode ??????????? JSP ??? OSGo ???????????? ClassLoader ????????????????????§Ø????????????????????????? ### 1.4 finalize() -µ±Ò»¸ö¶ÔÏó¿É±»»ØÊÕʱ£¬Èç¹û¸Ã¶ÔÏóÓбØÒªÖ´ÐÐ finalize() ·½·¨£¬ÄÇô¾ÍÓпÉÄÜ¿ÉÄÜͨ¹ýÔڸ÷½·¨ÖÐÈöÔÏóÖØÐ±»ÒýÓ㬴ӶøÊµÏÖ×Ծȡ£ +???????????????????????????§Ò????? finalize() ????????????§á???????????¡Â?????????????¡À???????????????? -finalize() ÀàËÆ C++ µÄÐé¹¹º¯Êý£¬ÓÃÀ´×ö¹Ø±ÕÍⲿ×ÊÔ´µÈ¹¤×÷¡£µ«ÊÇ try-finally µÈ·½Ê½¿ÉÒÔ×öµÄ¸üºÃ£¬²¢ÇҸ÷½·¨ÔËÐдú¼Û¸ß°º£¬²»È·¶¨ÐÔ´ó£¬ÎÞ·¨±£Ö¤¸÷¸ö¶ÔÏóµÄµ÷ÓÃ˳Ðò£¬Òò´Ë×îºÃ²»ÒªÊ¹Óᣠ+finalize() ???? C++ ???ûy??????????????????????????????? try-finally ????????????????????¡Â??????§Õ?????????????????????????????????????????¨°????¨¢? -## 2. À¬»øÊÕ¼¯Ëã·¨ +## 2. ????????? -### 2.1 ±ê¼Ç - Çå³ýËã·¨ +### 2.1 ??? - ????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a4248c4b-6c1d-4fb8-a557-86da92d3a294.jpg) -½«ÐèÒª»ØÊյĶÔÏó½øÐбê¼Ç£¬È»ºóÇå³ý¡£ +???????????????§Ò??????????? -²»×㣺 +???? -1. ±ê¼ÇºÍÇå³ý¹ý³ÌЧÂʶ¼²»¸ß -2. »á²úÉú´óÁ¿Ë鯬 +1. ???????????§¹??????? +2. ???????????? -Ö®ºóµÄËã·¨¶¼ÊÇ»ùÓÚ¸ÃËã·¨½øÐиĽø¡£ +???????????????????§Ú???? -### 2.2 ¸´ÖÆËã·¨ +### 2.2 ?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/e6b733ad-606d-4028-b3e8-83c3a73a3797.jpg) -½«ÄÚ´æ»®·ÖΪ´óСÏàµÈµÄÁ½¿é£¬Ã¿´ÎֻʹÓÃÆäÖÐÒ»¿é£¬µ±ÕâÒ»¿éÄÚ´æÓÃÍêÁ˾ͽ«»¹´æ»îµÄ¶ÔÏó¸´ÖƵ½ÁíÒ»¿éÉÏÃæ£¬È»ºóÔÙ°ÑʹÓùýµÄÄÚ´æ¿Õ¼ä½øÐÐÒ»´ÎÇåÀí¡£ +????œý?????§³???????ï…?????????????ï…??????????????????????????????????????—¨????????¨´?????????????????? -Ö÷Òª²»×ãÊÇֻʹÓÃÁËÄÚ´æµÄÒ»°ë¡£ +?????????????????????? -ÏÖÔÚµÄÉÌÒµÐéÄâ»ú¶¼²ÉÓÃÕâÖÖÊÕ¼¯Ëã·¨À´»ØÊÕÐÂÉú´ú£¬µ«ÊDz¢²»Êǽ«ÄÚ´æ»®·ÖΪ´óСÏàµÈµÄÁ½¿é£¬¶øÊÇ·ÖΪһ¿é½Ï´óµÄ Eden ¿Õ¼äºÍÁ½¿é½ÏСµÄ Survior ¿Õ¼ä£¬Ã¿´ÎʹÓà Eden ¿Õ¼äºÍÆäÖÐÒ»¿é Survivor¡£ÔÚ»ØÊÕʱ£¬½« Eden ºÍ Survivor Öл¹´æ»î×ŵĶÔÏóÒ»´ÎÐÔ¸´ÖƵ½ÁíÒ»¿é Survivor ¿Õ¼äÉÏ£¬×îºóÇåÀí Eden ºÍ Survivor¡£HotSpot ÐéÄâ»úµÄ Eden ºÍ Survivor µÄ´óС±ÈÀýĬÈÏΪ 8:1£¬±£Ö¤ÁËÄÚ´æµÄÀûÓÃÂÊ´ïµ½ 90 %¡£Èç¹ûÿ´Î»ØÊÕÓжàÓÚ 10% µÄ¶ÔÏó´æ»î£¬ÄÇôһ¿é Survivor ¿Õ¼ä¾Í²»¹»ÓÃÁË£¬ÐèÒªÒÀÀµÓÚÀÏÄê´ú½øÐзÖÅäµ£±££¬Ò²¾ÍÊǽèÓÃÀÏÄê´úµÄ¿Õ¼ä¡£ +??????????????????????????????????????????????????????œý?????§³???????ï…???????????? Eden ?????????§³?? Survior ????????? Eden ??????????? Survivor???????????? Eden ?? Survivor ?§Ý???????????????????????? Survivor ????????????? Eden ?? Survivor??HotSpot ??????? Eden ?? Survivor ???§³???????? 8:1?????????????????? 90 %???????¦Ë????§Ø??? 10% ????????????? Survivor ?????????????????????????????§Ù???????????????????????? -### 2.3 ±ê¼Ç - ÕûÀíËã·¨ +### 2.3 ??? - ?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/902b83ab-8054-4bd2-898f-9a4a0fe52830.jpg) -ÈÃËùÓдæ»îµÄ¶ÔÏó¶¼ÏòÒ»¶ÎÒÆ¶¯£¬È»ºóÖ±½ÓÇåÀíµô¶Ë±ß½çÒÔÍâµÄÄÚ´æ¡£ +?????§Õ??????????????????????????????????????µµ -### 2.4 ·Ö´úÊÕ¼¯Ëã·¨ +### 2.4 ???????? -ÏÖÔÚµÄÉÌÒµÐéÄâ»ú²ÉÓ÷ִúÊÕ¼¯Ëã·¨£¬ËüʹÓÃÁËÇ°Ãæ½éÉܵļ¸ÖÖÊÕ¼¯Ëã·¨£¬¸ù¾Ý¶ÔÏó´æ»îÖÜÆÚ½«ÄÚ´æ»®·ÖΪ¼¸¿é£¬²»Í¬¿é²ÉÓÃÊʵ±µÄÊÕ¼¯Ëã·¨¡£ +????????????????¡Â?????????????????????????????????????????????????œý??????ï…???????????????????? -Ò»°ã½« Java ¶Ñ·ÖΪÐÂÉú´úºÍÀÏÄê´ú¡£ +??? Java ??????????????????? -1. ÐÂÉú´úʹÓ㺸´ÖÆËã·¨ -2. ÀÏÄê´úʹÓ㺱ê¼Ç - ÇåÀí »òÕß ±ê¼Ç - ÕûÀí Ëã·¨¡£ +1. ???????????????? +2. ???????????? - ???? ???? ??? - ???? ???? -## 3. À¬»øÊÕ¼¯Æ÷ +## 3. ????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c625baa0-dde6-449e-93df-c3a67f2f430f.jpg) -ÒÔÉÏÊÇ HotSpot ÐéÄâ»úÖÐµÄ 7 ¸öÀ¬»øÊÕ¼¯Æ÷£¬Á¬Ïß±íʾÀ¬»øÊÕ¼¯Æ÷¿ÉÒÔÅäºÏʹÓᣠ+?????? HotSpot ??????§Ö? 7 ?????????????????????????????????????¨¢? -### 3.1 Serial ÊÕ¼¯Æ÷ +### 3.1 Serial ????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/22fda4ae-4dd5-489d-ab10-9ebfdad22ae0.jpg) -ËüÊǵ¥Ï̵߳ÄÊÕ¼¯Æ÷£¬²»½öÒâζ×ÅÖ»»áʹÓÃÒ»¸öÏ߳̽øÐÐÀ¬»øÊÕ¼¯¹¤×÷£¬¸üÖØÒªµÄÊÇËüÔÚ½øÐÐÀ¬»øÊÕ¼¯Ê±£¬±ØÐëÔÝÍ£ËùÓÐÆäËû¹¤×÷Ị̈߳¬ÍùÍùÔì³É¹ý³¤µÄµÈ´ýʱ¼ä¡£ +??????????????????????¦Æ???????????????????????????????????????????????????????????????????????????????????????????????? -ËüµÄÓŵãÊǼòµ¥¸ßЧ£¬¶ÔÓÚµ¥¸ö CPU »·¾³À´Ëµ£¬ÓÉÓÚûÓÐÏ߳̽»»¥µÄ¿ªÏú£¬Òò´ËÓµÓÐ×î¸ßµÄµ¥Ïß³ÌÊÕ¼¯Ð§ÂÊ¡£ +???????????§¹????????? CPU ??????????????????????????????????????????????§¹??? -ÔÚ Client Ó¦Óó¡¾°ÖУ¬·ÖÅ䏸ÐéÄâ»ú¹ÜÀíµÄÄÚ´æÒ»°ãÀ´Ëµ²»»áºÜ´ó£¬¸ÃÊÕ¼¯Æ÷ÊÕ¼¯¼¸Ê®Õ×ÉõÖÁÒ»Á½°ÙÕ×µÄÐÂÉú´úÍ£¶Ùʱ¼ä¿ÉÒÔ¿ØÖÆÔÚÒ»°Ù¶àºÁÃëÒÔÄÚ£¬Ö»Òª²»ÊÇ̫Ƶ·±£¬ÕâµãÍ£¶ÙÊÇ¿ÉÒÔ½ÓÊܵġ£ +?? Client ??¨®????§µ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -### 3.2 ParNew ÊÕ¼¯Æ÷ +### 3.2 ParNew ????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/81538cd5-1bcf-4e31-86e5-e198df1e013b.jpg) -ËüÊÇ Serial ÊÕ¼¯Æ÷µÄ¶àḬ̈߳汾¡£ +???? Serial ???????????·Ú?? -ÊÇ Server ģʽϵÄÐéÄâ»úÊ×Ñ¡ÐÂÉú´úÊÕ¼¯Æ÷£¬³ýÁËÐÔÄÜÔ­ÒòÍ⣬Ö÷ÒªÊÇÒòΪ³ýÁË Serial ÊÕ¼¯Æ÷£¬Ö»ÓÐËüÄÜÓë CMS ÊÕ¼¯Æ÷ÅäºÏ¹¤×÷¡£ +?? Server ??????????????????????????????????????????????????? Serial ???????????????? CMS ????????????? -ĬÈÏ¿ªÊ¼µÄÏß³ÌÊýÁ¿Óë CPU ÊýÁ¿Ïàͬ£¬¿ÉÒÔʹÓà -XX:ParallelGCThreads ²ÎÊýÀ´ÉèÖÃÏß³ÌÊý¡£ +???????????????? CPU ???????????????? -XX:ParallelGCThreads ????????????????? -### 3.3 Parallel Scavenge ÊÕ¼¯Æ÷ +### 3.3 Parallel Scavenge ????? -ÊDz¢ÐеĶàÏß³ÌÊÕ¼¯Æ÷¡£ +????§Ö???????????? -ÆäËüÊÕ¼¯Æ÷¹Ø×¢µãÊǾ¡¿ÉÄÜËõ¶ÌÀ¬»øÊÕ¼¯Ê±Óû§Ï̵߳ÄÍ£¶Ùʱ¼ä£¬¶øËüµÄÄ¿±êÊÇ´ïµ½Ò»¸ö¿É¿ØÖƵÄÍÌÍÂÁ¿£¬Ëü±»³ÆÎª¡°ÍÌÍÂÁ¿ÓÅÏÈ¡±ÊÕ¼¯Æ÷¡£ÕâÀïµÄÍÌÍÂÁ¿Ö¸ CPU ÓÃÓÚÔËÐÐÓû§´úÂëµÄʱ¼äÕ¼×Üʱ¼äµÄ±ÈÖµ¡£ +?????????????????????????????????????????????????????????????????????????????????????????????????????????????????? CPU ?????????????????????????????? -Í£¶Ùʱ¼äÔ½¶Ì¾ÍÔ½ÊʺÏÐèÒªÓëÓû§½»»¥µÄ³ÌÐò£¬Á¼ºÃµÄÏìÓ¦ËÙ¶ÈÄÜÌáÉýÓû§ÌåÑé¡£¶ø¸ßÍÌÍÂÁ¿Ôò¿ÉÒÔ¸ßЧÂʵØÀûÓà CPU ʱ¼ä£¬¾¡¿ìÍê³É³ÌÐòµÄÔËËãÈÎÎñ£¬Ö÷ÒªÊʺÏÔÚºǫ́ÔËËã¶ø²»ÐèҪ̫¶à½»»¥µÄÈÎÎñ¡£ +??????????????????????????????????????????????????????î•????????????????§¹??????? CPU ????????????????????????????????????????????????????? -ÌṩÁËÁ½¸ö²ÎÊýÓÃÓÚ¾«È·¿ØÖÆÍÌÍÂÁ¿£¬·Ö±ðÊÇ¿ØÖÆ×î´óÀ¬»øÊÕ¼¯Í£¶Ùʱ¼ä -XX:MaxGCPauseMillis ²ÎÊýÒÔ¼°Ö±½ÓÉèÖÃÍÌÍÂÁ¿´óСµÄ -XX:GCTimeRatio ²ÎÊý£¨ÖµÎª´óÓÚ 0 ÇÒСÓÚ 100 µÄÕûÊý£©¡£Ëõ¶ÌÍ£¶Ùʱ¼äÊÇÒÔÎþÉüÍÌÍÂÁ¿ºÍÐÂÉú´ú¿Õ¼äÀ´»»È¡µÄ£ºÐÂÉú´ú¿Õ¼ä±äС£¬À¬»ø»ØÊÕ±äµÃƵ·±£¬µ¼ÖÂÍÌÍÂÁ¿Ï½µ¡£ +?????????????????????????????????????????????????????? -XX:MaxGCPauseMillis ??????????????????????§³?? -XX:GCTimeRatio ???????????? 0 ??§³?? 100 ???????????????????????????????????????????????????????????????§³???????????????????????????????? -»¹ÌṩÁËÒ»¸ö²ÎÊý -XX:+UseAdaptiveSizePolicy£¬ÕâÊÇÒ»¸ö¿ª¹Ø²ÎÊý£¬´ò¿ª²ÎÊýºó£¬¾Í²»ÐèÒªÊÖ¹¤Ö¸¶¨ÐÂÉú´úµÄ´óС£¨-Xmn£©¡¢Eden ºÍ Survivor ÇøµÄ±ÈÀý£¨-XX:SurvivorRatio£©¡¢½úÉýÀÏÄê´ú¶ÔÏóÄêÁ䣨-XX:PretenureSizeThreshold£©µÈϸ½Ú²ÎÊýÁË£¬ÐéÄâ»ú»á¸ù¾Ýµ±Ç°ÏµÍ³µÄÔËÐÐÇé¿öÊÕ¼¯ÐÔÄÜ¼à¿ØÐÅÏ¢£¬¶¯Ì¬µ÷ÕûÕâЩ²ÎÊýÒÔÌṩ×îºÏÊʵÄÍ£¶Ùʱ¼ä»òÕß×î´óµÄÍÌÍÂÁ¿£¬ÕâÖÖ·½Ê½³ÆÎª GC ×ÔÊÊÓ¦µÄµ÷½Ú²ßÂÔ£¨GC Ergonomics£©¡£×ÔÊÊÓ¦µ÷½Ú²ßÂÔÒ²ÊÇËüÓë ParNew ÊÕ¼¯Æ÷µÄÒ»¸öÖØÒªÇø±ð¡£ +????????????? -XX:+UseAdaptiveSizePolicy?????????????????????????????????????????????§³??-Xmn????Eden ?? Survivor ?????????-XX:SurvivorRatio?????????????????????-XX:PretenureSizeThreshold???????????????????????????????????????????????????????????§»???????????????????????????????????????????? GC ??????????????GC Ergonomics??????????????????????? ParNew ????????????????? -### 3.4 Serial Old ÊÕ¼¯Æ÷ +### 3.4 Serial Old ????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/08f32fd3-f736-4a67-81ca-295b2a7972f2.jpg) -Serial Old ÊÇ Serial ÊÕ¼¯Æ÷µÄÀÏÄê´ú°æ±¾£¬Ò²ÊǸø Client ģʽϵÄÐéÄâ»úʹÓá£Èç¹ûÓÃÔÚ Server ģʽÏ£¬ËüÓÐÁ½´óÓÃ;£º +Serial Old ?? Serial ?????????????·Ú?????? Client ????????????¨¢???????? Server ?????????????????? -1. ÔÚ JDK 1.5 ÒÔ¼°Ö®Ç°°æ±¾£¨Parallel Old µ®ÉúÒÔǰ£©ÖÐÓë Parallel Scavenge ÊÕ¼¯Æ÷´îÅäʹÓᣠ-2. ×÷Ϊ CMS ÊÕ¼¯Æ÷µÄºó±¸Ô¤°¸£¬ÔÚ²¢·¢ÊÕ¼¯·¢Éú Concurrent Mode Failure ʱʹÓᣠ+1. ?? JDK 1.5 ??????·Ú??Parallel Old ????????????? Parallel Scavenge ???????????¨¢? +2. ??? CMS ????????????????????????? Concurrent Mode Failure ???¨¢? -### 3.5 Parallel Old ÊÕ¼¯Æ÷ +### 3.5 Parallel Old ????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/278fe431-af88-4a95-a895-9c3b80117de3.jpg) -ÊÇ Parallel Scavenge ÊÕ¼¯Æ÷µÄÀÏÄê´ú°æ±¾¡£ +?? Parallel Scavenge ?????????????·Ú?? -ÔÚ×¢ÖØÍÌÍÂÁ¿ÒÔ¼° CPU ×ÊÔ´Ãô¸ÐµÄ³¡ºÏ£¬¶¼¿ÉÒÔÓÅÏÈ¿¼ÂÇ Parallel Scavenge ¼Ó Parallel Old ÊÕ¼¯Æ÷¡£ +?????????????? CPU ??????§Ö?????????????????? Parallel Scavenge ?? Parallel Old ??????? -### 3.6 CMS ÊÕ¼¯Æ÷ +### 3.6 CMS ????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/62e77997-6957-4b68-8d12-bfd609bb2c68.jpg) -CMS£¨Concurrent Mark Sweep£©£¬´Ó Mark Sweep ¿ÉÒÔÖªµÀËüÊÇ»ùÓÚ ±ê¼Ç - Çå³ý Ë㷨ʵÏֵġ£ +CMS??Concurrent Mark Sweep?????? Mark Sweep ?????????????? ??? - ??? ??????? -ÌØµã£º²¢·¢ÊÕ¼¯¡¢µÍÍ£¶Ù¡£ +?????????????????? -·ÖΪÒÔÏÂËĸöÁ÷³Ì£º +??????????????? -1. ³õʼ±ê¼Ç£º½ö½öÖ»ÊDZê¼ÇһϠGC Roots ÄÜÖ±½Ó¹ØÁªµ½µÄ¶ÔÏó£¬ËٶȺܿ죬ÐèҪͣ¶Ù¡£ -2. ²¢·¢±ê¼Ç£º½øÐÐ GC Roots Tracing µÄ¹ý³Ì£¬ËüÔÚÕû¸ö»ØÊÕ¹ý³ÌÖкÄʱ×£¬²»ÐèҪͣ¶Ù¡£ -3. ÖØÐ±ê¼Ç£ºÎªÁËÐÞÕý²¢·¢±ê¼ÇÆÚ¼äÒòÓû§³ÌÐò¼ÌÐøÔË×÷¶øµ¼Ö±ê¼Ç²úÉú±ä¶¯µÄÄÇÒ»²¿·Ö¶ÔÏóµÄ±ê¼Ç¼Ç¼£¬ÐèҪͣ¶Ù¡£ -4. ²¢·¢Çå³ý£º²»ÐèҪͣ¶Ù¡£ +1. ??????????????????? GC Roots ??????????????????????????? +2. ???????????? GC Roots Tracing ??????????????????????§Ü??????????????? +3. ???¡À?????????????????????????????????????????¡À????????????????????????????????? +4. ?????????????????? -ÔÚÕû¸ö¹ý³ÌÖкÄʱ×µÄ²¢·¢±ê¼ÇºÍ²¢·¢Çå³ý¹ý³ÌÖУ¬ÊÕ¼¯Æ÷Ï̶߳¼¿ÉÒÔÓëÓû§Ïß³ÌÒ»Æð¹¤×÷£¬²»ÐèÒª½øÐÐÍ£¶Ù¡£ +???????????§Ü????????????????????????§µ?????????????????????????????????????????? -¾ßÓÐÒÔÏÂȱµã£º +??????????? -1. ¶Ô CPU ×ÊÔ´Ãô¸Ð¡£CMS ĬÈÏÆô¶¯µÄ»ØÊÕÏß³ÌÊýÊÇ (CPU ÊýÁ¿ + 3) / 4£¬µ± CPU ²»×ã 4 ¸öʱ£¬CMS ¶ÔÓû§³ÌÐòµÄÓ°Ïì¾Í¿ÉÄܱäµÃºÜ´ó£¬Èç¹û±¾À´ CPU ¸ºÔؾͱȽϴ󣬻¹Òª·Ö³öÒ»°ëµÄÔËËãÄÜÁ¦È¥Ö´ÐÐÊÕ¼¯Æ÷Ị̈߳¬¾Í¿ÉÄܵ¼ÖÂÓû§³ÌÐòµÄÖ´ÐÐËٶȺöÈ»½µµÍÁË 50%£¬ÆäʵҲÈÃÈËÎÞ·¨½ÓÊÜ¡£²¢ÇÒµÍÍ£¶Ùʱ¼äÊÇÒÔÎþÉüÍÌÍÂÁ¿Îª´ú¼ÛµÄ£¬µ¼Ö CPU ÀûÓÃÂʱäµÍ¡£ +1. ?? CPU ??????§³?CMS ??????????????????? (CPU ???? + 3) / 4???? CPU ???? 4 ?????CMS ??????????????????¨²????????? CPU ???????????????????????????????????????????????????????????????????? 50%?????????????????????????????????????????????????????? CPU ????????? -2. ÎÞ·¨´¦Àí¸¡¶¯À¬»ø¡£ÓÉÓÚ²¢·¢ÇåÀí½×¶ÎÓû§Ï̻߳¹ÔÚÔËÐÐ×Å£¬°éËæ³ÌÐòÔËÐÐ×ÔÈ»¾Í»¹»áÓÐеÄÀ¬»ø²»¶Ï²úÉú¡£ÕâÒ»²¿·ÖÀ¬»ø³öÏÖÔÚ±ê¼Ç¹ý³ÌÖ®ºó£¬CMS ÎÞ·¨ÔÚµ±´ÎÊÕ¼¯Öд¦ÀíµôËüÃÇ£¬Ö»ºÃÁôµ½ÏÂÒ»´Î GC ʱÔÙÇåÀíµô£¬ÕâÒ»²¿·ÖÀ¬»ø¾Í±»³ÆÎª¡°¸¡¶¯À¬»ø¡±¡£Ò²ÊÇÓÉÓÚÔÚÀ¬»øÊÕ¼¯½×¶ÎÓû§Ï̻߳¹ÐèÒªÔËÐУ¬ÄÇÒ²¾Í»¹ÐèÒªÔ¤ÁôÓÐ×ã¹»µÄÄÚ´æ¿Õ¼ä¸øÓû§Ïß³ÌʹÓã¬Òò´ËËü²»ÄÜÏñÆäËûÊÕ¼¯Æ÷ÄÇÑùµÈµ½ÀÏÄê´ú¼¸ºõÍêÈ«±»ÌîÂúÁËÔÙ½øÐÐÊÕ¼¯£¬ÐèÒªÔ¤ÁôÒ»²¿·Ö¿Õ¼äÌṩ²¢·¢ÊÕ¼¯Ê±µÄ³ÌÐòÔË×÷ʹÓ᣿ÉÒÔʹÓà -XX:CMSInitiatingOccupancyFraction µÄÖµÀ´¸Ä±ä´¥·¢ÊÕ¼¯Æ÷¹¤×÷µÄÄÚ´æÕ¼Óðٷֱȣ¬JDK 1.5 ĬÈÏÉèÖÃϸÃֵΪ 68£¬Ò²¾ÍÊǵ±ÀÏÄê´úʹÓÃÁË 68% µÄ¿Õ¼äÖ®ºó»á´¥·¢ÊÕ¼¯Æ÷¹¤×÷¡£Èç¹û¸ÃÖµÉèÖõÄÌ«¸ß£¬µ¼Ö¸¡¶¯À¬»øÎÞ·¨±£´æ£¬ÄÇô¾Í»á³öÏÖ Concurrent Mode Failure£¬´ËʱÐéÄâ»ú½«Æô¶¯ºó±¸Ô¤°¸£ºÁÙʱÆôÓà Serial Old ÊÕ¼¯Æ÷À´ÖØÐ½øÐÐÀÏÄê´úµÄÀ¬»øÊÕ¼¯¡£ +2. ??????????????????????????????????????????????????????????????????????????????????????????????????????????CMS ????????????§Õ????????????????????? GC ?????????????????????????????????????????????????????????????????????????§µ??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????¨¢???????? -XX:CMSInitiatingOccupancyFraction ???????????????????????????????JDK 1.5 ???????????? 68?????????????????? 68% ?????????????????????????????????????????????????????—¨????????? Concurrent Mode Failure?????????????????????????????? Serial Old ?????????????????????????????? -3. ±ê¼Ç - Çå³ýËã·¨µ¼ÖµĿռäË鯬£¬¸ø´ó¶ÔÏó·ÖÅä´øÀ´ºÜ´óÂé·³£¬ÍùÍù³öÏÖÀÏÄê´ú¿Õ¼äÊ£Ó࣬µ«ÎÞ·¨ÕÒµ½×ã¹»´óÁ¬Ðø¿Õ¼äÀ´·ÖÅ䵱ǰ¶ÔÏ󣬲»µÃ²»Ìáǰ³ö·¢Ò»´Î Full GC¡£ +3. ??? - ??????????????????????????????????ú‘?????????????????????????????????????????????????????¨°??????????? Full GC?? -### 3.7 G1 ÊÕ¼¯Æ÷ +### 3.7 G1 ????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/f99ee771-c56f-47fb-9148-c0036695b5fe.jpg) -G1£¨Garbage-First£©ÊÕ¼¯Æ÷Êǵ±½ñÊÕ¼¯Æ÷¼¼Êõ·¢Õ¹×îÇ°ÑØµÄ³É¹ûÖ®Ò»£¬ËüÊÇÒ»¿îÃæÏò·þÎñ¶ËÓ¦ÓõÄÀ¬»øÊÕ¼¯Æ÷£¬HotSpot ¿ª·¢ÍŶӸ³ÓèËüµÄʹÃüÊÇ£¨ÔڱȽϳ¤ÆÚµÄ£©Î´À´¿ÉÒÔÌæ»»µô JDK 1.5 Öз¢²¼µÄ CMS ÊÕ¼¯Æ÷¡£ +G1??Garbage-First??????????????????????????????????????????????????????????????????HotSpot ?????????????????????????????¦Ä???????�I?? JDK 1.5 ?§Ù????? CMS ??????? -¾ß±¸ÈçÏÂÌØµã£º +?????????? -- ²¢ÐÐÓë²¢·¢£ºÄܳä·ÖÀûÓöà CPU »·¾³ÏµÄÓ²¼þÓÅÊÆ£¬Ê¹Óöà¸ö CPU À´Ëõ¶ÌÍ£¶Ùʱ¼ä£» -- ·Ö´úÊÕ¼¯£º·Ö´ú¸ÅÄîÒÀÈ»µÃÒÔ±£Áô£¬ËäÈ»Ëü²»ÐèÒªÆäËüÊÕ¼¯Æ÷ÅäºÏ¾ÍÄܶÀÁ¢¹ÜÀíÕû¸ö GC ¶Ñ£¬µ«ËüÄܹ»²ÉÓò»Í¬·½Ê½È¥´¦Àíд´½¨µÄ¶ÔÏóºÍÒÑ´æ»îÒ»¶Îʱ¼ä¡¢°¾¹ý¶à´Î GC µÄ¾É¶ÔÏóÀ´»ñÈ¡¸üºÃµÄÊÕ¼¯Ð§¹û¡£ -- ¿Õ¼äÕûºÏ£ºÕûÌåÀ´¿´ÊÇ»ùÓÚ¡°±ê¼Ç - ÕûÀí¡±Ë㷨ʵÏÖµÄÊÕ¼¯Æ÷£¬´Ó¾Ö²¿£¨Á½¸ö Region Ö®¼ä£©ÉÏÀ´¿´ÊÇ»ùÓÚ¡°¸´ÖÆ¡±Ë㷨ʵÏֵģ¬ÕâÒâζ×ÅÔËÐÐÆÚ¼ä²»»á²úÉúÄÚ´æ¿Õ¼äË鯬¡£ -- ¿ÉÔ¤²âµÄÍ£¶Ù£ºÕâÊÇËüÏà¶Ô CMS µÄÒ»´óÓÅÊÆ£¬½µµÍÍ£¶Ùʱ¼äÊÇ G1 ºÍ CMS ¹²Í¬µÄ¹Ø×¢µã£¬µ« G1 ³ýÁ˽µµÍÍ£¶ÙÍ⣬»¹Äܽ¨Á¢¿ÉÔ¤²âµÄÍ£¶Ùʱ¼äÄ£ÐÍ£¬ÄÜÈÃʹÓÃÕßÃ÷È·Ö¸¶¨ÔÚÒ»¸ö³¤¶ÈΪ M ºÁÃëµÄʱ¼äƬ¶ÎÄÚ£¬ÏûºÄÔÚ GC ÉϵÄʱ¼ä²»µÃ³¬¹ý N ºÁÃ룬Õ⼸ºõÒѾ­ÊÇʵʱ Java£¨RTSJ£©µÄÀ¬»øÊÕ¼¯Æ÷µÄÌØÕ÷ÁË¡£ +- ??????????????????? CPU ???????????????????? CPU ???????????? +- ??????????????????????????????????????????????????????????????? GC ?????????????¨°?????????????????????????????????????? GC ???????????????????§¹???? +- ????????????????????????? - ??????????????????????????? Region ???????????????????????????????¦Æ???????????????????????? +- ??????????????????? CMS ?????????????????????? G1 ?? CMS ??????????? G1 ???????????????????????????????????????????????????????????? M ???????????????????? GC ???????¨®??? N ??????????????? Java??RTSJ?????????????????????? -ÔÚ G1 ֮ǰµÄÆäËûÊÕ¼¯Æ÷½øÐÐÊÕ¼¯µÄ·¶Î§¶¼ÊÇÕû¸öÐÂÉú´ú»òÕßÀÏÉú´ú£¬¶ø G1 ²»ÔÙÊÇÕâÑù£¬Java ¶ÑµÄÄÚ´æ²¼¾ÖÓëÆäËûÊÕ¼¯Æ÷ÓкܴóÇø±ð£¬½«Õû¸ö Java ¶Ñ»®·ÖΪ¶à¸ö´óСÏàµÈµÄ¶ÀÁ¢ÇøÓò£¨Region£©¡£ËäÈ»»¹±£ÁôÐÂÉú´úºÍÀÏÄê´úµÄ¸ÅÄµ«ÐÂÉú´úºÍÀÏÄê´ú²»ÔÙÊÇÎïÀí¸ôÀëµÄÁË£¬¶ø¶¼ÊÇÒ»²¿·Ö Region£¨²»ÐèÒªÁ¬Ðø£©µÄ¼¯ºÏ¡£ +?? G1 ???????????????????????¦¶???????????????????????????? G1 ????????????Java ?????ÕÓ??????????????§Ü??????????? Java ???????????§³???????????Region?????????????????????????????????????????????????????????????????????????? Region??????????????????? -Ö®ËùÒÔÄܽ¨Á¢¿ÉÔ¤²âµÄÍ£¶Ùʱ¼äÄ£ÐÍ£¬ÊÇÒòΪËü¿ÉÒÔÓмƻ®µØ±ÜÃâÔÚÕû¸ö Java ¶ÑÖнøÐÐÈ«ÇøÓòµÄÀ¬»øÊÕ¼¯¡£Ëü¸ú×Ù¸÷¸ö Region ÀïÃæµÄÀ¬»ø¶Ñ»ýµÄ¼ÛÖµ´óС£¨»ØÊÕËù»ñµÃµÄ¿Õ¼ä´óСÒÔ¼°»ØÊÕËùÐèʱ¼äµÄ¾­ÑéÖµ£©£¬ÔÚºǫ́ά»¤Ò»¸öÓÅÏÈÁÐ±í£¬Ã¿´Î¸ù¾ÝÔÊÐíµÄÊÕ¼¯Ê±¼ä£¬ÓÅÏÈ»ØÊÕ¼ÛÖµ×î´óµÄ Region£¨ÕâÒ²¾ÍÊÇ Garbage-First Ãû³ÆµÄÀ´ÓÉ£©¡£ÕâÖÖʹÓà Region »®·ÖÄÚ´æ¿Õ¼äÒÔ¼°ÓÐÓÅÏȼ¶µÄÇøÓò»ØÊÕ·½Ê½£¬±£Ö¤ÁËËüÔÚÓÐÏÞµÄʱ¼äÄÚ¿ÉÒÔ»ñÈ¡¾¡¿ÉÄܸߵÄÊÕ¼¯Ð§ÂÊ¡£ +??????????????????????????????????????§Þ????????????? Java ???§ß??????????????????????????? Region ??????????????????§³???????????????§³??????????????????????????????????????§Ò???¦È??????????????????????????? Region????????? Garbage-First ??????????????????? Region ???????????????????????????????????????????????????????????????????§¹??? -Region ²»¿ÉÄÜÊǹÂÁ¢µÄ£¬Ò»¸ö¶ÔÏó·ÖÅäÔÚij¸ö Region ÖУ¬¿ÉÒÔÓëÕû¸ö Java ¶ÑÈÎÒâµÄ¶ÔÏó·¢ÉúÒýÓùØÏµ¡£ÔÚ×ö¿É´ïÐÔ·ÖÎöÈ·¶¨¶ÔÏóÊÇ·ñ´æ»îµÄʱºò£¬ÐèҪɨÃèÕû¸ö Java ¶Ñ²ÅÄܱ£Ö¤×¼È·ÐÔ£¬ÕâÏÔÈ»ÊÇ¶Ô GC ЧÂʵļ«´óÉ˺¦¡£ÎªÁ˱ÜÃâÈ«¶ÑɨÃèµÄ·¢Éú£¬Ã¿¸ö Region ¶¼Î¬»¤ÁËÒ»¸öÓëÖ®¶ÔÓ¦µÄ Remembered Set¡£ÐéÄâ»ú·¢ÏÖ³ÌÐòÔÚ¶Ô Reference ÀàÐ͵ÄÊý¾Ý½øÐÐд²Ù×÷ʱ£¬»á²úÉúÒ»¸ö Write Barrier ÔÝʱÖжÏд²Ù×÷£¬¼ì²é Reference ÒýÓõĶÔÏóÊÇ·ñ´¦ÓÚ²»Í¬µÄ Region Ö®ÖУ¬Èç¹ûÊÇ£¬±ãͨ¹ý CardTable °ÑÏà¹ØÒýÓÃÐÅÏ¢¼Ç¼µ½±»ÒýÓöÔÏóËùÊôµÄ Region µÄ Remembered Set Ö®ÖС£µ±½øÐÐÄÚ´æ»ØÊÕʱ£¬ÔÚ GC ¸ù½ÚµãµÄö¾Ù·¶Î§ÖмÓÈë Remembered Set ¼´¿É±£Ö¤²»¶ÔÈ«¶ÑɨÃèÒ²²»»áÓÐÒÅ©¡£ +Region ????????????????????????????? Region ?§µ??????????? Java ???????????????¨´?????????????????????????????????????????? Java ???????????????????? GC §¹???????????????????????????????? Region ?????????????????? Remembered Set????????????????? Reference ????????????§Õ??????????????? Write Barrier ????§Ø?§Õ????????? Reference ????????????????? Region ??§µ???????????? CardTable ???????????????????????????????? Region ?? Remembered Set ??§³?????????????????? GC ??????????¦¶?§Þ??? Remembered Set ???????????????????????????? -Èç¹û²»¼ÆËãά»¤ Remembered Set µÄ²Ù×÷£¬G1 ÊÕ¼¯Æ÷µÄÔË×÷´óÖ¿ɻ®·ÖΪÒÔϼ¸¸ö²½Ö裺 +???????????? Remembered Set ???????G1 ??????????????????????????????Ñs -1. ³õʼ±ê¼Ç -2. ²¢·¢±ê¼Ç -3. ×îÖÕ±ê¼Ç£ºÎªÁËÐÞÕýÔÚ²¢·¢±ê¼ÇÆÚ¼äÒòÓû§³ÌÐò¼ÌÐøÔË×÷¶øµ¼Ö±ê¼Ç²úÉú±ä¶¯µÄÄÇÒ»²¿·Ö±ê¼Ç¼Ç¼£¬ÐéÄâ»ú½«Õâ¶Îʱ¼ä¶ÔÏó±ä»¯¼Ç¼ÔÚÏß³ÌµÄ Remembered Set Logs ÀïÃæ£¬×îÖÕ±ê¼Ç½×¶ÎÐèÒª°Ñ Remembered Set Logs µÄÊý¾ÝºÏ²¢µ½ Remembered Set ÖС£Õâ½×¶ÎÐèҪͣ¶ÙỊ̈߳¬µ«Êǿɲ¢ÐÐÖ´ÐС£ -4. ɸѡ»ØÊÕ£ºÊ×ÏȶԸ÷¸ö Region ÖеĻØÊÕ¼ÛÖµºÍ³É±¾½øÐÐÅÅÐò£¬¸ù¾ÝÓû§ËùÆÚÍûµÄ GC Í£¶ÙÊÇʱ¼äÀ´Öƶ¨»ØÊռƻ®¡£´Ë½×¶ÎÆäʵҲ¿ÉÒÔ×öµ½ÓëÓû§³ÌÐòÒ»Æð²¢·¢Ö´ÐУ¬µ«ÊÇÒòΪֻ»ØÊÕÒ»²¿·Ö Region£¬Ê±¼äÊÇÓû§¿É¿ØÖƵ쬶øÇÒÍ£¶ÙÓû§Ï߳̽«´ó·ù¶ÈÌá¸ßÊÕ¼¯Ð§ÂÊ¡£ +1. ?????? +2. ??????? +3. ??????????????????????????????????????????????¡À??????????????????????????????????????�£????????? Remembered Set Logs ???—¨????????????? Remembered Set Logs ?????????? Remembered Set ?§³?????????????????????????§³? +4. ??????????????? Region ?§Ö???????????????????????????????? GC ????????????????????????????????????????????????????§µ?????????????????? Region??????????????????????????????????????????§¹??? -### 3.8 ÆßÖÖÀ¬»øÊÕ¼¯Æ÷µÄ±È½Ï +### 3.8 ????????????????? -| ÊÕ¼¯Æ÷ | ´®ÐС¢²¢ÐÐ or ²¢·¢ | ÐÂÉú´ú / ÀÏÄê´ú | Ëã·¨ | Ä¿±ê | ÊÊÓó¡¾° | +| ????? | ???§³????? or ???? | ?????? / ????? | ?? | ??? | ???¨®??? | | --- | --- | --- | --- | --- | --- | -| **Serial** | ´®ÐÐ | ÐÂÉú´ú | ¸´ÖÆËã·¨ | ÏìÓ¦ËÙ¶ÈÓÅÏÈ | µ¥ CPU »·¾³Ï嵀 Client ģʽ | -| **Serial Old** | ´®ÐÐ | ÀÏÄê´ú | ±ê¼Ç - ÕûÀí | ÏìÓ¦ËÙ¶ÈÓÅÏÈ | µ¥ CPU »·¾³Ï嵀 Client ģʽ¡¢CMS µÄºó±¸Ô¤°¸ | -| **ParNew** | ²¢ÐÐ | ÐÂÉú´ú | ¸´ÖÆËã·¨ | ÏìÓ¦ËÙ¶ÈÓÅÏÈ | ¶à CPU »·¾³Ê±ÔÚ Server ģʽÏÂÓë CMS ÅäºÏ | -| **Parallel Scavenge** | ²¢ÐÐ | ÐÂÉú´ú | ¸´ÖÆËã·¨ | ÍÌÍÂÁ¿ÓÅÏÈ | ÔÚºǫ́ÔËËã¶ø²»ÐèҪ̫¶à½»»¥µÄÈÎÎñ | -| **Parallel Old** | ²¢ÐÐ | ÀÏÄê´ú | ±ê¼Ç - ÕûÀí | ÍÌÍÂÁ¿ÓÅÏÈ | ÔÚºǫ́ÔËËã¶ø²»ÐèҪ̫¶à½»»¥µÄÈÎÎñ | -| **CMS** | ²¢·¢ | ÀÏÄê´ú | ±ê¼Ç - Çå³ý | ÏìÓ¦ËÙ¶ÈÓÅÏÈ | ¼¯ÖÐÔÚ»¥ÁªÍøÕ¾»ò B/S ϵͳ·þÎñ¶ËÉ쵀 Java Ó¦Óà | -| **G1** | ²¢·¢ | both | ±ê¼Ç - ÕûÀí + ¸´ÖÆËã·¨ | ÏìÓ¦ËÙ¶ÈÓÅÏÈ | ÃæÏò·þÎñ¶ËÓ¦Ó㬽«À´Ìæ»» CMS | +| **Serial** | ???? | ?????? | ?????? | ?????????? | ?? CPU ??????? Client ?? | +| **Serial Old** | ???? | ????? | ??? - ???? | ?????????? | ?? CPU ??????? Client ????CMS ?????? | +| **ParNew** | ???? | ?????? | ?????? | ?????????? | ?? CPU ??????? Server ?????? CMS ??? | +| **Parallel Scavenge** | ???? | ?????? | ?????? | ?????????? | ????????????????????????? | +| **Parallel Old** | ???? | ????? | ??? - ???? | ?????????? | ????????????????????????? | +| **CMS** | ???? | ????? | ??? - ??? | ?????????? | ?????????????? B/S ?????????? Java ??? | +| **G1** | ???? | both | ??? - ???? + ?????? | ?????????? | ?????????????????�I CMS | -## 4. ÄÚ´æ·ÖÅäÓë»ØÊÕ²ßÂÔ +## 4. ?????????????? -### 4.1 ÓÅÏÈÔÚ Eden ·ÖÅä +### 4.1 ?????? Eden ???? -´ó¶àÊýÇé¿öÏ£¬¶ÔÏóÔÚÐÂÉú´ú Eden Çø·ÖÅ䣬µ± Eden Çø¿Õ¼ä²»¹»Ê±£¬·¢Æð Minor GC£» +??????????????????????? Eden ???????? Eden ?????????????? Minor GC?? -### 4.2 ´ó¶ÔÏóÖ±½Ó½øÈëÀÏÄê´ú +### 4.2 ???????????????? -Ìṩ -XX:PretenureSizeThreshold ²ÎÊý£¬´óÓÚ´ËÖµµÄ¶ÔÏóÖ±½ÓÔÚÀÏÄê´ú·ÖÅ䣬±ÜÃâÔÚ Eden ÇøºÍ Survivor ÇøÖ®¼äµÄ´óÁ¿ÄÚ´æ¸´ÖÆ£» -### 4.3 ³¤ÆÚ´æ»îµÄ¶ÔÏó½øÈëÀÏÄê´ú +?? -XX:PretenureSizeThreshold ????????????????????????????????????? Eden ???? Survivor ???????????¿Ê??? +### 4.3 ?????????????????? -JVM Ϊ¶ÔÏó¶¨ÒåÄêÁ伯ÊýÆ÷£¬¾­¹ý Minor GC ÒÀÈ»´æ»îÇÒ±» Survivor ÇøÈÝÄɵģ¬Òƶ¯µ½ Survivor Çø£¬ÄêÁä¼Ó 1£¬Ã¿¾­ÀúÒ»´Î Minor GC ²»±»ÇåÀíÔòÄêÁä¼Ó 1£¬Ôö¼Óµ½Ò»¶¨ÄêÁäÔòÒÆ¶¯µ½ÀÏÄêÇø£¨Ä¬ÈÏ 15 Ë꣬ͨ¹ý -XX:MaxTenuringThreshold ÉèÖã©£» +JVM ?????????????????????? Minor GC ????????? Survivor ????????????? Survivor ????????? 1?????????? Minor GC ??????????????? 1???????????????????????????????? 15 ????? -XX:MaxTenuringThreshold ??????? -### 4.4 ¶¯Ì¬¶ÔÏóÄêÁäÅж¨ +### 4.4 ????????????§Ø? -Èô Survivor ÇøÖÐͬÄêÁäËùÓжÔÏó´óС×ܺʹóÓÚ Survivor ¿Õ¼äÒ»°ë£¬ÔòÄêÁä´óÓÚµÈÓÚ¸ÃÄêÁäµÄ¶ÔÏó¿ÉÒÔÖ±½Ó½øÈëÀÏÄê´ú£» +?? Survivor ????????????§Ø????§³?????? Survivor ??????????????????????????????????????????? -### 4.5 ¿Õ¼ä·ÖÅäµ£±£ +### 4.5 ???????? -ÔÚ·¢Éú Minor GC ֮ǰ£¬JVM Ïȼì²éÀÏÄê´ú×î´ó¿ÉÓÃÁ¬Ðø¿Õ¼äÊÇ·ñ´óÓÚÐÂÉú´úËùÓжÔÏó×ܿռ䣬³ÉÁ¢µÄ»° Minor GC È·ÈÏÊǰ²È«µÄ£»·ñÔò¼ÌÐø¼ì²éÀÏÄê´ú×î´ó¿ÉÓÃÁ¬Ðø¿Õ¼äÊÇ·ñ´óÓÚÀú´Î½úÉýµ½ÀÏÄê´ú¶ÔÏóµÄƽ¾ù´óС£¬´óÓڵϰ½øÐÐ Minor GC£¬Ð¡Óڵϰ½øÐÐ Full GC¡£ +????? Minor GC ????JVM ?????????????????????????????????????§Ø?????????????? Minor GC ???????????????????????????????????????????????¦Í????????????????????§³???????????? Minor GC??§³???????? Full GC?? -## 4.6 Full GC µÄ´¥·¢Ìõ¼þ +## 4.6 Full GC ????????? -¶ÔÓÚ Minor GC£¬Æä´¥·¢Ìõ¼þ·Ç³£¼òµ¥£¬µ± Eden Çø¿Õ¼äÂúʱ£¬¾Í½«´¥·¢Ò»´Î Minor GC¡£¶ø Full GC ÔòÏà¶Ô¸´ÔÓ£¬ÓÐÒÔÏÂÌõ¼þ£º +???? Minor GC?????????????????? Eden ???????????????????? Minor GC???? Full GC ????????????????????? -### 4.6.1 µ÷Óà System.gc() +### 4.6.1 ???? System.gc() -´Ë·½·¨µÄµ÷ÓÃÊǽ¨Òé JVM ½øÐÐ Full GC£¬ËäȻֻÊǽ¨Òé¶ø·ÇÒ»¶¨£¬µ«ºÜ¶àÇé¿öÏÂËü»á´¥·¢ Full GC£¬´Ó¶øÔö¼Ó Full GC µÄƵÂÊ£¬Ò²¼´Ôö¼ÓÁ˼äЪÐÔÍ£¶ÙµÄ´ÎÊý¡£Òò´ËÇ¿ÁÒ½¨ÒéÄܲ»Ê¹Óô˷½·¨¾Í²»ÒªÊ¹Óã¬ÈÃÐéÄâ»ú×Ô¼ºÈ¥¹ÜÀíËüµÄÄڴ棬¿Éͨ¹ý -XX:+ DisableExplicitGC À´½ûÖ¹ RMI µ÷Óà System.gc()¡£ +??????????????? JVM ???? Full GC??????????????????????????????????? Full GC????????? Full GC ????????????????§¼???????????????????????????????????????????????????????????—¨????? -XX:+ DisableExplicitGC ????? RMI ???? System.gc()?? -### 4.6.2 ÀÏÄê´ú¿Õ¼ä²»×ã +### 4.6.2 ?????????? -ÀÏÄê´ú¿Õ¼ä²»×ãµÄ³£¼û³¡¾°ÎªÇ°ÎÄËù½²µÄ´ó¶ÔÏóÖ±½Ó½øÈëÀÏÄê´ú¡¢³¤ÆÚ´æ»îµÄ¶ÔÏó½øÈëÀÏÄê´úµÈ£¬µ±Ö´ÐÐ Full GC ºó¿Õ¼äÈÔÈ»²»×㣬ÔòÅ׳öÈçÏ´íÎó£º Java.lang.OutOfMemoryError: Java heap space Ϊ±ÜÃâÒÔÉÏÁ½ÖÖ×´¿öÒýÆðµÄ Full GC£¬µ÷ÓÅʱӦ¾¡Á¿×öµ½ÈöÔÏóÔÚ Minor GC ½×¶Î±»»ØÊÕ¡¢ÈöÔÏóÔÚÐÂÉú´ú¶à´æ»îÒ»¶Îʱ¼ä¼°²»Òª´´½¨¹ý´óµÄ¶ÔÏó¼°Êý×é¡£ +??????????????????????????????????????????????????????????????????????? Full GC ??????????????????????? Java.lang.OutOfMemoryError: Java heap space ????????????????????? Full GC??????????????????????? Minor GC ??¦Á????????????????????????????¹À??????????????????î• -### 4.6.3 ¿Õ¼ä·ÖÅäµ£±£Ê§°Ü +### 4.6.3 ??????????? -ʹÓø´ÖÆËã·¨µÄ Minor GC ÐèÒªÀÏÄê´úµÄÄÚ´æ¿Õ¼ä×÷µ£±££¬Èç¹û³öÏÖÁË HandlePromotionFailure µ£±£Ê§°Ü£¬Ôò»á´¥·¢ Full GC¡£ +?????????? Minor GC ???????????????????????????????? HandlePromotionFailure ????????????? Full GC?? -### 4.6.4 JDK 1.7 ¼°ÒÔǰµÄÓÀ¾Ã´ú¿Õ¼ä²»×ã +### 4.6.4 JDK 1.7 ????????????????? -ÔÚ JDK 1.7 ¼°ÒÔǰ£¬HotSpot ÐéÄâ»úÖеķ½·¨ÇøÊÇÓÃÓÀ¾Ã´úʵÏֵģ¬ÓÀ¾Ã´úÖдæ·ÅµÄΪһЩ class µÄÐÅÏ¢¡¢³£Á¿¡¢¾²Ì¬±äÁ¿µÈÊý¾Ý£¬µ±ÏµÍ³ÖÐÒª¼ÓÔØµÄÀà¡¢·´ÉäµÄÀàºÍµ÷Óõķ½·¨½Ï¶àʱ£¬Permanet Generation ¿ÉÄܻᱻռÂú£¬ÔÚδÅäÖÃΪ²ÉÓà CMS GC µÄÇé¿öÏÂÒ²»áÖ´ÐÐ Full GC¡£Èç¹û¾­¹ý Full GC ÈÔÈ»»ØÊÕ²»ÁË£¬ÄÇô JVM »áÅ׳öÈçÏ´íÎóÐÅÏ¢£ºjava.lang.OutOfMemoryError: PermGen space Ϊ±ÜÃâ PermGen Õ¼ÂúÔì³É Full GC ÏÖÏ󣬿ɲÉÓõķ½·¨ÎªÔö´ó PermGen ¿Õ¼ä»òתΪʹÓà CMS GC¡£ +?? JDK 1.7 ???????HotSpot ??????§Ö??????????????????????????§Õ?????§» class ??????????????????????????????????????????????????????????????Permanet Generation ????????????¦Ä????????? CMS GC ????????????? Full GC????????? Full GC ?????????????? JVM ?????????????????java.lang.OutOfMemoryError: PermGen space ????? PermGen ?????? Full GC ????????????????? PermGen ????????? CMS GC?? -ÔÚ JDK 1.8 ÖÐÓÃÔª¿Õ¼äÌæ»»ÁËÓÀ¾Ã´ú×÷Ϊ·½·¨ÇøµÄʵÏÖ£¬Ôª¿Õ¼äÊDZ¾µØÄڴ棬Òò´Ë¼õÉÙÁËÒ»ÖÖ Full GC ´¥·¢µÄ¿ÉÄÜÐÔ¡£ +?? JDK 1.8 ?????????�I?????????????????????????????????—¨??????????? Full GC ???????????? ### 4.6.5 Concurrent Mode Failure -Ö´ÐÐ CMS GC µÄ¹ý³ÌÖÐͬʱÓжÔÏóÒª·ÅÈëÀÏÄê´ú£¬¶ø´ËʱÀÏÄê´ú¿Õ¼ä²»×㣨ÓÐʱºò¡°¿Õ¼ä²»×㡱ÊÇ CMS GC ʱµ±Ç°µÄ¸¡¶¯À¬»ø¹ý¶àµ¼ÖÂÔÝʱÐԵĿռ䲻×ã´¥·¢ Full GC£©£¬±ã»á±¨ Concurrent Mode Failure ´íÎ󣬲¢´¥·¢ Full GC¡£ +??? CMS GC ??????????§Ø????????????????????????????????????????? CMS GC ??????????????????????????????? Full GC??????? Concurrent Mode Failure ????????? Full GC?? -# Àà¼ÓÔØ»úÖÆ +# ???????? -ÀàÊÇÔÚÔËÐÐÆÚ¼ä¶¯Ì¬¼ÓÔØµÄ¡£ +???????????????????? -## 1 ÀàµÄÉúÃüÖÜÆÚ +## 1 ??????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/32b8374a-e822-4720-af0b-c0f485095ea2.jpg) -°üÀ¨ÒÔÏ 7 ¸ö½×¶Î£º +???????? 7 ????¦²? -- **¼ÓÔØ£¨Loading£©** -- **ÑéÖ¤£¨Verification£©** -- **×¼±¸£¨Preparation£©** -- **½âÎö£¨Resolution£©** -- **³õʼ»¯£¨Initialization£©** -- ʹÓã¨Using£© -- Ð¶ÔØ£¨Unloading£© +- **?????Loading??** +- **?????Verification??** +- **?????Preparation??** +- **??????Resolution??** +- **???????Initialization??** +- ????Using?? +- §Ø???Unloading?? -ÆäÖнâÎö¹ý³ÌÔÚijЩÇé¿öÏ¿ÉÒÔÔÚ³õʼ»¯½×¶ÎÖ®ºóÔÙ¿ªÊ¼£¬ÕâÊÇΪÁËÖ§³Ö Java µÄ¶¯Ì¬°ó¶¨¡£ +???§ß??????????§»???????????????????????????????????? Java ??????? -## 2. Àà³õʼ»¯Ê±»ú +## 2. ????????? -ÐéÄâ»ú¹æ·¶Öв¢Ã»ÓÐÇ¿ÖÆÔ¼ÊøºÎʱ½øÐмÓÔØ£¬µ«Êǹ淶Ñϸñ¹æ¶¨ÁËÓÐÇÒÖ»ÓÐÏÂÁÐÎåÖÖÇé¿ö±ØÐë¶ÔÀà½øÐгõʼ»¯£º( ¼ÓÔØ¡¢ÑéÖ¤¡¢×¼±¸¶¼»áËæ×Å·¢Éú ) +??????œZ?§Ó????????????????§Þ????????œZ???ÕÇ?????????????????????????????§Ô??????( ???????????????????????? ) -1. Óöµ½ new¡¢getstatic¡¢putstatic¡¢invokestatic ÕâËÄÌõ×Ö½ÚÂëÖ¸Áîʱ£¬Èç¹ûÀàûÓнøÐйý³õʼ»¯£¬Ôò±ØÐëÏÈ´¥·¢Æä³õʼ»¯¡£×î³£¼ûµÄÉú³ÉÕâ 4 ÌõÖ¸ÁîµÄ³¡¾°ÊÇ£ºÊ¹Óà new ¹Ø¼ü×ÖʵÀý»¯¶ÔÏóµÄʱºò£»¶ÁÈ¡»òÉèÖÃÒ»¸öÀàµÄ¾²Ì¬×ֶΣ¨±» final ÐÞÊΡ¢ÒÑÔÚ±àÒëÆ÷°Ñ½á¹û·ÅÈë³£Á¿³ØµÄ¾²Ì¬×ֶγýÍ⣩µÄʱºò£»ÒÔ¼°µ÷ÓÃÒ»¸öÀàµÄ¾²Ì¬·½·¨µÄʱºò¡£ +1. ???? new??getstatic??putstatic??invokestatic ????????????????????????§ß??§Û?????????????????????????????????????? 4 ??????????????? new ????????????????????????????????????¦²??? final ???¦±???????????????????????????¦Ã???????????????????????????????? -2. ʹÓà java.lang.reflect °üµÄ·½·¨¶ÔÀà½øÐз´Éäµ÷ÓõÄʱºò£¬Èç¹ûÀàûÓнøÐгõʼ»¯£¬ÔòÐèÒªÏÈ´¥·¢Æä³õʼ»¯¡£ +2. ??? java.lang.reflect ?????????????§Ù?????????????????§ß??§Ô???????????????????????? -3. µ±³õʼ»¯Ò»¸öÀàµÄʱºò£¬Èç¹û·¢Ï֯䏏À໹ûÓнøÐйý³õʼ»¯£¬ÔòÐèÒªÏÈ´¥·¢Æä¸¸ÀàµÄ³õʼ»¯¡£ +3. ????????????????????????Íè????§ß??§Û???????????????????Íè????????? -4. µ±ÐéÄâ»úÆô¶¯Ê±£¬Óû§ÐèÒªÖ¸¶¨Ò»¸öÒªÖ´ÐеÄÖ÷Àࣨ°üº¬ main() ·½·¨µÄÄǸöÀࣩ£¬ÐéÄâ»ú»áÏȳõʼ»¯Õâ¸öÖ÷Àࣻ +4. ?????????????????????????????§Ö????????? main() ????????????????????????????????? -5. µ±Ê¹Óà jdk1.7 µÄ¶¯Ì¬ÓïÑÔÖ§³Öʱ£¬Èç¹ûÒ»¸ö java.lang.invoke.MethodHandle ʵÀý×îºóµÄ½âÎö½á¹ûΪ REF_getStatic, REF_putStatic, REF_invokeStatic µÄ·½·¨¾ä±ú£¬²¢ÇÒÕâ¸ö·½·¨¾ä±úËù¶ÔÓ¦µÄÀàûÓнøÐйý³õʼ»¯£¬ÔòÐèÒªÏÈ´¥·¢Æä³õʼ»¯£» +5. ????? jdk1.7 ???????????????????? java.lang.invoke.MethodHandle ?????????????? REF_getStatic, REF_putStatic, REF_invokeStatic ???????????????????????????????????§ß??§Û?????????????????????????? -ÒÔÉÏ 5 ÖÖ³¡¾°ÖеÄÐÐΪ³ÆÎª¶ÔÒ»¸öÀà½øÐÐÖ÷¶¯ÒýÓᣳý´ËÖ®Í⣬ËùÓÐÒýÓÃÀàµÄ·½Ê½¶¼²»»á´¥·¢³õʼ»¯£¬³ÆÎª±»¶¯ÒýÓᣱ»¶¯ÒýÓõij£¼ûÀý×Ó°üÀ¨£º +???? 5 ??????§Ö????????????????????????¨¢??????????????????????????????????????????????¨¢?????????????????????? -1\. ͨ¹ý×ÓÀàÒýÓø¸ÀàµÄ¾²Ì¬×ֶΣ¬²»»áµ¼ÖÂ×ÓÀà³õʼ»¯¡£ +1\. ???????????????????¦²????????????????? ```java -System.out.println(SubClass.value); // value ×Ö¶ÎÔÚ SuperClass Öж¨Òå +System.out.println(SubClass.value); // value ????? SuperClass ?§Ø??? ``` -2\. ͨ¹ýÊý×鶨ÒåÀ´ÒýÓÃÀ࣬²»»á´¥·¢´ËÀàµÄ³õʼ»¯¡£¸Ã¹ý³Ì»á¶ÔÊý×éÀà½øÐгõʼ»¯£¬Êý×éÀàÊÇÒ»¸öÓÉÐéÄâ»ú×Ô¶¯Éú³ÉµÄ¡¢Ö±½Ó¼Ì³Ð×Ô Object µÄ×ÓÀ࣬ÆäÖаüº¬ÁËÊý×éµÄÊôÐԺͷ½·¨¡£ +2\. ??????úE????????????????????????????¨´?????????????§Ô???????????????????????????????????????? Object ?????????§Ñ???????????????????? ```java SuperClass[] sca = new SuperClass[10]; ``` -3\. ³£Á¿ÔÚ±àÒë½×¶Î»á´æÈëµ÷ÓÃÀàµÄ³£Á¿³ØÖУ¬±¾ÖÊÉϲ¢Ã»ÓÐÖ±½ÓÒýÓõ½¶¨Òå³£Á¿µÄÀ࣬Òò´Ë²»»á´¥·¢¶¨Òå³£Á¿µÄÀàµÄ³õʼ»¯¡£ +3\. ??????????¦Ë????????????????§µ??????????????????????�i?????????????????�i????????????? ```java System.out.println(ConstClass.HELLOWORLD); ``` -## 3. Àà¼ÓÔØ¹ý³Ì +## 3. ???????? -°üº¬Á˼ÓÔØ¡¢ÑéÖ¤¡¢×¼±¸¡¢½âÎöºÍ³õʼ»¯Õâ 5 ¸ö½×¶Î¡£ +???????????????????????????????? 5 ????¦±? -### 3.1 ¼ÓÔØ +### 3.1 ???? -¼ÓÔØÊÇÀà¼ÓÔØµÄÒ»¸ö½×¶Î£¬×¢Òâ²»Òª»ìÏý¡£ +?????????????????¦²??????????? -¼ÓÔØ¹ý³ÌÍê³ÉÒÔÏÂÈý¼þÊ£º +????????????????????? -1. ͨ¹ýÒ»¸öÀàµÄÈ«ÏÞ¶¨ÃûÀ´»ñÈ¡¶¨Òå´ËÀàµÄ¶þ½øÖÆ×Ö½ÚÁ÷¡£ -2. ½«Õâ¸ö×Ö½ÚÁ÷Ëù´ú±íµÄ¾²Ì¬´æ´¢½á¹¹×ª»¯Îª·½·¨ÇøµÄÔËÐÐʱ´æ´¢½á¹¹¡£ -3. ÔÚÄÚ´æÖÐÉú³ÉÒ»¸ö´ú±íÕâ¸öÀàµÄ Class ¶ÔÏó£¬×÷Ϊ·½·¨ÇøÕâ¸öÀàµÄ¸÷ÖÖÊý¾ÝµÄ·ÃÎÊÈë¿Ú¡£ +1. ???????????????????????????????????????? +2. ????????????????????›¥????????????????????›¥???? +3. ???????????????????????? Class ?????????????????????????????????? -ÆäÖжþ½øÖÆ×Ö½ÚÁ÷¿ÉÒÔ´ÓÒÔÏ·½Ê½ÖлñÈ¡£º +???§Ø??????????????????¡¤???§Ý???? -- ´Ó ZIP °ü¶ÁÈ¡£¬ÕâºÜ³£¼û£¬×îÖÕ³ÉΪÈÕºó JAR¡¢EAR¡¢WAR ¸ñʽµÄ»ù´¡¡£ -- ´ÓÍøÂçÖлñÈ¡£¬ÕâÖÖ³¡¾°×îµäÐ͵ÄÓ¦ÓÃÊÇ Applet¡£ -- ÔËÐÐʱ¼ÆËãÉú³É£¬ÕâÖÖ³¡¾°Ê¹ÓõÃ×î¶àµÃ¾ÍÊǶ¯Ì¬´úÀí¼¼Êõ£¬ÔÚ java.lang.reflect.Proxy ÖУ¬¾ÍÊÇÓÃÁË ProxyGenerator.generateProxyClass µÄ´úÀíÀàµÄ¶þ½øÖÆ×Ö½ÚÁ÷¡£ -- ÓÉÆäËûÎļþÉú³É£¬µäÐͳ¡¾°ÊÇ JSP Ó¦Ó㬼´ÓÉ JSP ÎļþÉú³É¶ÔÓ¦µÄ Class Àà¡£ -- ´ÓÊý¾Ý¿â¶ÁÈ¡£¬ÕâÖÖ³¡¾°Ïà¶ÔÉÙ¼û£¬ÀýÈçÓÐЩÖмä¼þ·þÎñÆ÷£¨Èç SAP Netweaver£©¿ÉÒÔÑ¡Ôñ°Ñ³ÌÐò°²×°µ½Êý¾Ý¿âÖÐÀ´Íê³É³ÌÐò´úÂëÔÚ¼¯Èº¼äµÄ·Ö·¢¡£ +- ?? ZIP ???????????????????????? JAR??EAR??WAR ?????????? +- ???????§Ý?????????????????????? Applet?? +- ???????????????????????????????????????????? java.lang.reflect.Proxy ?§µ????????? ProxyGenerator.generateProxyClass ???????????????????? +- ??????????????????????? JSP ???????? JSP ??????????? Class ?? +- ????????????????????????????????§»?§Þ???????????? SAP Netweaver????????????????????????????????????????????? ... -### 3.2 ÑéÖ¤ +### 3.2 ??? -È·±£ Class ÎļþµÄ×Ö½ÚÁ÷Öаüº¬µÄÐÅÏ¢·ûºÏµ±Ç°ÐéÄâ»úµÄÒªÇ󣬲¢ÇÒ²»»áΣº¦ÐéÄâ»ú×ÔÉíµÄ°²È«¡£ +??? Class ???????????§Ñ??????????????????????????????¦²???????????????? -Ö÷ÒªÓÐÒÔÏ 4 ¸ö½×¶Î£º +????????? 4 ????¦²? -1. Îļþ¸ñʽÑéÖ¤ -2. ÔªÊý¾ÝÑéÖ¤£¨¶Ô×Ö½ÚÂëÃèÊöµÄÐÅÏ¢½øÐÐÓïÒå·ÖÎö£© -3. ×Ö½ÚÂëÑéÖ¤£¨Í¨¹ýÊý¾ÝÁ÷ºÍ¿ØÖÆÁ÷·ÖÎö£¬È·±£³ÌÐòÓïÒåÊǺϷ¨¡¢·ûºÏÂß¼­µÄ£¬½«¶ÔÀàµÄ·½·¨Ìå½øÐÐУÑé·ÖÎö£© -4. ·ûºÅÒýÓÃÑéÖ¤ +1. ????????? +2. ??????????????????????????????????????? +3. ??????????????????????????????????????????????????????????????????????????§µ??????? +4. ??????????? -### 3.3 ×¼±¸ +### 3.3 ??? -Àà±äÁ¿ÊDZ» static ÐÞÊεıäÁ¿£¬×¼±¸½×¶ÎΪÀà±äÁ¿·ÖÅäÄÚ´æ²¢ÉèÖóõʼֵ£¬Ê¹ÓõÄÊÇ·½·¨ÇøµÄÄÚ´æ¡£ +???????? static ???¦Å????????????????????????›g???¨®????????????????????µµ -ʵÀý±äÁ¿²»»áÔÚÕâ½×¶Î·ÖÅäÄڴ棬Ëü½«»áÔÚ¶ÔÏóʵÀý»¯Ê±Ëæ×ŶÔÏóÒ»Æð·ÖÅäÔÚ Java ¶ÑÖС£ +????????????????¦Ç?????—¨???????????????????????????????? Java ???§³? -³õʼֵһ°ãΪ 0 Öµ£¬ÀýÈçÏÂÃæµÄÀà±äÁ¿ value ±»³õʼ»¯Îª 0 ¶ø²»ÊÇ 123¡£ +???????? 0 ????????????????? value ???????? 0 ?????? 123?? ```java public static int value = 123; ``` -Èç¹ûÀà±äÁ¿Êdz£Á¿£¬ÄÇô»á°´ÕÕ±í´ïʽÀ´½øÐгõʼ»¯£¬¶ø²»ÊǸ³ÖµÎª 0¡£ +??????????????????????????????§Ô??????????????? 0?? ```java public static final int value = 123; ``` -### 3.4 ½âÎö +### 3.4 ???? -½«³£Á¿³ØµÄ·ûºÅÒýÓÃÌæ»»ÎªÖ±½ÓÒýÓõĹý³Ì¡£ +?????????????????�I????????????? -### 3.5 ³õʼ»¯ +### 3.5 ????? -³õʼ»¯½×¶Î¼´ÐéÄâ»úÖ´ÐÐÀ๹ÔìÆ÷ <clinit>() ·½·¨µÄ¹ý³Ì¡£ +???????¦Ì??????????????? <clinit>() ?????????? -ÔÚ×¼±¸½×¶Î£¬Àà±äÁ¿ÒѾ­¸³¹ýÒ»´ÎϵͳҪÇóµÄ³õʼֵ£¬¶øÔÚ³õʼ»¯½×¶Î£¬¸ù¾Ý³ÌÐòԱͨ¹ý³ÌÐòÖÆ¶¨µÄÖ÷¹Û¼Æ»®È¥³õʼ»¯Àà±äÁ¿ºÍÆäËü×ÊÔ´¡£ +???????¦²?????????????????????????????????????¦²????????????????????????????????????????????????? -<clinit>() ·½·¨¾ßÓÐÒÔÏÂÌØµã£º +<clinit>() ??????????????? -- ÊÇÓɱàÒëÆ÷×Ô¶¯ÊÕ¼¯ÀàÖÐËùÓÐÀà±äÁ¿µÄ¸³Öµ¶¯×÷ºÍ¾²Ì¬Óï¾ä¿é£¨static{} ¿é£©ÖеÄÓï¾äºÏ²¢²úÉúµÄ£¬±àÒëÆ÷ÊÕ¼¯µÄ˳ÐòÓÉÓï¾äÔÚÔ´ÎļþÖгöÏÖµÄ˳Ðò¾ö¶¨¡£Ìرð×¢ÒâµÄÊÇ£¬¾²Ì¬Óï¾ä¿éÖ»ÄÜ·ÃÎʵ½¶¨ÒåÔÚËü֮ǰµÄÀà±äÁ¿£¬¶¨ÒåÔÚËüÖ®ºóµÄÀà±äÁ¿Ö»Äܸ³Öµ£¬²»ÄÜ·ÃÎÊ¡£ÀýÈçÒÔÏ´úÂ룺 +- ???????????????????????????????????????????÷Ïstatic{} ?ï‚?§Ö???????????????????????????????????????§Ô?????????????????????????????????????????????????????????????????????????????????????????????????? ```java public class Test { static { - i = 0; // ¸ø±äÁ¿¸³Öµ¿ÉÒÔÕý³£±àÒëͨ¹ý - System.out.print(i); // Õâ¾ä±àÒëÆ÷»áÌáʾ¡°·Ç·¨ÏòǰÒýÓá± + i = 0; // ???????????????????????? + System.out.print(i); // ????????????????????????¨¢? } static int i = 1; } ``` -- ÓëÀàµÄ¹¹Ô캯Êý£¨»òÕß˵ʵÀý¹¹ÔìÆ÷ <init>()£©²»Í¬£¬²»ÐèÒªÏÔʽµÄµ÷Óø¸ÀàµÄ¹¹ÔìÆ÷¡£ÐéÄâ»ú»á×Ô¶¯±£Ö¤ÔÚ×ÓÀàµÄ <clinit>() ·½·¨ÔËÐÐ֮ǰ£¬¸¸ÀàµÄ <clinit>() ·½·¨ÒѾ­Ö´ÐнáÊø¡£Òò´ËÐéÄâ»úÖеÚÒ»¸öÖ´ÐÐ <clinit>() ·½·¨µÄÀà¿Ï¶¨Îª java.lang.Object¡£ +- ?????????????????????????? <init>()??????????????????????????????????????????????????? <clinit>() ????????????????? <clinit>() ?????????§ß??????????????§Ö??????? <clinit>() ??????????? java.lang.Object?? -- ÓÉÓÚ¸¸ÀàµÄ <clinit>() ·½·¨ÏÈÖ´ÐУ¬Ò²¾ÍÒâζן¸ÀàÖж¨ÒåµÄ¾²Ì¬Óï¾ä¿éÒªÓÅÓÚ×ÓÀàµÄ±äÁ¿¸³Öµ²Ù×÷¡£ÀýÈçÒÔÏ´úÂ룺 +- ???????? <clinit>() ????????§µ??????¦Æ??????§Ø??????????????????????????????????????????? ```java static class Parent { @@ -573,53 +573,53 @@ static class Sub extends Parent { } public static void main(String[] args) { - System.out.println(Sub.B); // Êä³ö½á¹ûÊǸ¸ÀàÖеľ²Ì¬±äÁ¿Öµ A£¬Ò²¾ÍÊÇ 2 + System.out.println(Sub.B); // ????????????§Ö???????? A??????? 2 } ``` -- <clinit>() ·½·¨¶ÔÓÚÀà»ò½Ó¿Ú²»ÊDZØÐëµÄ£¬Èç¹ûÒ»¸öÀàÖв»°üº¬¾²Ì¬Óï¾ä¿é£¬Ò²Ã»ÓжÔÀà±äÁ¿µÄ¸³Öµ²Ù×÷£¬±àÒëÆ÷¿ÉÒÔ²»Îª¸ÃÀàÉú³É <clinit>() ·½·¨¡£ +- <clinit>() ??????????????????????????????§Ó???????????ï…???§Ø???????????????????????????????????? <clinit>() ?????? -- ½Ó¿ÚÖв»¿ÉÒÔʹÓþ²Ì¬Óï¾ä¿é£¬µ«ÈÔÈ»ÓÐÀà±äÁ¿³õʼ»¯µÄ¸³Öµ²Ù×÷£¬Òò´Ë½Ó¿ÚÓëÀàÒ»Ñù¶¼»áÉú³É <clinit>() ·½·¨¡£µ«½Ó¿ÚÓëÀ಻ͬµÄÊÇ£¬Ö´ÐÐ½Ó¿ÚµÄ <clinit>() ·½·¨²»ÐèÒªÏÈÖ´Ðи¸½Ó¿ÚµÄ <clinit>() ·½·¨¡£Ö»Óе±¸¸½Ó¿ÚÖж¨ÒåµÄ±äÁ¿Ê¹ÓÃʱ£¬¸¸½Ó¿Ú²Å»á³õʼ»¯¡£ÁíÍ⣬½Ó¿ÚµÄʵÏÖÀàÔÚ³õʼ»¯Ê±Ò²Ò»Ñù²»»áÖ´ÐÐ½Ó¿ÚµÄ <clinit>() ·½·¨¡£ +- ????§Ó?????????????ï…??????????????????????????????????????????????? <clinit>() ???????????????????????§ß??? <clinit>() ?????????????§Ú????? <clinit>() ????????§Ö???????§Ø????????????????????????????????????????????????????????§ß??? <clinit>() ?????? -- ÐéÄâ»ú»á±£Ö¤Ò»¸öÀàµÄ <clinit>() ·½·¨ÔÚ¶àÏ̻߳·¾³Ï±»ÕýÈ·µÄ¼ÓËøºÍͬ²½£¬Èç¹û¶à¸öÏß³Ìͬʱ³õʼ»¯Ò»¸öÀֻ࣬»áÓÐÒ»¸öÏß³ÌÖ´ÐÐÕâ¸öÀàµÄ <clinit>() ·½·¨£¬ÆäËüÏ̶߳¼»á×èÈûµÈ´ý£¬Ö±µ½»î¶¯Ïß³ÌÖ´ÐÐ <clinit>() ·½·¨Íê±Ï¡£Èç¹ûÔÚÒ»¸öÀàµÄ <clinit>() ·½·¨ÖÐÓкÄʱµÄ²Ù×÷£¬¾Í¿ÉÄÜÔì³É¶à¸ö½ø³Ì×èÈû£¬ÔÚʵ¼Ê¹ý³ÌÖдËÖÖ×èÈûºÜÒþ±Î¡£ +- ?????????????? <clinit>() ??????????????¡À????????????????????????????????????????????????????????? <clinit>() ???????????????????????????????????? <clinit>() ??????????????????? <clinit>() ???????§Ü??????????????????????????????????????§Õ????????????¦±? -## 4. Àà¼ÓÔØÆ÷ +## 4. ??????? -ÐéÄâ»úÉè¼ÆÍŶӰÑÀà¼ÓÔØ½×¶ÎÖеġ°Í¨¹ýÒ»¸öÀàµÄÈ«ÏÞ¶¨ÃûÀ´»ñÈ¡ÃèÊö´ËÀàµÄ¶þ½øÖÆ×Ö½ÚÁ÷ ( ¼´×Ö½ÚÂë )¡±Õâ¸ö¶¯×÷·Åµ½ Java ÐéÄâ»úÍⲿȥʵÏÖ£¬ÒÔ±ãÈÃÓ¦ÓóÌÐò×Ô¼º¾ö¶¨ÈçºÎÈ¥»ñÈ¡ËùÐèÒªµÄÀࡣʵÏÖÕâ¸ö¶¯×÷µÄ´úÂëÄ£¿é³ÆÎª¡°Àà¼ÓÔØÆ÷¡±¡£ +????????????????????§Ö????????????????????????????????????????? ( ??????? )???????????? Java ???????????????????¨®??????????????????????????????????????????????????????????? -### 4.1 ÀàÓëÀà¼ÓÔØÆ÷ +### 4.1 ??????????? -¶ÔÓÚÈÎÒâÒ»¸öÀ࣬¶¼ÐèÒªÓɼÓÔØËüµÄÀà¼ÓÔØÆ÷ºÍÕâ¸öÀà±¾ÉíһͬȷÁ¢ÆäÔÚ Java ÐéÄâ»úÖеÄΨһÐÔ£¬Ã¿Ò»¸öÀà¼ÓÔØÆ÷£¬¶¼ÓµÓÐÒ»¸ö¶ÀÁ¢µÄÀàÃû³Æ¿Õ¼ä¡£Í¨Ë×¶øÑÔ£º±È½ÏÁ½¸öÀàÊÇ·ñ¡°ÏàµÈ¡±£¨ÕâÀïËùÖ¸µÄ¡°ÏàµÈ¡±£¬°üÀ¨ÀàµÄ Class ¶ÔÏóµÄ equals() ·½·¨¡¢isAssignableFrom() ·½·¨¡¢isInstance() ·½·¨µÄ·µ»Ø½á¹û£¬Ò²°üÀ¨Ê¹Óà instanceof() ¹Ø¼ü×Ö¶Ô×ö¶ÔÏóËùÊô¹ØÏµÅж¨µÈÇé¿ö£©£¬Ö»ÓÐÔÚÕâÁ½¸öÀàʱÓÉͬһ¸öÀà¼ÓÔØÆ÷¼ÓÔØµÄǰÌáϲÅÓÐÒâÒ壬·ñÔò£¬¼´Ê¹ÕâÁ½¸öÀàÀ´Ô´ÓÚͬһ¸ö Class Îļþ£¬±»Í¬Ò»¸öÐéÄâ»ú¼ÓÔØ£¬Ö»Òª¼ÓÔØËüÃǵÄÀà¼ÓÔØÆ÷²»Í¬£¬ÄÇÕâÁ½¸öÀà¾Í±Ø¶¨²»ÏàµÈ¡£ +???????????????????????????????????????????????????? Java ??????§Ö?¦·??????????????????????????????????????????????????????????????????????????????????????? Class ????? equals() ??????isAssignableFrom() ??????isInstance() ????????????????????? instanceof() ????????????????????§Ø?????????????????????????????????????????????????????ÈÉ??????????????????????? Class ??????????????????????????????????????????????????????????????? -### 4.2 Àà¼ÓÔØÆ÷·ÖÀà +### 4.2 ??????????? -´Ó Java ÐéÄâ»úµÄ½Ç¶ÈÀ´½²£¬Ö»´æÔÚÒÔÏÂÁ½ÖÖ²»Í¬µÄÀà¼ÓÔØÆ÷£º +?? Java ????????????????????????????????????????? -Ò»ÖÖÊÇÆô¶¯Àà¼ÓÔØÆ÷£¨Bootstrap ClassLoader£©£¬Õâ¸öÀà¼ÓÔØÆ÷Óà C++ ʵÏÖ£¬ÊÇÐéÄâ»ú×ÔÉíµÄÒ»²¿·Ö£»ÁíÒ»ÖÖ¾ÍÊÇËùÓÐÆäËûÀàµÄ¼ÓÔØÆ÷£¬ÕâЩÀàÓÉ Java ʵÏÖ£¬¶ÀÁ¢ÓÚÐéÄâ»úÍⲿ£¬²¢ÇÒÈ«¶¼¼Ì³Ð×Ô³éÏóÀà java.lang.ClassLoader¡£ +??????????????????Bootstrap ClassLoader???????????????? C++ ??????????????????????????????????????????????????§»???? Java ???????????????????????????????????? java.lang.ClassLoader?? -´Ó Java ¿ª·¢ÈËÔ±µÄ½Ç¶È¿´£¬Àà¼ÓÔØÆ÷¿ÉÒÔ»®·ÖµÃ¸üϸÖÂһЩ£º +?? Java ??????????????????????????????????§»?? -- Æô¶¯Àà¼ÓÔØÆ÷£¨Bootstrap ClassLoader£© ´ËÀà¼ÓÔØÆ÷¸ºÔ𽫴æ·ÅÔÚ \lib Ŀ¼Öе쬻òÕß±» -Xbootclasspath ²ÎÊýËùÖ¸¶¨µÄ·¾¶Öе쬲¢ÇÒÊÇÐéÄâ»úʶ±ðµÄ£¨½ö°´ÕÕÎļþÃûʶ±ð£¬Èç rt.jar£¬Ãû×Ö²»·ûºÏµÄÀà¿â¼´Ê¹·ÅÔÚ lib Ŀ¼ÖÐÒ²²»»á±»¼ÓÔØ£©Àà¿â¼ÓÔØµ½ÐéÄâ»úÄÚ´æÖС£ Æô¶¯Àà¼ÓÔØÆ÷ÎÞ·¨±» Java ³ÌÐòÖ±½ÓÒýÓã¬Óû§ÔÚ±àд×Ô¶¨ÒåÀà¼ÓÔØÆ÷ʱ£¬Èç¹ûÐèÒª°Ñ¼ÓÔØÇëÇóίÅɸøÒýµ¼Àà¼ÓÔØÆ÷£¬Ö±½ÓʹÓà null ´úÌæ¼´¿É¡£ +- ?????????????Bootstrap ClassLoader?? ????????????????? \lib ???§Ö??????? -Xbootclasspath ???????????¡¤???§Ö?????????????????????????????????? rt.jar???????????????????? lib ??????????????????????????????§³? ???????????????? Java ??????????????????§Õ????????????????????????????????????????????????????? null ???�r?¨À? -- À©Õ¹Àà¼ÓÔØÆ÷£¨Extension ClassLoader£© Õâ¸öÀà¼ÓÔØÆ÷ÊÇÓÉ ExtClassLoader£¨sun.misc.Launcher$ExtClassLoader£©ÊµÏֵġ£Ëü¸ºÔ𽫠/lib/ext »òÕß±» java.ext.dir ϵͳ±äÁ¿ËùÖ¸¶¨Â·¾¶ÖеÄËùÓÐÀà¿â¼ÓÔØµ½ÄÚ´æÖУ¬¿ª·¢Õß¿ÉÒÔÖ±½ÓʹÓÃÀ©Õ¹Àà¼ÓÔØÆ÷¡£ +- ????????????Extension ClassLoader?? ?????????????? ExtClassLoader??sun.misc.Launcher$ExtClassLoader????????????? /lib/ext ????? java.ext.dir ???????????¡¤???§Ö????????????????§µ???????????????????????????? -- Ó¦ÓóÌÐòÀà¼ÓÔØÆ÷£¨Application ClassLoader£© Õâ¸öÀà¼ÓÔØÆ÷ÊÇÓÉ AppClassLoader£¨sun.misc.Launcher$AppClassLoader£©ÊµÏֵġ£ÓÉÓÚÕâ¸öÀà¼ÓÔØÆ÷ÊÇ ClassLoader ÖÐµÄ getSystemClassLoader() ·½·¨µÄ·µ»ØÖµ£¬Òò´ËÒ»°ã³ÆÎªÏµÍ³Àà¼ÓÔØÆ÷¡£Ëü¸ºÔð¼ÓÔØÓû§Àà·¾¶£¨ClassPath£©ÉÏËùÖ¸¶¨µÄÀà¿â£¬¿ª·¢Õß¿ÉÒÔÖ±½ÓʹÓÃÕâ¸öÀà¼ÓÔØÆ÷£¬Èç¹ûÓ¦ÓóÌÐòÖÐûÓÐ×Ô¶¨Òå¹ý×Ô¼ºµÄÀà¼ÓÔØÆ÷£¬Ò»°ãÇé¿öÏÂÕâ¸ö¾ÍÊdzÌÐòÖÐĬÈϵÄÀà¼ÓÔØÆ÷¡£ +- ??¨®????????????Application ClassLoader?? ?????????????? AppClassLoader??sun.misc.Launcher$AppClassLoader??????????????????????? ClassLoader ?§Ö? getSystemClassLoader() ?????????????????????????????????????????????¡¤????ClassPath??????????????????????????????????????????????¨®????????????????????????????????????????????????????????????? -### 4.3 Ë«Ç×ίÅÉÄ£ÐÍ +### 4.3 ????????? -Ó¦ÓóÌÐò¶¼ÊÇÓÉÈýÖÖÀà¼ÓÔØÆ÷Ï໥ÅäºÏ½øÐмÓÔØµÄ£¬Èç¹ûÓбØÒª£¬»¹¿ÉÒÔ¼ÓÈë×Ô¼º¶¨ÒåµÄÀà¼ÓÔØÆ÷¡£ÏÂͼչʾµÄÀà¼ÓÔØÆ÷Ö®¼äµÄ²ã´Î¹ØÏµ£¬³ÆÎªÀà¼ÓÔØÆ÷µÄË«Ç×ίÅÉÄ£ÐÍ£¨Parents Delegation Model£©¡£¸ÃÄ£ÐÍÒªÇó³ýÁ˶¥²ãµÄÆô¶¯Àà¼ÓÔØÆ÷Í⣬ÆäÓàµÄÀà¼ÓÔØÆ÷¶¼Ó¦ÓÐ×Ô¼ºµÄ¸¸Àà¼ÓÔØÆ÷£¬ÕâÀïÀà¼ÓÔØÆ÷Ö®¼äµÄ¸¸×Ó¹ØÏµÒ»°ãͨ¹ý×éºÏ£¨Composition£©¹ØÏµÀ´ÊµÏÖ£¬¶ø²»ÊÇͨ¹ý¼Ì³Ð£¨Inheritance£©µÄ¹ØÏµÊµÏÖ¡£ +??¨®?????????????????????????§Þ?????????§Ò?????????????????????????????????????????????????¦É??????????????????????????Parents Delegation Model??????????????????????????????????????????????????????????????????????????????????????????????Composition??????????????????????§µ?Inheritance?????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/2cdc3ce2-fa82-4c22-baaa-000c07d10473.jpg) -**¹¤×÷¹ý³Ì** +**????????** -Èç¹ûÒ»¸öÀà¼ÓÔØÆ÷ÊÕµ½ÁËÀà¼ÓÔØµÄÇëÇó£¬ËüÊ×ÏȲ»»á×Ô¼ºÈ¥³¢ÊÔ¼ÓÔØ£¬¶øÊǰÑÕâ¸öÇëÇóίÅɸø¸¸Àà¼ÓÔØÆ÷£¬Ã¿Ò»¸ö²ã´ÎµÄ¼ÓÔØÆ÷¶¼ÊÇÈç´Ë£¬ÒÀ´ÎµÝ¹é£¬Òò´ËËùÓеļÓÔØÇëÇó×îÖÕ¶¼Ó¦¸Ã´«Ë͵½¶¥²ãµÄÆô¶¯Àà¼ÓÔØÆ÷ÖУ¬Ö»Óе±¸¸¼ÓÔØÆ÷·´À¡×Ô¼ºÎÞ·¨Íê³É´Ë¼ÓÔØÇëÇó£¨ËüËÑË÷·¶Î§ÖÐûÓÐÕÒµ½ËùÐèÀࣩʱ£¬×Ó¼ÓÔØÆ÷²Å»á³¢ÊÔ×Ô¼º¼ÓÔØ¡£ +??????????????????????????????????????????????????????????????????????????????????¦Å?????????????????¦Å?ï…??????§Ö?????????????????????????????????????§µ???§Ö??????????????????????????????????????¦¶????????????????????????????????????? -**ºÃ´¦** +**???** -ʹÓÃË«Ç×ίÅÉÄ£ÐÍÀ´×éÖ¯Àà¼ÓÔØÆ÷Ö®¼äµÄ¹ØÏµ£¬Ê¹µÃ Java ÀàËæ×ÅËüµÄÀà¼ÓÔØÆ÷Ò»Æð¾ß±¸ÁËÒ»ÖÖ´øÓÐÓÅÏȼ¶µÄ²ã´Î¹ØÏµ¡£ÀýÈçÀà java.lang.Object£¬Ëü´æ·ÅÔÙ rt.jar ÖУ¬ÎÞÂÛÄĸöÀà¼ÓÔØÆ÷Òª¼ÓÔØÕâ¸öÀ࣬×îÖÕ¶¼ÊÇίÅɸø´¦ÓÚÄ£ÐÍ×î¶¥¶ËµÄÆô¶¯Àà¼ÓÔØÆ÷½øÐмÓÔØ£¬Òò´Ë Object ÀàÔÚ³ÌÐòµÄ¸÷ÖÖÀà¼ÓÔØÆ÷»·¾³Öж¼ÊÇͬһ¸öÀà¡£Ïà·´£¬Èç¹ûûÓÐË«Ç×ίÅÉÄ£ÐÍ£¬Óɸ÷¸öÀà¼ÓÔØÆ÷×ÔÐмÓÔØµÄ»°£¬Èç¹ûÓû§±àдÁËÒ»¸ö³ÆÎª£àjava.lang.Object µÄÀ࣬²¢·ÅÔÚ³ÌÐòµÄ ClassPath ÖУ¬ÄÇϵͳÖн«»á³öÏÖ¶à¸ö²»Í¬µÄ Object À࣬³ÌÐò½«±äµÃһƬ»ìÂÒ¡£Èç¹û¿ª·¢Õß³¢ÊÔ±àдһ¸öÓë rt.jar Àà¿âÖÐÒÑÓÐÀàÖØÃûµÄ Java À࣬½«»á·¢ÏÖ¿ÉÒÔÕý³£±àÒ룬µ«ÊÇÓÀÔ¶ÎÞ·¨±»¼ÓÔØÔËÐС£ +??????????????????????????????????? Java ??????????????????????????????????????¦É?????????? java.lang.Object????????? rt.jar ?§µ??????????????????????????????????????????????????????????????§Þ??????? Object ???????????????????????§Ø????????????????????????????????????????????§Þ???????????????§Õ??????????java.lang.Object ?????????????? ClassPath ?§µ??????§ß????????????? Object ????????????????????????????§Õ????? rt.jar ????????????????? Java ??????????????????????????????????????§³? -**ʵÏÖ** +**???** ```java protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException{ @@ -646,27 +646,27 @@ protected synchronized Class loadClass(String name, boolean resolve) throws C } ``` -# JVM ²ÎÊý +# JVM ???? -## GC ÓÅ»¯ÅäÖà +## GC ??????? -| ÅäÖà | ÃèÊö | +| ???? | ???? | | --- | --- | -| -Xms | ³õʼ»¯¶ÑÄÚ´æ´óС | -| -Xmx | ¶ÑÄÚ´æ×î´óÖµ | -| -Xmn | ÐÂÉú´ú´óС | -| -XX:PermSize | ³õʼ»¯ÓÀ¾Ã´ú´óС | -| -XX:MaxPermSize | ÓÀ¾Ã´ú×î´óÈÝÁ¿ | +| -Xms | ???????????§³ | +| -Xmx | ????????? | +| -Xmn | ????????§³ | +| -XX:PermSize | ????????????§³ | +| -XX:MaxPermSize | ???????????? | -## GC ÀàÐÍÉèÖà +## GC ???????? -| ÅäÖà | ÃèÊö | +| ???? | ???? | | --- | --- | -| -XX:+UseSerialGC | ´®ÐÐÀ¬»ø»ØÊÕÆ÷ | -| -XX:+UseParallelGC | ²¢ÐÐÀ¬»ø»ØÊÕÆ÷ | -| -XX:+UseConcMarkSweepGC | ²¢·¢±ê¼ÇɨÃèÀ¬»ø»ØÊÕÆ÷ | -| -XX:ParallelCMSThreads= | ²¢·¢±ê¼ÇɨÃèÀ¬»ø»ØÊÕÆ÷ = ΪʹÓõÄÏß³ÌÊýÁ¿ | -| -XX:+UseG1GC | G1 À¬»ø»ØÊÕÆ÷ | +| -XX:+UseSerialGC | ?????????????? | +| -XX:+UseParallelGC | ?????????????? | +| -XX:+UseConcMarkSweepGC | ???????????????????? | +| -XX:ParallelCMSThreads= | ???????????????????? = ???????????? | +| -XX:+UseG1GC | G1 ?????????? | ```java java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar diff --git a/notes/Java IO.md b/notes/Java IO.md index c4aa5d39..1f7154c7 100644 --- a/notes/Java IO.md +++ b/notes/Java IO.md @@ -1,129 +1,129 @@ -* [¸ÅÀÀ](#¸ÅÀÀ) -* [´ÅÅ̲Ù×÷](#´ÅÅ̲Ù×÷) -* [×Ö½Ú²Ù×÷](#×Ö½Ú²Ù×÷) -* [×Ö·û²Ù×÷](#×Ö·û²Ù×÷) -* [¶ÔÏó²Ù×÷](#¶ÔÏó²Ù×÷) -* [ÍøÂç²Ù×÷](#ÍøÂç²Ù×÷) +* [????](#????) +* [???????](#???????) +* [??????](#??????) +* [???????](#???????) +* [???????](#???????) +* [???????](#???????) * [1. InetAddress](#1-inetaddress) * [2. URL](#2-url) * [3. Sockets](#3-sockets) * [4. Datagram](#4-datagram) * [NIO](#nio) - * [1. Á÷Óë¿é](#1-Á÷Óë¿é) - * [2. ͨµÀÓ뻺³åÇø](#2-ͨµÀÓ뻺³åÇø) - * [2.1 ͨµÀ](#21-ͨµÀ) - * [2.2 »º³åÇø](#22-»º³åÇø) - * [3. »º³åÇø×´Ì¬±äÁ¿](#3-»º³åÇø×´Ì¬±äÁ¿) - * [4. ¶ÁдÎļþʵÀý](#4-¶ÁдÎļþʵÀý) - * [5. ×èÈûÓë·Ç×èÈû](#5-×èÈûÓë·Ç×èÈû) - * [5.1 ×èÈûʽ I/O](#51-×èÈûʽ-io) - * [5.2 ·Ç×èÈûʽ I/O](#52-·Ç×èÈûʽ-io) - * [6. Ì×½Ó×ÖʵÀý](#6-Ì×½Ó×ÖʵÀý) + * [1. ?????](#1-?????) + * [2. ?????????](#2-?????????) + * [2.1 ???](#21-???) + * [2.2 ??????](#22-??????) + * [3. ????????????](#3-????????????) + * [4. ??§Õ??????](#4-??§Õ??????) + * [5. ???????????](#5-???????????) + * [5.1 ????? I/O](#51-?????-io) + * [5.2 ??????? I/O](#52-???????-io) + * [6. ????????](#6-????????) * [6.1 ServerSocketChannel](#61-serversocketchannel) * [6.2 Selectors](#62-selectors) - * [6.3 Ö÷Ñ­»·](#63-Ö÷Ñ­»·) - * [6.4 ¼àÌýÐÂÁ¬½Ó](#64-¼àÌýÐÂÁ¬½Ó) - * [6.5 ½ÓÊÜеÄÁ¬½Ó](#65-½ÓÊÜеÄÁ¬½Ó) - * [6.6 ɾ³ý´¦Àí¹ýµÄ SelectionKey](#66-ɾ³ý´¦Àí¹ýµÄ-selectionkey) - * [6.7 ´«ÈëµÄ I/O](#67-´«ÈëµÄ-io) -* [²Î¿¼×ÊÁÏ](#²Î¿¼×ÊÁÏ) + * [6.3 ?????](#63-?????) + * [6.4 ??????????](#64-??????????) + * [6.5 ???????????](#65-???????????) + * [6.6 ?????????? SelectionKey](#66-??????????-selectionkey) + * [6.7 ????? I/O](#67-?????-io) +* [?¦Ï?????](#?¦Ï?????) -# ¸ÅÀÀ +# ???? -Java µÄ I/O ´ó¸Å¿ÉÒÔ·Ö³ÉÒÔϼ¸Àà +Java ?? I/O ??????????????? -1. ´ÅÅ̲Ù×÷£ºFile -2. ×Ö½Ú²Ù×÷£ºInputStream ºÍ OutputStream -3. ×Ö·û²Ù×÷£ºReader ºÍ Writer -4. ¶ÔÏó²Ù×÷£ºSerializable -5. ÍøÂç²Ù×÷£ºSocket -6. ·Ç×èÈûʽ IO£ºNIO +1. ?????????File +2. ????????InputStream ?? OutputStream +3. ?????????Reader ?? Writer +4. ?????????Serializable +5. ?????????Socket +6. ??????? IO??NIO -# ´ÅÅ̲Ù×÷ +# ??????? -File Àà¿ÉÒÔÓÃÓÚ±íʾÎļþºÍĿ¼£¬µ«ÊÇËüÖ»ÓÃÓÚ±íʾÎļþµÄÐÅÏ¢£¬¶ø²»±íʾÎļþµÄÄÚÈÝ¡£ +File ???????????????????????????????????????????????????????????? -# ×Ö½Ú²Ù×÷ +# ?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8143787f-12eb-46ea-9bc3-c66d22d35285.jpg) -Java I/O ʹÓÃÁË×°ÊÎÕßģʽÀ´ÊµÏÖ¡£ÒÔ InputStream ΪÀý£¬InputStream ÊdzéÏó×é¼þ£¬FileInputStream ÊÇ InputStream µÄ×ÓÀ࣬ÊôÓÚ¾ßÌå×é¼þ£¬ÌṩÁË×Ö½ÚÁ÷µÄÊäÈë²Ù×÷¡£FilterInputStream ÊôÓÚ³éÏó×°ÊÎÕߣ¬×°ÊÎÕßÓÃÓÚ×°ÊÎ×é¼þ£¬Îª×é¼þÌṩ¶îÍâµÄ¹¦ÄÜ£¬ÀýÈç BufferedInputStream Ϊ FileInputStream Ìṩ»º´æµÄ¹¦ÄÜ¡£ÊµÀý»¯Ò»¸ö¾ßÓлº´æ¹¦ÄܵÄ×Ö½ÚÁ÷¶ÔÏóʱ£¬Ö»ÐèÒªÔÚ FileInputStream ¶ÔÏóÉÏÔÙÌ×Ò»²ã BufferedInputStream ¶ÔÏó¼´¿É¡£ +Java I/O ???????????????????? InputStream ?????InputStream ??????????FileInputStream ?? InputStream ??????????????????????????????????????FilterInputStream ????????????????????????????????????????????????? BufferedInputStream ? FileInputStream ??????????????????????§Ý??œ¤????????????????????? FileInputStream ????????????? BufferedInputStream ????¨À? ```java BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); ``` -DataInputStream ×°ÊÎÕßÌṩÁ˶Ըü¶àÊý¾ÝÀàÐͽøÐÐÊäÈëµÄ²Ù×÷£¬±ÈÈç int¡¢double µÈ»ù±¾ÀàÐÍ¡£ +DataInputStream ?????????????????????????????????????? int??double ?????????? -ÅúÁ¿¶ÁÈëÎļþÖеÄÄÚÈݵ½×Ö½ÚÊý×éÖÐ +????????????§Ö??????????????? ```java byte[] buf = new byte[20*1024]; int bytes = 0; -// ×î¶à¶ÁÈ¡ buf.length ¸ö×Ö½Ú£¬·µ»ØµÄÊÇʵ¼Ê¶ÁÈ¡µÄ¸öÊý£¬·µ»Ø -1 µÄʱºò±íʾ¶Áµ½ eof£¬¼´Îļþβ +// ????? buf.length ????????????????????????????? -1 ??????????? eof???????¦Â while((bytes = in.read(buf, 0 , buf.length)) != -1) { // ... } ``` -# ×Ö·û²Ù×÷ +# ??????? -²»¹ÜÊÇ´ÅÅÌ»¹ÊÇÍøÂç´«Ê䣬×îСµÄ´æ´¢µ¥Ôª¶¼ÊÇ×Ö½Ú£¬¶ø²»ÊÇ×Ö·û£¬ËùÒÔ I/O ²Ù×÷µÄ¶¼ÊÇ×Ö½Ú¶ø²»ÊÇ×Ö·û¡£µ«ÊÇÔÚ³ÌÐòÖвÙ×÷µÄÊý¾Ýͨ³£ÊÇ×Ö·ûÐÎʽ£¬Òò´ËÐèÒªÌṩ¶Ô×Ö·û½øÐвÙ×÷µÄ·½·¨¡£ +???????????????×Ï????§³??›¥?????????????????????????? I/O ????????????????????????????????§Ó??????????????????????????????????????§Ó?????????? -InputStreamReader ʵÏÖ´ÓÎı¾ÎļþµÄ×Ö½ÚÁ÷½âÂë³É×Ö·ûÁ÷£»OutputStreamWriter ʵÏÖ×Ö·ûÁ÷±àÂë³ÉΪÎı¾ÎļþµÄ×Ö½ÚÁ÷¡£ËüÃǶ¼¼Ì³Ð×Ô Reader ºÍ Writer¡£ +InputStreamReader ?????????????????????????????OutputStreamWriter ??????????????????????????????????????? Reader ?? Writer?? -±àÂë¾ÍÊǰÑ×Ö·ûת»»Îª×Ö½Ú£¬¶ø½âÂëÊǰÑ×Ö½ÚÖØÐÂ×éºÏ³É×Ö·û¡£ +???????????????????????????????????????????? ```java -byte[] bytes = str.getBytes(encoding); // ±àÂë -String str = new String(bytes, encoding)£» // ½âÂë +byte[] bytes = str.getBytes(encoding); // ???? +String str = new String(bytes, encoding)?? // ???? ``` -GBK ±àÂëÖУ¬ÖÐÎÄÕ¼ 2 ¸ö×Ö½Ú£¬Ó¢ÎÄÕ¼ 1 ¸ö×Ö½Ú£»UTF-8 ±àÂëÖУ¬ÖÐÎÄÕ¼ 3 ¸ö×Ö½Ú£¬Ó¢ÎÄÕ¼ 1 ¸ö×Ö½Ú£»Java ʹÓÃË«×Ö½Ú±àÂë UTF-16be£¬ÖÐÎĺÍÓ¢Îͼռ 2 ¸ö×Ö½Ú¡£ +GBK ?????§µ?????? 2 ?????????? 1 ??????UTF-8 ?????§µ?????? 3 ?????????? 1 ??????Java ?????????? UTF-16be???????????? 2 ?????? -Èç¹û±àÂëºÍ½âÂë¹ý³ÌʹÓò»Í¬µÄ±àÂ뷽ʽÄÇô¾Í³öÏÖÁËÂÒÂë¡£ +????????????????¨°?????????????????????? -# ¶ÔÏó²Ù×÷ +# ??????? -ÐòÁл¯¾ÍÊǽ«Ò»¸ö¶ÔÏóת»»³É×Ö½ÚÐòÁУ¬·½±ã´æ´¢ºÍ´«Êä¡£ +???§Ý????????????????????????§µ?????›¥????? -ÐòÁл¯£ºObjectOutputStream.writeObject() +???§Ý???ObjectOutputStream.writeObject() -·´ÐòÁл¯£ºObjectInputStream.readObject() +?????§Ý???ObjectInputStream.readObject() -ÐòÁл¯µÄÀàÐèҪʵÏÖ Serializable ½Ó¿Ú£¬ËüÖ»ÊÇÒ»¸ö±ê×¼£¬Ã»ÓÐÈκη½·¨ÐèҪʵÏÖ¡£ +???§Ý??????????? Serializable ?????????????????????¦Ê¦Ç?????????? -transient ¹Ø¼ü×Ö¿ÉÒÔʹһЩÊôÐÔ²»»á±»ÐòÁл¯¡£ +transient ??????????§»??????????§Ý??? -**ArrayList ÐòÁл¯ºÍ·´ÐòÁл¯µÄʵÏÖ**£ºArrayList Öд洢Êý¾ÝµÄÊý×éÊÇÓà transient ÐÞÊεģ¬ÒòΪÕâ¸öÊý×éÊǶ¯Ì¬À©Õ¹µÄ£¬²¢²»ÊÇËùÓеĿռ䶼±»Ê¹Óã¬Òò´Ë¾Í²»ÐèÒªËùÓеÄÄÚÈݶ¼±»ÐòÁл¯¡£Í¨¹ýÖØÐ´ÐòÁл¯ºÍ·´ÐòÁл¯·½·¨£¬Ê¹µÃ¿ÉÒÔÖ»ÐòÁл¯Êý×éÖÐÓÐÄÚÈݵÄÄDz¿·ÖÊý¾Ý¡£ +**ArrayList ???§Ý???????§Ý??????**??ArrayList ?§Õ›¥????????????? transient ???¦Å???????????????????????????????§Ö????????????????????§Ö???????????§Ý????????§Õ???§Ý???????§Ý?????????????????§Ý???????????????????????? ``` private transient Object[] elementData; ``` -# ÍøÂç²Ù×÷ +# ??????? -Java ÖеÄÍøÂçÖ§³Ö£º +Java ?§Ö????????? -1. InetAddress£ºÓÃÓÚ±íÊ¾ÍøÂçÉϵÄÓ²¼þ×ÊÔ´£¬¼´ IP µØÖ·£» -2. URL£ºÍ³Ò»×ÊÔ´¶¨Î»·û£¬Í¨¹ý URL ¿ÉÒÔÖ±½Ó¶ÁÈ¡»òÕßдÈëÍøÂçÉϵÄÊý¾Ý£» -3. Sockets£ºÊ¹Óà TCP ЭÒéʵÏÖÍøÂçͨÐÅ£» -4. Datagram£ºÊ¹Óà UDP ЭÒéʵÏÖÍøÂçͨÐÅ¡£ +1. InetAddress????????????????????????? IP ????? +2. URL?????????¦Ë??????? URL ?????????????§Õ?????????????? +3. Sockets????? TCP §¿????????????? +4. Datagram????? UDP §¿????????????? ## 1. InetAddress -ûÓй«Óй¹Ô캯Êý£¬Ö»ÄÜͨ¹ý¾²Ì¬·½·¨À´´´½¨ÊµÀý£¬±ÈÈç InetAddress.getByName(String host)¡¢InetAddress.getByAddress(byte[] addr)¡£ +??§Û??§Û??????????????????????????????????? InetAddress.getByName(String host)??InetAddress.getByAddress(byte[] addr)?? ## 2. URL -¿ÉÒÔÖ±½Ó´Ó URL ÖжÁÈ¡×Ö½ÚÁ÷Êý¾Ý +???????? URL ?§Ø??????????? ```java URL url = new URL("http://www.baidu.com"); -InputStream is = url.openStream(); // ×Ö½ÚÁ÷ -InputStreamReader isr = new InputStreamReader(is, "utf-8"); // ×Ö·ûÁ÷ +InputStream is = url.openStream(); // ????? +InputStreamReader isr = new InputStreamReader(is, "utf-8"); // ????? BufferedReader br = new BufferedReader(isr); String line = br.readLine(); while (line != null) { @@ -137,56 +137,56 @@ is.close(); ## 3. Sockets -Socket ͨÐÅÄ£ÐÍ +Socket ?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/fa4101d7-19ce-4a69-a84f-20bbe64320e5.jpg) -- ServerSocket£º·þÎñÆ÷¶ËÀà -- Socket£º¿Í»§¶ËÀà +- ServerSocket???????????? +- Socket????????? -·þÎñÆ÷ºÍ¿Í»§¶Ëͨ¹ý InputStream ºÍ OutputStream ½øÐÐÊäÈëÊä³ö¡£ +??????????????? InputStream ?? OutputStream ????????????? ## 4. Datagram -- DatagramPacket£ºÊý¾Ý°üÀà -- DatagramSocket£ºÍ¨ÐÅÀà +- DatagramPacket????????? +- DatagramSocket??????? # NIO -NIO ½«×îºÄʱµÄ I/O ²Ù×÷ ( ¼´Ìî³äºÍÌáÈ¡»º³åÇø ) ×ªÒÆ»Ø²Ù×÷ϵͳ£¬Òò¶ø ²»ÐèÒª³ÌÐòԱȥ¿ØÖƾͿÉÒÔ¼«´óµØÌá¸ßÔËÐÐËÙ¶È¡£ +NIO ???????? I/O ???? ( ??????????????? ) ?????????????? ?????????????????????????????????? -## 1. Á÷Óë¿é +## 1. ????? -I/O Óë NIO ×îÖØÒªµÄÇø±ðÊÇÊý¾Ý´ò°üºÍ´«ÊäµÄ·½Ê½¡£ÕýÈçÇ°ÃæÌáµ½µÄ£¬I/O ÒÔÁ÷µÄ·½Ê½´¦ÀíÊý¾Ý£¬¶ø NIO ÒÔ¿éµÄ·½Ê½´¦ÀíÊý¾Ý¡£ +I/O ?? NIO ?????????????????????????????????????????I/O ??????????????????? NIO ??????????????? -ÃæÏòÁ÷µÄ I/O Ò»´ÎÒ»¸ö×Ö½Ú½øÐд¦ÀíÊý¾Ý£¬Ò»¸öÊäÈëÁ÷²úÉúÒ»¸ö×Ö½ÚµÄÊý¾Ý£¬Ò»¸öÊä³öÁ÷Ïû·ÑÒ»¸ö×Ö½ÚµÄÊý¾Ý¡£ÎªÁ÷ʽÊý¾Ý´´½¨¹ýÂËÆ÷·Ç³£ÈÝÒ×£¬Á´½Ó¼¸¸ö¹ýÂËÆ÷£¬ÒÔ±ãÿ¸ö¹ýÂËÆ÷Ö»¸ºÔ𵥸ö¸´ÔÓ´¦Àí»úÖÆµÄÒ»²¿·Ö£¬ÕâÑùÒ²ÊÇÏà¶Ô¼òµ¥µÄ¡£²»ÀûµÄÒ»ÃæÊÇ£¬ÃæÏòÁ÷µÄ I/O ͨ³£Ï൱Âý¡£ +???????? I/O ???????????§Õ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? I/O ????????? -Ò»¸öÃæÏò¿éµÄ I/O ϵͳÒÔ¿éµÄÐÎʽ´¦ÀíÊý¾Ý£¬Ã¿Ò»¸ö²Ù×÷¶¼ÔÚÒ»²½ÖвúÉú»òÕßÏû·ÑÒ»¸öÊý¾Ý¿é¡£°´¿é´¦ÀíÊý¾Ý±È°´Á÷´¦ÀíÊý¾ÝÒª¿ìµÃ¶à¡£µ«ÊÇÃæÏò¿éµÄ I/O ȱÉÙÒ»Ð©ÃæÏòÁ÷µÄ I/O Ëù¾ßÓеÄÓÅÑÅÐԺͼòµ¥ÐÔ¡£ +????????? I/O ??????????????????????????????????§Ó??????????????????î•???ø„????????????????????????????????? I/O ????§»???????? I/O ?????§Ö???????????? -I/O °üºÍ NIO ÒѾ­ºÜºÃµØ¼¯³ÉÁË£¬java.io.\* ÒѾ­ÒÔ NIO Ϊ»ù´¡ÖØÐÂʵÏÖÁË£¬ËùÒÔÏÖÔÚËü¿ÉÒÔÀûÓà NIO µÄÒ»Ð©ÌØÐÔ¡£ÀýÈ磬 java.io.\* °üÖеÄһЩÀà°üº¬ÒÔ¿éµÄÐÎʽ¶ÁдÊý¾ÝµÄ·½·¨£¬ÕâʹµÃ¼´Ê¹ÔÚ¸üÃæÏòÁ÷µÄϵͳÖУ¬´¦ÀíËÙ¶ÈÒ²»á¸ü¿ì¡£ +I/O ???? NIO ?????????????java.io.\* ????? NIO ????????????????????????????????? NIO ???§»????????íà java.io.\* ???§Ö??§»??????????????§Õ??????????????¨¹????????????????§µ?????????????? -## 2. ͨµÀÓ뻺³åÇø +## 2. ????????? -### 2.1 ͨµÀ +### 2.1 ??? -ͨµÀ Channel ÊǶÔÔ­ I/O °üÖеÄÁ÷µÄÄ£Ä⣬¿ÉÒÔͨ¹ýËü¶ÁÈ¡ºÍдÈëÊý¾Ý¡£ +??? Channel ???? I/O ???§Ö??????????????????????§Õ??????? -ͨµÀÓëÁ÷µÄ²»Í¬Ö®´¦ÔÚÓÚ£¬Á÷Ö»ÄÜÔÚÒ»¸ö·½ÏòÉÏÒÆ¶¯£¬(Ò»¸öÁ÷±ØÐëÊÇ InputStream »òÕß OutputStream µÄ×ÓÀà)£¬ ¶øÍ¨µÀÊÇË«ÏòµÄ£¬¿ÉÒÔÓÃÓÚ¶Á¡¢Ð´»òÕßͬʱÓÃÓÚ¶Áд¡£ +????????????????????????????????????????(??????????? InputStream ???? OutputStream ??????)?? ???????????????????????§Õ???????????§Õ?? -ͨµÀ°üÀ¨ÒÔÏÂÀàÐÍ£º +???????????????? -- FileChannel£º´ÓÎļþÖжÁдÊý¾Ý£» -- DatagramChannel£ºÍ¨¹ý UDP ¶ÁÐ´ÍøÂçÖÐÊý¾Ý£» -- SocketChannel£ºÍ¨¹ý TCP ¶ÁÐ´ÍøÂçÖÐÊý¾Ý£» -- ServerSocketChannel£º¿ÉÒÔ¼àÌýнøÀ´µÄ TCP Á¬½Ó£¬¶Ôÿһ¸öнøÀ´µÄÁ¬½Ó¶¼»á´´½¨Ò»¸ö SocketChannel¡£ +- FileChannel????????§Ø?§Õ????? +- DatagramChannel????? UDP ??§Õ??????????? +- SocketChannel????? TCP ??§Õ??????????? +- ServerSocketChannel???????????????? TCP ?????????????????????????????? SocketChannel?? -### 2.2 »º³åÇø +### 2.2 ?????? -·¢Ë͸øÒ»¸öͨµÀµÄËùÓжÔÏó¶¼±ØÐëÊ×Ïȷŵ½»º³åÇøÖУ»Í¬ÑùµØ£¬´ÓͨµÀÖжÁÈ¡µÄÈκÎÊý¾Ý¶¼Òª¶Áµ½»º³åÇøÖС£Ò²¾ÍÊÇ˵£¬²»»áÖ±½Ó¶ÔͨµÀ½øÐжÁдÊý¾Ý£¬¶øÊÇÏȾ­¹ý»º³åÇø¡£ +????????????????§Ø???????????????????§µ?????????????§Ø?????¦Ê??????????????????§³???????????????????????§Ø?§Õ?????????????????????? -»º³åÇøÊµÖÊÉÏÊÇÒ»¸öÊý×飬µ«Ëü²»½ö½öÊÇÒ»¸öÊý×é¡£»º³åÇøÌṩÁ˶ÔÊý¾ÝµÄ½á¹¹»¯·ÃÎÊ£¬¶øÇÒ»¹¿ÉÒÔ¸ú×ÙϵͳµÄ¶Á/д½ø³Ì¡£ +???????????????????ï…??????????????????î•?????????????????????????????????????????/§Õ????? -»º³åÇø°üÀ¨ÒÔÏÂÀàÐÍ£º +??????????????????? - ByteBuffer - CharBuffer @@ -197,50 +197,50 @@ I/O - DoubleBuffer -## 3. »º³åÇø×´Ì¬±äÁ¿ +## 3. ???????????? -- capacity£º×î´óÈÝÁ¿£» -- position£ºµ±Ç°ÒѾ­¶ÁдµÄ×Ö½ÚÊý£» -- limit£º»¹¿ÉÒÔ¶ÁдµÄ×Ö½ÚÊý¡£ +- capacity??????????? +- position??????????§Õ????????? +- limit?????????§Õ????????? -״̬±äÁ¿µÄ¸Ä±ä¹ý³Ì£º +?????????????? -1\. н¨Ò»¸ö´óСΪ 8 ¸ö×ֽڵĻº³åÇø£¬´Ëʱ position Ϊ 0£¬¶ø limit == capacity == 9¡£capacity ±äÁ¿²»»á¸Ä±ä£¬ÏÂÃæµÄÌÖÂÛ»áºöÂÔËü¡£ +1\. ????????§³? 8 ???????????????? position ? 0???? limit == capacity == 9??capacity ??????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1bea398f-17a7-4f67-a90b-9e2d243eaa9a.png) -2\. ´ÓÊäÈëͨµÀÖжÁÈ¡ 3 ¸ö×Ö½ÚÊý¾ÝдÈ뻺³åÇøÖУ¬´Ëʱ position ÒÆ¶¯ÉèΪ 3£¬limit ±£³Ö²»±ä¡£ +2\. ??????????§Ø?? 3 ?????????§Õ???????§µ???? position ?????? 3??limit ??????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/4628274c-25b6-4053-97cf-d1239b44c43d.png) -3\. ÔÚ½«»º³åÇøµÄÊý¾Ýдµ½Êä³öͨµÀ֮ǰ£¬ÐèÒªÏȵ÷Óà flip() ·½·¨£¬Õâ¸ö·½·¨½« limit ÉèÖÃΪµ±Ç° position£¬²¢½« position ÉèÖÃΪ 0¡£ +3\. ???????????????§Õ???????????????????? flip() ??????????????? limit ???????? position?????? position ????? 0?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/952e06bd-5a65-4cab-82e4-dd1536462f38.png) -4\. ´Ó»º³åÇøÖÐÈ¡ 4 ¸ö×Ö½Úµ½Êä³ö»º³åÖУ¬´Ëʱ position ÉèΪ 4¡£ +4\. ?????????? 4 ??????????????§µ???? position ??? 4?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/b5bdcbe2-b958-4aef-9151-6ad963cb28b4.png) -5\. ×îºóÐèÒªµ÷Óà clear() ·½·¨À´Çå¿Õ»º³åÇø£¬´Ëʱ position ºÍ limit ¶¼±»ÉèÖÃΪ×î³õλÖᣠ+5\. ?????????? clear() ??????????????????? position ?? limit ????????????¦Ë?¨¢? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/67bf5487-c45d-49b6-b9c0-a058d8c68902.png) -## 4. ¶ÁдÎļþʵÀý +## 4. ??§Õ?????? -1\. ΪҪ¶ÁÈ¡µÄÎļþ´´½¨ FileInputStream£¬Ö®ºóͨ¹ý FileInputStream »ñÈ¡ÊäÈë FileChannel£» +1\. ?????????????? FileInputStream???????? FileInputStream ??????? FileChannel?? ```java FileInputStream fin = new FileInputStream("readandshow.txt"); FileChannel fic = fin.getChannel(); ``` -2\. ´´½¨Ò»¸öÈÝÁ¿Îª 1024 µÄ Buffer +2\. ???????????? 1024 ?? Buffer ```java ByteBuffer buffer = ByteBuffer.allocate(1024); ``` -3\. ½«Êý¾Ý´ÓÊäÈë FileChannel дÈëµ½ Buffer ÖУ¬Èç¹ûûÓÐÊý¾ÝµÄ»°£¬ read() ·½·¨»á·µ»Ø -1 +3\. ??????????? FileChannel §Õ?? Buffer ?§µ??????????????? read() ???????? -1 ```java int r = fcin.read(buffer); @@ -249,86 +249,86 @@ if (r == -1) { } ``` -4\. ΪҪдÈëµÄÎļþ´´½¨ FileOutputStream£¬Ö®ºóͨ¹ý FileOutputStream »ñÈ¡Êä³ö FileChannel +4\. ??§Õ?????????? FileOutputStream???????? FileOutputStream ?????? FileChannel ```java FileOutputStream fout = new FileOutputStream("writesomebytes.txt"); FileChannel foc = fout.getChannel(); ``` -5\. µ÷Óà flip() Çл»¶Áд +5\. ???? flip() ?§Ý???§Õ ```java buffer.flip(); ``` -6\. °Ñ Buffer ÖеÄÊý¾Ý¶ÁÈ¡µ½Êä³ö FileChannel ÖÐ +6\. ?? Buffer ?§Ö???????????? FileChannel ?? ```java foc.write(buffer); ``` -7\. ×îºóµ÷Óà clear() ÖØÖûº³åÇø +7\. ?????? clear() ????????? ```java buffer.clear(); ``` -## 5. ×èÈûÓë·Ç×èÈû +## 5. ??????????? -Ó¦µ±×¢Ò⣬FileChannel ²»ÄÜÇл»µ½·Ç×èÈûģʽ£¬Ì×½Ó×Ö Channel ¿ÉÒÔ¡£ +??????FileChannel ?????§Ý?????????????????? Channel ????? -### 5.1 ×èÈûʽ I/O +### 5.1 ????? I/O -×èÈûʽ I/O ÔÚµ÷Óà InputStream.read() ·½·¨Ê±»áÒ»Ö±µÈµ½Êý¾Ýµ½À´Ê±£¨»ò³¬Ê±£©²Å»á·µ»Ø£¬ÔÚµ÷Óà ServerSocket.accept() ·½·¨Ê±£¬Ò²»áÒ»Ö±×èÈûµ½Óпͻ§¶ËÁ¬½Ó²Å»á·µ»Ø£¬Ã¿¸ö¿Í»§¶ËÁ¬½Ó¹ýÀ´ºó£¬·þÎñ¶Ë¶¼»áÆô¶¯Ò»¸öÏß³ÌÈ¥´¦Àí¸Ã¿Í»§¶ËµÄÇëÇó¡£ +????? I/O ????? InputStream.read() ?????????????????????????????????????? ServerSocket.accept() ???????????????????§á?????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/edc23f99-c46c-4200-b64e-07516828720d.jpg) -### 5.2 ·Ç×èÈûʽ I/O +### 5.2 ??????? I/O -ÓÉÒ»¸öרÃŵÄÏß³ÌÀ´´¦ÀíËùÓÐµÄ I/O ʼþ£¬²¢¸ºÔð·Ö·¢¡£ +?????????????????????§Ö? I/O ??????????????? -ʼþÇý¶¯»úÖÆ£ºÊ¼þµ½µÄʱºò´¥·¢£¬¶ø²»ÊÇͬ²½µÄÈ¥¼àÊÓʼþ¡£ +?????????????????????????????????????????????? -Ïß³ÌͨÐÅ£ºÏß³ÌÖ®¼äͨ¹ý wait()¡¢notify() µÈ·½Ê½Í¨ÐÅ£¬±£Ö¤Ã¿´ÎÉÏÏÂÎÄÇл»¶¼ÊÇÓÐÒâÒåµÄ£¬¼õÉÙÎÞνµÄÏß³ÌÇл»¡£ +???????????????? wait()??notify() ?????????????????????§Ý???????????????????¦Í??????§Ý??? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/7fcb2fb0-2cd9-4396-bc2d-282becf963c3.jpg) -## 6. Ì×½Ó×ÖʵÀý +## 6. ???????? ### 6.1 ServerSocketChannel -ÿһ¸ö¶Ë¿Ú¶¼ÐèÒªÓÐÒ»¸ö ServerSocketChannel ÓÃÀ´¼àÌýÁ¬½Ó¡£ +???????????????? ServerSocketChannel ????????????? ```java ServerSocketChannel ssc = ServerSocketChannel.open(); -ssc.configureBlocking(false); // ÉèÖÃΪ·Ç×èÈû +ssc.configureBlocking(false); // ??????????? ServerSocket ss = ssc.socket(); InetSocketAddress address = new InetSocketAddress(ports[i]); -ss.bind(address); // °ó¶¨¶Ë¿ÚºÅ +ss.bind(address); // ????? ``` ### 6.2 Selectors -Òì²½ I/O ͨ¹ý Selector ×¢²á¶ÔÌØ¶¨ I/O ʼþµÄÐËȤ ¨D ¿É¶ÁµÄÊý¾ÝµÄµ½´ï¡¢ÐµÄÌ×½Ó×ÖÁ¬½ÓµÈµÈ£¬ÔÚ·¢ÉúÕâÑùµÄʼþʱ£¬ÏµÍ³½«»á·¢ËÍ֪ͨ¡£ +?? I/O ??? Selector ??????? I/O ???????? ?D ????????????????????????????????????????????????????????? -´´½¨ Selectors Ö®ºó£¬¾Í¿ÉÒÔ¶Ô²»Í¬µÄͨµÀ¶ÔÏóµ÷Óà register() ·½·¨¡£register() µÄµÚÒ»¸ö²ÎÊý×ÜÊÇÕâ¸ö Selector¡£µÚ¶þ¸ö²ÎÊýÊÇ OP_ACCEPT£¬ÕâÀïËüÖ¸¶¨ÎÒÃÇÏëÒª¼àÌý accept ʼþ£¬Ò²¾ÍÊÇÔÚеÄÁ¬½Ó½¨Á¢Ê±Ëù·¢ÉúµÄʼþ¡£ +???? Selectors ?????????????????????? register() ??????register() ????????????????? Selector????????????? OP_ACCEPT?????????????????????? accept ???????????????????????????????????? -SelectionKey ´ú±íÕâ¸öͨµÀÔÚ´Ë Selector ÉϵÄÕâ¸ö×¢²á¡£µ±Ä³¸ö Selector ֪ͨÄúij¸ö´«Èëʼþʱ£¬ËüÊÇͨ¹ýÌṩ¶ÔÓ¦ÓÚ¸ÃʼþµÄ SelectionKey À´½øÐеġ£SelectionKey »¹¿ÉÒÔÓÃÓÚÈ¡ÏûͨµÀµÄ×¢²á¡£ +SelectionKey ????????????? Selector ?????????????? Selector ????????????????????????????????????? SelectionKey ?????§Ö??SelectionKey ????????????????????? ```java Selector selector = Selector.open(); SelectionKey key = ssc.register(selector, SelectionKey.OP_ACCEPT); ``` -### 6.3 Ö÷Ñ­»· +### 6.3 ????? -Ê×ÏÈ£¬ÎÒÃǵ÷Óà Selector µÄ select() ·½·¨¡£Õâ¸ö·½·¨»á×èÈû£¬Ö±µ½ÖÁÉÙÓÐÒ»¸öÒÑ×¢²áµÄʼþ·¢Éú¡£µ±Ò»¸ö»òÕ߸ü¶àµÄʼþ·¢Éúʱ£¬ select() ·½·¨½«·µ»ØËù·¢ÉúµÄʼþµÄÊýÁ¿¡£ +???????????? Selector ?? select() ??????????????????????????????????????????????????????????????????????? select() ????????????????????????????? -½ÓÏÂÀ´£¬ÎÒÃǵ÷Óà Selector µÄ selectedKeys() ·½·¨£¬Ëü·µ»Ø·¢ÉúÁËʼþµÄ SelectionKey ¶ÔÏóµÄÒ»¸ö ¼¯ºÏ ¡£ +??????????????? Selector ?? selectedKeys() ?????????????????????? SelectionKey ???????? ???? ?? -ÎÒÃÇͨ¹ýµü´ú SelectionKeys ²¢ÒÀ´Î´¦Àíÿ¸ö SelectionKey À´´¦Àíʼþ¡£¶ÔÓÚÿһ¸ö SelectionKey£¬Äú±ØÐëÈ·¶¨·¢ÉúµÄÊÇʲô I/O ʼþ£¬ÒÔ¼°Õâ¸öʼþÓ°ÏìÄÄЩ I/O ¶ÔÏó¡£ +??????????? SelectionKeys ?????¦Ä?????? SelectionKey ??????????????????? SelectionKey????????????????????? I/O ???????????????????§» I/O ???? ```java int num = selector.select(); @@ -342,9 +342,9 @@ while (it.hasNext()) { } ``` -### 6.4 ¼àÌýÐÂÁ¬½Ó +### 6.4 ?????????? -³ÌÐòÖ´Ðе½ÕâÀÎÒÃǽö×¢²áÁË ServerSocketChannel£¬²¢ÇÒ½ö×¢²áËüÃÇ¡°½ÓÊÕ¡±Ê¼þ¡£ÎªÈ·ÈÏÕâÒ»µã£¬ÎÒÃÇ¶Ô SelectionKey µ÷Óà readyOps() ·½·¨£¬²¢¼ì²é·¢ÉúÁËʲôÀàÐ͵Äʼþ£º +??????§Ö??????????????? ServerSocketChannel??????????????????????????????????????? SelectionKey ???? readyOps() ??????????ú€???????????????? ```java if ((key.readyOps() & SelectionKey.OP_ACCEPT) @@ -354,39 +354,39 @@ if ((key.readyOps() & SelectionKey.OP_ACCEPT) } ``` -¿ÉÒԿ϶¨µØËµ£¬ readOps() ·½·¨¸æËßÎÒÃǸÃʼþÊÇеÄÁ¬½Ó¡£ +??????????? readOps() ?????????????????????????? -### 6.5 ½ÓÊÜеÄÁ¬½Ó +### 6.5 ??????????? -ÒòΪÎÒÃÇÖªµÀÕâ¸ö·þÎñÆ÷Ì×½Ó×ÖÉÏÓÐÒ»¸ö´«ÈëÁ¬½ÓÔڵȴý£¬ËùÒÔ¿ÉÒÔ°²È«µØ½ÓÊÜËü£»Ò²¾ÍÊÇ˵£¬²»Óõ£ÐÄ accept() ²Ù×÷»á×èÈû£º +?????????????????????????????????????????????????????????????????????????????? accept() ???????????? ```java ServerSocketChannel ssc = (ServerSocketChannel)key.channel(); SocketChannel sc = ssc.accept(); ``` -ÏÂÒ»²½Êǽ«ÐÂÁ¬½ÓµÄ SocketChannel ÅäÖÃΪ·Ç×èÈûµÄ¡£¶øÇÒÓÉÓÚ½ÓÊÜÕâ¸öÁ¬½ÓµÄÄ¿µÄÊÇΪÁ˶ÁÈ¡À´×ÔÌ×½Ó×ÖµÄÊý¾Ý£¬ËùÒÔÎÒÃÇ»¹±ØÐ뽫 SocketChannel ×¢²áµ½ SelectorÉÏ£¬ÈçÏÂËùʾ£º +??????????????? SocketChannel ??????????????????????????????????????????????????????????????????????? SocketChannel ??? Selector???????????? ```java sc.configureBlocking( false ); SelectionKey newKey = sc.register( selector, SelectionKey.OP_READ ); ``` -×¢ÒâÎÒÃÇʹÓà register() µÄ OP_READ ²ÎÊý£¬½« SocketChannel ×¢²áÓÃÓÚ ¶ÁÈ¡ ¶ø²»ÊÇ ½ÓÊÜ ÐÂÁ¬½Ó¡£ +?????????? register() ?? OP_READ ???????? SocketChannel ??????? ??? ?????? ???? ??????? -### 6.6 ɾ³ý´¦Àí¹ýµÄ SelectionKey +### 6.6 ?????????? SelectionKey -ÔÚ´¦Àí SelectionKey Ö®ºó£¬ÎÒÃǼ¸ºõ¿ÉÒÔ·µ»ØÖ÷Ñ­»·ÁË¡£µ«ÊÇÎÒÃDZØÐëÊ×ÏȽ«´¦Àí¹ýµÄ SelectionKey ´ÓÑ¡¶¨µÄ¼ü¼¯ºÏÖÐɾ³ý¡£Èç¹ûÎÒÃÇûÓÐɾ³ý´¦Àí¹ýµÄ¼ü£¬ÄÇôËüÈÔÈ»»áÔÚÖ÷¼¯ºÏÖÐÒÔÒ»¸ö¼¤»îµÄ¼ü³öÏÖ£¬Õâ»áµ¼ÖÂÎÒÃdz¢ÊÔÔٴδ¦ÀíËü¡£ÎÒÃǵ÷Óõü´úÆ÷µÄ remove() ·½·¨À´É¾³ý´¦Àí¹ýµÄ SelectionKey£º +????? SelectionKey ???????????????????????????????????????????????? SelectionKey ????????????????????????????????????????????????????????????????????????????????????????????¦Ä????????????????????? remove() ???????????????? SelectionKey?? ```java it.remove(); ``` -ÏÖÔÚÎÒÃÇ¿ÉÒÔ·µ»ØÖ÷Ñ­»·²¢½ÓÊÜ´ÓÒ»¸öÌ×½Ó×ÖÖд«ÈëµÄÊý¾Ý(»òÕßÒ»¸ö´«ÈëµÄ I/O ʼþ)ÁË¡£ +???????????????????????????????????§Õ????????(???????????? I/O ???)??? -### 6.7 ´«ÈëµÄ I/O +### 6.7 ????? I/O -µ±À´×ÔÒ»¸öÌ×½Ó×ÖµÄÊý¾Ýµ½´ïʱ£¬Ëü»á´¥·¢Ò»¸ö I/O ʼþ¡£Õâ»áµ¼ÖÂÔÚÖ÷Ñ­»·Öе÷Óà Selector.select()£¬²¢·µ»ØÒ»¸ö»òÕß¶à¸ö I/O ʼþ¡£ÕâÒ»´Î£¬ SelectionKey ½«±»±ê¼ÇΪ OP_READ ʼþ£¬ÈçÏÂËùʾ£º +?????????????????????????????????? I/O ??????????????????§Ö??? Selector.select()????????????????? I/O ?????????¦²? SelectionKey ???????? OP_READ ?????????????? ```java } else if ((key.readyOps() & SelectionKey.OP_READ) @@ -398,9 +398,9 @@ it.remove(); ``` -# ²Î¿¼×ÊÁÏ +# ?¦Ï????? -- Eckel B, °£¿Ë¶û , ê»Åô , µÈ . Java ±à³Ì˼Ïë [M]. »úе¹¤Òµ³ö°æÉç , 2002. -- [IBM: NIO ÈëÃÅ](https://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html) -- [ ÉîÈë·ÖÎö Java I/O µÄ¹¤×÷»úÖÆ ](https://www.ibm.com/developerworks/cn/java/j-lo-javaio/index.html) -- [NIO Ó봫ͳ IO µÄÇø±ð ](http://blog.csdn.net/shimiso/article/details/24990499) +- Eckel B, ????? , ??? , ?? . Java ?????? [M]. ??§Ö????????? , 2002. +- [IBM: NIO ????](https://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html) +- [ ??????? Java I/O ????????? ](https://www.ibm.com/developerworks/cn/java/j-lo-javaio/index.html) +- [NIO ??? IO ?????? ](http://blog.csdn.net/shimiso/article/details/24990499) diff --git a/notes/Java 基础语法.md b/notes/Java 基础语法.md index 87fc192b..05a53044 100644 --- a/notes/Java 基础语法.md +++ b/notes/Java 基础语法.md @@ -1,140 +1,140 @@ -* [»ù´¡](#»ù´¡) +* [????](#????) * [ final](#-final) - * [³õʼ»¯Ë³Ðò](#³õʼ»¯Ë³Ðò) - * [·ÃÎÊȨÏÞ](#·ÃÎÊȨÏÞ) -* [ÈÝÆ÷](#ÈÝÆ÷) + * [????????](#????????) + * [???????](#???????) +* [????](#????) * [Set](#set) * [Queue](#queue) * [Map](#map) -* [·´Éä](#·´Éä) -* [Òì³£](#Òì³£) -* [²Î¿¼×ÊÁÏ](#²Î¿¼×ÊÁÏ) +* [????](#????) +* [??](#??) +* [?¦Ï?????](#?¦Ï?????) -# »ù´¡ +# ???? ## final -**final Êý¾Ý** +**final ????** -ÉùÃ÷Êý¾ÝΪ³£Á¿£¬¿ÉÒÔÊDZàÒëʱ³£Á¿£¬Ò²¿ÉÒÔÊÇÔÚÔËÐÐʱ±»³õʼ»¯ºó²»Äܱ»¸Ä±äµÄ³£Á¿¡£ +?????????????????????????????????????????????????????????????????? -¶ÔÓÚ»ù±¾ÀàÐÍ£¬final ʹÊýÖµ²»±ä£»¶ÔÓÚÒýÓöÔÏó£¬final ʹÒýÓò»±ä£¬Ò²¾Í²»ÄÜÒýÓÃÆäËü¶ÔÏ󣬵«ÊDZ»ÒýÓõĶÔÏó±¾ÉíÊÇ¿ÉÒÔÐ޸ĵġ£ +????????????final ???????????????????final ????¨°????????????????????????????????????????????? -**final ·½·¨** +**final ????** -ÉùÃ÷·½·¨²»Äܱ»×ÓÀา¸Ç¡£ +???????????????????? -private ·½·¨ÒþʽµØ±»Ö¸¶¨Îª final£¬Èç¹ûÔÚ×ÓÀàÖж¨ÒåµÄ·½·¨ºÍ»ùÀàÖеÄÒ»¸ö private ·½·¨Ç©ÃûÏàͬ£¬´Ëʱ×ÓÀàµÄ·½·¨²»ÊǸ²¸Ç»ùÀà·½·¨£¬¶øÊÇÖØÔØÁË¡£ +private ?????????????? final????????????§Ø?????????????§Ö???? private ???????????????????????????????????????????????? -**final Àà** +**final ??** -ÉùÃ÷À಻ÔÊÐí±»¼Ì³Ð¡£ +????????????§³? -## ³õʼ»¯Ë³Ðò +## ???????? -static ÉùÃ÷µÄ¾²Ì¬Êý¾ÝÔÚÄÚ´æÖÐÖ»´æÔÚÒ»·Ý£¬Ö»ÔÚÀàµÚÒ»´ÎʵÀý»¯Ê±³õʼ»¯Ò»´Î£¬ÓÅÏÈÓÚÆäËüÊý¾ÝµÄ³õʼ»¯¡£ +static ??????????????????????????????????????????????????¦²?????????????????????? ```java -public static String staticField = "¾²Ì¬±äÁ¿"; +public static String staticField = "???????"; ``` -static Óï¾ä¿éºÍ static Êý¾ÝÒ»ÑùÔÚÀàµÚÒ»´ÎʵÀý»¯Ê±ÔËÐÐÒ»´Î£¬¾ßÌåÄĸöÏÈÔËÐÐÈ¡¾öÓÚËüÃÇÔÚ´úÂëÖеÄ˳Ðò¡£ +static ????? static ???????????????????????????¦²?????????????????????????????§Ö???? ```java static { - System.out.println("¾²Ì¬³õʼ»¯¿é"); + System.out.println("??????????"); } ``` -ÆÕͨÊý¾ÝºÍÆÕͨÓï¾ä¿éµÄ³õʼ»¯ÔÚ¾²Ì¬Êý¾ÝºÍ¾²Ì¬Óï¾ä¿é³õʼ»¯½áÊøÖ®ºó¡£ +?????????????????????????????????????????????? ```java -public String field = "±äÁ¿"; +public String field = "????"; ``` ```java { - System.out.println("³õʼ»¯¿é"); + System.out.println("???????"); } ``` -×îºó²ÅÊǹ¹Ô캯ÊýÖеÄÊý¾Ý½øÐгõʼ»¯ +????????????§Ö???????§Ô???? ```java public InitialOrderTest() { - System.out.println("¹¹ÔìÆ÷"); + System.out.println("??????"); } ``` -´æÔڼ̳еÄÇé¿öÏ£¬³õʼ»¯Ë³ÐòΪ£º +?????§Ö?????????????????? -1. ¸¸Àࣨ¾²Ì¬Êý¾Ý¡¢¾²Ì¬Óï¾ä¿é£© -2. ×ÓÀࣨ¾²Ì¬Êý¾Ý¡¢¾²Ì¬Óï¾ä¿é£© -3. ¸¸ÀࣨÊý¾Ý¡¢Óï¾ä¿é£© -4. ¸¸Àࣨ¹¹ÔìÆ÷£© -5. ×ÓÀࣨÊý¾Ý¡¢Óï¾ä¿é£© -6. ×ÓÀࣨ¹¹ÔìÆ÷£© +1. ??????????????????ï‚ +2. ??????????????????ï‚ +3. ????????????ï‚ +4. ???????????? +5. ????????????ï‚ +6. ???????????? -## ·ÃÎÊȨÏÞ +## ??????? -Java ÖÐÓÐÈý¸ö·ÃÎÊȨÏÞÐÞÊηû£ºprivate¡¢protected ÒÔ¼° public£¬Èç¹û²»¼Ó·ÃÎÊÐÞÊηû£¬±íʾ°ü¼¶¿É¼û¡£ +Java ??????????????????¦Ç???private??protected ??? public???????????????¦Ç??????????????? -¿ÉÒÔ¶ÔÀà»òÀàÖеijÉÔ±£¨×Ö¶ÎÒÔ¼°·½·¨£©¼ÓÉÏ·ÃÎÊÐÞÊηû¡£³ÉÔ±¿É¼û±íʾÆäËüÀà¿ÉÒÔÓóÉÔ±ËùÔÚÀàµÄ¶ÔÏó·ÃÎʵ½¸Ã³ÉÔ±£»Àà¿É¼û±íʾÆäËüÀà¿ÉÒÔÓÃÕâ¸öÀà´´½¨¶ÔÏ󣬿ÉÒÔ°ÑÀ൱×ö°üÖеÄÒ»¸ö³ÉÔ±£¬È»ºó°ü±íʾһ¸öÀ࣬ÕâÑù¾ÍºÃÀí½âÁË¡£ +???????????§Ö???????????????????????????¦Ç??????????????????????¨®?????????????????¨®????????????????????????????????????????????§Ö?????????????????????????????????? -protected ÓÃÓÚÐÞÊγÉÔ±£¬±íʾÔڼ̳ÐÌåϵÖгÉÔ±¶ÔÓÚ×ÓÀà¿É¼û¡£µ«ÊÇÕâ¸ö·ÃÎÊÐÞÊηû¶ÔÓÚÀàûÓÐÒâÒ壬ÒòΪ°üûÓм̳ÐÌåϵ¡£ +protected ???????¦Ã???????????????§Ô????????????????????????????¦Ç?????????????ÈÉ???????§Þ??????? -# ÈÝÆ÷ +# ???? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/114c49a6-72e3-4264-ae07-c564127094ac.png) -ÈÝÆ÷Ö÷Òª°üÀ¨ Collection ºÍ Map Á½ÖÖ£¬Collection ÓÖ°üº¬ÁË List¡¢Set ÒÔ¼° Queue¡£ +??????????? Collection ?? Map ?????Collection ??????? List??Set ??? Queue?? ## Set -- HashSet£ºÊ¹Óà Hash ʵÏÖ£¬Ö§³Ö¿ìËÙ²éÕÒ£¬µ«ÊÇʧȥÓÐÐòÐÔ£» +- HashSet????? Hash ??????????????????????????? -- TreeSet£ºÊ¹ÓÃÊ÷ʵÏÖ£¬±£³ÖÓÐÐò£¬µ«ÊDzéÕÒЧÂʲ»Èç HashSet£» +- TreeSet?????????????????????????§¹????? HashSet?? -- LinkedListHashSet£º¾ßÓÐ HashSet µÄ²éÕÒЧÂÊ£¬ÇÒÄÚ²¿Ê¹ÓÃÁ´±íά»¤ÔªËصIJåÈë˳Ðò£¬Òò´Ë¾ßÓÐÓÐÐòÐÔ¡£ +- LinkedListHashSet?????? HashSet ?????§¹????????????????????????????????????????? ## Queue -Ö»ÓÐÁ½¸öʵÏÖ£ºLinkedList ºÍ PriorityQueue£¬ÆäÖÐ LinkedList Ö§³ÖË«Ïò¶ÓÁС£ +???????????LinkedList ?? PriorityQueue?????? LinkedList ????????§³? ## Map -- HashMap£ºÊ¹Óà Hash ʵÏÖ +- HashMap????? Hash ??? -- LinkedHashMap£º±£³ÖÓÐÐò£¬Ë³ÐòΪ²åÈë˳Ðò»òÕß×î½ü×îÉÙʹÓã¨LRU£©Ë³Ðò +- LinkedHashMap???????????????????????????????????LRU????? -- TreeMap£º»ùÓÚºìºÚÊ÷ʵÏÖ +- TreeMap????????????? -- ConcurrentHashMap£ºḬ̈߳²È« Map£¬²»É漰ͬ²½¼ÓËø +- ConcurrentHashMap??????? Map?????�p??????? -# ·´Éä +# ???? -ÿ¸öÀà¶¼ÓÐÒ»¸ö **Class** ¶ÔÏ󣬰üº¬ÁËÓëÀàÓйصÄÐÅÏ¢¡£µ±±àÒëÒ»¸öÐÂÀàʱ£¬»á²úÉúÒ»¸öͬÃûµÄ .class Îļþ£¬¸ÃÎļþÄÚÈݱ£´æ×Å Class ¶ÔÏó¡£ +?????????? **Class** ??????????????§Û???????????????????????????????????? .class ??????????????????? Class ???? -Àà¼ÓÔØÏ൱ÓÚ Class ¶ÔÏóµÄ¼ÓÔØ¡£ÀàÔÚµÚÒ»´ÎʹÓÃʱ²Å¶¯Ì¬¼ÓÔØµ½ JVM ÖУ¬¿ÉÒÔʹÓà Class.forName('com.mysql.jdbc.Driver.class') ÕâÖÖ·½Ê½À´¿ØÖÆÀàµÄ¼ÓÔØ£¬¸Ã·½·¨»á·µ»ØÒ»¸ö Class ¶ÔÏó¡£ +????????? Class ?????????????????????????????? JVM ?§µ???????? Class.forName('com.mysql.jdbc.Driver.class') ????????????????????¡Â?????????? Class ???? -·´Éä¿ÉÒÔÌṩÔËÐÐʱµÄÀàÐÅÏ¢£¬²¢ÇÒÕâ¸öÀà¿ÉÒÔÔÚÔËÐÐʱ²Å¼ÓÔØ½øÀ´£¬ÉõÖÁÔÚ±àÒëʱÆÚ¸ÃÀàµÄ .class ²»´æÔÚÒ²¿ÉÒÔ¼ÓÔØ½øÀ´¡£ +???????????????????????????????????????????????????????????????????? .class ??????????????????? -Class ºÍ java.lang.reflect Ò»Æð¶Ô·´ÉäÌṩÁËÖ§³Ö£¬java.lang.reflect Àà¿â°üº¬ÁË **Field**¡¢**Method** ÒÔ¼° **Constructor** Àà¡£¿ÉÒÔʹÓà get() ºÍ set() ·½·¨¶ÁÈ¡ºÍÐÞ¸Ä Field ¶ÔÏó¹ØÁªµÄ×ֶΣ¬¿ÉÒÔʹÓà invoke() ·½·¨µ÷ÓÃÓë Method ¶ÔÏó¹ØÁªµÄ·½·¨£¬¿ÉÒÔÓà Constructor ´´½¨ÐµĶÔÏó¡£ +Class ?? java.lang.reflect ???????????????java.lang.reflect ???????? **Field**??**Method** ??? **Constructor** ????????? get() ?? set() ???????????? Field ???????????¦²???????? invoke() ?????????? Method ???????????????????? Constructor ?????????? -IDE ʹÓ÷´Éä»úÖÆ»ñÈ¡ÀàµÄÐÅÏ¢£¬ÔÚʹÓÃÒ»¸öÀàµÄ¶ÔÏóʱ£¬Äܹ»°ÑÀàµÄ×ֶΡ¢·½·¨ºÍ¹¹Ô캯ÊýµÈÐÅÏ¢ÁгöÀ´¹©Óû§Ñ¡Ôñ¡£ +IDE ??¡Â???????????????????????????????????????????¦±??????????????????§Ô??????????? -# Òì³£ +# ?? -Throwable ¿ÉÒÔÓÃÀ´±íʾÈκοÉÒÔ×÷ΪÒì³£Å׳öµÄÀ࣬·ÖΪÁ½ÖÖ£º**Error** ºÍ **Exception**£¬ÆäÖÐ Error ÓÃÀ´±íʾ±àÒëʱϵͳ´íÎó¡£ +Throwable ????????????¦Ê¦Ï???????????????????????**Error** ?? **Exception**?????? Error ?????????????????? -Exception ·ÖΪÁ½ÖÖ£º**ÊܼìÒì³£** ºÍ **·ÇÊܼìÒì³£**¡£ÊܼìÒì³£ÐèÒªÓà try...catch... Óï¾ä²¶»ñ²¢½øÐд¦Àí£¬²¢ÇÒ¿ÉÒÔ´ÓÒì³£Öлָ´£»·ÇÊܼìÒì³£ÊdzÌÐòÔËÐÐʱ´íÎó£¬ÀýÈç³ý 0 »áÒý·¢ Arithmetic Exception£¬´Ëʱ³ÌÐò±¼À£²¢ÇÒÎÞ·¨»Ö¸´¡£ +Exception ????????**?????** ?? **???????**???????????? try...catch... ???????§Õ??????????????§Ý?????????????????????????????? 0 ?????? Arithmetic Exception??????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/48f8f98e-8dfd-450d-8b5b-df4688f0d377.jpg) -# ²Î¿¼×ÊÁÏ +# ?¦Ï????? -- Eckel B, °£¿Ë¶û , ê»Åô , µÈ . Java ±à³Ì˼Ïë [M]. »úе¹¤Òµ³ö°æÉç , 2002. -- [Java Àà³õʼ»¯Ë³Ðò ](https://segmentfault.com/a/1190000004527951) +- Eckel B, ????? , ??? , ?? . Java ?????? [M]. ??§Ö????????? , 2002. +- [Java ????????? ](https://segmentfault.com/a/1190000004527951) diff --git a/notes/Java 容器.md b/notes/Java 容器.md index 8bbc9b45..8bf48f09 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -1,78 +1,78 @@ -* [¸ÅÀÀ](#¸ÅÀÀ) +* [????](#????) * [1. List](#1-list) * [2. Set](#2-set) * [3. Queue](#3-queue) * [4. Map](#4-map) - * [5. Java 1.0/1.1 ÈÝÆ÷](#5-java-1011-ÈÝÆ÷) -* [ÈÝÆ÷ÖеÄÉè¼ÆÄ£Ê½](#ÈÝÆ÷ÖеÄÉè¼ÆÄ£Ê½) - * [1. µü´úÆ÷ģʽ](#1-µü´úÆ÷ģʽ) - * [2. ÊÊÅäÆ÷ģʽ](#2-ÊÊÅäÆ÷ģʽ) -* [É¢ÁÐ](#É¢ÁÐ) -* [Ô´Âë·ÖÎö](#Ô´Âë·ÖÎö) + * [5. Java 1.0/1.1 ????](#5-java-1011-????) +* [?????§Ö??????](#?????§Ö??????) + * [1. ????????](#1-????????) + * [2. ????????](#2-????????) +* [???](#???) +* [??????](#??????) * [1. ArraList](#1-arralist) - * [2. Vector Óë Stack](#2-vector-Óë-stack) + * [2. Vector ?? Stack](#2-vector-??-stack) * [3. LinkedList](#3-linkedlist) * [4. TreeMap](#4-treemap) * [5. HashMap](#5-hashmap) * [6. LinkedHashMap](#6-linkedhashmap) * [7. ConcurrentHashMap](#7-concurrenthashmap) -* [²Î¿¼×ÊÁÏ](#²Î¿¼×ÊÁÏ) +* [?¦Ï?????](#?¦Ï?????) -# ¸ÅÀÀ +# ???? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ebf03f56-f957-4435-9f8f-0f605661484d.jpg) -ÈÝÆ÷Ö÷Òª°üÀ¨ Collection ºÍ Map Á½ÖÖ£¬Collection ÓÖ°üº¬ÁË List¡¢Set ÒÔ¼° Queue¡£ +??????????? Collection ?? Map ?????Collection ??????? List??Set ??? Queue?? ## 1. List -- ArrayList£º»ùÓÚ¶¯Ì¬Êý×éʵÏÖ£¬Ö§³ÖËæ»ú·ÃÎÊ£» +- ArrayList??????????????????????????? -- LinkedList£º»ùÓÚË«ÏòÑ­»·Á´±íʵÏÖ£¬Ö»ÄÜ˳Ðò·ÃÎÊ£¬µ«ÊÇ¿ÉÒÔ¿ìËÙµØÔÚÁ´±íÖмä²åÈëºÍɾ³ýÔªËØ¡£²»½öÈç´Ë£¬LinkedList »¹¿ÉÒÔÓÃ×÷Õ»¡¢¶ÓÁкÍË«¶Ë¶ÓÁС£ +- LinkedList????????????????????????????????????????????????§Þ????????????????????LinkedList ????????????????§Ü??????§³? ## 2. Set -- HashSet£º»ùÓÚ Hash ʵÏÖ£¬Ö§³Ö¿ìËÙ²éÕÒ£¬µ«ÊÇʧȥÓÐÐòÐÔ£» +- HashSet?????? Hash ??????????????????????????? -- TreeSet£º»ùÓÚºìºÚÊ÷ʵÏÖ£¬±£³ÖÓÐÐò£¬µ«ÊDzéÕÒЧÂʲ»Èç HashSet£» +- TreeSet????????????????????????????§¹????? HashSet?? -- LinkedListHashSet£º¾ßÓÐ HashSet µÄ²éÕÒЧÂÊ£¬ÇÒÄÚ²¿Ê¹ÓÃÁ´±íά»¤ÔªËصIJåÈë˳Ðò£¬Òò´Ë¾ßÓÐÓÐÐòÐÔ¡£ +- LinkedListHashSet?????? HashSet ?????§¹????????????????????????????????????????? ## 3. Queue -Ö»ÓÐÁ½¸öʵÏÖ£ºLinkedList ºÍ PriorityQueue£¬ÆäÖÐ LinkedList Ö§³ÖË«Ïò¶ÓÁУ¬PriorityQueue ÊÇ»ùÓڶѽṹʵÏÖ¡£ +???????????LinkedList ?? PriorityQueue?????? LinkedList ????????§µ?PriorityQueue ??????????? ## 4. Map -- HashMap£º»ùÓÚ Hash ʵÏÖ +- HashMap?????? Hash ??? -- LinkedHashMap£ºÊ¹ÓÃÁ´±íÀ´Î¬»¤ÔªËصÄ˳Ðò£¬Ë³ÐòΪ²åÈë˳Ðò»òÕß×î½ü×îÉÙʹÓã¨LRU£©Ë³Ðò +- LinkedHashMap??????????????????????????????????????????????LRU????? -- TreeMap£º»ùÓÚºìºÚÊ÷ʵÏÖ +- TreeMap????????????? -- ConcurrentHashMap£ºḬ̈߳²È« Map£¬²»Éæ¼°ÀàËÆÓÚ HashTable µÄͬ²½¼ÓËø +- ConcurrentHashMap??????? Map?????�p?????? HashTable ????????? -## 5. Java 1.0/1.1 ÈÝÆ÷ +## 5. Java 1.0/1.1 ???? -¶ÔÓھɵÄÈÝÆ÷£¬ÎÒÃǾö²»Ó¦¸ÃʹÓÃËüÃÇ£¬Ö»ÐèÒª¶ÔËüÃǽøÐÐÁ˽⡣ +?????????????????????????????????????????????? -- Vector£ººÍ ArrayList ÀàËÆ£¬µ«ËüÊÇḬ̈߳²È«µÄ +- Vector???? ArrayList ?????????????????? -- HashTable£ººÍ HashMap ÀàËÆ£¬µ«ËüÊÇḬ̈߳²È«µÄ +- HashTable???? HashMap ?????????????????? -# ÈÝÆ÷ÖеÄÉè¼ÆÄ£Ê½ +# ?????§Ö?????? -## 1. µü´úÆ÷ģʽ +## 1. ???????? -´Ó¸ÅÀÀͼ¿ÉÒÔ¿´µ½£¬Ã¿¸ö¼¯ºÏÀà¶¼ÓÐÒ»¸ö Iterator ¶ÔÏ󣬿ÉÒÔͨ¹ýÕâ¸öµü´úÆ÷¶ÔÏóÀ´±éÀú¼¯ºÏÖеÄÔªËØ¡£ +????????????????????????????? Iterator ??????????????????????????????????§Ö????? -[Java Öеĵü´úÆ÷ģʽ ](https://github.com/CyC2018/InterviewNotes/blob/master/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md#92-java-%E5%86%85%E7%BD%AE%E7%9A%84%E8%BF%AD%E4%BB%A3%E5%99%A8) +[Java ?§Ö???????? ](https://github.com/CyC2018/InterviewNotes/blob/master/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md#92-java-%E5%86%85%E7%BD%AE%E7%9A%84%E8%BF%AD%E4%BB%A3%E5%99%A8) -## 2. ÊÊÅäÆ÷ģʽ +## 2. ???????? -java.util.Arrays#asList() ¿ÉÒÔ°ÑÊý×éÀàÐÍת»»Îª List ÀàÐÍ¡£ +java.util.Arrays#asList() ????????????????? List ????? ```java List list = Arrays.asList(1, 2, 3); @@ -80,44 +80,44 @@ java.util.Arrays#asList() list = Arrays.asList(arr); ``` -# É¢ÁÐ +# ??? -ʹÓà hasCode() À´·µ»ØÉ¢ÁÐÖµ£¬Ê¹ÓõÄÊǶÔÏóµÄµØÖ·¡£ +??? hasCode() ?????????????????????????? -¶ø equals() ÊÇÓÃÀ´ÅжÏÁ½¸ö¶ÔÏóÊÇ·ñÏàµÈµÄ£¬ÏàµÈµÄÁ½¸ö¶ÔÏóÉ¢ÁÐÖµÒ»¶¨ÒªÏàͬ£¬µ«ÊÇÉ¢ÁÐÖµÏàͬµÄÁ½¸ö¶ÔÏó²»Ò»¶¨ÏàµÈ¡£ +?? equals() ???????§Ø?????????????????????????????????????????????????????????????????????? -ÏàµÈ±ØÐëÂú×ãÒÔÏÂÎå¸öÐÔÖÊ£º +?????????????????????? -1. ×Ô·´ÐÔ -2. ¶Ô³ÆÐÔ -3. ´«µÝÐÔ -4. Ò»ÖÂÐÔ£¨¶à´Îµ÷Óà x.equals(y)£¬½á¹û²»±ä£© -5. ¶ÔÈκβ»ÊÇ null µÄ¶ÔÏó x µ÷Óà x.equals(nul) ½á¹û¶¼Îª false +1. ????? +2. ????? +3. ?????? +4. ????????¦Å??? x.equals(y)????????? +5. ???¦Ê¦Â??? null ????? x ???? x.equals(nul) ?????? false -# Ô´Âë·ÖÎö +# ?????? -½¨ÒéÏÈÔĶÁ [ Ëã·¨ - ²éÕÒ ](https://github.com/CyC2018/InterviewNotes/blob/master/notes/%E7%AE%97%E6%B3%95.md#%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%9F%A5%E6%89%BE) ²¿·Ö£¬¶Ô¼¯ºÏÀàÔ´ÂëµÄÀí½âÓкܴó°ïÖú¡£ +????????? [ ?? - ???? ](https://github.com/CyC2018/InterviewNotes/blob/master/notes/%E7%AE%97%E6%B3%95.md#%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%9F%A5%E6%89%BE) ????????????????????§Ü??????? -Ô´ÂëÏÂÔØ£º[OpenJDK 1.7](http://download.java.net/openjdk/jdk7) +????????[OpenJDK 1.7](http://download.java.net/openjdk/jdk7) ## 1. ArraList [ArraList.java](https://github.com/CyC2018/InterviewNotes/blob/master/notes/src/ArrayList.java) -ʵÏÖÁË RandomAccess ½Ó¿Ú£¬Òò´ËÖ§³ÖËæ»ú·ÃÎÊ£¬ÕâÊÇÀíËùµ±È»µÄ£¬ÒòΪ ArrayList ÊÇ»ùÓÚÊý×éʵÏֵġ£ +????? RandomAccess ??????????????????????????????????? ArrayList ?????????????? ```java public class ArrayList extends AbstractList implements List, RandomAccess, Cloneable, java.io.Serializable ``` -»ùÓÚÊý×éʵÏÖ£¬±£´æÔªËصÄÊý×éʹÓà transient ÐÞÊΣ¬ÕâÊÇÒòΪ¸ÃÊý×é²»Ò»¶¨ËùÓÐλÖö¼Õ¼ÂúÔªËØ£¬Òò´ËÒ²¾Íû±ØÒªÈ«²¿¶¼½øÐÐÐòÁл¯¡£ÐèÒªÖØÐ´ writeObject() ºÍ readObject()¡£ +??????????????????????????? transient ???¦²?????????????öö???????¦Ë????????????????????????????????§Ý????????§Õ writeObject() ?? readObject()?? ```java private transient Object[] elementData; ``` -Êý×éµÄĬÈÏ´óСΪ 10 +?????????§³? 10 ```java public ArrayList(int initialCapacity) { @@ -132,7 +132,7 @@ public ArrayList() { } ``` -ɾ³ýÔªËØÊ±µ÷Óà System.arraycopy() ¶ÔÔªËØ½øÐи´ÖÆ£¬Òò´Ëɾ³ý²Ù×÷³É±¾ºÜ¸ß£¬×îºÃÔÚ´´½¨Ê±¾ÍÖ¸¶¨´ó¸ÅµÄÈÝÁ¿´óС£¬¼õÉÙ¸´ÖƲÙ×÷µÄÖ´ÐдÎÊý¡£ +??????????? System.arraycopy() ???????§Ú?????????????????????????????????????????????§³????????????????§Õ????? ```java public E remove(int index) { @@ -150,9 +150,9 @@ public E remove(int index) { } ``` -Ìí¼ÓÔªËØÊ±Ê¹Óà ensureCapacity() ·½·¨À´±£Ö¤ÈÝÁ¿×ã¹»£¬Èç¹û²»¹»Ê±£¬ÐèÒª½øÐÐÀ©ÈÝ£¬Ê¹µÃÐÂÈÝÁ¿Îª¾ÉÈÝÁ¿µÄ 1.5 ±¶¡£ +?????????? ensureCapacity() ????????????????????????????????????????????????????????? 1.5 ???? -modCount ÓÃÀ´¼Ç¼ ArrayList ·¢Éú±ä»¯µÄ´ÎÊý£¬ÒòΪÿ´ÎÔÚ½øÐÐ add() ºÍ addAll() ʱ¶¼ÐèÒªµ÷Óà ensureCapacity()£¬Òò´ËÖ±½ÓÔÚ ensureCapacity() ÖÐ¶Ô modCount ½øÐÐÐ޸ġ£ +modCount ??????? ArrayList ?????�£?????????????????? add() ?? addAll() ?????????? ensureCapacity()?????????? ensureCapacity() ?§Ø? modCount ???????? ```java public void ensureCapacity(int minCapacity) { @@ -190,7 +190,7 @@ private static int hugeCapacity(int minCapacity) { } ``` -ÔÚ½øÐÐÐòÁл¯»òÕßµü´úµÈ²Ù×÷ʱ£¬ÐèÒª±È½Ï²Ù×÷ǰºó modCount ÊÇ·ñ¸Ä±ä£¬Èç¹û¸Ä±äÁËÐèÒªÅ׳ö ConcurrentModificationException¡£ +????????§Ý???????????????????????????? modCount ??????????????????? ConcurrentModificationException?? ```java private void writeObject(java.io.ObjectOutputStream s) @@ -213,20 +213,20 @@ private void writeObject(java.io.ObjectOutputStream s) } ``` -**ºÍ Vector µÄÇø±ð** +**?? Vector ??????** -1. Vector ºÍ ArrayList ¼¸ºõÊÇÍêÈ«ÏàͬµÄ£¬Î¨Ò»µÄÇø±ðÔÚÓÚ Vector ÊÇͬ²½µÄ£¬Òò´Ë¿ªÏú¾Í±È ArrayList Òª´ó£¬·ÃÎÊÒªÂý¡£×îºÃʹÓà ArrayList ¶ø²»ÊÇ Vector£¬ÒòΪͬ²½ÍêÈ«¿ÉÒÔÓɳÌÐòÔ±×Ô¼ºÀ´¿ØÖÆ£» -2. Vector ÿ´ÎÀ©ÈÝÇëÇóÆä´óСµÄ 2 ±¶¿Õ¼ä£¬¶ø ArrayList ÊÇ 1.5 ±¶¡£ +1. Vector ?? ArrayList ???????????????¦·??????????? Vector ????????????????? ArrayList ????????????????? ArrayList ?????? Vector??????????????????????????????? +2. Vector ??????????????§³?? 2 ??????? ArrayList ?? 1.5 ???? -ΪÁËʹÓÃḬ̈߳²È«µÄ ArrayList£¬¿ÉÒÔʹÓà Collections.synchronizedList(new ArrayList<>()); ·µ»ØÒ»¸öḬ̈߳²È«µÄ ArrayList£¬Ò²¿ÉÒÔʹÓà concurrent ²¢·¢°üÏ嵀 CopyOnWriteArrayList Àࣻ +????????????? ArrayList????????? Collections.synchronizedList(new ArrayList<>()); ?????????????? ArrayList?????????? concurrent ????????? CopyOnWriteArrayList ?? -**ºÍ LinkedList µÄÇø±ð** +**?? LinkedList ??????** -1. ArrayList »ùÓÚ¶¯Ì¬Êý×éʵÏÖ£¬LinkedList »ùÓÚË«ÏòÑ­»·Á´±íʵÏÖ£» -2. ArrayList Ö§³ÖËæ»ú·ÃÎÊ£¬LinkedList ²»Ö§³Ö£» -3. LinkedList ÔÚÈÎÒâλÖÃÌí¼Óɾ³ýÔªËØ¸ü¿ì¡£ +1. ArrayList ??????????????LinkedList ?????????????????? +2. ArrayList ???????????LinkedList ?????? +3. LinkedList ??????¦Ë?????????????? -## 2. Vector Óë Stack +## 2. Vector ?? Stack [Vector.java](https://github.com/CyC2018/InterviewNotes/blob/master/notes/src/Vector.java) @@ -242,13 +242,13 @@ private void writeObject(java.io.ObjectOutputStream s) [HashMap.java](https://github.com/CyC2018/InterviewNotes/blob/master/notes/src/HashMap.java) -ʹÓÃÀ­Á´·¨À´½â¾ö³åÍ»¡£ +??????????????????? -ĬÈÏÈÝÁ¿ capacity Ϊ 16£¬ÐèҪעÒâµÄÊÇÈÝÁ¿±ØÐ뱣֤Ϊ 2 µÄ´Î·½¡£ÈÝÁ¿¾ÍÊÇ Entry[] table Êý×éµÄ³¤¶È£¬size ÊÇÊý×éµÄʵ¼ÊʹÓÃÁ¿¡£ +??????? capacity ? 16????????????????????? 2 ??¦Ç??????????? Entry[] table ?????????size ????????????????? -threshold ¹æ¶¨ÁËÒ»¸ö size µÄÁÙ½çÖµ£¬size ±ØÐëСÓÚ threshold£¬Èç¹û´óÓÚµÈÓÚ£¬¾Í±ØÐë½øÐÐÀ©ÈݲÙ×÷¡£ +threshold ?ÕÇ????? size ????????size ????§³?? threshold?????????????????????????????? -threshold = capacity * load_factor£¬ÆäÖÐ load_factor Ϊ table Êý×éÄܹ»Ê¹ÓõıÈÀý£¬load_factor ¹ý´ó»áµ¼Ö¾۴صijöÏÖ£¬´Ó¶øÓ°Ïì²éѯºÍ²åÈëµÄЧÂÊ£¬Ïê¼ûËã·¨±Ê¼Ç¡£ +threshold = capacity * load_factor?????? load_factor ? table ????????????????load_factor ????????????????????????????§¹???????????? ```java static final int DEFAULT_INITIAL_CAPACITY = 16; @@ -268,7 +268,7 @@ final float loadFactor; transient int modCount; ``` -´ÓÏÂÃæµÄÌí¼ÓÔªËØ´úÂëÖпÉÒÔ¿´³ö£¬µ±ÐèÒªÀ©ÈÝʱ£¬Áî capacity ΪԭÀ´µÄÁ½±¶¡£ +?????????????????§á?????????????????????? capacity ???????????? ```java void addEntry(int hash, K key, V value, int bucketIndex) { @@ -279,7 +279,7 @@ void addEntry(int hash, K key, V value, int bucketIndex) { } ``` -Entry ÓÃÀ´±íʾһ¸ö¼üÖµ¶ÔÔªËØ£¬ÆäÖÐµÄ next Ö¸ÕëÔÚÐòÁл¯Ê±»áʹÓᣠ+Entry ??????????????????????§Ö? next ????????§Ý??????¨¢? ```java static class Entry implements Map.Entry { @@ -290,7 +290,7 @@ static class Entry implements Map.Entry { } ``` -get() ²Ù×÷ÐèÒª·Ö³ÉÁ½ÖÖÇé¿ö£¬key Ϊ null ºÍ ²»Îª null£¬´ÓÖпÉÒÔ¿´³ö HashMap ÔÊÐí²åÈë null ×÷Ϊ¼ü¡£ +get() ???????????????????key ? null ?? ??? null?????§á?????? HashMap ??????? null ??????? ```java public V get(Object key) { @@ -306,7 +306,7 @@ public V get(Object key) { } ``` -put() ²Ù×÷Ò²ÐèÒª¸ù¾Ý key ÊÇ·ñΪ null ×ö²»Í¬µÄ´¦Àí£¬ÐèҪעÒâµÄÊÇÈç¹û±¾À´Ã»ÓÐ key Ϊ null µÄ¼üÖµ¶Ô£¬Ð²åÈëÒ»¸ö key Ϊ null µÄ¼üÖµ¶ÔʱĬÈÏÊÇ·ÅÔÚÊý×éµÄ 0 λÖã¬ÕâÊÇÒòΪ null ²»ÄܼÆËã hash Öµ£¬Ò²¾ÍÎÞ·¨ÖªµÀÓ¦¸Ã·ÅÔÚÄĸöÁ´±íÉÏ¡£ +put() ???????????? key ???? null ????????????????????????????? key ? null ??????????????? key ? null ???????????????????? 0 ¦Ë?????????? null ??????? hash ??????????????¡Â????????????? ```java public V put(K key, V value) { @@ -354,8 +354,8 @@ private V putForNullKey(V value) { [ConcurrentHashMap.java](https://github.com/CyC2018/InterviewNotes/blob/master/notes/src/HashMap.java) -[ ̽Ë÷ ConcurrentHashMap ¸ß²¢·¢ÐÔµÄʵÏÖ»úÖÆ ](https://www.ibm.com/developerworks/cn/java/java-lo-concurrenthashmap/) +[ ??? ConcurrentHashMap ?????????????? ](https://www.ibm.com/developerworks/cn/java/java-lo-concurrenthashmap/) -# ²Î¿¼×ÊÁÏ +# ?¦Ï????? -- Java ±à³Ì˼Ïë +- Java ?????? diff --git a/notes/Leetcode 题解.md b/notes/Leetcode 题解.md index 0727747e..d28a471f 100644 --- a/notes/Leetcode 题解.md +++ b/notes/Leetcode 题解.md @@ -1,67 +1,67 @@ -* [Ë㷨˼Ïë](#Ë㷨˼Ïë) - * [¶þ·Ö²éÕÒ](#¶þ·Ö²éÕÒ) - * [̰ÐÄ˼Ïë](#̰ÐÄ˼Ïë) - * [˫ָÕë](#˫ָÕë) - * [ÅÅÐò](#ÅÅÐò) - * [¿ìËÙÑ¡Ôñ](#¿ìËÙÑ¡Ôñ) - * [¶ÑÅÅÐò](#¶ÑÅÅÐò) - * [ͰÅÅÐò](#ͰÅÅÐò) - * [ËÑË÷](#ËÑË÷) +* [?????](#?????) + * [???????](#???????) + * [??????](#??????) + * [????](#????) + * [????](#????) + * [???????](#???????) + * [??????](#??????) + * [?????](#?????) + * [????](#????) * [BFS](#bfs) * [DFS](#dfs) * [Backtracking](#backtracking) - * [·ÖÖÎ](#·ÖÖÎ) - * [µÝ¹é](#µÝ¹é) - * [¶¯Ì¬¹æ»®](#¶¯Ì¬¹æ»®) - * [·Ö¸îÕûÊý](#·Ö¸îÕûÊý) - * [¾ØÕó·¾¶](#¾ØÕó·¾¶) - * [ì³²¨ÄÇÆõÊýÁÐ](#ì³²¨ÄÇÆõÊýÁÐ) - * [×µÝÔö×ÓÐòÁÐ](#×µÝÔö×ÓÐòÁÐ) - * [×¹«¹²×ÓϵÁÐ](#×¹«¹²×ÓϵÁÐ) - * [0-1 ±³°ü](#0-1-±³°ü) - * [Êý×éÇø¼ä](#Êý×éÇø¼ä) - * [×Ö·û´®±à¼­](#×Ö·û´®±à¼­) - * [ÆäËüÎÊÌâ](#ÆäËüÎÊÌâ) - * [Êýѧ](#Êýѧ) - * [ËØÊý](#ËØÊý) - * [×î´ó¹«Ô¼Êý](#×î´ó¹«Ô¼Êý) - * [½øÖÆ×ª»»](#½øÖÆ×ª»») - * [½×³Ë](#½×³Ë) - * [×Ö·û´®¼Ó·¨¼õ·¨](#×Ö·û´®¼Ó·¨¼õ·¨) - * [ÏàÓöÎÊÌâ](#ÏàÓöÎÊÌâ) - * [¶àÊýͶƱÎÊÌâ](#¶àÊýͶƱÎÊÌâ) - * [ÆäËü](#ÆäËü) -* [Êý¾Ý½á¹¹Ïà¹Ø](#Êý¾Ý½á¹¹Ïà¹Ø) - * [Õ»ºÍ¶ÓÁÐ](#Õ»ºÍ¶ÓÁÐ) - * [¹þÏ£±í](#¹þÏ£±í) - * [×Ö·û´®](#×Ö·û´®) - * [Êý×éÓë¾ØÕó](#Êý×éÓë¾ØÕó) - * [ÓÐÐò¾ØÕó](#ÓÐÐò¾ØÕó) - * [Á´±í](#Á´±í) - * [Ê÷](#Ê÷) - * [µÝ¹é](#µÝ¹é) - * [²ã´Î±éÀú](#²ã´Î±éÀú) - * [ǰÖкóÐò±éÀú](#ǰÖкóÐò±éÀú) + * [????](#????) + * [???](#???) + * [????œý](#????œý) + * [???????](#???????) + * [????¡¤??](#????¡¤??) + * [??????????](#??????????) + * [????????????](#????????????) + * [???????????](#???????????) + * [0-1 ????](#0-1-????) + * [????????](#????????) + * [???????](#???????) + * [????????](#????????) + * [???](#???) + * [????](#????) + * [??????](#??????) + * [???????](#???????) + * [???](#???) + * [????????????](#????????????) + * [????????](#????????) + * [??????????](#??????????) + * [????](#????) +* [????????](#????????) + * [??????](#??????) + * [?????](#?????) + * [?????](#?????) + * [?????????](#?????????) + * [???????](#???????) + * [????](#????) + * [??](#??) + * [???](#???) + * [??¦Á???](#??¦Á???) + * [??§Ü??????](#??§Ü??????) * [BST](#bst) * [Trie](#trie) - * [ͼ](#ͼ) - * [λÔËËã](#λÔËËã) -* [²Î¿¼×ÊÁÏ](#²Î¿¼×ÊÁÏ) + * [?](#?) + * [¦Ë????](#¦Ë????) +* [?¦Ï?????](#?¦Ï?????) -# Ë㷨˼Ïë +# ????? -## ¶þ·Ö²éÕÒ +## ??????? -¶þ·Ö²éÕÒ˼Ïë¼òµ¥£¬µ«ÊÇÔÚʵÏÖʱÓÐһЩÐèҪעÒâµÄϸ½Ú£º +?????????????????????????§»??????????? -1. ÔÚ¼ÆËã mid ʱ²»ÄÜʹÓà mid = (l + h) / 2 ÕâÖÖ·½Ê½£¬ÒòΪ l + h ¿ÉÄܻᵼÖ¼ӷ¨Òç³ö£¬Ó¦¸ÃʹÓà mid = l + (h - l) / 2 ¡£ +1. ????? mid ???????? mid = (l + h) / 2 ??????????? l + h ???????????????????? mid = l + (h - l) / 2 ?? -2. ¶Ô h µÄ¸³ÖµºÍÑ­»·Ìõ¼þÓйأ¬µ±Ñ­»·Ìõ¼þΪ l <= h ʱ£¬h = mid - 1£»µ±Ñ­»·Ìõ¼þΪ l < h ʱ£¬h = mid¡£ -½âÊÍÈçÏ£ºÔÚÑ­»·Ìõ¼þΪ l <= h ʱ£¬Èç¹û h = mid£¬»á³öÏÖÑ­»·ÎÞ·¨Í˳öµÄÇé¿ö£¬ÀýÈç l = 1£¬h = 1£¬´Ëʱ mid Ò²µÈÓÚ 1£¬Èç¹û´Ëʱ¼ÌÐøÖ´ÐÐ h = mid £¬ÄÇô¾Í»áÎÞÏÞÑ­»·£»ÔÚÑ­»·Ìõ¼þΪ l < h £¬Èç¹û h = mid - 1£¬»á´íÎóÌø¹ý²éÕÒµÄÊý£¬ÀýÈç¶ÔÓÚÊý×é 1,2,3 £¬Òª²éÕÒ 1 £¬×ʼ l = 0£¬h = 2£¬mid = 1£¬ÅÐ¶Ï key < arr[mid] Ö´ÐÐ h = mid - 1 = 0£¬´Ëʱѭ»·Í˳ö£¬Ö±½Ó°Ñ²éÕÒµÄÊýÌø¹ýÁË¡£ +2. ?? h ??????????????§Û???????????? l <= h ???h = mid - 1???????????? l < h ???h = mid?? +??????????????????? l <= h ?????? h = mid??????????????????????????? l = 1??h = 1????? mid ????? 1??????????????? h = mid ??????????????????????????? l < h ????? h = mid - 1??????????????????????????????? 1,2,3 ??????? 1 ????? l = 0??h = 2??mid = 1???§Ø? key < arr[mid] ??? h = mid - 1 = 0?????????????????????????????? -3. l µÄ¸³ÖµÒ»°ã¶¼Îª l = mid + 1¡£ +3. l ???????? l = mid + 1?? ```java public int search(int key, int[] arr) { @@ -76,11 +76,11 @@ public int search(int key, int[] arr) { } ``` -**Ç󿪷½** +**???** [Leetcode : 69. Sqrt(x) (Easy)](https://leetcode.com/problems/sqrtx/description/) -Ò»¸öÊý x µÄ¿ª·½ sqrt Ò»¶¨ÔÚ 0 \~ x Ö®¼ä£¬²¢ÇÒÂú×ã sqrt == x / sqrt ¡£¿ÉÒÔÀûÓöþ·Ö²éÕÒÔÚ 0 \~ x Ö®¼ä²éÕÒ sqrt¡£ +????? x ????? sqrt ????? 0 \~ x ??????????? sqrt == x / sqrt ?????????????????? 0 \~ x ?????? sqrt?? ```java public int mySqrt(int x) { @@ -97,7 +97,7 @@ public int mySqrt(int x) { } ``` -**°ÚÓ²±Ò** +**?????** [Leetcode : 441. Arranging Coins (Easy)](https://leetcode.com/problems/arranging-coins/description/) @@ -105,17 +105,17 @@ public int mySqrt(int x) { n = 8 The coins can form the following rows: -¡è -¡è ¡è -¡è ¡è ¡è -¡è ¡è +?? +?? ?? +?? ?? ?? +?? ?? Because the 4th row is incomplete, we return 3. ``` -ÌâÄ¿ÃèÊö£ºµÚ i ÐÐ°Ú i ¸ö£¬Í³¼ÆÄܹ»ÅÅÁеÄÐÐÊý¡£ +??????????? i ?§Ñ? i ?????????????§Ö??????? -·µ»Ø h ¶ø²»ÊÇ l£¬ÒòΪ°ÚµÄÓ²±Ò×îºóÒ»Ðв»ÄÜËã½øÈ¥¡£ +???? h ?????? l????????????????§Ó????????? ```java public int arrangeCoins(int n) { @@ -131,7 +131,7 @@ public int arrangeCoins(int n) { } ``` -¿ÉÒÔ²»Óöþ·Ö²éÕÒ£¬¸üÖ±¹ÛµÄ½â·¨ÈçÏ£º +?????????????????????????? ```java public int arrangeCoins(int n) { @@ -144,18 +144,18 @@ public int arrangeCoins(int n) { } ``` -**ÓÐÐòÊý×éµÄ Single Element** +**????????? Single Element** [Leetcode : 540. Single Element in a Sorted Array (Medium)](https://leetcode.com/problems/single-element-in-a-sorted-array/description/) -ÌâÄ¿ÃèÊö£ºÒ»¸öÓÐÐòÊý×éÖ»ÓÐÒ»¸öÊý²»³öÏÖÁ½´Î£¬ÕÒ³öÕâ¸öÊý¡£ +?????????????????????????????????????¦²??????????? ```java public int singleNonDuplicate(int[] nums) { int l = 0, h = nums.length - 1; while(l < h) { int m = l + (h - l) / 2; - if(m % 2 == 1) m--; // ±£Ö¤ l/h/m ¶¼ÔÚżÊýλ£¬Ê¹µÃ²éÕÒÇø¼ä´óСһֱ¶¼ÊÇ ÆæÊý + if(m % 2 == 1) m--; // ??? l/h/m ???????¦Ë????¨°????????§³?????? ???? if(nums[m] == nums[m + 1]) l = m + 2; else h = m; } @@ -163,19 +163,19 @@ public int singleNonDuplicate(int[] nums) { } ``` -## ̰ÐÄ˼Ïë +## ?????? -̰ÐÄ˼Ï뱣֤ÿ´Î²Ù×÷¶¼ÊǾֲ¿×îÓŵ쬲¢ÇÒ×îºóµÃµ½µÄ½á¹ûÊÇÈ«¾Ö×îÓŵġ£ +?????????¦Â??????????????????????????????????????? -**·ÖÅä±ý¸É** +**???????** [Leetcode : 455. Assign Cookies (Easy)](https://leetcode.com/problems/assign-cookies/description/) -ÌâÄ¿ÃèÊö£ºÃ¿¸öº¢×Ó¶¼ÓÐÒ»¸öÂú×ã¶È£¬Ã¿¸ö±ý¸É¶¼ÓÐÒ»¸ö´óС£¬Ö»Óбý¸ÉµÄ´óС´óÓÚÒ»¸öº¢×ÓµÄÂú×ã¶È£¬¸Ãº¢×ӲŻá»ñµÃÂú×ã¡£Çó½â×î¶à¿ÉÒÔ»ñµÃÂú×ãµÄº¢×ÓÊýÁ¿¡£ +???????????????????????????????????????????§³????§Ò?????§³???????????????????¨²???????????????????????????????????? -ÒòΪ×îСµÄº¢×Ó×îÈÝÒ׵õ½Âú×㣬Òò´ËÏÈÂú×ã×îСº¢×Ó¡£¸øÒ»¸öº¢×ӵıý¸ÉÓ¦µ±¾¡Á¿Ð¡ÓÖÄÜÂú×ã¸Ãº¢×Ó£¬ÕâÑù´ó±ý¸É¾ÍÄÜÄÃÀ´¸øÂú×ã¶È±È½Ï´óµÄº¢×Ó¡£ +?????§³????????????????????????????§³?????????????????????????§³????????¨²??????????????????????????????????? -Ö¤Ã÷£º¼ÙÉèÔÚij´ÎÑ¡ÔñÖУ¬Ì°ÐIJßÂÔÑ¡Ôñ¸øµÚ i ¸öº¢×Ó·ÖÅäµÚ m ¸ö±ý¸É£¬²¢ÇÒµÚ i ¸öº¢×ÓÂú×ã¶È×îС£¬µÚ m ¸ö±ý¸ÉΪ¿ÉÒÔÂú×ãµÚ i ¸öº¢×ÓµÄ×îС±ý¸É£¬ÀûÓÃ̰ÐIJßÂÔ×îÖÕ¿ÉÒÔÂú×ã k ¸öº¢×Ó¡£¼ÙÉè×îÓŲßÂÔÔÚÕâ´ÎÑ¡ÔñÖиø i ¸öº¢×Ó·ÖÅäµÚ n ¸ö±ý¸É£¬²¢ÇÒÕâ¸ö±ý¸É´óÓÚµÚ m ¸ö±ý¸É£¬ÄÇô×îÓŲßÂÔ×îÖÕÐèÒªÂú×ã´óÓÚ k ¸öº¢×Ó¡£ÎÒÃÇ·¢ÏÖʹÓÃµÚ m ¸ö±ý¸ÉÈ¥Ìæ´úµÚ n ¸ö±ý¸ÉÍêÈ«²»Ó°ÏìºóÐøµÄ½á¹û£¬Òò´Ḛ̈ÐIJßÂÔ¾ÍÊÇ×îÓŲßÂÔ£¬Òò´Ḛ̈ÐIJßÂÔÊÇ×îÓŵġ£ +??????????????????§µ????????????? i ?????????? m ???????????? i ?????????????§³???? m ???????????????? i ?????????§³?????????????????????????? k ???????????????????????????§Ú? i ?????????? n ?????????????????????? m ??????????????????????????????? k ?????????????????? m ???????????? n ???????????????????????????????????????????????????????????? ```java public int findContentChildren(int[] g, int[] s) { @@ -190,7 +190,7 @@ public int findContentChildren(int[] g, int[] s) { } ``` -**Ͷ·ÉïÚ´ÌÆøÇò** +**??????????** [Leetcode : 452. Minimum Number of Arrows to Burst Balloons (Medium)](https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/description/) @@ -202,7 +202,7 @@ Output: 2 ``` -ÌâÄ¿ÃèÊö£ºÆøÇòÔÚÒ»¸öˮƽÊýÖáÉϰڷţ¬¿ÉÒÔÖØµþ£¬·ÉïÚ´¹Ö±ÉäÏò×ø±êÖᣬʹµÃ·¾¶ÉÏµÄÆøÇò¶¼»á´ÌÆÆ£¬Çó½â×îСµÄͶ·ÉïÚ´ÎÊý¡£ +?????????????????????????????????????????????????????????¡¤???????????????????§³???????????? ```java public int findMinArrowShots(int[][] points) { @@ -221,13 +221,13 @@ public int findMinArrowShots(int[][] points) { } ``` -**¹ÉƱµÄ×î´óÊÕÒæ** +**????????????** [Leetcode : 122. Best Time to Buy and Sell Stock II (Easy)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/description/) -ÏÈÂòÈë¹ÉƱ£¬È»ºó³öÊÛ¹ÉÆ±£¬´Ó¶ø»ñµÃ²î¼Û´øÀ´µÄÊÕÒæ¡£ +?????????????????????????¨°??????????µµ -¶ÔÓÚÒ»¸ö½»Ò× [a, b, c, d]£¬Èç¹ûÓÐ a <= b <= c <= d £¬ÄÇô×î´óÊÕÒæÎª d - a = (d - c) + (c - b) + (b - a) ¡£µ±·ÃÎʵ½Ò»¸ö prices[i] ÇÒ prices[i] - prices[i-1] £¬ÄÇô¾Í°Ñ prices[i] - prices[i-1] ¼Óµ½ÊÕÒæÖУ¬´Ó¶øÔÚ¾Ö²¿×îÓŵÄÇé¿öÏÂÒ²±£Ö¤È«¾Ö×îÓÅ¡£ +??????????? [a, b, c, d]??????? a <= b <= c <= d ????????????? d - a = (d - c) + (c - b) + (b - a) ???????????? prices[i] ?? prices[i] - prices[i-1] ???????? prices[i] - prices[i-1] ????????§µ?????????????????????????????? ```java public int maxProfit(int[] prices) { @@ -239,7 +239,7 @@ public int maxProfit(int[] prices) { } ``` -**ÖÖÖ²»¨¶ä** +**???????** [Leetcode : 605. Can Place Flowers (Easy)](https://leetcode.com/problems/can-place-flowers/description/) @@ -248,7 +248,7 @@ Input: flowerbed = [1,0,0,0,1], n = 1 Output: True ``` -ÌâÄ¿ÃèÊö£º»¨¶äÖ®¼äÖÁÉÙÐèÒªÒ»¸öµ¥Î»µÄ¼ä¸ô¡£ +????????????????????????????¦Ë?????? ```java public boolean canPlaceFlowers(int[] flowerbed, int n) { @@ -266,15 +266,15 @@ public boolean canPlaceFlowers(int[] flowerbed, int n) { } ``` -**ÐÞ¸ÄÒ»¸öÊý³ÉΪ·ÇµÝ¼õÊý×é** +**???????????????????** [Leetcode : 665. Non-decreasing Array (Easy)](https://leetcode.com/problems/non-decreasing-array/description/) -ÌâÄ¿ÃèÊö£ºÅжÏÒ»¸öÊý×éÄܲ»ÄÜÖ»ÐÞ¸ÄÒ»¸öÊý¾Í³ÉΪ·ÇµÝ¼õÊý×é¡£ +??????????§Ø?????????????????????????????????î• -ÔÚ nums[i] < nums[i - 1] µÄÇé¿öÏ£¬»áÓÅÏÈ¿¼ÂÇÁî nums[i - 1] = nums[i]£¬ÒòΪÈç¹ûÐÞ¸Ä nums[i] = nums[i - 1] µÄ»°£¬ÄÇô nums[i] Õâ¸öÊý»á±ä´ó£¬ÄÇô¾ÍÓпÉÄÜ±È nums[i + 1] ´ó£¬ÎÒÃÇÒª¾¡Á¿Ê¹ nums[i] ¸üС¡£ +?? nums[i] < nums[i - 1] ??????????????????? nums[i - 1] = nums[i]??????????? nums[i] = nums[i - 1] ???????? nums[i] ???????????????§á???? nums[i + 1] ???????????? nums[i] ??§³?? -µ«ÊÇÔÚ nums[i] < nums[i - 2] µÄÇé¿öÏ£¬Ö»ÐÞ¸Ä nums[i - 1] ²»ÄÜÁîÊý×é³ÉΪ·ÇµÝ¼õ£¬Ö»ÄÜͨ¹ýÐÞ¸Ä nums[i] = nums[i - 1] ²ÅÐС£ +?????? nums[i] < nums[i - 2] ???????????? nums[i - 1] ??????????????????????????? nums[i] = nums[i - 1] ???§³? ```java public boolean checkPossibility(int[] nums) { @@ -290,7 +290,7 @@ public boolean checkPossibility(int[] nums) { } ``` -**ÅжÏÊÇ·ñΪ×Ó´®** +**?§Ø????????** [Leetcode : 392. Is Subsequence (Medium)](https://leetcode.com/problems/is-subsequence/description/) @@ -309,7 +309,7 @@ public boolean isSubsequence(String s, String t) { } ``` -**·Ö¸ô×Ö·û´®Ê¹Í¬ÖÖ×Ö·û³öÏÖÔÚÒ»Æð** +**????????????????????????** [Leetcode : 763. Partition Labels (Medium)](https://leetcode.com/problems/partition-labels/description/) @@ -333,7 +333,7 @@ public List partitionLabels(String S) { } ``` -**¸ù¾ÝÉí¸ßºÍÐòºÅÖØ×é¶ÓÁÐ** +**??????????????????** ```html Input: @@ -343,9 +343,9 @@ Output: [[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]] ``` -Ò»¸öѧÉúÓÃÁ½¸ö·ÖÁ¿ (h, k) ÃèÊö£¬h ±íʾÉí¸ß£¬k ±íʾÅÅÔÚÇ°ÃæµÄÓÐ k ¸öѧÉúµÄÉí¸ß±ÈËû¸ß»òÕߺÍËûÒ»Ñù¸ß¡£ +???????????????? (h, k) ??????h ???????k ????????????? k ??????????????????????????? -ÏÈÅÅÐò£ºÉí¸ß½µÐò¡¢k ÖµÉýÐò£¬È»ºó°´ÅźÃÐòµÄ˳Ðò²åÈë¶ÓÁÐµÄµÚ k ¸öλÖÃÖС£ +????????????k ??????????????????????§Ö?? k ??¦Ë???§³? ```java public int[][] reconstructQueue(int[][] people) { @@ -374,17 +374,17 @@ public int[][] reconstructQueue(int[][] people) { ``` -## ˫ָÕë +## ???? -˫ָÕëÖ÷ÒªÓÃÓÚ±éÀúÊý×飬Á½¸öÖ¸ÕëÖ¸Ïò²»Í¬µÄÔªËØ£¬´Ó¶øÐ­Í¬Íê³ÉÈÎÎñ¡£ +?????????????????ï…????????????????????§¿???????? -**´ÓÒ»¸öÒѾ­ÅÅÐòµÄÊý×éÖвéÕÒ³öÁ½¸öÊý£¬Ê¹ËüÃǵĺÍΪ 0** +**??????????????????§Ó???????????????????? 0** -[Leetcode £º167. Two Sum II - Input array is sorted (Easy)](https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/description/) +[Leetcode ??167. Two Sum II - Input array is sorted (Easy)](https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/description/) -ʹÓÃ˫ָÕ룬һ¸öÖ¸ÕëÖ¸ÏòÔªËØ½ÏСµÄÖµ£¬Ò»¸öÖ¸ÕëÖ¸ÏòÔªËØ½Ï´óµÄÖµ¡£Ö¸Ïò½ÏÐ¡ÔªËØµÄÖ¸Õë´ÓÍ·Ïòβ±éÀú£¬Ö¸Ïò½Ï´óÔªËØµÄÖ¸Õë´ÓβÏòÍ·±éÀú¡£ +????????????????????§³???????????????????????????§³???????????¦Â???????????????????¦Â????????? -Èç¹ûÁ½¸öÖ¸ÕëÖ¸ÏòÔªËØµÄºÍ sum == target£¬ÄÇôµÃµ½ÒªÇóµÄ½á¹û£»Èç¹û sum > target£¬Òƶ¯½Ï´óµÄÔªËØ£¬Ê¹ sum ±äСһЩ£»Èç¹û sum < target£¬Òƶ¯½ÏСµÄÔªËØ£¬Ê¹ sum ±ä´óһЩ¡£ +?????????????????? sum == target??????????????????? sum > target?????????????? sum ??§³?§»????? sum < target???????§³??????? sum ????§»?? ```java public int[] twoSum(int[] numbers, int target) { @@ -399,21 +399,21 @@ public int[] twoSum(int[] numbers, int target) { } ``` -´ËÎÊÌâ¿ÉÀ©Õ¹³ÉÈý¸öÔªËØºÍΪ 0 µÄÎÊÌ⣺[³ÌÐòÔ±´úÂëÃæÊÔÖ¸ÄÏ P351](#) +????????????????????? 0 ??????[???????????????? P351](#) -**Êý×éÖÐÀÛ¼ÓºÍΪ¸ø¶¨ÖµµÄ××ÓÊý×鳤¶È** +**?????????????????????????øA??** -[³ÌÐòÔ±´úÂëÃæÊÔÖ¸ÄÏ P354/P355/P358](#) +[???????????????? P354/P355/P358](#) -**ÔÚÐкÍÁж¼ÅźÃÐòµÄ¾ØÕóÖвéÕÒÔªËØ** +**???§Ü??§Ø???????????§Ó??????** -[³ÌÐòÔ±´úÂëÃæÊÔÖ¸ÄÏ P347](#) +[???????????????? P347](#) -**·´×ª×Ö·û´®ÖеÄÔªÒô×Ö·û** +**?????????§Ö???????** [Leetcode : 345. Reverse Vowels of a String (Easy)](https://leetcode.com/problems/reverse-vowels-of-a-string/description/) -ʹÓÃ˫ָÕ룬ָÏò´ý·´×ªµÄÁ½¸öÔªÒô×Ö·û£¬Ò»¸öÖ¸Õë´ÓÍ·Ïòβ±éÀú£¬Ò»¸öÖ¸Õë´Óβµ½Í·±éÀú¡£ +??????????????????????????????????????¦Â?????????????¦Â????????? ```java private HashSet vowels = new HashSet<>(Arrays.asList('a','e','i','o','u','A','E','I','O','U')); @@ -442,11 +442,11 @@ public String reverseVowels(String s) { } ``` -**Á½Êýƽ·½ºÍ** +**?????????** [Leetcode : 633. Sum of Square Numbers (Easy)](https://leetcode.com/problems/sum-of-square-numbers/description/) -ÅжÏÒ»¸öÊýÊÇ·ñΪÁ½¸öÊýµÄƽ·½ºÍ£¬ÀýÈç 5 = 12 + 22¡£ +?§Ø???????????????????????????? 5 = 12 + 22?? ```java public boolean judgeSquareSum(int c) { @@ -461,7 +461,7 @@ public boolean judgeSquareSum(int c) { } ``` -**×Ö·û´®»ØÎÄÊý£¨¿Éɾ³ýÒ»¸ö×Ö·û£©** +**??????????????????????????** [Leetcode : 680. Valid Palindrome II (Easy)](https://leetcode.com/problems/valid-palindrome-ii/description/) @@ -489,15 +489,15 @@ private boolean isPalindrome(String s, int l, int r){ } ``` -**¹é²¢Á½¸öÓÐÐòÊý×é** +**?öã????????????** [Leetcode : 88. Merge Sorted Array (Easy)](https://leetcode.com/problems/merge-sorted-array/description/) -°Ñ¹é²¢½á¹û´æµ½µÚÒ»¸öÊý×éÉÏ¡£ +??öã????›Ô???????????? ```java public void merge(int[] nums1, int m, int[] nums2, int n) { - int i = m - 1, j = n - 1; // ÐèÒª´Óβ¿ªÊ¼±éÀú£¬·ñÔòÔÚ nums1 ÉϹ鲢µÃµ½µÄÖµ»á¸²¸Ç»¹Î´½øÐй鲢±È½ÏµÄÖµ + int i = m - 1, j = n - 1; // ?????¦Â??????????????? nums1 ??öã???????????¦Ä???§Ûöã????? int idx = m + n - 1; while(i >= 0 || j >= 0){ if(i < 0) nums1[idx] = nums2[j--]; @@ -509,11 +509,11 @@ public void merge(int[] nums1, int m, int[] nums2, int n) { } ``` -**ÅжÏÁ´±íÊÇ·ñ´æÔÚ»·** +**?§Ø????????????** [Leetcode : 141. Linked List Cycle (Easy)](https://leetcode.com/problems/linked-list-cycle/description/) -ʹÓÃ˫ָÕ룬һ¸öÖ¸Õëÿ´ÎÒÆ¶¯Ò»¸ö½Úµã£¬Ò»¸öÖ¸Õëÿ´ÎÒÆ¶¯Á½¸ö½Úµã£¬Èç¹û´æÔÚ»·£¬ÄÇôÕâÁ½¸öÖ¸ÕëÒ»¶¨»áÏàÓö¡£ +????????????????????????????????????????????????????????????????????????????? ```java public boolean hasCycle(ListNode head) { @@ -529,7 +529,7 @@ public boolean hasCycle(ListNode head) { } ``` -**××ÓÐòÁÐ** +**????????** [Leetcode : 524. Longest Word in Dictionary through Deleting (Medium)](https://leetcode.com/problems/longest-word-in-dictionary-through-deleting/description/) @@ -559,40 +559,40 @@ public String findLongestWord(String s, List d) { } ``` -## ÅÅÐò +## ???? -### ¿ìËÙÑ¡Ôñ +### ??????? -Ò»°ãÓÃÓÚÇó½â **Kth Element** ÎÊÌ⣬¿ÉÒÔÔÚ O(n) ʱ¼ä¸´ÔÓ¶È£¬O(1) ¿Õ¼ä¸´ÔÓ¶ÈÍê³ÉÇó½â¹¤×÷¡£ +?????????? **Kth Element** ?????????? O(n) ??ÁÙ????O(1) ??ÁÙ????????????? -Óë¿ìËÙÅÅÐòÒ»Ñù£¬¿ìËÙÑ¡ÔñÒ»°ãÐèÒªÏÈ´òÂÒÊý×飬·ñÔò×Çé¿öÏÂʱ¼ä¸´ÔÓ¶ÈΪ O(n2)¡£ +???????????????????????????????????ï…?????????????ÁÙ???? O(n2)?? -### ¶ÑÅÅÐò +### ?????? -¶ÑÅÅÐòÓÃÓÚÇó½â **TopK Elements** ÎÊÌ⣬ͨ¹ýά»¤Ò»¸ö´óСΪ K µÄ¶Ñ£¬¶ÑÖеÄÔªËØ¾ÍÊÇ TopK Elements¡£µ±È»ËüÒ²¿ÉÒÔÓÃÓÚÇó½â Kth Element ÎÊÌ⣬ÒòΪ×îºó³ö¶ÑµÄÄǸöÔªËØ¾ÍÊÇ Kth Element¡£¿ìËÙÑ¡ÔñÒ²¿ÉÒÔÇó½â TopK Elements ÎÊÌ⣬ÒòΪÕÒµ½ Kth Element Ö®ºó£¬ÔÙ±éÀúÒ»´ÎÊý×飬ËùÓÐСÓÚµÈÓÚ Kth Element µÄÔªËØ¶¼ÊÇ TopK Elements¡£¿ÉÒÔ¿´µ½£¬¿ìËÙÑ¡ÔñºÍ¶ÑÅÅÐò¶¼¿ÉÒÔÇó½â Kth Element ºÍ TopK Elements ÎÊÌ⣬ֻÊÇÓпÉÄÜÐèÒª¼ä½ÓÇó½â¡£ +????????????? **TopK Elements** ???????????????§³? K ???????§Ö??????? TopK Elements??????????????????? Kth Element ??????????????????????? Kth Element????????????????? TopK Elements ?????????? Kth Element ??????????????ï…????§³????? Kth Element ???????? TopK Elements?????????????????????????????? Kth Element ?? TopK Elements ????????§á???????????? **Kth Element** [Leetocde : 215. Kth Largest Element in an Array (Medium)](https://leetcode.com/problems/kth-largest-element-in-an-array/description/) -½âÌâ²Î¿¼£º[Solution explained](https://leetcode.com/problems/kth-largest-element-in-an-array/discuss/60294/Solution-explained) +????¦Ï???[Solution explained](https://leetcode.com/problems/kth-largest-element-in-an-array/discuss/60294/Solution-explained) -- ʱ¼ä¸´ÔÓ¶È O(nlgn)£¬¿Õ¼ä¸´ÔÓ¶È O(1) ½â·¨£ºÅÅÐò -- ʱ¼ä¸´ÔÓ¶È O(nlgk)£¬¿Õ¼ä¸´ÔÓ¶È O(k) ½â·¨£º¶ÑÅÅÐò -- ʱ¼ä¸´ÔÓ¶È O(n)£¬¿Õ¼ä¸´ÔÓ¶È O(1) ½â·¨£ºQuickSelect +- ??ÁÙ??? O(nlgn)????ÁÙ??? O(1) ???????? +- ??ÁÙ??? O(nlgk)????ÁÙ??? O(k) ?????????? +- ??ÁÙ??? O(n)????ÁÙ??? O(1) ????QuickSelect **ToK Elements** -[³ÌÐòÔ±´úÂëÃæÊÔÖ¸ÄÏ P336](#) +[???????????????? P336](#) -### ͰÅÅÐò +### ????? -**ÕÒ³ö³öÏÖÆµÂÊ×î¶àµÄ k ¸öÊý** +**?????????????? k ????** [Leetcode : 347. Top K Frequent Elements (Medium)](https://leetcode.com/problems/top-k-frequent-elements/description/) -ͰÅÅÐò +????? ```java public List topKFrequent(int[] nums, int k) { @@ -619,29 +619,29 @@ public List topKFrequent(int[] nums, int k) { } ``` -## ËÑË÷ +## ???? -Éî¶ÈÓÅÏÈËÑË÷ºÍ¹ã¶ÈÓÅÏÈËÑË÷¹ã·ºÔËÓÃÓÚÊ÷ºÍͼÖУ¬µ«ÊÇËüÃǵÄÓ¦ÓÃÔ¶Ô¶²»Ö¹Èç´Ë¡£ +?????????????????????????????????????§µ?????????????????????? ### BFS ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/4ff355cf-9a7f-4468-af43-e5b02038facc.jpg) -¹ã¶ÈÓÅÏÈËÑË÷µÄËÑË÷¹ý³ÌÓеãÏñÒ»²ãÒ»²ãµØ½øÐбéÀú£º´Ó½Úµã 0 ³ö·¢£¬±éÀúµ½ 6¡¢2¡¢1 ºÍ 5 ÕâËĸöнڵ㡣 +??????????????????????§Ö????????????§Ò????????? 0 ???????????? 6??2??1 ?? 5 ????????? -¼ÌÐø´Ó 6 ¿ªÊ¼±éÀú£¬µÃµ½½Úµã 4 £»´Ó 2 ¿ªÊ¼±éÀú£¬Ã»ÓÐÏÂÒ»¸ö½Úµã£»´Ó 1 ¿ªÊ¼±éÀú£¬Ã»ÓÐÏÂÒ»¸ö½Úµã£»´Ó 5 ¿ªÊ¼±éÀú£¬µÃµ½ 3 ºÍ 4 ½Úµã¡£ÕâÒ»ÂÖ×ܹ²µÃµ½Á½¸öнڵ㣺4 ºÍ 3 ¡£ +?????? 6 ??????????????? 4 ???? 2 ?????????????????????? 1 ?????????????????????? 5 ???????????? 3 ?? 4 ??????????????????????4 ?? 3 ?? -·´¸´´Óнڵã³ö·¢½øÐÐÉÏÊöµÄ±éÀú²Ù×÷¡£ +???????????????????????????????? -¿ÉÒÔ¿´µ½£¬Ã¿Ò»ÂÖ±éÀúµÄ½Úµã¶¼Óë¸ù½Úµã·¾¶³¤¶ÈÏàͬ¡£Éè di ±íʾµÚ i ¸ö½ÚµãÓë¸ù½ÚµãµÄ·¾¶³¤¶È£¬ÍƵ¼³öÒ»¸ö½áÂÛ£º¶ÔÓÚÏȱéÀúµÄ½Úµã i Óëºó±éÀúµÄ½Úµã j£¬ÓÐ di<=dj¡£ÀûÓÃÕâ¸ö½áÂÛ£¬¿ÉÒÔÇó½â×î¶Ì·¾¶ **×îÓŽâ** ÎÊÌ⣺µÚÒ»´Î±éÀúµ½Ä¿µÄ½Úµã£¬ÆäËù¾­¹ýµÄ·¾¶Îª×î¶Ì·¾¶£¬Èç¹û¼ÌÐø±éÀú£¬Ö®ºóÔÙ±éÀúµ½Ä¿µÄ½Úµã£¬Ëù¾­¹ýµÄ·¾¶¾Í²»ÊÇ×î¶Ì·¾¶¡£ +??????????????????????????¡¤????????????? di ????? i ????????????¡¤????????????????????????????????? i ?????????? j???? di<=dj????????????????????????¡¤?? **?????** ????????¦Á????????????????????¡¤??????¡¤????????????????????????????????????????¡¤??????????¡¤???? -ÔÚ³ÌÐòʵÏÖ BFS ʱÐèÒª¿¼ÂÇÒÔÏÂÎÊÌ⣺ +???????? BFS ???????????????? -- ¶ÓÁУºÓÃÀ´´æ´¢Ã¿Ò»ÂÖ±éÀúµÄ½Úµã -- ±ê¼Ç£º¶ÔÓÚ±éÀú¹ýµÃ½Úµã£¬Ó¦¸Ã½«Ëü±ê¼Ç£¬·ÀÖ¹ÖØ¸´±éÀú£» +- ???§µ??????›¥??????????? +- ??????????????????????????????????????? -**¼ÆËãÔÚÍø¸ñÖдÓÔ­µãµ½Ìض¨µãµÄ×î¶Ì·¾¶³¤¶È** +**???????????§Õ?????????????¡¤??????** ```html [[1,1,0,1], @@ -685,17 +685,17 @@ private class Position { ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/f7f7e3e5-7dd4-4173-9999-576b9e2ac0a2.png) -¹ã¶ÈÓÅÏÈËÑË÷Ò»²ãÒ»²ã±éÀú£¬Ã¿Ò»²ã±éÀúµ½µÄËùÓÐнڵ㣬ҪÓöÓÁÐÏÈ´æ´¢ÆðÀ´ÒÔ±¸ÏÂÒ»²ã±éÀúµÄʱºòÔÙ±éÀú£»¶øÉî¶ÈÓÅÏÈËÑË÷ÔÚ±éÀúµ½Ò»¸öнڵãʱÁ¢Âí¶ÔÐÂ½Úµã½øÐбéÀú£º´Ó½Úµã 0 ³ö·¢¿ªÊ¼±éÀú£¬µÃµ½µ½Ð½ڵã 6 ʱ£¬Á¢Âí¶Ôнڵã 6 ½øÐбéÀú£¬µÃµ½Ð½ڵã 4£»Èç´Ë·´¸´ÒÔÕâÖÖ·½Ê½±éÀúнڵ㣬ֱµ½Ã»ÓÐнڵãÁË£¬´Ëʱ·µ»Ø¡£·µ»Øµ½¸ù½Úµã 0 µÄÇé¿öÊÇ£¬¼ÌÐø¶Ô¸ù½Úµã 0 ½øÐбéÀú£¬µÃµ½Ð½ڵã 2£¬È»ºó¼ÌÐøÒÔÉϲ½Öè¡£ +?????????????????????????????????????????????????›¥??????????????????????????????????????????????????????????????????§Ò????????? 0 ?????????????????????? 6 ???????????? 6 ???§Ò???????????? 4??????????????????????????????????????????????????????? 0 ?????????????????? 0 ???§Ò???????????? 2??????????????Ò -´ÓÒ»¸ö½Úµã³ö·¢£¬Ê¹Óà DFS ¶ÔÒ»¸öͼ½øÐбéÀúʱ£¬Äܹ»±éÀúµ½µÄ½Úµã¶¼ÊÇ´Ó³õʼ½Úµã¿É´ïµÄ£¬DFS ³£ÓÃÀ´Çó½âÕâÖÖ **¿É´ïÐÔ** ÎÊÌâ¡£ +???????????????? DFS ?????????§Ò???????????????????????????????DFS ????????????? **?????** ???? -ÔÚ³ÌÐòʵÏÖ DFS ʱÐèÒª¿¼ÂÇÒÔÏÂÎÊÌ⣺ +???????? DFS ???????????????? -- Õ»£ºÓÃÕ»À´±£´æµ±Ç°½ÚµãÐÅÏ¢£¬µ±±éÀúнڵ㷵»ØÊ±Äܹ»¼ÌÐø±éÀúµ±Ç°½Úµã¡£Ò²¿ÉÒÔʹÓõݹéÕ»¡£ -- ±ê¼Ç£ººÍ BFS Ò»ÑùͬÑùÐèÒª¶ÔÒѾ­±éÀú¹ýµÃ½Úµã½øÐбê¼Ç¡£ +- ???????????›Ì???????????????????????????????????????????????????? +- ?????? BFS ??????????????????????????§Ò??? -**²éÕÒ×î´óµÄÁ¬Í¨Ãæ»ý** +**??????????????** [Leetcode : 695. Max Area of Island (Easy)](https://leetcode.com/problems/max-area-of-island/description/) @@ -731,7 +731,7 @@ private int dfs(int[][] grid, int i, int j){ } ``` -**ͼµÄÁ¬Í¨·ÖÁ¿** +**??????????** [Leetcode : 547. Friend Circles (Medium)](https://leetcode.com/problems/friend-circles/description/) @@ -771,7 +771,7 @@ private void dfs(int[][] M, int i, boolean[] hasFind) { } ``` -**¾ØÕóÖеÄÁ¬Í¨ÇøÓòÊýÁ¿** +**?????§Ö????????????** [Leetcode : 200. Number of Islands (Medium)](https://leetcode.com/problems/number-of-islands/description/) @@ -812,7 +812,7 @@ private void dfs(char[][] grid, int i, int j) { } ``` -**Êä³ö¶þ²æÊ÷ÖÐËùÓдӸùµ½Ò¶×ӵķ¾¶** +**??????????????§Õ????????¡¤??** [Leetcode : 257. Binary Tree Paths (Easy)](https://leetcode.com/problems/binary-tree-paths/description/) @@ -847,7 +847,7 @@ private void dfs(TreeNode root, String prefix, List ret){ } ``` -**Ìî³ä·â±ÕÇøÓò** +**?????????** [Leetcode : 130. Surrounded Regions (Medium)](https://leetcode.com/problems/surrounded-regions/description/) @@ -865,9 +865,9 @@ X X X X X O X X ``` -ÌâÄ¿ÃèÊö£ºÊ¹µÃ±» 'X' µÄ 'O' ת»»Îª 'X'¡£ +????????????? 'X' ?? 'O' ???? 'X'?? -¿ÉÒÔÑ¡ÔñÏÈÌî³ä×îÍâ²à£¬Ê£ÏµľÍÊÇÀï²àÁË¡£ +?????????????????????????????? ```java private int[][] direction = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; @@ -902,7 +902,7 @@ private void dfs(char[][] board, int r, int c) { } ``` -**´ÓÁ½¸ö·½Ïò¶¼Äܵ½´ïµÄÇøÓò** +**????????????????????** [Leetcode : 417. Pacific Atlantic Water Flow (Medium)](https://leetcode.com/problems/pacific-atlantic-water-flow/description/) @@ -921,7 +921,7 @@ Return: [[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (positions with parentheses in above matrix). ``` -ÌâÄ¿ÃèÊö£º×ó±ßºÍÉϱßÊÇ̫ƽÑó£¬ÓұߺÍϱßÊÇ´óÎ÷Ñó£¬ÄÚ²¿µÄÊý×Ö´ú±íº£°Î£¬º£°Î¸ßµÄµØ·½µÄË®Äܹ»Á÷µ½µÍµÄµØ·½£¬Çó½âË®Äܹ»Á÷µ½Ì«Æ½ÑóºÍ´óÎ÷ÑóµÄËùÓеط½¡£ +???????????????????????????¡À?????????????????????¦²????¦È??????????????????????????????????????????????§Ö???? ```java private int m, n; @@ -967,21 +967,21 @@ private void dfs(int r, int c, boolean[][] canReach) { } ``` -**N »Êºó** +**N ???** [Leetcode : 51. N-Queens (Hard)](https://leetcode.com/problems/n-queens/description/) ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1f080e53-4758-406c-bb5f-dbedf89b63ce.jpg) -ÌâÄ¿ÃèÊö£ºÔÚ n\*n µÄ¾ØÕóÖаڷŠn ¸ö»Êºó£¬²¢ÇÒÿ¸ö»Êºó²»ÄÜÔÚͬһÐУ¬Í¬Ò»ÁУ¬Í¬Ò»¶Ô½ÇÏßÉÏ£¬ÒªÇó½âËùÓÐµÄ n »Êºó½â¡£ +??????????? n\*n ??????§Ñ?? n ?????????????????????§µ????§µ??????????????????§Ö? n ???? -Ò»ÐÐÒ»Ðеذڷţ¬ÔÚÈ·¶¨Ò»ÐÐÖеÄÄǸö»ÊºóÓ¦¸Ã°ÚÔÚÄÄÒ»ÁÐʱ£¬ÐèÒªÓÃÈý¸ö±ê¼ÇÊý×éÀ´È·¶¨Ä³Ò»ÁÐÊÇ·ñºÏ·¨£¬ÕâÈý¸ö±ê¼ÇÊý×é·Ö±ðΪ£ºÁбê¼ÇÊý×é¡¢45 ¶È¶Ô½ÇÏß±ê¼ÇÊý×éºÍ 135 ¶È¶Ô½ÇÏß±ê¼ÇÊý×é¡£ +?????§Ö?????????????§Ö????????????????????????????????????????????????????????????????????????§Ò?????î”45 ????????????? 135 ???????????î• -45 ¶È¶Ô½ÇÏß±ê¼ÇÊý×éµÄά¶ÈΪ 2\*n - 1£¬Í¨¹ýÏÂͼ¿ÉÒÔÃ÷È· (r,c) µÄλÖÃËùÔÚµÄÊý×éϱêΪ r + c¡£ +45 ????????????????? 2\*n - 1??????????????? (r,c) ??¦Ë????????????¡À?? r + c?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/85583359-1b45-45f2-9811-4f7bb9a64db7.jpg) -135 ¶È¶Ô½ÇÏß±ê¼ÇÊý×éµÄά¶ÈÒ²ÊÇ 2\*n - 1£¬(r,c) µÄλÖÃËùÔÚµÄÊý×éϱêΪ n - 1 - (r - c)¡£ +135 ??????????????????? 2\*n - 1??(r,c) ??¦Ë????????????¡À?? n - 1 - (r - c)?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/9e80f75a-b12b-4344-80c8-1f9ccc2d5246.jpg) @@ -1032,11 +1032,11 @@ private void backstracking(int row) { ### Backtracking -»ØËÝÊÇ DFS µÄÒ»ÖÖ£¬Ëü²»ÊÇÓÃÔÚ±éÀúͼµÄ½ÚµãÉÏ£¬¶øÊÇÓÃÓÚÇó½â **ÅÅÁÐ×éºÏ** ÎÊÌ⣬ÀýÈçÓÐ { 'a','b','c' } Èý¸ö×Ö·û£¬Çó½âËùÓÐÓÉÕâÈý¸ö×Ö·ûÅÅÁеõ½µÄ×Ö·û´®¡£ +?????? DFS ?????????????????????????????????????? **???????** ?????????? { 'a','b','c' } ??????????????????????????????§Ö??????????? -ÔÚ³ÌÐòʵÏÖʱ£¬»ØËÝÐèҪעÒâ¶ÔÔªËØ½øÐбê¼ÇµÄÎÊÌ⡣ʹÓõݹéʵÏֵĻØËÝ£¬ÔÚ·ÃÎÊÒ»¸öÐÂÔªËØ½øÈëеĵݹéµ÷Ó㬴ËʱÐèÒª½«ÐÂÔªËØ±ê¼ÇΪÒѾ­·ÃÎÊ£¬ÕâÑù²ÅÄÜÔÚ¼ÌÐøµÝ¹éµ÷ÓÃʱ²»ÓÃÖØ¸´·ÃÎʸÃÔªËØ£»µ«ÊÇÔڵݹ鷵»ØÊ±£¬ÐèÒª½«¸ÃÔªËØ±ê¼ÇΪδ·ÃÎÊ£¬ÒòΪֻÐèÒª±£Ö¤ÔÚÒ»¸öµÝ¹éÁ´Öв»Í¬Ê±·ÃÎÊÒ»¸öÔªËØ£¬¶øÔÚ²»Í¬µÄµÝ¹éÁ´ÊÇ¿ÉÒÔ·ÃÎÊÒѾ­·ÃÎʹýµ«ÊDz»ÔÚµ±Ç°µÝ¹éÁ´ÖеÄÔªËØ¡£ +???????????????????????????§Ò????????????????????????????????????????????????????????????????????????????????????????????????????????????????ú“??????????????????¦Ä??????????????????????????§Ó?????????????????????????????????????????????????????????§Ö????? -**Êý×Ö¼üÅÌ×éºÏ** +**??????????** [Leetcode : 17. Letter Combinations of a Phone Number (Medium)](https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/) @@ -1070,7 +1070,7 @@ private void combination(String prefix, String digits, int offset, List } ``` -**ÔÚ¾ØÕóÖÐѰÕÒ×Ö·û´®** +**???????????????** [Leetcode : 79. Word Search (Medium)](https://leetcode.com/problems/word-search/description/) @@ -1125,7 +1125,7 @@ private boolean dfs(char[][] board, String word, int start, int r, int c) { } ``` -**IP µØÖ·»®·Ö** +**IP ???????** [Leetcode : 93. Restore IP Addresses(Medium)](https://leetcode.com/problems/restore-ip-addresses/description/) @@ -1160,11 +1160,11 @@ private void doRestore(int k, String path, String s) { } ``` -**ÅÅÁÐ** +**????** [Leetcode : 46. Permutations (Medium)](https://leetcode.com/problems/permutations/description/) -ÌâÄ¿ÃèÊö£ºÕÒ³öÒ»×éÊýµÄËùÓÐÅÅÁС£ +??????????????????????????§³? ```java public List> permute(int[] nums) { @@ -1192,7 +1192,7 @@ private void backtracking(List permuteList, boolean[] visited, int[] nu } ``` -**²»ÄÜÖØ¸´µÄÅÅÁÐ** +**?????????????** [Leetcode : 47. Permutations II (Medium)](https://leetcode.com/problems/permutations-ii/description/) @@ -1201,7 +1201,7 @@ private void backtracking(List permuteList, boolean[] visited, int[] nu [[1,1,2], [1,2,1], [2,1,1]] ``` -ÔÚʵÏÖÉÏ£¬ºÍ Permutations ²»Í¬µÄÊÇÒªÏÈÅÅÐò£¬È»ºóÔÚÌí¼ÓÒ»¸öÔªËØÊ±£¬ÅжÏÕâ¸öÔªËØÊÇ·ñµÈÓÚǰһ¸öÔªËØ£¬Èç¹ûµÈÓÚ£¬²¢ÇÒǰһ¸öÔªËØ»¹Î´·ÃÎÊ£¬ÄÇô¾ÍÌø¹ýÕâ¸öÔªËØ¡£ +?????????? Permutations ????????????????????????????????§Ø?????????????????????????????????????????¦Ä????????????????????? ```java public List> permuteUnique(int[] nums) { @@ -1231,11 +1231,11 @@ private void backtracking(List permuteList, boolean[] visited, int[] nu } ``` -**×éºÏ** +**???** [Leetcode : 77. Combinations (Medium)](https://leetcode.com/problems/combinations/description/) -ÌâÄ¿ÃèÊö£ºÕÒ³ö´Ó 1 \~ n ÖÐÈ¡³ö k ¸öÔªËØµÄËùÓпÉÄܵÄ×éºÏ¡£ +?????????????? 1 \~ n ????? k ?????????§á???????? ```java public List> combine(int n, int k) { @@ -1247,20 +1247,20 @@ public List> combine(int n, int k) { private void backtracking(int start, int n, int k, List combineList, List> ret){ if(k == 0){ - ret.add(new ArrayList(combineList)); // ÕâÀïÒªÖØÐ¹¹ÔìÒ»¸ö List + ret.add(new ArrayList(combineList)); // ??????????????? List return; } - for(int i = start; i <= n - k + 1; i++){ // ¼ôÖ¦ + for(int i = start; i <= n - k + 1; i++){ // ??? - combineList.add(i); // °Ñ i ±ê¼ÇΪÒÑ·ÃÎÊ + combineList.add(i); // ?? i ????????? backtracking(i + 1, n, k - 1, combineList, ret); - combineList.remove(combineList.size() - 1); // °Ñ i ±ê¼ÇΪδ·ÃÎÊ + combineList.remove(combineList.size() - 1); // ?? i ????¦Ä???? } } ``` -**×éºÏÇóºÍ** +**??????** [Leetcode : 39. Combination Sum (Medium)](https://leetcode.com/problems/combination-sum/description/) @@ -1295,7 +1295,7 @@ A solution set is: } ``` -**²»ÄÜÖØ¸´µÄ×éºÏÇóºÍ** +**???????????????** [Leetcode : 40. Combination Sum II (Medium)](https://leetcode.com/problems/combination-sum-ii/description/) @@ -1339,11 +1339,11 @@ private void doCombination(int[] candidates, int target, int start, List> ret; @@ -1366,13 +1366,13 @@ private void backtracking(int startIdx, int size, int[] nums) { for (int i = startIdx; i < nums.length; i++) { subsetList.add(nums[i]); - backtracking(i + 1, size, nums); // startIdx ÉèΪÏÂÒ»¸öÔªËØ£¬Ê¹ subset ÖеÄÔªËØ¶¼µÝÔöÅÅÐò + backtracking(i + 1, size, nums); // startIdx ????????????? subset ?§Ö????????????? subsetList.remove(subsetList.size() - 1); } } ``` -**²»ÄÜÖØ¸´µÄ×Ó¼¯** +**????????????** [Leetcode : 90. Subsets II (Medium)](https://leetcode.com/problems/subsets-ii/description/) @@ -1423,7 +1423,7 @@ private void backtracking(int startIdx, int size, int[] nums) { } ``` -**·Ö¸î×Ö·û´®Ê¹µÃÿ²¿·Ö¶¼ÊÇ»ØÎÄÊý** +**????????????????????????** [Leetcode : 131. Palindrome Partitioning (Medium)](https://leetcode.com/problems/palindrome-partitioning/description/) @@ -1458,7 +1458,7 @@ private boolean isPalindrome(String s, int begin, int end) { } ``` -**Êý¶À** +**????** [Leetcode : 37. Sudoku Solver (Hard)](https://leetcode.com/problems/sudoku-solver/description/) @@ -1514,9 +1514,9 @@ private int cubeNum(int i, int j) { } ``` -## ·ÖÖÎ +## ???? -**¸ø±í´ïʽ¼ÓÀ¨ºÅ** +**????????????** [Leetcode : 241. Different Ways to Add Parentheses (Medium)](https://leetcode.com/problems/different-ways-to-add-parentheses/description/) @@ -1554,21 +1554,21 @@ public List diffWaysToCompute(String input) { } ``` -## µÝ¹é +## ??? -½«Ô­Ê¼ÎÊÌâ·Ö½â³É½ÏСµÄÎÊÌâÀ´Çó½â¡£ +????????????§³??????????? -## ¶¯Ì¬¹æ»® +## ????œý -½«Ô­ÎÊÌâ²ð½â³É¶à¸ö×ÓÎÊÌ⣬ÔÚÇó½â×ÓÎÊÌâµÄʱºò±£´æ×ÓÎÊÌâµÄ½â£¬Ê¹µÃ×ÓÎÊÌâÖ»Çó½âÒ»´Î¡£ +?????????????????????????????????????????????????????????¦±? -### ·Ö¸îÕûÊý +### ??????? -**·Ö¸îÕûÊýµÄ×î´ó³Ë»ý** +**??????????????** [Leetcode : 343. Integer Break (Medim)](https://leetcode.com/problems/integer-break/description/) -ÌâÄ¿ÃèÊö£ºFor example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4). +?????????For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4). ```java public int integerBreak(int n) { @@ -1583,15 +1583,15 @@ public int integerBreak(int n) { } ``` -**°´Æ½·½ÊýÀ´·Ö¸îÕûÊý** +**????????????????** [Leetcode : 279. Perfect Squares(Medium)](https://leetcode.com/problems/perfect-squares/description/) -ÌâÄ¿ÃèÊö£ºFor example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9. +?????????For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9. ```java public int numSquares(int n) { - List squares = new ArrayList<>(); // ´æ´¢Ð¡ÓÚ n µÄƽ·½Êý + List squares = new ArrayList<>(); // ?›¥§³?? n ??????? int diff = 3; while(square <= n) { squares.add(square); @@ -1611,11 +1611,11 @@ public int numSquares(int n) { } ``` -**·Ö¸îÕûÊý¹¹³É×Öĸ×Ö·û´®** +**???????????????????** [Leetcode : 91. Decode Ways (Medium)](https://leetcode.com/problems/decode-ways/description/) -ÌâÄ¿ÃèÊö£ºGiven encoded message "12", it could be decoded as "AB" (1 2) or "L" (12). +?????????Given encoded message "12", it could be decoded as "AB" (1 2) or "L" (12). ```java public int numDecodings(String s) { @@ -1635,13 +1635,13 @@ public int numDecodings(String s) { } ``` -### ¾ØÕó·¾¶ +### ????¡¤?? -**¾ØÕóµÄ×Ü·¾¶Êý** +**???????¡¤????** [Leetcode : 62. Unique Paths (Medium)](https://leetcode.com/problems/unique-paths/description/) -ÌâÄ¿ÃèÊö£ºÍ³¼Æ´Ó¾ØÕó×óÉϽǵ½ÓÒϽǵÄ·¾¶×ÜÊý£¬Ã¿´ÎÖ»ÄÜÏò×óºÍÏòÏÂÒÆ¶¯¡£ +????????????????????????????¡¤???????????????????????????? ```java public int uniquePaths(int m, int n) { @@ -1656,11 +1656,11 @@ public int uniquePaths(int m, int n) { } ``` -**¾ØÕóµÄ×îС·¾¶ºÍ** +**???????§³¡¤????** [Leetcode : 64. Minimum Path Sum (Medium)](https://leetcode.com/problems/minimum-path-sum/description/) -ÌâÄ¿ÃèÊö£ºÇó´Ó¾ØÕóµÄ×óÉϽǵ½ÓÒϽǵÄ×îС·¾¶ºÍ£¬Ã¿´ÎÖ»ÄÜÏò×óºÍÏòÏÂÒÆ¶¯¡£ +??????????????????????????????§³¡¤????????????????????????? ```java public int minPathSum(int[][] grid) { @@ -1678,29 +1678,29 @@ public int minPathSum(int[][] grid) { } ``` -### ì³²¨ÄÇÆõÊýÁÐ +### ?????????? -³ÌÐòÔ±´úÂëÃæÊÔÖ¸ÄÏµÚ 4 Õµķ½·¨½«Çóì³²¨ÄÇÆõµÚ N ÏîÎÊÌâת»»Îª¾ØÕó³Ë·¨ÔËË㣬´Ó¶ø½«Ê±¼ä¸´ÔÓ¶ÈËõСΪ O(lgN)¡£ +????????????????? 4 ?????????????????? N ???????????????????????????ÁÙ?????§³? O(lgN)?? -**ÅÀÂ¥ÌÝ** +**?????** [Leetcode : 70. Climbing Stairs (Easy)](https://leetcode.com/problems/climbing-stairs/description/) -ÌâÄ¿ÃèÊö£ºÓÐ N ½×Â¥ÌÝ£¬Ã¿´Î¿ÉÒÔÉÏÒ»½×»òÕßÁ½½×£¬ÇóÓжàÉÙÖÖÉÏÂ¥Ìݵķ½·¨¡£ +??????????? N ????????¦Ï???????????????????§Ø???????????????? -¶¨ÒåÒ»¸öÊý×é dp ´æ´¢ÉÏÂ¥Ìݵķ½·¨Êý£¨ÎªÁË·½±ãÌÖÂÛ£¬Êý×éϱê´Ó 1 ¿ªÊ¼£©£¬dp[i] ±íʾ×ßµ½µÚ i ¸öÂ¥Ìݵķ½·¨ÊýÄ¿¡£µÚ i ¸öÂ¥ÌÝ¿ÉÒÔ´ÓµÚ i-1 ºÍ i-2 ¸öÂ¥ÌÝÔÙ×ßÒ»²½µ½´ï£¬×ßµ½µÚ i ¸öÂ¥Ìݵķ½·¨ÊýΪ×ßµ½µÚ i-1 ºÍµÚ i-2 ¸öÂ¥Ìݵķ½·¨ÊýÖ®ºÍ¡£ +??????????? dp ?›¥?????????????????????????????¡À?? 1 ???????dp[i] ???????? i ???????????????? i ?????????? i-1 ?? i-2 ????????????????????? i ????????????????? i-1 ??? i-2 ???????????????
dp[i] = dp[i-1] + dp[i-2]
-dp[N] ¼´ÎªËùÇó¡£ +dp[N] ??????? -¿¼Âǵ½ dp[i] Ö»Óë dp[i - 1] ºÍ dp[i - 2] Óйأ¬Òò´Ë¿ÉÒÔÖ»ÓÃÁ½¸ö±äÁ¿À´´æ´¢ dp[i - 1] ºÍ dp[i - 2] ¼´¿É£¬Ê¹µÃÔ­À´µÄ O(n) ¿Õ¼ä¸´ÔÓ¶ÈÓÅ»¯Îª O(1) ¸´ÔÓ¶È¡£ +????? dp[i] ??? dp[i - 1] ?? dp[i - 2] ?§Û??????????????????????›¥ dp[i - 1] ?? dp[i - 2] ????????????? O(n) ??ÁÙ??????? O(1) ?????? ```java public int climbStairs(int n) { if(n == 1) return 1; if(n == 2) return 2; - // ǰһ¸öÂ¥ÌÝ¡¢ºóÒ»¸öÂ¥ÌÝ + // ???????????????? int pre1 = 2, pre2 = 1; for(int i = 2; i < n; i++){ int cur = pre1 + pre2; @@ -1711,27 +1711,27 @@ public int climbStairs(int n) { } ``` -**ĸţÉú²ú** +**??????** -[³ÌÐòÔ±´úÂëÃæÊÔÖ¸ÄÏ-P181](#) +[????????????????-P181](#) -ÌâÄ¿ÃèÊö£º¼ÙÉèÅ©³¡ÖгÉÊìµÄĸţÿÄê¶¼»áÉú 1 ͷСĸţ£¬²¢ÇÒÓÀÔ¶²»»áËÀ¡£µÚÒ»ÄêÓÐ 1 ֻСĸţ£¬´ÓµÚ¶þÄ꿪ʼ£¬Ä¸Å£¿ªÊ¼ÉúСĸţ¡£Ã¿Ö»Ð¡Ä¸Å£ 3 ÄêÖ®ºó³ÉÊìÓÖ¿ÉÒÔÉúСĸţ¡£¸ø¶¨ÕûÊý N£¬Çó N ÄêºóÅ£µÄÊýÁ¿¡£ +?????????????????§Ô????????????? 1 ?§³?????????????????????????? 1 ?§³????????????????????§³??????§³?? 3 ???????????????§³???????????? N???? N ???????????? -µÚ i Äê³ÉÊìµÄÅ£µÄÊýÁ¿Îª£º +?? i ????????????????
dp[i] = dp[i-1] + dp[i-3]
-**Ç¿µÁÇÀ½Ù** +**???????** [Leetcode : 198. House Robber (Easy)](https://leetcode.com/problems/house-robber/description/) -ÌâÄ¿ÃèÊö£ºÇÀ½ÙÒ»ÅÅס»§£¬µ«ÊDz»ÄÜÇÀÁÚ½üµÄס»§£¬Çó×î´óÇÀ½ÙÁ¿¡£ +????????????????????????????????????????????????????? -¶¨Òå dp Êý×éÓÃÀ´´æ´¢×î´óµÄÇÀ½ÙÁ¿£¬ÆäÖÐ dp[i] ±íʾÇÀµ½µÚ i ¸öס»§Ê±µÄ×î´óÇÀ½ÙÁ¿¡£ÓÉÓÚ²»ÄÜÇÀ½ÙÁÚ½üס»§£¬Òò´ËÈç¹ûÇÀ½ÙÁËµÚ i ¸öס»§ÄÇôֻÄÜÇÀ½Ù i - 2 ºÍ i - 3 µÄס»§£¬ËùÒÔ +???? dp ?????????›¥???????????????? dp[i] ????????? i ??????????????????????????????????????????????????? i ??????????????? i - 2 ?? i - 3 ??????????? ![](http://latex.codecogs.com/gif.latex?\\\\dp[i]=max(dp[i-2],dp[i-3])+nums[i]) -O(n) ¿Õ¼ä¸´ÔÓ¶ÈʵÏÖ·½·¨£º +O(n) ??ÁÙ??????????? ```java public int rob(int[] nums) { @@ -1750,7 +1750,7 @@ public int rob(int[] nums) { } ``` -O(1) ¿Õ¼ä¸´ÔÓ¶ÈʵÏÖ·½·¨£º +O(1) ??ÁÙ??????????? ```java public int rob(int[] nums) { @@ -1769,7 +1769,7 @@ public int rob(int[] nums) { } ``` -**Ç¿µÁÔÚ»·ÐνÖÇøÇÀ½Ù** +**???????¦Í???????** [Leetcode : 213. House Robber II (Medium)](https://leetcode.com/problems/house-robber-ii/description/) @@ -1797,39 +1797,39 @@ private int rob(int[] nums, int s, int e) { ``` -**Ðżþ´íÅÅ** +**???????** -ÌâÄ¿ÃèÊö£ºÓÐ N ¸ö ÐÅ ºÍ Ðŷ⣬ËüÃDZ»´òÂÒ£¬Çó´íÎó×°Ðŵķ½Ê½ÊýÁ¿¡£ +??????????? N ?? ?? ?? ?????????????????????????????? -¶¨ÒåÒ»¸öÊý×é dp ´æ´¢´íÎó·½Ê½ÊýÁ¿£¬dp[i] ±íʾǰ i ¸öÐźÍÐÅ·âµÄ´íÎó·½Ê½ÊýÁ¿¡£¼ÙÉèµÚ i ¸öÐÅ×°µ½µÚ j ¸öÐÅ·âÀïÃæ£¬¶øµÚ j ¸öÐÅ×°µ½µÚ k ¸öÐÅ·âÀïÃæ¡£¸ù¾Ý i ºÍ k ÊÇ·ñÏàµÈ£¬ÓÐÁ½ÖÖÇé¿ö£º +??????????? dp ?›¥???????????dp[i] ???? i ???????????????????????? i ????????? j ????????—¨???? j ????????? k ????????µµ???? i ?? k ?????????????????? -¢Ù i==k£¬½»»» i ºÍ k µÄÐźó£¬ËüÃǵÄÐźÍÐÅ·âÔÚÕýÈ·µÄλÖ㬵«ÊÇÆäÓà i-2 ·âÐÅÓÐ dp[i-2] ÖÖ´íÎó×°Ðŵķ½Ê½¡£ÓÉÓÚ j ÓÐ i-1 ÖÖȡֵ£¬Òò´Ë¹²ÓÐ (i-1)\*dp[i-2] ÖÖ´íÎó×°ÐÅ·½Ê½¡£ +?? i==k?????? i ?? k ???????????????????????¦Ë??????????? i-2 ?????? dp[i-2] ????????????????? j ?? i-1 ???????????? (i-1)\*dp[i-2] ???????????? -¢Ú i != k£¬½»»» i ºÍ j µÄÐÅºó£¬µÚ i ¸öÐźÍÐÅ·âÔÚÕýÈ·µÄλÖã¬ÆäÓà i-1 ·âÐÅÓÐ dp[i-1] ÖÖ´íÎó×°ÐÅ·½Ê½¡£ÓÉÓÚ j ÓÐ i-1 ÖÖȡֵ£¬Òò´Ë¹²ÓÐ (n-1)\*dp[i-1] ÖÖ´íÎó×°ÐÅ·½Ê½¡£ +?? i != k?????? i ?? j ?????? i ???????????????¦Ë??????? i-1 ?????? dp[i-1] ???????????????? j ?? i-1 ???????????? (n-1)\*dp[i-1] ???????????? -×ÛÉÏËùÊö£¬´íÎó×°ÐÅÊýÁ¿·½Ê½ÊýÁ¿Îª£º +???????????????????????????????
dp[i] = (i-1) \* dp[i-2] + (i-1) \* dp[i-1]
-dp[N] ¼´ÎªËùÇó¡£ +dp[N] ??????? -ºÍÉÏÂ¥ÌÝÎÊÌâÒ»Ñù£¬dp[i] Ö»Óë dp[i-1] ºÍ dp[i-2] Óйأ¬Òò´ËÒ²¿ÉÒÔÖ»ÓÃÁ½¸ö±äÁ¿À´´æ´¢ dp[i-1] ºÍ dp[i-2]¡£ +????????????????dp[i] ??? dp[i-1] ?? dp[i-2] ?§Û????????????????????????›¥ dp[i-1] ?? dp[i-2]?? -### ×µÝÔö×ÓÐòÁÐ +### ???????????? -ÒÑÖªÒ»¸öÐòÁÐ {S1, S2,...,Sn} £¬È¡³öÈô¸ÉÊý×é³ÉеÄÐòÁÐ {Si1, Si2,..., Sim}£¬ÆäÖÐ i1¡¢i2 ... im ±£³ÖµÝÔö£¬¼´ÐÂÐòÁÐÖи÷¸öÊýÈÔÈ»±£³ÖÔ­ÊýÁÐÖеÄÏȺó˳Ðò£¬³ÆÐÂÐòÁÐΪԭÐòÁеÄÒ»¸ö**×ÓÐòÁÐ**¡£ +?????????? {S1, S2,...,Sn} ????????????????????? {Si1, Si2,..., Sim}?????? i1??i2 ... im ??????????????????§Ú??????????????????§Ö???????????????????§Ö????**??????**?? -Èç¹ûÔÚ×ÓÐòÁÐÖУ¬µ±Ï±ê ix > iy ʱ£¬Six > Siy£¬³Æ×ÓÐòÁÐΪԭÐòÁеÄÒ»¸ö**µÝÔö×ÓÐòÁÐ**¡£ +????????????§µ????¡À? ix > iy ???Six > Siy???????????????§Ö????**??????????**?? -¶¨ÒåÒ»¸öÊý×é dp ´æ´¢×µÝÔö×ÓÐòÁеij¤¶È£¬dp[n] ±íʾÒÔ Sn ½áβµÄÐòÁеÄ×µÝÔö×ÓÐòÁг¤¶È¡£¶ÔÓÚÒ»¸öµÝÔö×ÓÐòÁÐ {Si1, Si2,...,Sim}£¬Èç¹û im < n ²¢ÇÒ Sim < Sn £¬´Ëʱ {Si1, Si2,..., Sim, Sn} Ϊһ¸öµÝÔö×ÓÐòÁУ¬µÝÔö×ÓÐòÁеij¤¶ÈÔö¼Ó 1¡£Âú×ãÉÏÊöÌõ¼þµÄµÝÔö×ÓÐòÁÐÖУ¬³¤¶È×µÄÄǸöµÝÔö×ÓÐòÁоÍÊÇÒªÕҵģ¬ÔÚ³¤¶È×µÄµÝÔö×ÓÐòÁÐÉϼÓÉÏ Sn ¾Í¹¹³ÉÁËÒÔ Sn Ϊ½áβµÄ×µÝÔö×ÓÐòÁС£Òò´Ë dp[n] = max{ dp[i]+1 | Si < Sn && i < n} ¡£ +??????????? dp ?›¥???????????§Ö?????dp[n] ????? Sn ??¦Â?????§Ö????????????§Ô????????????????????? {Si1, Si2,...,Sim}????? im < n ???? Sim < Sn ????? {Si1, Si2,..., Sim, Sn} ?????????????§µ??????????§Ö???????? 1??????????????????????????§µ?????????????????????§à??????????????????????????????? Sn ????????? Sn ???¦Â?????????????§³???? dp[n] = max{ dp[i]+1 | Si < Sn && i < n} ?? -ÒòΪÔÚÇó dp[n] ʱ¿ÉÄÜÎÞ·¨ÕÒµ½Ò»¸öÂú×ãÌõ¼þµÄµÝÔö×ÓÐòÁУ¬´Ëʱ {Sn} ¾Í¹¹³ÉÁ˵ÝÔö×ÓÐòÁУ¬Òò´ËÐèÒª¶ÔÇ°ÃæµÄÇó½â·½³Ì×öÐ޸ģ¬Áî dp[n] ×îСΪ 1£¬¼´£º +??????? dp[n] ????????????????????????????????§µ???? {Sn} ???????????????§µ?????????????????????????? dp[n] ??§³? 1?????? ![](http://latex.codecogs.com/gif.latex?\\\\dp[n]=max\{1,dp[i]+1|S_iN Ϊ½á⣬Òò´Ë dp[N] ²»ÊÇÐòÁеÄ×µÝÔö×ÓÐòÁеij¤¶È£¬ÐèÒª±éÀú dp Êý×éÕÒ³ö×î´óÖµ²ÅÊÇËùÒªµÄ½á¹û£¬¼´ max{ dp[i] | 1 <= i <= N} ¼´ÎªËùÇó¡£ +???????????? N ?????§µ????????§Ó?????????? SN ???¦Â????? dp[N] ???????§Ö????????????§Ö???????????? dp ?????????????????????????? max{ dp[i] | 1 <= i <= N} ??????? -**×µÝÔö×ÓÐòÁÐ** +**????????????** [Leetcode : 300. Longest Increasing Subsequence (Medium)](https://leetcode.com/problems/longest-increasing-subsequence/description/) @@ -1852,7 +1852,7 @@ public int lengthOfLIS(int[] nums) { } ``` -ÒÔÉϽⷨµÄʱ¼ä¸´ÔÓ¶ÈΪ O(n2) £¬¿ÉÒÔʹÓöþ·Ö²éÕÒʹµÃʱ¼ä¸´ÔӶȽµµÍΪ O(nlogn)¡£¶¨ÒåÒ»¸ö tails Êý×飬ÆäÖÐ tails[i] ´æ´¢³¤¶ÈΪ i + 1 µÄ×µÝÔö×ÓÐòÁеÄ×îºóÒ»¸öÔªËØ£¬ÀýÈç¶ÔÓÚÊý×é [4,5,6,3]£¬ÓÐ +?????????ÁÙ???? O(n2) ????????????????????ÁÙ??????? O(nlogn)????????? tails ???ï…???? tails[i] ?›¥????? i + 1 ?????????????§Ö?????????????????????? [4,5,6,3]???? ```html len = 1 : [4], [5], [6], [3] => tails[0] = 3 @@ -1860,9 +1860,9 @@ len = 2 : [4, 5], [5, 6] => tails[1] = 5 len = 3 : [4, 5, 6] => tails[2] = 6 ``` -¶ÔÓÚÒ»¸öÔªËØ x£¬Èç¹ûËü´óÓÚ tails Êý×éËùÓеÄÖµ£¬ÄÇô°ÑËüÌí¼Óµ½ tails ºóÃæ£»Èç¹û tails[i-1] < x <= tails[i]£¬ÄÇô¸üРtails[i] = x ¡£ +?????????? x??????????? tails ???????§Ö??????????????? tails ???—±??? tails[i-1] < x <= tails[i]????????? tails[i] = x ?? -¿ÉÒÔ¿´³ö tails Êý×é±£³ÖÓÐÐò£¬Òò´ËÔÚ²éÕÒ Si λÓÚ tails Êý×éµÄλÖÃʱ¾Í¿ÉÒÔʹÓöþ·Ö²éÕÒ¡£ +??????? tails ???÷g?????????????? Si ¦Ë?? tails ?????¦Ë?????????????????? ```java public int lengthOfLIS(int[] nums) { @@ -1888,13 +1888,13 @@ private int binarySearch(int[] nums, int sIdx, int eIdx, int key){ } ``` -**×°Ú¶¯×ÓÐòÁÐ** +**???????????** [Leetcode : 376. Wiggle Subsequence (Medium)](https://leetcode.com/problems/wiggle-subsequence/description/) -ÒªÇó£ºÊ¹Óà O(n) ʱ¼ä¸´ÔÓ¶ÈÇó½â¡£ +?????? O(n) ??ÁÙ?????? -ʹÓÃÁ½¸ö״̬ up ºÍ down¡£ +????????? up ?? down?? ```java public int wiggleMaxLength(int[] nums) { @@ -1909,17 +1909,17 @@ public int wiggleMaxLength(int[] nums) { } ``` -### ×¹«¹²×ÓϵÁÐ +### ??????????? -¶ÔÓÚÁ½¸ö×ÓÐòÁÐ S1 ºÍ S2£¬ÕÒ³öËüÃÇ×µÄ¹«¹²×ÓÐòÁС£ +?????????????? S1 ?? S2?????????????????????§³? -¶¨ÒåÒ»¸ö¶þάÊý×é dp ÓÃÀ´´æ´¢×¹«¹²×ÓÐòÁеij¤¶È£¬ÆäÖÐ dp[i][j] ±íʾ S1 µÄǰ i ¸ö×Ö·ûÓë S2 µÄǰ j ¸ö×Ö·û×¹«¹²×ÓÐòÁеij¤¶È¡£¿¼ÂÇ S1i Óë S2j ÖµÊÇ·ñÏàµÈ£¬·ÖΪÁ½ÖÖÇé¿ö£º +?????????????? dp ?????›¥???????????§Ö????????? dp[i][j] ??? S1 ??? i ??????? S2 ??? j ????????????????§Ö????????? S1i ?? S2j ???????????????????? -¢Ù µ± S1i==S2j ʱ£¬ÄÇô¾ÍÄÜÔÚ S1 µÄǰ i-1 ¸ö×Ö·ûÓë S2 µÄǰ j-1 ¸ö×Ö·û×¹«¹²×ÓÐòÁеĻù´¡ÉÏÔÙ¼ÓÉÏ S1i Õâ¸öÖµ£¬×¹«¹²×ÓÐòÁг¤¶È¼Ó 1 £¬¼´ dp[i][j] = dp[i-1][j-1] + 1¡£ +?? ?? S1i==S2j ???????????? S1 ??? i-1 ??????? S2 ??? j-1 ????????????????§Ö??????????? S1i ?????????????????§Ô???? 1 ???? dp[i][j] = dp[i-1][j-1] + 1?? -¢Ú µ± S1i != S2j ʱ£¬´Ëʱ×¹«¹²×ÓÐòÁÐΪ S1 µÄǰ i-1 ¸ö×Ö·ûºÍ S2 µÄǰ j ¸ö×Ö·û×¹«¹²×ÓÐòÁУ¬Óë S1 µÄǰ i ¸ö×Ö·ûºÍ S2 µÄǰ j-1 ¸ö×Ö·û×¹«¹²×ÓÐòÁУ¬ËüÃǵÄ×î´óÕߣ¬¼´ dp[i][j] = max{ dp[i-1][j], dp[i][j-1] }¡£ +?? ?? S1i != S2j ??????????????????? S1 ??? i-1 ??????? S2 ??? j ????????????????§µ??? S1 ??? i ??????? S2 ??? j-1 ????????????????§µ?????????????? dp[i][j] = max{ dp[i-1][j], dp[i][j-1] }?? -×ÛÉÏ£¬×¹«¹²×ÓϵÁеÄ×´Ì¬×ªÒÆ·½³ÌΪ£º +???????????????§Ö???????????? ![](http://latex.codecogs.com/gif.latex?\\\\ dp[i][j]=\left\{ @@ -1929,13 +1929,13 @@ max(dp[i-1][j],dp[i][j-1])&&{S1_i<>S2_j} \end{array}\right. ) -¶ÔÓÚ³¤¶ÈΪ N µÄÐòÁÐ S1 ºÍ ³¤¶ÈΪ M µÄÐòÁÐ S2£¬dp[N][M] ¾ÍÊÇÐòÁÐ S1 ºÍÐòÁÐ S2 µÄ×¹«¹²×ÓÐòÁг¤¶È¡£ +???????? N ?????? S1 ?? ????? M ?????? S2??dp[N][M] ???????? S1 ?????? S2 ?????????????§Ô???? -Óë×µÝÔö×ÓÐòÁÐÏà±È£¬×¹«¹²×ÓÐòÁÐÓÐÒÔϲ»Í¬µã£º +???????????????????????????????????????? -¢Ù Õë¶ÔµÄÊÇÁ½¸öÐòÁУ¬ÇóËüÃǵÄ×¹«¹²×ÓÐòÁС£ -¢Ú ÔÚ×µÝÔö×ÓÐòÁÐÖУ¬dp[i] ±íʾÒÔ Si Ϊ½áβµÄ×µÝÔö×ÓÐòÁг¤¶È£¬×ÓÐòÁбØÐë°üº¬ Si £»ÔÚ×¹«¹²×ÓÐòÁÐÖУ¬dp[i][j] ±íʾ S1 ÖÐǰ i ¸ö×Ö·ûÓë S2 ÖÐǰ j ¸ö×Ö·ûµÄ×¹«¹²×ÓÐòÁг¤¶È£¬²»Ò»¶¨°üº¬ S1i ºÍ S2j ¡£ -¢Û ÓÉÓÚ 2 £¬ÔÚÇó×îÖÕ½âʱ£¬×¹«¹²×ÓÐòÁÐÖÐ dp[N][M] ¾ÍÊÇ×îÖս⣬¶ø×µÝÔö×ÓÐòÁÐÖÐ dp[N] ²»ÊÇ×îÖս⣬ÒòΪÒÔ SN Ϊ½áβµÄ×µÝÔö×ÓÐòÁв»Ò»¶¨ÊÇÕû¸öÐòÁÐ×µÝÔö×ÓÐòÁУ¬ÐèÒª±éÀúÒ»±é dp Êý×éÕÒµ½×î´óÕß¡£ +?? ?????????????§µ???????????????????§³? +?? ???????????????§µ?dp[i] ????? Si ???¦Â?????????????§Ô?????????§Ò?????? Si ?????????????????§µ?dp[i][j] ??? S1 ??? i ??????? S2 ??? j ??????????????????§Ô????????????? S1i ?? S2j ?? +?? ???? 2 ???????????????????????????? dp[N][M] ????????????????????????? dp[N] ?????????????? SN ???¦Â?????????????§Ó?????????????????????????§µ??????????? dp ????????????? ```java public int lengthOfLCS(int[] nums1, int[] nums2) { @@ -1951,18 +1951,18 @@ public int lengthOfLCS(int[] nums1, int[] nums2) { } ``` -### 0-1 ±³°ü +### 0-1 ???? -ÓÐÒ»¸öÈÝÁ¿Îª N µÄ±³°ü£¬ÒªÓÃÕâ¸ö±³°ü×°ÏÂÎïÆ·µÄ¼ÛÖµ×î´ó£¬ÕâЩÎïÆ·ÓÐÁ½¸öÊôÐÔ£ºÌå»ý w ºÍ¼ÛÖµ v¡£ +?????????? N ????????????????????????????????§»????????????????? w ???? v?? -¶¨ÒåÒ»¸ö¶þάÊý×é dp ´æ´¢×î´ó¼ÛÖµ£¬ÆäÖÐ dp[i][j] ±íʾÌå»ý²»³¬¹ý j µÄÇé¿öÏ£¬Ç° i ¼þÎïÆ·ÄÜ´ïµ½µÄ×î´ó¼ÛÖµ¡£ÉèµÚ i ¼þÎïÆ·Ìå»ýΪ w£¬¼ÛֵΪ v£¬¸ù¾ÝµÚ i ¼þÎïÆ·ÊÇ·ñÌí¼Óµ½±³°üÖУ¬¿ÉÒÔ·ÖÁ½ÖÖÇé¿öÌÖÂÛ£º +?????????????? dp ?›¥??????????? dp[i][j] ???????????? j ????????? i ???????????????????? i ????????? w?????? v??????? i ?????????????????§µ?????????????????? -¢Ù µÚ i ¼þÎïÆ·Ã»Ìí¼Óµ½±³°ü£¬×ÜÌå»ý²»³¬¹ý j µÄǰ i ¼þÎïÆ·µÄ×î´ó¼ÛÖµ¾ÍÊÇ×ÜÌå»ý²»³¬¹ý j µÄǰ i-1 ¼þÎïÆ·µÄ×î´ó¼ÛÖµ£¬dp[i][j] = dp[i-1][j]¡£ -¢Ú µÚ i ¼þÎïÆ·Ìí¼Óµ½±³°üÖУ¬dp[i][j] = dp[i-1][j-w] + v¡£ +?? ?? i ??????????????????????????? j ??? i ??????????????????????????? j ??? i-1 ??????????????dp[i][j] = dp[i-1][j]?? +?? ?? i ??????????????§µ?dp[i][j] = dp[i-1][j-w] + v?? -µÚ i ¼þÎïÆ·¿ÉÌí¼ÓÒ²¿ÉÒÔ²»Ìí¼Ó£¬È¡¾öÓÚÄÄÖÖÇé¿öÏÂ×î´ó¼ÛÖµ¸ü´ó¡£ +?? i ??????????????????????????????????????????? -×ÛÉÏ£¬0-1 ±³°üµÄ×´Ì¬×ªÒÆ·½³ÌΪ£º +?????0-1 ????????????????? ![](http://latex.codecogs.com/gif.latex?\\\\dp[i][j]=max(dp[i-1][j],dp[i-1][j-w]+v)) @@ -1984,18 +1984,18 @@ public int knapsack(int W, int N, int[] weights, int[] values) { } ``` -**¿Õ¼äÓÅ»¯** +**??????** -ÔÚ³ÌÐòʵÏÖʱ¿ÉÒÔ¶Ô 0-1 ±³°ü×öÓÅ»¯¡£¹Û²ì×´Ì¬×ªÒÆ·½³Ì¿ÉÒÔÖªµÀ£¬Ç° i ¼þÎïÆ·µÄ״̬½öÓÉǰ i-1 ¼þÎïÆ·µÄ״̬Óйأ¬Òò´Ë¿ÉÒÔ½« dp ¶¨ÒåΪһάÊý×飬ÆäÖÐ dp[j] ¼È¿ÉÒÔ±íʾ dp[i-1][j] Ò²¿ÉÒÔ±íʾ dp[i][j]¡£´Ëʱ£¬ +?????????????? 0-1 ??????????????????????????????? i ?????????????? i-1 ??????????§Û????????? dp ??????????ï…???? dp[j] ??????? dp[i-1][j] ??????? dp[i][j]??????? ![](http://latex.codecogs.com/gif.latex?\\\\dp[j]=max(dp[j],dp[j-w]+v)) -ÒòΪ dp[j-w] ±íʾ dp[i-1][j-w]£¬Òò´Ë²»ÄÜÏÈÇó dp[i][j-w] ·ÀÖ¹½« dp[i-1][j-w] ¸²¸Ç¡£Ò²¾ÍÊÇ˵ҪÏȼÆËã dp[i][j] ÔÙ¼ÆËã dp[i][j-w]£¬ÔÚ³ÌÐòʵÏÖʱÐèÒª°´µ¹ÐòÀ´Ñ­»·Çó½â¡£ +??? dp[j-w] ??? dp[i-1][j-w]???????????? dp[i][j-w] ????? dp[i-1][j-w] ????????????????? dp[i][j] ????? dp[i][j-w]???????????????????????????? -**ÎÞ·¨Ê¹ÓÃ̰ÐÄËã·¨µÄ½âÊÍ** +**????????????????** -0-1 ±³°üÎÊÌâÎÞ·¨Ê¹ÓÃ̰ÐÄËã·¨À´Çó½â£¬Ò²¾ÍÊÇ˵²»Äܰ´ÕÕÏÈÌí¼ÓÐÔ¼Û±È×î¸ßµÄÎïÆ·À´´ïµ½×îÓÅ£¬ÕâÊÇÒòΪÕâÖÖ·½Ê½¿ÉÄÜÔì³É±³°ü¿Õ¼äµÄÀË·Ñ£¬´Ó¶øÎÞ·¨´ïµ½×îÓÅ¡£¿¼ÂÇÏÂÃæµÄÎïÆ·ºÍÒ»¸öÈÝÁ¿Îª 5 µÄ±³°ü£¬Èç¹ûÏÈÌí¼ÓÎïÆ· 0 ÔÙÌí¼ÓÎïÆ· 1£¬ÄÇôֻÄÜ´æ·ÅµÄ¼ÛֵΪ 16£¬ÀË·ÑÁË´óСΪ 2 µÄ¿Õ¼ä¡£×îÓŵķ½Ê½ÊÇ´æ·ÅÎïÆ· 1 ºÍÎïÆ· 2£¬¼ÛֵΪ 22. +0-1 ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? 5 ?????????????????? 0 ???????? 1?????????????? 16????????§³? 2 ?????????????????? 1 ????? 2?????? 22. | id | w | v | v/w | | --- | --- | --- | --- | @@ -2003,23 +2003,23 @@ public int knapsack(int W, int N, int[] weights, int[] values) { | 1 | 2 | 10 | 5 | | 2 | 3 | 12 | 4 | -**±äÖÖ** +**????** -ÍêÈ«±³°ü£ºÎïÆ·¿ÉÒÔÎÞÏÞ¸ö£¬¿ÉÒÔת»»Îª 0-1 ±³°ü£¬ÁîÿÖÖÎïÆ·µÄÌå»ýºÍ¼ÛÖµ±äΪ 1/2/4... ±¶Êý£¬°ÑËüÃǶ¼µ±³ÉÒ»¸öÐÂÎïÆ·£¬È»ºóÒ»ÖÖÎïÆ·Ö»ÄÜÌí¼ÓÒ»´Î¡£ +??????????????????????????????? 0-1 ?????????????????????????? 1/2/4... ????????????????????????????????????????????¦±? -¶àÖØ±³°ü£ºÎïÆ·ÊýÁ¿ÓÐÏÞÖÆ£¬Í¬Ñù¿ÉÒÔת»»Îª 0-1 ±³°ü¡£ +?????????????????????????????????? 0-1 ?????? -¶àά·ÑÓñ³°ü£ºÎïÆ·²»½öÓÐÖØÁ¿£¬»¹ÓÐÌå»ý£¬Í¬Ê±¿¼ÂÇÕâÁ½ÖÖÏÞÖÆ¡£ +????????????????????????????????????????????????????? -ÆäËü£ºÎïÆ·Ö®¼äÏà»¥Ô¼Êø»òÕßÒÀÀµ¡£ +??????????????????????????? -**»®·ÖÊý×éΪºÍÏàµÈµÄÁ½²¿·Ö** +**?????????????????????** [Leetcode : 416. Partition Equal Subset Sum (Medium)](https://leetcode.com/problems/partition-equal-subset-sum/description/) -¿ÉÒÔ¿´³ÉÒ»¸ö±³°ü´óСΪ sum/2 µÄ 0-1 ±³°üÎÊÌ⣬µ«ÊÇÒ²Óв»Í¬µÄµØ·½£¬ÕâÀïûÓмÛÖµÊôÐÔ£¬²¢ÇÒ±³°ü±ØÐë±»ÌîÂú¡£ +????????????????§³? sum/2 ?? 0-1 ??????????????§Ó??????????????§Þ???????????????????????? -ÒÔÏÂʵÏÖʹÓÃÁ˿ռäÓÅ»¯¡£ +??????????????????? ```java public boolean canPartition(int[] nums) { @@ -2046,7 +2046,7 @@ public boolean canPartition(int[] nums) { } ``` -**×Ö·û´®°´µ¥´ÊÁбí·Ö¸î** +**????????????§Ò???** [Leetcode : 139. Word Break (Medium)](https://leetcode.com/problems/word-break/description/) @@ -2073,7 +2073,7 @@ public boolean wordBreak(String s, List wordDict) { } ``` -**¸Ä±äÒ»×éÊýµÄÕý¸ººÅʹµÃËüÃǵĺÍΪһ¸ø¶¨Êý** +**?????????????????????????????????** [Leetcode : 494. Target Sum (Medium)](https://leetcode.com/problems/target-sum/description/) @@ -2091,7 +2091,7 @@ Explanation: There are 5 ways to assign symbols to make the sum of nums be target 3. ``` -¸ÃÎÊÌâ¿ÉÒÔת»»Îª subset sum ÎÊÌ⣬´Ó¶øÊ¹Óà 0-1 ±³°üµÄ·½·¨À´Çó½â¡£¿ÉÒÔ½«Õâ×éÊý¿´³ÉÁ½²¿·Ö£¬P ºÍ N£¬ÆäÖÐ P ʹÓÃÕýºÅ£¬N ʹÓøººÅ£¬ÓÐÒÔÏÂÍÆµ¼£º +????????????? subset sum ?????????? 0-1 ????????????????????????????????????P ?? N?????? P ????????N ?????????????????? ```html sum(P) - sum(N) = target @@ -2099,7 +2099,7 @@ sum(P) + sum(N) + sum(P) - sum(N) = target + sum(P) + sum(N) 2 * sum(P) = target + sum(nums) ``` -Òò´ËÖ»ÒªÕÒµ½Ò»¸ö×Ó¼¯£¬ÁîËüÃǶ¼È¡ÕýºÅ£¬²¢ÇҺ͵ÈÓÚ (target + sum(nums))/2£¬¾ÍÖ¤Ã÷´æÔڽ⡣ +????????????????????????????????????? (target + sum(nums))/2???????????? ```java public int findTargetSumWays(int[] nums, int S) { @@ -2127,7 +2127,7 @@ private int subsetSum(int[] nums, int targetSum) { } ``` -**01×Ö·û¹¹³É×î¶àµÄ×Ö·û´®** +**01????????????????** [Leetcode : 474. Ones and Zeroes (Medium)](https://leetcode.com/problems/ones-and-zeroes/description/) @@ -2135,10 +2135,10 @@ private int subsetSum(int[] nums, int targetSum) { Input: Array = {"10", "0001", "111001", "1", "0"}, m = 5, n = 3 Output: 4 -Explanation: This are totally 4 strings can be formed by the using of 5 0s and 3 1s, which are ¡°10,¡±0001¡±,¡±1¡±,¡±0¡± +Explanation: This are totally 4 strings can be formed by the using of 5 0s and 3 1s, which are ??10,??0001??,??1??,??0?? ``` -ÕâÊÇÒ»¸ö¶àά·ÑÓÃµÄ 0-1 ±³°üÎÊÌ⣬ÓÐÁ½¸ö±³°ü´óС£¬0 µÄÊýÁ¿ºÍ 1 µÄÊýÁ¿¡£ +??????????????? 0-1 ????????????????????§³??0 ???????? 1 ???????? ```java public int findMaxForm(String[] strs, int m, int n) { @@ -2164,13 +2164,13 @@ public int findMaxForm(String[] strs, int m, int n) { } ``` -**ÕÒÁãÇ®** +**?????** [Leetcode : 322. Coin Change (Medium)](https://leetcode.com/problems/coin-change/description/) -ÌâÄ¿ÃèÊö£º¸øÒ»Ð©Ãæ¶îµÄÓ²±Ò£¬ÒªÇóÓÃÕâЩӲ±ÒÀ´×é³É¸ø¶¨Ãæ¶îµÄÇ®Êý£¬²¢ÇÒʹµÃÓ²±ÒÊýÁ¿×îÉÙ¡£Ó²±Ò¿ÉÒÔÖØ¸´Ê¹Óᣠ+????????????§»???????????????§»??????????????????????????????????????????????????¨¢? -ÕâÊÇÒ»¸öÍêÈ«±³°üÎÊÌ⣬ÍêÈ«±³°üÎÊÌâºÍ 0-1±³°üÎÊÌâÔÚʵÏÖÉÏΨһµÄ²»Í¬ÊÇ£¬µÚ¶þ²ãÑ­»·ÊÇ´Ó 0 ¿ªÊ¼µÄ£¬¶ø²»ÊÇ´Óβ²¿¿ªÊ¼¡£ +?????????????????????????????? 0-1???????????????¦·??????????????????? 0 ?????????????¦Â??????? ```java public int coinChange(int[] coins, int amount) { @@ -2188,7 +2188,7 @@ public int coinChange(int[] coins, int amount) { } ``` -**×éºÏ×ܺÍ** +**??????** [Leetcode : 377. Combination Sum IV (Medium)](https://leetcode.com/problems/combination-sum-iv/description/) @@ -2225,7 +2225,7 @@ public int combinationSum4(int[] nums, int target) { } ``` -**Ö»ÄܽøÐÐÁ½´ÎµÄ¹ÉƱ½»Ò×** +**?????????¦Å???????** [Leetcode : 123. Best Time to Buy and Sell Stock III (Hard)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/description/) @@ -2243,7 +2243,7 @@ public int maxProfit(int[] prices) { } ``` -**Ö»ÄܽøÐÐ k ´ÎµÄ¹ÉƱ½»Ò×** +**?????? k ?¦Å???????** [Leetcode : 188. Best Time to Buy and Sell Stock IV (Hard)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/description/) @@ -2274,13 +2274,13 @@ public int maxProfit(int k, int[] prices) { } ``` -### Êý×éÇø¼ä +### ???????? -**Êý×éÇø¼äºÍ** +**?????????** [Leetcode : 303. Range Sum Query - Immutable (Easy)](https://leetcode.com/problems/range-sum-query-immutable/description/) -ÇóÇø¼ä i \~ j µÄºÍ£¬¿ÉÒÔת»»Îª sum[j] - sum[i-1]£¬ÆäÖÐ sum[i] Ϊ 0 \~ j µÄºÍ¡£ +?????? i \~ j ???????????? sum[j] - sum[i-1]?????? sum[i] ? 0 \~ j ???? ```java class NumArray { @@ -2299,11 +2299,11 @@ class NumArray { } ``` -**×ÓÊý×é×î´óµÄºÍ** +**???????????** [Leetcode : 53. Maximum Subarray (Easy)](https://leetcode.com/problems/maximum-subarray/description/) -Áî sum[i] ΪÒÔ num[i] Ϊ½áβµÄ×ÓÊý×é×î´óµÄºÍ£¬¿ÉÒÔÓÉ sum[i-1] µÃµ½ sum[i] µÄÖµ£¬Èç¹û sum[i-1] СÓÚ 0£¬ÄÇôÒÔ num[i] Ϊ½áβµÄ×ÓÊý×é²»Äܰüº¬Ç°ÃæµÄÄÚÈÝ£¬ÒòΪ¼ÓÉÏÇ°ÃæµÄ²¿·Ö£¬ÄÇôºÍÒ»¶¨»á±È num[i] »¹Ð¡¡£ +?? sum[i] ??? num[i] ???¦Â???????????????????? sum[i-1] ??? sum[i] ???????? sum[i-1] §³?? 0??????? num[i] ???¦Â???????öö???????????????????????????????????????? num[i] ??§³?? ```java public int maxSubArray(int[] nums) { @@ -2319,7 +2319,7 @@ public int maxSubArray(int[] nums) { } ``` -**Êý×éÖеȲîµÝÔö×ÓÇø¼äµÄ¸öÊý** +**?????§Ö???????????????** [Leetcode : 413. Arithmetic Slices (Medium)](https://leetcode.com/problems/arithmetic-slices/description/) @@ -2329,7 +2329,7 @@ A = [1, 2, 3, 4] return: 3, for 3 arithmetic slices in A: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4] itself. ``` -¶ÔÓÚ (1,2,3,4)£¬ËüÓÐÈýÖÖ×é³ÉµÝÔö×ÓÇø¼äµÄ·½Ê½£¬¶ø¶ÔÓÚ (1,2,3,4,5)£¬Ëü×é³ÉµÝÔö×ÓÇø¼äµÄ·½Ê½³ýÁË (1,2,3,4) µÄÈýÖÖÍ⻹¶àÁËÒ»ÖÖ£¬¼´ (1,2,3,4,5)£¬Òò´Ë dp[i] = dp[i - 1] + 1¡£ +???? (1,2,3,4)????????????????????????????????? (1,2,3,4,5)??????????????????????? (1,2,3,4) ?????????????????? (1,2,3,4,5)????? dp[i] = dp[i - 1] + 1?? ```java public int numberOfArithmeticSlices(int[] A) { @@ -2348,13 +2348,13 @@ public int numberOfArithmeticSlices(int[] A) { } ``` -### ×Ö·û´®±à¼­ +### ??????? -**ɾ³ýÁ½¸ö×Ö·û´®µÄ×Ö·ûʹËüÃÇÏàµÈ** +**?????????????????????????** [Leetcode : 583. Delete Operation for Two Strings (Medium)](https://leetcode.com/problems/delete-operation-for-two-strings/description/) -¿ÉÒÔת»»ÎªÇóÁ½¸ö×Ö·û´®µÄ×¹«¹²×ÓÐòÁÐÎÊÌâ¡£ +????????????????????????????????????? ```java public int minDistance(String word1, String word2) { @@ -2372,21 +2372,21 @@ public int minDistance(String word1, String word2) { ``` -**ÐÞ¸ÄÒ»¸ö×Ö·û´®³ÆÎªÁíÒ»¸ö×Ö·û´®** // TODO +**????????????????????????** // TODO [Leetcode : 72. Edit Distance (Hard)](https://leetcode.com/problems/edit-distance/description/) -**ÐÞ¸ÄÒ»¸ö×Ö·û´®Ê¹Ëü³ÉΪ»ØÎÄ×Ö·û´®**// TODO +**??????????????????????????**// TODO -[³ÌÐòÔ±´úÂëÃæÊÔÖ¸ÄÏ-×Ö·û´®](#) +[????????????????-?????](#) -### ÆäËüÎÊÌâ +### ???????? -**ÐèÒªÀäÈ´ÆÚµÄ¹ÉƱ½»Ò×** +**???????????????** [Leetcode : 309. Best Time to Buy and Sell Stock with Cooldown(Medium)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/) -ÌâÄ¿ÃèÊö£º½»Ò×Ö®ºóÐèÒªÓÐÒ»ÌìµÄÀäȴʱ¼ä¡£ +??????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ac9b31ec-cef1-4880-a875-fc4571ca10e1.png) @@ -2417,11 +2417,11 @@ public int maxProfit(int[] prices) { ``` -**ͳ¼Æ´Ó 0 \~ n ÿ¸öÊýµÄ¶þ½øÖƱíʾÖÐ 1 µÄ¸öÊý** +**???? 0 \~ n ???????????????? 1 ?????** [Leetcode : 338. Counting Bits (Medium)](https://leetcode.com/problems/counting-bits/description/) -¶ÔÓÚÊý×Ö 6(110)£¬Ëü¿ÉÒÔ¿´³ÉÊÇÊý×Ö 2(10) Ç°Ãæ¼ÓÉÏÒ»¸ö 1 £¬Òò´Ë dp[i] = dp[i&(i-1)] + 1; +???????? 6(110)????????????????? 2(10) ????????? 1 ????? dp[i] = dp[i&(i-1)] + 1; ```java public int[] countBits(int num) { @@ -2433,11 +2433,11 @@ public int maxProfit(int[] prices) { } ``` -**Ò»×éÕûÊý¶ÔÄܹ»¹¹³ÉµÄ×Á´** +**?????????????????????** [Leetcode : 646. Maximum Length of Pair Chain (Medium)](https://leetcode.com/problems/maximum-length-of-pair-chain/description/) -¶ÔÓÚ (a, b) ºÍ (c, d) £¬Èç¹û b < c£¬ÔòËüÃÇ¿ÉÒÔ¹¹³ÉÒ»ÌõÁ´¡£ +???? (a, b) ?? (c, d) ????? b < c????????????????????? ```java public int findLongestChain(int[][] pairs) { @@ -2464,13 +2464,13 @@ public int findLongestChain(int[][] pairs) { } ``` -**ÂòÈëºÍÊÛ³ö¹ÉƱ×î´óµÄÊÕÒæ** +**???????????????????** [Leetcode : 121. Best Time to Buy and Sell Stock (Easy)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/) -Ö»½øÐÐÒ»´Î½»Òס£ +???????¦Í???? -Ö»Òª¼ÇÂ¼Ç°ÃæµÄ×îС¼Û¸ñ£¬½«Õâ¸ö×îС¼Û¸ñ×÷ΪÂòÈë¼Û¸ñ£¬È»ºó½«µ±Ç°µÄ¼Û¸ñ×÷ΪÊÛ³ö¼Û¸ñ£¬²é¿´Õâ¸ö¼Û¸ñÊÇ·ñÊǵ±Ç°µÄ×î´ó¼Û¸ñ¡£ +???????????§³?????????§³??????????????????????????????????????????????????? ```java public int maxProfit(int[] prices) { @@ -2486,7 +2486,7 @@ public int maxProfit(int[] prices) { } ``` -**¸´ÖÆÕ³Ìù×Ö·û** +**??????????** [Leetcode : 650. 2 Keys Keyboard (Medium)](https://leetcode.com/problems/2-keys-keyboard/description/) @@ -2516,30 +2516,30 @@ public int minSteps(int n) { } ``` -## Êýѧ +## ??? -### ËØÊý +### ???? -**ËØÊý·Ö½â** +**???????** -ÿһ¸öÊý¶¼¿ÉÒÔ·Ö½â³ÉËØÊýµÄ³Ë»ý£¬ÀýÈç 84 = 22 \* 31 \* 50 \* 71 \* 110 \* 130 \* 170 \* ¡­ +????????????????????????????? 84 = 22 \* 31 \* 50 \* 71 \* 110 \* 130 \* 170 \* ?? -**Õû³ý** +**????** -Áî x = 2m0 \* 3m1 \* 5m2 \* 7m3 \* 11m4 \* ¡­ -Áî y = 2n0 \* 3n1 \* 5n2 \* 7n3 \* 11n4 \* ¡­ +?? x = 2m0 \* 3m1 \* 5m2 \* 7m3 \* 11m4 \* ?? +?? y = 2n0 \* 3n1 \* 5n2 \* 7n3 \* 11n4 \* ?? -Èç¹û x Õû³ý y£¨y mod x == 0£©£¬Ôò¶ÔÓÚËùÓÐ i£¬mi <= ni¡£ +??? x ???? y??y mod x == 0????????????? i??mi <= ni?? -x ºÍ y µÄ **×î´ó¹«Ô¼Êý** Ϊ£ºgcd(x,y) = 2min(m0,n0) \* 3min(m1,n1) \* 5min(m2,n2) \* ... +x ?? y ?? **??????** ???gcd(x,y) = 2min(m0,n0) \* 3min(m1,n1) \* 5min(m2,n2) \* ... -x ºÍ y µÄ **×îС¹«±¶Êý** Ϊ£ºlcm(x,y) = 2max(m0,n0) \* 3max(m1,n1) \* 5max(m2,n2) \* ... +x ?? y ?? **??§³??????** ???lcm(x,y) = 2max(m0,n0) \* 3max(m1,n1) \* 5max(m2,n2) \* ... -**Éú³ÉËØÊýÐòÁÐ** +**????????????** [Leetcode : 204. Count Primes (Easy)](https://leetcode.com/problems/count-primes/description/) -°£À­ÍÐË¹ÌØÄáɸ·¨ÔÚÿ´ÎÕÒµ½Ò»¸öËØÊýʱ£¬½«Äܱ»ËØÊýÕû³ýµÄÊýÅųýµô¡£ +???????????????????????????????????????????????????????? ```java public int countPrimes(int n) { @@ -2548,7 +2548,7 @@ public int countPrimes(int n) { for(int i = 2; i < n; i++){ if(notPrimes[i]) continue; cnt++; - // ´Ó i * i ¿ªÊ¼£¬ÒòΪÈç¹û k < i£¬ÄÇô k * i ÔÚ֮ǰ¾ÍÒѾ­±»È¥³ý¹ýÁË + // ?? i * i ??????????? k < i????? k * i ?????????????????? for(long j = (long) i * i; j < n; j += i){ notPrimes[(int) j] = true; } @@ -2557,7 +2557,7 @@ public int countPrimes(int n) { } ``` -### ×î´ó¹«Ô¼Êý +### ?????? ```java int gcd(int a, int b) { @@ -2566,7 +2566,7 @@ int gcd(int a, int b) { } ``` -×î´ó¹«±¶ÊýΪÁ½ÊýµÄ³Ë»ý³ýÒÔ×î´ó¹«Ô¼Êý¡£ +??????????????????????????? ```java int lcm(int a, int b){ @@ -2574,22 +2574,22 @@ int lcm(int a, int b){ } ``` -¶ÔÓÚ×î´ó¹«Ô¼ÊýÎÊÌ⣬ÒòΪÐèÒª¼ÆËã a % b £¬¶øÕâ¸ö²Ù×÷ÊDZȽϺÄʱµÄ£¬¿ÉÒÔʹÓà [ ±à³ÌÖ®ÃÀ£º2.7]() µÄ·½·¨£¬ÀûÓüõ·¨ºÍÒÆÎ»²Ù×÷À´Ìæ»»Ëü¡£ +???????????????????????? a % b ??????????????????????????? [ ????????2.7]() ??????????¨¹???????¦Ë???????�I???? -¶ÔÓÚ a ºÍ b µÄ×î´ó¹«Ô¼Êý f(a, b)£¬ÓУº +???? a ?? b ???????? f(a, b)???§µ? -1\. Èç¹û a ºÍ b ¾ùΪżÊý£¬f(a, b) = 2\*f(a/2, b/2); -2\. Èç¹û a ÊÇżÊý b ÊÇÆæÊý£¬f(a, b) = f(a/2, b); -3\. Èç¹û b ÊÇżÊý a ÊÇÆæÊý£¬f(a, b) = f(a, b/2); -4\. Èç¹û a ºÍ b ¾ùÎªÆæÊý£¬f(a, b) = f(a, a-b); +1\. ??? a ?? b ????????f(a, b) = 2\*f(a/2, b/2); +2\. ??? a ????? b ????????f(a, b) = f(a/2, b); +3\. ??? b ????? a ????????f(a, b) = f(a, b/2); +4\. ??? a ?? b ?????????f(a, b) = f(a, a-b); -³Ë 2 ºÍ³ý 2 ¶¼¿ÉÒÔת»»ÎªÒÆÎ»²Ù×÷¡£ +?? 2 ??? 2 ????????????¦Ë?????? -### ½øÖÆ×ª»» +### ??????? -Java ÖÐ static String toString(int num, int radix) ¿ÉÒÔ½«Ò»¸öÕûÊý×°»»Îª redix ½øÖƱíʾµÄ×Ö·û´®¡£ +Java ?? static String toString(int num, int radix) ???????????????? redix ??????????????? -**7 ½øÖÆ** +**7 ????** [Leetcode : 504. Base 7 (Easy)](https://leetcode.com/problems/base-7/description/) @@ -2605,7 +2605,7 @@ public String convertToBase7(int num) { } ``` -**16 ½øÖÆ** +**16 ????** [Leetcode : 405. Convert a Number to Hexadecimal (Easy)](https://leetcode.com/problems/convert-a-number-to-hexadecimal/description/) @@ -2622,15 +2622,15 @@ public String toHex(int num) { } ``` -### ½×³Ë +### ??? -**ͳ¼Æ½×³Ëβ²¿ÓжàÉÙ¸ö 0** +**?????¦Â???§Ø???? 0** [Leetcode : 172. Factorial Trailing Zeroes (Easy)](https://leetcode.com/problems/factorial-trailing-zeroes/description/) -β²¿µÄ 0 ÓÉ 2 * 5 µÃÀ´£¬2 µÄÊýÁ¿Ã÷ÏÔ¶àÓÚ 5 µÄÊýÁ¿£¬Òò´ËֻҪͳ¼ÆÓжàÉÙ¸ö 5 ¼´¿É¡£ +¦Â???? 0 ?? 2 * 5 ??????2 ????????????? 5 ?????????????????§Ø???? 5 ???¨À? -¶ÔÓÚÒ»¸öÊý N£¬ËüËù°üº¬ 5 µÄ¸öÊýΪ£ºN/5 + N/52 + N/53 + ...£¬ÆäÖÐ N/5 ±íʾ²»´óÓÚ N µÄÊýÖÐ 5 µÄ±¶Êý¹±Ï×Ò»¸ö 5£¬N/52 ±íʾ²»´óÓÚ N µÄÊýÖÐ 52 µÄ±¶ÊýÔÙ¹±Ï×Ò»¸ö 5 ...¡£ +????????? N?????????? 5 ????????N/5 + N/52 + N/53 + ...?????? N/5 ????????? N ?????? 5 ???????????? 5??N/52 ????????? N ?????? 52 ????????????? 5 ...?? ```java public int trailingZeroes(int n) { @@ -2638,11 +2638,11 @@ public int trailingZeroes(int n) { } ``` -Èç¹ûͳ¼ÆµÄÊÇ N! µÄ¶þ½øÖƱíʾÖÐ×îµÍλ 1 µÄλÖã¬Ö»ÒªÍ³¼ÆÓжàÉÙ¸ö 2 ¼´¿É£¬¸ÃÌâÄ¿³ö×Ô [ ±à³ÌÖ®ÃÀ£º2.2](#) ¡£ºÍÇó½âÓжàÉÙ¸ö 5 Ò»Ñù£¬2 µÄ¸öÊýΪ N/2 + N/22 + N/23 + ... +????????? N! ??????????????¦Ë 1 ??¦Ë?????????§Ø???? 2 ?????????????? [ ????????2.2](#) ????????§Ø???? 5 ?????2 ?????? N/2 + N/22 + N/23 + ... -### ×Ö·û´®¼Ó·¨¼õ·¨ +### ???????????? -**¶þ½øÖƼӷ¨** +**????????** [Leetcode : 67. Add Binary (Easy)](https://leetcode.com/problems/add-binary/description/) @@ -2661,11 +2661,11 @@ public String addBinary(String a, String b) { } ``` -**×Ö·û´®¼Ó·¨** +**????????** [Leetcode : 415. Add Strings (Easy)](https://leetcode.com/problems/add-strings/description/) -ÌâÄ¿ÃèÊö£º×Ö·û´®µÄֵΪ·Ç¸ºÕûÊý +????????????????????????? ```java public String addStrings(String num1, String num2) { @@ -2681,23 +2681,23 @@ public String addStrings(String num1, String num2) { } ``` -### ÏàÓöÎÊÌâ +### ???????? -**¸Ä±äÊý×éÔªËØÊ¹ËùÓеÄÊý×éÔªËØ¶¼ÏàµÈ** +**??????????????§Ö????????????** [Leetcode : 462. Minimum Moves to Equal Array Elements II (Medium)](https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/description/) -ÌâÄ¿ÃèÊö£ºÃ¿´Î¿ÉÒÔ¶ÔÒ»¸öÊý×éÔªËØ¼ÓÒ»»òÕß¼õÒ»£¬Çó×îСµÄ¸Ä±ä´ÎÊý¡£ +???????????¦Ï????????????????????????????§³????????? -ÕâÊǸöµäÐ͵ÄÏàÓöÎÊÌâ£¬ÒÆ¶¯¾àÀë×îСµÄ·½Ê½ÊÇËùÓÐÔªËØ¶¼Òƶ¯µ½ÖÐλÊý¡£ÀíÓÉÈçÏ£º +???????????????????????????§³?????????????????????¦Ë????????????? -Éè m ΪÖÐλÊý¡£a ºÍ b ÊÇ m Á½±ßµÄÁ½¸öÔªËØ£¬ÇÒ b > a¡£ÒªÊ¹ a ºÍ b ÏàµÈ£¬ËüÃÇ×ܹ²Òƶ¯µÄ´ÎÊýΪ b - a£¬Õâ¸öÖµµÈÓÚ (b - m) + (m - a)£¬Ò²¾ÍÊǰÑÕâÁ½¸öÊýÒÆ¶¯µ½ÖÐλÊýµÄÒÆ¶¯´ÎÊý¡£ +?? m ???¦Ë????a ?? b ?? m ??????????????? b > a???? a ?? b ???????????????????? b - a?????????? (b - m) + (m - a)???????????????????????¦Ë????????????? -ÉèÊý×鳤¶ÈΪ N£¬Ôò¿ÉÒÔÕÒµ½ N/2 ¶Ô a ºÍ b µÄ×éºÏ£¬Ê¹ËüÃǶ¼Òƶ¯µ½ m µÄλÖᣠ+?????øA??? N?????????? N/2 ?? a ?? b ????????????????? m ??¦Ë?¨¢? -**½â·¨ 1** +**?? 1** -ÏÈÅÅÐò£¬Ê±¼ä¸´ÔÓ¶È£ºO(NlgN) +????????ÁÙ????O(NlgN) ```java public int minMoves2(int[] nums) { @@ -2713,9 +2713,9 @@ public int minMoves2(int[] nums) { } ``` -**½â·¨ 2** +**?? 2** -ʹÓÿìËÙÅÅÐòÕÒµ½ÖÐλÊý£¬Ê±¼ä¸´ÔÓ¶È O(N) +???????????????¦Ë??????ÁÙ??? O(N) ```java public int minMoves2(int[] nums) { @@ -2747,13 +2747,13 @@ private void swap(int[] nums, int i, int j) { } ``` -### ¶àÊýͶƱÎÊÌâ +### ?????????? -**Êý×éÖгöÏÖ´ÎÊý¶àÓÚ n / 2 µÄÔªËØ** +**?????§Ô?????????? n / 2 ?????** [Leetcode : 169. Majority Element (Easy)](https://leetcode.com/problems/majority-element/description/) -ÏȶÔÊý×éÅÅÐò£¬×îÖмäÄǸöÊý³öÏÖ´ÎÊýÒ»¶¨¶àÓÚ n / 2 +??????????????§Þ???????????????????? n / 2 ```java public int majorityElement(int[] nums) { @@ -2762,7 +2762,7 @@ public int majorityElement(int[] nums) { } ``` -¿ÉÒÔÀûÓà Boyer-Moore Majority Vote Algorithm À´½â¾öÕâ¸öÎÊÌ⣬ʹµÃʱ¼ä¸´ÔÓ¶ÈΪ O(n)¡£¿ÉÒÔÕâôÀí½â¸ÃËã·¨£ºÊ¹Óà cnt À´Í³¼ÆÒ»¸öÔªËØ³öÏֵĴÎÊý£¬µ±±éÀúµ½µÄÔªËØºÍͳ¼ÆÔªËز»ÏëµÈʱ£¬Áî cnt--¡£Èç¹ûÇ°Ãæ²éÕÒÁË i ¸öÔªËØ£¬ÇÒ cnt == 0 £¬ËµÃ÷ǰ i ¸öÔªËØÃ»ÓÐ majority£¬»òÕßÓÐ majority£¬µ«ÊdzöÏֵĴÎÊýÉÙÓÚ i / 2 £¬ÒòΪÈç¹û¶àÓÚ i / 2 µÄ»° cnt ¾ÍÒ»¶¨²»»áΪ 0 ¡£´ËʱʣÏ嵀 n - i ¸öÔªËØÖУ¬majority µÄÊýÄ¿¶àÓÚ (n - i) / 2£¬Òò´Ë¼ÌÐø²éÕÒ¾ÍÄÜÕÒ³ö majority¡£ +???????? Boyer-Moore Majority Vote Algorithm ?????????????????ÁÙ???? O(n)???????????????????? cnt ????????????????????????????????????????????????? cnt--????????????? i ???????? cnt == 0 ?????? i ???????? majority???????? majority????????????????? i / 2 ???????????? i / 2 ??? cnt ?????????? 0 ????????? n - i ??????§µ?majority ????????? (n - i) / 2?????????????????? majority?? ```java public int majorityElement(int[] nums) { @@ -2779,22 +2779,22 @@ public int majorityElement(int[] nums) { } ``` -**Êý×éÖгöÏÖ´ÎÊý¶àÓÚ n / k µÄÔªËØ** +**?????§Ô?????????? n / k ?????** -[³ÌÐòÔ±´úÂëÃæÊÔÖ¸ÄÏ P343](#) +[???????????????? P343](#) -Ñ¡ k - 1 ¸öºòÑ¡ +? k - 1 ????? -### ÆäËü +### ???? -**ƽ·½Êý** +**?????** [Leetcode : 367. Valid Perfect Square (Easy)](https://leetcode.com/problems/valid-perfect-square/description/) -ƽ·½ÐòÁУº1,4,9,16,.. -¼ä¸ô£º3,5,7,... +??????§µ?1,4,9,16,.. +?????3,5,7,... -¼ä¸ôΪµÈ²îÊýÁУ¬Ê¹ÓÃÕâ¸öÌØÐÔ¿ÉÒԵõ½´Ó 1 ¿ªÊ¼µÄƽ·½ÐòÁС£ +??????????§µ?????????????????? 1 ???????????§³? ```java public boolean isPerfectSquare(int num) { @@ -2807,7 +2807,7 @@ public boolean isPerfectSquare(int num) { } ``` -**3 µÄ n ´Î·½** +**3 ?? n ?¦Ç?** [Leetcode : 326. Power of Three (Easy)](https://leetcode.com/problems/power-of-three/description/) @@ -2817,7 +2817,7 @@ public boolean isPowerOfThree(int n) { } ``` -**ÕÒ³öÊý×éÖеij˻ý×î´óµÄÈý¸öÊý** +**????????§Ö?????????????** [Leetcode : 628. Maximum Product of Three Numbers (Easy)](https://leetcode.com/problems/maximum-product-of-three-numbers/description/) @@ -2847,13 +2847,13 @@ public int maximumProduct(int[] nums) { } ``` -**³Ë»ýÊý×é** +**???????** [Leetcode : 238. Product of Array Except Self (Medium)](https://leetcode.com/problems/product-of-array-except-self/description/) -ÌâÄ¿ÃèÊö£º¸ø¶¨Ò»¸öÊý×飬´´½¨Ò»¸öÐÂÊý×飬ÐÂÊý×éµÄÿ¸öÔªËØÎªÔ­Ê¼Êý×éÖгýÁ˸ÃλÖÃÉϵÄÔªËØÖ®ÍâËùÓÐÔªËØµÄ³Ë»ý¡£ +???????????????????ï…????????????ï…?????????????????????§Ô????¦Ë??????????????????????? -ÌâĿҪÇó£ºÊ±¼ä¸´ÔÓ¶ÈΪ O(n)£¬²¢ÇÒ²»ÄÜʹÓóý·¨¡£ +????????ÁÙ???? O(n)???????????¨®????? ```java public int[] productExceptSelf(int[] nums) { @@ -2872,13 +2872,13 @@ public int[] productExceptSelf(int[] nums) { } ``` -# Êý¾Ý½á¹¹Ïà¹Ø +# ???????? -## Õ»ºÍ¶ÓÁÐ +## ?????? -**ÓÃջʵÏÖ¶ÓÁÐ** +**?????????** -Ò»¸öջʵÏÖ£º +???????? ```java class MyQueue { @@ -2909,7 +2909,7 @@ class MyQueue { } ``` -Á½¸öջʵÏÖ£º +????????? ```java class MyQueue { @@ -2944,7 +2944,7 @@ class MyQueue { } ``` -**ÓöÓÁÐʵÏÖÕ»** +**?????????** [Leetcode : 225. Implement Stack using Queues (Easy)](https://leetcode.com/problems/implement-stack-using-queues/description/) @@ -2959,7 +2959,7 @@ class MyStack { public void push(int x) { queue.add(x); - for(int i = 1; i < queue.size(); i++){ // ·­×ª + for(int i = 1; i < queue.size(); i++){ // ??? queue.add(queue.remove()); } } @@ -2978,11 +2978,11 @@ class MyStack { } ``` -**×îСֵջ** +**??§³??** [Leetcode : 155. Min Stack (Easy)](https://leetcode.com/problems/min-stack/description/) -ÓÃÁ½¸öջʵÏÖ£¬Ò»¸ö´æ´¢Êý¾Ý£¬Ò»¸ö´æ´¢×îСֵ¡£ +???????????????›¥?????????›¥??§³??? ```java class MinStack { @@ -3025,9 +3025,9 @@ class MinStack { } ``` -¶ÔÓÚʵÏÖ×îСֵ¶ÓÁÐÎÊÌ⣬¿ÉÒÔÏȽ«¶ÓÁÐʹÓÃÕ»À´ÊµÏÖ£¬È»ºó¾Í½«ÎÊÌâת»»Îª×îСֵջ£¬Õâ¸öÎÊÌâ³öÏÖÔÚ ±à³ÌÖ®ÃÀ£º3.7¡£ +?????????§³?????????????????????????????????????????????§³???????????????? ????????3.7?? -**ÓÃջʵÏÖÀ¨ºÅÆ¥Åä** +**?????????????** [Leetcode : 20. Valid Parentheses (Easy)](https://leetcode.com/problems/valid-parentheses/description/) @@ -3057,7 +3057,7 @@ public boolean isValid(String s) { } ``` -**Êý×éÖбȵ±Ç°ÔªËØ´óµÄÏÂÒ»¸öÊý×éÔªËØµÄ¾àÀë** +**?????§Ò????????????????????????** ```html Input: [73, 74, 75, 71, 69, 72, 76, 73] @@ -3066,7 +3066,7 @@ Output: [1, 1, 4, 2, 1, 1, 0, 0] [Leetcode : 739. Daily Temperatures (Medium)](https://leetcode.com/problems/daily-temperatures/description/) -ʹÓÃÕ»À´´æ´¢»¹Î´¼ÆËãµÄÔªËØ¡£¿ÉÒÔ±£Ö¤´ÓÕ»¶¥ÏòÏÂÔªËØµÝÔö£¬·ñÔòÉÏÃæÓÐÒ»¸ö±ÈÏÂÃæÄ³¸öÔªËØ´óµÄÔªËØ½øÈëÕ»ÖУ¬ÏÂÃæÄǸöÔªËØÒѾ­ÕÒµ½±ÈËü´óµÄÔªËØ£¬Òò´Ë»á³öÕ»¡£ +???????›¥??¦Ä???????????????????????????????????????????????????????????????????§µ???????????????????????????????????? ```java public int[] dailyTemperatures(int[] temperatures) { @@ -3084,7 +3084,7 @@ public int[] dailyTemperatures(int[] temperatures) { } ``` -**Êý×éÖÐÏÂÒ»¸ö±Èµ±Ç°Êý´óµÄÊý** +**??????????????????????** [Leetcode : 496. Next Greater Element I (Easy)](https://leetcode.com/problems/next-greater-element-i/description/) @@ -3093,7 +3093,7 @@ Input: nums1 = [4,1,2], nums2 = [1,3,4,2]. Output: [-1,3,-1] ``` -ÔÚ±éÀúÊý×éʱÓà Stack °ÑÊý×éÖеÄÊý´æÆðÀ´£¬Èç¹ûµ±Ç°±éÀúµÄÊý±ÈÕ»¶¥ÔªËØÀ´µÄ´ó£¬ËµÃ÷Õ»¶¥ÔªËصÄÏÂÒ»¸ö±ÈËü´óµÄÊý¾ÍÊǵ±Ç°ÔªËØ¡£ +???????????? Stack ???????§Ö???????????????????????????????????????????????????????????????????????? ```java public int[] nextGreaterElement(int[] nums1, int[] nums2) { @@ -3114,7 +3114,7 @@ public int[] nextGreaterElement(int[] nums1, int[] nums2) { } ``` -**Ñ­»·Êý×éÖÐÏÂÒ»¸ö±Èµ±Ç°ÔªËØ´óµÄÊý** +**?????????????????????????** [Leetcode : 503. Next Greater Element II (Medium)](https://leetcode.com/problems/next-greater-element-ii/description/) @@ -3134,28 +3134,28 @@ public int[] nextGreaterElements(int[] nums) { ``` -## ¹þÏ£±í +## ????? -ÀûÓà Hash Table ¿ÉÒÔ¿ìËÙ²éÕÒÒ»¸öÔªËØÊÇ·ñ´æÔÚµÈÎÊÌ⣬µ«ÊÇÐèÒªÒ»¶¨µÄ¿Õ¼äÀ´´æ´¢¡£ÔÚÓÅÏÈ¿¼ÂÇʱ¼ä¸´ÔӶȵÄÇé¿öÏ£¬¿ÉÒÔÀûÓà Hash Table ÕâÖֿռ任ȡʱ¼äµÄ×ö·¨¡£ +???? Hash Table ????????????????????????????????????????????›¥?????????????ÁÙ?????????????????? Hash Table ?????ÈÎ??????????? -Java ÖÐµÄ **HashSet** ÓÃÓÚ´æ´¢Ò»¸ö¼¯ºÏ£¬²¢ÒÔ O(1) µÄʱ¼ä¸´ÔӶȲéÕÒÔªËØÊÇ·ñÔÚ¼¯ºÏÖС£ +Java ?§Ö? **HashSet** ????›¥???????????? O(1) ????ÁÙ??????????????????§³? -Èç¹ûÔªËØÓÐÇ²¢ÇÒ·¶Î§²»´ó£¬ÄÇô¿ÉÒÔÓÃÒ»¸ö²¼¶ûÊý×éÀ´´æ´¢Ò»¸öÔªËØÊÇ·ñ´æÔÚ£¬ÀýÈç¶ÔÓÚÖ»ÓÐСд×Ö·ûµÄÔªËØ£¬¾Í¿ÉÒÔÓÃÒ»¸ö³¤¶ÈΪ 26 µÄ²¼¶ûÊý×éÀ´´æ´¢Ò»¸ö×Ö·û¼¯ºÏ£¬Ê¹µÃ¿Õ¼ä¸´ÔӶȽµµÍΪ O(1)¡£ +???????????????¦¶???????????????????????????›¥???????????????????????§³§Õ???????????????????????? 26 ????????????›¥???????????????ÁÙ??????? O(1)?? -Java ÖÐµÄ **HashMap** Ö÷ÒªÓÃÓÚÓ³Éä¹ØÏµ£¬´Ó¶ø°ÑÁ½¸öÔªËØÁªÏµÆðÀ´¡£ +Java ?§Ö? **HashMap** ??????????????????????????????????? -ÔÚ¶ÔÒ»¸öÄÚÈݽøÐÐѹËõ»òÕ߯äËüת»»Ê±£¬ÀûÓà HashMap ¿ÉÒÔ°ÑԭʼÄÚÈݺÍת»»ºóµÄÄÚÈÝÁªÏµÆðÀ´¡£ÀýÈçÔÚÒ»¸ö¼ò»¯ url µÄϵͳÖУ¨[Leetcdoe : 535. Encode and Decode TinyURL (Medium)](https://leetcode.com/problems/encode-and-decode-tinyurl/description/)£©£¬ÀûÓà HashMap ¾Í¿ÉÒÔ´æ´¢¾«¼òºóµÄ url µ½Ô­Ê¼ url µÄÓ³É䣬ʹµÃ²»½ö¿ÉÒÔÏÔʾ¼ò»¯µÄ url£¬Ò²¿ÉÒÔ¸ù¾Ý¼ò»¯µÄ url µÃµ½Ô­Ê¼ url ´Ó¶ø¶¨Î»µ½ÕýÈ·µÄ×ÊÔ´¡£ +?????????????????????????????????? HashMap ?????????????????????????????????????????? url ?????§µ?[Leetcdoe : 535. Encode and Decode TinyURL (Medium)](https://leetcode.com/problems/encode-and-decode-tinyurl/description/)???????? HashMap ?????›¥?????? url ???? url ???????¨°????????????? url???????????? url ????? url ?????¦Ë???????????? -HashMap Ò²¿ÉÒÔÓÃÀ´¶ÔÔªËØ½øÐмÆÊýͳ¼Æ£¬´Ëʱ¼üÎªÔªËØ£¬ÖµÎª¼ÆÊý¡£ºÍ HashSet ÀàËÆ£¬Èç¹ûÔªËØÓÐÇî²¢ÇÒ·¶Î§²»´ó£¬¿ÉÒÔÓÃÕûÐÍÊý×éÀ´½øÐÐͳ¼Æ¡£ +HashMap ????????????????§Þ??????????????????????????? HashSet ??????????????????¦¶??????????????????????????? -**Êý×éÖеÄÁ½¸öÊýºÍΪ¸ø¶¨Öµ** +**?????§Ö???????????????** [Leetcode : 1. Two Sum (Easy)](https://leetcode.com/problems/two-sum/description/) -¿ÉÒÔÏȶÔÊý×é½øÐÐÅÅÐò£¬È»ºóʹÓÃ˫ָÕë·½·¨»òÕß¶þ·Ö²éÕÒ·½·¨¡£ÕâÑù×öµÄʱ¼ä¸´ÔÓ¶ÈΪ O(nlgn)£¬¿Õ¼ä¸´ÔÓ¶ÈΪ O(1)¡£ +???????????????????????????????????????????????????????ÁÙ???? O(nlgn)????ÁÙ???? O(1)?? -Óà HashMap ´æ´¢Êý×éÔªËØºÍË÷ÒýµÄÓ³É䣬ÔÚ·ÃÎʵ½ nums[i] ʱ£¬ÅÐ¶Ï HashMap ÖÐÊÇ·ñ´æÔÚ target - nums[i] £¬Èç¹û´æÔÚ˵Ã÷ target - nums[i] ËùÔÚµÄË÷ÒýºÍ i ¾ÍÊÇÒªÕÒµÄÁ½¸öÊý¡£¸Ã·½·¨µÄʱ¼ä¸´ÔÓ¶ÈΪ O(n)£¬¿Õ¼ä¸´ÔÓ¶ÈΪ O(n)£¬Ê¹ÓÿռäÀ´»»È¡Ê±¼ä¡£ +?? HashMap ?›¥??????????????????????? nums[i] ????§Ø? HashMap ???????? target - nums[i] ???????????? target - nums[i] ??????????? i ?????????????????¡Â???????ÁÙ???? O(n)????ÁÙ???? O(n)??????????????? ```java public int[] twoSum(int[] nums, int target) { @@ -3168,9 +3168,9 @@ public int[] twoSum(int[] nums, int target) { } ``` -**×ºÍгÐòÁÐ** +**????§Ô????** -ºÍгÐòÁÐÖÐ×î´óÊýºÍ×îСÊýÖ»²îÕýºÃΪ 1 +??§Ô???????????????§³?????????? 1 [Leetcode : 594. Longest Harmonious Subsequence (Easy)](https://leetcode.com/problems/longest-harmonious-subsequence/description/) @@ -3190,15 +3190,15 @@ public int findLHS(int[] nums) { } ``` -## ×Ö·û´® +## ????? -**Á½¸ö×Ö·û´®µÄ°üº¬µÄ×Ö·ûÊÇ·ñÍêÈ«Ïàͬ** +**????????????????????????????** [Leetcode : 242. Valid Anagram (Easy)](https://leetcode.com/problems/valid-anagram/description/) -×Ö·û´®Ö»°üº¬Ð¡Ð´×Ö·û£¬×ܹ²ÓÐ 26 ¸öСд×Ö·û¡£¿ÉÒÔÓà Hash Table À´Ó³Éä×Ö·ûÓë³öÏÖ´ÎÊý£¬ÒòΪ¼üÖµ·¶Î§ºÜС£¬Òò´Ë¿ÉÒÔÓÃÊý×éÀ´½øÐÐÓ³Éä¡£ +??????????§³§Õ?????????? 26 ??§³§Õ??????????? Hash Table ??????????????????????????¦¶??§³??????????????????????? -ʹÓó¤¶ÈΪ 26 µÄÕûÐÍÊý×é¶Ô×Ö·û´®³öÏÖµÄ×Ö·û½øÐÐͳ¼Æ£¬±È½ÏÁ½¸ö×Ö·û´®³öÏÖµÄ×Ö·ûÊýÁ¿ÊÇ·ñÏàͬ¡£ +??¨®???? 26 ???????????????????????????????????????????????????????????????? ```java public boolean isAnagram(String s, String t) { @@ -3210,13 +3210,13 @@ public boolean isAnagram(String s, String t) { } ``` -**×Ö·û´®Í¬¹¹** +**????????** [Leetcode : 205. Isomorphic Strings (Easy)](https://leetcode.com/problems/isomorphic-strings/description/) -ÀýÈç "egg" ºÍ "add" ¾ÍÊôÓÚͬ¹¹×Ö·û´®¡£ +???? "egg" ?? "add" ???????????????? -¼Ç¼һ¸ö×Ö·ûÉϴγöÏÖµÄλÖã¬Èç¹ûÁ½¸ö×Ö·û´®ÖÐij¸ö×Ö·ûÉϴγöÏÖµÄλÖÃÒ»Ñù£¬ÄÇô¾ÍÊôÓÚͬ¹¹¡£ +???????????¦Ã????¦Ë?????????????????????????¦Ã????¦Ë????????????????????? ```java public boolean isIsomorphic(String s, String t) { @@ -3233,30 +3233,30 @@ public boolean isIsomorphic(String s, String t) { } ``` -**¼ÆËãÒ»×é×Ö·û¼¯ºÏ¿ÉÒÔ×é³ÉµÄ»ØÎÄ×Ö·û´®µÄ×î´ó³¤¶È** +**???????????????????????????????????** [Leetcode : 409. Longest Palindrome](https://leetcode.com/problems/longest-palindrome/description/) -ʹÓó¤¶ÈΪ 128 µÄÕûÐÍÊý×éÀ´Í³¼ÆÃ¿¸ö×Ö·û³öÏֵĸöÊý£¬Ã¿¸ö×Ö·ûÓÐżÊý¸ö¿ÉÒÔÓÃÀ´¹¹³É»ØÎÄ×Ö·û´®¡£ÒòΪ»ØÎÄ×Ö·û´®×îÖмäµÄÄǸö×Ö·û¿ÉÒÔµ¥¶À³öÏÖ£¬ËùÒÔÈç¹ûÓе¥¶ÀµÄ×Ö·û¾Í°ÑËü·Åµ½×îÖм䡣 +??¨®???? 128 ?????????????????????????????????????????????????????????????????????????????????§Þ????????????????????????????§Ö???????????????????§Þ? ```java public int longestPalindrome(String s) { - int[] cnts = new int[128]; // ascii Âë×ܹ² 128 ¸ö + int[] cnts = new int[128]; // ascii ????? 128 ?? for(char c : s.toCharArray()) cnts[c]++; int ret = 0; for(int cnt : cnts) ret += (cnt / 2) * 2; - if(ret < s.length()) ret ++; // Õâ¸öÌõ¼þÏ s ÖÐÒ»¶¨Óе¥¸öδʹÓõÄ×Ö·û´æÔÚ£¬¿ÉÒÔ°ÑÕâ¸ö×Ö·û·Åµ½»ØÎĵÄ×îÖмä + if(ret < s.length()) ret ++; // ????????? s ??????§Ö???¦Ä??????????????????????????????????§Þ? return ret; } ``` -**ÅжÏÒ»¸öÕûÊýÊÇ·ñÊÇ»ØÎÄÊý** +**?§Ø??????????????????** [Leetcode : 9. Palindrome Number (Easy)](https://leetcode.com/problems/palindrome-number/description/) -ÒªÇó²»ÄÜʹÓöîÍâ¿Õ¼ä£¬Ò²¾Í²»Äܽ«ÕûÊýת»»Îª×Ö·û´®½øÐÐÅжϡ£ +??????????????????????????????????????§Ø?? -½«ÕûÊý·Ö³É×óÓÒÁ½²¿·Ö£¬ÓÒ±ßÄDz¿·ÖÐèҪתÖã¬È»ºóÅжÏÕâÁ½²¿·ÖÊÇ·ñÏàµÈ¡£ +???????????????????????????????????????§Ø???????????????? ```java public boolean isPalindrome(int x) { @@ -3272,18 +3272,18 @@ public boolean isPalindrome(int x) { } ``` -**»ØÎÄ×Ó×Ö·û´®** +**???????????** [Leetcode : 647. Palindromic Substrings (Medium)](https://leetcode.com/problems/palindromic-substrings/description/) -½â¾ö·½°¸ÊÇ´Ó×Ö·û´®µÄijһλ¿ªÊ¼£¬³¢ÊÔ×ÅÈ¥À©Õ¹×Ó×Ö·û´®¡£ +???????????????????¦Ë???????????????????????? ```java private int cnt = 0; public int countSubstrings(String s) { for(int i = 0; i < s.length(); i++) { - extendSubstrings(s, i, i); // ÆæÊý³¤¶È - extendSubstrings(s, i, i + 1); // żÊý³¤¶È + extendSubstrings(s, i, i); // ???????? + extendSubstrings(s, i, i + 1); // ??????? } return cnt; } @@ -3297,7 +3297,7 @@ private void extendSubstrings(String s, int start, int end) { } ``` -**ͳ¼Æ¶þ½øÖÆ×Ö·û´®ÖÐÁ¬Ðø 1 ºÍ Á¬Ðø 0 ÊýÁ¿ÏàͬµÄ×Ó×Ö·û´®¸öÊý** +**??????????????????? 1 ?? ???? 0 ????????????????????** ```html Input: "00110011" @@ -3323,48 +3323,48 @@ public int countBinarySubstrings(String s) { } ``` -**×Ö·û´®Ñ­»·ÒÆÎ»°üº¬** +**??????????¦Ë????** -[ ±à³ÌÖ®ÃÀ£º3.1](#) +[ ????????3.1](#) -¸ø¶¨Á½¸ö×Ö·û´® s1 ºÍ s2 £¬ÒªÇóÅж¨ s2 ÊÇ·ñÄܹ»±» s1 ×öÑ­»·ÒÆÎ»µÃµ½µÄ×Ö·û´®°üº¬¡£ +????????????? s1 ?? s2 ??????§Ø? s2 ???????? s1 ???????¦Ë???????????????? ```html s1 = AABCD, s2 = CDAA Return : true ``` -s1 ½øÐÐÑ­»·ÒÆÎ»µÄ½á¹ûÊÇ s1s1 µÄ×Ó×Ö·û´®£¬Òò´ËÖ»ÒªÅÐ¶Ï s2 ÊÇ·ñÊÇ s1s1 µÄ×Ó×Ö·û´®¼´¿É¡£ +s1 ?????????¦Ë?????? s1s1 ?????????????????§Ø? s2 ????? s1s1 ????????????¨À? -**×Ö·û´®Ñ­»·ÒÆÎ»** +**??????????¦Ë** -[ ±à³ÌÖ®ÃÀ£º2.17](#) +[ ????????2.17](#) -½«×Ö·û´®ÏòÓÒÑ­»·Òƶ¯ k λ¡£ +????????????????? k ¦Ë?? -ÀýÈç abcd123 ÏòÓÒÒÆ¶¯ 3 λ µÃµ½ 123abcd +???? abcd123 ??????? 3 ¦Ë ??? 123abcd -½« abcd123 ÖÐµÄ abcd ºÍ 123 µ¥¶ÀÄæÐò£¬µÃµ½ dcba321£¬È»ºó¶ÔÕû¸ö×Ö·û´®½øÐÐÄæÐò£¬µÃµ½123abcd¡£ +?? abcd123 ?§Ö? abcd ?? 123 ?????????? dcba321?????????????????????????123abcd?? -**×Ö·û´®Öе¥´ÊµÄ·­×ª** +**??????§Ö??????** -[³ÌÐòÔ±´úÂëÃæÊÔÖ¸ÄÏ](#) +[????????????????](#) -ÀýÈ罫 "I am a student" ·­×ª³É "student a am I" +???ÁL "I am a student" ????? "student a am I" -½«Ã¿¸öµ¥´ÊÄæÐò£¬È»ºó½«Õû¸ö×Ö·û´®ÄæÐò¡£ +????????????????????????????? -## Êý×éÓë¾ØÕó +## ????????? -**¾ØÕóÐýת** // TODO +**???????** // TODO -[³ÌÐòÔ±ÃæÊÔ½ðµä P114](#) +[??????????? P114](#) -**Ö®×ÖÐÍ´òÓ¡** //TODO +**???????** //TODO -[³ÌÐòÔ±´úÂëÃæÊÔÖ¸ÄÏ P335](#) +[???????????????? P335](#) -**°ÑÊý×éÖÐµÄ 0 ÒÆµ½Ä©Î²** +**???????§Ö? 0 ????¦Â** [Leetcode : 283. Move Zeroes (Easy)](https://leetcode.com/problems/move-zeroes/description/) @@ -3381,20 +3381,20 @@ s1 } ``` -**Ò»¸öÊý×éÔªËØÔÚ [1, n] Ö®¼ä£¬ÆäÖÐÒ»¸öÊý±»Ì滻ΪÁíÒ»¸öÊý£¬ÕÒ³ö¶ªÊ§µÄÊýºÍÖØ¸´µÄÊý** +**???????????? [1, n] ???????????????�I?????????????????????????????** [Leetcode : 645. Set Mismatch (Easy)](https://leetcode.com/problems/set-mismatch/description/) -×îÖ±½ÓµÄ·½·¨ÊÇÏȶÔÊý×é½øÐÐÅÅÐò£¬ÕâÖÖ·½·¨Ê±¼ä¸´ÔÓ¶ÈΪ O(nlogn)£¬±¾Ìâ¿ÉÒÔÒÔ O(n) µÄʱ¼ä¸´ÔÓ¶È¡¢O(1) ¿Õ¼ä¸´ÔÓ¶ÈÀ´Çó½â¡£ +??????????????????????????????????ÁÙ???? O(nlogn)??????????? O(n) ????ÁÙ????O(1) ??ÁÙ???????? -Ö÷Ҫ˼ÏëÊÇÈÃͨ¹ý½»»»Êý×éÔªËØ£¬Ê¹µÃÊý×éÉϵÄÔªËØÔÚÕýÈ·µÄλÖÃÉÏ¡£ +?????????????????????????????????????????????¦Ë????? -±éÀúÊý×飬Èç¹ûµÚ i λÉϵÄÔªËØ²»ÊÇ i + 1 £¬ÄÇô¾Í½»»»µÚ i λ ºÍ nums[i] - 1 λÉϵÄÔªËØ£¬Ê¹µÃ num[i] - 1 µÄÔªËØÎª nums[i] £¬Ò²¾ÍÊǸÃλµÄÔªËØÊÇÕýÈ·µÄ¡£½»»»²Ù×÷ÐèҪѭ»·½øÐУ¬ÒòΪһ´Î½»»»Ã»°ì·¨Ê¹µÃµÚ i λÉϵÄÔªËØÊÇÕýÈ·µÄ¡£µ«ÊÇÒª½»»»µÄÁ½¸öÔªËØ¿ÉÄܾÍÊÇÖØ¸´ÔªËØ£¬ÄÇôѭ»·¾Í¿ÉÄÜÓÀÔ¶½øÐÐÏÂÈ¥£¬ÖÕֹѭ»·µÄ·½·¨ÊǼÓÉÏ nums[i] != nums[nums[i] - 1 Ìõ¼þ¡£ +???????ï…????? i ¦Ë????????? i + 1 ???????????? i ¦Ë ?? nums[i] - 1 ¦Ë?????????? num[i] - 1 ?????? nums[i] ????????¦Ë??????????????????????????????§µ??????¦Í?????????? i ¦Ë???????????????????????????????????????????????????????????????????????????????????? nums[i] != nums[nums[i] - 1 ?????? -ÀàËÆÌâÄ¿£º +????????? -- [Leetcode :448. Find All Numbers Disappeared in an Array (Easy)](https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/description/)£¬Ñ°ÕÒËùÓжªÊ§µÄÔªËØ -- [Leetcode : 442. Find All Duplicates in an Array (Medium)](https://leetcode.com/problems/find-all-duplicates-in-an-array/description/)£¬Ñ°ÕÒËùÓÐÖØ¸´µÄÔªËØ¡£ +- [Leetcode :448. Find All Numbers Disappeared in an Array (Easy)](https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/description/)????????§Ø??????? +- [Leetcode : 442. Find All Duplicates in an Array (Medium)](https://leetcode.com/problems/find-all-duplicates-in-an-array/description/)?????????????????? ```java public int[] findErrorNums(int[] nums) { @@ -3416,11 +3416,11 @@ private void swap(int[] nums, int i, int j){ } ``` -**ÕÒ³öÊý×éÖÐÖØ¸´µÄÊý£¬Êý×éÖµÔÚ [0, n-1] Ö®¼ä** +**????????????????????????? [0, n-1] ???** [Leetcode : 287. Find the Duplicate Number (Medium)](https://leetcode.com/problems/find-the-duplicate-number/description/) -¶þ·Ö²éÕҽⷨ£º +?????????? ```java public int findDuplicate(int[] nums) { @@ -3438,7 +3438,7 @@ public int findDuplicate(int[] nums) { } ``` -˫ָÕë½â·¨£¬ÀàËÆÓÚÓл·Á´±íÖÐÕÒ³ö»·µÄÈë¿Ú£º +??????????????§Ý?????????????????? ```java public int findDuplicate(int[] nums) { @@ -3457,11 +3457,11 @@ public int findDuplicate(int[] nums) { } ``` -### ÓÐÐò¾ØÕó +### ??????? -ÓÐÐò¾ØÕóÖ¸µÄÊÇÐкÍÁзֱðÓÐÐòµÄ¾ØÕó¡£ +?????????????§Ü??§Ù?????????? -Ò»°ã¿ÉÒÔÀûÓÃÓÐÐòÐÔʹÓöþ·Ö²éÕÒ·½·¨¡£ +?????????????????????????????? ```html [ @@ -3471,7 +3471,7 @@ public int findDuplicate(int[] nums) { ] ``` -**ÓÐÐò¾ØÕó²éÕÒ** +**??????????** [Leetocde : 240. Search a 2D Matrix II (Medium)](https://leetcode.com/problems/search-a-2d-matrix-ii/description/) @@ -3489,7 +3489,7 @@ public boolean searchMatrix(int[][] matrix, int target) { } ``` -**ÓÐÐò¾ØÕóµÄ Kth Element** +**???????? Kth Element** [Leetcode : 378. Kth Smallest Element in a Sorted Matrix ((Medium))](https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/description/) @@ -3504,9 +3504,9 @@ k = 8, return 13. ``` -½âÌâ²Î¿¼£º[Share my thoughts and Clean Java Code](https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/discuss/85173) +????¦Ï???[Share my thoughts and Clean Java Code](https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/discuss/85173) -¶þ·Ö²éÕҽⷨ£º +?????????? ```java public int kthSmallest(int[][] matrix, int k) { @@ -3527,14 +3527,14 @@ public int kthSmallest(int[][] matrix, int k) { } ``` -¶Ñ½â·¨£º +????? ```java public int kthSmallest(int[][] matrix, int k) { int m = matrix.length, n = matrix[0].length; PriorityQueue pq = new PriorityQueue(); for(int j = 0; j < n; j++) pq.offer(new Tuple(0, j, matrix[0][j])); - for(int i = 0; i < k - 1; i++) { // С¸ù¶Ñ£¬È¥µô k - 1 ¸ö¶Ñ¶¥ÔªËØ£¬´Ëʱ¶Ñ¶¥ÔªËؾÍÊÇµÚ k µÄÊý + for(int i = 0; i < k - 1; i++) { // §³???????? k - 1 ?????????????????????? k ???? Tuple t = pq.poll(); if(t.x == m - 1) continue; pq.offer(new Tuple(t.x + 1, t.y, matrix[t.x + 1][t.y])); @@ -3555,25 +3555,25 @@ class Tuple implements Comparable { } ``` -## Á´±í +## ???? -**ÅжÏÁ½¸öÁ´±íµÄ½»µã** +**?§Ø?????????????** [Leetcode : 160. Intersection of Two Linked Lists](https://leetcode.com/problems/intersection-of-two-linked-lists/description/) ```html -A: a1 ¡ú a2 - ¨K - c1 ¡ú c2 ¡ú c3 - ¨J -B: b1 ¡ú b2 ¡ú b3 +A: a1 ?? a2 + ?K + c1 ?? c2 ?? c3 + ?J +B: b1 ?? b2 ?? b3 ``` -ÒªÇó£ºÊ±¼ä¸´ÔÓ¶ÈΪ O(n) ¿Õ¼ä¸´ÔÓ¶ÈΪ O(1) +?????ÁÙ???? O(n) ??ÁÙ???? O(1) -Éè A µÄ³¤¶ÈΪ a + c£¬B µÄ³¤¶ÈΪ b + c£¬ÆäÖÐ c Ϊβ²¿¹«¹²²¿·Ö³¤¶È£¬¿ÉÖª a + c + b = b + c + a¡£ +?? A ?????? a + c??B ?????? b + c?????? c ?¦Â????????????????? a + c + b = b + c + a?? -µ±·ÃÎÊ A Á´±íµÄÖ¸Õë·ÃÎʵ½Á´±íβ²¿Ê±£¬ÁîËü´ÓÁ´±í B µÄÍ·²¿¿ªÊ¼·ÃÎÊÁ´±í B£»Í¬ÑùµØ£¬µ±·ÃÎÊ B Á´±íµÄÖ¸Õë·ÃÎʵ½Á´±íβ²¿Ê±£¬ÁîËü´ÓÁ´±í A µÄÍ·²¿¿ªÊ¼·ÃÎÊÁ´±í A¡£ÕâÑù¾ÍÄÜ¿ØÖÆ·ÃÎÊ A ºÍ B Á½¸öÁ´±íµÄÖ¸ÕëÄÜͬʱ·ÃÎʵ½½»µã¡£ +?????? A ????????????????¦Â??????????????? B ???????????????? B?????????????? B ????????????????¦Â??????????????? A ???????????????? A???????????????? A ?? B ????????????????????????? ```java public ListNode getIntersectionNode(ListNode headA, ListNode headB) { @@ -3587,19 +3587,19 @@ public ListNode getIntersectionNode(ListNode headA, ListNode headB) { } ``` -Èç¹ûÖ»ÊÇÅжÏÊÇ·ñ´æÔÚ½»µã£¬ÄÇô¾ÍÊÇÁíÒ»¸öÎÊÌ⣬¼´ ±à³ÌÖ®ÃÀ£º3.6 µÄÎÊÌâ¡£ÓÐÁ½Öֽⷨ£º°ÑµÚÒ»¸öÁ´±íµÄ½áβÁ¬½Óµ½µÚ¶þ¸öÁ´±íµÄ¿ªÍ·£¬¿´µÚ¶þ¸öÁ´±íÊÇ·ñ´æÔÚ»·£»»òÕßÖ±½Ó±È½ÏµÚÒ»¸öÁ´±í×îºóÒ»¸ö½ÚµãºÍµÚ¶þ¸öÁ´±í×îºóÒ»¸ö½ÚµãÊÇ·ñÏàͬ¡£ +???????§Ø???????????????????????????? ????????3.6 ???????????????????????????¦Â??????????????????????????????????????????????????????????????????????????????????????????? -**Á´±í·´×ª** +**?????** [Leetcode : 206. Reverse Linked List](https://leetcode.com/problems/reverse-linked-list/description/) -Í·²å·¨Äܹ»°´ÄæÐò¹¹½¨Á´±í¡£ +??¾Þ?????????????? ```java public ListNode reverseList(ListNode head) { - ListNode newHead = null; // ÉèΪ null £¬×÷ΪÐÂÁ´±íµÄ½áβ + ListNode newHead = null; // ??? null ?????????????¦Â while(head != null){ ListNode nextNode = head.next; head.next = newHead; @@ -3610,11 +3610,11 @@ public ListNode reverseList(ListNode head) { } ``` -**¹é²¢Á½¸öÓÐÐòµÄÁ´±í** +**?öã?????????????** [Leetcode : 21. Merge Two Sorted Lists](https://leetcode.com/problems/merge-two-sorted-lists/description/) -Á´±íºÍÊ÷Ò»Ñù£¬¿ÉÒÔÓõݹ鷽ʽÀ´¶¨Ò壺Á´±íÊǿսڵ㣬»òÕßÓÐÒ»¸öÖµºÍÒ»¸öÖ¸ÏòÏÂÒ»¸öÁ´±íµÄÖ¸Õ룬Òò´ËºÜ¶àÁ´±íÎÊÌâ¿ÉÒÔÓõݹéÀ´´¦Àí¡£ +???????????????????ú›??????‰Ø?????????????????????????????????????????????????????????????????? ```java public ListNode mergeTwoLists(ListNode l1, ListNode l2) { @@ -3632,7 +3632,7 @@ public ListNode mergeTwoLists(ListNode l1, ListNode l2) { } ``` -**´ÓÓÐÐòÁ´±íÖÐɾ³ýÖØ¸´½Úµã** +**?????????????????????** [Leetcode : 83. Remove Duplicates from Sorted List (Easy)](https://leetcode.com/problems/remove-duplicates-from-sorted-list/description/) @@ -3644,11 +3644,11 @@ public ListNode deleteDuplicates(ListNode head) { } ``` -**»ØÎÄÁ´±í** +**????????** [Leetcode : 234. Palindrome Linked List (Easy)](https://leetcode.com/problems/palindrome-linked-list/description/) -ÇгÉÁ½°ë£¬°Ñºó°ë¶Î·´×ª£¬È»ºó±È½ÏÁ½°ëÊÇ·ñÏàµÈ¡£ +?§Ô?????????¦Ç???????????????????? ```java public boolean isPalindrome(ListNode head) { @@ -3659,11 +3659,11 @@ public boolean isPalindrome(ListNode head) { fast = fast.next.next; } - if(fast != null){ // żÊý½Úµã£¬Èà slow Ö¸ÏòÏÂÒ»¸ö½Úµã + if(fast != null){ // ???????? slow ??????????? slow = slow.next; } - cut(head, slow); // ÇгÉÁ½¸öÁ´±í + cut(head, slow); // ?§Ô????????? ListNode l1 = head, l2 = slow; l2 = reverse(l2); return isEqual(l1, l2); @@ -3695,9 +3695,9 @@ private boolean isEqual(ListNode l1, ListNode l2){ } ``` -**´ÓÁ´±íÖÐɾ³ý½Úµã** +**??????????????** -[±à³ÌÖ®ÃÀ£º3.4]() +[????????3.4]() ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/2c968ec5-0967-49ce-ac06-f8f5c9ab33bc.jpg) @@ -3706,7 +3706,7 @@ B.val = C.val; B.next = C.next; ``` -**Á´±íÔªËØ°´ÆæÅ¼¾Û¼¯** +**??????????????** [Leetcode : 328. Odd Even Linked List (Medium)](https://leetcode.com/problems/odd-even-linked-list/description/) @@ -3727,13 +3727,13 @@ public ListNode oddEvenList(ListNode head) { } ``` -## Ê÷ +## ?? -### µÝ¹é +### ??? -Ò»¿ÃÊ÷ҪôÊÇ¿ÕÊ÷£¬ÒªÃ´ÓÐÁ½¸öÖ¸Õ룬ÿ¸öÖ¸ÕëÖ¸ÏòÒ»¿ÃÊ÷¡£Ê÷ÊÇÒ»Öֵݹé½á¹¹£¬ºÜ¶àÊ÷µÄÎÊÌâ¿ÉÒÔʹÓõݹéÀ´´¦Àí¡£ +?????????????????????????????????????????????????????????????????????????????? -**Ê÷µÄ¸ß¶È** +**??????** [Leetcode : 104. Maximum Depth of Binary Tree (Easy)](https://leetcode.com/problems/maximum-depth-of-binary-tree/description/) @@ -3744,21 +3744,21 @@ public int maxDepth(TreeNode root) { } ``` -**·­×ªÊ÷** +**?????** [Leetcode : 226. Invert Binary Tree (Easy)](https://leetcode.com/problems/invert-binary-tree/description/) ```java public TreeNode invertTree(TreeNode root) { if(root == null) return null; - TreeNode left = root.left; // ºóÃæµÄ²Ù×÷»á¸Ä±ä left Ö¸Õ룬Òò´ËÏȱ£´æÏÂÀ´ + TreeNode left = root.left; // ???????????? left ??????????????? root.left = invertTree(root.right); root.right = invertTree(left); return root; } ``` -**¹é²¢Á½¿ÃÊ÷** +**?öã??????** [Leetcode : 617. Merge Two Binary Trees (Easy)](https://leetcode.com/problems/merge-two-binary-trees/description/) @@ -3774,11 +3774,11 @@ public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { } ``` -**ÅжÏ·¾¶ºÍÊÇ·ñµÈÓÚÒ»¸öÊý** +**?§Ø?¡¤???????????????** [Leetcdoe : 112. Path Sum (Easy)](https://leetcode.com/problems/path-sum/description/) -ÌâÄ¿ÃèÊö£ºÂ·¾¶ºÍ¶¨ÒåΪ´Ó root µ½ leaf µÄËùÓнڵãµÄºÍ +?????????¡¤?????????? root ?? leaf ?????§ß???? ```java public boolean hasPathSum(TreeNode root, int sum) { @@ -3788,13 +3788,13 @@ public boolean hasPathSum(TreeNode root, int sum) { } ``` -**ͳ¼ÆÂ·¾¶ºÍµÈÓÚÒ»¸öÊýµÄ·¾¶ÊýÁ¿** +**???¡¤??????????????¡¤??????** [Leetcode : 437. Path Sum III (Easy)](https://leetcode.com/problems/path-sum-iii/description/) -ÌâÄ¿ÃèÊö£ºÂ·¾¶²»Ò»¶¨ÒÔ root ¿ªÍ·²¢ÒÔ leaf ½á⣬µ«ÊDZØÐëÁ¬Ðø +?????????¡¤????????? root ??????? leaf ??¦Â????????????? -pathSumStartWithRoot() ·½·¨Í³¼ÆÒÔij¸ö½Úµã¿ªÍ·µÄ·¾¶¸öÊý¡£ +pathSumStartWithRoot() ??????????????????¡¤???????? ```java public int pathSum(TreeNode root, int sum) { @@ -3812,7 +3812,7 @@ private int pathSumStartWithRoot(TreeNode root, int sum){ } ``` -**Ê÷µÄ¶Ô³Æ** +**??????** [Leetcode : 101. Symmetric Tree (Easy)](https://leetcode.com/problems/symmetric-tree/description/) @@ -3830,11 +3830,11 @@ private boolean isSymmetric(TreeNode t1, TreeNode t2){ } ``` -**ƽºâÊ÷** +**?????** [Leetcode : 110. Balanced Binary Tree (Easy)](https://leetcode.com/problems/balanced-binary-tree/description/) -ÌâÄ¿ÃèÊö£º×óÓÒ×ÓÊ÷¸ß¶È²îÊÇ·ñ¶¼Ð¡ÓÚµÈÓÚ 1 +????????????????????????§³????? 1 ```java private boolean result = true; @@ -3853,11 +3853,11 @@ public int maxDepth(TreeNode root) { } ``` -**×îС·¾¶** +**??§³¡¤??** [Leetcode : 111. Minimum Depth of Binary Tree (Easy)](https://leetcode.com/problems/minimum-depth-of-binary-tree/description/) -ÌâÄ¿ÃèÊö£ºÊ÷µÄ¸ù½Úµãµ½Ò¶×Ó½ÚµãµÄ×îС³¤¶È +?????????????????????????§³???? ```java public int minDepth(TreeNode root) { @@ -3869,7 +3869,7 @@ public int minDepth(TreeNode root) { } ``` -**ͳ¼Æ×óÒ¶×Ó½ÚµãµÄºÍ** +**????????????** [Leetcode : 404. Sum of Left Leaves (Easy)](https://leetcode.com/problems/sum-of-left-leaves/description/) @@ -3886,11 +3886,11 @@ private boolean isLeaf(TreeNode node){ } ``` -**ÐÞ¼ôÒ»¿ÃÊ÷** +**????????** [Leetcode : 669. Trim a Binary Search Tree (Easy)](https://leetcode.com/problems/trim-a-binary-search-tree/description/) -ÌâÄ¿ÃèÊö£ºÖ»±£ÁôÖµÔÚ L \~ R Ö®¼äµÄ½Úµã +????????????????? L \~ R ?????? ```java public TreeNode trimBST(TreeNode root, int L, int R) { @@ -3903,7 +3903,7 @@ public TreeNode trimBST(TreeNode root, int L, int R) { } ``` -**×ÓÊ÷** +**????** [Leetcode : 572. Subtree of Another Tree (Easy)](https://leetcode.com/problems/subtree-of-another-tree/description/) @@ -3923,11 +3923,11 @@ private boolean isSame(TreeNode s, TreeNode t){ } ``` -**´ÓÓÐÐòÊý×éÖй¹Ôì¶þ²æ²éÕÒÊ÷** +**???????????§Û???????????** [Leetcode : 108. Convert Sorted Array to Binary Search Tree (Easy)](https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/description/) -¶þ²æ²éÕÒÊ÷£¨BST£©£º¸ù½Úµã´óÓÚµÈÓÚ×ó×ÓÊ÷ËùÓнڵ㣬СÓÚµÈÓÚÓÒ×ÓÊ÷ËùÓнڵ㡣 +???????????BST????????????????????????§ß??§³??????????????§ß?? ```java public TreeNode sortedArrayToBST(int[] nums) { @@ -3944,7 +3944,7 @@ private TreeNode toBST(int[] nums, int sIdx, int eIdx){ } ``` -**Á½½ÚµãµÄ×·¾¶** +**????????¡¤??** ```html 1 @@ -3975,7 +3975,7 @@ private int depth(TreeNode root) { } ``` -**ÕÒ³ö¶þ²æÊ÷ÖеڶþСµÄ½Úµã** +**??????????§Ö??§³????** [Leetcode : 671. Second Minimum Node In a Binary Tree (Easy)](https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/description/) @@ -3990,7 +3990,7 @@ Input: Output: 5 ``` -Ò»¸ö½ÚµãҪô¾ßÓÐ 0 ¸ö»ò 2 ¸ö×ӽڵ㣬Èç¹ûÓÐ×ӽڵ㣬ÄÇô¸ù½ÚµãÊÇ×îСµÄ½Úµã¡£ +???????????? 0 ???? 2 ???????????????????????????§³???? ```java public int findSecondMinimumValue(TreeNode root) { @@ -4006,7 +4006,7 @@ public int findSecondMinimumValue(TreeNode root) { } ``` -**ѰÕÒÁ½¸ö½ÚµãµÄ×î½ü¹«¹²×æÏÈ** +**??????????????????????** [Leetcode : 235. Lowest Common Ancestor of a Binary Search Tree (Easy)](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/) @@ -4018,7 +4018,7 @@ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { } ``` -**×î½ü¹«¹²×æÏÈ** +**???????????** [Leetcode : 236. Lowest Common Ancestor of a Binary Tree (Medium) ](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/) @@ -4031,7 +4031,7 @@ public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { } ``` -**×î´óÏàͬ½ÚµãÖµµÄ·¾¶³¤¶È** +**????????????¡¤??????** [Leetcode : 687. Longest Univalue Path (Easy)](https://pomotodo.com/app/) @@ -4063,7 +4063,7 @@ private int dfs(TreeNode root){ } ``` -**¼ä¸ô±éÀú** +**???????** [Leetcode : 337. House Robber III (Medium)](https://leetcode.com/problems/house-robber-iii/description/) @@ -4082,11 +4082,11 @@ public int rob(TreeNode root) { } ``` -### ²ã´Î±éÀú +### ??¦Á??? -ʹÓà BFS£¬²»ÐèҪʹÓÃÁ½¸ö¶ÓÁÐÀ´·Ö±ð´æ´¢µ±Ç°²ãµÄ½ÚµãºÍÏÂÒ»²ãµÄ½Úµã£¬ ÒòΪÔÚ¿ªÊ¼±éÀúÒ»²ãµÄ½Úµãʱ£¬µ±Ç°¶ÓÁÐÖеĽڵãÊý¾ÍÊǵ±Ç°²ãµÄ½ÚµãÊý£¬Ö»Òª¿ØÖƱéÀúÕâô¶à½ÚµãÊý£¬¾ÍÄܱ£Ö¤Õâ´Î±éÀúµÄ¶¼Êǵ±Ç°²ãµÄ½Úµã¡£ +??? BFS???????????????????????›¥????????????????? ????????????????????????????§Ö????????????????????????????????????????????????¦Á??????????????? -**¼ÆËãÒ»¿ÃÊ÷ÿ²ã½ÚµãµÄƽ¾ùÊý** +**????????????????????** [637. Average of Levels in Binary Tree (Easy)](https://leetcode.com/problems/average-of-levels-in-binary-tree/description/) @@ -4111,7 +4111,7 @@ public List averageOfLevels(TreeNode root) { } ``` -**µÃµ½×óϽǵĽڵã** +**???????????** [Leetcode : 513. Find Bottom Left Tree Value (Easy)](https://leetcode.com/problems/find-bottom-left-tree-value/description/) @@ -4128,7 +4128,7 @@ public int findBottomLeftValue(TreeNode root) { } ``` -### ǰÖкóÐò±éÀú +### ??§Ü?????? ```html 1 @@ -4138,16 +4138,16 @@ public int findBottomLeftValue(TreeNode root) { 4 5 6 ``` -²ã´Î±éÀú˳Ðò£º[1 2 3 4 5 6] -ǰÐò±éÀú˳Ðò£º[1 2 4 5 3 6] -ÖÐÐò±éÀú˳Ðò£º[4 2 5 1 3 6] -ºóÐò±éÀú˳Ðò£º[4 5 2 6 3 1] +??¦Á??????[1 2 3 4 5 6] +?????????[1 2 4 5 3 6] +??????????[4 2 5 1 3 6] +??????????[4 5 2 6 3 1] -²ã´Î±éÀúʹÓà BFS ʵÏÖ£¬ÀûÓõľÍÊÇ BFS Ò»²ãÒ»²ã±éÀúµÄÌØÐÔ£»¶øÇ°Ðò¡¢ÖÐÐò¡¢ºóÐò±éÀúÀûÓÃÁË DFS ʵÏÖ¡£ +??¦Á?????? BFS ???????????? BFS ????????????????????????????????????? DFS ???? -ǰÐò¡¢ÖÐÐò¡¢ºóÐò±éÖ»ÊÇÔÚ¶Ô½Úµã·ÃÎʵÄ˳ÐòÓÐÒ»µã²»Í¬£¬ÆäËü¶¼Ïàͬ¡£ +????????????????????????????????????????????? -¢Ù ǰÐò +?? ??? ```java void dfs(TreeNode root){ @@ -4157,7 +4157,7 @@ void dfs(TreeNode root){ } ``` -¢Ú ÖÐÐò +?? ???? ```java void dfs(TreeNode root){ @@ -4167,7 +4167,7 @@ void dfs(TreeNode root){ } ``` -¢Û ºóÐò +?? ???? ```java void dfs(TreeNode root){ @@ -4177,7 +4177,7 @@ void dfs(TreeNode root){ } ``` -**·ÇµÝ¹éʵÏÖ¶þ²æÊ÷µÄǰÐò±éÀú** +**????????????????????** [Leetcode : 144. Binary Tree Preorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-preorder-traversal/description/) @@ -4191,17 +4191,17 @@ public List preorderTraversal(TreeNode root) { TreeNode node = stack.pop(); ret.add(node.val); if (node.right != null) stack.push(node.right); - if (node.left != null) stack.push(node.left); // ÏÈÌí¼ÓÓÒ×ÓÊ÷ÔÙÌí¼Ó×ó×ÓÊ÷£¬ÕâÑùÊÇΪÁËÈÃ×ó×ÓÊ÷ÔÚÕ»¶¥ + if (node.left != null) stack.push(node.left); // ?????????????????????????????????????????????? } return ret; } ``` -**·ÇµÝ¹éʵÏÖ¶þ²æÊ÷µÄºóÐø±éÀú** +**?????????????????????** [Leetcode : ### 145. Binary Tree Postorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-postorder-traversal/description/) -ǰÐò±éÀúΪ root -> left -> right£¬ºóÐò±éÀúΪ left -> right -> root£¬¿ÉÒÔÐÞ¸ÄǰÐò±éÀú³ÉΪ root -> right -> left£¬ÄÇôÕâ¸ö˳Ðò¾ÍºÍºóÐò±éÀúÕýºÃÏà·´¡£ +??????? root -> left -> right?????????? left -> right -> root?????????????????? root -> right -> left??????????????????????????? ```java public List postorderTraversal(TreeNode root) { @@ -4220,7 +4220,7 @@ public List postorderTraversal(TreeNode root) { } ``` -**·ÇµÝ¹éʵÏÖ¶þ²æÊ÷µÄÖÐÐò±éÀú** +**?????????????????????** [Leetcode : 94. Binary Tree Inorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-inorder-traversal/description/) @@ -4230,7 +4230,7 @@ public List inorderTraversal(TreeNode root) { Stack stack = new Stack<>(); TreeNode cur = root; while(cur != null || !stack.isEmpty()) { - while(cur != null) { // Ä£ÄâµÝ¹éÕ»µÄ²»¶ÏÉîÈë + while(cur != null) { // ??????????????? stack.add(cur); cur = cur.left; } @@ -4242,19 +4242,19 @@ public List inorderTraversal(TreeNode root) { } ``` -**ʹÓÃÖÐÐò±éÀúºÍǰÐò±éÀúÐòÁÐÖØ½¨¶þ²æÊ÷** //TODO +**???????????????????????????????** //TODO ### BST -Ö÷ÒªÀûÓà BST ÖÐÐò±éÀúÓÐÐòµÄÌØµã¡£ +??????? BST ??????????????? -**ÔÚ BST ÖÐѰÕÒÁ½¸ö½Úµã£¬Ê¹ËüÃǵĺÍΪһ¸ö¸ø¶¨Öµ¡£** +**?? BST ??????????????????????????????** [653. Two Sum IV - Input is a BST](https://leetcode.com/problems/two-sum-iv-input-is-a-bst/description/) -ʹÓÃÖÐÐò±éÀúµÃµ½ÓÐÐòÊý×éÖ®ºó£¬ÔÙÀûÓÃ˫ָÕë¶ÔÊý×é½øÐвéÕÒ¡£ +?????????????????????????????????????????§Ó???? -Ó¦¸Ã×¢Òâµ½£¬ÕâÒ»Ìâ²»ÄÜÓ÷ֱðÔÚ×óÓÒ×ÓÊ÷Á½²¿·ÖÀ´´¦ÀíÕâÖÖ˼Ï룬ÒòΪÁ½¸ö´ýÇóµÄ½Úµã¿ÉÄÜ·Ö±ðÔÚ×óÓÒ×ÓÊ÷ÖС£ +????????????????¡Â?????????????????????????????????????????????????????????????§³? ```java public boolean findTarget(TreeNode root, int k) { @@ -4278,11 +4278,11 @@ private void inOrder(TreeNode root, List nums){ } ``` -**ÔÚ BST ÖвéÕÒ×îСµÄÁ½¸ö½ÚµãÖ®²îµÄ¾ø¶ÔÖµ** +**?? BST ?§Ó?????§³?????????????????** [Leetcode : 530. Minimum Absolute Difference in BST (Easy)](https://leetcode.com/problems/minimum-absolute-difference-in-bst/description/) -ÀûÓà BST µÄÖÐÐò±éÀúΪÓÐÐòµÄÐÔÖÊ£¬¼ÆËãÖÐÐò±éÀúÖÐÁÙ½üµÄÁ½¸ö½ÚµãÖ®²îµÄ¾ø¶ÔÖµ£¬È¡×îСֵ¡£ +???? BST ??????????????????????????????????????????????????????????§³??? ```java private int minDiff = Integer.MAX_VALUE; @@ -4302,11 +4302,11 @@ private void inorder(TreeNode node){ } ``` -**°Ñ BST ÿ¸ö½ÚµãµÄÖµ¶¼¼ÓÉϱÈËü´óµÄ½ÚµãµÄÖµ** +**?? BST ????????????????????????** [Leetcode : Convert BST to Greater Tree (Easy)](https://leetcode.com/problems/convert-bst-to-greater-tree/description/) -ÏȱéÀúÓÒ×ÓÊ÷¡£ +????????????? ```java private int sum = 0; @@ -4331,7 +4331,7 @@ private void traver(TreeNode root) { } ``` -**ѰÕÒ BST ÖгöÏÖ´ÎÊý×î¶àµÄ½Úµã** +**??? BST ?§Ô????????????** ```java private int cnt = 1; @@ -4369,11 +4369,11 @@ private void inorder(TreeNode node){ } ``` -**ѰÕÒ BST µÄµÚ k ¸öÔªËØ** +**??? BST ??? k ?????** [Leetcode : 230. Kth Smallest Element in a BST (Medium)](https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/) -µÝ¹é½â·¨£º +?????? ```java public int kthSmallest(TreeNode root, int k) { @@ -4389,7 +4389,7 @@ private int count(TreeNode node) { } ``` -ÖÐÐò±éÀú½â·¨£º +??????????? ```java private int cnt = 0; @@ -4417,9 +4417,9 @@ private void inorder(TreeNode node, int k) { ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/5c638d59-d4ae-4ba4-ad44-80bdc30f38dd.jpg) -Trie£¬ÓÖ³ÆÇ°×ºÊ÷»ò×ÖµäÊ÷£¬ÓÃÓÚÅжÏ×Ö·û´®ÊÇ·ñ´æÔÚ»òÕßÊÇ·ñ¾ßÓÐijÖÖ×Ö·û´®Ç°×º¡£ +Trie???????????????????????§Ø????????????????????????????????? -**ʵÏÖÒ»¸ö Trie** +**?????? Trie** [Leetcode : 208. Implement Trie (Prefix Tree) (Medium)](https://leetcode.com/problems/implement-trie-prefix-tree/description/) @@ -4479,7 +4479,7 @@ class Trie { } ``` -**ʵÏÖÒ»¸ö Trie£¬ÓÃÀ´Çóǰ׺ºÍ** +**?????? Trie????????????** [Leetcode : 677. Map Sum Pairs (Medium)](https://leetcode.com/problems/map-sum-pairs/description/) @@ -4536,13 +4536,13 @@ class MapSum { } ``` -## ͼ +## ? -## λÔËËã +## ¦Ë???? -**1. »ù±¾Ô­Àí** +**1. ???????** -0s ±íʾ Ò»´® 0 £¬1s ±íʾһ´® 1¡£ +0s ??? ??? 0 ??1s ?????? 1?? ``` x ^ 0s = x x & 0s = 0 x | 0s = x @@ -4550,33 +4550,33 @@ x ^ 1s = \~x x & 1s = x x | 1s = 1s x ^ x = 0 x & x = x x | x = x ``` -¢Ù ÀûÓà x ^ 1s = \~x µÄÌØµã£¬¿ÉÒÔ½«Î»¼¶±íʾ·­×ª£»ÀûÓà x ^ x = 0 µÄÌØµã£¬¿ÉÒÔ½«Èý¸öÊýÖÐÖØ¸´µÄÁ½¸öÊýÈ¥³ý£¬Ö»ÁôÏÂÁíÒ»¸öÊý£» -¢Ú ÀûÓà x & 0s = 0 ºÍ x & 1s = x µÄÌØµã£¬¿ÉÒÔʵÏÖÑÚÂë²Ù×÷¡£Ò»¸öÊý num Óë mask £º00111100 ½øÐÐλÓë²Ù×÷£¬Ö»±£Áô num ÖÐÓë mask µÄ 1 ²¿·ÖÏà¶ÔÓ¦µÄλ£» -¢Û ÀûÓà x | 0s = x ºÍ x | 1s = 1s µÄÌØµã£¬¿ÉÒÔʵÏÖÉèÖòÙ×÷¡£Ò»¸öÊý num Óë mask£º00111100 ½øÐÐλ»ò²Ù×÷£¬½« num ÖÐÓë mask µÄ 1 ²¿·ÖÏà¶ÔÓ¦µÄλ¶¼ÉèÖÃΪ 1 ¡£ +?? ???? x ^ 1s = \~x ??????????¦Ë?????????????? x ^ x = 0 ???????????????????????????????????????????????? +?? ???? x & 0s = 0 ?? x & 1s = x ?????????????????????????? num ?? mask ??00111100 ????¦Ë???????????? num ???? mask ?? 1 ??????????¦Ë?? +?? ???? x | 0s = x ?? x | 1s = 1s ???????????????¨°?????????? num ?? mask??00111100 ????¦Ë????????? num ???? mask ?? 1 ??????????¦Ë??????? 1 ?? -\>\> n ΪËãÊõÓÒÒÆ£¬Ï൱ÓÚ³ýÒÔ 2n£» -\>\>\> n ΪÎÞ·ûºÅÓÒÒÆ£¬×ó±ß»á²¹ÉÏ 0¡£ -<< n ΪËãÊõ×óÒÆ£¬Ï൱ÓÚ³ËÒÔ 2n¡£ +\>\> n ????????????????? 2n?? +\>\>\> n ????????????????? 0?? +<< n ????????????????? 2n?? -n&(n-1) ¸ÃλÔËËãÊÇÈ¥³ý n µÄλ¼¶±íʾÖÐ×îµÍµÄÄÇһλ¡£ÀýÈç¶ÔÓÚ¶þ½øÖƱíʾ 10110**100**£¬¼õÈ¥ 1 µÃµ½ 10110**011**£¬ÕâÁ½¸öÊýÏàÓëµÃµ½ 10110**000**¡£ +n&(n-1) ??¦Ë????????? n ??¦Ë??????????????¦Ë???????????????? 10110**100**????? 1 ??? 10110**011**???????????????? 10110**000**?? -n-n&(\~n+1) ¸ÅÔËËãÊÇÈ¥³ý n µÄλ¼¶±íʾÖÐ×î¸ßµÄÄÇһλ¡£ +n-n&(\~n+1) ??????????? n ??¦Ë??????????????¦Ë?? -n&(-n) ¸ÃÔËËãµÃµ½ n µÄλ¼¶±íʾÖÐ×îµÍµÄÄÇһλ¡£-n µÃµ½ n µÄ·´Âë¼Ó 1£¬¶ÔÓÚ¶þ½øÖƱíʾ 10110**100**£¬-n µÃµ½ 01001**100**£¬ÏàÓëµÃµ½ 00000**100** +n&(-n) ???????? n ??¦Ë??????????????¦Ë??-n ??? n ?????? 1????????????? 10110**100**??-n ??? 01001**100**???????? 00000**100** -**2. mask ¼ÆËã** +**2. mask ????** -Òª»ñÈ¡ 111111111£¬½« 0 È¡·´¼´¿É£¬\~0¡£ +???? 111111111???? 0 ????????\~0?? -ÒªµÃµ½Ö»ÓÐµÚ i λΪ 1 µÄ mask£¬½« 1 Ïò×óÒÆ¶¯ i λ¼´¿É£¬1<<i ¡£ÀýÈç 1<<5 µÃµ½Ö»ÓÐµÚ 5 λΪ 1 µÄ mask £º00010000¡£ +??????§Ö? i ¦Ë? 1 ?? mask???? 1 ??????? i ¦Ë?????1<<i ?????? 1<<5 ?????§Ö? 5 ¦Ë? 1 ?? mask ??00010000?? -ÒªµÃµ½ 1 µ½ i λΪ 1 µÄ mask£¬1<<(i+1)-1 ¼´¿É£¬ÀýÈ罫 1<<(4+1)-1 = 00010000-1 = 00001111¡£ +???? 1 ?? i ¦Ë? 1 ?? mask??1<<(i+1)-1 ????????ÁL 1<<(4+1)-1 = 00010000-1 = 00001111?? -ÒªµÃµ½ 1 µ½ i λΪ 0 µÄ mask£¬Ö»Ð轫 1 µ½ i λΪ 1 µÄ mask È¡·´£¬¼´ \~(1<<(i+1)-1)¡£ +???? 1 ?? i ¦Ë? 0 ?? mask????éí 1 ?? i ¦Ë? 1 ?? mask ??????? \~(1<<(i+1)-1)?? -**3. λ²Ù×÷¾ÙÀý** +**3. ¦Ë????????** -¢Ù »ñÈ¡µÚ i λ +?? ????? i ¦Ë num & 00010000 != 0 @@ -4584,7 +4584,7 @@ num & 00010000 != 0 (num & (1 << i)) != 0; ``` -¢Ú ½«µÚ i λÉèÖÃΪ 1 +?? ???? i ¦Ë????? 1 num | 00010000 @@ -4592,7 +4592,7 @@ num | 00010000 num | (1 << i); ``` -¢Û ½«µÚ i λÇå³ýΪ 0 +?? ???? i ¦Ë???? 0 num & 11101111 @@ -4600,7 +4600,7 @@ num & 11101111 num & (\~(1 << i)) ``` -¢Ü ½«×î¸ßλµ½µÚ i λÇå³ýΪ 0 +?? ?????¦Ë???? i ¦Ë???? 0 num & 00001111 @@ -4608,7 +4608,7 @@ num & 00001111 num & ((1 << i) - 1); ``` -¢Ý ½«µÚ 0 λµ½µÚ i λÇå³ýΪ 0 +?? ???? 0 ¦Ë???? i ¦Ë???? 0 num & 11110000 @@ -4616,27 +4616,27 @@ num & 11110000 num & (\~((1 << (i+1)) - 1)); ``` -¢Þ ½«µÚ i λÉèÖÃΪ 0 »òÕß 1 +?? ???? i ¦Ë????? 0 ???? 1 -ÏȽ«µÚ i λÇåÁ㣬Ȼºó½« v ×óÒÆ i λ£¬Ö´ÐС°Î»»ò¡±ÔËËã¡£ +????? i ¦Ë??????? v ???? i ¦Ë????§³?¦Ë?????? ```java (num & (1 << i)) | (v << i); ``` -**4. Java ÖеÄλ²Ù×÷** +**4. Java ?§Ö?¦Ë????** ```html -static int Integer.bitCount() // ͳ¼Æ 1 µÄÊýÁ¿ -static int Integer.highestOneBit() // »ñµÃ×î¸ßλ -static String toBinaryString(int i) // ת»»Î»¶þ½øÖƱíʾµÄ×Ö·û´® +static int Integer.bitCount() // ??? 1 ?????? +static int Integer.highestOneBit() // ??????¦Ë +static String toBinaryString(int i) // ???¦Ë??????????????? ``` -**ͳ¼ÆÁ½¸öÊýµÄ¶þ½øÖƱíʾÓжàÉÙλ²»Í¬** +**???????????????????§Ø???¦Ë???** [Leetcode : 461. Hamming Distance (Easy)](https://leetcode.com/problems/hamming-distance/) -¶ÔÁ½¸öÊý½øÐÐÒì»ò²Ù×÷£¬²»Í¬µÄÄÇһλ½á¹ûΪ 1 £¬Í³¼ÆÓжàÉÙ¸ö 1 ¼´¿É¡£ +????????????????????????????¦Ë???? 1 ??????§Ø???? 1 ???¨À? ```java public int hammingDistance(int x, int y) { @@ -4650,7 +4650,7 @@ public int hammingDistance(int x, int y) { } ``` -¿ÉÒÔʹÓà Integer.bitcount() À´Í³¼Æ 1 ¸öµÄ¸öÊý¡£ +??????? Integer.bitcount() ????? 1 ????????? ```java public int hammingDistance(int x, int y) { @@ -4658,7 +4658,7 @@ public int hammingDistance(int x, int y) { } ``` -**·­×ªÒ»¸öÊýµÄ±ÈÌØÎ»** +**?????????????¦Ë** [Leetcode : 190. Reverse Bits (Easy)](https://leetcode.com/problems/reverse-bits/description/) @@ -4674,9 +4674,9 @@ public int reverseBits(int n) { } ``` -**²»ÓöîÍâ±äÁ¿½»»»Á½¸öÕûÊý** +**??????????????????????** -[³ÌÐòÔ±´úÂëÃæÊÔÖ¸ÄÏ £ºP317](#) +[???????????????? ??P317](#) ```java a = a ^ b; @@ -4684,13 +4684,13 @@ b = a ^ b; a = a ^ b; ``` -½« c = a ^ b£¬ÄÇô b ^ c = b ^ b ^ a = a£¬a ^ c = a ^ a ^ b = b¡£ +?? c = a ^ b????? b ^ c = b ^ b ^ a = a??a ^ c = a ^ a ^ b = b?? -**ÅжÏÒ»¸öÊýÊDz»ÊÇ 4 µÄ n ´Î·½** +**?§Ø??????????? 4 ?? n ?¦Ç?** [Leetcode : 342. Power of Four (Easy)](https://leetcode.com/problems/power-of-four/) -¸ÃÊý¶þ½øÖƱíʾÓÐÇÒÖ»ÓÐÒ»¸öÆæÊýλΪ 1 £¬ÆäÓàµÄ¶¼Îª 0 £¬ÀýÈç 16 £º 10000¡£¿ÉÒÔÿ´Î°Ñ 1 Ïò×óÒÆ¶¯ 2 룬¾ÍÄܹ¹Ôì³öÕâÖÖÊý×Ö£¬È»ºó±È½Ï¹¹Ôì³öÀ´µÄÊýÓëÒªÅжϵÄÊýÊÇ·ñÏàͬ¡£ +??????????????????????????¦Ë? 1 ????????? 0 ?????? 16 ?? 10000?????????? 1 ??????? 2 ¦Ë??????????????????????????????????????§Ø???????????? ```java public boolean isPowerOfFour(int num) { @@ -4703,7 +4703,7 @@ public boolean isPowerOfFour(int num) { } ``` -Ò²¿ÉÒÔÓà Java µÄ Integer.toString() ·½·¨½«¸ÃÊýת»»Îª 4 ½øÖÆÐÎʽµÄ×Ö·û´®£¬È»ºóÅжÏ×Ö·û´®ÊÇ·ñÒÔ 1 ¿ªÍ·¡£ +??????? Java ?? Integer.toString() ?????????????? 4 ????????????????????§Ø??????????? 1 ????? ```java public boolean isPowerOfFour(int num) { @@ -4711,11 +4711,11 @@ public boolean isPowerOfFour(int num) { } ``` -**ÅжÏÒ»¸öÊýÊDz»ÊÇ 2 µÄ n ´Î·½** +**?§Ø??????????? 2 ?? n ?¦Ç?** [Leetcode : 231. Power of Two (Easy)](https://leetcode.com/problems/power-of-two/description/) -ͬÑù¿ÉÒÔÓà Power of Four µÄ·½·¨£¬µ«ÊÇ 2 µÄ n ´Î·½¸üÌØÊ⣬ËüµÄ¶þ½øÖƱíʾֻÓÐÒ»¸ö 1 ´æÔÚ¡£ +????????? Power of Four ??????????? 2 ?? n ?¦Ç???????????????????????? 1 ????? ```java public boolean isPowerOfTwo(int n) { @@ -4723,7 +4723,7 @@ public boolean isPowerOfTwo(int n) { } ``` -ÀûÓà 1000 & 0111 == 0 ÕâÖÖÐÔÖÊ£¬µÃµ½ÒÔϽⷨ£º +???? 1000 & 0111 == 0 ??????????????????? ```java public boolean isPowerOfTwo(int n) { @@ -4731,13 +4731,13 @@ public boolean isPowerOfTwo(int n) { } ``` -**Êý×éÖÐΨһһ¸ö²»Öظ´µÄÔªËØ** +**??????¦·??????????????** [Leetcode : 136. Single Number (Easy)](https://leetcode.com/problems/single-number/description/) -Á½¸öÏàͬµÄÊýÒì»òµÄ½á¹ûΪ 0£¬¶ÔËùÓÐÊý½øÐÐÒì»ò²Ù×÷£¬×îºóµÄ½á¹û¾ÍÊǵ¥¶À³öÏÖµÄÄǸöÊý¡£ +?????????????????? 0??????????????????????????????????????????????? -ÀàËÆµÄÓУº[Leetcode : 389. Find the Difference (Easy)](https://leetcode.com/problems/find-the-difference/description/)£¬Á½¸ö×Ö·û´®½öÓÐÒ»¸ö×Ö·û²»Ïàͬ£¬Ê¹ÓÃÒì»ò²Ù×÷¿ÉÒÔÒÔ O(1) µÄ¿Õ¼ä¸´ÔÓ¶ÈÀ´Çó½â£¬¶ø²»ÐèҪʹÓà HashSet¡£ +??????§µ?[Leetcode : 389. Find the Difference (Easy)](https://leetcode.com/problems/find-the-difference/description/)??????????????????????????????????????????? O(1) ???ÁÙ?????????????????? HashSet?? ```java public int singleNumber(int[] nums) { @@ -4747,22 +4747,22 @@ public int singleNumber(int[] nums) { } ``` -**Êý×éÖв»Öظ´µÄÁ½¸öÔªËØ** +**?????§Ó?????????????** [Leetcode : 260. Single Number III (Medium)](https://leetcode.com/problems/single-number-iii/description/) -Á½¸ö²»ÏàµÈµÄÔªËØÔÚλ¼¶±íʾÉϱض¨»áÓÐһλ´æÔÚ²»Í¬¡£ +???????????????¦Ë??????????????¦Ë???????? -½«Êý×éµÄËùÓÐÔªËØÒì»òµÃµ½µÄ½á¹ûΪ²»´æÔÚÖØ¸´µÄÁ½¸öÔªËØÒì»òµÄ½á¹û¡£ +?????????????????????????????????????????????????? -diff &= -diff µÃµ½³ö diff ×îÓҲ಻Ϊ 0 µÄ룬Ҳ¾ÍÊDz»´æÔÚÖØ¸´µÄÁ½¸öÔªËØÔÚλ¼¶±íʾÉÏ×îÓҲ಻ͬµÄÄÇһ룬ÀûÓÃÕâһλ¾Í¿ÉÒÔ½«Á½¸öÔªËØÇø·Ö¿ªÀ´¡£ +diff &= -diff ????? diff ?????? 0 ??¦Ë??????????????????????????¦Ë??????????????????¦Ë?????????¦Ë?????????????????????? ```java public int[] singleNumber(int[] nums) { int diff = 0; for(int num : nums) diff ^= num; - // µÃµ½×îÓÒһλ + // ????????¦Ë diff &= -diff; int[] ret = new int[2]; for(int num : nums) { @@ -4773,11 +4773,11 @@ public int[] singleNumber(int[] nums) { } ``` -**ÅжÏÒ»¸öÊýµÄλ¼¶±íʾÊÇ·ñ²»»á³öÏÖÁ¬ÐøµÄ 0 ºÍ 1** +**?§Ø????????¦Ë?????????????????? 0 ?? 1** [Leetcode : 693. Binary Number with Alternating Bits (Easy)](https://leetcode.com/problems/binary-number-with-alternating-bits/description/) -¶ÔÓÚ 10101 ÕâÖÖλ¼¶±íʾµÄÊý£¬°ÑËüÏòÓÒÒÆ¶¯ 1 λµÃµ½ 1010 £¬ÕâÁ½¸öÊýÿ¸öλ¶¼²»Í¬£¬Òò´ËÒì»òµÃµ½µÄ½á¹ûΪ 11111¡£ +???? 10101 ????¦Ë?????????????????????? 1 ¦Ë??? 1010 ?????????????¦Ë???????????????????? 11111?? ```java public boolean hasAlternatingBits(int n) { @@ -4786,13 +4786,13 @@ public boolean hasAlternatingBits(int n) { } ``` -**ÇóÒ»¸öÊýµÄ²¹Âë** +**????????????** [Leetcode : 476. Number Complement (Easy)](https://leetcode.com/problems/number-complement/description/) -²»¿¼ÂǶþ½øÖƱíʾÖеÄÊ× 0 ²¿·Ö +??????????????§Ö??? 0 ???? -¶ÔÓÚ 00000101£¬ÒªÇó²¹Âë¿ÉÒÔ½«ËüÓë 00000111 ½øÐÐÒì»ò²Ù×÷¡£ÄÇôÎÊÌâ¾Íת»»ÎªÇóÑÚÂë 00000111¡£ +???? 00000101??????????????? 00000111 ?????????????????????????????? 00000111?? ```java public int findComplement(int num) { @@ -4804,7 +4804,7 @@ public int findComplement(int num) { } ``` -¿ÉÒÔÀûÓà Java µÄ Integer.highestOneBit() ·½·¨À´»ñµÃº¬ÓÐÊ× 1 µÄÊý¡£ +???????? Java ?? Integer.highestOneBit() ????????¨²????? 1 ?????? ```java public int findComplement(int num) { @@ -4815,7 +4815,7 @@ public int findComplement(int num) { } ``` -¶ÔÓÚ 10000000 ÕâÑùµÄÊýÒªÀ©Õ¹³É 11111111£¬¿ÉÒÔÀûÓÃÒÔÏ·½·¨£º +???? 10000000 ?????????????? 11111111?????????????¡¤????? ```html mask |= mask >> 1 11000000 @@ -4835,11 +4835,11 @@ public int findComplement(int num) { } ``` -**ʵÏÖÕûÊýµÄ¼Ó·¨** +**???????????** [Leetcode : 371. Sum of Two Integers (Easy)](https://leetcode.com/problems/sum-of-two-integers/description/) -a ^ b ±íʾûÓп¼ÂǽøÎ»µÄÇé¿öÏÂÁ½ÊýµÄºÍ£¬(a & b) << 1 ¾ÍÊǽøÎ»¡£µÝ¹é»áÖÕÖ¹µÄÔ­ÒòÊÇ (a & b) << 1 ×îÓұ߻á¶àÒ»¸ö 0£¬ÄÇô¼ÌÐøµÝ¹é£¬½øÎ»×îÓÒ±ßµÄ 0 »áÂýÂýÔö¶à£¬×îºó½øÎ»»á±äΪ 0£¬µÝ¹éÖÕÖ¹¡£ +a ^ b ?????§á????¦Ë???????????????(a & b) << 1 ?????¦Ë???????????????? (a & b) << 1 ?????????? 0???????????ï…??¦Ë?????? 0 ??????????????¦Ë???? 0?????????? ```java public int getSum(int a, int b) { @@ -4847,17 +4847,17 @@ public int getSum(int a, int b) { } ``` -**ʵÏÖÕûÊý³Ë·¨** +**??????????** -[³ÌÐòÔ±´úÂëÃæÊÔÖ¸ÄÏ P319](#) +[???????????????? P319](#) -**×Ö·û´®Êý×é×î´ó³Ë»ý** +**??????????????** [Leetcode : 318. Maximum Product of Word Lengths (Medium)](https://leetcode.com/problems/maximum-product-of-word-lengths/description/) -ÌâÄ¿ÃèÊö£º×Ö·û´®Êý×éµÄ×Ö·û´®Ö»º¬ÓÐСд×Ö·û¡£Çó½â×Ö·û´®Êý×éÖÐÁ½¸ö×Ö·û´®³¤¶ÈµÄ×î´ó³Ë»ý£¬ÒªÇóÕâÁ½¸ö×Ö·û´®²»Äܺ¬ÓÐÏàͬ×Ö·û¡£ +?????????????????????????????§³§Õ????????????????????????????????????????????????????????????????????? -½âÌâ˼·£º±¾ÌâÖ÷ÒªÎÊÌâÊÇÅжÏÁ½¸ö×Ö·û´®ÊÇ·ñº¬Ïàͬ×Ö·û£¬ÓÉÓÚ×Ö·û´®Ö»º¬ÓÐСд×Ö·û£¬×ܹ² 26 룬Òò´Ë¿ÉÒÔÓÃÒ»¸ö 32 λµÄÕûÊýÀ´´æ´¢Ã¿¸ö×Ö·ûÊÇ·ñ³öÏÖ¹ý¡£ +?????¡¤????????????????§Ø???????????????????????????????????§³§Õ???????? 26 ¦Ë????????????? 32 ¦Ë?????????›¥??????????????? ```java public int maxProduct(String[] words) { @@ -4881,14 +4881,14 @@ public int maxProduct(String[] words) { } ``` -# ²Î¿¼×ÊÁÏ +# ?¦Ï????? - [Leetcode](https://leetcode.com/problemset/algorithms/?status=Todo) -- ½£Ö¸ Offer -- ³ÌÐòÔ±ÃæÊÔ½ðµä -- ±à³ÌÖ®ÃÀ -- ³ÌÐòÔ±´úÂëÃæÊÔÖ¸ÄÏ -- Êý¾Ý½á¹¹ÓëËã·¨·ÖÎö -- Ëã·¨ -- ÍõµÀÂÛ̳¼ÆËã»ú¿¼ÑлúÊÔÖ¸ÄÏ +- ??? Offer +- ??????????? +- ?????? +- ???????????????? +- ????????????? +- ?? +- ???????????????§Ý?????? diff --git a/notes/Linux.md b/notes/Linux.md index dc817fd6..3de0ef8a 100644 --- a/notes/Linux.md +++ b/notes/Linux.md @@ -1,41 +1,41 @@ -* [³£ÓòÙ×÷ÒÔ¼°¸ÅÄî](#³£ÓòÙ×÷ÒÔ¼°¸ÅÄî) - * [ÇóÖú](#ÇóÖú) - * [¹Ø»ú](#¹Ø»ú) - * [²é¿´½ø³Ì](#²é¿´½ø³Ì) - * [²é¿´¶Ë¿Ú](#²é¿´¶Ë¿Ú) +* [???¨°??????????](#???¨°??????????) + * [????](#????) + * [???](#???) + * [??????](#??????) + * [?????](#?????) * [PATH](#path) - * [ÔËÐеȼ¶](#ÔËÐеȼ¶) + * [???§Ö??](#???§Ö??) * [sudo](#sudo) * [GNU](#gnu) - * [°ü¹ÜÀí¹¤¾ß](#°ü¹ÜÀí¹¤¾ß) - * [³£¼û·¢Ðа汾](#³£¼û·¢Ðа汾) -* [·ÖÇø](#·ÖÇø) - * [´ÅÅ̵ÄÎļþÃû](#´ÅÅ̵ÄÎļþÃû) - * [·ÖÇø±í](#·ÖÇø±í) + * [????????](#????????) + * [???????§Ñ·Ú](#???????§Ñ·Ú) +* [????](#????) + * [??????????](#??????????) + * [??????](#??????) * [1. MBR](#1-mbr) * [2. GPT](#2-gpt) - * [¿ª»ú¼ì²â³ÌÐò](#¿ª»ú¼ì²â³ÌÐò) + * [??????????](#??????????) * [1. BIOS](#1-bios) * [2. UEFI](#2-uefi) - * [¹ÒÔØ](#¹ÒÔØ) -* [ÎļþȨÏÞÓëĿ¼ÅäÖÃ](#ÎļþȨÏÞÓëĿ¼ÅäÖÃ) - * [ÎļþȨÏÞ¸ÅÄî](#ÎļþȨÏÞ¸ÅÄî) - * [ÎļþÊôÐÔÒÔ¼°È¨ÏÞµÄÐÞ¸Ä](#ÎļþÊôÐÔÒÔ¼°È¨ÏÞµÄÐÞ¸Ä) - * [1. ÐÞ¸ÄÎļþËùÊôȺ×é](#1-ÐÞ¸ÄÎļþËùÊôȺ×é) - * [2. ÐÞ¸ÄÎļþÓµÓÐÕß](#2-ÐÞ¸ÄÎļþÓµÓÐÕß) - * [3. ÐÞ¸ÄȨÏÞ](#3-ÐÞ¸ÄȨÏÞ) - * [Ŀ¼µÄȨÏÞ](#Ŀ¼µÄȨÏÞ) - * [ÎļþĬÈÏȨÏÞ](#ÎļþĬÈÏȨÏÞ) - * [Ŀ¼ÅäÖÃ](#Ŀ¼ÅäÖÃ) -* [ÎļþÓëĿ¼](#ÎļþÓëĿ¼) - * [Îļþʱ¼ä](#Îļþʱ¼ä) - * [ÎļþÓëĿ¼µÄ»ù±¾²Ù×÷](#ÎļþÓëĿ¼µÄ»ù±¾²Ù×÷) + * [????](#????) +* [??????????????](#??????????????) + * [?????????](#?????????) + * [?????????????????](#?????????????????) + * [1. ?????????????](#1-?????????????) + * [2. ???????????](#2-???????????) + * [3. ??????](#3-??????) + * [???????](#???????) + * [?????????](#?????????) + * [??????](#??????) +* [???????](#???????) + * [??????](#??????) + * [????????????????](#????????????????) * [1. ls](#1-ls) * [2. cp](#2-cp) * [3. rm](#3-rm) * [4. mv](#4-mv) - * [»ñÈ¡ÎļþÄÚÈÝ](#»ñÈ¡ÎļþÄÚÈÝ) + * [??????????](#??????????) * [1. cat](#1-cat) * [2. tac](#2-tac) * [3. more](#3-more) @@ -44,105 +44,105 @@ * [6. tail](#6-tail) * [7. od](#7-od) * [8. touch](#8-touch) - * [Ö¸ÁîÓëÎļþËÑË÷](#Ö¸ÁîÓëÎļþËÑË÷) + * [????????????](#????????????) * [1. which](#1-which) * [2. whereis](#2-whereis) * [3. locate](#3-locate) * [4. find](#4-find) - * [4.1 Óëʱ¼äÓйصÄÑ¡Ïî](#41-Óëʱ¼äÓйصÄÑ¡Ïî) - * [4.2 ÓëÎļþÓµÓÐÕߺÍËùÊôȺ×éÓйصÄÑ¡Ïî](#42-ÓëÎļþÓµÓÐÕߺÍËùÊôȺ×éÓйصÄÑ¡Ïî) - * [4.3 ÓëÎļþȨÏÞºÍÃû³ÆÓйصÄÑ¡Ïî](#43-ÓëÎļþȨÏÞºÍÃû³ÆÓйصÄÑ¡Ïî) -* [´ÅÅÌÓëÎļþϵͳ](#´ÅÅÌÓëÎļþϵͳ) - * [ÎļþϵͳµÄ×é³É](#ÎļþϵͳµÄ×é³É) + * [4.1 ??????§Û?????](#41-??????§Û?????) + * [4.2 ???????????????????§Û?????](#42-???????????????????§Û?????) + * [4.3 ??????????????§Û?????](#43-??????????????§Û?????) +* [???????????](#???????????) + * [??????????](#??????????) * [inode](#inode) - * [Ŀ¼µÄ inode Óë block](#Ŀ¼µÄ-inode-Óë-block) - * [ʵÌåÁ´½ÓÓë·ûºÅÁ´½Ó](#ʵÌåÁ´½ÓÓë·ûºÅÁ´½Ó) - * [1. ʵÌåÁ´½Ó](#1-ʵÌåÁ´½Ó) - * [2. ·ûºÅÁ´½Ó](#2-·ûºÅÁ´½Ó) -* [ѹËõÓë´ò°ü](#ѹËõÓë´ò°ü) - * [ѹËõ](#ѹËõ) + * [???? inode ?? block](#????-inode-??-block) + * [????????????????](#????????????????) + * [1. ???????](#1-???????) + * [2. ????????](#2-????????) +* [???????](#???????) + * [???](#???) * [1. gzip](#1-gzip) * [2. bzip2](#2-bzip2) * [3. xz](#3-xz) - * [´ò°ü](#´ò°ü) + * [???](#???) * [BASH](#bash) - * [BashÌØÐÔ](#bashÌØÐÔ) - * [±äÁ¿²Ù×÷](#±äÁ¿²Ù×÷) - * [Ö¸ÁîËÑË÷˳Ðò](#Ö¸ÁîËÑË÷˳Ðò) - * [Êý¾ÝÁ÷ÖØ¶¨Ïò](#Êý¾ÝÁ÷ÖØ¶¨Ïò) - * [¹ÜÏßÖ¸Áî](#¹ÜÏßÖ¸Áî) - * [1. ÌáȡָÁcut](#1-ÌáȡָÁîcut) - * [2. ÅÅÐòÃüÁsort¡¢uniq](#2-ÅÅÐòÃüÁîsortuniq) - * [3. Ë«ÏòÊä³öÖØ¶¨Ïò£ºtee](#3-Ë«ÏòÊä³öÖØ¶¨Ïòtee) - * [4. ×Ö·ûת»»Ö¸Átr¡¢col¡¢expand¡¢join¡¢paste](#4-×Ö·ûת»»Ö¸Áîtrcolexpandjoinpaste) - * [5. ·ÖÇøÖ¸Ásplit](#5-·ÖÇøÖ¸Áîsplit) -* [Õý¹æ±íʾ·¨ÓëÎļþ¸ñʽ»¯´¦Àí](#Õý¹æ±íʾ·¨ÓëÎļþ¸ñʽ»¯´¦Àí) + * [Bash????](#bash????) + * [????????](#????????) + * [??????????](#??????????) + * [???????????](#???????????) + * [???????](#???????) + * [1. ??????cut](#1-??????cut) + * [2. ????????sort??uniq](#2-????????sort??uniq) + * [3. ???????????tee](#3-???????????tee) + * [4. ?????????tr??col??expand??join??paste](#4-?????????tr??col??expand??join??paste) + * [5. ???????split](#5-???????split) +* [??????????????????????](#??????????????????????) * [grep](#grep) * [printf](#printf) * [awk](#awk) -* [vim Èý¸öģʽ](#vim-Èý¸öģʽ) -* [²Î¿¼×ÊÁÏ](#²Î¿¼×ÊÁÏ) +* [vim ??????](#vim-??????) +* [?¦Ï?????](#?¦Ï?????) -# ³£ÓòÙ×÷ÒÔ¼°¸ÅÄî +# ???¨°?????????? -## ÇóÖú +## ???? **1. --help** -Ö¸ÁîµÄ»ù±¾Ó÷¨ÓëÑ¡Ïî½éÉÜ¡£ +????????¡Â?????????? **2. man** -man ÊÇ manual µÄËõд£¬½«Ö¸ÁîµÄ¾ßÌåÐÅÏ¢ÏÔʾ³öÀ´¡£ +man ?? manual ????§Õ??????????????????????? -µ±Ö´ÐÐ man date ʱ£¬ÓÐ DATE(1) ³öÏÖ£¬ÆäÖеÄÊý×Ö´ú±íÖ¸ÁîµÄÀàÐÍ£¬³£ÓõÄÊý×Ö¼°ÆäÀàÐÍÈçÏ£º +????? man date ????? DATE(1) ????????§Ö?????????????????????????????????????? -| ´úºÅ | ÀàÐÍ | +| ???? | ???? | | -- | -- | -| 1 | Óû§ÔÚ shell »·¾³ÖпÉÒÔ²Ù×÷µÄÖ¸Áî»òÕß¿ÉÖ´ÐÐÎļþ | -| 5 | ÅäÖÃÎļþ | -| 8 | ϵͳ¹ÜÀíÔ±¿ÉÒÔʹÓõĹÜÀíÖ¸Áî | +| 1 | ????? shell ?????§á????????????????????? | +| 5 | ??????? | +| 8 | ????????????????????? | **3. info** -info Óë man ÀàËÆ£¬µ«ÊÇ info ½«Îĵµ·Ö³ÉÒ»¸ö¸öÒ³Ãæ£¬Ã¿¸öÒ³Ãæ¿ÉÒÔ½øÐÐÌø×ª¡£ +info ?? man ????????? info ???????????????—¨????????????????? -## ¹Ø»ú +## ??? -**1. Êý¾Ýͬ²½Ð´Èë´ÅÅÌ sync** +**1. ???????§Õ????? sync** -ΪÁ˼ӿì¶Ô´ÅÅÌÉÏÎļþµÄ¶ÁдËÙ¶È£¬Î»ÓÚÄÚ´æÖеÄÎļþÊý¾Ý²»»áÁ¢¼´Í¬²½µ½´ÅÅÌÉÏ£¬Òò´Ë¹Ø»ú֮ǰÐèÒªÏȽøÐÐ sync ͬ²½²Ù×÷¡£ +?????????????????§Õ????¦Ë??????§Ö?????????????????????????????????????????? sync ????????? **2. shutdown** ```html -# /sbin/shutdown [-krhc] [ʱ¼ä] [¾¯¸æÑ¶Ï¢] --k £º ²»»á¹Ø»ú£¬Ö»ÊÇ·¢Ë;¯¸æÑ¶Ï¢£¬Í¨ÖªËùÓÐÔÚÏßµÄÓû§ --r £º ½«ÏµÍ³µÄ·þÎñÍ£µôºó¾ÍÖØÐÂÆô¶¯ --h £º ½«ÏµÍ³µÄ·þÎñÍ£µôºó¾ÍÁ¢¼´¹Ø»ú --c £º È¡ÏûÒѾ­ÔÚ½øÐÐµÄ shutdown Ö¸ÁîÄÚÈÝ +# /sbin/shutdown [-krhc] [???] [??????] +-k ?? ??????????????????????????????????? +-r ?? ??????????????????????? +-h ?? ?????????????????????? +-c ?? ??????????§Ö? shutdown ??????? ``` -**3. ÆäËü¹Ø»úÖ¸Áî** +**3. ??????????** -reboot¡¢halt¡¢poweroff¡£ +reboot??halt??poweroff?? -## ²é¿´½ø³Ì +## ?????? -ps Ö¸Áî¡£ +ps ??þŸ -ÀýÈç²é¿´ theadx µÄÏà¹ØÐÅÏ¢£º +????? theadx ?????????? ```html ps aux | grep threadx ``` -## ²é¿´¶Ë¿Ú +## ????? -netstat Ö¸Áî¡£ +netstat ??þŸ -ÀýÈç²é¿´¶Ë¿Ú 80 ÊÇ·ñ±»Õ¼Ó㺠+???????? 80 ??????? ```html netstat -anp | grep 80 @@ -150,345 +150,345 @@ netstat -anp | grep 80 ## PATH -¿ÉÒÔÔÚ»·¾³±äÁ¿ PATH ÖÐÉùÃ÷¿ÉÖ´ÐÐÎļþµÄ·¾¶£¬Â·¾¶Ö®¼äÓà : ·Ö¸ô¡£ +????????????? PATH ????????????????¡¤????¡¤??????? : ????? ```html /usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin ``` -## ÔËÐеȼ¶ +## ???§Ö?? -0£º¹Ø»úģʽ -1£ºµ¥Óû§Ä£Ê½£¨¿ÉÓÃÓÚÆÆ½ârootÃÜÂ룩 -2£ºÎÞÍøÂçÖ§³ÖµÄ¶àÓû§Ä£Ê½ -3£ºÓÐÍøÂçÖ§³ÖµÄ¶àÓû§Ä£Ê½£¨Îı¾Ä£Ê½£¬¹¤×÷ÖÐ×î³£ÓõÄģʽ£© -4£º±£Áô£¬Î´Ê¹Óà -5£ºÓÐÍøÂçÖ§³ÖµÄ X-windows Ö§³Ö¶àÓû§Ä£Ê½£¨×ÀÃæ£© -6£ºÖØÐÂÒýµ¼ÏµÍ³£¬¼´ÖØÆô +0??????? +1????????????????????root???? +2?????????????????? +3?????????????????????????????????????????? +4????????¦Ä??? +5???????????? X-windows ??????????????—¥ +6???????????????????? ## sudo -ʹÓà sudo ÔÊÐíÒ»°ãÓû§Ê¹Óà root ¿ÉÖ´ÐеÄÃüÁî¡£Óû§±ØÐëÔÚ /etc/sudoers ÖвÅÄÜʹÓøÃÖ¸Áî¡£ +??? sudo ????????????? root ????§Ö????þŸ????????? /etc/sudoers ?§Ó?????????þŸ ## GNU -GNU ¼Æ»®£¬ÓÖÒëΪ¸ïÅ«¼Æ»®£¬ËüµÄÄ¿±êÊÇ´´½¨Ò»Ì×ÍêÈ«×ÔÓɵIJÙ×÷ϵͳ£¬³ÆÎª GNU£¬ÆäÄÚÈÝÈí¼þÍêÈ«ÒÔ GPL ·½Ê½·¢²¼¡£ÆäÖÐ GPL È«³ÆÎª GNU ͨÓù«¹²Ðí¿ÉЭÒ飬°üº¬ÁËÒÔÏÂÄÚÈÝ£º +GNU ????????????¨±?????????????????????????????????????? GNU???????????????? GPL ????????????? GPL ???? GNU ??¨´??????§¿?ï…??????????????? -- ÒÔÈκÎÄ¿µÄÔËÐд˳ÌÐòµÄ×ÔÓÉ£» -- ÔÙ¸´ÖƵÄ×ÔÓÉ£» -- ¸Ä½ø´Ë³ÌÐò£¬²¢¹«¿ª·¢²¼¸Ä½øµÄ×ÔÓÉ¡£ +- ???¦Ê???????§Õ?????????? +- ??????????? +- ?????????????????????????¨À? -## °ü¹ÜÀí¹¤¾ß +## ???????? -RPM ºÍ DPKG Ϊ×î³£¼ûµÄÁ½ÀàÈí¼þ°ü¹ÜÀí¹¤¾ß¡£RPM È«³ÆÎª Redhat Package Manager£¬×îÔçÓÉ Red Hat ¹«Ë¾Öƶ¨ÊµÊ©£¬Ëæºó±» GNU ¿ªÔ´²Ù×÷ϵͳ½ÓÊܲ¢³ÉΪºÜ¶à Linux ϵͳ (RHEL) µÄ¼È¶¨Èí¼þ±ê×¼¡£Óë RPM ½øÐоºÕùµÄÊÇ»ùÓÚ Debian ²Ù×÷ϵͳ (UBUNTU) µÄ DEB Èí¼þ°ü¹ÜÀí¹¤¾ß£­ DPKG£¬È«³ÆÎª Debian Package£¬¹¦ÄÜ·½ÃæÓë RPM ÏàËÆ¡£ +RPM ?? DPKG ???????????????????????RPM ???? Redhat Package Manager???????? Red Hat ????????????? GNU ???????????????????? Linux ?? (RHEL) ?????????????? RPM ???§à?????????? Debian ?????? (UBUNTU) ?? DEB ???????????? DPKG?????? Debian Package??????????? RPM ????? -YUM »ùÓÚ RPM °ü¹ÜÀí¹¤¾ß£¬Äܹ»´ÓÖ¸¶¨µÄÔ´¿Õ¼ä£¨·þÎñÆ÷£¬±¾µØÄ¿Â¼µÈ£©×Ô¶¯ÏÂÔØÄ¿±ê RPM °ü²¢ÇÒ°²×°£¬¾ßÓÐÒÀÀµ¹ÜÀí¹¦ÄÜ£¬¿ÉÒÔ×Ô¶¯´¦ÀíÒÀÀµ¹ØÏµ²¢½øÐÐÏÂÔØ¡¢°²×°£¬ÎÞÐë·±ËöµØÊÖ¶¯ÏÂÔØ¡¢°²×°Ã¿Ò»¸öÐèÒªµÄÒÀÀµ°ü¡£´ËÍ⣬YUM µÄÁíÒ»¸ö¹¦ÄÜÊǽøÐÐϵͳÖÐËùÓÐÈí¼þµÄÉý¼¶¡£ +YUM ???? RPM ?????????????????????????????????????????????????? RPM ???????????????????????????????????????????????????????????????????????????????????????????????????YUM ??????????????????????????????????? -## ³£¼û·¢Ðа汾 +## ???????§Ñ·Ú -Linux ·¢ÐаæÊÇÔ¤Ïȼ¯³ÉºÃµÄ Linux Äں˼°¸÷ÖÖÓ¦ÓÃÈí¼þ¡£ +Linux ???§Ñ??????????? Linux ???????????????? -**»ùÓÚ DPKG** +**???? DPKG** -ÉÌÒµ·¢Ðаæ +??????§Ñ? - Ubuntu -ÉçÇø·¢Ðаæ +???????§Ñ? - Debian -**»ùÓÚ RPM** +**???? RPM** -ÉÌÒµ·¢Ðаæ +??????§Ñ? - Red Hat -ÉçÇø·¢Ðаæ +???????§Ñ? - Fedora - CentOS -# ·ÖÇø +# ???? -## ´ÅÅ̵ÄÎļþÃû +## ?????????? -Linux ÖÐÿ¸öÓ²¼þ¶¼±»µ±×öÒ»¸öÎļþ¡£ +Linux ???????????????????????? -³£¼û´ÅÅ̵ÄÎļþÃû£º +???????????????? -- SCSI/SATA/USB ´ÅÅÌ£º/dev/sd[a-p] -- IDE ´ÅÅÌ£º/dev/hd[a-d] +- SCSI/SATA/USB ?????/dev/sd[a-p] +- IDE ?????/dev/hd[a-d] -ÆäÖÐÎļþÃûºóÃæµÄÐòºÅµÄÈ·¶¨Óë´ÅÅ̲åÈëµÄ˳ÐòÓйأ¬¶øÓë´ÅÅÌËù²åÈëµÄ²å²ÛλÖÃÎ޹ء£ +??????????????????????????????????§Û??????????????????¦Ë?????? -## ·ÖÇø±í +## ?????? -´ÅÅÌ·ÖÇø±íÖ÷ÒªÓÐÁ½ÖÖ¸ñʽ£¬Ò»ÖÖÊÇÏÞÖÆ½Ï¶àµÄ MBR ·ÖÇø±í£¬Ò»ÖÖÊǽÏÐÂÇÒÏÞÖÆ½ÏÉÙµÄ GPT ·ÖÇø±í¡£ +?????????????????????????????????? MBR ???????????????????????? GPT ?????? ### 1. MBR -MBR ÖУ¬µÚÒ»¸öÉÈÇø×îÖØÒª£¬ÀïÃæÓУºÖ÷Òª¿ª»ú¼Ç¼£¨Master boot record, MBR£©¼°·ÖÇø±í£¨partition table£©£¬ÆäÖÐ MBR Õ¼ 446 bytes£¬partition table Õ¼ 64 bytes¡£ +MBR ?§µ??????????????????????§µ?????????????Master boot record, MBR??????????partition table???????? MBR ? 446 bytes??partition table ? 64 bytes?? -·ÖÇø±íÖ»ÓÐ 64 bytes£¬×î¶àÖ»ÄÜ´æ´¢ 4 ¸ö·ÖÇø£¬Õâ 4 ¸ö·ÖÇøÎªÖ÷·ÖÇø£¨Primary£©ºÍÀ©Õ¹·ÖÇø£¨Extended£©¡£ÆäÖÐÀ©Õ¹·ÖÇøÖ»ÓÐÒ»¸ö£¬Ëü½«ÆäËü¿Õ¼äÓÃÀ´¼Ç¼·ÖÇø±í£¬¿ÉÒԼǼ¸ü¶àµÄ·ÖÇø£¬Òò´Ëͨ¹ýÀ©Õ¹·ÖÇø¿ÉÒÔ·Ö³ö¸ü¶àÇø·Ö£¬ÕâЩ·ÖÇø³ÆÎªÂß¼­·ÖÇø¡£ +????????? 64 bytes????????›¥ 4 ?????????? 4 ???????????????Primary?????????????Extended?????????????????????????????????????????????????????????????????????????????????????????????§»???????????????? -Linux Ò²°Ñ·ÖÇøµ±³ÉÎļþ£¬·ÖÇøÎļþµÄÃüÃû·½Ê½Îª£º´ÅÅÌÎļþÃû+±àºÅ£¬ÀýÈç /dev/sda1¡£×¢Ò⣬Âß¼­·ÖÇøµÄ±àºÅ´Ó 5 ¿ªÊ¼¡£ +Linux ???????????????????????????????????????????+???????? /dev/sda1????????????????? 5 ????? ### 2. GPT -²»Í¬µÄ´ÅÅÌÓв»Í¬µÄÉÈÇø´óС£¬ÀýÈç 512bytes ºÍ×îдÅÅÌµÄ 4k¡£GPT ΪÁ˼æÈÝËùÓдÅÅÌ£¬ÔÚ¶¨ÒåÉÈÇøÉÏʹÓÃÂß¼­Çø¿éµØÖ·£¨Logical Block Address, LBA£©¡£ +?????????§Ó??????????§³?????? 512bytes ?????????? 4k??GPT ?????????§Õ?????????????????????????????Logical Block Address, LBA???? -GPT µÚ 1 ¸öÇø¿é¼Ç¼ÁË MBR£¬½ô½Ó×ÅÊÇ 33 ¸öÇø¿é¼Ç¼·ÖÇøÐÅÏ¢£¬²¢°Ñ×îºóµÄ 33 ¸öÇø¿éÓÃÓÚ¶Ô·ÖÇøÐÅÏ¢½øÐб¸·Ý¡£ +GPT ?? 1 ?????????? MBR?????????? 33 ????????????????????????? 33 ????????????????????§Ò???? -GPT ûÓÐÀ©Õ¹·ÖÇø¸ÅÄ¶¼ÊÇÖ÷·ÖÇø£¬×î¶à¿ÉÒÔ·Ö 128 ¸ö·ÖÇø¡£ +GPT ????????????????????????????????? 128 ???????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a5c25452-6fa5-49e7-9322-823077442775.jpg) -## ¿ª»ú¼ì²â³ÌÐò +## ?????????? ### 1. BIOS -BIOS ÊÇ¿ª»úµÄʱºò¼ÆËã»úÖ´ÐеĵÚÒ»¸ö³ÌÐò£¬Õâ¸ö³ÌÐòÖªµÀ¿ÉÒÔ¿ª»úµÄ´ÅÅÌ£¬²¢¶ÁÈ¡´ÅÅ̵ÚÒ»¸öÉÈÇøµÄ MBR£¬ÓÉ MBR Ö´ÐÐÆäÖеĿª»ú¹ÜÀí³ÌÐò£¬Õâ¸ö¿ª»ú¹ÜÀí³ÌÐòµÄ»á¼ÓÔØ²Ù×÷ϵͳµÄºËÐÄÎļþ¡£ +BIOS ????????????????§Ö??????????????????????????????????????????????????? MBR???? MBR ??????§Ö????????????????????????????????????????????? -MBR ÖеĿª»ú¹ÜÀí³ÌÐòÌṩÒÔϹ¦ÄÜ£ºÑ¡µ¥¡¢ÔØÈëºËÐÄÎļþÒÔ¼°×ª½»ÆäËü¿ª»ú¹ÜÀí³ÌÐò¡£×ª½»Õâ¸ö¹¦ÄÜ¿ÉÒÔÓÃÀ´ÊµÏÖÁ˶àÖØÒýµ¼£¬Ö»ÐèÒª½«ÁíÒ»¸ö²Ù×÷ϵͳµÄ¿ª»ú¹ÜÀí³ÌÐò°²×°ÆäËü·ÖÇøµÄÆô¶¯ÉÈÇøÉÏ£¬ÔÚÆô¶¯ MBR ÖеĿª»ú¹ÜÀí³ÌÐòʱ£¬¾Í¿ÉÒÔÑ¡ÔñÆô¶¯µ±Ç°µÄ²Ù×÷ϵͳ»òÕßת½»¸øÆäËü¿ª»ú¹ÜÀí³ÌÐò´Ó¶øÆô¶¯ÁíÒ»¸ö²Ù×÷ϵͳ¡£ +MBR ?§Ö????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? MBR ?§Ö??????????????????????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/f900f266-a323-42b2-bc43-218fdb8811a8.jpg) -°²×°¶àÖØÒýµ¼£¬×îºÃÏȰ²×° Windows ÔÙ°²×° Linux¡£ÒòΪ°²×° Windows ʱ»á¸²¸Çµô MBR£¬¶ø Linux ¿ÉÒÔÑ¡Ôñ½«¿ª»ú¹ÜÀí³ÌÐò°²×°ÔÚ MBR »òÕ߯äËü·ÖÇøµÄÆô¶¯ÉÈÇø£¬²¢ÇÒ¿ÉÒÔÉèÖÿª»ú¹ÜÀí³ÌÐòµÄÑ¡µ¥¡£ +???????????????????? Windows ???? Linux???????? Windows ?????? MBR???? Linux ???????????????????? MBR ??????????????????????????????????????????????????? ### 2. UEFI -UEFI Ïà±ÈÓÚ BIOS À´Ëµ¹¦ÄܸüÎªÈ«Ãæ£¬Ò²¸üΪ°²È«¡£ +UEFI ????? BIOS ???????????—¨????????? -## ¹ÒÔØ +## ???? -¹ÒÔØÀûÓÃĿ¼×÷Ϊ·ÖÇøµÄ½øÈëµã£¬Ò²¾ÍÊÇ˵£¬½øÈëĿ¼֮ºó¾Í¿ÉÒÔ¶ÁÈ¡·ÖÇøµÄÊý¾Ý¡£ +????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/249f3bb1-feee-4805-a259-a72699d638ca.jpg) -# ÎļþȨÏÞÓëĿ¼ÅäÖà +# ?????????????? -## ÎļþȨÏÞ¸ÅÄî +## ????????? -°ÑÓû§·ÖΪÈýÖÖ£ºÎļþÓµÓÐÕß¡¢Èº×éÒÔ¼°ÆäËüÈË£¬¶Ô²»Í¬µÄÓû§Óв»Í¬µÄÎļþȨÏÞ¡£ +?????????????????????????????????????????????§Ó??????????? -ʹÓà ls ²é¿´Ò»¸öÎļþʱ£¬»á³öÏÖÒ»¸öÎļþµÄÐÅÏ¢£¬ÀýÈç drwxr-xr-x. 3 root root 17 May 6 00:14 .config£¬¶ÔÕâ¸öÄÚÈݵĽâÊÍÈçÏ£º +??? ls ????????????????????????????????? drwxr-xr-x. 3 root root 17 May 6 00:14 .config???????????????????? -- drwxr-xr-x£ºÎļþÀàÐÍÒÔ¼°È¨ÏÞ£¬µÚ 1 λΪÎļþÀàÐÍ×ֶΣ¬ºó 9 λΪÎļþȨÏÞ×ֶΡ£ -- 3£ºÁ´½ÓÊý£» -- root£ºÎļþÓµÓÐÕߣ» -- root£ºËùÊôȺ×飻 -- 17£ºÎļþ´óС£» -- May 6 00:14£ºÎļþ×îºó±»Ð޸ĵÄʱ¼ä£» -- .config£ºÎļþÃû¡£ +- drwxr-xr-x?????????????????? 1 ¦Ë??????????¦²??? 9 ¦Ë?????????¦±? +- 3?????????? +- root??????????? +- root????????ï” +- 17???????§³?? +- May 6 00:14??????????????? +- .config????????? -³£¼ûµÄÎļþÀàÐͼ°Æäº¬ÒåÓУº +???????????????¾©???§µ? -- d£ºÄ¿Â¼£» -- -£ºÎļþ£» -- l£ºÁ´½ÓÎļþ£» +- d?????? +- -??????? +- l??????????? -9 λµÄÎļþȨÏÞ×Ö¶ÎÖУ¬Ã¿ 3 ¸öΪһ×飬¹² 3 ×飬ÿһ×é·Ö±ð´ú±í¶ÔÎļþÓµÓÐÕß¡¢ËùÊôȺ×éÒÔ¼°ÆäËüÈ˵ÄÎļþȨÏÞ¡£Ò»×éȨÏÞÖÐµÄ 3 λ·Ö±ðΪ r¡¢w¡¢x ȨÏÞ£¬±íʾ¿É¶Á¡¢¿Éд¡¢¿ÉÖ´ÐС£ +9 ¦Ë????????????§µ?? 3 ?????ï…?? 3 ?ï…??????????????????????????????????????????????????§Ö? 3 ¦Ë???? r??w??x ??????????????§Õ??????§³? -## ÎļþÊôÐÔÒÔ¼°È¨ÏÞµÄÐÞ¸Ä +## ????????????????? -### 1. ÐÞ¸ÄÎļþËùÊôȺ×é +### 1. ????????????? ```html # chgrp [-R] groupname dirname/filename --R£ºµÝ¹éÐÞ¸Ä +-R???????? ``` -### 2. ÐÞ¸ÄÎļþÓµÓÐÕß +### 2. ??????????? -²»½ö¿ÉÒÔÐÞ¸ÄÎļþÓµÓÐÕߣ¬Ò²¿ÉÒÔÐÞ¸ÄÎļþËùÊôȺ×é¡£ +?????????????????????????????????????î• ```html -# chown [-R] Óû§Ãû:Ⱥ×éÃû dirname/filename +# chown [-R] ?????:????? dirname/filename ``` -### 3. ÐÞ¸ÄȨÏÞ +### 3. ?????? -¿ÉÒÔ½«Ò»×éȨÏÞÓÃÊý×ÖÀ´±íʾ£¬´Ëʱһ×éȨÏÞµÄ 3 ¸öλµ±×ö¶þ½øÖÆÊý×ÖµÄ룬´Ó×óµ½ÓÒÿ¸öλµÄȨֵΪ 4¡¢2¡¢1£¬¼´Ã¿¸öȨÏÞ¶ÔÓ¦µÄÊý×ÖȨֵΪ r£º4¡¢w£º2¡¢x£º1¡£ +?????????????????????????????????? 3 ??¦Ë???????????????¦Ë???????????¦Ë????? 4??2??1????????????????????? r??4??w??2??x??1?? ```html # chmod [-R] xyz dirname/filename ``` -·¶Àý£º½« .bashrc ÎļþµÄȨÏÞÐÞ¸ÄΪ -rwxr-xr--¡£ +???????? .bashrc ???????????? -rwxr-xr--?? ```html # chmod 754 .bashrc ``` -Ò²¿ÉÒÔʹÓ÷ûºÅÀ´É趨ȨÏÞ¡£ +???????¡Â??????Ú…???? ```html # chmod [ugoa] [+-=] [rwx] dirname/filename -- u£ºÓµÓÐÕß -- g£ºËùÊôȺ×é -- o£ºÆäËûÈË -- a£ºËùÓÐÈË -- +£ºÌí¼ÓȨÏÞ -- -£ºÒƳýȨÏÞ -- =£ºÉ趨ȨÏÞ +- u??????? +- g????????? +- o???????? +- a???????? +- +???????? +- -???????? +- =???Ú…??? ``` -·¶Àý£ºÎª .bashrc ÎļþµÄËùÓÐÓû§Ìí¼ÓдȨÏÞ¡£ +??????? .bashrc ???????????????§Õ???? ```html # chmod a+w .bashrc ``` -## Ŀ¼µÄȨÏÞ +## ??????? -ÎļþÃû²»ÊÇ´æ´¢ÔÚÒ»¸öÎļþµÄÄÚÈÝÖУ¬¶øÊÇ´æ´¢ÔÚÒ»¸öÎļþËùÔÚµÄĿ¼ÖС£Òò´Ë£¬ÓµÓÐÎļþµÄ w ȨÏÞ²¢²»ÄܶÔÎļþÃû½øÐÐÐ޸ġ£ +?????????›¥???????????????§µ?????›¥????????????????§³????????????? w ?????????????????????? -Ŀ¼´æ´¢ÎļþÁÐ±í£¬Ò»¸öĿ¼µÄȨÏÞÒ²¾ÍÊÇ¶ÔÆäÎļþÁбíµÄȨÏÞ¡£Òò´Ë£¬Ä¿Â¼µÄ r ȨÏÞ±íʾ¿ÉÒÔ¶ÁÈ¡ÎļþÁÐ±í£»w ȨÏÞ±íʾ¿ÉÒÔÐÞ¸ÄÎļþÁÐ±í£¬¾ßÌåÀ´Ëµ£¬¾ÍÊÇÌí¼Óɾ³ýÎļþ£¬¶ÔÎļþÃû½øÐÐÐ޸ģ»x ȨÏÞ¿ÉÒÔÈøÃĿ¼³ÉΪ¹¤×÷Ŀ¼£¬x ȨÏÞÊÇ r ºÍ w ȨÏ޵Ļù´¡£¬Èç¹û²»ÄÜʹһ¸öĿ¼³ÉΪ¹¤×÷Ŀ¼£¬Ò²¾Íû°ì·¨¶ÁÈ¡ÎļþÁбíÒÔ¼°¶ÔÎļþÁÐ±í½øÐÐÐÞ¸ÄÁË¡£ +???›¥????§Ò???????????????????????§Ò?????????????? r ???????????????§Ò?w ????????????????§Ò????????????????????????????????????????x ??????????????????????x ????? r ?? w ??????????????????????????????????????????????§Ò??????????§Ò?????????? -## ÎļþĬÈÏȨÏÞ +## ????????? -ÎļþĬÈÏȨÏÞ£ºÎļþĬÈÏûÓпÉÖ´ÐÐȨÏÞ£¬Òò´ËΪ 666 £¬Ò²¾ÍÊÇ -rw-rw-rw- ¡£ -Ŀ¼ĬÈÏȨÏÞ£ºÄ¿Â¼±ØÐëÒªÄܹ»½øÈ룬Ҳ¾ÍÊDZØÐëÓµÓпÉÖ´ÐÐȨÏÞ£¬Òò´ËΪ 777 £¬Ò²¾ÍÊÇ drwxrwxrwx¡£ +??????????????????§á???????????? 666 ??????? -rw-rw-rw- ?? +?????????????????????????????????§á???????????? 777 ??????? drwxrwxrwx?? -¿ÉÒÔͨ¹ý umask ÉèÖûòÕ߲鿴ÎļþµÄĬÈÏȨÏÞ£¬Í¨³£ÒÔÑÚÂëµÄÐÎʽÀ´±íʾ£¬ÀýÈç 002 ±íʾÆäËüÓû§µÄȨÏÞÈ¥³ýÁËÒ»¸ö 2 µÄȨÏÞ£¬Ò²¾ÍÊÇдȨÏÞ£¬Òò´Ë½¨Á¢ÐÂÎļþʱĬÈϵÄȨÏÞΪ -rw-rw-r-- ¡£ +??????? umask ???????????????????????????????????????????? 002 ??????????????????????? 2 ???????????§Õ???????????????????????? -rw-rw-r-- ?? -## Ŀ¼ÅäÖà +## ?????? -ΪÁËʹ²»Í¬ Linux ·¢Ðа汾µÄĿ¼½á¹¹±£³ÖÒ»ÖÂÐÔ£¬Filesystem Hierarchy Standard (FHS) ¹æ¶¨ÁË Linux µÄĿ¼½á¹¹¡£×î»ù´¡µÄÈý¸öĿ¼ÈçÏ£º +??????? Linux ???§Ñ·Ú????????????????Filesystem Hierarchy Standard (FHS) ?ÕÇ?? Linux ?????????????????????????? -- / (root, ¸ùĿ¼) -- /usr (unix software resource)£ºËùÓÐϵͳĬÈÏÈí¼þ¶¼»á°²×°µ½Õâ¸öĿ¼£» -- /var (variable)£º´æ·Åϵͳ»ò³ÌÐòÔËÐйý³ÌÖеÄÊý¾ÝÎļþ¡£ +- / (root, ????) +- /usr (unix software resource)???????????????????????????? +- /var (variable)???????????????§Û????§Ö?????????? -ÍêÕûµÄĿ¼Ê÷ÈçÏ£º +??????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/27ace615-558f-4dfb-8ad4-7ac769c10118.jpg) -# ÎļþÓëĿ¼ +# ??????? -## Îļþʱ¼ä +## ?????? -1. modification time (mtime)£ºÎļþµÄÄÚÈݸüоͻá¸üУ» -2. status time (ctime)£ºÎļþµÄ״̬£¨È¨ÏÞ¡¢ÊôÐÔ£©¸üоͻá¸üУ» -3. access time (atime)£º¶ÁÈ¡Îļþʱ¾Í»á¸üС£ +1. modification time (mtime)???????????????????? +2. status time (ctime)?????????????????????????????? +3. access time (atime)???????????????? -## ÎļþÓëĿ¼µÄ»ù±¾²Ù×÷ +## ???????????????? ### 1. ls -ÁгöÎļþ»òÕßĿ¼µÄÐÅÏ¢£¬Ä¿Â¼µÄÐÅÏ¢¾ÍÊÇÆäÖаüº¬µÄÎļþ¡£ +?§Ô???????????????????????????????§Ñ?????????? ```html # ls [-aAdfFhilnrRSt] file|dir --a £ºÁгöÈ«²¿µÄÎļþ --d £º½öÁгöĿ¼±¾Éí --l £ºÒÔ³¤Êý¾Ý´®ÐÐÁгö£¬°üº¬ÎļþµÄÊôÐÔÓëȨÏ޵ȵÈÊý¾Ý +-a ???§Ô????????? +-d ?????§Ô??????? +-l ?????????????§Ô??????????????????????????? ``` ### 2. cp -¸´ÖƲÙ×÷¡£ +????????? -Èç¹ûÔ´ÎļþÓÐÁ½¸öÒÔÉÏ£¬ÔòÄ¿µÄÎļþÒ»¶¨ÒªÊÇĿ¼²ÅÐС£ +?????????????????????????????????????§³? ```html cp [-adfilprsu] source destination --a £ºÏ൱ÓÚ -dr --preserve=all µÄÒâ˼£¬ÖÁÓÚ dr Çë²Î¿¼ÏÂÁÐ˵Ã÷ --d £ºÈôÀ´Ô´ÎļþΪÁ´½ÓÎļþ£¬Ôò¸´ÖÆÁ´½ÓÎļþÊôÐÔ¶ø·ÇÎļþ±¾Éí --i £ºÈôÄ¿±êÎļþÒѾ­´æÔÚʱ£¬ÔÚ¸²¸Çǰ»áÏÈѯÎÊ --p £ºÁ¬Í¬ÎļþµÄÊôÐÔÒ»Æð¸´ÖƹýÈ¥ --r £ºµÝ¹é³ÖÐø¸´ÖÆ --u £ºdestination ±È source ¾É²Å¸üРdestination£¬»ò destination ²»´æÔÚµÄÇé¿öϲŸ´ÖÆ ---preserve=all £º³ýÁË -p µÄȨÏÞÏà¹Ø²ÎÊýÍ⣬»¹¼ÓÈë SELinux µÄÊôÐÔ, links, xattr µÈÒ²¸´ÖÆÁË +-a ?????? -dr --preserve=all ??????????? dr ??¦Ï???????? +-d ????????????????????????????????????????????? +-i ????????????????????????????????? +-p ????????????????????? +-r ???????????? +-u ??destination ?? source ?????? destination???? destination ???????????????? +--preserve=all ?????? -p ??????????????????? SELinux ??????, links, xattr ????????? ``` ### 3. rm -ÒÆ³ý²Ù×÷¡£ +????????? ```html -# rm [-fir] Îļþ»òĿ¼ --r £ºµÝ¹éɾ³ý +# rm [-fir] ??????? +-r ???????? ``` ### 4. mv -ÒÆ¶¯²Ù×÷¡£ +????????? ```html # mv [-fiu] source destination # mv [options] source1 source2 source3 .... directory --f £º force Ç¿ÖÆµÄÒâ˼£¬Èç¹ûÄ¿±êÎļþÒѾ­´æÔÚ£¬²»»áѯÎʶøÖ±½Ó¸²¸Ç +-f ?? force ???????????????????????????????????????? ``` -## »ñÈ¡ÎļþÄÚÈÝ +## ?????????? ### 1. cat -È¡µÃÎļþÄÚÈÝ¡£ +??????????? ```html # cat [-AbEnTv] filename --n £º´òÓ¡³öÐкţ¬ Á¬Í¬¿Õ°×ÐÐÒ²»áÓÐÐкţ¬Óë -b µÄÑ¡Ïͬ +-n ????????§Ü?? ??????????????§Ü???? -b ?????? ``` ### 2. tac -ÊÇ cat µÄ·´Ïò²Ù×÷£¬´Ó×îºóÒ»ÐпªÊ¼´òÓ¡¡£ +?? cat ?????????????????§á??????? ### 3. more -¿ÉÒÔÒ»Ò³Ò»Ò³²é¿´ÎļþÄÚÈÝ£¬ºÍÎı¾±à¼­Æ÷ÀàËÆ¡£ +???????????????????????????????? ### 4. less -ºÍ more ÀàËÆ¡£ +?? more ????? ### 5. head -¿ÉÒÔÈ¡µÃÎļþǰ¼¸ÐС£ +??????????????§³? ```html # head [-n number] filename --n £ººóÃæ½ÓÊý×Ö£¬´ú±íÏÔʾ¼¸ÐеÄÒâ˼ +-n ??????????????????????§Ö???? ``` ### 6. tail -ÊÇ head µÄ·´Ïò²Ù×÷£¬Ö»ÊÇÈ¡µÃÊǺó¼¸ÐС£ +?? head ????????????????????§³? ### 7. od -¿ÉÒÔÒÔ×Ö·û»òÕßÊ®Áù½øÖƵÄÐÎʽÏÔʾ¶þ½øÖÆÎļþ¡£ +?????????????????????????????????????? ### 8. touch -ÐÞ¸ÄÎļþʱ¼ä»òÕß½¨Á¢ÐÂÎļþ¡£ +?????????????????????? ```html # touch [-acdmt] filename --a £º ¸üРatime --c £º ¸üРctime£¬Èô¸ÃÎļþ²»´æÔÚÔò²»½¨Á¢ÐÂÎļþ --m £º ¸üРmtime --d £º ºóÃæ¿ÉÒÔ½ÓÓû¸üеÄÈÕÆÚ¶ø²»ÓÃĿǰµÄÈÕÆÚ£¬Ò²¿ÉÒÔʹÓà --date="ÈÕÆÚ»òʱ¼ä" --t £ººóÃæ¿ÉÒÔ½ÓÓû¸üеÄʱ¼ä¶ø²»ÓÃĿǰµÄʱ¼ä£¬¸ñʽΪ[YYYYMMDDhhmm] +-a ?? ???? atime +-c ?? ???? ctime????????????????????????? +-m ?? ???? mtime +-d ?? ????????????????????????????????????????? --date="????????" +-t ????????????????????????????????????[YYYYMMDDhhmm] ``` -## Ö¸ÁîÓëÎļþËÑË÷ +## ???????????? ### 1. which -Ö¸ÁîËÑË÷¡£ +????????? ```html # which [-a] command --a £º½«ËùÓÐÖ¸ÁîÁгö£¬¶ø²»ÊÇÖ»ÁеÚÒ»¸ö +-a ????????????§Ô???????????§Ö???? ``` ### 2. whereis -whereis ËÑË÷ÎļþµÄËٶȱȽϿ죬ÒòΪËüÖ»ËÑË÷¼¸¸öÌØ¶¨µÄĿ¼¡£ +whereis ?????????????????????????????????????? ```html # whereis [-bmsu] dirname/filename @@ -496,114 +496,114 @@ whereis ### 3. locate -locate ¿ÉÒÔÓùؼü×Ö»òÕßÕýÔò±í´ïʽ½øÐÐËÑË÷¡£ +locate ?????¨´???????????????????????? -locate ʹÓà /var/lib/mlocate/ Õâ¸öÊý¾Ý¿âÀ´½øÐÐËÑË÷£¬Ëü´æ´¢ÔÚÄÚ´æÖУ¬²¢ÇÒÿÌì¸üÐÂÒ»´Î£¬ËùÒÔÎÞ·¨Óà locate ËÑË÷н¨µÄÎļþ¡£¿ÉÒÔʹÓà updatedb À´Á¢¼´¸üÐÂÊý¾Ý¿â¡£ +locate ??? /var/lib/mlocate/ ???????????????????????›¥??????§µ?????????????¦²?????????? locate ????????????????????? updatedb ??????????????? ```html # locate [-ir] keyword --r£º½ÓÕýÔò±í´ïʽ +-r??????????? ``` ### 4. find -find ¿ÉÒÔʹÓÃÎļþµÄÊôÐÔºÍȨÏÞ½øÐÐËÑË÷¡£ +find ????????????????????????????? ```html # find filename [option] ``` -#### 4.1 Óëʱ¼äÓйصÄÑ¡Ïî +#### 4.1 ??????§Û????? ```html --mtime n £ºÁгöÔÚ n ÌìǰµÄÄÇÒ»ÌìÐ޸ĹýÄÚÈݵÄÎļþ --mtime +n £ºÁгöÔÚ n Ìì֮ǰ(²»º¬ n Ìì±¾Éí)Ð޸ĹýÄÚÈݵÄÎļþ --mtime -n £ºÁгöÔÚ n ÌìÖ®ÄÚ(º¬ n Ìì±¾Éí)Ð޸ĹýÄÚÈݵÄÎļþ --newer file £º Áгö±È file ¸üеÄÎļþ +-mtime n ???§Ô??? n ?????????????????????? +-mtime +n ???§Ô??? n ????(???? n ????)???????????? +-mtime -n ???§Ô??? n ?????(?? n ????)???????????? +-newer file ?? ?§Ô??? file ???????? ``` -+4¡¢4 ºÍ -4 µÄָʾµÄʱ¼ä·¶Î§ÈçÏ£º ++4??4 ?? -4 ?????????¦¶????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/658fc5e7-79c0-4247-9445-d69bf194c539.png) -#### 4.2 ÓëÎļþÓµÓÐÕߺÍËùÊôȺ×éÓйصÄÑ¡Ïî +#### 4.2 ???????????????????§Û????? ```html -uid n -gid n -user name -group name --nouser £ºËÑË÷ÓµÓÐÕß²»´æÔÚ /etc/passwd µÄÎļþ --nogroup£ºËÑË÷ËùÊôȺ×é²»´æÔÚÓÚ /etc/group µÄÎļþ +-nouser ???????????????? /etc/passwd ????? +-nogroup????????????öö?????? /etc/group ????? ``` -#### 4.3 ÓëÎļþȨÏÞºÍÃû³ÆÓйصÄÑ¡Ïî +#### 4.3 ??????????????§Û????? ```html -name filename --size [+-]SIZE£ºËÑѰ±È SIZE »¹Òª´ó(+)»òС(-)µÄÎļþ¡£Õâ¸ö SIZE µÄ¹æ¸ñÓУºc: ´ú±í byte£¬k: ´ú±í 1024bytes¡£ËùÒÔ£¬ÒªÕÒ±È 50KB»¹Òª´óµÄÎļþ£¬¾ÍÊÇ -size +50k +-size [+-]SIZE??????? SIZE ?????(+)??§³(-)?????????? SIZE ?????§µ?c: ???? byte??k: ???? 1024bytes??????????? 50KB??????????????? -size +50k -type TYPE --perm mode £ºËÑË÷ȨÏÞµÈÓÚ mode µÄÎļþ --perm -mode £ºËÑË÷ȨÏÞ°üº¬ mode µÄÎļþ --perm /mode £ºËÑË÷ȨÏÞ°üº¬ÈÎÒ» mode µÄÎļþ +-perm mode ???????????? mode ????? +-perm -mode ???????????? mode ????? +-perm /mode ??????????????? mode ????? ``` -# ´ÅÅÌÓëÎļþϵͳ +# ??????????? -## ÎļþϵͳµÄ×é³É +## ?????????? -¶Ô·ÖÇø½øÐиñʽ»¯ÊÇΪÁËÔÚ·ÖÇøÉϽ¨Á¢Îļþϵͳ¡£Ò»¸ö·ÖÇøÍ¨³£Ö»Äܸñʽ»¯ÎªÒ»¸öÎļþϵͳ£¬µ«ÊÇ´ÅÅÌÕóÁеȼ¼Êõ¿ÉÒÔ½«Ò»¸ö·ÖÇø¸ñʽ»¯Îª¶à¸öÎļþϵͳ£¬Òò´ËÖ»ÓÐÎļþϵͳÄܱ»¹ÒÔØ£¬¶ø·ÖÇø²»Äܱ»¹ÒÔØ¡£ +????????§Ú????????????????????????????????????????????????????????????????§Ö??????????????????????????????????????????????????????????????????? -ÎļþϵͳÓÐÒÔÏÂÈý¸ö½á¹¹£º +??????????????????? -1. superblock£º¼Ç¼ÎļþϵͳµÄÕûÌåÐÅÏ¢£¬°üÀ¨ inode ºÍ block µÄ×ÜÁ¿¡¢Ê¹ÓÃÁ¿¡¢Ê£ÓàÁ¿£¬ÒÔ¼°ÎļþϵͳµÄ¸ñʽÓëÏà¹ØÐÅÏ¢µÈ£» -2. inode£ºÒ»¸öÎļþÕ¼ÓÃÒ»¸ö inode£¬¼Ç¼ÎļþµÄÊôÐÔ£¬Í¬Ê±¼Ç¼´ËÎļþµÄÊý¾ÝËùÔÚµÄ block ºÅÂ룻 -3. block£º¼Ç¼ÎļþµÄÄÚÈÝ£¬ÈôÎļþÌ«´óʱ£¬»áÕ¼Óöà¸ö block¡£ +1. superblock????????????????????????? inode ?? block ????????????????????????????????????????????? +2. inode?????????????? inode???????????????????????????????????? block ???? +3. block????????????????????????????????? block?? -µ±Òª¶Áȡһ¸öÎļþµÄÄÚÈÝʱ£¬ÏÈÔÚ inode ÖÐÈ¥²éÕÒÎļþÄÚÈÝËùÔÚµÄËùÓÐ block£¬È»ºó°ÑËùÓÐ block µÄÄÚÈݶÁ³öÀ´¡£ +????????????????????????? inode ??????????????????????? block?????????? block ????????????? -´ÅÅÌË鯬ÊÇÖ¸Ò»¸öÎļþÄÚÈÝËùÔÚµÄ block ¹ýÓÚ·ÖÉ¢¡£ +????????????????????????? block ???????? -Ext2 ÎļþϵͳʹÓÃÁËÉÏÊöµÄÎļþ½á¹¹£¬²¢ÔÚ´ËÖ®ÉϼÓÈëÁË block Ⱥ×éµÄ¸ÅÄҲ¾ÍÊǽ«Ò»¸öÎļþϵͳ»®·ÖΪ¶à¸ö block Ⱥ×飬·½±ã¹ÜÀí¡£ +Ext2 ???????????????????????????????????? block ????????????????????????????? block ??ï…??????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1974a836-aa6b-4fb8-bce1-6eb11969284a.jpg) ## inode -Ext2 Îļþϵͳ֧³ÖµÄ block ´óСÓÐ 1k¡¢2k ºÍ 4k ÈýÖÖ£¬²»Í¬µÄ block ´óСÏÞÖÆÁ˵¥Ò»ÎļþµÄ´óС¡£¶øÃ¿¸ö inode ´óСÊǹ̶¨Îª 128 bytes¡£ +Ext2 ????????? block ??§³?? 1k??2k ?? 4k ?????????? block ??§³??????????????§³??????? inode ??§³????? 128 bytes?? -inode ÖмǼÁËÎļþÄÚÈÝËùÔÚµÄ block£¬µ«ÊÇÿ¸ö block ·Ç³£Ð¡£¬Ò»¸ö´óÎļþËæ±ã¶¼ÐèÒª¼¸Ê®ÍòµÄ block£¬¶øÒ»¸ö inode ´óСÓÐÏÞ£¬ÎÞ·¨Ö±½ÓÒýÓÃÕâô¶à block¡£Òò´ËÒýÈëÁ˼ä½Ó¡¢Ë«¼ä½Ó¡¢Èý¼ä½ÓÒýÓã¬Ê¹ÓÃÓà block À´À©³ä´óС£¬Ò²¾ÍÊÇÈà block À´¼Ç¼Îļþ°üº¬µÄ block¡£ +inode ?§Þ???????????????? block????????? block ???§³?????????????????????? block??????? inode ??§³???????????????????? block?????????????????????????????????? block ???????§³????????? block ?????????????? block?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/89091427-7b2b-4923-aff6-44681319a8aa.jpg) -inode ¾ßÌå°üº¬ÒÔÏÂÐÅÏ¢£º +inode ???????????????? -- ¸ÃÎļþµÄ´æÈ¡Ä£Ê½(read/write/excute)£» -- ¸ÃÎļþµÄÓµÓÐÕßÓëȺ×é(owner/group)£» -- ¸ÃÎļþµÄÈÝÁ¿£» -- ¸ÃÎļþ½¨Á¢»ò״̬¸Ä±äµÄʱ¼ä(ctime)£» -- ×î½üÒ»´ÎµÄ¶Áȡʱ¼ä(atime)£» -- ×î½üÐ޸ĵÄʱ¼ä(mtime)£» -- ¶¨ÒåÎļþÌØÐÔµÄÆì±ê(flag)£¬Èç SetUID...£» -- ¸ÃÎļþÕæÕýÄÚÈݵÄÖ¸Ïò (pointer)¡£ +- ???????????(read/write/excute)?? +- ?????????????????(owner/group)?? +- ????????????? +- ????????????????????(ctime)?? +- ?????¦Å??????(atime)?? +- ??????????(mtime)?? +- ???????????????(flag)???? SetUID...?? +- ????????????????? (pointer)?? -## Ŀ¼µÄ inode Óë block +## ???? inode ?? block -½¨Á¢Ò»¸öĿ¼ʱ£¬»á·ÖÅäÒ»¸ö inode ÓëÖÁÉÙÒ»¸ö block¡£block ¼Ç¼µÄÄÚÈÝÊÇĿ¼ÏÂËùÓÐÎļþµÄ inode ±àºÅÒÔ¼°ÎļþÃû£¬¿ÉÒÔ¿´³öÎļþµÄ inode ±¾Éí²»¼Ç¼ÎļþÃû£¬ÎļþÃû¼Ç¼ÔÚĿ¼ÖУ¬Òò´ËÐÂÔöÎļþ¡¢É¾³ýÎļþ¡¢¸ü¸ÄÎļþÃûÕâЩ²Ù×÷ÓëĿ¼µÄ w ȨÏÞÓйء£ +???????????????????? inode ????????? block??block ???????????????????????? inode ????????????????????????? inode ???????????????????????????§µ????????????????????????????????§»?????????? w ????§Û?? -## ʵÌåÁ´½ÓÓë·ûºÅÁ´½Ó +## ???????????????? ```html # ln [-sf] source_filename dist_filename --s £ºÄ¬ÈÏÊÇ hard link£¬¼Ó -s Ϊ symbolic link --f £ºÈç¹ûÄ¿±ê5Îļþ´æÔÚʱ£¬ÏÈɾ³ýÄ¿±êÎļþ +-s ??????? hard link???? -s ? symbolic link +-f ????????5????????????????????? ``` -### 1. ʵÌåÁ´½Ó +### 1. ??????? -hard link Ö»ÊÇÔÚij¸öĿ¼ÏÂÐÂÔöÒ»¸öÌõÄ¿£¬Ê¹µÃÐÂÔöµÄÌõÄ¿Á´½Óµ½ÎļþµÄ inode ÉÏ¡£É¾³ýÈÎÒâÒ»¸öÌõÄ¿£¬Îļþ»¹ÊÇ´æÔÚ£¬Ö»ÒªÒýÓÃÊýÁ¿²»Îª 0¡£ +hard link ?????????????????????????????????????????????? inode ?????????????????????????????????????????? 0?? -ÓÐÒÔÏÂÏÞÖÆ£º²»ÄÜ¿çÔ½ Filesystem£»²»ÄܶÔĿ¼½øÐÐÁ´½Ó¡£ +????????????????? Filesystem?????????????????? ```html # ln /etc/crontab . @@ -612,11 +612,11 @@ hard link Ö» 34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab ``` -### 2. ·ûºÅÁ´½Ó +### 2. ???????? -symbolic link ¿ÉÒÔÀí½âΪ Windows µÄ¿ì½Ý·½Ê½£¬Í¨¹ý½¨Á¢Ò»¸ö¶ÀÁ¢µÄÎļþ£¬Õâ¸öÎļþµÄÊý¾ÝµÄ¶ÁȡָÏòÁ´½ÓµÄÄǸöÎļþ¡£µ±Ô´Îļþ±»É¾³ýÁË£¬Á´½ÓÎļþ¾Í´ò²»¿ªÁË¡£ +symbolic link ???????? Windows ???????????????????????????????????????????????????????????????????????????????????????? -symbolic link ¿ÉÒÔΪĿ¼½¨Á¢Á´½Ó¡£ +symbolic link ???????????????? ```html # ll -i /etc/crontab /root/crontab2 @@ -624,118 +624,118 @@ symbolic link 53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 -> /etc/crontab ``` -# ѹËõÓë´ò°ü +# ??????? -## ѹËõ +## ??? -Linux µ×ÏÂÓкܶàѹËõÎļþµÄÀ©Õ¹Ãû£¬³£¼ûµÄÈçÏ£º +Linux ?????§Ü???????????????????????????? -| À©Õ¹Ãû | ѹËõ³ÌÐò | +| ????? | ??????? | | -- | -- | | \*.Z | compress | |\*.zip | zip | |\*.gz | gzip| |\*.bz2 | bzip2 | |\*.xz | xz | -|\*.tar | tar ³ÌÐò´ò°üµÄÊý¾Ý£¬Ã»Óо­¹ýѹËõ | -|\*.tar.gz | tar ³ÌÐò´ò°üµÄÎļþ£¬¾­¹ý gzip µÄѹËõ | -|\*.tar.bz2 | tar ³ÌÐò´ò°üµÄÎļþ£¬¾­¹ý bzip2 µÄѹËõ | -|\*.tar.xz | tar ³ÌÐò´ò°üµÄÎļþ£¬¾­¹ý xz µÄѹËõ | +|\*.tar | tar ???????????????§à?????? | +|\*.tar.gz | tar ????????????????? gzip ????? | +|\*.tar.bz2 | tar ????????????????? bzip2 ????? | +|\*.tar.xz | tar ????????????????? xz ????? | ### 1. gzip -gzip ÊÇ Linux ʹÓÃ×î¹ãµÄѹËõÖ¸Á¿ÉÒԽ⿪ compress¡¢zip Óë gzip ËùѹËõµÄÎļþ¡£ +gzip ?? Linux ?????????????????? compress??zip ?? gzip ???????????? -¾­¹ý gzip ѹËõ¹ý£¬Ô´Îļþ¾Í²»´æÔÚÁË¡£ +???? gzip ????????????????????? -ÓÐ 9 ¸ö²»Í¬µÄѹËõµÈ¼¶¿ÉÒÔʹÓᣠ+?? 9 ???????????????????¨¢? -¿ÉÒÔʹÓà zcat¡¢zmore¡¢zless À´¶ÁȡѹËõÎļþµÄÄÚÈÝ¡£ +??????? zcat??zmore??zless ?????????????????? ```html $ gzip [-cdtv#] filename --c £º½«Ñ¹ËõµÄÊý¾ÝÊä³öµ½ÆÁÄ»ÉÏ --d £º½âѹËõ --t £º¼ìÑéѹËõÎļþÊÇ·ñ³ö´í --v £ºÏÔʾѹËõ±ÈµÈÐÅÏ¢ --# £º # ΪÊý×ÖµÄÒâ˼£¬´ú±íѹËõµÈ¼¶£¬Êý×ÖÔ½´óѹËõ±ÈÔ½¸ß£¬Ä¬ÈÏΪ6 +-c ??????????????????????? +-d ??????? +-t ?????????????????? +-v ?????????????? +-# ?? # ???????????????????????????????????????????6 ``` ### 2. bzip2 -Ìṩ±È gzip ¸ü¸ßµÄѹËõ±È¡£ +???? gzip ??????????? -²é¿´ÃüÁbzcat¡¢bzmore¡¢bzless¡¢bzgrep¡£ +??????bzcat??bzmore??bzless??bzgrep?? ```html $ bzip2 [-cdkzv#] filename --k £º±£ÁôÔ´Îļþ +-k ?????????? ``` ### 3. xz -Ìṩ±È bzip2 ¸ü¼ÑµÄѹËõ±È¡£ +???? bzip2 ??????????? -¿ÉÒÔ¿´µ½£¬gzip¡¢bzip2¡¢xz µÄѹËõ±È²»¶ÏÓÅ»¯£¬²»¹ýҪעÒ⣬ѹËõ±ÈÔ½¸ß£¬Ñ¹ËõµÄʱ¼äÒ²Ô½³¤¡£ +?????????gzip??bzip2??xz ?????????????????????????????????????????????? -²é¿´ÃüÁxzcat¡¢xzmore¡¢xzless¡¢xzgrep¡£ +??????xzcat??xzmore??xzless??xzgrep?? ```html $ xz [-dtlkc#] filename ``` -## ´ò°ü +## ??? -ѹËõÖ¸ÁîÖ»ÄܶÔÒ»¸öÎļþ½øÐÐѹËõ£¬¶ø´ò°üÄܹ»½«¶à¸öÎļþ´ò°ü³ÉÒ»¸ö´óÎļþ¡£tar ²»½ö¿ÉÒÔÓÃÓÚ´ò°ü£¬Ò²¿ÉÒÔʹÓà gip¡¢bzip2¡¢xz ½«´ò°üÎļþ½øÐÐѹËõ¡£ +????????????????????????????????????????????????????????tar ???????????????????????? gip??bzip2??xz ????????????????? ```html -$ tar [-z|-j|-J] [cv] [-f н¨µÄtarÎļþ] filename... ==´ò°üѹËõ -$ tar [-z|-j|-J] [tv] [-f ÒÑÓеÄtarÎļþ] ==²é¿´ -$ tar [-z|-j|-J] [xv] [-f ÒÑÓеÄtarÎļþ] [-C Ŀ¼] ==½âѹËõ --z £ºÊ¹ÓÃzip£» --j £ºÊ¹ÓÃbzip2£» --J £ºÊ¹ÓÃxz£» --c £ºÐ½¨´ò°üÎļþ£» --t £º²é¿´´ò°üÎļþÀïÃæÓÐÄÄЩÎļþ£» --x £º½â´ò°ü»ò½âѹËõµÄ¹¦ÄÜ£» --v £ºÔÚѹËõ/½âѹËõµÄ¹ý³ÌÖУ¬ÏÔʾÕýÔÚ´¦ÀíµÄÎļþÃû£» --f : filename£ºÒª´¦ÀíµÄÎļþ£» --C Ŀ¼ £º ÔÚÌØ¶¨Ä¿Â¼½âѹËõ¡£ +$ tar [-z|-j|-J] [cv] [-f ?????tar???] filename... ==?????? +$ tar [-z|-j|-J] [tv] [-f ???§Ö?tar???] ==?? +$ tar [-z|-j|-J] [xv] [-f ???§Ö?tar???] [-C ??] ==????? +-z ?????zip?? +-j ?????bzip2?? +-J ?????xz?? +-c ????????????? +-t ??????????????????§»????? +-x ?????????????????? +-v ???????/???????????§µ??????????????????? +-f : filename????????????? +-C ?? ?? ?????????????? ``` -×î³£Óõķ½Ê½ÈçÏ£º +???????????? -´ò°üѹËõ £º tar -jcv -f filename.tar.bz2 Òª±»Ñ¹ËõµÄÎļþ»òĿ¼Ãû³Æ -²é ¿´       £º tar -jtv -f filename.tar.bz2 -½âѹËõ     £ºtar -jxv -f filename.tar.bz2 -C Òª½âѹËõµÄĿ¼ +?????? ?? tar -jcv -f filename.tar.bz2 ??????????????????? +?? ??       ?? tar -jtv -f filename.tar.bz2 +?????     ??tar -jxv -f filename.tar.bz2 -C ?????????? # BASH -¿ÉÒÔͨ¹ý shell ÇëÇóÄÚºËÌṩ·þÎñ£¬Bash ÕýÊÇ shell µÄÒ»ÖÖ¡£ +??????? shell ?????????????Bash ???? shell ?????? -## BashÌØÐÔ +## Bash???? -**1. ÃüÁîÀúÊ·** +**1. ???????** -¼Ç¼ʹÓùýµÄÃüÁî¡£±¾´ÎµÇ¼ËùÖ´ÐеÄÃüÁî¶¼»áÔÝʱ´æ·Åµ½ÄÚ´æÖУ¬ \~/.bash_history ÎļþÖмǼµÄÊÇǰһ´ÎµÇ¼ËùÖ´ÐйýµÄÃüÁî¡£ +?????¨´??????þŸ???¦Å??????§Ö??????????????????§µ? \~/.bash_history ????§Þ?????????¦Å??????§Û??????þŸ -**2. ÃüÁîÓëÎļþ²¹È«** +**2. ????????????** -¿ì½Ý¼ü£ºtab +??????tab -**3. ÃüÃû±ðÃû** +**3. ????????** -ÀýÈç lm ÊÇ ls -al µÄ±ðÃû¡£ +???? lm ?? ls -al ??????? **4. shell scripts** -**5. ͨÅä·û** +**5. ????** -ÀýÈç ls -l /usr/bin/X\* Áгö /usr/bin ÏÂÃæËùÓÐÒÔ X ¿ªÍ·µÄÎļþ¡£ +???? ls -l /usr/bin/X\* ?§Ô? /usr/bin ?????????? X ?????????? -## ±äÁ¿²Ù×÷ +## ???????? -¶ÔÒ»¸ö±äÁ¿¸³ÖµÖ±½ÓʹÓà = £¬¶Ô±äÁ¿È¡ÓÃÐèÒªÔÚ±äÁ¿Ç°¼ÓÉÏ \$ £¬Ò²¿ÉÒÔÓà \${} µÄÐÎʽ£¬Êä³ö±äÁ¿Ê¹Óà echo ÃüÁî¡£ +?????????????????? = ??????????????????????? \$ ????????? \${} ????????????????? echo ???þŸ ```bash $ var=abc @@ -743,24 +743,24 @@ $ echo $var $ echo ${var} ``` -±äÁ¿ÄÚÈÝÈç¹ûÓпոñ£¬ÐèҪʹÓÃË«ÒýºÅ»òÕßµ¥ÒýºÅ¡£Ë«ÒýºÅÄÚµÄÌØÊâ×Ö·û¿ÉÒÔ±£ÁôÔ­±¾ÌØÐÔ£¬ÀýÈçvar="lang is \$LANG"£¬ÔòvarµÄֵΪ lang is zh_TW.UTF-8£»¶øµ¥ÒýºÅÄÚµÄÌØÊâ×Ö·û¾ÍÊÇÌØÊâ×Ö·û±¾Éí£¬ÀýÈç var='lang is \$LANG'£¬Ôò var µÄֵΪ lang is \$LANG¡£ +????????????§á????????????????????????????????????????????????????????var="lang is \$LANG"????var???? lang is zh_TW.UTF-8??????????????????????????????????????? var='lang is \$LANG'???? var ???? lang is \$LANG?? -¿ÉÒÔʹÓà \`Ö¸Áî\` »òÕß \$(Ö¸Áî) µÄ·½Ê½½«Ö¸ÁîµÄÖ´Ðнá¹û¸³Öµ¸ø±äÁ¿¡£ÀýÈç version=\$(uname -r)£¬Ôò version µÄֵΪ 3.10.0-229.el7.x86_64¡£ +??????? \`???\` ???? \$(???) ????????????§ß????????????????? version=\$(uname -r)???? version ???? 3.10.0-229.el7.x86_64?? -¿ÉÒÔʹÓà export ÃüÁ×Ô¶¨Òå±äÁ¿×ª³É»·¾³±äÁ¿£¬»·¾³±äÁ¿¿ÉÒÔÔÚ×Ó³ÌÐòÖÐʹÓã¬Ëùν×Ó³ÌÐò¾ÍÊÇÓɵ±Ç° Bash ¶ø²úÉúµÄ×Ó Bash¡£ +??????? export ???????????????????????????????????????????????????¦Í???????????? Bash ?????????? Bash?? -Bash µÄ±äÁ¿¿ÉÒÔÉùÃ÷ΪÊý×éºÍÕûÊýÊý×Ö¡£×¢ÒâÊý×ÖÀàÐÍûÓи¡µãÊý¡£Èç¹û²»½øÐÐÉùÃ÷£¬Ä¬ÈÏÊÇ×Ö·û´®ÀàÐÍ¡£±äÁ¿µÄÉùÃ÷ʹÓà declare ÃüÁ +Bash ?????????????????????????????????????????§Ú?????????????????????????????????????????????????? declare ???? ```html $ declare [-aixr] variable --a £º ¶¨ÒåΪÊý×éÀàÐÍ --i £º ¶¨ÒåΪÕûÊýÀàÐÍ --x £º ¶¨ÒåΪ»·¾³±äÁ¿ --r £º ¶¨ÒåΪreadonlyÀàÐÍ +-a ?? ????????????? +-i ?? ????????????? +-x ?? ????????????? +-r ?? ?????readonly???? ``` -ʹÓà [ ] À´¶ÔÊý×é½øÐвÙ×÷£º +??? [ ] ??????????§Ó????? ```bash $ array[1]=a @@ -768,53 +768,53 @@ $ array[2]=b $ echo ${array[1]} ``` -## Ö¸ÁîËÑË÷˳Ðò +## ?????????? -1. ÒÔ¾ø¶Ô»òÏà¶Ô·¾¶À´Ö´ÐÐÖ¸ÁÀýÈç /bin/ls »òÕß ./ls £» -2. ÓɱðÃûÕÒµ½¸ÃÖ¸ÁîÀ´Ö´ÐУ» -3. ÓÉ Bash ÄÚ½¨µÄÖ¸ÁîÀ´Ö´ÐУ» -4. °´ \$PATH ±äÁ¿Ö¸¶¨µÄËÑË÷·¾¶µÄ˳ÐòÕÒµ½µÚÒ»¸öÖ¸ÁîÀ´Ö´ÐС£ +1. ?????????¡¤?????????????? /bin/ls ???? ./ls ?? +2. ?????????????????§µ? +3. ?? Bash ????????????§µ? +4. ?? \$PATH ?????????????¡¤??????????????????????§³? -## Êý¾ÝÁ÷ÖØ¶¨Ïò +## ??????????? -ÖØ¶¨Ïò¾ÍÊÇʹÓÃÎļþ´úÌæ±ê×¼ÊäÈë¡¢±ê×¼Êä³öºÍ±ê×¼´íÎóÊä³ö¡£ +??????????????????????????????????????????? -1. ±ê×¼ÊäÈë (stdin)      £º´úÂëΪ 0 £¬Ê¹Óà < »ò << £» -2. ±ê×¼Êä³ö (stdout)    £º´úÂëΪ 1 £¬Ê¹Óà > »ò >> £» -3. ±ê×¼´íÎóÊä³ö(stderr)£º´úÂëΪ 2 £¬Ê¹Óà 2> »ò 2>> £» +1. ??????? (stdin)      ??????? 0 ????? < ?? << ?? +2. ?????? (stdout)    ??????? 1 ????? > ?? >> ?? +3. ??????????(stderr)??????? 2 ????? 2> ?? 2>> ?? -ÆäÖУ¬ÓÐÒ»¸ö¼ýÍ·µÄ±íʾÒÔ¸²¸ÇµÄ·½Ê½Öض¨Ïò£¬¶øÓÐÁ½¸ö¼ýÍ·µÄ±íʾÒÔ×·¼ÓµÄ·½Ê½Öض¨Ïò¡£ +???§µ????????????????????????????????????????????????????? -¿ÉÒÔ½«²»ÐèÒªµÄ±ê×¼Êä³öÒÔ¼°±ê×¼´íÎóÊä³öÖØ¶¨Ïòµ½ /dev/null £¬Ï൱ÓÚÈÓ½øÀ¬»øÏä¡£ +??????????????????????????????????? /dev/null ??????????????? -Èç¹ûÐèÒª½«±ê×¼Êä³öÒÔ¼°±ê×¼´íÎóÊä³öÍ¬Ê±ÖØ¶¨Ïòµ½Ò»¸öÎļþ£¬ÐèÒª½«Ä³¸öÊä³öת»»ÎªÁíÒ»¸öÊä³ö£¬ÀýÈç 2>&1 ±íʾ½«±ê×¼´íÎóÊä³öת»»Îª±ê×¼Êä³ö¡£ +??????????????????????????????????????????????????????????????????????? 2>&1 ??????????????????????????? ```bash $ find /home -name .bashrc > list 2>&1 ``` -## ¹ÜÏßÖ¸Áî +## ??????? -¹ÜÏßÊǽ«Ò»¸öÃüÁîµÄ±ê×¼Êä³ö×÷ΪÁíÒ»¸öÃüÁîµÄ±ê×¼ÊäÈ룬ÔÚÊý¾ÝÐèÒª¾­¹ý¶à¸ö²½ÖèµÄ´¦ÀíÖ®ºó²ÅÄܵõ½ÎÒÃÇÏëÒªµÄ¸ñʽʱ¾Í¿ÉÒÔʹÓùÜÏß¡£ÔÚÃüÁîÖ®¼äʹÓà | ·Ö¸ô¸÷¸ö¹ÜÏßÃüÁî¡£ +??????????????????????????????????????????????????????????????????????????????????????????¨´???????????????? | ??????????????þŸ ```bash $ ls -al /etc | less ``` -### 1. ÌáȡָÁcut +### 1. ??????cut -ÌáÈ¡¹ý³ÌÒ»ÐÐÒ»ÐеؽøÐС£ +????????????§Ö???§³? -cut ¶ÔÊý¾Ý½øÐÐÇз֣¬È¡³öÏëÒªµÄ²¿·Ö¡£ +cut ??????????§Ù?????????????? ```html $ cut --d £º·Ö¸ô·û --f £º¾­¹ý -d ·Ö¸ôºó£¬Ê¹Óà -f n È¡³öµÚ n ¸öÇø¼ä --c £ºÒÔ×Ö·ûΪµ¥Î»È¡³öÇø¼ä +-d ??????? +-f ?????? -d ???????? -f n ????? n ?????? +-c ??????????¦Ë??????? ``` -·¶Àý1£ºlast ½«ÏÔʾµÄµÇÈëÕßµÄÐÅÏ¢£¬ÒªÇó½öÏÔʾÓû§Ãû¡£ +????1??last ???????????????????????????????? ```html $ last @@ -825,7 +825,7 @@ root pts/1 192.168.201.254 Thu Feb 5 22:37 - 23:53 (01:16) $ last | cut -d ' ' -f 1 ``` -·¶Àý2£º½« export Êä³öµÄѶϢ£¬È¡µÃµÚ 12 ×Ö·ûÒÔºóµÄËùÓÐ×Ö·û´®¡£ +????2???? export ????????????? 12 ?????????????????? ```html $ export @@ -833,28 +833,28 @@ declare -x HISTCONTROL="ignoredups" declare -x HISTSIZE="1000" declare -x HOME="/home/dmtsai" declare -x HOSTNAME="study.centos.vbird" -.....(ÆäËûÊ¡ÂÔ)..... +.....(???????)..... $ export | cut -c 12 ``` -### 2. ÅÅÐòÃüÁsort¡¢uniq +### 2. ????????sort??uniq -**sort** ½øÐÐÅÅÐò¡£ +**sort** ???????? ```html $ sort [-fbMnrtuk] [file or stdin] --f £ººöÂÔ´óСд --b £ººöÂÔ×îÇ°ÃæµÄ¿Õ¸ñ --M £ºÒÔÔ·ݵÄÃû×ÖÀ´ÅÅÐò£¬ÀýÈç JAN, DEC --n £ºÊ¹ÓÃÊý×Ö --r £º·´ÏòÅÅÐò --u £ºÏ൱ÓÚ unique £¬Öظ´ÄÚÈÝÖ»³öÏÖÒ»´Î --t £º·Ö¸ô·û£¬Ä¬ÈÏΪtab --k £ºÖ¸¶¨ÅÅÐòµÄÇø¼ä +-f ???????§³§Õ +-b ?????????????? +-M ?????¡¤???????????????? JAN, DEC +-n ????????? +-r ?????????? +-u ?????? unique ????????????????? +-t ?????????????tab +-k ?????????????? ``` -·¶Àý£º/etc/passwd ÄÚÈÝÊÇÒÔ : À´·Ö¸ôµÄ£¬ÒÔµÚÈýÀ¸À´ÅÅÐò¡£ +??????/etc/passwd ???????? : ????????????????????? ```html $ cat /etc/passwd | sort -t ':' -k 3 @@ -864,15 +864,15 @@ alex:x:1001:1002::/home/alex:/bin/bash arod:x:1002:1003::/home/arod:/bin/bash ``` -**uniq** ¿ÉÒÔ½«Öظ´µÄÊý¾Ýֻȡһ¸ö¡£ +**uniq** ????????????????????? ```html $ uniq [-ic] --i £ººöÂÔ´óСд --c £º½øÐмÆÊý +-i ???????§³§Õ +-c ?????§Þ??? ``` -·¶Àý£ºÈ¡µÃÿ¸öÈ˵ĵǼ×Ü´ÎÊý +?????????????????????? ```html $ last | cut -d ' ' -f 1 | sort | uniq -c @@ -884,88 +884,88 @@ $ last | cut -d ' ' -f 1 | sort | uniq -c 1 wtmp ``` -### 3. Ë«ÏòÊä³öÖØ¶¨Ïò£ºtee +### 3. ???????????tee -Êä³öÖØ¶¨Ïò»á½«Êä³öÄÚÈÝÖØ¶¨Ïòµ½ÎļþÖУ¬¶ø **tee** ²»½öÄܹ»Íê³ÉÕâ¸ö¹¦ÄÜ£¬»¹Äܱ£ÁôÆÁÄ»ÉϵÄÊä³ö¡£Ò²¾ÍÊÇ˵£¬Ê¹Óà tee Ö¸Áһ¸öÊä³ö»áͬʱ´«Ë͵½ÎļþºÍÆÁÄ»ÉÏ¡£ +?????????????????????????§µ??? **tee** ??????????????????????????????????????????????? tee ????????????????????????????? ```html $ tee [-a] file ``` -### 4. ×Ö·ûת»»Ö¸Átr¡¢col¡¢expand¡¢join¡¢paste +### 4. ?????????tr??col??expand??join??paste - **tr** ÓÃÀ´É¾³ýÒ»ÐÐÖеÄ×Ö·û£¬»òÕß¶Ô×Ö·û½øÐÐÌæ»»¡£ + **tr** ???????????§Ö???????????????????�I?? ```html $ tr [-ds] SET1 ... --d £º ɾ³ýÐÐÖÐ SET1 Õâ¸ö×Ö·û´® +-d ?? ??????? SET1 ???????? ``` -·¶Àý£¬½« last Êä³öµÄÐÅÏ¢ËùÓÐСдת»»Îª´óд¡£ +???????? last ????????????§³§Õ??????§Õ?? ```html $ last | tr '[a-z]' '[A-Z]' ``` - **col** ½« tab ×Ö·ûתΪ¿Õ¸ñ×Ö·û¡£ + **col** ?? tab ????????????? ```html $ col [-xb] --x £º ½« tab ¼üת»»³É¶ÔµÈµÄ¿Õ¸ñ¼ü +-x ?? ?? tab ????????????? ``` -**expand** ½« tab ת»»Ò»¶¨ÊýÁ¿µÄ¿Õ¸ñ£¬Ä¬ÈÏÊÇ 8 ¸ö¡£ +**expand** ?? tab ??????????????????? 8 ???? ```html $ expand [-t] file --t £ºtab תΪ¿Õ¸ñµÄÊýÁ¿ +-t ??tab ?????????? ``` -**join** ½«ÓÐÏàͬÊý¾ÝµÄÄÇÒ»Ðкϲ¢ÔÚÒ»Æð¡£ +**join** ????????????????§Ü??????? ```html $ join [-ti12] file1 file2 --t £º·Ö¸ô·û£¬Ä¬ÈÏΪ¿Õ¸ñ --i £ººöÂÔ´óСдµÄ²îÒì --1 £ºµÚÒ»¸öÎļþËùÓõıȽÏ×Ö¶Î --2 £ºµÚ¶þ¸öÎļþËùÓõıȽÏ×Ö¶Î +-t ???????????????? +-i ???????§³§Õ????? +-1 ???????????????????? +-2 ???????????????????? ``` -**paste** Ö±½Ó½«Á½ÐÐÕ³ÌùÔÚÒ»Æð¡£ +**paste** ???????????????? ```html $ paste [-d] file1 file2 --d £º·Ö¸ô·û£¬Ä¬ÈÏΪ tab +-d ????????????? tab ``` -### 5. ·ÖÇøÖ¸Ásplit +### 5. ???????split -**split** ½«Ò»¸öÎļþ»®·Ö³É¶à¸öÎļþ¡£ +**split** ???????????????????? ```html $ split [-bl] file PREFIX --b £ºÒÔ´óСÀ´½øÐзÖÇø£¬¿É¼Óµ¥Î»£¬ÀýÈç b, k, m µÈ --l £ºÒÔÐÐÊýÀ´½øÐзÖÇø¡£ -- PREFIX £º·ÖÇøÎļþµÄǰµ¼Ãû³Æ +-b ?????§³?????§Ù?????????¦Ë?????? b, k, m ?? +-l ?????????????§Ù????? +- PREFIX ?????????????????? ``` -# Õý¹æ±íʾ·¨ÓëÎļþ¸ñʽ»¯´¦Àí +# ?????????????????????? ## grep -ʹÓÃÕýÔò±íʾʽ°ÑÆ¥ÅäµÄÐÐÌáÈ¡³öÀ´¡£ +??????????????????????????? ```html -$ grep [-acinv] [--color=auto] ËÑѰ×Ö·û´® filename --a £º ½« binary ÎļþÒÔ text ÎļþµÄ·½Ê½½øÐÐËÑѰ --c £º ¼ÆËãÕÒµ½¸öÊý --i £º ºöÂÔ´óСд --n £º Êä³öÐкŠ--v £º ·´ÏòÑ¡Ôñ£¬Ò༴ÏÔʾ³öûÓÐ ËÑѰ×Ö·û´® ÄÚÈݵÄÄÇÒ»ÐÐ ---color=auto £ºÕÒµ½µÄ¹Ø¼ü×Ö¼ÓÑÕÉ«ÏÔʾ +$ grep [-acinv] [--color=auto] ???????? filename +-a ?? ?? binary ????? text ?????????????? +-c ?? ??????????? +-i ?? ?????§³§Õ +-n ?? ????§Ü? +-v ?? ????????????????? ???????? ?????????? +--color=auto ?????????????????? ``` -·¶Àý£º°Ñº¬ÓÐ the ×Ö·û´®µÄÐÐÌáÈ¡³öÀ´£¨×¢ÒâĬÈÏ»áÓÐ --color=auto Ñ¡ÏÒò´ËÒÔÏÂÄÚÈÝÔÚ Linux ÖÐÓÐÑÕÉ«ÏÔʾ the ×Ö·û´®£© +??????????? the ??????????????????????????? --color=auto ???????????????? Linux ?????????? the ??????? ```html $ grep -n 'the' regular_express.txt @@ -976,19 +976,19 @@ $ grep -n 'the' regular_express.txt 18:google is the best tools for search keyword ``` -ÒòΪ { Óë } µÄ·ûºÅÔÚ shell ÊÇÓÐÌØÊâÒâÒåµÄ£¬Òò´Ë±ØÐëҪʹÓÃʹÓÃתÒå×Ö·û½øÐÐתÒå¡£ +??? { ?? } ??????? shell ???????????????????????????????????????‰^ ```html $ grep -n 'go\{2,5\}g' regular_express.txt ``` -ÆäËüÕýÔò±í´ïʽÇë²Î¿¼ [ÕýÔò±í´ïʽ](https://github.com/00000H/notes/blob/master/notes/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.md). +?????????????¦Ï? [???????](https://github.com/00000H/notes/blob/master/notes/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.md). ## printf -ÓÃÓÚ¸ñʽ»¯Êä³ö¡£ +????????????? -Ëü²»ÊôÓڹܵÀÃüÁÔÚ¸ø printf ´«Êý¾ÝʱÐèҪʹÓà $( ) ÐÎʽ¡£ +????????????????? printf ????????????? $( ) ????? ```html $ printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt) @@ -1000,12 +1000,12 @@ $ printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt) ## awk ```html -$ awk 'Ìõ¼þÀàÐÍ 1{¶¯×÷ 1} Ìõ¼þÀàÐÍ 2{¶¯×÷ 2} ...' filename +$ awk '???????? 1{???? 1} ???????? 2{???? 2} ...' filename ``` -awk ÿ´Î´¦ÀíÒ»ÐУ¬´¦ÀíµÄ×îСµ¥Î»ÊÇ×ֶΣ¬Ã¿¸ö×ֶεÄÃüÃû·½Ê½Îª£º\$n£¬n Ϊ×ֶκţ¬´Ó 1 ¿ªÊ¼£¬\$0 ±íʾһÕûÐС£ +awk ??¦Ä?????§µ????????§³??¦Ë????¦²??????¦Å???????????\$n??n ???¦Ê???? 1 ?????\$0 ???????§³? -·¶Àý 1£ºÈ¡³öµÇ¼Óû§µÄÓû§ÃûºÍ ip +???? 1???????????????????? ip ```html $ last -n 5 @@ -1018,15 +1018,15 @@ dmtsai tty1 Fri May 29 11:55 - 12:11 (00:15) $ last -n 5 | awk '{print $1 "\t" $3} ``` -awk ±äÁ¿£º +awk ?????? -| ±äÁ¿Ãû³Æ | ´ú±íÒâÒå | +| ???????? | ???????? | | -- | -- | -| NF | ÿһÐÐÓµÓеÄ×Ö¶Î×ÜÊý | -| NR | ĿǰËù´¦ÀíµÄÊǵڼ¸ÐÐÊý¾Ý | -| FS | ĿǰµÄ·Ö¸ô×Ö·û£¬Ä¬ÈÏÊǿոñ¼ü | +| NF | ??????§Ö???????? | +| NR | ??????????????????? | +| FS | ??????????????????? | -·¶Àý 2£ºÊä³öÕýÔÚ´¦ÀíµÄÐкţ¬²¢ÏÔʾÿһÐÐÓжàÉÙ×Ö¶Î +???? 2??????????????§Ü????????????§Ø?????? ```html $ last -n 5 | awk '{print $1 "\t lines: " NR "\t columns: " NF}' @@ -1037,9 +1037,9 @@ dmtsai lines: 4 columns: 10 dmtsai lines: 5 columns: 9 ``` -¿ÉÒÔʹÓôóÓÚµÈÓÚÂß¼­£¬ÆäÖеÈÓÚʹÓà ==¡£ +?????????????????????§Ö?????? ==?? -·¶Àý 3£º/etc/passwd ÎļþµÚÈý¸ö×Ö¶ÎΪ UID£¬¶Ô UID СÓÚ 10 µÄÊý¾Ý½øÐд¦Àí¡£ +???? 3??/etc/passwd ????????????? UID???? UID §³?? 10 ????????§Õ??? ```text cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}' @@ -1048,24 +1048,24 @@ bin 1 daemon 2 ``` -# vim Èý¸öģʽ +# vim ?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/341c632a-1fc1-4068-9b9f-bf7ef68ebb4c.jpg) -ÔÚÖ¸ÁîÁÐģʽÏ£¬ÓÐÒÔÏÂÃüÁîÓÃÓÚÀ뿪»òÕß´æ´¢Îļþ¡£ +????????????????????????????????›¥????? -| ÃüÁî | ×÷Óà | +| ???? | ???? | | -- | -- | -| :w | дÈë´ÅÅÌ| -| :w! | µ±ÎļþΪֻ¶Áʱ£¬Ç¿ÖÆÐ´Èë´ÅÅÌ¡£µ½µ×Äܲ»ÄÜдÈ룬ÓëÓû§¶Ô¸ÃÎļþµÄȨÏÞÓÐ¹Ø | -| :q | À뿪| -| :q! | Ç¿ÖÆÀ뿪²»±£´æ| -| :wq | дÈë´ÅÅ̺óÀ뿪| -| :wq!| Ç¿ÖÆÐ´Èë´ÅÅ̺óÀ뿪| +| :w | §Õ?????| +| :w! | ???????????????§Õ???????????????§Õ???????????????????§Û? | +| :q | ??| +| :q! | ???????????| +| :wq | §Õ????????| +| :wq!| ???§Õ????????| -# ²Î¿¼×ÊÁÏ +# ?¦Ï????? -- Äñ¸ç. Äñ ¸ç µÄ Linux ˽ ·¿ ²Ë »ù ´¡ ƪ µÚ Èý °æ[J]. 2009. -- [Linux ƽ̨ÉϵÄÈí¼þ°ü¹ÜÀí](https://www.ibm.com/developerworks/cn/linux/l-cn-rpmdpkg/index.html) +- ???. ?? ?? ?? Linux ? ?? ?? ?? ?? ? ?? ?? ??[J]. 2009. +- [Linux ??????????????](https://www.ibm.com/developerworks/cn/linux/l-cn-rpmdpkg/index.html) diff --git a/notes/MySQL.md b/notes/MySQL.md index 4a86f910..13500542 100644 --- a/notes/MySQL.md +++ b/notes/MySQL.md @@ -1,226 +1,226 @@ -* [´æ´¢ÒýÇæ](#´æ´¢ÒýÇæ) +* [?›¥????](#?›¥????) * [1. InnoDB](#1-innodb) * [2. MyISAM](#2-myisam) - * [3. InnoDB Óë MyISAM µÄ±È½Ï](#3-innodb-Óë-myisam-µÄ±È½Ï) -* [Êý¾ÝÀàÐÍ](#Êý¾ÝÀàÐÍ) - * [1. ÕûÐÍ](#1-ÕûÐÍ) - * [2. ¸¡µãÊý](#2-¸¡µãÊý) - * [3. ×Ö·û´®](#3-×Ö·û´®) - * [4. ʱ¼äºÍÈÕÆÚ](#4-ʱ¼äºÍÈÕÆÚ) -* [Ë÷Òý](#Ë÷Òý) - * [1. Ë÷Òý·ÖÀà](#1-Ë÷Òý·ÖÀà) - * [1.1 B-Tree Ë÷Òý](#11-b-tree-Ë÷Òý) - * [1.2 ¹þÏ£Ë÷Òý](#12-¹þÏ£Ë÷Òý) - * [1.3. ¿Õ¼äË÷ÒýÊý¾Ý£¨R-Tree£©](#13-¿Õ¼äË÷ÒýÊý¾Ýr-tree) - * [1.4 È«ÎÄË÷Òý](#14-È«ÎÄË÷Òý) - * [2. Ë÷ÒýµÄÓŵã](#2-Ë÷ÒýµÄÓŵã) - * [3. Ë÷ÒýÓÅ»¯](#3-Ë÷ÒýÓÅ»¯) - * [3.1 ¶ÀÁ¢µÄÁÐ](#31-¶ÀÁ¢µÄÁÐ) - * [3.2 ǰ׺Ë÷Òý](#32-ǰ׺Ë÷Òý) - * [3.3 ¶àÁÐË÷Òý](#33-¶àÁÐË÷Òý) - * [3.4 Ë÷ÒýÁеÄ˳Ðò](#34-Ë÷ÒýÁеÄ˳Ðò) - * [3.5 ¾Û´ØË÷Òý](#35-¾Û´ØË÷Òý) - * [3.6 ¸²¸ÇË÷Òý](#36-¸²¸ÇË÷Òý) - * [4. B-Tree ºÍ B+Tree Ô­Àí](#4-b-tree-ºÍ-b+tree-Ô­Àí) + * [3. InnoDB ?? MyISAM ????](#3-innodb-??-myisam-????) +* [????????](#????????) + * [1. ????](#1-????) + * [2. ??????](#2-??????) + * [3. ?????](#3-?????) + * [4. ????????](#4-????????) +* [????](#????) + * [1. ????????](#1-????????) + * [1.1 B-Tree ????](#11-b-tree-????) + * [1.2 ???????](#12-???????) + * [1.3. ????????????R-Tree??](#13-????????????r-tree??) + * [1.4 ???????](#14-???????) + * [2. ?????????](#2-?????????) + * [3. ???????](#3-???????) + * [3.1 ????????](#31-????????) + * [3.2 ??????](#32-??????) + * [3.3 ????????](#33-????????) + * [3.4 ?????§Ö????](#34-?????§Ö????) + * [3.5 ???????](#35-???????) + * [3.6 ????????](#36-????????) + * [4. B-Tree ?? B+Tree ???](#4-b-tree-??-b+tree-???) * [4. 1 B-Tree](#4-1-b-tree) * [4.2 B+Tree](#42-b+tree) - * [4.3 ´øÓÐ˳Ðò·ÃÎÊÖ¸ÕëµÄ B+Tree](#43-´øÓÐ˳Ðò·ÃÎÊÖ¸ÕëµÄ-b+tree) - * [4.4 ΪʲôʹÓà B-Tree ºÍ B+Tree](#44-ΪʲôʹÓÃ-b-tree-ºÍ-b+tree) -* [²éѯÐÔÄÜÓÅ»¯](#²éѯÐÔÄÜÓÅ»¯) + * [4.3 ?????????????? B+Tree](#43-??????????????-b+tree) + * [4.4 ?????? B-Tree ?? B+Tree](#44-??????-b-tree-??-b+tree) +* [??????????](#??????????) * [1. Explain](#1-explain) - * [2. ¼õÉÙ·µ»ØµÄÁÐ](#2-¼õÉÙ·µ»ØµÄÁÐ) - * [3. ¼õÉÙ·µ»ØµÄÐÐ](#3-¼õÉÙ·µ»ØµÄÐÐ) - * [4. ²ð·Ö´óµÄ DELETE »ò INSERT Óï¾ä](#4-²ð·Ö´óµÄ-delete-»ò-insert-Óï¾ä) -* [·Ö¿âÓë·Ö±í](#·Ö¿âÓë·Ö±í) -* [¹ÊÕÏ×ªÒÆºÍ¹ÊÕϻָ´](#¹ÊÕÏ×ªÒÆºÍ¹ÊÕϻָ´) - * [1. ¹ÊÕÏ×ªÒÆ](#1-¹ÊÕÏ×ªÒÆ) - * [2. ¹ÊÕϻָ´](#2-¹ÊÕϻָ´) -* [²Î¿¼×ÊÁÏ](#²Î¿¼×ÊÁÏ) + * [2. ??????????](#2-??????????) + * [3. ??????????](#3-??????????) + * [4. ????? DELETE ?? INSERT ???](#4-?????-delete-??-insert-???) +* [???????](#???????) +* [?????????????](#?????????????) + * [1. ???????](#1-???????) + * [2. ??????](#2-??????) +* [?¦Ï?????](#?¦Ï?????) -# ´æ´¢ÒýÇæ +# ?›¥???? ## 1. InnoDB -InnoDB ÊÇ MySQL µÄĬÈÏÊÂÎñÐÍÒýÇæ£¬Ö»ÓÐÔÚÐèÒª InnoDB ²»Ö§³ÖµÄÌØÐÔʱ£¬²Å¿¼ÂÇʹÓÃÆäËü´æ´¢ÒýÇæ¡£ +InnoDB ?? MySQL ??????????????—¨???????? InnoDB ??????????????????????????›¥???µµ -²ÉÓà MVCC À´Ö§³Ö¸ß²¢·¢£¬²¢ÇÒʵÏÖÁËËĸö±ê×¼µÄ¸ôÀë¼¶±ð£¬Ä¬Èϼ¶±ðÊÇ¿ÉÖØ¸´¶Á¡£ +???? MVCC ????????????????????????????????????????????????? -±íÊÇ»ùÓÚ¾Û´ØË÷Òý½¨Á¢µÄ£¬Ëü¶ÔÖ÷¼üµÄ²éѯÐÔÄÜÓкܸߵÄÌáÉý¡£ +?????????????????????????????????????§Ü????????? -ÄÚ²¿×öÁ˺ܶàÓÅ»¯£¬°üÀ¨´Ó´ÅÅ̶ÁÈ¡Êý¾Ýʱ²ÉÓõĿÉÔ¤²âÐÔ¶Á£¬Äܹ»×Ô¶¯ÔÚÄÚ´æÖд´½¨ hash Ë÷ÒýÒÔ¼ÓËÙ¶Á²Ù×÷µÄ×ÔÊÊÓ¦¹þÏ£Ë÷Òý£¬ÒÔ¼°Äܹ»¼ÓËÙ²åÈë²Ù×÷µÄ²åÈ뻺³åÇøµÈ¡£ +????????????????????????????????????????????????????????§Õ??? hash ?????????????????????????????????????????????????????????? -ͨ¹ýһЩ»úÖÆºÍ¹¤¾ßÖ§³ÖÕæÕýµÄÈȱ¸·Ý¡£ +????§»??????????????????????? ## 2. MyISAM -MyISAM ÌṩÁË´óÁ¿µÄÌØÐÔ£¬°üÀ¨È«ÎÄË÷Òý¡¢Ñ¹Ëõ¡¢¿Õ¼äº¯Êý£¨GIS£©µÈ¡£µ« MyISAM ²»Ö§³ÖÊÂÎñºÍÐм¶Ëø£¬¶øÇÒ±¼À£ºóÎÞ·¨°²È«»Ö¸´¡£ +MyISAM ??????????????????????????????????�‰????GIS??????? MyISAM ???????????§Þ????????????????????????? -Ö»ÄܶÔÕûÕűí¼ÓËø£¬¶ø²»ÊÇÕë¶ÔÐС£ +????????????????????????§³? -¿ÉÒÔÊÖ¹¤»òÕß×Ô¶¯Ö´Ðмì²éºÍÐÞ¸´²Ù×÷£¬µ«ÊǺÍÊÂÎñ»Ö¸´ÒÔ¼°±¼À£»Ö¸´²»Í¬£¬¿ÉÄܵ¼ÖÂһЩÊý¾Ý¶ªÊ§£¬¶øÇÒÐÞ¸´²Ù×÷ÊǷdz£ÂýµÄ¡£ +????????????????§Þ??????????????????????????????????????????????§»???????????????????????????? -¿ÉÒÔ°üº¬¶¯Ì¬»òÕß¾²Ì¬µÄÐС£ +???????????????????§³? -Èç¹ûÖ¸¶¨ÁË DELAY_KEY_WRITE Ñ¡ÏÔÚÿ´ÎÐÞ¸ÄÖ´ÐÐÍê³Éʱ£¬²»»áÁ¢¼´½«Ð޸ĵÄË÷ÒýÊý¾ÝдÈë´ÅÅÌ£¬¶øÊÇ»áдµ½ÄÚ´æÖеļü»º³åÇø£¬Ö»ÓÐÔÚÇåÀí¼ü»º³åÇø»òÕ߹رձíµÄʱºò²Å»á½«¶ÔÓ¦µÄË÷Òý¿éдÈë´ÅÅÌ¡£ÕâÖÖ·½Ê½¿ÉÒÔ¼«´óµÄÌáÉýдÈëÐÔÄÜ£¬µ«ÊÇÔÚÊý¾Ý¿â»òÕßÖ÷»ú±¼À£Ê±»áÔì³ÉË÷ÒýË𻵣¬ÐèÒªÖ´ÐÐÐÞ¸´²Ù×÷¡£ +???????? DELAY_KEY_WRITE ??????????????????????????????????????????§Õ???????????§Õ??????§Ö??????????????????????????????????????????????????§Õ????????????????????????§Õ????????????????????????????????????????????????????????? -Èç¹û±íÔÚ´´½¨²¢µ¼ÈëÊý¾ÝÒԺ󣬲»»áÔÙ½øÐÐÐ޸IJÙ×÷£¬ÄÇôÕâÑùµÄ±íÊʺϲÉÓà MyISAM ѹËõ±í¡£ +??????????????????????????????????????????????????????? MyISAM ????? -¶ÔÓÚÖ»¶ÁÊý¾Ý£¬»òÕß±í±È½ÏС¡¢¿ÉÒÔÈÝÈÌÐÞ¸´²Ù×÷£¬ÔòÒÀÈ»¿ÉÒÔ¼ÌÐøÊ¹Óà MyISAM¡£ +???????????????????§³?????????????????????????????????? MyISAM?? -MyISAM Éè¼Æ¼òµ¥£¬Êý¾ÝÒÔ½ôÃܸñʽ´æ´¢£¬ËùÒÔÔÚijЩ³¡¾°ÏÂÐÔÄܺܺᣠ+MyISAM ?????????????????›¥?????????§»???????????¨¢? -## 3. InnoDB Óë MyISAM µÄ±È½Ï +## 3. InnoDB ?? MyISAM ???? -**ÊÂÎñ** +**????** -InnoDB ÊÇÊÂÎñÐ͵ġ£ +InnoDB ?????????? -**±¸·Ý** +**????** -InnoDB Ö§³ÖÔÚÏßÈȱ¸·Ý¡£ +InnoDB ????????????? -**±¼À£»Ö¸´** +**???????** -MyISAM ±¼À£ºó·¢ÉúË𻵵ĸÅÂÊ±È InnoDB ¸ßºÜ¶à£¬¶øÇÒ»Ö¸´µÄËÙ¶ÈÒ²¸üÂý¡£ +MyISAM ??????????????? InnoDB ?????????????????????? -**²¢·¢** +**????** -MyISAM Ö»Ö§³Ö±í¼¶Ëø£¬¶ø InnoDB »¹Ö§³ÖÐм¶Ëø¡£ +MyISAM ??????????? InnoDB ??????§Þ????? -**ÆäËüÌØÐÔ** +**????????** -MyISAM Ö§³ÖÈ«ÎÄË÷Òý£¬µØÀí¿Õ¼äË÷Òý£» +MyISAM ???????????????????????? -# Êý¾ÝÀàÐÍ +# ???????? -## 1. ÕûÐÍ +## 1. ???? -TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT ·Ö±ðʹÓà 8, 16, 24, 64 λ´æ´¢¿Õ¼ä£¬Ò»°ãÇé¿öÏÂԽСµÄÁÐÔ½ºÃ¡£ +TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT ?????? 8, 16, 24, 64 ¦Ë?›¥????????????§³??????¨¢? -INT(11) ÖеÄÊý×ÖÖ»Êǹ涨Á˽»»¥¹¤¾ßÏÔʾ×Ö·ûµÄ¸öÊý£¬¶ÔÓÚ´æ´¢ºÍ¼ÆËãÀ´ËµÊÇûÓÐÒâÒåµÄ¡£ +INT(11) ?§Ö????????ÕÇ??????????????????????????›¥??????????????????? -## 2. ¸¡µãÊý +## 2. ?????? -FLOAT ºÍ DOUBLE Ϊ¸¡µãÀàÐÍ£¬DECIMAL Ϊ¸ß¾«¶ÈСÊýÀàÐÍ¡£CPU Ô­ÉúÖ§³Ö¸¡µãÔËË㣬µ«ÊDz»Ö§³Ö DECIMAl ÀàÐ͵ļÆË㣬Òò´Ë DECIMAL µÄ¼ÆËã±È¸¡µãÀàÐÍÐèÒª¸ü¸ßµÄ´ú¼Û¡£ +FLOAT ?? DOUBLE ??????????DECIMAL ??????§³???????CPU ????????????????????? DECIMAl ??????????? DECIMAL ????????????????????????? -FLOAT¡¢DOUBLE ºÍ DECIMAL ¶¼¿ÉÒÔÖ¸¶¨ÁÐ¿í£¬ÀýÈç DECIMAL(18, 9) ±íʾ×ܹ² 18 λ£¬È¡ 9 λ´æ´¢Ð¡Êý²¿·Ö£¬Ê£Ï 9 λ´æ´¢ÕûÊý²¿·Ö¡£ +FLOAT??DOUBLE ?? DECIMAL ??????????§á????? DECIMAL(18, 9) ?????? 18 ¦Ë??? 9 ¦Ë?›¥§³?????????? 9 ¦Ë?›¥????????? -## 3. ×Ö·û´® +## 3. ????? -Ö÷ÒªÓÐ CHAR ºÍ VARCHAR Á½ÖÖÀàÐÍ£¬Ò»ÖÖÊǶ¨³¤µÄ£¬Ò»ÖÖÊDZ䳤µÄ¡£ +????? CHAR ?? VARCHAR ????????????????????????????? -VARCHAR ÕâÖֱ䳤ÀàÐÍÄܹ»½ÚÊ¡¿Õ¼ä£¬ÒòΪֻÐèÒª´æ´¢±ØÒªµÄÄÚÈÝ¡£µ«ÊÇÔÚÖ´ÐÐ UPDATE ʱ¿ÉÄÜ»áʹÐбäµÃ±ÈÔ­À´³¤£¬µ±³¬³öÒ»¸öÒ³ËùÄÜÈÝÄɵĴóСʱ£¬¾ÍÒªÖ´ÐжîÍâµÄ²Ù×÷£¬MyISAM »á½«Ðвð³É²»Í¬µÄƬ¶Î´æ´¢£¬¶ø InnoDB ÔòÐèÒª·ÖÁÑÒ³À´Ê¹ÐзŽøÒ³ÄÚ¡£ +VARCHAR ??????????????????????????›¥??????????????????? UPDATE ????????§Ò??????????????????????????????§³????????§Ø?????????MyISAM ???§Ó????????¦Ä›¥???? InnoDB ??????????????§Ù?????? -VARCHAR »á±£Áô×Ö·û´®Ä©Î²µÄ¿Õ¸ñ£¬¶ø CHAR »áɾ³ý¡£ +VARCHAR ??????????¦Â????? CHAR ??????? -## 4. ʱ¼äºÍÈÕÆÚ +## 4. ???????? -MySQL ÌṩÁËÁ½ÖÖÏàËÆµÄÈÕÆÚʱ¼äÀàÐÍ£ºDATATIME ºÍ TIMESTAMP¡£ +MySQL ?????????????????????????DATATIME ?? TIMESTAMP?? **DATATIME** -Äܹ»±£´æ´Ó 1001 Äêµ½ 9999 ÄêµÄÈÕÆÚºÍʱ¼ä£¬¾«¶ÈΪÃ룬ʹÓà 8 ×ֽڵĴ洢¿Õ¼ä¡£ +???????? 1001 ?? 9999 ????????????????????? 8 ????›¥??? -ËüÓëÊ±ÇøÎ޹ء£ +??????????? -ĬÈÏÇé¿öÏ£¬MySQL ÒÔÒ»ÖÖ¿ÉÅÅÐòµÄ¡¢ÎÞÆçÒåµÄ¸ñʽÏÔʾ DATATIME Öµ£¬ÀýÈç¡°2008-01016 22:37:08¡±£¬ÕâÊÇ ANSI ±ê×¼¶¨ÒåµÄÈÕÆÚºÍʱ¼ä±íʾ·½·¨¡£ +?????????MySQL ???????????????????????? DATATIME ??????³�2008-01016 22:37:08???????? ANSI ???????????????????????? **TIMESTAMP** -ºÍ UNIX ʱ¼ä´ÁÏàͬ£¬±£´æ´Ó 1970 Äê 1 Ô 1 ÈÕÎçÒ¹£¨¸ñÁÖÍþÖÎʱ¼ä£©ÒÔÀ´µÄÃëÊý£¬Ê¹Óà 4 ¸ö×Ö½Ú£¬Ö»Äܱíʾ´Ó 1970 Äê µ½ 2038 Äê¡£ +?? UNIX ?????????????? 1970 ?? 1 ?? 1 ????????????????????????????????? 4 ????????????? 1970 ?? ?? 2038 ?? -ËüºÍÊ±ÇøÓйء£ +????????§Û?? -MySQL ÌṩÁË FROM_UNIXTIME() º¯Êý°Ñ Unxi ʱ¼ä´Áת»»ÎªÈÕÆÚ£¬²¢ÌṩÁË UNIX_TIMESTAMP() º¯Êý°ÑÈÕÆÚת»»Îª Unix ʱ¼ä´Á¡£ +MySQL ???? FROM_UNIXTIME() ?????? Unxi ??????????????????? UNIX_TIMESTAMP() ?????????????? Unix ?????? -ĬÈÏÇé¿öÏ£¬Èç¹û²åÈëʱûÓÐÖ¸¶¨ TIMESTAMP ÁеÄÖµ£¬»á½«Õâ¸öÖµÉèÖÃΪµ±Ç°Ê±¼ä¡£ +??????????????????????? TIMESTAMP ?§Ö????????????????????? -Ó¦¸Ã¾¡Á¿Ê¹Óà TIMESTAMP£¬ÒòΪËü±È DATETIME ¿Õ¼äЧÂʸü¸ß¡£ +????????? TIMESTAMP????????? DATETIME ???§¹?????? -# Ë÷Òý +# ???? -Ë÷ÒýÊÇÔÚ´æ´¢ÒýÇæ²ãʵÏֵ쬶ø²»ÊÇÔÚ·þÎñÆ÷²ãʵÏֵģ¬ËùÒÔ²»Í¬´æ´¢ÒýÇæ¾ßÓв»Í¬µÄË÷ÒýÀàÐͺÍʵÏÖ¡£ +????????›¥?????????????????????????????????????›¥??????§Ó????????????????? -Ë÷ÒýÄܹ»ÇáÒ×½«²éѯÐÔÄÜÌáÉý¼¸¸öÊýÁ¿¼¶¡£ +??????????????????????????????????? -¶ÔÓڷdz£Ð¡µÄ±í¡¢´ó²¿·ÖÇé¿öϼòµ¥µÄÈ«±íɨÃè±È½¨Á¢Ë÷Òý¸ü¸ßЧ¡£¶ÔÓÚÖе½´óÐÍµÄ±í£¬Ë÷Òý¾Í·Ç³£ÓÐЧ¡£µ«ÊǶÔÓÚÌØ´óÐÍµÄ±í£¬½¨Á¢ºÍʹÓÃË÷ÒýµÄ´ú¼Û½«»áËæÖ®Ôö³¤¡£ÕâÖÖÇé¿öÏ£¬ÐèÒªÓõ½Ò»ÖÖ¼¼Êõ¿ÉÒÔÖ±½ÓÇø·Ö³öÐèÒª²éѯµÄÒ»×éÊý¾Ý£¬¶ø²»ÊÇÒ»Ìõ¼Ç¼һÌõ¼Ç¼µØÆ¥Å䣬ÀýÈç¿ÉÒÔʹÓ÷ÖÇø¼¼Êõ¡£ +??????§³???????????????????????????????§¹???????§Ö?????????????????§¹????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????¡Â????????? -## 1. Ë÷Òý·ÖÀà +## 1. ???????? -### 1.1 B-Tree Ë÷Òý +### 1.1 B-Tree ???? -B-Tree Ë÷ÒýÊÇ´ó¶àÊý MySQL ´æ´¢ÒýÇæµÄĬÈÏË÷ÒýÀàÐÍ¡£ +B-Tree ?????????? MySQL ?›¥????????????????? -ÒòΪ²»ÔÙÐèÒª½øÐÐÈ«±íɨÃ裬ֻÐèÒª¶ÔÊ÷½øÐÐËÑË÷¼´¿É£¬Òò´Ë²éÕÒËÙ¶È¿ìºÜ¶à¡£ +???????????????????Ñk????????????????????????????????? -¿ÉÒÔÖ¸¶¨¶à¸öÁÐ×÷ΪË÷ÒýÁУ¬¶à¸öË÷ÒýÁй²Í¬×é³É¼ü¡£B-Tree Ë÷ÒýÊÊÓÃÓÚÈ«¼üÖµ¡¢¼üÖµ·¶Î§ºÍ¼üǰ׺²éÕÒ£¬ÆäÖмüǰ׺²éÕÒÖ»ÊÊÓÃÓÚ×î×óǰ׺²éÕÒ¡£ +????????????????????§µ?????????§Û????????B-Tree ?????????????????????¦¶?????????????§Þ????????????????????????? -³ýÁËÓÃÓÚ²éÕÒ£¬»¹¿ÉÒÔÓÃÓÚÅÅÐòºÍ·Ö×é¡£ +?????????????????????????????î• -Èç¹û²»Êǰ´ÕÕË÷ÒýÁеÄ˳Ðò½øÐвéÕÒ£¬ÔòÎÞ·¨Ê¹ÓÃË÷Òý¡£ +???????????????§Ö??????§Ó?????????????????? -### 1.2 ¹þÏ£Ë÷Òý +### 1.2 ??????? -»ùÓÚ¹þÏ£±íʵÏÖ£¬ÓŵãÊDzéÕҷdz£¿ì¡£ +???????????????????????? -ÔÚ MySQL ÖÐÖ»ÓÐ Memory ÒýÇæÏÔʽ֧³Ö¹þÏ£Ë÷Òý¡£ +?? MySQL ????? Memory ?????????????????? -InnoDB ÒýÇæÓÐÒ»¸öÌØÊâµÄ¹¦ÄܽС°×ÔÊÊÓ¦¹þÏ£Ë÷Òý¡±£¬µ±Ä³¸öË÷ÒýÖµ±»Ê¹Óõķdz£Æµ·±Ê±£¬»áÔÚ B-Tree Ë÷ÒýÖ®ÉÏÔÙ´´½¨Ò»¸ö¹þÏ£Ë÷Òý£¬ÕâÑù¾ÍÈà B-Tree Ë÷Òý¾ßÓйþÏ£Ë÷ÒýµÄһЩÓŵ㣬±ÈÈç¿ìËٵĹþÏ£²éÕÒ¡£ +InnoDB ?????????????????§³????????????????????????????????????????????? B-Tree ???????????????????????????????? B-Tree ???????§Û?????????§»?????????????????? -ÏÞÖÆ£º¹þÏ£Ë÷ÒýÖ»°üº¬¹þÏ£ÖµºÍÐÐÖ¸Õ룬¶ø²»´æ´¢×Ö¶ÎÖµ£¬ËùÒÔ²»ÄÜʹÓÃË÷ÒýÖеÄÖµÀ´±ÜÃâ¶ÁÈ¡ÐС£²»¹ý£¬·ÃÎÊÄÚ´æÖеÄÐеÄËٶȺܿ죬ËùÒԴ󲿷ÖÇé¿öÏÂÕâÒ»µã¶ÔÐÔÄÜÓ°Ïì²¢²»Ã÷ÏÔ£»ÎÞ·¨ÓÃÓÚ·Ö×éÓëÅÅÐò£»Ö»Ö§³Ö¾«È·²éÕÒ£¬ÎÞ·¨ÓÃÓÚ²¿·Ö²éÕҺͷ¶Î§²éÕÒ£»Èç¹û¹þÏ£³åÍ»ºÜ¶à£¬²éÕÒËÙ¶È»á±äµÃºÜÂý¡£ +?????????????????????????????????›¥?????????????????????§Ö???????????§³???????????????§Ö??§Ö???????????????????????????????????????????????????????????????????????????????¦¶??????????????????????????¨²????? -### 1.3. ¿Õ¼äË÷ÒýÊý¾Ý£¨R-Tree£© +### 1.3. ????????????R-Tree?? -MyISAM ´æ´¢ÒýÇæÖ§³Ö¿Õ¼äË÷Òý£¬¿ÉÒÔÓÃÓÚµØÀíÊý¾Ý´æ´¢¡£ +MyISAM ?›¥??????????????????????????????›¥?? -¿Õ¼äË÷Òý»á´ÓËùÓÐά¶ÈÀ´Ë÷ÒýÊý¾Ý£¬¿ÉÒÔÓÐЧµØÊ¹ÓÃÈÎÒâά¶ÈÀ´½øÐÐ×éºÏ²éѯ¡£ +??????????????????????????????????§¹????????????????????????? -### 1.4 È«ÎÄË÷Òý +### 1.4 ??????? -MyISAM ´æ´¢ÒýÇæÖ§³ÖÈ«ÎÄË÷Òý£¬ÓÃÓÚ²éÕÒÎı¾ÖеĹؼü´Ê£¬¶ø²»ÊÇÖ±½Ó±È½ÏË÷ÒýÖеÄÖµ¡£ +MyISAM ?›¥???????????????????????????§Ö??????????????????????§Ö???? -ʹÓà MATCH AGAINST£¬¶ø²»ÊÇÆÕͨµÄ WHERE¡£ +??? MATCH AGAINST????????????? WHERE?? -## 2. Ë÷ÒýµÄÓŵã +## 2. ????????? -- ´ó´ó¼õÉÙÁË·þÎñÆ÷ÐèҪɨÃèµÄÊý¾ÝÁ¿£» +- ???????????????????????????? -- °ïÖú·þÎñÆ÷±ÜÃâ½øÐÐÅÅÐòºÍ´´½¨ÁÙʱ±í£» +- ?????????????????????????????? -- ½«Ëæ»ú I/O ±äΪ˳Ðò I/O¡£ +- ????? I/O ?????? I/O?? -## 3. Ë÷ÒýÓÅ»¯ +## 3. ??????? -### 3.1 ¶ÀÁ¢µÄÁÐ +### 3.1 ???????? -ÔÚ½øÐвéѯʱ£¬Ë÷ÒýÁв»ÄÜÊDZí´ïʽµÄÒ»²¿·Ö£¬Ò²²»ÄÜÊǺ¯ÊýµÄ²ÎÊý£¬·ñÔòÎÞ·¨Ê¹ÓÃË÷Òý¡£ +????§Ó??????????§Ó????????????????????????????????????????????????? -ÀýÈçÏÂÃæµÄ²éѯ²»ÄÜʹÓà actor_id ÁеÄË÷Òý£º +?????????????????? actor_id ?§Ö??????? ```sql SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5; ``` -### 3.2 ǰ׺Ë÷Òý +### 3.2 ?????? -¶ÔÓÚ BLOB¡¢TEXT ºÍ VARCHAR ÀàÐ͵ÄÁУ¬±ØÐëʹÓÃǰ׺Ë÷Òý£¬Ö»Ë÷Òý¿ªÊ¼µÄ²¿·Ö×Ö·û¡£ +???? BLOB??TEXT ?? VARCHAR ??????§µ?????????????????????????????????? -¶ÔÓÚǰ׺³¤¶ÈµÄѡȡÐèÒª¸ù¾Ý **Ë÷ÒýÑ¡ÔñÐÔ** À´È·¶¨£º²»Öظ´µÄË÷ÒýÖµºÍ¼Ç¼×ÜÊýµÄ±ÈÖµ¡£Ñ¡ÔñÐÔÔ½¸ß£¬²éѯЧÂÊÒ²Ô½¸ß¡£×î´óֵΪ 1 £¬´Ëʱÿ¸ö¼Ç¼¶¼ÓÐΨһµÄË÷ÒýÓëÆä¶ÔÓ¦¡£ +???????????????????? **?????????** ?????????????????????????????????????????????§¹???????????? 1 ???????????????¦·??????????????? -### 3.3 ¶àÁÐË÷Òý +### 3.3 ???????? -ÔÚÐèҪʹÓöà¸öÁÐ×÷ΪÌõ¼þ½øÐвéѯʱ£¬Ê¹ÓöàÁÐË÷Òý±ÈʹÓöà¸öµ¥ÁÐË÷ÒýÐÔÄܸüºÃ¡£ÀýÈçÏÂÃæµÄÓï¾äÖУ¬×îºÃ°Ñ actor_id ºÍ file_id ÉèÖÃΪ¶àÁÐË÷Òý¡£ +??????????????????????§Ó????????????????????????????????????¨¢??????????????§µ????? actor_id ?? file_id ??????????????? ```sql SELECT file_id, actor_ id FROM sakila.film_actor WhERE actor_id = 1 OR film_id = 1; ``` -### 3.4 Ë÷ÒýÁеÄ˳Ðò +### 3.4 ?????§Ö???? -ÈÃÑ¡ÔñÐÔ×îÇ¿µÄË÷ÒýÁзÅÔÚÇ°Ãæ£¬ÀýÈçÏÂÃæÏÔʾµÄ½á¹ûÖÐ customer_id µÄÑ¡ÔñÐÔ±È staff_id ¸ü¸ß£¬Òò´Ë×îºÃ°Ñ customer_id ÁзÅÔÚ¶àÁÐË÷ÒýµÄÇ°Ãæ¡£ +?????????????????§Ù?????—¨????????????????? customer_id ???????? staff_id ???????????? customer_id ?§Ù??????????????µµ ```sql SELECT COUNT(DISTINCT staff_id)/COUNT(*) AS staff_id_selectivity, @@ -235,107 +235,107 @@ customer_id_selectivity: 0.0373 COUNT(*): 16049 ``` -### 3.5 ¾Û´ØË÷Òý +### 3.5 ??????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/b9e9ae8c-e216-4c01-b267-a50dbeb98fa4.jpg) -¾Û´ØË÷Òý²¢²»ÊÇÒ»ÖÖË÷ÒýÀàÐÍ£¬¶øÊÇÒ»ÖÖÊý¾Ý´æ´¢·½Ê½¡£ +????????????????????????????????????›¥????? -ÊõÓï¡°¾Û´Ø¡±±íʾÊý¾ÝÐкÍÏàÁڵļüÖµ½ôÃܵش洢ÔÚÒ»Æð£¬InnoDB µÄ¾Û´ØË÷ÒýµÄÊý¾ÝÐдæ·ÅÔÚ B-Tree µÄÒ¶×ÓÒ³ÖС£ +????????????????§Ü?????????????›¥?????InnoDB ???????????????§Õ???? B-Tree ???????§³? -ÒòΪÎÞ·¨°ÑÊý¾ÝÐдæ·ÅÔÚÁ½¸ö²»Í¬µÄµØ·½£¬ËùÒÔÒ»¸ö±íÖ»ÄÜÓÐÒ»¸ö¾Û´ØË÷Òý¡£ +?????????????§Õ??????????????????????????????????????????? -**Óŵã** +**???** -1. ¿ÉÒÔ°ÑÏà¹ØÊý¾Ý±£´æÔÚÒ»Æð£¬¼õÉÙ I/O ²Ù×÷£» -2. ÒòΪÊý¾Ý±£´æÔÚ B-Tree ÖУ¬Òò´ËÊý¾Ý·ÃÎʸü¿ì¡£ +1. ??????????????????????? I/O ?????? +2. ???????????? B-Tree ?§µ?????????????? -**ȱµã** +**???** -1. ¾Û´ØË÷Òý×î´óÏÞ¶ÈÌá¸ßÁË I/O Ãܼ¯ÐÍÓ¦ÓõÄÐÔÄÜ£¬µ«ÊÇÈç¹ûÊý¾ÝÈ«²¿·ÅÔÚÄڴ棬¾Íû±ØÒªÓþ۴ØË÷Òý¡£ -2. ²åÈëËÙ¶ÈÑÏÖØÒÀÀµÓÚ²åÈë˳Ðò£¬°´Ö÷¼üµÄ˳Ðò²åÈëÊÇ×î¿ìµÄ¡£ -3. ¸üвÙ×÷´ú¼ÛºÜ¸ß£¬ÒòΪÿ¸ö±»¸üеÄÐж¼»áÒÆ¶¯µ½ÐµÄλÖᣠ-4. µ±²åÈ뵽ij¸öÒÑÂúµÄÒ³ÖУ¬´æ´¢ÒýÇæ»á½«¸ÃÒ³·ÖÁѳÉÁ½¸öÒ³ÃæÀ´ÈÝÄɸÃÐУ¬Ò³·ÖÁѻᵼÖ±íÕ¼Óøü¶àµÄ´ÅÅ̿ռ䡣 -5. Èç¹ûÐбȽÏÏ¡Ê裬»òÕßÓÉÓÚÒ³·ÖÁѵ¼ÖÂÊý¾Ý´æ´¢²»Á¬ÐøÊ±£¬¾Û´ØË÷Òý¿ÉÄܵ¼ÖÂÈ«±íɨÃèËٶȱäÂý¡£ +1. ?????????????????? I/O ??????????????????????????????????—¨???????????????? +2. ??????????????????????????????????????????? +3. ????????????????????????????§Ø???????????¦Ë?¨¢? +4. ?????????????????§µ??›¥????????????????????????????§µ????????¡À????????????? +5. ????§Ò????Ñk????????????????????›¥????????????????????????????????????? -### 3.6 ¸²¸ÇË÷Òý +### 3.6 ???????? -Ë÷Òý°üº¬ËùÓÐÐèÒª²éѯµÄ×ֶεÄÖµ¡£ +??????????????????????¦Å???? -## 4. B-Tree ºÍ B+Tree Ô­Àí +## 4. B-Tree ?? B+Tree ??? ### 4. 1 B-Tree ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/5ed71283-a070-4b21-85ae-f2cbfd6ba6e1.jpg) -ΪÁËÃèÊö B-Tree£¬Ê×Ïȶ¨ÒåÒ»ÌõÊý¾Ý¼Ç¼Ϊһ¸ö¶þÔª×é [key, data]£¬key Ϊ¼Ç¼µÄ¼ü£¬data ΪÊý¾Ý¼Ç¼³ý key ÍâµÄÊý¾Ý¡£ +??????? B-Tree??????????????????????????? [key, data]??key ?????????data ????????? key ???????? -B-Tree ÊÇÂú×ãÏÂÁÐÌõ¼þµÄÊý¾Ý½á¹¹£º +B-Tree ??????????????????????? -- ËùÓÐÒ¶½Úµã¾ßÓÐÏàͬµÄÉî¶È£¬Ò²¾ÍÊÇ˵ B-Tree ÊÇÆ½ºâµÄ£» -- Ò»¸ö½ÚµãÖÐµÄ key ´Ó×óµ½ÓҷǵݼõÅÅÁУ» -- Èç¹ûij¸öÖ¸ÕëµÄ×óÓÒÏàÁÚ key ·Ö±ðÊÇ keyi ºÍ keyi+1£¬ÇÒ²»Îª null£¬Ôò¸ÃÖ¸ÕëÖ¸Ïò½ÚµãµÄËùÓÐ key ´óÓÚ keyi ÇÒСÓÚ keyi+1¡£ +- ?????????????????????????? B-Tree ??????? +- ???????§Ö? key ????????????§µ? +- ?????????????????? key ????? keyi ?? keyi+1?????? null?????????????????? key ???? keyi ??§³?? keyi+1?? -ÔÚ B-Tree Öа´ key ¼ìË÷Êý¾ÝµÄËã·¨·Ç³£Ö±¹Û£ºÊ×ÏÈ´Ó¸ù½Úµã½øÐжþ·Ö²éÕÒ£¬Èç¹ûÕÒµ½Ôò·µ»Ø¶ÔÓ¦½ÚµãµÄ data£¬·ñÔò¶ÔÏàÓ¦Çø¼äµÄÖ¸ÕëÖ¸ÏòµÄ½ÚµãµÝ¹é½øÐвéÕÒ£¬Ö±µ½ÕÒµ½½Úµã»òÕÒµ½ null Ö¸Õ룬ǰÕß²éÕҳɹ¦£¬ºóÕß²éÕÒʧ°Ü¡£ +?? B-Tree ?§Ñ? key ?????????????????????????????§Ø?????????????????????? data????????????????????????????§Ó????????????????? null ???????????????????????? -ÓÉÓÚ²åÈëɾ³ýеÄÊý¾Ý¼Ç¼»áÆÆ»µ B-Tree µÄÐÔÖÊ£¬Òò´ËÔÚ²åÈëɾ³ýʱ£¬ÐèÒª¶ÔÊ÷½øÐÐÒ»¸ö·ÖÁÑ¡¢ºÏ²¢¡¢×ªÒƵȲÙ×÷ÒÔ±£³Ö B-Tree ÐÔÖÊ¡£ +???????????????????????? B-Tree ????????????????????????????????????????????????????????? B-Tree ????? ### 4.2 B+Tree ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/63cd5b50-d6d8-4df6-8912-ef4a1dd5ba13.jpg) -Óë B-Tree Ïà±È£¬B+Tree ÓÐÒÔϲ»Í¬µã£º +?? B-Tree ????B+Tree ?????????? -- ÿ¸ö½ÚµãµÄÖ¸ÕëÉÏÏÞΪ 2d ¶ø²»ÊÇ 2d+1£» -- Äڽڵ㲻´æ´¢ data£¬Ö»´æ´¢ key£¬Ò¶×ӽڵ㲻´æ´¢Ö¸Õë¡£ +- ??????????????? 2d ?????? 2d+1?? +- ?????›¥ data????›¥ key????????›¥??? -### 4.3 ´øÓÐ˳Ðò·ÃÎÊÖ¸ÕëµÄ B+Tree +### 4.3 ?????????????? B+Tree ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1ee5f0a5-b8df-43b9-95ab-c516c54ec797.jpg) -Ò»°ãÔÚÊý¾Ý¿âϵͳ»òÎļþϵͳÖÐʹÓÃµÄ B+Tree ½á¹¹¶¼ÔÚ¾­µä B+Tree »ù´¡ÉϽøÐÐÁËÓÅ»¯£¬ÔÚÒ¶×Ó½ÚµãÔö¼ÓÁË˳Ðò·ÃÎÊÖ¸Õ룬×öÕâ¸öÓÅ»¯µÄÄ¿µÄÊÇΪÁËÌá¸ßÇø¼ä·ÃÎʵÄÐÔÄÜ¡£ +????????????????????????? B+Tree ????????? B+Tree ???????????????????????????????????????????????????????????????????????? -### 4.4 ΪʲôʹÓà B-Tree ºÍ B+Tree +### 4.4 ?????? B-Tree ?? B+Tree -ºìºÚÊ÷µÈÊý¾Ý½á¹¹Ò²¿ÉÒÔÓÃÀ´ÊµÏÖË÷Òý£¬µ«ÊÇÎļþϵͳ¼°Êý¾Ý¿âϵͳÆÕ±é²ÉÓà B-/+Tree ×÷ΪË÷Òý½á¹¹¡£ +?????????????????????????????????????????????????????? B-/+Tree ??????????? -Ò³ÊǼÆËã»ú¹ÜÀí´æ´¢Æ÷µÄÂß¼­¿é£¬Ó²¼þ¼°²Ù×÷ϵͳÍùÍù½«Ö÷´æºÍ´ÅÅÌ´æ´¢Çø·Ö¸îΪÁ¬ÐøµÄ´óСÏàµÈµÄ¿é£¬Ã¿¸ö´æ´¢¿é³ÆÎªÒ»Ò³£¨ÔÚÐí¶à²Ù×÷ϵͳÖУ¬Ò³µÃ´óСͨ³£Îª 4k£©£¬Ö÷´æºÍ´ÅÅÌÒÔҳΪµ¥Î»½»»»Êý¾Ý¡£ +???????????›¥????????ï…?????????????????????????›¥?????????????§³????ï…????›¥???????????????????§µ?????§³???? 4k??????????????????¦Ë????????? -Ò»°ãÀ´Ëµ£¬Ë÷Òý±¾ÉíÒ²ºÜ´ó£¬²»¿ÉÄÜÈ«²¿´æ´¢ÔÚÄÚ´æÖУ¬Òò´ËË÷ÒýÍùÍùÒÔË÷ÒýÎļþµÄÐÎʽ´æ´¢µÄ´ÅÅÌÉÏ¡£ÎªÁ˼õÉÙ´ÅÅÌ I/O£¬´ÅÅÌÍùÍù²»ÊÇÑϸñ°´Ðè¶ÁÈ¡£¬¶øÊÇÿ´Î¶¼»áÔ¤¶Á¡£ÕâÑù×öµÄÀíÂÛÒÀ¾ÝÊǼÆËã»ú¿ÆÑ§ÖÐÖøÃûµÄ¾Ö²¿ÐÔÔ­Àí£ºµ±Ò»¸öÊý¾Ý±»Óõ½Ê±£¬Æä¸½½üµÄÊý¾ÝҲͨ³£»áÂíÉϱ»Ê¹Óá£Êý¾Ý¿âϵͳµÄÉè¼ÆÕßÇÉÃîÀûÓÃÁË´ÅÅÌÔ¤¶ÁÔ­Àí£¬½«Ò»¸ö½ÚµãµÄ´óСÉèΪµÈÓÚÒ»¸öÒ³£¬ÕâÑùÿ¸ö½ÚµãÖ»ÐèÒªÒ»´Î I/O ¾Í¿ÉÒÔÍêÈ«ÔØÈë¡£B-Tree ÖÐÒ»´Î¼ìË÷×î¶àÐèÒª h-1 ´Î I/O£¨¸ù½Úµã³£×¤Äڴ棩£¬½¥½ø¸´ÔÓ¶ÈΪ O(h)=O(logdN)¡£Ò»°ãʵ¼ÊÓ¦ÓÃÖУ¬³ö¶È d ÊǷdz£´óµÄÊý×Ö£¬Í¨³£³¬¹ý 100£¬Òò´Ë h ·Ç³£Ð¡£¨Í¨³£²»³¬¹ý 3£©¡£¶øºìºÚÊ÷ÕâÖֽṹ£¬h Ã÷ÏÔÒªÉîµÄ¶à¡£²¢ÇÒÓÚÂß¼­ÉϺܽüµÄ½Úµã£¨¸¸×Ó£©ÎïÀíÉÏ¿ÉÄܺÜÔ¶£¬ÎÞ·¨ÀûÓþֲ¿ÐÔ£¬Ð§ÂÊÃ÷ÏÔ±È B-Tree ²îºÜ¶à¡£ +?????????????????????????????›¥??????§µ???????????????????????????›¥????????????????? I/O?????????????????????????????¦Æ?????????????????????????????????????????????????????????????????Àö?????????????????????¨¢????????????????????????????????????????????§³?????????????????????????????? I/O ????????????B-Tree ????¦Ì????????? h-1 ?? I/O??????????—¥???????????? O(h)=O(logdN)????????????§µ????? d ??????????????????? 100????? h ???§³??????????? 3??????????????????h ????????????????????????????????????????????????????????§¹??????? B-Tree ???? -B+Tree ¸üÊʺÏÍâ´æË÷Òý£¬Ô­ÒòºÍÄÚ½Úµã³ö¶È d Óйء£ÓÉÓÚ B+Tree ÄÚ½ÚµãÈ¥µôÁË data Óò£¬Òò´Ë¿ÉÒÔÓµÓиü´óµÄ³ö¶È£¬ÓµÓиüºÃµÄÐÔÄÜ¡£ +B+Tree ????????????????????????? d ?§Û?????? B+Tree ????????? data ??????????§Ú??????????§Ú????????? -# ²éѯÐÔÄÜÓÅ»¯ +# ?????????? ## 1. Explain -ÓÃÀ´·ÖÎö SQL Óï¾ä£¬·ÖÎö½á¹ûÖбȽÏÖØÒªµÄ×Ö¶ÎÓУº +???????? SQL ???????????§Ò???????????§µ? -- select_type : ²éѯÀàÐÍ£¬Óмòµ¥²éѯ¡¢ÁªºÏ²éѯºÍ×Ó²éѯ +- select_type : ?????????§Þ????????????????? -- key : ʹÓõÄË÷Òý +- key : ???????? -- rows : ɨÃèµÄÐÐÊý +- rows : ???????? -## 2. ¼õÉÙ·µ»ØµÄÁÐ +## 2. ?????????? -Âý²éѯÖ÷ÒªÊÇÒòΪ·ÃÎÊÁ˹ý¶àÊý¾Ý£¬³ýÁË·ÃÎʹý¶àÐÐÖ®Í⣬Ҳ°üÀ¨·ÃÎʹý¶àÁС£ +???????????????????????????????????????????????????????§³? -×îºÃ²»ÒªÊ¹Óà SELECT * Óï¾ä£¬Òª¸ù¾ÝÐèҪѡÔñ²éѯµÄÁС£ +??¨°????? SELECT * ???????????????????§³? -## 3. ¼õÉÙ·µ»ØµÄÐÐ +## 3. ?????????? -×îºÃʹÓà LIMIT Óï¾äÀ´È¡³öÏëÒªµÄÄÇЩÐС£ +?????? LIMIT ???????????????§»?§³? -»¹¿ÉÒÔ½¨Á¢Ë÷ÒýÀ´¼õÉÙÌõ¼þÓï¾äµÄÈ«±íɨÃè¡£ÀýÈç¶ÔÓÚÏÂÃæµÄÓï¾ä£¬²»ÊÊÓÃË÷ÒýµÄÇé¿öÏÂÐèÒª½øÐÐÈ«±íɨÃ裬¶øÊ¹ÓÃË÷ÒýÖ»ÐèҪɨÃ輸ÐмǼ¼´¿É£¬Ê¹Óà Explain Óï¾ä¿ÉÒÔͨ¹ý¹Û²ì rows ×Ö¶ÎÀ´¿´³öÕâÖÖ²îÒì¡£ +????????????????????????????????ÒÂ????????????????????????????????????????????Ñk???????????????Ý”?§Þ?????????? Explain ???????????? rows ???????????????? ```sql SELECT * FROM sakila.film_actor WHERE film_id = 1; ``` -## 4. ²ð·Ö´óµÄ DELETE »ò INSERT Óï¾ä +## 4. ????? DELETE ?? INSERT ??? -Èç¹ûÒ»´ÎÐÔÖ´Ðеϰ£¬¿ÉÄÜÒ»´ÎËø×¡ºÜ¶àÊý¾Ý¡¢Õ¼ÂúÕû¸öÊÂÎñÈÕÖ¾¡¢ºÄ¾¡ÏµÍ³×ÊÔ´¡¢×èÈûºÜ¶àСµÄµ«ÖØÒªµÄ²éѯ¡£ +??????????§Ö???????????????????????????????????????????????????????§³???????????? ```sql DELEFT FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH); @@ -348,74 +348,74 @@ do { } while rows_affected > 0 ``` -# ·Ö¿âÓë·Ö±í +# ??????? -**1. ·Ö±íÓë·ÖÇøµÄ²»Í¬** +**1. ????????????** -·Ö±í£¬¾ÍÊǽ²Ò»Õűí·Ö³É¶à¸öС±í£¬ÕâЩС±íÓµÓв»Í¬µÄ±íÃû£»¶ø·ÖÇøÊǽ«Ò»ÕűíµÄÊý¾Ý·ÖΪ¶à¸öÇø¿é£¬ÕâÐ©Çø¿é¿ÉÒÔ´æ´¢ÔÚͬһ¸ö´ÅÅÌÉÏ£¬Ò²¿ÉÒÔ´æ´¢ÔÚ²»Í¬µÄ´ÅÅÌÉÏ£¬ÕâÖÖ·½Ê½Ï±íÈÔȻֻÓÐÒ»¸ö¡£ +????????????????§³????§»§³????§Ó???????????????????????????????????ï…??§»???????›¥??????????????????›¥???????????????????¡À???????????? -**2. ʹÓ÷ֿâÓë·Ö±íµÄÔ­Òò** +**2. ??¡Â??????????** -Ëæ×Åʱ¼äºÍÒµÎñµÄ·¢Õ¹£¬Êý¾Ý¿âÖеıí»áÔ½À´Ô½¶à£¬²¢ÇÒ±íÖеÄÊý¾ÝÁ¿Ò²»áÔ½À´Ô½´ó£¬ÄÇô¶Áд²Ù×÷µÄ¿ªÏúÒ²»áËæ×ÅÔö´ó¡£ +??????????????????????§Ö???????????????§Ö?????????????????????§Õ???????????????????? -**3. ´¹Ö±ÇзÖ** +**3. ????§Ù?** -½«±í°´¹¦ÄÜÄ£¿é¡¢¹ØÏµÃÜÇг̶Ȼ®·Ö³öÀ´£¬²¿Êðµ½²»Í¬µÄ¿âÉÏ¡£ÀýÈ磬ÎÒÃǻὨÁ¢ÉÌÆ·Êý¾Ý¿â payDB¡¢Óû§Êý¾Ý¿â userDB µÈ£¬·Ö±ðÓÃÀ´´æ´¢ÏîÄ¿ÓëÉÌÆ·ÓйصıíºÍÓëÓû§ÓÐ¹ØµÄ±í¡£ +??????????î”??????§Ô?????????????????????????íà??????????????? payDB?????????? userDB ???????????›¥?????????§Û??????????§Û??? -**4. ˮƽÇзÖ** +**4. ???§Ù?** -°Ñ±íÖеÄÊý¾Ý°´ÕÕijÖÖ¹æÔò´æ´¢µ½¶à¸ö½á¹¹ÏàͬµÄ±íÖУ¬ÀýÈç°´ id µÄÉ¢ÁÐÖµ¡¢ÐÔ±ðµÈ½øÐл®·Ö£¬ +????§Ö??????????????›¥??????????????§µ????º– id ??????????????§Ý???? -**5. ´¹Ö±ÇзÖÓëˮƽÇзֵÄÑ¡Ôñ** +**5. ????§Ù??????§Ù?????** -Èç¹ûÊý¾Ý¿âÖеıíÌ«¶à£¬²¢ÇÒÏîÄ¿¸÷ÏîÒµÎñÂß¼­ÇåÎú£¬ÄÇô´¹Ö±ÇзÖÊÇÊ×Ñ¡¡£ +?????????§Ö???????????????????????????????????§Ù???????? -Èç¹ûÊý¾Ý¿âµÄ±í²»¶à£¬µ«Êǵ¥±íµÄÊý¾ÝÁ¿ºÜ´ó£¬Ó¦¸ÃÑ¡ÔñˮƽÇз֡£ +??????????????????????????????????????§Ù?? -**6. ˮƽÇзֵÄʵÏÖ·½Ê½** +**6. ???§Ù???????** -×î¼òµ¥µÄÊÇʹÓà merge ´æ´¢ÒýÇæ¡£ +????????? merge ?›¥???µµ -**7. ·Ö¿âÓë·Ö±í´æÔÚµÄÎÊÌâ** +**7. ???????????????** -(1) ÊÂÎñÎÊÌâ +(1) ???????? -ÔÚÖ´Ðзֿâ·Ö±íÖ®ºó£¬ÓÉÓÚÊý¾Ý´æ´¢µ½Á˲»Í¬µÄ¿âÉÏ£¬Êý¾Ý¿âÊÂÎñ¹ÜÀí³öÏÖÁËÀ§ÄÑ¡£Èç¹ûÒÀÀµÊý¾Ý¿â±¾ÉíµÄ·Ö²¼Ê½ÊÂÎñ¹ÜÀí¹¦ÄÜÈ¥Ö´ÐÐÊÂÎñ£¬½«¸¶³ö¸ß°ºµÄÐÔÄÜ´ú¼Û£»Èç¹ûÓÉÓ¦ÓóÌÐòȥЭÖú¿ØÖÆ£¬ÐγɳÌÐòÂß¼­ÉϵÄÊÂÎñ£¬ÓÖ»áÔì³É±à³Ì·½ÃæµÄ¸ºµ£¡£ +????§Ù???????????????›¥??????????????????????????????????????????????????????????????????????????????????????????????¨®????§¿????????¦Ã??????????????????????????????? -(2) ¿ç¿â¿ç±íÁ¬½ÓÎÊÌâ +(2) ????????????? -ÔÚÖ´ÐÐÁË·Ö¿â·Ö±íÖ®ºó£¬ÄÑÒÔ±ÜÃâ»á½«Ô­±¾Âß¼­¹ØÁªÐÔºÜÇ¿µÄÊý¾Ý»®·Öµ½²»Í¬µÄ±í¡¢²»Í¬µÄ¿âÉÏ¡£Õâʱ£¬±íµÄÁ¬½Ó²Ù×÷½«Êܵ½ÏÞÖÆ£¬ÎÒÃÇÎÞ·¨Á¬½ÓλÓÚ²»Í¬·Ö¿âµÄ±í£¬Ò²ÎÞ·¨Á¬½Ó·Ö±íÁ£¶È²»Í¬µÄ±í£¬µ¼ÖÂÔ­±¾Ö»ÐèÒªÒ»´Î²éѯ¾ÍÄܹ»Íê³ÉµÄÒµÎñÐèÒª½øÐжà´Î²ÅÄÜÍê³É¡£ +?????????????????????????????????????????????????????????????????????????????????????????????????¦Ë?????????????????????????????????????????¦Â????????????????????§Ø?¦Â?????¨À? -# ¹ÊÕÏ×ªÒÆºÍ¹ÊÕϻָ´ +# ????????????? -¹ÊÕÏ×ªÒÆÒ²½Ð×öÇл»£¬µ±Ö÷¿â³öÏÖ¹ÊÕÏʱ¾ÍÇл»µ½±¸¿â£¬Ê¹±¸¿â³ÉΪÖ÷¿â¡£¹ÊÕϻָ´¹ËÃû˼Òå¾ÍÊÇ´Ó¹ÊÕÏÖлָ´¹ýÀ´£¬²¢ÇÒ±£Ö¤Êý¾ÝµÄÕýÈ·ÐÔ¡£ +?????????????§Ý???????????????????§Ý???????????????????????????????????????§Ý????????????????????????? -## 1. ¹ÊÕÏ×ªÒÆ +## 1. ??????? -**1.1 ÌáÉý±¸¿â»òÇл»½ÇÉ«** +**1.1 ??????????§Ý????** -ÌáÉýһ̨±¸¿âΪÖ÷¿â£¬»òÕßÔÚÒ»¸öÖ÷-Ö÷¸´ÖƽṹÖе÷ÕûÖ÷¶¯ºÍ±»¶¯½ÇÉ«¡£ +??????????????????????????-????????§Ö????????????????? -**1.2 ÐéÄâ IP µØÖ·ºÍ IP ÍйÜ** +**1.2 ???? IP ????? IP ?§Û?** -Ϊ MySQL ʵÀýÖ¸¶¨Ò»¸öÂß¼­ IP µØÖ·£¬µ± MySQL ʵÀýʧЧʱ£¬¿ÉÒÔ½« IP µØÖ·×ªÒƵ½Áíһ̨ MySQL ·þÎñÆ÷ÉÏ¡£ +? MySQL ???????????? IP ??????? MySQL ????§¹???????? IP ??????????? MySQL ????????? -**1.3 Öмä¼þ½â¾ö·½°¸** +**1.3 ?§Þ?????????** -ͨ¹ý´úÀí£¬¿ÉÒÔ·ÓÉÁ÷Á¿µ½¿ÉÒÔʹÓõķþÎñÆ÷ÉÏ¡£ +???????????¡¤???????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/fabd5fa0-b75e-48d0-9e2c-31471945ceb9.jpg) -**1.4 ÔÚÓ¦ÓÃÖд¦Àí¹ÊÕÏ×ªÒÆ** +**1.4 ??????§Õ?????????** -½«¹ÊÕÏ×ªÒÆÕûºÏµ½Ó¦ÓÃÖпÉÄܵ¼ÖÂÓ¦ÓñäµÃÌ«¹ý±¿×¾¡£ +??????????????????§á??????????????????? -## 2. ¹ÊÕϻָ´ +## 2. ?????? -# ²Î¿¼×ÊÁÏ +# ?¦Ï????? -- ¸ßÐÔÄÜ MySQL -- [MySQL Ë÷Òý±³ºóµÄÊý¾Ý½á¹¹¼°Ëã·¨Ô­Àí ](http://blog.codinglabs.org/articles/theory-of-mysql-index.html) -- [MySQL Ë÷ÒýÓÅ»¯È«¹¥ÂÔ ](http://www.runoob.com/w3cnote/mysql-index.html) -- [20+ Ìõ MySQL ÐÔÄÜÓÅ»¯µÄ×î¼Ñ¾­Ñé ](https://www.jfox.info/20-tiao-mysql-xing-nen-you-hua-de-zui-jia-jing-yan.html) +- ?????? MySQL +- [MySQL ????????????????????? ](http://blog.codinglabs.org/articles/theory-of-mysql-index.html) +- [MySQL ???????????? ](http://www.runoob.com/w3cnote/mysql-index.html) +- [20+ ?? MySQL ??????????????? ](https://www.jfox.info/20-tiao-mysql-xing-nen-you-hua-de-zui-jia-jing-yan.html) diff --git a/notes/SQL 语法.md b/notes/SQL 语法.md index b128542b..f95e4cce 100644 --- a/notes/SQL 语法.md +++ b/notes/SQL 语法.md @@ -1,52 +1,52 @@ -* [»ù´¡](#»ù´¡) -* [²éѯ](#²éѯ) -* [ÅÅÐò](#ÅÅÐò) -* [¹ýÂË](#¹ýÂË) -* [ͨÅä·û](#ͨÅä·û) -* [¼ÆËã×Ö¶Î](#¼ÆËã×Ö¶Î) -* [º¯Êý](#º¯Êý) - * [Îı¾´¦Àí](#Îı¾´¦Àí) - * [ÈÕÆÚºÍʱ¼ä´¦Àí](#ÈÕÆÚºÍʱ¼ä´¦Àí) - * [ÊýÖµ´¦Àí](#ÊýÖµ´¦Àí) - * [»ã×Ü](#»ã×Ü) -* [·Ö×é](#·Ö×é) -* [×Ó²éѯ](#×Ó²éѯ) -* [Á¬½Ó](#Á¬½Ó) - * [ÄÚÁ¬½Ó](#ÄÚÁ¬½Ó) - * [×ÔÁ¬½Ó](#×ÔÁ¬½Ó) - * [×ÔÈ»Á¬½Ó](#×ÔÈ»Á¬½Ó) - * [ÍâÁ¬½Ó](#ÍâÁ¬½Ó) -* [×éºÏ²éѯ](#×éºÏ²éѯ) -* [²åÈë](#²åÈë) -* [¸üÐÂ](#¸üÐÂ) -* [ɾ³ý](#ɾ³ý) -* [´´½¨±í](#´´½¨±í) -* [Ð޸ıí](#Ð޸ıí) -* [ÊÓͼ](#ÊÓͼ) -* [´æ´¢¹ý³Ì](#´æ´¢¹ý³Ì) -* [Óαê](#Óαê) -* [´¥·¢Æ÷](#´¥·¢Æ÷) -* [ÊÂÎñ´¦Àí](#ÊÂÎñ´¦Àí) -* [×Ö·û¼¯](#×Ö·û¼¯) -* [ȨÏÞ¹ÜÀí](#ȨÏÞ¹ÜÀí) +* [????](#????) +* [???](#???) +* [????](#????) +* [????](#????) +* [????](#????) +* [???????](#???????) +* [????](#????) + * [???????](#???????) + * [??????????](#??????????) + * [???????](#???????) + * [????](#????) +* [????](#????) +* [????](#????) +* [????](#????) + * [??????](#??????) + * [??????](#??????) + * [???????](#???????) + * [??????](#??????) +* [?????](#?????) +* [????](#????) +* [????](#????) +* [???](#???) +* [??????](#??????) +* [????](#????) +* [???](#???) +* [?›¥????](#?›¥????) +* [?¦Á?](#?¦Á?) +* [??????](#??????) +* [??????](#??????) +* [?????](#?????) +* [??????](#??????) -# »ù´¡ +# ???? -ģʽ£º¶¨ÒåÁËÊý¾ÝÈçºÎ´æ´¢¡¢´æ´¢Ê²Ã´ÑùµÄÊý¾ÝÒÔ¼°Êý¾ÝÈçºÎ·Ö½âµÈÐÅÏ¢£¬Êý¾Ý¿âºÍ±í¶¼ÓÐģʽ¡£ +????????????????¦Ä›¥???›¥???????????????????¦Ç????????????????????? -Ö÷¼üµÄÖµ²»ÔÊÐíÐ޸ģ¬Ò²²»ÔÊÐí¸´Ó㨲»ÄÜʹÓÃÒѾ­É¾³ýµÄÖ÷¼üÖµ¸³¸øÐÂÊý¾ÝÐеÄÖ÷¼ü£©¡£ +??????????????????????????????????????????????????????????§Ö????????? -SQL£¨Structured Query Language)£¬±ê×¼ SQL ÓÉ ANSI ±ê׼ίԱ»á¹ÜÀí£¬´Ó¶ø³ÆÎª ANSI SQL£¬¸÷¸ö DBMS ¶¼ÓÐ×Ô¼ºµÄʵÏÖ£¬Èç PL/SQL¡¢Transact-SQL µÈ¡£ +SQL??Structured Query Language)????? SQL ?? ANSI ???????????????? ANSI SQL?????? DBMS ??????????????? PL/SQL??Transact-SQL ??? -# ²éѯ +# ??? -SQL Óï¾ä²»Çø·Ö´óСд£¬µ«ÊÇÊý¾Ý¿â±íÃû¡¢ÁÐÃûºÍÖµÊÇ·ñÇø·ÖÒÀÀµÓÚ¾ßÌåµÄ DBMS ÒÔ¼°ÅäÖᣠ+SQL ????????§³§Õ???????????????????????????????????????? DBMS ??????¨¢? **DISTINCT** -Ïàֵֻͬ»á³öÏÖÒ»´Î¡£Ëü×÷ÓÃÓÚËùÓÐÁУ¬Ò²¾ÍÊÇ˵ËùÓÐÁеÄÖµ¶¼Ïàͬ²ÅËãÏàͬ¡£ +????????????¦±??????????????§µ????????????§Ö???????????????? ```sql SELECT DISTINCT col1, col2 @@ -55,9 +55,9 @@ FROM mytable; **LIMIT** -ÏÞÖÆ·µ»ØµÄÐÐÊý¡£¿ÉÒÔÓÐÁ½¸ö²ÎÊý£¬µÚÒ»¸ö²ÎÊýΪÆðʼÐУ¬´Ó 0 ¿ªÊ¼£»µÚ¶þ¸ö²ÎÊýΪ·µ»ØµÄ×ÜÐÐÊý¡£ +????????????????????????????????????????????§µ??? 0 ???????????????????????????? -·µ»ØÇ° 5 ÐÐµÄ SQL£º +????? 5 ?§Ö? SQL?? ```sql SELECT * @@ -71,7 +71,7 @@ FROM mytable LIMIT 0, 5; ``` -·µ»ØµÚ 3 \~ 5 ÐУº +????? 3 \~ 5 ?§µ? ```sql SELECT * @@ -79,22 +79,22 @@ FROM mytable LIMIT 2, 3; ``` -**×¢ÊÍ** +**???** ```sql -# ×¢ÊÍ +# ??? SELECT * -FROM mytable -- ×¢ÊÍ -/* ×¢ÊÍ1 - ×¢ÊÍ2 */ +FROM mytable -- ??? +/* ???1 + ???2 */ ``` -# ÅÅÐò +# ???? -**ASC**£ºÉýÐò£¨Ä¬ÈÏ£© -**DESC**£º½µÐò +**ASC**?????????? +**DESC**?????? -¿ÉÒÔ°´¶à¸öÁнøÐÐÅÅÐò£º +?????????§ß??????? ```sql SELECT * @@ -102,9 +102,9 @@ FROM mytable ORDER BY col1 DESC, col2 ASC; ``` -# ¹ýÂË +# ???? -ÔÚÓ¦ÓòãÒ²¿ÉÒÔ¹ýÂËÊý¾Ý£¬µ«ÊDz»ÔÚ·þÎñÆ÷¶Ë½øÐйýÂ˵ÄÊý¾Ý·Ç³£´ó£¬µ¼ÖÂͨ¹ýÍøÂç´«ÊäÁ˺ܶà¶àÓàµÄÊý¾Ý£¬´Ó¶øÀË·ÑÁËÍøÂç´ø¿í¡£ +????¨°??????????????????????????????§Û?????????????????????×Ï?????????????????????????????? ```sql SELECT * @@ -112,155 +112,155 @@ FROM mytable WHERE col IS NULL; ``` -ϱíÏÔʾÁË WHERE ×Ó¾ä¿ÉÓõIJÙ×÷·û +?¡À?????? WHERE ???????????? -| ²Ù×÷·û | ˵Ã÷ | +| ?????? | ??? | | ------------ | ------------ | -| = < > | µÈÓÚ Ð¡ÓÚ ´óÓÚ | -| <> != | ²»µÈÓÚ | -| <= !> | СÓÚµÈÓÚ | -| >= !< | ´óÓÚµÈÓÚ | -| BETWEEN | ÔÚÁ½¸öÖµÖ®¼ä | -| IS NULL | ΪNULLÖµ | +| = < > | ???? §³?? ???? | +| <> != | ?????? | +| <= !> | §³????? | +| >= !< | ??????? | +| BETWEEN | ?????????? | +| IS NULL | ?NULL? | -Ó¦¸Ã×¢Òâµ½£¬NULL Óë 0 ¡¢¿Õ×Ö·û´®¶¼²»Í¬¡£ +????????NULL ?? 0 ???????????????? -**AND OR** ÓÃÓÚÁ¬½Ó¶à¸ö¹ýÂËÌõ¼þ¡£ÓÅÏÈ´¦Àí AND£¬Òò´Ëµ±Ò»¸ö¹ýÂ˱í´ïÊ½Éæ¼°µ½¶à¸ö AND ºÍ OR ʱ£¬Ó¦µ±Ê¹Óà () À´¾ö¶¨ÓÅÏȼ¶¡£ +**AND OR** ??????????????????????????? AND?????????????????�p????? AND ?? OR ????????? () ????????????? -**IN** ²Ù×÷·ûÓÃÓÚÆ¥ÅäÒ»×éÖµ£¬ÆäºóÒ²¿ÉÒÔ½ÓÒ»¸ö SELECT ×Ӿ䣬´Ó¶øÆ¥Åä×Ó²éѯµÃµ½µÄÒ»×éÖµ¡£ +**IN** ??????????????????????????????? SELECT ???????????????????????? -**NOT** ²Ù×÷·ûÓÃÓÚ·ñ¶¨Ò»¸öÌõ¼þ¡£ +**NOT** ???????????????????? -# ͨÅä·û +# ???? -ͨÅä·ûÒ²ÊÇÓÃÔÚ¹ýÂËÓï¾äÖУ¬Ö»ÄÜÓÃÓÚÎı¾×ֶΡ£ +??????????????????§µ?????????????¦±? -- **%** Æ¥Åä >=0 ¸öÈÎÒâ×Ö·û£¬ÀàËÆÓÚ \*£» +- **%** ??? >=0 ????????????????? \*?? -- **\_** Æ¥Åä ==1 ¸öÈÎÒâ×Ö·û£¬ÀàËÆÓÚ \.£» +- **\_** ??? ==1 ????????????????? \.?? -- **[ ]** ¿ÉÒÔÆ¥Å伯ºÏÄÚµÄ×Ö·û£¬ÓÃÍÑ×Ö·û ^ ¿ÉÒÔ¶ÔÆä½øÐзñ¶¨ +- **[ ]** ??????²®????????????????? ^ ?????????§Ù? -ʹÓà Like À´½øÐÐͨÅä·ûÆ¥Åä¡£ +??? Like ????????????? ```sql SELECT * FROM mytable -WHERE col LIKE '[^AB]%' -- ²»ÒÔAB¿ªÍ·µÄÈÎÒâÎı¾ +WHERE col LIKE '[^AB]%' -- ????AB???????????? ``` -²»ÒªÀÄÓÃͨÅä·û£¬Í¨Åä·ûλÓÚ¿ªÍ·´¦Æ¥Åä»á·Ç³£Âý¡£ +?????????????????¦Ë???????????????? -# ¼ÆËã×Ö¶Î +# ??????? -ÔÚÊý¾Ý¿â·þÎñÆ÷ÉÏÍê³ÉÊý¾ÝµÄת»»ºÍ¸ñʽ»¯µÄ¹¤×÷ÍùÍù±È¿Í»§¶ËÉÏ¿ìµÃ¶à£¬²¢ÇÒת»»ºÍ¸ñʽ»¯ºóµÄÊý¾ÝÁ¿¸üÉٵϰ¿ÉÒÔ¼õÉÙÍøÂçͨÐÅÁ¿¡£ +????????????????????????????????????????????????????????????????????????????????????????????????? -¼ÆËã×Ö¶Îͨ³£ÐèҪʹÓà **AS** À´È¡±ðÃû£¬·ñÔòÊä³öµÄʱºò×Ö¶ÎÃûΪ¼ÆËã±í´ïʽ¡£ +???????????????? **AS** ???????????????????????????????????? ```sql SELECT col1*col2 AS alias FROM mytable ``` -**Concat()** ÓÃÓÚÁ¬½ÓÁ½¸ö×ֶΡ£Ðí¶àÊý¾Ý¿â»áʹÓÿոñ°ÑÒ»¸öÖµÌî³äΪÁÐ¿í£¬Òò´ËÁ¬½ÓµÄ½á¹û»á³öÏÖһЩ²»±ØÒªµÄ¿Õ¸ñ£¬Ê¹Óà **TRIM()** ¿ÉÒÔÈ¥³ýÊ×β¿Õ¸ñ¡£ +**Concat()** ??????????????¦±?????????????????????????§á?????????????????§»???????????? **TRIM()** ?????????¦Â??? ```sql SELECT Concat(TRIM(col1), ' (', TRIM(col2), ')') FROM mytable ``` -# º¯Êý +# ???? -¸÷¸ö DBMS µÄº¯Êý¶¼ÊDz»ÏàͬµÄ£¬Òò´Ë²»¿ÉÒÆÖ²¡£ +???? DBMS ??????????????????????????? -## Îı¾´¦Àí +## ??????? -| º¯Êý | ˵Ã÷ | +| ???? | ??? | | ------------ | ------------ | -| LEFT() RIGHT() | ×ó±ß»òÕßÓұߵÄ×Ö·û | -| LOWER() UPPER() | ת»»ÎªÐ¡Ð´»òÕß´óд | -| LTRIM() RTIM() | È¥³ý×ó±ß»òÕßÓұߵĿոñ | -| LENGTH() | ³¤¶È | -| SUNDEX() | ת»»ÎªÓïÒôÖµ | +| LEFT() RIGHT() | ????????????? | +| LOWER() UPPER() | ????§³§Õ?????§Õ | +| LTRIM() RTIM() | ??????????????? | +| LENGTH() | ???? | +| SUNDEX() | ????????? | -ÆäÖУ¬**SOUNDEX()** Êǽ«Ò»¸ö×Ö·û´®×ª»»ÎªÃèÊöÆäÓïÒô±íʾµÄ×ÖĸÊý×ÖģʽµÄËã·¨£¬ËüÊǸù¾Ý·¢Òô¶ø²»ÊÇ×Öĸ±È½Ï¡£ +???§µ?**SOUNDEX()** ???????????????????????????????????????????????????????????????????? ```sql SELECT * FROM mytable WHERE SOUNDEX(col1) = SOUNDEX('apple') ``` -## ÈÕÆÚºÍʱ¼ä´¦Àí +## ?????????? -ÈÕÆÚ¸ñʽ£ºYYYY-MM-DD +????????YYYY-MM-DD -ʱ¼ä¸ñʽ£ºHH:MM:SS +???????HH:MM:SS -|º¯ Êý | ˵ Ã÷| +|?? ?? | ? ??| | --- | --- | -| AddDate() | Ôö¼ÓÒ»¸öÈÕÆÚ£¨Ìì¡¢Öܵȣ©| -| AddTime() | Ôö¼ÓÒ»¸öʱ¼ä£¨Ê±¡¢·ÖµÈ£©| -| CurDate() | ·µ»Øµ±Ç°ÈÕÆÚ | -| CurTime() | ·µ»Øµ±Ç°Ê±¼ä | -|Date() |·µ»ØÈÕÆÚʱ¼äµÄÈÕÆÚ²¿·Ö| -|DateDiff() |¼ÆËãÁ½¸öÈÕÆÚÖ®²î| -|Date_Add() |¸ß¶ÈÁé»îµÄÈÕÆÚÔËË㺯Êý| -|Date_Format() |·µ»ØÒ»¸ö¸ñʽ»¯µÄÈÕÆÚ»òʱ¼ä´®| -|Day()| ·µ»ØÒ»¸öÈÕÆÚµÄÌìÊý²¿·Ö| -|DayOfWeek() |¶ÔÓÚÒ»¸öÈÕÆÚ£¬·µ»Ø¶ÔÓ¦µÄÐÇÆÚ¼¸| -|Hour() |·µ»ØÒ»¸öʱ¼äµÄСʱ²¿·Ö| -|Minute() |·µ»ØÒ»¸öʱ¼äµÄ·ÖÖÓ²¿·Ö| -|Month() |·µ»ØÒ»¸öÈÕÆÚµÄÔ·ݲ¿·Ö| -|Now() |·µ»Øµ±Ç°ÈÕÆÚºÍʱ¼ä| -|Second() |·µ»ØÒ»¸öʱ¼äµÄÃ벿·Ö| -|Time() |·µ»ØÒ»¸öÈÕÆÚʱ¼äµÄʱ¼ä²¿·Ö| -|Year() |·µ»ØÒ»¸öÈÕÆÚµÄÄê·Ý²¿·Ö| +| AddDate() | ??????????????????| +| AddTime() | ?????????????????| +| CurDate() | ?????????? | +| CurTime() | ????????? | +|Date() |???????????????????| +|DateDiff() |???????????????| +|Date_Add() |?????????????????| +|Date_Format() |??????????????????????| +|Day()| ????????????????????| +|DayOfWeek() |?????????????????????????| +|Hour() |???????????§³?????| +|Minute() |?????????????????| +|Month() |?????????????¡¤????| +|Now() |??????????????| +|Second() |???????????????| +|Time() |????????????????????| +|Year() |??????????????????| ```sql mysql> SELECT NOW(); -> '2017-06-28 14:01:52' ``` -## ÊýÖµ´¦Àí +## ??????? -| º¯Êý | ˵Ã÷ | +| ???? | ??? | | --- | --- | -| SIN() | ÕýÏÒ | -|COS() | ÓàÏÒ | -| TAN() | ÕýÇÐ | -| ABS() | ¾ø¶ÔÖµ | -| SQRT() | ƽ·½¸ù| -| MOD() | ÓàÊý| -| EXP() | Ö¸Êý| -| PI() | Ô²ÖÜÂÊ| -|RAND() | Ëæ»úÊý| +| SIN() | ???? | +|COS() | ???? | +| TAN() | ???? | +| ABS() | ????? | +| SQRT() | ?????| +| MOD() | ????| +| EXP() | ???| +| PI() | ?????| +|RAND() | ?????| -## »ã×Ü +## ???? -|º¯ Êý |˵ Ã÷| +|?? ?? |? ??| | --- | --- | -|AVG() |·µ»ØÄ³ÁÐµÄÆ½¾ùÖµ| -|COUNT()| ·µ»ØÄ³ÁеÄÐÐÊý| -|MAX()| ·µ»ØÄ³ÁеÄ×î´óÖµ| -|MIN()| ·µ»ØÄ³ÁеÄ×îСֵ| -|SUM() |·µ»ØÄ³ÁÐÖµÖ®ºÍ| +|AVG() |??????§Ö?????| +|COUNT()| ??????§Ö?????| +|MAX()| ??????§Ö?????| +|MIN()| ??????§Ö???§³?| +|SUM() |???????????| -AVG() »áºöÂÔ NULL ÐС£ +AVG() ????? NULL ?§³? -DISTINCT ¹Ø¼ü×Ö»áÖ»»ã×ܲ»Í¬µÄÖµ¡£ +DISTINCT ?????????????????? ```sql SELECT AVG(DISTINCT col1) AS avg_col FROM mytable ``` -# ·Ö×é +# ???? -·Ö×é¾ÍÊǰÑÏàͬµÄÊý¾Ý·ÅÔÚͬһ×éÖС£ +?????????????????????????§³? -¿ÉÒÔ¶Ôÿ×éÊý¾ÝʹÓûã×ܺ¯Êý½øÐд¦Àí£¬ÀýÈçÇóÿ×éÊýµÄƽ¾ùÖµµÈ¡£ +????????????????????????§Õ??????????????????????? -°´ col ÅÅÐò²¢·Ö×éÊý¾Ý£º +?? col ???????????? ```sql SELECT col, COUNT(*) AS num @@ -268,7 +268,7 @@ FROM mytable GROUP BY col; ``` -WHERE ¹ýÂËÐУ¬HAVING ¹ýÂË·Ö×飬ÐйýÂËÓ¦µ±ÏÈÓë·Ö×é¹ýÂË£» +WHERE ?????§µ?HAVING ??????ï…?§Û????????????????? ```sql SELECT col, COUNT(*) AS num @@ -278,7 +278,7 @@ GROUP BY col HAVING COUNT(*) >= 2; ``` -GROUP BY µÄÅÅÐò½á¹ûΪ·Ö×é×ֶΣ¬¶ø ORDER BY Ò²¿ÉÒÔÒÔ¾Û¼¯×Ö¶ÎÀ´½øÐÐÅÅÐò¡£ +GROUP BY ???????????????¦²??? ORDER BY ?????????????????????? ```sql SELECT col, COUNT(*) AS num @@ -287,18 +287,18 @@ GROUP BY col ORDER BY num; ``` -·Ö×鹿¶¨£º +????ÕÇ?? -1. GROUP BY ×Ó¾ä³öÏÖÔÚ WHERE ×Ó¾äÖ®ºó£¬ORDER BY ×Ó¾ä֮ǰ£» -2. ³ýÁË»ã×ܼÆËãÓï¾äÖ®Í⣬SELECT Óï¾äÖеÄÿһÁж¼±ØÐëÔÚ GROUP BY ×Ó¾äÖиø³ö£» -3. NULL µÄÐлᵥ¶À·ÖΪһ×飻 -4. ´ó¶àÊý SQL ʵÏÖ²»Ö§³Ö GROUP BY ÁоßÓпɱ䳤¶ÈµÄÊý¾ÝÀàÐÍ¡£ +1. GROUP BY ???????? WHERE ??????ORDER BY ??????? +2. ????????????????SELECT ????§Ö????§Ø??????? GROUP BY ????§Ú????? +3. NULL ???§Ý????????ï” +4. ????? SQL ??????? GROUP BY ?§à??§á?????????????? -# ×Ó²éѯ +# ???? -×Ó²éѯÖÐÖ»ÄÜ·µ»ØÒ»¸öÁС£ +????????????????§³? -¿ÉÒÔ½«×Ó²éѯµÄ½á¹û×÷Ϊ WHRER Óï¾äµÄ¹ýÂËÌõ¼þ£º +???????????????? WHRER ????????????? ``` SELECT * @@ -307,7 +307,7 @@ WHERE col1 IN (SELECT col2 FROM mytable2); ``` -ÏÂÃæµÄÓï¾ä¿ÉÒÔ¼ìË÷³ö¿Í»§µÄ¶©µ¥ÊýÁ¿¡£×Ó²éѯÓï¾ä»á¶Ô¼ìË÷³öµÄÿ¸ö¿Í»§Ö´ÐÐÒ»´Î£º +?????????????????????????????????????????????????????????¦²? ```sql SELECT cust_name, (SELECT COUNT(*) @@ -318,17 +318,17 @@ FROM Customers ORDER BY cust_name; ``` -# Á¬½Ó +# ???? -Á¬½ÓÓÃÓÚÁ¬½Ó¶à¸ö±í£¬Ê¹Óà JOIN ¹Ø¼ü×Ö£¬²¢ÇÒÌõ¼þÓï¾äʹÓà ON¡£ +??????????????????? JOIN ???????????????????? ON?? -Á¬½Ó¿ÉÒÔÌæ»»×Ó²éѯ£¬²¢ÇÒ±È×Ó²éѯµÄЧÂÊÒ»°ã»á¸ü¿ì¡£ +????????�I?????????????????§¹????????? -¿ÉÒÔÓà AS ¸øÁÐÃû¡¢¼ÆËã×ֶκͱíÃûÈ¡±ðÃû£¬¸ø±íÃûÈ¡±ðÃûÊÇΪÁ˼ò»¯ SQL Óï¾äÒÔ¼°Á¬½ÓÏàͬ±í¡£ +?????? AS ??????????????¦Ê???????????????????????????? SQL ??????????????? -## ÄÚÁ¬½Ó +## ?????? -ÄÚÁ¬½ÓÓֳƵÈÖµÁ¬½Ó£¬Ê¹Óà INNER JOIN ¹Ø¼ü×Ö¡£ +??????????????????? INNER JOIN ?????? ``` select a, b, c @@ -336,7 +336,7 @@ from A inner join B on A.key = B.key ``` -¿ÉÒÔ²»Ã÷ȷʹÓà INNER JOIN£¬¶øÊ¹ÓÃÆÕͨ²éѯ²¢ÔÚ WHERE Öн«Á½¸ö±íÖÐÒªÁ¬½ÓµÄÁÐÓõÈÖµ·½·¨Á¬½ÓÆðÀ´¡£ +??????????? INNER JOIN????????????????? WHERE ?§ß??????????????????????????????????? ``` select a, b, c @@ -344,15 +344,15 @@ from A, B where A.key = B.key ``` -ÔÚûÓÐÌõ¼þÓï¾äµÄÇé¿öÏ·µ»ØµÑ¿¨¶û»ý¡£ +?????????????????¡¤??????????? -## ×ÔÁ¬½Ó +## ?????? -×ÔÁ¬½Ó¿ÉÒÔ¿´³ÉÄÚÁ¬½ÓµÄÒ»ÖÖ£¬Ö»ÊÇÁ¬½ÓµÄ±íÊÇ×ÔÉí¶øÒÑ¡£ +?????????????????????????????????????????? -Ò»ÕÅÔ±¹¤±í£¬°üº¬Ô±¹¤ÐÕÃûºÍÔ±¹¤ËùÊô²¿ÃÅ£¬ÒªÕÒ³öÓë Jim ´¦ÔÚͬһ²¿ÃŵÄËùÓÐÔ±¹¤ÐÕÃû¡£ +??????????????????????????????????????? Jim ???????????????????????? -**×Ó²éѯ°æ±¾** +**?????·Ú** ``` select name @@ -363,7 +363,7 @@ where department = ( where name = "Jim"); ``` -**×ÔÁ¬½Ó°æ±¾** +**??????·Ú** ``` select name @@ -372,24 +372,24 @@ where e1.department = e2.department and e1.name = "Jim"; ``` -Á¬½ÓÒ»°ã±È×Ó²éѯµÄЧÂʸߡ£ +??????????????§¹???? -## ×ÔÈ»Á¬½Ó +## ??????? -×ÔÈ»Á¬½ÓÊǰÑͬÃûÁÐͨ¹ýµÈÖµ²âÊÔÁ¬½ÓÆðÀ´µÄ£¬Í¬ÃûÁпÉÒÔÓжà¸ö¡£ +????????????????????????????????????????§á????§Ø???? -ÄÚÁ¬½ÓºÍ×ÔÈ»Á¬½ÓµÄÇø±ð£ºÄÚÁ¬½ÓÌṩÁ¬½ÓµÄÁУ¬¶ø×ÔÈ»Á¬½Ó×Ô¶¯Á¬½ÓËùÓÐͬÃûÁУ»ÄÚÁ¬½ÓÊôÓÚ×ÔÈ»Á¬½Ó¡£ +?????????????????????????????????§µ?????????????????????????§µ??????????????????? ``` select * from employee natural join department; ``` -## ÍâÁ¬½Ó +## ?????? -ÍâÁ¬½Ó±£ÁôÁËûÓйØÁªµÄÄÇЩÐС£·ÖΪ×óÍâÁ¬½Ó£¬ÓÒÍâÁ¬½ÓÒÔ¼°È«ÍâÁ¬½Ó£¬×óÍâÁ¬½Ó¾ÍÊDZ£Áô×ó±íµÄËùÓÐÐС£ +?????????????§Û???????§»?§³???????????????????????????????????????????????????????§³? -¼ìË÷ËùÓй˿͵Ķ©µ¥ÐÅÏ¢£¬°üÀ¨»¹Ã»Óж©µ¥ÐÅÏ¢µÄ¹Ë¿Í¡£ +???????§Û???????????????????§Ø??????????? ``` select Customers.cust_id, Orders.order_num @@ -397,7 +397,7 @@ select Customers.cust_id, Orders.order_num on Customers.cust_id = Orders.curt_id ``` -Èç¹ûÐèҪͳ¼Æ¹Ë¿ÍµÄ¶©µ¥Êý£¬Ê¹Óþۼ¯º¯Êý¡£ +?????????????????????????????? ``` select Customers.cust_id, @@ -407,13 +407,13 @@ on Customers.cust_id = Orders.curt_id group by Customers.cust_id ``` -# ×éºÏ²éѯ +# ????? -ʹÓà **UNION** À´Á¬½ÓÁ½¸ö²éѯ£¬Ã¿¸ö²éѯ±ØÐë°üº¬ÏàͬµÄÁС¢±í´ïʽ»òÕß¾Û¼¯º¯Êý¡£ +??? **UNION** ??????????????????????????????????§³????????????????? -ĬÈÏ»áÈ¥³ýÏàͬÐУ¬Èç¹ûÐèÒª±£ÁôÏàͬÐУ¬Ê¹Óà UNION ALL ¡£ +???????????§µ???????????????§µ???? UNION ALL ?? -Ö»Äܰüº¬Ò»¸ö ORDER BY ×Ӿ䣬²¢ÇÒ±ØÐëλÓÚÓï¾äµÄ×îºó¡£ +????????? ORDER BY ??????????¦Ë????????? ```sql SELECT col @@ -425,16 +425,16 @@ FROM mytable WHERE col =2; ``` -# ²åÈë +# ???? -**ÆÕͨ²åÈë** +**???????** ```sql INSERT INTO mytable(col1, col2) VALUES(val1, val2); ``` -**²åÈë¼ìË÷³öÀ´µÄÊý¾Ý** +**?????????????????** ```sql INSERT INTO mytable1(col1, col2) @@ -442,14 +442,14 @@ SELECT col1, col2 FROM mytable2; ``` -**½«Ò»¸ö±íµÄÄÚÈݸ´ÖƵ½Ò»¸öбí** +**????????????????????¡À?** ```sql CREATE TABLE newtable AS SELECT * FROM mytable; ``` -# ¸üР+# ???? ```sql UPDATE mytable @@ -457,18 +457,18 @@ SET col = val WHERE id = 1; ``` -# ɾ³ý +# ??? ```sql DELETE FROM mytable WHERE id = 1; ``` -**TRUNCATE TABLE** ¿ÉÒÔÇå¿Õ±í£¬Ò²¾ÍÊÇɾ³ýËùÓÐÐС£ +**TRUNCATE TABLE** ?????????????????????§³? -ʹÓøüкÍɾ³ý²Ù×÷ʱһ¶¨ÒªÓà WHERE ×Ӿ䣬²»È»»á°ÑÕûÕűíµÄÊý¾Ý¶¼ÆÆ»µ¡£¿ÉÒÔÏÈÓà SELECT Óï¾ä½øÐвâÊÔ£¬·ÀÖ¹´íÎóɾ³ý¡£ +????????????????????? WHERE ????????????????????????????????? SELECT ?????§Ó???????????????? -# ´´½¨±í +# ?????? ```sql CREATE TABLE mytable ( @@ -479,38 +479,38 @@ CREATE TABLE mytable ( PRIMARY KEY (`id`)); ``` -# Ð޸ıí +# ???? -**Ìí¼ÓÁÐ** +**?????** ```sql ALTER TABLE mytable ADD col CHAR(20); ``` -**ɾ³ýÁÐ** +**?????** ```sql ALTER TABLE mytable DROP COLUMN col; ``` -**ɾ³ý±í** +**?????** ```sql DROP TABLE mytable; ``` -# ÊÓͼ +# ??? -ÊÓͼÊÇÐéÄâµÄ±í£¬±¾Éí²»°üº¬Êý¾Ý£¬Ò²¾Í²»ÄÜ¶ÔÆä½øÐÐË÷Òý²Ù×÷¡£¶ÔÊÓͼµÄ²Ù×÷ºÍ¶ÔÆÕͨ±íµÄ²Ù×÷Ò»Ñù¡£ +????????????????????????????????????????????????????????????????????????? -ÊÓͼ¾ßÓÐÈçϺô¦£º +??????????????? -1. ¼ò»¯¸´Ô SQL ²Ù×÷£¬±ÈÈ縴ÔÓµÄÁª½á£» -2. ֻʹÓÃʵ¼Ê±íµÄÒ»²¿·ÖÊý¾Ý£» -3. ͨ¹ýÖ»¸øÓû§·ÃÎÊÊÓͼµÄȨÏÞ£¬±£Ö¤Êý¾ÝµÄ°²È«ÐÔ£» -4. ¸ü¸ÄÊý¾Ý¸ñʽºÍ±íʾ¡£ +1. ?????? SQL ?????????¿y??????? +2. ??????????????????? +3. ??????????????????????????????????? +4. ???????????????? ```sql CREATE VIEW myview AS @@ -519,25 +519,25 @@ FROM mytable WHERE col5 = val; ``` -# ´æ´¢¹ý³Ì +# ?›¥???? -´æ´¢¹ý³Ì¿ÉÒÔ¿´³ÉÊǶÔһϵÁÐ SQL ²Ù×÷µÄÅú´¦Àí£» +?›¥????????????????? SQL ???????????? -**ʹÓô洢¹ý³ÌµÄºÃ´¦** +**???›¥???????** -1. °ÑʵÏÖ·â×°ÔÚÁË´æ´¢¹ý³ÌÖУ¬²»½ö¼òµ¥£¬Ò²±£Ö¤Á˰²È«ÐÔ£» -2. ¿ÉÒÔ¸´ÓôúÂ룻 -3. ÓÉÓÚÊÇÔ¤ÏȱàÒ룬Òò´Ë¾ßÓкܸߵÄÐÔÄÜ¡£ +1. ???????????›¥?????§µ??????????????????? +2. ?????????? +3. ?????????????????§Ü???????? -**´´½¨´æ´¢¹ý³Ì** +**?????›¥????** -ÃüÁîÐÐÖд´½¨´æ´¢¹ý³ÌÐèÒª×Ô¶¨Òå·Ö¸ô·û£¬ÒòΪÃüÁîÐÐÊÇÒÔ ; Ϊ½áÊø·û£¬¶ø´æ´¢¹ý³ÌÖÐÒ²°üº¬Á˷ֺţ¬Òò´Ë»á´íÎó°ÑÕⲿ·Ö·ÖºÅµ±³ÉÊǽáÊø·û£¬Ôì³ÉÓï·¨´íÎó¡£ +???????§Õ????›¥??????????????????????????????? ; ????????????›¥??????????????????????????????????????????????????? -°üº¬ in¡¢out ºÍ inout ÈýÖÖ²ÎÊý¡£ +???? in??out ?? inout ????????? -¸ø±äÁ¿¸³Öµ¶¼ÐèÒªÓà select into Óï¾ä¡£ +???????????????? select into ??? -ÿ´ÎÖ»ÄܸøÒ»¸ö±äÁ¿¸³Öµ£¬²»Ö§³Ö¼¯ºÏµÄ²Ù×÷¡£ +????????????????????????????????? ```sql delimiter // @@ -558,18 +558,18 @@ call myprocedure(@ret); select @ret; ``` -# Óαê +# ?¦Á? -ÔÚ´æ´¢¹ý³ÌÖÐʹÓÃÓαê¿ÉÒÔ¶ÔÒ»¸ö½á¹û¼¯½øÐÐÒÆ¶¯±éÀú¡£ +??›¥??????????¦Á?????????????????????????? -ÓαêÖ÷ÒªÓÃÓÚ½»»¥Ê½Ó¦Óã¬ÆäÖÐÓû§ÐèÒª¶ÔÊý¾Ý¼¯ÖеÄÈÎÒâÐнøÐÐä¯ÀÀºÍÐ޸ġ£ +?¦Á??????????????????????????????????§Ö??????§ß???????????? -**ʹÓÃÓαêµÄËĸö²½Ö裺** +**????¦Á????????Ñs** -1. ÉùÃ÷Óα꣬Õâ¸ö¹ý³ÌûÓÐʵ¼Ê¼ìË÷³öÊý¾Ý£» -2. ´ò¿ªÓαꣻ -3. È¡³öÊý¾Ý£» -4. ¹Ø±ÕÓαꣻ +1. ?????¦Á???????????????????????? +2. ???¦Á? +3. ???????? +4. ????¦Á? ```sql delimiter // @@ -579,7 +579,7 @@ create procedure myprocedure(out ret int) declare mycursor cursor for select col1 from mytable; - # ¶¨ÒåÁËÒ»¸öcontinue handler£¬µ± sqlstate '02000' Õâ¸öÌõ¼þ³öÏÖʱ£¬»áÖ´ÐÐ set done = 1 + # ?????????continue handler???? sqlstate '02000' ??????????????????? set done = 1 declare continue handler for sqlstate '02000' set done = 1; open mycursor; @@ -594,43 +594,43 @@ create procedure myprocedure(out ret int) delimiter ; ``` -# ´¥·¢Æ÷ +# ?????? -´¥·¢Æ÷»áÔÚij¸ö±íÖ´ÐÐÒÔÏÂÓï¾äʱ¶ø×Ô¶¯Ö´ÐУºDELETE¡¢INSERT¡¢UPDATE +?????????????????????????????????§µ?DELETE??INSERT??UPDATE -´¥·¢Æ÷±ØÐëÖ¸¶¨ÔÚÓï¾äÖ´ÐÐ֮ǰ»¹ÊÇÖ®ºó×Ô¶¯Ö´ÐУ¬Ö®Ç°Ö´ÐÐʹÓà BEFORE ¹Ø¼ü×Ö£¬Ö®ºóÖ´ÐÐʹÓà AFTER ¹Ø¼ü×Ö¡£BEFORE ÓÃÓÚÊý¾ÝÑéÖ¤ºÍ¾»»¯¡£ +???????????????????????????????????§µ????????? BEFORE ??????????????? AFTER ??????BEFORE ?????????????????? -INSERT ´¥·¢Æ÷°üº¬Ò»¸öÃûΪ NEW µÄÐéÄâ±í¡£ +INSERT ???????????????? NEW ??????? ```sql CREATE TRIGGER mytrigger AFTER INSERT ON mytable FOR EACH ROW SELECT NEW.col; ``` -DELETE ´¥·¢Æ÷°üº¬Ò»¸öÃûΪ OLD µÄÐéÄâ±í£¬²¢ÇÒÊÇÖ»¶ÁµÄ¡£ +DELETE ???????????????? OLD ??????????????????? -UPDATE ´¥·¢Æ÷°üº¬Ò»¸öÃûΪ NEW ºÍÒ»¸öÃûΪ OLD µÄÐéÄâ±í£¬ÆäÖÐ NEW ÊÇ¿ÉÒÔ±»Ð޸ĵأ¬¶ø OLD ÊÇÖ»¶ÁµÄ¡£ +UPDATE ???????????????? NEW ???????? OLD ??????????? NEW ????????????? OLD ???????? -¿ÉÒÔʹÓô¥·¢Æ÷À´½øÐÐÉ󼯏ú×Ù£¬°ÑÐ޸ļǼµ½ÁíÍâÒ»ÕűíÖС£ +???????????????????????????????????????????§³? -MySQL ²»ÔÊÐíÔÚ´¥·¢Æ÷ÖÐʹÓà CALL Óï¾ä £¬Ò²¾ÍÊDz»Äܵ÷Óô洢¹ý³Ì¡£ +MySQL ?????????????????? CALL ??? ?????????????›¥????? -# ÊÂÎñ´¦Àí +# ?????? -**»ù±¾ÊõÓï** +**????????** -1. ÊÂÎñ£¨transaction£©Ö¸Ò»×é SQL Óï¾ä£» -2. »ØÍË£¨rollback£©Ö¸³·ÏúÖ¸¶¨ SQL Óï¾äµÄ¹ý³Ì£» -3. Ìá½»£¨commit£©Ö¸½«Î´´æ´¢µÄ SQL Óï¾ä½á¹ûдÈëÊý¾Ý¿â±í£» -4. ±£Áôµã£¨savepoint£©Ö¸ÊÂÎñ´¦ÀíÖÐÉèÖõÄÁÙʱռλ·û£¨placeholder£©£¬Äã¿ÉÒÔ¶ÔËü·¢²¼»ØÍË£¨Óë»ØÍËÕû¸öÊÂÎñ´¦Àí²»Í¬£©¡£ +1. ????transaction?????? SQL ??? +2. ?????rollback?????????? SQL ???????? +3. ????commit?????¦Ä?›¥?? SQL ?????§Õ???????? +4. ??????savepoint????????????????????¦Ë????placeholder????????????????????????????????????????? -²»ÄÜ»ØÍË SELECT Óï¾ä£¬»ØÍË SELECT Óï¾äҲûÒâÒ壻Ҳ²»ÄÜ»ØÍË CRETE ºÍ DROP Óï¾ä¡£ +??????? SELECT ??????? SELECT ????????‰Ù???????? CRETE ?? DROP ??? -MySQL µÄÊÂÎñÌύĬÈÏÊÇÒþʽÌá½»£¬Ò²¾ÍÊÇÿִÐÐÒ»ÌõÓï¾ä¾Í»áÌá½»Ò»´Î¡£µ±³öÏÖ START TRANSACTION Óï¾äʱ£¬»á¹Ø±ÕÒþʽÌá½»£»µ± COMMIT »ò ROLLBACK Óï¾äÖ´Ðкó£¬ÊÂÎñ»á×Ô¶¯¹Ø±Õ£¬ÖØÐ»ָ´ÒþʽÌá½»¡£ +MySQL ?????????????????????????????????????????¦±??????? START TRANSACTION ??????????????????? COMMIT ?? ROLLBACK ?????§Ü?????????????????????????? -ͨ¹ýÉèÖà autocommit Ϊ 0 ¿ÉÒÔÈ¡Ïû×Ô¶¯Ìá½»£¬Ö±µ½ autocommit ±»ÉèÖÃΪ 1 ²Å»áÌá½»£»autocommit ±ê¼ÇÊÇÕë¶Ôÿ¸öÁ¬½Ó¶ø²»ÊÇÕë¶Ô·þÎñÆ÷µÄ¡£ +??????? autocommit ? 0 ????????????????? autocommit ??????? 1 ???????autocommit ??????????????????????????????? -Èç¹ûûÓÐÉèÖñ£Áôµã£¬ROLLBACK »á»ØÍ˵½ START TRANSACTION Óï¾ä´¦£»Èç¹ûÉèÖÃÁ˱£Áôµã£¬²¢ÇÒÔÚ ROLLBACK ÖÐÖ¸¶¨¸Ã±£Áôµã£¬Ôò»á»ØÍ˵½¸Ã±£Áôµã¡£ +???????????????ROLLBACK ?????? START TRANSACTION ????????????????????????? ROLLBACK ?????????????????????????? ```sql START TRANSACTION @@ -642,15 +642,15 @@ ROLLBACK TO delete1 COMMIT ``` -# ×Ö·û¼¯ +# ????? -**»ù±¾ÊõÓï** +**????????** -1. ×Ö·û¼¯Îª×ÖĸºÍ·ûºÅµÄ¼¯ºÏ£» -2. ±àÂëΪij¸ö×Ö·û¼¯³ÉÔ±µÄÄÚ²¿±íʾ£» -3. У¶Ô×Ö·ûÖ¸¶¨ÈçºÎ±È½Ï£¬Ö÷ÒªÓÃÓÚÅÅÐòºÍ·Ö×é¡£ +1. ??????????????????? +2. ?????????????????????????? +3. §µ??????????¦Á?????????????????î• -³ýÁ˸ø±íÖ¸¶¨×Ö·û¼¯ºÍУ¶ÔÍ⣬Ҳ¿ÉÒÔ¸øÁÐÖ¸¶¨£º +?????????????????§µ????????????????? ```sql CREATE TABLE mytable @@ -658,7 +658,7 @@ CREATE TABLE mytable DEFAULT CHARACTER SET hebrew COLLATE hebrew_general_ci; ``` -¿ÉÒÔÔÚÅÅÐò¡¢·Ö×éʱָ¶¨Ð£¶Ô£º +?????????????????§µ??? ```sql SELECT * @@ -666,67 +666,67 @@ FROM mytable ORDER BY col COLLATE latin1_general_ci; ``` -# ȨÏÞ¹ÜÀí +# ?????? -MySQL µÄÕË»§ÐÅÏ¢±£´æÔÚ mysql Õâ¸öÊý¾Ý¿âÖС£ +MySQL ?????????????? mysql ?????????§³? ```sql USE mysql; SELECT user FROM user; ``` -**´´½¨ÕË»§** +**???????** ```sql CREATE USER myuser IDENTIFIED BY 'mypassword'; ``` -д´½¨µÄÕË»§Ã»ÓÐÈκÎȨÏÞ¡£ +??????????????¦Ê????? -**ÐÞ¸ÄÕË»§Ãû** +**????????** ```sql RENAME myuser TO newuser; ``` -**ɾ³ýÕË»§** +**??????** ```sql DROP USER myuser; ``` -**²é¿´È¨ÏÞ** +**?????** ```sql SHOW GRANTS FOR myuser; ``` ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c73aa08e-a987-43c9-92be-adea4a884c25.png) -ÕË»§Óà username@host µÄÐÎʽ¶¨Ò壬username@% ʹÓõÄÊÇĬÈÏÖ÷»úÃû¡£ +????? username@host ????????ÈÉusername@% ????????????????? -**ÊÚÓèȨÏÞ** +**???????** ```sql GRANT SELECT, INSERT ON mydatabase.* TO myuser; ``` -**ɾ³ýȨÏÞ** +**??????** ```sql REVOKE SELECT, INSERT ON mydatabase.* FROM myuser; ``` -GRANT ºÍ REVOKE ¿ÉÔÚ¼¸¸ö²ã´ÎÉÏ¿ØÖÆ·ÃÎÊȨÏÞ£º +GRANT ?? REVOKE ?????????????????????? -- Õû¸ö·þÎñÆ÷£¬Ê¹Óà GRANT ALLºÍ REVOKE ALL£» -- Õû¸öÊý¾Ý¿â£¬Ê¹Óà ON database.\*£» -- ÌØ¶¨µÄ±í£¬Ê¹Óà ON database.table£» -- ÌØ¶¨µÄÁУ» -- ÌØ¶¨µÄ´æ´¢¹ý³Ì¡£ +- ??????????????? GRANT ALL?? REVOKE ALL?? +- ???????????? ON database.\*?? +- ????????? ON database.table?? +- ??????§µ? +- ?????›¥????? -**¸ü¸ÄÃÜÂë** +**????????** -±ØÐëʹÓà Password() º¯Êý +??????? Password() ???? ```sql SET PASSWROD FOR myuser = Password('newpassword'); diff --git a/notes/剑指 offer 题解.md b/notes/剑指 offer 题解.md index 51793e1b..5108480c 100644 --- a/notes/剑指 offer 题解.md +++ b/notes/剑指 offer 题解.md @@ -1,89 +1,89 @@ -* [µÚ¶þÕÂ ÃæÊÔÐèÒªµÄ»ù´¡ÖªÊ¶](#µÚ¶þÕÂ-ÃæÊÔÐèÒªµÄ»ù´¡ÖªÊ¶) - * [2. ʵÏÖ Singleton](#2-ʵÏÖ-singleton) - * [3. Êý×éÖÐÖØ¸´µÄÊý×Ö](#3-Êý×éÖÐÖØ¸´µÄÊý×Ö) - * [4. ¶þάÊý×éÖеIJéÕÒ](#4-¶þάÊý×éÖеIJéÕÒ) - * [5. Ìæ»»¿Õ¸ñ](#5-Ìæ»»¿Õ¸ñ) - * [6. ´Óβµ½Í·´òÓ¡Á´±í](#6-´Óβµ½Í·´òÓ¡Á´±í) - * [7. ÖØ½¨¶þ²æÊ÷](#7-ÖØ½¨¶þ²æÊ÷) - * [8. ¶þ²æÊ÷µÄÏÂÒ»¸ö½áµã](#8-¶þ²æÊ÷µÄÏÂÒ»¸ö½áµã) - * [9. ÓÃÁ½¸öջʵÏÖ¶ÓÁÐ](#9-ÓÃÁ½¸öջʵÏÖ¶ÓÁÐ) - * [10.1 ì³²¨ÄÇÆõÊýÁÐ](#101-ì³²¨ÄÇÆõÊýÁÐ) - * [10.2 ÌøÌ¨½×](#102-ÌøÌ¨½×) - * [10.3 ±äÌ¬ÌøÌ¨½×](#103-±äÌ¬ÌøÌ¨½×) - * [10.4 ¾ØÐθ²¸Ç](#104-¾ØÐθ²¸Ç) - * [11. ÐýתÊý×éµÄ×îСÊý×Ö](#11-ÐýתÊý×éµÄ×îСÊý×Ö) - * [12. ¾ØÕóÖеÄ·¾¶](#12-¾ØÕóÖеÄ·¾¶) - * [13. »úÆ÷È˵ÄÔ˶¯·¶Î§](#13-»úÆ÷È˵ÄÔ˶¯·¶Î§) - * [14. ¼ôÉþ×Ó](#14-¼ôÉþ×Ó) - * [15. ¶þ½øÖÆÖÐ 1 µÄ¸öÊý](#15-¶þ½øÖÆÖÐ-1-µÄ¸öÊý) -* [µÚÈýÕ ¸ßÖÊÁ¿µÄ´úÂë](#µÚÈýÕÂ-¸ßÖÊÁ¿µÄ´úÂë) - * [16. ÊýÖµµÄÕûÊý´Î·½](#16-ÊýÖµµÄÕûÊý´Î·½) - * [18. ɾ³ýÁ´±íÖÐÖØ¸´µÄ½áµã](#18-ɾ³ýÁ´±íÖÐÖØ¸´µÄ½áµã) - * [19. ÕýÔò±í´ïʽƥÅä](#19-ÕýÔò±í´ïʽƥÅä) - * [20. ±íʾÊýÖµµÄ×Ö·û´®](#20-±íʾÊýÖµµÄ×Ö·û´®) - * [21. µ÷ÕûÊý×é˳ÐòÊ¹ÆæÊýλÓÚżÊýÇ°Ãæ](#21-µ÷ÕûÊý×é˳ÐòÊ¹ÆæÊýλÓÚżÊýÇ°Ãæ) - * [22. Á´±íÖе¹ÊýµÚ k ¸ö½áµã](#22-Á´±íÖе¹ÊýµÚ-k-¸ö½áµã) - * [23. Á´±íÖл·µÄÈë¿Ú½áµã](#23-Á´±íÖл·µÄÈë¿Ú½áµã) - * [24. ·´×ªÁ´±í](#24-·´×ªÁ´±í) - * [25. ºÏ²¢Á½¸öÅÅÐòµÄÁ´±í](#25-ºÏ²¢Á½¸öÅÅÐòµÄÁ´±í) - * [26. Ê÷µÄ×ӽṹ](#26-Ê÷µÄ×ӽṹ) -* [µÚËÄÕ ½â¾öÃæÊÔÌâµÄ˼·](#µÚËÄÕÂ-½â¾öÃæÊÔÌâµÄ˼·) - * [27. ¶þ²æÊ÷µÄ¾µÏñ](#27-¶þ²æÊ÷µÄ¾µÏñ) - * [28.1 ¶Ô³ÆµÄ¶þ²æÊ÷](#281-¶Ô³ÆµÄ¶þ²æÊ÷) - * [28.2 ƽºâ¶þ²æÊ÷](#282-ƽºâ¶þ²æÊ÷) - * [29. ˳ʱÕë´òÓ¡¾ØÕó](#29-˳ʱÕë´òÓ¡¾ØÕó) - * [30. °üº¬ min º¯ÊýµÄÕ»](#30-°üº¬-min-º¯ÊýµÄÕ») - * [31. Õ»µÄѹÈë¡¢µ¯³öÐòÁÐ](#31-Õ»µÄѹÈ뵯³öÐòÁÐ) - * [32.1 ´ÓÉÏÍùÏ´òÓ¡¶þ²æÊ÷](#321-´ÓÉÏÍùÏ´òÓ¡¶þ²æÊ÷) - * [32.3 °Ñ¶þ²æÊ÷´òÓ¡³É¶àÐÐ](#323--°Ñ¶þ²æÊ÷´òÓ¡³É¶àÐÐ) - * [32.3 °´Ö®×ÖÐÎ˳Ðò´òÓ¡¶þ²æÊ÷](#323-°´Ö®×ÖÐÎ˳Ðò´òÓ¡¶þ²æÊ÷) - * [33. ¶þ²æËÑË÷Ê÷µÄºóÐò±éÀúÐòÁÐ](#33-¶þ²æËÑË÷Ê÷µÄºóÐò±éÀúÐòÁÐ) - * [34. ¶þ²æÊ÷ÖкÍΪijһֵµÄ·¾¶](#34-¶þ²æÊ÷ÖкÍΪijһֵµÄ·¾¶) - * [35. ¸´ÔÓÁ´±íµÄ¸´ÖÆ](#35-¸´ÔÓÁ´±íµÄ¸´ÖÆ) - * [36. ¶þ²æËÑË÷Ê÷ÓëË«ÏòÁ´±í](#36-¶þ²æËÑË÷Ê÷ÓëË«ÏòÁ´±í) - * [37. ÐòÁл¯¶þ²æÊ÷](#37-ÐòÁл¯¶þ²æÊ÷) - * [38. ×Ö·û´®µÄÅÅÁÐ](#38-×Ö·û´®µÄÅÅÁÐ) -* [µÚÎåÕ ÓÅ»¯Ê±¼äºÍ¿Õ¼äЧÂÊ](#µÚÎåÕÂ-ÓÅ»¯Ê±¼äºÍ¿Õ¼äЧÂÊ) - * [39. Êý×éÖгöÏÖ´ÎÊý³¬¹ýÒ»°ëµÄÊý×Ö](#39-Êý×éÖгöÏÖ´ÎÊý³¬¹ýÒ»°ëµÄÊý×Ö) - * [40. ×îСµÄ K ¸öÊý](#40-×îСµÄ-k-¸öÊý) - * [41.1 Êý¾ÝÁ÷ÖеÄÖÐλÊý](#411-Êý¾ÝÁ÷ÖеÄÖÐλÊý) - * [14.2 ×Ö·ûÁ÷ÖеÚÒ»¸ö²»Öظ´µÄ×Ö·û](#142-×Ö·ûÁ÷ÖеÚÒ»¸ö²»Öظ´µÄ×Ö·û) - * [42. Á¬Ðø×ÓÊý×éµÄ×î´óºÍ](#42-Á¬Ðø×ÓÊý×éµÄ×î´óºÍ) - * [43. ´Ó 1 µ½ n ÕûÊýÖÐ 1 ³öÏֵĴÎÊý](#43-´Ó-1-µ½-n-ÕûÊýÖÐ-1-³öÏֵĴÎÊý) - * [45. °ÑÊý×éÅųÉ×îСµÄÊý](#45-°ÑÊý×éÅųÉ×îСµÄÊý) - * [49. ³óÊý](#49-³óÊý) - * [50. µÚÒ»¸öÖ»³öÏÖÒ»´ÎµÄ×Ö·ûλÖÃ](#50-µÚÒ»¸öÖ»³öÏÖÒ»´ÎµÄ×Ö·ûλÖÃ) - * [51. Êý×éÖеÄÄæÐò¶Ô](#51-Êý×éÖеÄÄæÐò¶Ô) - * [52. Á½¸öÁ´±íµÄµÚÒ»¸ö¹«¹²½áµã](#52-Á½¸öÁ´±íµÄµÚÒ»¸ö¹«¹²½áµã) -* [µÚÁùÕÂ ÃæÊÔÖеĸ÷ÏîÄÜÁ¦](#µÚÁùÕÂ-ÃæÊÔÖеĸ÷ÏîÄÜÁ¦) - * [53 Êý×ÖÔÚÅÅÐòÊý×éÖгöÏֵĴÎÊý](#53-Êý×ÖÔÚÅÅÐòÊý×éÖгöÏֵĴÎÊý) - * [54. ¶þ²æËÑË÷Ê÷µÄµÚ k ¸ö½áµã](#54-¶þ²æËÑË÷Ê÷µÄµÚ-k-¸ö½áµã) - * [55 ¶þ²æÊ÷µÄÉî¶È](#55-¶þ²æÊ÷µÄÉî¶È) - * [56. Êý×éÖÐÖ»³öÏÖÒ»´ÎµÄÊý×Ö](#56-Êý×éÖÐÖ»³öÏÖÒ»´ÎµÄÊý×Ö) - * [57.1 ºÍΪ S µÄÁ½¸öÊý×Ö](#571-ºÍΪ-s-µÄÁ½¸öÊý×Ö) - * [57.2 ºÍΪ S µÄÁ¬ÐøÕýÊýÐòÁÐ](#572-ºÍΪ-s-µÄÁ¬ÐøÕýÊýÐòÁÐ) - * [58.1 ·­×ªµ¥´Ê˳ÐòÁÐ](#581-·­×ªµ¥´Ê˳ÐòÁÐ) - * [58.2 ×óÐýת×Ö·û´®](#582-×óÐýת×Ö·û´®) - * [59. »¬¶¯´°¿ÚµÄ×î´óÖµ](#59-»¬¶¯´°¿ÚµÄ×î´óÖµ) - * [61. ÆË¿ËÅÆË³×Ó](#61-ÆË¿ËÅÆË³×Ó) - * [62. ԲȦÖÐ×îºóʣϵÄÊý](#62-ԲȦÖÐ×îºóʣϵÄÊý) - * [63. ¹ÉƱµÄ×î´óÀûÈó](#63-¹ÉƱµÄ×î´óÀûÈó) - * [64. Çó 1+2+3+...+n](#64-Çó-1+2+3++n) - * [65. ²»ÓüӼõ³Ë³ý×ö¼Ó·¨](#65-²»ÓüӼõ³Ë³ý×ö¼Ó·¨) - * [66. ¹¹½¨³Ë»ýÊý×é](#66-¹¹½¨³Ë»ýÊý×é) -* [µÚÆßÕ Á½¸öÃæÊÔ°¸Àý](#µÚÆßÕÂ-Á½¸öÃæÊÔ°¸Àý) - * [67. °Ñ×Ö·û´®×ª»»³ÉÕûÊý](#67-°Ñ×Ö·û´®×ª»»³ÉÕûÊý) - * [68. Ê÷ÖÐÁ½¸ö½ÚµãµÄ×îµÍ¹«¹²×æÏÈ](#68-Ê÷ÖÐÁ½¸ö½ÚµãµÄ×îµÍ¹«¹²×æÏÈ) +* [????? ??????????????](#?????-??????????????) + * [2. ??? Singleton](#2-???-singleton) + * [3. ???????????????](#3-???????????????) + * [4. ????????§Ö????](#4-????????§Ö????) + * [5. ?�I???](#5-?�I???) + * [6. ??¦Â??????????](#6-??¦Â??????????) + * [7. ?????????](#7-?????????) + * [8. ????????????????](#8-????????????????) + * [9. ?????????????](#9-?????????????) + * [10.1 ??????????](#101-??????????) + * [10.2 ?????](#102-?????) + * [10.3 ????????](#103-????????) + * [10.4 ???¦È???](#104-???¦È???) + * [11. ??????????§³????](#11-??????????§ã????) + * [12. ?????§Ö?¡¤??](#12-?????§Ö?¡¤??) + * [13. ????????????¦¶](#13-????????????¦Ö) + * [14. ??????](#14-??????) + * [15. ???????? 1 ?????](#15-????????-1-?????) +* [?????? ???????????](#??????-???????????) + * [16. ??????????¦Ç?](#16-??????????¦Ç?) + * [18. ????????????????](#18-????????????????) + * [19. ??????????](#19-??????????) + * [20. ?????????????](#20-?????????????) + * [21. ????????????????¦Ë????????](#21-????????????????¦Ë????????) + * [22. ?????§Ö????? k ?????](#22-?????§Ö?????-k-?????) + * [23. ?????§Ý????????](#23-?????§Ý????????) + * [24. ???????](#24-???????) + * [25. ????????????????](#25-????????????????) + * [26. ???????](#26-???????) +* [?????? ???????????¡¤](#??????-???????????¡¤) + * [27. ???????????](#27-???????????) + * [28.1 ?????????](#281-?????????) + * [28.2 ????????](#282-????????) + * [29. ??????????](#29-??????????) + * [30. ???? min ???????](#30-????-min-???????) + * [31. ??????????????](#31-??????????????) + * [32.1 ????????????????](#321-????????????????) + * [32.3 ???????????????](#323--???????????????) + * [32.3 ??????????????????](#323-??????????????????) + * [33. ??????????????????????](#33-??????????????????????) + * [34. ???????§Ü???????¡¤??](#34-???????§Ü???????¡¤??) + * [35. ????????????](#35-????????????) + * [36. ???????????????????](#36-???????????????????) + * [37. ???§Ý???????](#37-???§Ý???????) + * [38. ???????????](#38-???????????) +* [?????? ?????????§¹??](#??????-?????????§é??) + * [39. ?????§Ô??????????????????](#39-?????§Ô??????????????????) + * [40. ??§³?? K ????](#40-??§ã??-k-????) + * [41.1 ???????§Ö???¦Ë??](#411-???????§Ö???¦Ë??) + * [14.2 ??????§Ö??????????????](#142-??????§Ö??????????????) + * [42. ???????????????](#42-???????????????) + * [43. ?? 1 ?? n ?????? 1 ????????](#43-??-1-??-n-??????-1-????????) + * [45. ???????????§³????](#45-???????????§ã????) + * [49. ????](#49-????) + * [50. ????????????¦Å????¦Ë??](#50-????????????¦Å????¦Ë??) + * [51. ?????§Ö??????](#51-?????§Ö??????) + * [52. ????????????????????](#52-????????????????????) +* [?????? ?????§Ö????????](#??????-?????§Ö????????) + * [53 ???????????????§Ô???????](#53-???????????????§Ô???????) + * [54. ????????????? k ?????](#54-?????????????-k-?????) + * [55 ???????????](#55-???????????) + * [56. ?????????????¦Å?????](#56-?????????????¦Å?????) + * [57.1 ??? S ??????????](#571-???-s-??????????) + * [57.2 ??? S ??????????????](#572-???-s-??????????????) + * [58.1 ????????????](#581-????????????) + * [58.2 ??????????](#582-??????????) + * [59. ?????????????](#59-?????????????) + * [61. ????????](#61-????????) + * [62. ?????????????](#62-?????????????) + * [63. ????????????](#63-????????????) + * [64. ?? 1+2+3+...+n](#64-??-1+2+3++n) + * [65. ???¨¹??????????](#65-???¨¹??????????) + * [66. ???????????](#66-???????????) +* [?????? ???????????](#??????-???????????) + * [67. ????????????????](#67-????????????????) + * [68. ??????????????????????](#68-??????????????????????) -# µÚ¶þÕÂ ÃæÊÔÐèÒªµÄ»ù´¡ÖªÊ¶ +# ????? ?????????????? -## 2. ʵÏÖ Singleton +## 2. ??? Singleton -**¾­µäʵÏÖ** +**???????** -ÒÔÏÂʵÏÖÖУ¬Ë½Óо²Ì¬±äÁ¿±»ÑÓ³Ù»¯ÊµÀý»¯£¬ÕâÑù×öµÄºÃ´¦ÊÇ£¬Èç¹ûûÓÐÓõ½¸ÃÀ࣬ÄÇô¾Í²»»á´´½¨¸Ã˽Óо²Ì¬±äÁ¿£¬´Ó¶ø½ÚÔ¼×ÊÔ´¡£Õâ¸öʵÏÖÔÚ¶àÏ̻߳·¾³ÏÂÊDz»°²È«µÄ£¬ÒòΪ¶à¸öÏß³ÌÄܹ»Í¬Ê±½øÈë if(uniqueInstance == null) ÄÚµÄÓï¾ä¿é£¬ÄÇô¾Í»á¶à´ÎʵÀý»¯ uniqueInstance ˽Óо²Ì¬±äÁ¿¡£ +????????§µ???§à???????????????????????????????????????????????????????????§à??????????????????????????????????????????????????????????????? if(uniqueInstance == null) ??????ï…????????????? uniqueInstance ??§à???????? ```java public class Singleton { @@ -99,9 +99,9 @@ public class Singleton { } ``` -**Ï̲߳»°²È«ÎÊÌâµÄ½â¾ö·½°¸Ò»** +**???????????????????** -Ö»ÐèÒª¶Ô getUniqueInstance() ·½·¨¼ÓËø£¬¾ÍÄÜÈø÷½·¨Ò»´ÎÖ»ÄÜÒ»¸öÏ̷߳ÃÎÊ£¬´Ó¶ø±ÜÃâÁË¶Ô uniqueInstance ±äÁ¿½øÐжà´ÎʵÀý»¯µÄÎÊÌâ¡£µ«ÊÇÕâÑùÓÐÒ»¸öÎÊÌâÊÇÒ»´ÎÖ»ÄÜÒ»¸öÏ߳̽øÈ룬ÐÔÄÜÉÏ»áÓÐÒ»¶¨µÄÀË·Ñ¡£ +?????? getUniqueInstance() ????????????????¡Â????????????????????????????? uniqueInstance ???????§Ø????????????????????????????????????????????????????????????????? ```java public static synchronized Singleton getUniqueInstance() { @@ -111,17 +111,17 @@ public static synchronized Singleton getUniqueInstance() { return uniqueInstance; } ``` -**Ï̲߳»°²È«ÎÊÌâµÄ½â¾ö·½°¸¶þ** +**????????????????????** -²»ÓÃÑÓ³ÙʵÀý»¯£¬²ÉÓÃÖ±½ÓʵÀý»¯¡£ +???????????????????????????? ```java private static Singleton uniqueInstance = new Singleton(); ``` -**Ï̲߳»°²È«ÎÊÌâµÄ½â¾ö·½°¸Èý** +**????????????????????** -¿¼ÂǵÚÒ»¸ö½â¾ö·½°¸£¬ËüÊÇÖ±½Ó¶Ô getUniqueInstance() ·½·¨½øÐмÓËø£¬¶øÊµ¼ÊÉÏÖ»ÐèÒª¶Ô uniqueInstance = new Singleton(); ÕâÌõÓï¾ä¼ÓËø¼´¿É¡£Ê¹ÓÃÁ½¸öÌõ¼þÓï¾äÀ´ÅÐ¶Ï uniqueInstance ÊÇ·ñÒѾ­ÊµÀý»¯£¬Èç¹ûûÓÐʵÀý»¯²ÅÐèÒª¼ÓËø¡£ +????????????????????????? getUniqueInstance() ???????§Þ?????????????????? uniqueInstance = new Singleton(); ?????????????¨À??????????????????§Ø? uniqueInstance ??????????????????????????????????? ```java public class Singleton { @@ -141,15 +141,15 @@ public class Singleton { } ``` -## 3. Êý×éÖÐÖØ¸´µÄÊý×Ö +## 3. ??????????????? -**ÌâÄ¿ÃèÊö** +**???????** -ÔÚÒ»¸ö³¤¶ÈΪ n µÄÊý×éÀïµÄËùÓÐÊý×Ö¶¼ÔÚ 0 µ½ n-1 µÄ·¶Î§ÄÚ¡£ Êý×éÖÐijЩÊý×ÖÊÇÖØ¸´µÄ£¬µ«²»ÖªµÀÓм¸¸öÊý×ÖÊÇÖØ¸´µÄ¡£Ò²²»ÖªµÀÿ¸öÊý×ÖÖØ¸´¼¸´Î¡£ÇëÕÒ³öÊý×éÖÐÈÎÒâÒ»¸öÖØ¸´µÄÊý×Ö¡£ ÀýÈ磬Èç¹ûÊäÈ볤¶ÈΪ 7 µÄÊý×é {2, 3, 1, 0, 2, 5, 3}£¬ÄÇô¶ÔÓ¦µÄÊä³öÊǵÚÒ»¸öÖØ¸´µÄÊý×Ö 2¡£ +?????????? n ???????????????????? 0 ?? n-1 ???¦¶??? ???????§»????????????????????§Þ??????????????????????????????????¦±????????????????????????????? ???íà?????????? 7 ?????? {2, 3, 1, 0, 2, 5, 3}???????????????????????????? 2?? -**½âÌâ˼·** +**?????¡¤** -ÕâÖÖÊý×éÔªËØÔÚ [0, n-1] ·¶Î§ÄÚµÄÎÊÌ⣬¿ÉÒÔ½«ÖµÎª i µÄÔªËØ·Åµ½µÚ i ¸öλÖÃÉÏ¡£ +????????????? [0, n-1] ??¦¶?????????????? i ????????? i ??¦Ë????? ```java public boolean duplicate(int numbers[], int length, int[] duplication) { @@ -172,11 +172,11 @@ private void swap(int[] numbers, int i, int j) { } ``` -## 4. ¶þάÊý×éÖеIJéÕÒ +## 4. ????????§Ö???? -**ÌâÄ¿ÃèÊö** +**???????** -ÔÚÒ»¸ö¶þάÊý×éÖУ¬Ã¿Ò»Ðж¼°´ÕÕ´Ó×óµ½ÓÒµÝÔöµÄ˳ÐòÅÅÐò£¬Ã¿Ò»Áж¼°´ÕÕ´ÓÉϵ½ÏµÝÔöµÄ˳ÐòÅÅÐò¡£ÇëÍê³ÉÒ»¸öº¯Êý£¬ÊäÈëÕâÑùµÄÒ»¸ö¶þάÊý×éºÍÒ»¸öÕûÊý£¬ÅжÏÊý×éÖÐÊÇ·ñº¬ÓиÃÕûÊý¡£ +?????????????§µ????§Ø?????????????????????????§Ø????????????????????????????????????????????????????????????????????§Ø???????????§Ú??????? ```java public boolean Find(int target, int [][] array) { @@ -192,21 +192,21 @@ public boolean Find(int target, int [][] array) { } ``` -## 5. Ìæ»»¿Õ¸ñ +## 5. ?�I??? -**ÌâÄ¿ÃèÊö** +**???????** -ÇëʵÏÖÒ»¸öº¯Êý£¬½«Ò»¸ö×Ö·û´®ÖеĿոñÌæ»»³É¡°%20¡±¡£ÀýÈ磬µ±×Ö·û´®Îª We Are Happy. Ôò¾­¹ýÌæ»»Ö®ºóµÄ×Ö·û´®Îª We%20Are%20Happy¡£ +?????????????????????????§Ö????�I?¨À?%20???????íà???????? We Are Happy. ????�I?????????? We%20Are%20Happy?? -**ÌâĿҪÇó** +**??????** -ÒÔ O(1) µÄ¿Õ¼ä¸´ÔÓ¶ÈÀ´Çó½â¡£ +?? O(1) ???ÁÙ???????? ```java public String replaceSpace(StringBuffer str) { int n = str.length(); for (int i = 0; i < n; i++) { - if (str.charAt(i) == ' ') str.append(" "); // β²¿Ìî³äÁ½¸ö + if (str.charAt(i) == ' ') str.append(" "); // ¦Â????????? } int idxOfOriginal = n - 1; @@ -225,9 +225,9 @@ public String replaceSpace(StringBuffer str) { } ``` -## 6. ´Óβµ½Í·´òÓ¡Á´±í +## 6. ??¦Â?????????? -ÕýÏò±éÀúÈ»ºóµ÷Óà Collections.reverse(). +????????????? Collections.reverse(). ```java public ArrayList printListFromTailToHead(ListNode listNode) { @@ -241,7 +241,7 @@ public ArrayList printListFromTailToHead(ListNode listNode) { } ``` -µÝ¹é +??? ```java public ArrayList printListFromTailToHead(ListNode listNode) { @@ -254,11 +254,11 @@ public ArrayList printListFromTailToHead(ListNode listNode) { } ``` -²»Ê¹Óÿ⺯Êý£¬²¢ÇÒ²»Ê¹ÓõݹéµÄµü´úʵÏÖ£¬ÀûÓÃÁ´±íµÄÍ·²å·¨ÎªÄæÐòµÄÌØÐÔ¡£ +???????????????????????????????????????¾Þ??????????? ```java public ArrayList printListFromTailToHead(ListNode listNode) { - ListNode head = new ListNode(-1); // Í·½áµã + ListNode head = new ListNode(-1); // ???? ListNode cur = listNode; while (cur != null) { ListNode next = cur.next; @@ -276,11 +276,11 @@ public ArrayList printListFromTailToHead(ListNode listNode) { } ``` -## 7. ÖØ½¨¶þ²æÊ÷ +## 7. ????????? -**ÌâÄ¿ÃèÊö** +**???????** -¸ù¾Ý¶þ²æÊ÷µÄǰÐò±éÀúºÍÖÐÐò±éÀúµÄ½á¹û£¬Öؽ¨³ö¸Ã¶þ²æÊ÷¡£ +?????????????????????????????????????????????? ```java public TreeNode reConstructBinaryTree(int[] pre, int[] in) { @@ -300,11 +300,11 @@ private TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int[] in, } ``` -## 8. ¶þ²æÊ÷µÄÏÂÒ»¸ö½áµã +## 8. ???????????????? -**ÌâÄ¿ÃèÊö** +**???????** -¸ø¶¨Ò»¸ö¶þ²æÊ÷ºÍÆäÖеÄÒ»¸ö½áµã£¬ÇëÕÒ³öÖÐÐò±éÀú˳ÐòµÄÏÂÒ»¸ö½áµã²¢ÇÒ·µ»Ø¡£×¢Ò⣬Ê÷ÖеĽáµã²»½ö°üº¬×óÓÒ×Ó½áµã£¬Í¬Ê±°üº¬Ö¸Ïò¸¸½áµãµÄÖ¸Õë¡£ +??????????????????§Ö???????????????????????????????????????????§Ö???????????????????????????????? ```java public TreeLinkNode GetNext(TreeLinkNode pNode) { @@ -325,7 +325,7 @@ public TreeLinkNode GetNext(TreeLinkNode pNode) { } ``` -## 9. ÓÃÁ½¸öջʵÏÖ¶ÓÁÐ +## 9. ????????????? ```java Stack stack1 = new Stack(); @@ -345,7 +345,7 @@ public int pop() { } ``` -## 10.1 ì³²¨ÄÇÆõÊýÁÐ +## 10.1 ?????????? ```java private int[] fib = new int[40]; @@ -363,7 +363,7 @@ public int Fibonacci(int n) { } ``` -## 10.2 ÌøÌ¨½× +## 10.2 ????? ```java public int JumpFloor(int target) { @@ -378,7 +378,7 @@ public int JumpFloor(int target) { } ``` -## 10.3 ±äÌ¬ÌøÌ¨½× +## 10.3 ???????? ```java public int JumpFloorII(int target) { @@ -393,11 +393,11 @@ public int JumpFloorII(int target) { } ``` -## 10.4 ¾ØÐθ²¸Ç +## 10.4 ???¦È??? -**ÌâÄ¿ÃèÊö** +**???????** -ÎÒÃÇ¿ÉÒÔÓà 2\*1 µÄС¾ØÐκá×Å»òÕßÊú×ÅÈ¥¸²¸Ç¸ü´óµÄ¾ØÐΡ£ÇëÎÊÓà n ¸ö 2\*1 µÄС¾ØÐÎÎÞÖØµþµØ¸²¸ÇÒ»¸ö 2\*n µÄ´ó¾ØÐΣ¬×ܹ²ÓжàÉÙÖÖ·½·¨£¿ +????????? 2\*1 ??§³???¦Ê?????????????????????¦±??????? n ?? 2\*1 ??§³????????????????? 2\*n ?????¦²?????§Ø?????????? ```java public int RectCover(int target) { @@ -407,11 +407,11 @@ public int RectCover(int target) { ``` -## 11. ÐýתÊý×éµÄ×îСÊý×Ö +## 11. ??????????§³???? -**ÌâÄ¿ÃèÊö** +**???????** -°ÑÒ»¸öÊý×é×ʼµÄÈô¸É¸öÔªËØ°áµ½Êý×éµÄĩ⣬ÎÒÃdzÆÖ®ÎªÊý×éµÄÐýת¡£ ÊäÈëÒ»¸ö·ÇµÝ¼õÅÅÐòµÄÊý×éµÄÒ»¸öÐýת£¬Êä³öÐýתÊý×éµÄ×îÐ¡ÔªËØ¡£ ÀýÈçÊý×é {3, 4, 5, 1, 2} Ϊ {1, 2, 3, 4, 5} µÄÒ»¸öÐýת£¬¸ÃÊý×éµÄ×îСֵΪ 1¡£ NOTE£º¸ø³öµÄËùÓÐÔªËØ¶¼´óÓÚ 0£¬ÈôÊý×é´óСΪ 0£¬Çë·µ»Ø 0¡£ +?????????????????????????????¦Â??????????????????? ??????????????????????????????????????????§³???? ???????? {3, 4, 5, 1, 2} ? {1, 2, 3, 4, 5} ???????????????????§³?? 1?? NOTE???????????????????? 0?????????§³? 0?????? 0?? ```java public int minNumberInRotateArray(int[] array) { @@ -423,11 +423,11 @@ public int minNumberInRotateArray(int[] array) { } ``` -## 12. ¾ØÕóÖеÄ·¾¶ +## 12. ?????§Ö?¡¤?? -**ÌâÄ¿ÃèÊö** +**???????** -ÇëÉè¼ÆÒ»¸öº¯Êý£¬ÓÃÀ´ÅжÏÔÚÒ»¸ö¾ØÕóÖÐÊÇ·ñ´æÔÚÒ»Ìõ°üº¬Ä³×Ö·û´®ËùÓÐ×Ö·ûµÄ·¾¶¡£Â·¾¶¿ÉÒÔ´Ó¾ØÕóÖеÄÈÎÒâÒ»¸ö¸ñ×Ó¿ªÊ¼£¬Ã¿Ò»²½¿ÉÒÔÔÚ¾ØÕóÖÐÏò×ó£¬ÏòÓÒ£¬ÏòÉÏ£¬ÏòÏÂÒÆ¶¯Ò»¸ö¸ñ×Ó¡£Èç¹ûÒ»Ìõ·¾¶¾­¹ýÁ˾ØÕóÖеÄijһ¸ö¸ñ×Ó£¬Ôò¸Ã·¾¶²»ÄÜÔÙ½øÈë¸Ã¸ñ×Ó¡£ ÀýÈç a b c e s f c s a d e e ¾ØÕóÖаüº¬Ò»Ìõ×Ö·û´® "bcced" µÄ·¾¶£¬µ«ÊǾØÕóÖв»°üº¬ "abcb" ·¾¶£¬ÒòΪ×Ö·û´®µÄµÚÒ»¸ö×Ö·û b Õ¼¾ÝÁ˾ØÕóÖеĵÚÒ»Ðеڶþ¸ö¸ñ×ÓÖ®ºó£¬Â·¾¶²»ÄÜÔٴνøÈë¸Ã¸ñ×Ó¡£ +???????????????????§Ø????????????????????????????????????????¡¤????¡¤???????????§Ö??????????????????????????????????????????????????????????????????¡¤????????????§Ö?????????????¡¤???????????????? ???? a b c e s f c s a d e e ?????§Ñ??????????? "bcced" ??¡¤????????????§Ó????? "abcb" ¡¤????????????????????? b ?????????§Ö????§Ö???????????¡¤????????¦Í???????? ```java private int[][] next = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}}; @@ -464,11 +464,11 @@ private boolean backtracking(char[][] m, int rows, int cols, char[] str, boolean ``` -## 13. »úÆ÷È˵ÄÔ˶¯·¶Î§ +## 13. ????????????¦¶ -**ÌâÄ¿ÃèÊö** +**???????** -µØÉÏÓÐÒ»¸ö m ÐÐºÍ n Áеķ½¸ñ¡£Ò»¸ö»úÆ÷ÈË´Ó×ø±ê 0, 0 µÄ¸ñ×Ó¿ªÊ¼Òƶ¯£¬Ã¿Ò»´ÎÖ»ÄÜÏò×ó£¬ÓÒ£¬ÉÏ£¬ÏÂËĸö·½ÏòÒÆ¶¯Ò»¸ñ£¬µ«ÊDz»ÄܽøÈëÐÐ×ø±êºÍÁÐ×ø±êµÄÊýλ֮ºÍ´óÓÚ k µÄ¸ñ×Ó¡£ ÀýÈ磬µ± k Ϊ 18 ʱ£¬»úÆ÷ÈËÄܹ»½øÈë·½¸ñ£¨35, 37£©£¬ÒòΪ 3+5+3+7 = 18¡£µ«ÊÇ£¬Ëü²»ÄܽøÈë·½¸ñ£¨35, 38£©£¬ÒòΪ 3+5+3+8 = 19¡£ÇëÎʸûúÆ÷ÈËÄܹ»´ïµ½¶àÉÙ¸ö¸ñ×Ó£¿ +????????? m ?§Ü? n ?§Ö?????????????????? 0, 0 ?????????????????????????????????????????????????????????????????????¦Ë?????? k ?????? ???íà?? k ? 18 ??????????????????35, 37??????? 3+5+3+7 = 18??????????????????35, 38??????? 3+5+3+8 = 19??????????????????????????? ```java private int cnt = 0; @@ -510,15 +510,15 @@ private void initDigitSum(int rows, int cols) { } ``` -## 14. ¼ôÉþ×Ó +## 14. ?????? -**ÌâÄ¿ÃèÊö** +**???????** -°ÑÒ»¸ùÉþ×Ó¼ô³É¶à¶Î£¬²¢ÇÒʹµÃÿ¶ÎµÄ³¤¶È³Ë»ý×î´ó¡£ +?????????????¦²??????????¦Å????????? -**½âÌâ˼·** +**?????¡¤** -¾¡¿ÉÄܶàµÃ¼ô³¤¶ÈΪ 3 µÄÉþ×Ó£¬²¢ÇÒ²»ÔÊÐíÓ㤶ÈΪ 1 µÄÉþ×Ó³öÏÖ£¬Èç¹û³öÏÖÁË£¬¾Í´ÓÒѾ­Çкó¤¶ÈΪ 3 µÄÉþ×ÓÖÐÄóöÒ»¶ÎÓ볤¶ÈΪ 1 µÄÉþ×ÓÖØÐÂ×éºÏ£¬°ÑËüÃÇÇгÉÁ½¶Î³¤¶ÈΪ 2 µÄÉþ×Ó¡£ +???????¨¹?????? 3 ?????????????????§Ô???? 1 ???????????????????????????§Ü¨®???? 3 ?????????¨®????????? 1 ?????????????????????§Ô????¦Ã???? 2 ??????? ```java int maxProductAfterCuttin(int length) { @@ -532,7 +532,7 @@ int maxProductAfterCuttin(int length) { } ``` -## 15. ¶þ½øÖÆÖÐ 1 µÄ¸öÊý +## 15. ???????? 1 ????? ```java public int NumberOf1(int n) { @@ -540,7 +540,7 @@ public int NumberOf1(int n) { } ``` -n&(n-1) ¸ÃλÔËËãÊÇÈ¥³ý n µÄλ¼¶±íʾÖÐ×îµÍµÄÄÇһλ¡£ÀýÈç¶ÔÓÚ¶þ½øÖƱíʾ 10110100£¬¼õÈ¥ 1 µÃµ½ 10110011£¬ÕâÁ½¸öÊýÏàÓëµÃµ½ 10110000¡£ +n&(n-1) ??¦Ë????????? n ??¦Ë??????????????¦Ë???????????????? 10110100????? 1 ??? 10110011???????????????? 10110000?? ```java public int NumberOf1(int n) { @@ -554,9 +554,9 @@ public int NumberOf1(int n) { ``` -# µÚÈýÕ ¸ßÖÊÁ¿µÄ´úÂë +# ?????? ??????????? -## 16. ÊýÖµµÄÕûÊý´Î·½ +## 16. ??????????¦Ç? ```java public double Power(double base, int exponent) { @@ -573,7 +573,7 @@ public double Power(double base, int exponent) { } ``` -## 18. ɾ³ýÁ´±íÖÐÖØ¸´µÄ½áµã +## 18. ???????????????? ```java public ListNode deleteDuplication(ListNode pHead) { @@ -592,11 +592,11 @@ public ListNode deleteDuplication(ListNode pHead) { } ``` -## 19. ÕýÔò±í´ïʽƥÅä +## 19. ?????????? -**ÌâÄ¿ÃèÊö** +**???????** -ÇëʵÏÖÒ»¸öº¯ÊýÓÃÀ´Æ¥Åä°üÀ¨ '.' ºÍ '\*' µÄÕýÔò±í´ïʽ¡£Ä£Ê½ÖеÄ×Ö·û '.' ±íʾÈÎÒâÒ»¸ö×Ö·û£¬¶ø '\*' ±íʾËüÇ°ÃæµÄ×Ö·û¿ÉÒÔ³öÏÖÈÎÒâ´Î£¨°üº¬ 0 ´Î£©¡£ ÔÚ±¾ÌâÖУ¬Æ¥ÅäÊÇÖ¸×Ö·û´®µÄËùÓÐ×Ö·ûÆ¥ÅäÕû¸öģʽ¡£ÀýÈ磬×Ö·û´® "aaa" Óëģʽ "a.a" ºÍ "ab\*ac\*a" Æ¥Å䣬µ«ÊÇÓë "aa.a" ºÍ "ab\*a" ¾ù²»Æ¥Åä +?????????????????????? '.' ?? '\*' ??????????????§Ö???? '.' ????????????????? '\*' ???????????????????????¦²????? 0 ?¦²??? ??????§µ???????????????????????????????????íà????? "aaa" ???? "a.a" ?? "ab\*ac\*a" ????????? "aa.a" ?? "ab\*a" ??????? ```java public boolean match(char[] str, char[] pattern) { @@ -619,11 +619,11 @@ public boolean match(char[] str, char[] pattern) { } ``` -## 20. ±íʾÊýÖµµÄ×Ö·û´® +## 20. ????????????? -**ÌâÄ¿ÃèÊö** +**???????** -ÇëʵÏÖÒ»¸öº¯ÊýÓÃÀ´ÅжÏ×Ö·û´®ÊÇ·ñ±íʾÊýÖµ£¨°üÀ¨ÕûÊýºÍСÊý£©¡£ÀýÈ磬×Ö·û´® "+100","5e2","-123","3.1416" ºÍ "-1E-16" ¶¼±íʾÊýÖµ¡£ µ«ÊÇ "12e","1a3.14","1.2.3","+-5" ºÍ "12e+4.3" ¶¼²»ÊÇ¡£ +?????????????????§Ø??????????????????????????§³?????????íà????? "+100","5e2","-123","3.1416" ?? "-1E-16" ?????????? ???? "12e","1a3.14","1.2.3","+-5" ?? "12e+4.3" ??????? ```java public boolean isNumeric(char[] str) { @@ -632,10 +632,10 @@ public boolean isNumeric(char[] str) { } ``` -## 21. µ÷ÕûÊý×é˳ÐòÊ¹ÆæÊýλÓÚżÊýÇ°Ãæ +## 21. ????????????????¦Ë???????? -ʱ¼ä¸´ÔÓ¶È : O(n2) -¿Õ¼ä¸´ÔÓ¶È : O(1) +??ÁÙ??? : O(n2) +??ÁÙ??? : O(1) ```java public void reOrderArray(int[] array) { @@ -655,8 +655,8 @@ public void reOrderArray(int[] array) { } ``` -ʱ¼ä¸´ÔÓ¶È : O(n) -¿Õ¼ä¸´ÔÓ¶È : O(n) +??ÁÙ??? : O(n) +??ÁÙ??? : O(n) ```java public void reOrderArray(int[] array) { @@ -671,7 +671,7 @@ public void reOrderArray(int[] array) { } ``` -## 22. Á´±íÖе¹ÊýµÚ k ¸ö½áµã +## 22. ?????§Ö????? k ????? ```java public ListNode FindKthToTail(ListNode head, int k) { @@ -690,7 +690,7 @@ public ListNode FindKthToTail(ListNode head, int k) { -## 23. Á´±íÖл·µÄÈë¿Ú½áµã +## 23. ?????§Ý???????? ```java public ListNode EntryNodeOfLoop(ListNode pHead) { @@ -712,7 +712,7 @@ public ListNode EntryNodeOfLoop(ListNode pHead) { } ``` -## 24. ·´×ªÁ´±í +## 24. ??????? ```java public ListNode ReverseList(ListNode head) { @@ -727,7 +727,7 @@ public ListNode ReverseList(ListNode head) { } ``` -## 25. ºÏ²¢Á½¸öÅÅÐòµÄÁ´±í +## 25. ???????????????? ```java public ListNode Merge(ListNode list1, ListNode list2) { @@ -749,7 +749,7 @@ public ListNode Merge(ListNode list1, ListNode list2) { } ``` -## 26. Ê÷µÄ×ӽṹ +## 26. ??????? ```java public boolean HasSubtree(TreeNode root1, TreeNode root2) { @@ -766,9 +766,9 @@ private boolean isSubtree(TreeNode root1, TreeNode root2) { } ``` -# µÚËÄÕ ½â¾öÃæÊÔÌâµÄ˼· +# ?????? ???????????¡¤ -## 27. ¶þ²æÊ÷µÄ¾µÏñ +## 27. ??????????? ```java public void Mirror(TreeNode root) { @@ -781,7 +781,7 @@ public void Mirror(TreeNode root) { } ``` -## 28.1 ¶Ô³ÆµÄ¶þ²æÊ÷ +## 28.1 ????????? ```java boolean isSymmetrical(TreeNode pRoot) { @@ -797,7 +797,7 @@ boolean isSymmetrical(TreeNode t1, TreeNode t2) { } ``` -## 28.2 ƽºâ¶þ²æÊ÷ +## 28.2 ???????? ```java private boolean isBalanced = true; @@ -816,7 +816,7 @@ private int height(TreeNode root) { } ``` -## 29. ˳ʱÕë´òÓ¡¾ØÕó +## 29. ?????????? ```java public ArrayList printMatrix(int[][] matrix) { @@ -833,7 +833,7 @@ public ArrayList printMatrix(int[][] matrix) { } ``` -## 30. °üº¬ min º¯ÊýµÄÕ» +## 30. ???? min ??????? ```java private Stack stack = new Stack<>(); @@ -861,7 +861,7 @@ public int min() { } ``` -## 31. Õ»µÄѹÈë¡¢µ¯³öÐòÁÐ +## 31. ?????????????? ```java public boolean IsPopOrder(int[] pushA, int[] popA) { @@ -878,7 +878,7 @@ public boolean IsPopOrder(int[] pushA, int[] popA) { } ``` -## 32.1 ´ÓÉÏÍùÏ´òÓ¡¶þ²æÊ÷ +## 32.1 ???????????????? ```java public ArrayList PrintFromTopToBottom(TreeNode root) { @@ -899,7 +899,7 @@ public ArrayList PrintFromTopToBottom(TreeNode root) { } ``` -## 32.3 °Ñ¶þ²æÊ÷´òÓ¡³É¶àÐÐ +## 32.3 ??????????????? ```java ArrayList> Print(TreeNode pRoot) { @@ -922,7 +922,7 @@ ArrayList> Print(TreeNode pRoot) { } ``` -## 32.3 °´Ö®×ÖÐÎ˳Ðò´òÓ¡¶þ²æÊ÷ +## 32.3 ?????????????????? ```java public ArrayList> Print(TreeNode pRoot) { @@ -953,7 +953,7 @@ public ArrayList> Print(TreeNode pRoot) { ``` -## 33. ¶þ²æËÑË÷Ê÷µÄºóÐò±éÀúÐòÁÐ +## 33. ?????????????????????? ```java public boolean VerifySquenceOfBST(int[] sequence) { @@ -976,7 +976,7 @@ private boolean verify(int[] sequence, int start, int end) { } ``` -## 34. ¶þ²æÊ÷ÖкÍΪijһֵµÄ·¾¶ +## 34. ???????§Ü???????¡¤?? ```java private ArrayList> ret = new ArrayList<>(); @@ -1000,21 +1000,21 @@ private void dfs(TreeNode node, int target, int curSum, ArrayList path) } ``` -## 35. ¸´ÔÓÁ´±íµÄ¸´ÖÆ +## 35. ???????????? -**ÌâÄ¿ÃèÊö** +**???????** -ÊäÈëÒ»¸ö¸´ÔÓÁ´±í£¨Ã¿¸ö½ÚµãÖÐÓнڵãÖµ£¬ÒÔ¼°Á½¸öÖ¸Õ룬һ¸öÖ¸ÏòÏÂÒ»¸ö½Úµã£¬ÁíÒ»¸öÌØÊâÖ¸ÕëÖ¸ÏòÈÎÒâÒ»¸ö½Úµã£©£¬·µ»Ø½á¹ûΪ¸´Öƺó¸´ÔÓÁ´±íµÄ head¡££¨×¢Ò⣬Êä³ö½á¹ûÖÐÇë²»Òª·µ»Ø²ÎÊýÖеĽڵãÒýÓ㬷ñÔòÅÐÌâ³ÌÐò»áÖ±½Ó·µ»Ø¿Õ£© +????????????????????????§ß??????????????????????????????????????????????????????????????????????????? head??????????????????????????§Ö???????????????????????????? -µÚÒ»²½£¬ÔÚÿ¸ö½ÚµãµÄºóÃæ²åÈë¸´ÖÆµÄ½Úµã¡£ +??????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/f8b12555-967b-423d-a84e-bc9eff104b8b.jpg) -µÚ¶þ²½£¬¶Ô¸´ÖƽڵãµÄ random Á´½Ó½øÐи³Öµ¡£ +??????????????? random ??????§Ú???? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/7b877a2a-8fd1-40d8-a34c-c445827300b8.jpg) -µÚÈý²½£¬²ð·Ö¡£ +???????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/b2b6253c-c701-4b30-aff4-bc3c713542a7.jpg) @@ -1022,7 +1022,7 @@ private void dfs(TreeNode node, int target, int curSum, ArrayList path) ```java public RandomListNode Clone(RandomListNode pHead) { if (pHead == null) return null; - // ²åÈëнڵã + // ???????? RandomListNode cur = pHead; while (cur != null) { RandomListNode node = new RandomListNode(cur.label); @@ -1030,7 +1030,7 @@ public RandomListNode Clone(RandomListNode pHead) { cur.next = node; cur = node.next; } - // ½¨Á¢ random Á´½Ó + // ???? random ???? cur = pHead; while (cur != null) { RandomListNode clone = cur.next; @@ -1039,7 +1039,7 @@ public RandomListNode Clone(RandomListNode pHead) { } cur = clone.next; } - // ²ð·Ö + // ??? RandomListNode pCloneHead = pHead.next; cur = pHead; while (cur.next != null) { @@ -1051,11 +1051,11 @@ public RandomListNode Clone(RandomListNode pHead) { } ``` -## 36. ¶þ²æËÑË÷Ê÷ÓëË«ÏòÁ´±í +## 36. ??????????????????? -**ÌâÄ¿ÃèÊö** +**???????** -ÊäÈëÒ»¿Ã¶þ²æËÑË÷Ê÷£¬½«¸Ã¶þ²æËÑË÷Ê÷ת»»³ÉÒ»¸öÅÅÐòµÄË«ÏòÁ´±í¡£ÒªÇó²»ÄÜ´´½¨ÈκÎеĽáµã£¬Ö»Äܵ÷ÕûÊ÷ÖнáµãÖ¸ÕëµÄÖ¸Ïò¡£ +????????????????????????????????????????????????????????????¦Ê???????????????§ß????????? ```java private TreeNode pre = null; @@ -1076,7 +1076,7 @@ private void inOrder(TreeNode node) { } ``` -## 37. ÐòÁл¯¶þ²æÊ÷ +## 37. ???§Ý??????? ```java private String serizeString = ""; @@ -1109,11 +1109,11 @@ private TreeNode Deserialize() { } ``` -## 38. ×Ö·û´®µÄÅÅÁÐ +## 38. ??????????? -**ÌâÄ¿ÃèÊö** +**???????** -ÊäÈëÒ»¸ö×Ö·û´® , °´×ÖµäÐò´òÓ¡³ö¸Ã×Ö·û´®ÖÐ×Ö·ûµÄËùÓÐÅÅÁС£ÀýÈçÊäÈë×Ö·û´® abc, Ôò´òÓ¡³öÓÉ×Ö·û a, b, c ËùÄÜÅÅÁгöÀ´µÄËùÓÐ×Ö·û´® abc, acb, bac, bca, cab ºÍ cba¡£ +???????????? , ????????????????????????????????§³?????????????? abc, ??????????? a, b, c ???????§Ô?????????????? abc, acb, bac, bca, cab ?? cba?? ```java private ArrayList ret = new ArrayList<>(); @@ -1133,7 +1133,7 @@ private void backtracking(char[] chars, boolean[] used, String s) { } for (int i = 0; i < chars.length; i++) { if (used[i]) continue; - if (i != 0 && chars[i] == chars[i - 1] && !used[i - 1]) continue; // ±£Ö¤²»Öظ´ + if (i != 0 && chars[i] == chars[i - 1] && !used[i - 1]) continue; // ???????? used[i] = true; backtracking(chars, used, s + chars[i]); used[i] = false; @@ -1141,9 +1141,9 @@ private void backtracking(char[] chars, boolean[] used, String s) { } ``` -# µÚÎåÕ ÓÅ»¯Ê±¼äºÍ¿Õ¼äЧÂÊ +# ?????? ?????????§¹?? -## 39. Êý×éÖгöÏÖ´ÎÊý³¬¹ýÒ»°ëµÄÊý×Ö +## 39. ?????§Ô?????????????????? ```java public int MoreThanHalfNum_Solution(int[] array) { @@ -1165,12 +1165,12 @@ public int MoreThanHalfNum_Solution(int[] array) { ``` -## 40. ×îСµÄ K ¸öÊý +## 40. ??§³?? K ???? -¹¹½¨´óСΪ k µÄС¶¥¶Ñ¡£ +??????§³? k ??§³????? -ʱ¼ä¸´ÔÓ¶È£ºO(nlgk) -¿Õ¼ä¸´ÔÓ¶È£ºO(k) +??ÁÙ????O(nlgk) +??ÁÙ????O(k) ```java public ArrayList GetLeastNumbers_Solution(int[] input, int k) { @@ -1187,10 +1187,10 @@ public ArrayList GetLeastNumbers_Solution(int[] input, int k) { } ``` -ÀûÓÿìËÙÑ¡Ôñ +?????????? -ʱ¼ä¸´ÔÓ¶È£ºO(n) -¿Õ¼ä¸´ÔÓ¶È£ºO(1) +??ÁÙ????O(n) +??ÁÙ????O(1) ```java public ArrayList GetLeastNumbers_Solution(int[] input, int k) { @@ -1245,22 +1245,22 @@ private boolean less(int v, int w) { } ``` -## 41.1 Êý¾ÝÁ÷ÖеÄÖÐλÊý +## 41.1 ???????§Ö???¦Ë?? -**ÌâÄ¿ÃèÊö** +**???????** -ÈçºÎµÃµ½Ò»¸öÊý¾ÝÁ÷ÖеÄÖÐλÊý£¿Èç¹û´ÓÊý¾ÝÁ÷ÖжÁ³öÆæÊý¸öÊýÖµ£¬ÄÇôÖÐλÊý¾ÍÊÇËùÓÐÊýÖµÅÅÐòÖ®ºóλÓÚÖмäµÄÊýÖµ¡£Èç¹û´ÓÊý¾ÝÁ÷ÖжÁ³öżÊý¸öÊýÖµ£¬ÄÇôÖÐλÊý¾ÍÊÇËùÓÐÊýÖµÅÅÐòÖ®ºóÖмäÁ½¸öÊýµÄƽ¾ùÖµ¡£ +??¦Å????????????§Ö???¦Ë????????????????§Ø???????????????????¦Ë????????????????????¦Ë???§Þ???????????????????§Ø??????????????????¦Ë?????????????????????§Þ??????????????? ```java -private PriorityQueue maxHeap = new PriorityQueue<>((o1, o2) -> o2-o1); // ʵÏÖ×ó±ß²¿·Ö -private PriorityQueue minHeep = new PriorityQueue<>(); // ʵÏÖÓұ߲¿·Ö£¬Óұ߲¿·ÖËùÓÐÔªËØ´óÓÚ×ó±ß²¿·Ö +private PriorityQueue maxHeap = new PriorityQueue<>((o1, o2) -> o2-o1); // ????????? +private PriorityQueue minHeep = new PriorityQueue<>(); // ???????????????????????????????? private int cnt = 0; public void Insert(Integer num) { - // ²åÈëÒª±£Ö¤Á½¸ö¶Ñ´æÓÚÆ½ºâ״̬ + // ?????????????????????? if(cnt % 2 == 0) { - // ΪżÊýµÄÇé¿öϲåÈëµ½×îС¶Ñ£¬ÏȾ­¹ý×î´ó¶Ñɸѡ£¬ÕâÑù¾ÍÄܱ£Ö¤×î´ó¶ÑÖеÄÔªËØ¶¼Ð¡ÓÚ×îС¶ÑÖеÄÔªËØ + // ????????????????§³???????????????????????????????§Ö?????§³????§³???§Ö???? maxHeap.add(num); minHeep.add(maxHeap.poll()); } else { @@ -1279,11 +1279,11 @@ public Double GetMedian() { } ``` -## 14.2 ×Ö·ûÁ÷ÖеÚÒ»¸ö²»Öظ´µÄ×Ö·û +## 14.2 ??????§Ö?????????????? -**ÌâÄ¿ÃèÊö** +**???????** -ÇëʵÏÖÒ»¸öº¯ÊýÓÃÀ´ÕÒ³ö×Ö·ûÁ÷ÖеÚÒ»¸öÖ»³öÏÖÒ»´ÎµÄ×Ö·û¡£ÀýÈ磬µ±´Ó×Ö·ûÁ÷ÖÐÖ»¶Á³öǰÁ½¸ö×Ö·û "go" ʱ£¬µÚÒ»¸öÖ»³öÏÖÒ»´ÎµÄ×Ö·ûÊÇ "g"¡£µ±´Ó¸Ã×Ö·ûÁ÷ÖжÁ³öǰÁù¸ö×Ö·û¡°google" ʱ£¬µÚÒ»¸öÖ»³öÏÖÒ»´ÎµÄ×Ö·ûÊÇ "l"¡£ +?????????????????????????§Ö???????????¦Å?????????íà???????????????????????? "go" ???????????????¦Å?????? "g"?????????????§Ø?????????????google" ???????????????¦Å?????? "l"?? ```java //Insert one char from stringstream @@ -1306,7 +1306,7 @@ public char FirstAppearingOnce() { ``` -## 42. Á¬Ðø×ÓÊý×éµÄ×î´óºÍ +## 42. ??????????????? ```java public int FindGreatestSumOfSubArray(int[] array) { @@ -1322,9 +1322,9 @@ public int FindGreatestSumOfSubArray(int[] array) { } ``` -## 43. ´Ó 1 µ½ n ÕûÊýÖÐ 1 ³öÏֵĴÎÊý +## 43. ?? 1 ?? n ?????? 1 ???????? -½âÌâ²Î¿¼£º[Leetcode : 233. Number of Digit One](https://leetcode.com/problems/number-of-digit-one/discuss/64381/4+-lines-O(log-n)-C++JavaPython) +????¦Ï???[Leetcode : 233. Number of Digit One](https://leetcode.com/problems/number-of-digit-one/discuss/64381/4+-lines-O(log-n)-C++JavaPython) ```java public int NumberOf1Between1AndN_Solution(int n) { @@ -1337,11 +1337,11 @@ public int NumberOf1Between1AndN_Solution(int n) { } ``` -## 45. °ÑÊý×éÅųÉ×îСµÄÊý +## 45. ???????????§³???? -**ÌâÄ¿ÃèÊö** +**???????** -ÊäÈëÒ»¸öÕýÕûÊýÊý×飬°ÑÊý×éÀïËùÓÐÊý×ÖÆ´½ÓÆðÀ´ÅųÉÒ»¸öÊý£¬´òÓ¡ÄÜÆ´½Ó³öµÄËùÓÐÊý×ÖÖÐ×îСµÄÒ»¸ö¡£ÀýÈçÊäÈëÊý×é {3£¬32£¬321}£¬Ôò´òÓ¡³öÕâÈý¸öÊý×ÖÄÜÅųɵÄ×îСÊý×ÖΪ 321323¡£ +????????????????ï…????????????????????????????????????????????????????????§³??????????????????? {3??32??321}??????????????????????????§³????? 321323?? ```java public String PrintMinNumber(int[] numbers) { @@ -1355,11 +1355,11 @@ public String PrintMinNumber(int[] numbers) { } ``` -## 49. ³óÊý +## 49. ???? -**ÌâÄ¿ÃèÊö** +**???????** -°ÑÖ»°üº¬Òò×Ó 2¡¢3 ºÍ 5 µÄÊý³Æ×÷³óÊý£¨Ugly Number£©¡£ÀýÈç 6¡¢8 ¶¼ÊdzóÊý£¬µ« 14 ²»ÊÇ£¬ÒòΪËü°üº¬Òò×Ó 7¡£ ϰ¹ßÉÏÎÒÃÇ°Ñ 1 µ±×öÊǵÚÒ»¸ö³óÊý¡£Çó°´´ÓСµ½´óµÄ˳ÐòµÄµÚ N ¸ö³óÊý¡£ +??????????? 2??3 ?? 5 ??????????????Ugly Number???????? 6??8 ??????????? 14 ?????????????????? 7?? ?????????? 1 ???????????????????§³?????????? N ???????? ```java public int GetUglyNumber_Solution(int index) { @@ -1380,7 +1380,7 @@ public int GetUglyNumber_Solution(int index) { } ``` -## 50. µÚÒ»¸öÖ»³öÏÖÒ»´ÎµÄ×Ö·ûλÖà +## 50. ????????????¦Å????¦Ë?? ```java public int FirstNotRepeatingChar(String str) { @@ -1391,7 +1391,7 @@ public int FirstNotRepeatingChar(String str) { } ``` -## 51. Êý×éÖеÄÄæÐò¶Ô +## 51. ?????§Ö?????? ```java private long cnt = 0; @@ -1418,7 +1418,7 @@ private void merge(int[] a, int start, int mid, int end) { else if (a[i] < a[j]) tmp[k] = a[i++]; else { tmp[k] = a[j++]; - this.cnt += mid - i + 1; // a[i] > a[j] £¬ËµÃ÷ a[i...mid] ¶¼´óÓÚ a[j] + this.cnt += mid - i + 1; // a[i] > a[j] ????? a[i...mid] ?????? a[j] } k++; } @@ -1429,7 +1429,7 @@ private void merge(int[] a, int start, int mid, int end) { } ``` -## 52. Á½¸öÁ´±íµÄµÚÒ»¸ö¹«¹²½áµã +## 52. ???????????????????? ```java public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { @@ -1444,9 +1444,9 @@ public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { } ``` -# µÚÁùÕÂ ÃæÊÔÖеĸ÷ÏîÄÜÁ¦ +# ?????? ?????§Ö???????? -## 53 Êý×ÖÔÚÅÅÐòÊý×éÖгöÏֵĴÎÊý +## 53 ???????????????§Ô??????? @@ -1464,7 +1464,7 @@ public int GetNumberOfK(int[] array, int k) { } ``` -## 54. ¶þ²æËÑË÷Ê÷µÄµÚ k ¸ö½áµã +## 54. ????????????? k ????? ```java TreeNode ret; @@ -1485,7 +1485,7 @@ private void inorder(TreeNode root, int k) { } ``` -## 55 ¶þ²æÊ÷µÄÉî¶È +## 55 ??????????? ```java public int TreeDepth(TreeNode root) { @@ -1494,25 +1494,25 @@ public int TreeDepth(TreeNode root) { } ``` -## 56. Êý×éÖÐÖ»³öÏÖÒ»´ÎµÄÊý×Ö +## 56. ?????????????¦Å????? -**ÌâÄ¿ÃèÊö** +**???????** -Ò»¸öÕûÐÍÊý×éÀï³ýÁËÁ½¸öÊý×ÖÖ®Í⣬ÆäËûµÄÊý×Ö¶¼³öÏÖÁËÁ½´Î£¬ÕÒ³öÕâÁ½¸öÊý¡£ +???????????????????????????????????????????????¦²?????????????? -**½âÌâ˼·** +**?????¡¤** -Á½¸ö²»ÏàµÈµÄÔªËØÔÚλ¼¶±íʾÉϱض¨»áÓÐһλ´æÔÚ²»Í¬¡£ +???????????????¦Ë??????????????¦Ë???????? -½«Êý×éµÄËùÓÐÔªËØÒì»òµÃµ½µÄ½á¹ûΪ²»´æÔÚÖØ¸´µÄÁ½¸öÔªËØÒì»òµÄ½á¹û¡£ +?????????????????????????????????????????????????? -diff &= -diff µÃµ½³ö diff ×îÓҲ಻Ϊ 0 µÄ룬Ҳ¾ÍÊDz»´æÔÚÖØ¸´µÄÁ½¸öÔªËØÔÚλ¼¶±íʾÉÏ×îÓҲ಻ͬµÄÄÇһ룬ÀûÓÃÕâһλ¾Í¿ÉÒÔ½«Á½¸öÔªËØÇø·Ö¿ªÀ´¡£ +diff &= -diff ????? diff ?????? 0 ??¦Ë??????????????????????????¦Ë??????????????????¦Ë?????????¦Ë?????????????????????? ```java public void FindNumsAppearOnce(int[] array, int num1[], int num2[]) { int diff = 0; for (int num : array) diff ^= num; - // µÃµ½×îÓÒһλ + // ????????¦Ë diff &= -diff; for (int num : array) { if ((num & diff) == 0) num1[0] ^= num; @@ -1521,11 +1521,11 @@ public void FindNumsAppearOnce(int[] array, int num1[], int num2[]) { } ``` -## 57.1 ºÍΪ S µÄÁ½¸öÊý×Ö +## 57.1 ??? S ?????????? -**ÌâÄ¿ÃèÊö** +**???????** -ÊäÈëÒ»¸öµÝÔöÅÅÐòµÄÊý×éºÍÒ»¸öÊý×Ö S£¬ÔÚÊý×éÖвéÕÒÁ½¸öÊý£¬ÊǵÄËûÃǵĺÍÕýºÃÊÇ S£¬Èç¹ûÓжà¶ÔÊý×ֵĺ͵ÈÓÚ S£¬Êä³öÁ½¸öÊýµÄ³Ë»ý×îСµÄ¡£ +???????????????????????????? S?????????§Ó?????????????????????????? S??????§Ø??????????? S?????????????????§³??? ```java public ArrayList FindNumbersWithSum(int[] array, int sum) { @@ -1540,11 +1540,11 @@ public ArrayList FindNumbersWithSum(int[] array, int sum) { } ``` -## 57.2 ºÍΪ S µÄÁ¬ÐøÕýÊýÐòÁÐ +## 57.2 ??? S ?????????????? -**ÌâÄ¿ÃèÊö** +**???????** -ºÍΪ 100 µÄÁ¬ÐøÐòÁÐÓÐ 18, 19, 20, 21, 22 +??? 100 ???????????? 18, 19, 20, 21, 22 ```java public ArrayList> FindContinuousSequence(int sum) { @@ -1575,13 +1575,13 @@ public ArrayList> FindContinuousSequence(int sum) { } ``` -## 58.1 ·­×ªµ¥´Ê˳ÐòÁÐ +## 58.1 ???????????? -**ÌâÄ¿ÃèÊö** +**???????** -ÊäÈ룺"I am a student." +????"I am a student." -Êä³ö£º"student. a am I" +?????"student. a am I" ```java public String ReverseSentence(String str) { @@ -1611,11 +1611,11 @@ private void reverse(char[] c, int start, int end) { } ``` -## 58.2 ×óÐýת×Ö·û´® +## 58.2 ?????????? -**ÌâÄ¿ÃèÊö** +**???????** -¶ÔÓÚÒ»¸ö¸ø¶¨µÄ×Ö·ûÐòÁÐ S£¬ÇëÄã°ÑÆäÑ­»·×óÒÆ K λºóµÄÐòÁÐÊä³ö¡£ÀýÈ磬×Ö·ûÐòÁÐ S=¡±abcXYZdef¡±, ÒªÇóÊä³öÑ­»·×óÒÆ 3 λºóµÄ½á¹û£¬¼´¡°XYZdefabc¡±¡£ +???????????????????? S???????????????? K ¦Ë???????????????íà??????? S=??abcXYZdef??, ????????????? 3 ¦Ë???????????XYZdefabc???? ```java public String LeftRotateString(String str, int n) { @@ -1638,11 +1638,11 @@ private void reverse(char[] c, int i, int j) { } ``` -## 59. »¬¶¯´°¿ÚµÄ×î´óÖµ +## 59. ????????????? -**ÌâÄ¿ÃèÊö** +**???????** -¸ø¶¨Ò»¸öÊý×éºÍ»¬¶¯´°¿ÚµÄ´óС£¬ÕÒ³öËùÓ묶¯´°¿ÚÀïÊýÖµµÄ×î´óÖµ¡£ÀýÈ磬Èç¹ûÊäÈëÊý×é {2, 3, 4, 2, 6, 2, 5, 1} ¼°»¬¶¯´°¿ÚµÄ´óС 3£¬ÄÇôһ¹²´æÔÚ 6 ¸ö»¬¶¯´°¿Ú£¬ËûÃǵÄ×î´óÖµ·Ö±ðΪ {4, 4, 6, 6, 6, 5}£» +?????????????????????§³????????§Ý???????????????????????íà??????????? {2, 3, 4, 2, 6, 2, 5, 1} ????????????§³ 3???????????? 6 ???????????????????????? {4, 4, 6, 6, 6, 5}?? ```java public ArrayList maxInWindows(int[] num, int size) { @@ -1660,11 +1660,11 @@ public ArrayList maxInWindows(int[] num, int size) { } ``` -## 61. ÆË¿ËÅÆË³×Ó +## 61. ???????? -**ÌâÄ¿ÃèÊö** +**???????** -ÎåÕÅÅÆ£¬ÆäÖдóС¹íΪñ®×Ó£¬ÅÆÃæ´óСΪ 0¡£ÅжÏÊÇ·ñÄÜ×é³É˳×Ó¡£ +??????????§Õ?§³????????????§³? 0???§Ø????????????? ```java public boolean isContinuous(int[] numbers) { @@ -1682,15 +1682,15 @@ public boolean isContinuous(int[] numbers) { } ``` -## 62. ԲȦÖÐ×îºóʣϵÄÊý +## 62. ????????????? -**ÌâÄ¿ÃèÊö** +**???????** -ÈÃСÅóÓÑÃÇΧ³ÉÒ»¸ö´óȦ¡£È»ºó , ËûËæ»úÖ¸¶¨Ò»¸öÊý m, ÈñàºÅΪ 0 µÄСÅóÓÑ¿ªÊ¼±¨Êý¡£Ã¿´Îº°µ½ m-1 µÄÄǸöСÅóÓÑÒª³öÁгªÊ׸è , È»ºó¿ÉÒÔÔÚÀñÆ·ÏäÖÐÈÎÒâµÄÌôÑ¡ÀñÎï , ²¢ÇÒ²»Ôٻص½È¦ÖÐ , ´ÓËûµÄÏÂÒ»¸öСÅóÓÑ¿ªÊ¼ , ¼ÌÐø 0...m-1 ±¨Êý .... ÕâÑùÏÂÈ¥ .... Ö±µ½Ê£ÏÂ×îºóÒ»¸öСÅóÓÑ , ¿ÉÒÔ²»ÓñíÑÝ¡£ +??§³??????¦¶????????????? , ????????????? m, ????? 0 ??§³??????????????¦Ê??? m-1 ?????§³????????§Ô???? , ??????????????????????????? , ???????????? , ???????????§³?????? , ???? 0...m-1 ???? .... ??????? .... ????????????§³???? , ??????????? -**½âÌâ˼·** +**?????¡¤** -Լɪ·ò»· +???? ```java public int LastRemaining_Solution(int n, int m) { @@ -1700,11 +1700,11 @@ public int LastRemaining_Solution(int n, int m) { } ``` -## 63. ¹ÉƱµÄ×î´óÀûÈó +## 63. ???????????? -**ÌâÄ¿ÃèÊö** +**???????** -¿ÉÒÔÓÐÒ»´ÎÂòÈëºÍÒ»´ÎÂô³ö£¬ÂòÈë±ØÐëÔÚǰ¡£Çó×î´óÊÕÒæ¡£ +???????????????????????????????????????????µµ ```java public int maxProfit(int[] prices) { @@ -1720,11 +1720,11 @@ public int maxProfit(int[] prices) { } ``` -## 64. Çó 1+2+3+...+n +## 64. ?? 1+2+3+...+n -**ÌâÄ¿ÃèÊö** +**???????** -Çó 1+2+3+...+n£¬ÒªÇó²»ÄÜʹÓó˳ý·¨¡¢for¡¢while¡¢if¡¢else¡¢switch¡¢case µÈ¹Ø¼ü×Ö¼°Ìõ¼þÅжÏÓï¾ä£¨A?B:C£© +?? 1+2+3+...+n?????????¨®??????for??while??if??else??switch??case ????????????§Ø????A?B:C?? ```java public int Sum_Solution(int n) { @@ -1733,9 +1733,9 @@ public int Sum_Solution(int n) { } ``` -## 65. ²»ÓüӼõ³Ë³ý×ö¼Ó·¨ +## 65. ???¨¹?????????? -a ^ b ±íʾûÓп¼ÂǽøÎ»µÄÇé¿öÏÂÁ½ÊýµÄºÍ£¬(a & b) << 1 ¾ÍÊǽøÎ»¡£µÝ¹é»áÖÕÖ¹µÄÔ­ÒòÊÇ (a & b) << 1 ×îÓұ߻á¶àÒ»¸ö 0£¬ÄÇô¼ÌÐøµÝ¹é£¬½øÎ»×îÓÒ±ßµÄ 0 »áÂýÂýÔö¶à£¬×îºó½øÎ»»á±äΪ 0£¬µÝ¹éÖÕÖ¹¡£ +a ^ b ?????§á????¦Ë???????????????(a & b) << 1 ?????¦Ë???????????????? (a & b) << 1 ?????????? 0???????????ï…??¦Ë?????? 0 ??????????????¦Ë???? 0?????????? ```java public int Add(int num1, int num2) { @@ -1744,11 +1744,11 @@ public int Add(int num1, int num2) { } ``` -## 66. ¹¹½¨³Ë»ýÊý×é +## 66. ??????????? -**ÌâÄ¿ÃèÊö** +**???????** -¸ø¶¨Ò»¸öÊý×é A[0, 1,..., n-1], Çë¹¹½¨Ò»¸öÊý×é B[0, 1,..., n-1], ÆäÖÐ B ÖеÄÔªËØ B[i]=A[0]\*A[1]\*...\*A[i-1]\*A[i+1]\*...\*A[n-1]¡£²»ÄÜʹÓóý·¨¡£ +??????????? A[0, 1,..., n-1], ??????????? B[0, 1,..., n-1], ???? B ?§Ö???? B[i]=A[0]\*A[1]\*...\*A[i-1]\*A[i+1]\*...\*A[n-1]????????¨®????? ```java public int[] multiply(int[] A) { @@ -1773,9 +1773,9 @@ public int[] multiply(int[] A) { } ``` -# µÚÆßÕ Á½¸öÃæÊÔ°¸Àý +# ?????? ??????????? -## 67. °Ñ×Ö·û´®×ª»»³ÉÕûÊý +## 67. ???????????????? ```java public int StrToInt(String str) { @@ -1792,9 +1792,9 @@ public int StrToInt(String str) { } ``` -## 68. Ê÷ÖÐÁ½¸ö½ÚµãµÄ×îµÍ¹«¹²×æÏÈ +## 68. ?????????????????????? -Ê÷ÊǶþ²æ²éÕÒÊ÷µÄ×îµÍ¹«¹²×æÏÈÎÊÌ⣺ +???????????????????????????? ```java public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { diff --git a/notes/程åº�员的è�Œä¸šç´ å…».md b/notes/程åº�员的è�Œä¸šç´ å…».md index b0a7761d..efadf001 100644 --- a/notes/程åº�员的è�Œä¸šç´ å…».md +++ b/notes/程åº�员的è�Œä¸šç´ å…».md @@ -1,129 +1,129 @@ -* [ÒëÕßÐò](#ÒëÕßÐò) -* [ǰÑÔ](#ǰÑÔ) -* [רҵÖ÷Òå](#רҵÖ÷Òå) -* [˵²»](#˵²») -* [˵ÊÇ](#˵ÊÇ) -* [±à³Ì](#±à³Ì) -* [²âÊÔÇý¶¯¿ª·¢](#²âÊÔÇý¶¯¿ª·¢) -* [Á·Ï°](#Á·Ï°) +* [??????](#??????) +* [???](#???) +* [??????](#??????) +* [???](#???) +* [???](#???) +* [???](#???) +* [????????????](#????????????) +* [???](#???) -# ÒëÕßÐò +# ?????? -×÷Õß Bob ´óÊ壬ָÓС¶Ãô½ÝÈí¼þ¿ª·¢£ºÔ­Ôò¡¢Ä£Ê½Óëʵ¼ù¡·¡¶´úÂëÕû½àÖ®µÀ¡·¡¶³ÌÐòÔ±µÄÖ°ÒµËØÑø¡· +???? Bob ???ÈÉ???§³?????????????????????????????????????????????????????????? -¶ÔÓÚ½â¾öÎÊÌâ£¬ÖØÒªµÄ²»ÊÇÎÊÌâ±¾Éí£¬¶øÊǽâ¾öÎÊÌâµÄ·½Ê½¡¢²½ÖèÒÔ¼°·´Ë¼µÄÉî¶È£¬Õâ¾ÍÊÇÖ°ÒµËØÑø¡£ +???????????????????????????????????????????????????????????????????? -# ǰÑÔ +# ??? -ÓÉÓÚ¹ÜÀíÕßÃæÁٺܴóµÄ²ÆÎñºÍÕþÖÎѹÁ¦£¬ËûÃÇÎÞÊÓ¼¼ÊõÈËÔ±·¢³öµÄΣÏÕ¾¯¸æ£¬±§×ŽÄÐÒÐÄÀí·¢ÉäÁË¡°ÌôÕ½Õß¡±º½Ìì·É»ú£¬×îÖÕµ¼Öº½Ìì·É»úÔڸ߿ձ¬Õ¨¡£Ëä˵¼¼ÊõÈËÔ±ÒѾ­×öºÜ¶àÊÂÇéÈ¥×èÖ¹Õâ´Î·¢É䣬µ«ÊDz¢²»ÊÇ˵×öÁËËùÓÐËûÃÇÄÜ×öµÄ£¬ÀýÈçËûÃǾÍûÓдòµç»°È¥ÐÂÎĄ̊½Ò¶´Ë´Î·¢ÉäµÄΣÏÕÐÔ¡£ +?????????????????????????????????????????????????¦²????—¨??????????????????????????????????????????????????????????????????????????????¦Ç???????????????????????????????????????????§Õ?´Â???????????¦Ç????¦²????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/bccb799f-56e2-4356-95f0-a9ea05b0de2a.jpg) -# רҵÖ÷Òå +# ?????? -רҵÖ÷Òå²»½öÒâζ×ÅÈÙÓþºÍ½¾°Á£¬Ò²Òâζ×ÅÔðÈΡ£ +?????�I????¦Æ????????????????¦Æ?????¦±? -×÷ÕßÔÚ×Ô¼º¿ª·¢µÄÒ»¸öµç»°Ïß·¹ÊÕϼì²âϵͳʱ£¬ÒòΪ¸Ï×ÅÔÚµ½ÆÚÈÕ½»¸¶Ð¹¦ÄÜ£¬Ã»ÓжÔÕû¸öϵͳ½øÐвâÊÔ£¬µ¼ÖÂÁËÒ»¸ö bug µÄ³öÏÖ¡£×÷ÕßÈÏΪÕâÊÇÒ»ÖÖ²»¸ºÔðÈεıíÏÖ£¬Ò²¾ÍÊDz»×¨ÒµµÄ±íÏÖ¡£ +???????????????????´Â??¡¤????????????????????????????????????§Ø??????????§Ó????????????? bug ??????????????????????????¦Å??????????????????? -´úÂëÖÐÄÑÃâÓÐ bug£¬µ«ÊDz»Òâζ×ÅÄã²»ÓÃΪ bug ¸ºÔð¡£ +???????????? bug?????????¦Æ??????? bug ???? -ÓÐÈ衄 QA µ±³É²é bug µÄ»úÆ÷£¬µÈ×Å QA ·¢ÏÖ bug£¬¶ø×Ô¼ºÈ´²»Ö÷¶¯È¥·¢ÏÖ bug£¬ÕâÊDz»¶ÔµÄ¡£ +????? QA ????? bug ??????????? QA ???? bug??????????????????? bug??????????? -ΪÁ˱£Ö¤´úÂëµÄÕýÈ·ÐÔ£¬ÐèÒªÐ´Ò»Ð©ËæÊ±¿ÉÒÔÔËÐеĵ¥Ôª²âÊÔ£¬²¢ÇÒ²»¶ÏµØÈ¥ÔËÐÐËüÃÇ¡£ +???????????????????§Õ?§»??????????§Ö?????????????????????????? -Èí¼þÏîÄ¿µÄ¸ù±¾Ô­Ôò - Ò×ÓÚÐ޸ġ£ÎªÁËÈÃ×Ô¼ºµÄÈí¼þÒ×ÓÚÐ޸ģ¬ÐèÒª¾­³£È¥ÐÞ¸ÄËü£¡ +?????????????? - ???????????????????????????????????????????? -µ¥Ôª²âÊÔ¿ÉÒÔÈóÌÐòÔ±¸üÓÐ×ÔÐÅÈ¥Ð޸ĴúÂ룬ÒòΪËü»áÈÃÈËÈ·ÐÅÐ޸ĵØÊÇ·ñÕýÈ·¡£ +???????????¨®????????????????????????????????????????????? -×¨ÒµËØÑø°üÀ¨ÒÔÏÂÄÚÈÝ£º +??????????????????? -1. ¼á³Öѧϰ -2. ÿÌìÁ·Ï°Ò»Ð©¼òµ¥µÄ±à³ÌÌâÄ¿ -3. ÓëËûÃǺÏ×÷£¬´Ó±Ë´ËÉíÉÏѧµ½¸ü¶à¶«Î÷ -4. ½»Á÷¡£Í¨¹ý½»Á÷±í´ï×Ô¼ºµÄ˼Ï룬·¢ÏÖ×Ô¼ºµÄ²»×ãÒÔ¼°Óë±ðÈË˼ÏëÉϵIJîÒì¡£ -5. Á˽âÒµÎñÁìÓò£¬ÕÒ¼¸±¾Ïà¹ØÁìÓòµÄÊé¿´¡£ -6. Óë¹ÍÖ÷ / ¿Í»§±£³ÖÒ»Ö -7. ǫѷ£¬ÒòΪËûÃÇÖªµÀ×Ô¼ºÒ²¿ÉÄÜ·¸´í¡£ +1. ????? +2. ???????§»???????? +3. ???????????????????????????? +4. ????????????????????????????????????????????????????? +5. ??????????????????????????? +6. ????? / ?????????? +7. ????????????????????????? -# ˵²» +# ??? -¶ÔһЩ²»ºÏÀíµÄÒªÇ󣬲»ÄÜÖ»ÊÇ˵¡°ÊÔÊÔ¿´¡±£¬Õâ»á±»µ±³ÉÊǽÓÊÜÁËÕâ¸öÒªÇó¡£Èç¹û×Ô¼ºÉîÖªÕâÖÖ²»ºÏÀíµÄÒªÇó»áµ¼ÖÂÑÏÖØµÄºó¹û£¬¾Í²»ÄÜÈÎÓÉËü·¢Õ¹ÏÂÈ¥£¬¶ÔÕâÒ»ÒªÇó˵¡°²»¡±¡£ +???§»?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -˵¡°²»¡±Ê±ÒªÓÃ×îÏêϸµÄϸ½ÚÀ´ËµÃ÷£¬¶ø²»ÊÇ·³ÔêµØ·´²µ¡£ +??????????????????????????????????????????? -µ±ÒªÇóÃ÷ÏÔ²»ºÏÀíʱ£¬¿ÉÒÔЭÉÌһЩ˫·½¶¼ÄܽÓÊܵķ½°¸¡£ +?????????????????????§¿???§»???????????????? -"ÓпÉÄÜд³öºÃ´úÂëÂð" ÕâÆª²©ÎÄ£¬½²ÊöÁËÒ»´Î¿ª·¢Ò»¼ÒÁãÊÛÉÌΪÁËÔÚ"ºÚÉ«ÐÇÆÚÎå"Äܹ»Èù˿Ϳ´µ½ÉÌÆ·ÐÅÏ¢É̵êÐÅÏ¢ÒÔ¼°·¢²¼ÓÅ»ÝÂëµÈ¹¦ÄÜµÄ ipone Ó¦Óã¬×ʼÁãÊÛÉ̵ľ­Àí³Ðŵ˵ֻҪд¸öÓ²±àÂëµÄÓ¦ÓþÍÐÐÁË£¬µ«Êǿͻ§ËùÒªµÄÈκÎÒ»ÏÄÜ£¬×ܱÈËü×ʼʱËù˵µÄÒª¸´ÔÓÐí¶à¡£Ãæ¶Ôʱ¼äµÄ½ô¼±£¬¿Í»§·½µÄ²»ÅäºÏ£¬ÒÔ¼°ÐèÇóµÄ±ä¸ü£¬Èò©ÎÄ×÷ÕßдÁËÒ»¶ÑºÜÀõĴúÂ룬¶øËû×Ô¼ºÈ·Êµ¶ÔÄÇЩÉè¼ÆÄ£Ê½µÈ¸ß¼¶¿ª·¢¼¼ÊõÊǷdz£ÈÈÖԵġ£ËùÒÔËûÈÏΪÔÚʵ¼ÊµÄ¿ª·¢ÖÐÒòΪ¿Í»§µÄÐèÇóµÈÒòËØ£¬ºÜÄÑд×÷×Ô¼ºÏëдµÄ´úÂë¡£Bob ÈÏΪ£¬ÉÏÃæÄÇÆª²©ÎĵÄ×÷Õß²ÅÊǴ˴οª·¢¹ý³ÌÅöµ½µÄÄÇЩÎÊÌâµÄ¸ºÔðÈË£¬ÒòΪËûûÓжÔÄÇЩ²»ºÏÀíµÄÒªÇó˵²»¡£ +"?§á???§Õ?????????" ????????????????¦Ï?????????????????"?????????"????¨´?????????????????????????????????? ipone ??????????????????????§Õ?????????????????????????????¦Ê??????????????????????????????????????????????????????????????????¨°???????§Õ?????????????????????????§»?????????????????????????????????????????????????????????????????????§Õ???????§Õ?????Bob ?????????????????????????¦Ï???????????????§»??????????????????§Ø???§»??????????????? -# ˵ÊÇ +# ??? -×ö³ö³ÐŵµÄÊÇÈý¸ö²½Ö裺¿ÚÍ·ÉÏ´ðÓ¦£¬·ÅÔÚÐÄÀ¸¶ÖîÐж¯¡£ +??????????????????Ñs??????????????????????§Ø??? -ȱ·¦³ÐŵµÄ´ÊÓ +??????????? -1. ÐèÒª£ºÎÒÐèÒª°ÑÕâÊÂ×öÍꣻ -2. Ï£Íû£ºÏ£Íû½ñÌìÎÒÄÜÍê³ÉÈÎÎñ£» -3. ÈÃÎÒÃÇ£ºÈÃÎÒÃǰÑÕâ¼þÊÂ×öÍê¡£ +1. ???????????????????? +2. ??????????????????????? +3. ??????????????????????? -ȱ·¦³ÐŵµÄÈ˲»»á°ÑÖØµã·ÅÔÚ×Ô¼ºÉíÉÏ£¬Ò²²»»áÃ÷ȷ˵Ã÷Ò»¼þÊÂÇéµÄ½ØÖ¹ÈÕÆÚ¡£ÕæÕýµÄ³ÐŵÊÇÕâÑùµÄ¡°ÎÒ»áÔÚ...֮ǰ...¡± +????????????????????????????????????????????????????????????????????????????...??...?? -¶Ô×Ô¼ºÎÞ·¨ÍêÈ«ÕÆÎÕµÄÊ£¬²»ÒªÇáÒ׳Ðŵ¡£ +?????????????????????????????? -·¢ÏÖ×Ô¼ºÎÞ·¨×öµ½³Ðŵ£¬Á¢ÂíÈ¥µ÷Õû±ðÈ˶ÔÄãµÄÔ¤ÆÚ¡£ +???????????????????????????????????????? -¡°ÊÔÊÔ¿´¡±ËµÃ÷×Ô¼º¶Ô³ÐŵµÄÄÚÈÝÓеã¹Ë¼É£¬Òò´Ë²»ÒªÓÃÊÔÊÔ¿´À´×÷ΪһÖÖ³Ðŵ¡£Èç¹û²»ÄÜÈ·ÐÅ×Ô¼ºÄÜ´ïµ½³ÐŵµÄÄÚÈݶøËæ±ã³Ðŵ£¬ÄÇô×îºóÍùÍù»á²úÉúÑÏÖØµÄºó¹û¡£ +??????????????????????????§Ö????????????????????????????????????????????????????????????????????????????????????? -# ±à³Ì +# ??? -Òª¾«Í¨Ò»Ïî¼¼Êõ£¬Òª¶Ô¸Ã¼¼Êõ¾ß±¸¡°ÐÅÐÄ¡±ºÍ¡°¸ÐÖªÄÜÁ¦¡±¡£ +??????????????¨¹??????????????????????????? -״̬²»ºÃµÄʱºò×îºÃ±ðд´úÂ롣״̬²»ºÃ·ÖΪ£ºÆ£ÀÍ£¬±ÈÈç°¾Ò¹£»½¹ÂÇ£¬ÒòΪÍâ½çµÄÊÂÇéÈÃ×Ô¼º²»Äܰ²ÐÄÏÂÀ´£¬Õâ¸öʱºòÓ¦¸Ãϵ÷ÕûºÃÔÙ½øÐбà³Ì¡£ +??????????????§Õ?????????¡Â???????????ºŸ?????????????????????????????????????????????????????????§Ò??? -½øÈëÁ÷״̬µÄ¸Ð¾õºÜºÃ£¬¾õµÃ¿ÉÒÔ×öºÜ¶àÊ£¬µ«ÊÇÁ÷״̬ÆäʵÊÇÒ»ÖÖdz²ãÚ¤Ï룬˼άÄÜÁ¦»áϽµ£¬Òò´ËÒª±ÜÃâ½øÈëÁ÷״̬¡£ +??????????§à???????????????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/f0321ed1-fa93-460e-951b-4239fef819f3.jpg) -Á÷״̬µÄÌØµãÊǸô¾ø¹µÍ¨£¬¶ø½á¶Ô±à³ÌÄܹ»´òÆÆÕâÖÖ¸ô¾ø£¬Òò´Ë½á¶Ô±à³ÌÄܹ»·ÀÖ¹½øÈëÁ÷״̬¡£ +????????????????????????????????????????????????????????????????? -µ±×Ô¼ºÃ»·¨¼ÌÐø±à³Ìʱ£¬½á¶Ô±à³ÌÊǸöºÃÑ¡Ôñ£¬½á¶Ô±à³Ìʱ£¬´óÄÔºÍÉíÌå»áÓл¯Ñ§±ä»¯£¬Ò²¾ÍÊÇ˵˼ά·½Ê½»á¸Ä±ä£¬ÓÐÖúÓÚÍ»ÆÆµ±Ç°µÄ˼ά×èÈû״̬¡£ +?????????????????????????????????????????????????§Ý???�£???????????????????????????????????????? -ÌýÒôÀÖʱÒôÀÖ»áÕ¼ÓÃÒ»²¿·ÖÄÔÁ¦×ÊÔ´£¬Òò´Ë»áµ¼ÖÂЧÂÊϽµ£¬µ«ÊÇÕâ²»ÊǾø¶Ô¡£ +???????????????????????????????????§¹??????????????????? -¶àÊäÈëһЩ´´ÔìÐÔµÄÄÚÈÝ£¬±ÈÈç¿Æ»ÃС˵µÈ£¬×Ô¼ºµÄ´´ÔìÁ¦Ò²»áµÃµ½ÌáÉý¡£ +???????§»??????????????????§³????????????????????????? -µ÷ÊÔʱ¼äÒ²ºÜ±¦¹ó£¬²âÊÔÇý¶¯¿ª·¢Äܹ»½µµÍµ÷ÊÔµÄʱ¼ä¡£ +?????????????????????????????????????? -±àÂëºÍÅÜÂíÀ­ËÉÒ»Ñù£¬ÎÞ·¨È«³ÌÒÔ×î¿ìµÄËٶȳå´Ì£¬Ö»ÄÜͨ¹ý±£³ÖÌåÁ¦ºÍά³Ö½Ú×àÀ´È¡µÃʤÀû¡£Òò´ËÒª±£³ÖºÃ×Ô¼ºµÄ½Ú×࣬ÔÚÆ£À͵ÄʱºòÊʵ±ÐÝÏ¢¡£ +?????????????????????????????????????????????????????????????????????????????????????????????????????? -¶¨ÆÚ×ö½ø¶ÈºâÁ¿£¬ÓÃÀÖ¹ÛÔ¤¹À¡¢±ê×¼Ô¤¹ÀºÍ±¯¹ÛÔ¤¹ÀÕâÈý¸öʱ¼äµã¡£ +????????????????????????????????????????????????? -Èç¹û×Ô¼ºÔ¤¹ÀµÄ½ø¶È¸Ï²»ÉϽØÖ¹Ê±¼ä£¬²»Òª´ðÓ¦ÔÚ½ØÖ¹Ê±¼äÈ¥Íê³É£¬ÒòΪÄãÖªµÀ¸ù¾Ý×Ô¼ºµÄÔ¤¹ÀÕâÊDz»¿ÉÄܵġ£ +???????????????????????????????????????????????????????????????????????? -ÈÎÎñÍê³ÉµÄ±ê׼ͨ³£ÓÃÒ»¸ö×Ô¶¯»¯µÄÑéÊÕ²âÊÔÀ´¶¨Òå¡£ +?????????????????????????????????????‰^ -°ïÖúËûÈËÒ²»á¸ø×Ô¼º´øÀ´ºÃ´¦£¬ÔÚ°ïÖú±ðÈ˵Äʱºò²»ÒªÈÃ×Ô¼º¿´ÆðÀ´ºÜ²Ö´Ù£¬¾ÍÏñÊÇÔÚËæ±ãÓ¦¸¶¡£Ò»°ã°ïÖú±ðÈ˲»ÐèÒªÌØ±ð¶àµÄʱ¼ä¡£Ò²ÒªÑ§»áÇëÇó±ðÈ˵İïÖú£¬ÒòΪ×Ô¼º²»¿ÉÄÜÊÇÍòÄܵģ¬Í¨¹ý±ðÈ˵İïÖúÄܸüºÃµÄ½â¾öÎÊÌâ¡£ +????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -# ²âÊÔÇý¶¯¿ª·¢ +# ???????????? -TDD µÄÔËÐÐÖÜÆÚºÜ¶Ì£¬¿ÉÄÜÒ»Á½·ÖÖӾͿÉÒÔÔËÐÐÒ»´Î³ÌÐò£¬¶ÌÖÜÆÚ¿ÉÒÔ¿ìËٵõ½·´À¡£¬·´À¡ÔÚ¿ª·¢ÖÐÌØ±ðÖØÒª£¬Ò»·½ÃæÊÇÌá¸ß³ÌÐòÔ±±àÂëµÄ¼¤Ç飬ÁíÒ»·½ÃæÊÇÄܹ»¼°Ôç·¢ÏÖ bug£¬¶ø bug Ô½Ôç·¢ÏÖÐ޸ĵشú¼ÛÒ²Ô½µÍ¡£ +TDD ??????????????????????????????????¦Ã??????????????????????????????????????????????????????????????ï…???????????????¾ˆ?? bug???? bug ??¾ˆ?????????????? -TDD Èý·¨Ôò£º +TDD ?????? -1. ÏÈд²âÊÔ£» -2. ÔÚÒ»¸öµ¥Ôª²âÊÔʧ°ÜµÄʱºò£¬²»ÒªÔÙд²âÊÔ´úÂ룻 -3. ²úÆ·´úÂëÄÜÇ¡ºÃͨ¹ýµ±Ç°Ê§°ÜµÄµ¥Ôª²âÊÔ¼´¿É£¬²»Òª¶àд¡£ +1. ??§Õ????? +2. ???????????????????????§Õ??????? +3. ?????????????????????????????????????§Õ?? -TDD Óŵã +TDD ??? -1. È·¶¨ÐÔ£ºÈ·¶¨µ±Ç°ÏµÍ³ÊÇ·ñÕýÈ·£» -2. ÐÅÐÄ£º³ÌÐòÔ±¸üÓÐÐÅϢȥÐ޸ĻìÂҵĴúÂ룬ÒòΪͨ¹ýµ¥Ôª²âÊÔ¿ÉÒÔÖªµÀÊÇ·ñÐ޸ĵØÕýÈ·£» -3. Îĵµ£ºµ¥Ôª²âÊÔÊǵײãÉè¼ÆÏ¸½ÚµÄÎĵµ£¬Í¨¹ýÔĶÁµ¥Ôª²âÊÔÄܹ»ÖªµÀ³ÌÐòµÄÔËÐз½Ê½£» +1. ?????????????????????? +2. ??????????????????????????????????????????????????????????? +3. ???????????????????????????????????????????????????????§Ù???? -# Á·Ï° +# ??? -¿¨ËþÔÚÎäÊõÀïÃæÊÇÒ»Ì×Éè¼ÆºÃµÄÕÐʽ£¬¸ÃÕÐʽģÄâÕæÊµ²«¶·³¡¾°£¬Ï°ÎäÕß²»¶ÏѵÁ·À´ÈÃÉíÌåÊìϤ¸ÃÕÐʽ£¬´Ó¶ø×öµ½´¿Êì¡£±à³Ì¿¨ËþÊÇÒ»Ì×±à³Ì¹ý³ÌÇû÷Êó±êºÍ¼üÅ̵͝×÷£¬Á·Ï°Õß²»ÊÇΪÁ˽â¾öÕæÕýµÄÎÊÌ⣬ÒòΪÒѾ­ÖªµÀÁ˽â¾ö·½°¸£¬¶øÊÇÁ·Ï°½â¾öÕâ¸öÎÊÌâËùÐèÒªµÄ¶¯×÷ºÍ¾ö²ß¡£ +????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -ÍßÈø¼´Ê¹Á½È˶ÔÁ·µÄ¿¨Ëþ¡£ÔÚ±à³ÌÁìÓò£¬¿ÉÒÔÊÇÒ»¸öÈËдµ¥Ôª²âÊÔ£¬ÁíÒ»¸öÈËд³ÌÐòͨ¹ýµ¥Ôª²âÊÔ¡£±ÈÈ磬һ¸öÈËʵÏÖÅÅÐòËã·¨£¬Ð´²âÊÔµÄÈË¿ÉÒÔºÜÈÝÒ×µØÏÞÖÆËٶȺÍÄڴ棬¸øÍ¬°éʩѹ¡£ +???????????????????????????????????????§Õ???????????????§Õ??????????????????íà????????????????§Õ??????????????????????????—¨????????? diff --git a/notes/笔记/2016 校招真题题解.md.txt b/notes/笔记/2016 校招真题题解.md.txt new file mode 100644 index 00000000..86e92afa --- /dev/null +++ b/notes/笔记/2016 校招真题题解.md.txt @@ -0,0 +1,716 @@ +[TOC] + +# å‰�言 + +çœ�略的代ç �: + +```java +import java.util.*; +``` + +```java +public class Solution { +} +``` + +```java +public class Main { +    public static void main(String[] args) { +        Scanner in = new Scanner(System.in); +        while (in.hasNext()) { + } + } +} +``` + +# 1. å°�ç±³-å°�ç±³Git + +- é‡�建多å�‰æ ‘ +- 使用 LCA + +```java +private class TreeNode { +    int id; +    List childs = new ArrayList<>(); + +    TreeNode(int id) { +        this.id = id; +    } +} + +public int getSplitNode(String[] matrix, int indexA, int indexB) { +    int n = matrix.length; +    boolean[][] linked = new boolean[n][n]; // é‡�建邻接矩阵 +    for (int i = 0; i < n; i++) { +        for (int j = 0; j < n; j++) { +            linked[i][j] = matrix[i].charAt(j) == '1'; +        } +    } +    TreeNode tree = constructTree(linked, 0); +    TreeNode ancestor = LCA(tree, new TreeNode(indexA), new TreeNode(indexB)); +    return ancestor.id; +} + +private TreeNode constructTree(boolean[][] linked, int root) { +    TreeNode tree = new TreeNode(root); +    for (int i = 0; i < linked[root].length; i++) { +        if (linked[root][i]) { +            linked[i][root] = false; //  因为题目给的邻接矩阵是å�Œå�‘的,在这里需è¦�把它转为å�•å�‘çš„ +            tree.childs.add(constructTree(links, i)); +        } +    } +    return tree; +} + +private TreeNode LCA(TreeNode root, TreeNode p, TreeNode q) { +    if (root == null || root.id == p.id || root.id == q.id) return root; +    TreeNode ancestor = null; +    int cnt = 0; +    for (int i = 0; i < root.childs.size(); i++) { +        TreeNode tmp = LCA(root.childs.get(i), p, q); +        if (tmp != null) { +            ancestor = tmp; +            cnt++; +        } +    } +    return cnt == 2 ? root : ancestor; +} +``` + +# 2. å°�ç±³-懂二进制 + +对两个数进行异或,结果的二进制表示为 1 的那一ä½�就是两个数ä¸�å�Œçš„ä½�。 + +```java +public int countBitDiff(int m, int n) { +    return Integer.bitCount(m ^ n); +} +``` + +# 3. å°�ç±³-中国牛市 + +背包问题,å�¯ä»¥è®¾ä¸€ä¸ªå¤§å°�为 2 的背包。 + +状æ€�转移方程如下: + +```html +dp[i, j] = max(dp[i, j-1], prices[j] - prices[jj] + dp[i-1, jj]) { jj in range of [0, j-1] } = max(dp[i, j-1], prices[j] + max(dp[i-1, jj] - prices[jj])) +``` + +```java +public int calculateMax(int[] prices) { +    int n = prices.length; +    int[][] dp = new int[3][n]; +    for (int i = 1; i <= 2; i++) { +        int localMax = dp[i - 1][0] - prices[0]; +        for (int j = 1; j < n; j++) { +            dp[i][j] = Math.max(dp[i][j - 1], prices[j] + localMax); +            localMax = Math.max(localMax, dp[i - 1][j] - prices[j]); +        } +    } +    return dp[2][n - 1]; +} +``` + +# 4. 微软-LUCKY STRING + +- æ–�波那契数列å�¯ä»¥é¢„计算; +- 从头到尾é��历字符串的过程,æ¯�一轮循环都使用一个 Set æ�¥ä¿�存从 i 到 j 出现的字符,并且 Set ä¿�è¯�了字符都ä¸�å�Œï¼Œå› æ­¤Â Set 的大å°�就是ä¸�å�Œå­—符的个数。 + +```java +Set fibSet = new HashSet<>(Arrays.asList(1, 2, 3, 5, 8, 13, 21, 34, 55, 89)); +Scanner in = new Scanner(System.in); +String str = in.nextLine(); +int n = str.length(); +Set ret = new HashSet<>(); +for (int i = 0; i < n; i++) { +    Set set = new HashSet<>(); +    for (int j = i; j < n; j++) { +        set.add(str.charAt(j)); +        int cnt = set.size(); +        if (fibSet.contains(cnt)) { +            ret.add(str.substring(i, j + 1)); +        } +    } +} +String[] arr = ret.toArray(new String[ret.size()]); +Arrays.sort(arr); +for (String s : arr) { +    System.out.println(s); +} +``` + +# 5. 微软-Numeric Keypad + +```java +private static int[][] canReach = { +        {1, 0, 0, 0, 0, 0, 0, 0, 0, 0}, // 0 +        {1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, // 1 +        {1, 0, 1, 1, 0, 1, 1, 0, 1, 1}, // 2 +        {0, 0, 0, 1, 0, 0, 1, 0, 0, 1}, // 3 +        {1, 0, 0, 0, 1, 1, 1, 1, 1, 1}, // 4 +        {1, 0, 0, 0, 0, 1, 1, 0, 1, 1}, // 5 +        {0, 0, 0, 0, 0, 0, 1, 0, 0, 1}, // 6 +        {1, 0, 0, 0, 0, 0, 0, 1, 1, 1}, // 7 +        {1, 0, 0, 0, 0, 0, 0, 0, 1, 1}, // 8 +        {0, 0, 0, 0, 0, 0, 0, 0, 0, 1}  // 9 +}; + +private static boolean isLegal(char[] chars, int idx) { +    if (idx >= chars.length || idx < 0) return true; +    int cur = chars[idx] - '0'; +    int next = chars[idx + 1] - '0'; +    return canReach[cur][next] == 1; +} + +public static void main(String[] args) { +    Scanner in = new Scanner(System.in); +    int T = Integer.valueOf(in.nextLine()); +    for (int i = 0; i < T; i++) { +        String line = in.nextLine(); +        char[] chars = line.toCharArray(); +        for (int j = 0; j < chars.length - 1; j++) { +            while (!isLegal(chars, j)) { +                if (--chars[j + 1] < '0') { +                    chars[j--]--; +                } +                for (int k = j + 2; k < chars.length; k++) { +                    chars[k] = '9'; +                } +            } +        } +        System.out.println(new String(chars)); +    } +} +``` + +# 6. 微软-Spring Outing + +下é�¢ä»¥Â N = 3,K = 4 æ�¥è¿›è¡Œè®¨è®ºã€‚ + +åˆ�始时,令第 0 个地方æˆ�为待定地点,也就是呆在家里。 + +从第 4 个地点开始投票,æ¯�个人å�ªéœ€è¦�比较第 4 个地方和第 0 个地方的优先级,里,如果超过å�Šæ•°çš„人选择了第 4 个地方,那么更新第 4 个地方æˆ�为待定地点。 + +从å�Žå¾€å‰�ä¸�æ–­é‡�å¤�以上步骤,ä¸�断更新待定地点,直到所有地方都已ç»�投票。 + +上é�¢çš„讨论中,先令第 0 个地点æˆ�为待定地点,是因为这样的è¯�第 4 个地点就å�ªéœ€è¦�和这个地点进行比较,而ä¸�用考虑其它情况。如果最开始先令第 1 个地点æˆ�为待定地点,那么在对第 2 个地点进行投票时,æ¯�个人ä¸�ä»…è¦�考虑第 2 个地点与第 1 个地点的优先级,也è¦�考虑与其å�ŽæŠ•ç¥¨åœ°ç‚¹çš„ä¼˜å…ˆçº§ã€‚ + +```java +int N = in.nextInt(); +int K = in.nextInt(); +int[][] votes = new int[N][K + 1]; +for (int i = 0; i < N; i++) { +    for (int j = 0; j < K + 1; j++) { +        int place = in.nextInt(); +        votes[i][place] = j; +    } +} +int ret = 0; +for (int place = K; place > 0; place--) { +    int cnt = 0; +    for (int i = 0; i < N; i++) { +        if (votes[i][place] < votes[i][ret]) { +            cnt++; +        } +    } +    if (cnt > N / 2) { +        ret = place; +    } +} +System.out.println(ret == 0 ? "otaku" : ret); +``` + +# 7. 微软-S-expression + +# 8. å�Žä¸º-最高分是多少 + +```java +int N = in.nextInt(); +int M = in.nextInt(); +int[] scores = new int[N]; +for (int i = 0; i < N; i++) { +    scores[i] = in.nextInt(); +} +for (int i = 0; i < M; i++) { +    String str = in.next(); +    if (str.equals("U")) { +        int id = in.nextInt() - 1; +        int newScore = in.nextInt(); +        scores[id] = newScore; +    } else { +        int idBegin = in.nextInt() - 1; +        int idEnd = in.nextInt() - 1; +        int ret = 0; +        if (idBegin > idEnd) { +            int t = idBegin; +            idBegin = idEnd; +            idEnd = t; +        } +        for (int j = idBegin; j <= idEnd; j++) { +            ret = Math.max(ret, scores[j]); +        } +        System.out.println(ret); +    } +} +``` + +# 9. å�Žä¸º-简å�•错误记录 + +```java +HashMap map = new LinkedHashMap<>(); +while (in.hasNextLine()) { +    String s = in.nextLine(); +    String key = s.substring(s.lastIndexOf('\\') + 1); +    map.put(key, map.containsKey(key) ? map.get(key) + 1 : 1); +} +List> list = new LinkedList<>(map.entrySet()); +Collections.sort(list, (o1, o2) -> o2.getValue() - o1.getValue()); +for (int i = 0; i < 8 && i < list.size(); i++) { +    String[] token = list.get(i).getKey().split(" "); +    String filename = token[0]; +    String line = token[1]; +    if (filename.length() > 16) filename = filename.substring(filename.length() - 16); +    System.out.println(filename + " " + line + " " + list.get(i).getValue()); +} +``` + +# 10. å�Žä¸º-扑克牌大å°� + +```java +public class Main { + +    private Map map = new HashMap<>(); + +    public Main() { +        map.put("3", 0); +        map.put("4", 1); +        map.put("5", 2); +        map.put("6", 3); +        map.put("7", 4); +        map.put("8", 5); +        map.put("9", 6); +        map.put("10", 7); +        map.put("J", 8); +        map.put("Q", 9); +        map.put("K", 10); +        map.put("A", 11); +        map.put("2", 12); +        map.put("joker", 13); +        map.put("JOKER ", 14); +    } + +    private String play(String s1, String s2) { +        String[] token1 = s1.split(" "); +        String[] token2 = s2.split(" "); +        CardType type1 = computeCardType(token1); +        CardType type2 = computeCardType(token2); +        if (type1 == CardType.DoubleJoker) return s1; +        if (type2 == CardType.DoubleJoker) return s2; +        if (type1 == CardType.Bomb && type2 != CardType.Bomb) return s1; +        if (type2 == CardType.Bomb && type1 != CardType.Bomb) return s2; +        if (type1 != type2 || token1.length != token2.length) return "ERROR"; +        for (int i = 0; i < token1.length; i++) { +            int val1 = map.get(token1[i]); +            int val2 = map.get(token2[i]); +            if (val1 != val2) return val1 > val2 ? s1 : s2; +        } +        return "ERROR"; +    } + +    private CardType computeCardType(String[] token) { +        boolean hasjoker = false, hasJOKER = false; +        for (int i = 0; i < token.length; i++) { +            if (token[i].equals("joker")) hasjoker = true; +            else if (token[i].equals("JOKER")) hasJOKER = true; +        } +        if (hasjoker && hasJOKER) return CardType.DoubleJoker; +        int maxContinueLen = 1; +        int curContinueLen = 1; +        String curValue = token[0]; +        for (int i = 1; i < token.length; i++) { +            if (token[i].equals(curValue)) curContinueLen++; +            else { +                curContinueLen = 1; +                curValue = token[i]; +            } +            maxContinueLen = Math.max(maxContinueLen, curContinueLen); +        } +        if (maxContinueLen == 4) return CardType.Bomb; +        if (maxContinueLen == 3) return CardType.Triple; +        if (maxContinueLen == 2) return CardType.Double; +        boolean isStraight = true; +        for (int i = 1; i < token.length; i++) { +            if (map.get(token[i]) - map.get(token[i - 1]) != 1) { +                isStraight = false; +                break; +            } +        } +        if (isStraight && token.length == 5) return CardType.Straight; +        return CardType.Sigal; +    } + +    private enum CardType { +        DoubleJoker, Bomb, Sigal, Double, Triple, Straight; +    } + +    public static void main(String[] args) { +        Main main = new Main(); +        Scanner in = new Scanner(System.in); +        while (in.hasNextLine()) { +            String s = in.nextLine(); +            String[] token = s.split("-"); +            System.out.println(main.play(token[0], token[1])); +        } +    } +} +``` + +# 11. 去哪儿-二分查找 + +对于有é‡�å¤�元素的有åº�数组,二分查找需è¦�注æ„�以下è¦�点: + +- if (val <= A[m]) h = m; +- 因为 h 的赋值为 m 而ä¸�是 m - 1,因此 while 循环的æ�¡ä»¶ä¹Ÿå°±ä¸ºÂ l < h。(如果是 m - 1 循环æ�¡ä»¶ä¸ºÂ l <= h) + +```java +public int getPos(int[] A, int n, int val) { +    int l = 0, h = n - 1; +    while (l < h) { +        int m = l + (h - l) / 2; +        if (val <= A[m]) h = m; +        else l = m + 1; +    } +    return A[h] == val ? h : -1; +} +``` + +# 12. 去哪儿-首个é‡�å¤�字符 + +```java +public char findFirstRepeat(String A, int n) { +    boolean[] hasAppear = new boolean[256]; +    for (int i = 0; i < n; i++) { +        char c = A.charAt(i); +        if(hasAppear[c]) return c; +        hasAppear[c] = true; +    } +    return ' '; +} +``` + +# 13. 去哪儿-寻找Coder + +```java +public String[] findCoder(String[] A, int n) { +    List> list = new ArrayList<>(); +    for (String s : A) { +        int cnt = 0; +        String t = s.toLowerCase(); +        int idx = -1; +        while (true) { +            idx = t.indexOf("coder", idx + 1); +            if (idx == -1) break; +            cnt++; +        } +        if (cnt != 0) { +            list.add(new Pair<>(s, cnt)); +        } +    } +    Collections.sort(list, (o1, o2) -> (o2.getValue() - o1.getValue())); +    String[] ret = new String[list.size()]; +    for (int i = 0; i < list.size(); i++) { +        ret[i] = list.get(i).getKey(); +    } +    return ret; +} + +// 牛客网无法导入 javafx.util.Pair,这里就自己实现一下 Pair 类 +private class Pair { +    T t; +    K k; + +    Pair(T t, K k) { +        this.t = t; +        this.k = k; +    } + +    T getKey() { +        return t; +    } + +    K getValue() { +        return k; +    } +} +``` + +# 14. 美团-最大差值 + +贪心策略。 + +```java +public int getDis(int[] A, int n) { +    int max = 0; +    int soFarMin = A[0]; +    for (int i = 1; i < n; i++) { +        if(soFarMin > A[i]) soFarMin = A[i]; +        else max = Math.max(max, A[i]- soFarMin); +    } +    return max; +} +``` + +# 15. 美团-棋å­�翻转 + +```java +public int[][] flipChess(int[][] A, int[][] f) { +    int[][] direction = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; +    for (int[] ff : f) { +        for (int[] dd : direction) { +            int r = ff[0] + dd[0] - 1, c = ff[1] + dd[1] - 1; +            if(r < 0 || r > 3 || c < 0 || c > 3) continue; +            A[r][c] ^= 1; +        } +    } +    return A; +} +``` + +# 16. 美团-拜访 + +```java +private Set paths; +private List curPath; + +public int countPath(int[][] map, int n, int m) { +    paths = new HashSet<>(); +    curPath = new ArrayList<>(); +    for (int i = 0; i < n; i++) { +        for (int j = 0; j < m; j++) { +            if (map[i][j] == 1) { +                map[i][j] = -1; +                int[][] leftRightDirection = {{1, 0}, {-1, 0}}; +                int[][] topDownDirection = {{0, 1}, {0, -1}}; +                for (int[] lr : leftRightDirection) { +                    for (int[] td : topDownDirection) { +                        int[][] directions = {lr, td}; +                        backtracking(map, n, m, i, j, directions); +                    } +                } +                return paths.size(); +            } +        } +    } +    return 0; +} + +private void backtracking(int[][] map, int n, int m, int r, int c, int[][] directions) { +    if (map[r][c] == 2) { +        String path = ""; +        for (int num : curPath) { +            path += num; +        } +        paths.add(path); +        return; +    } +    for (int i = 0; i < directions.length; i++) { +        int nextR = r + directions[i][0]; +        int nextC = c + directions[i][1]; +        if (nextR < 0 || nextR >= n || nextC < 0 || nextC >= m || map[nextR][nextC] == -1) continue; +        map[nextR][nextC] = map[nextR][nextC] == 2 ? 2 : -1; +        curPath.add(nextR); +        curPath.add(nextC); +        backtracking(map, n, m, nextR, nextC, directions); +        curPath.remove(curPath.size() - 1); +        curPath.remove(curPath.size() - 1); +        map[nextR][nextC] = map[nextR][nextC] == 2 ? 2 : 0; +    } +} +``` + +# 17. 美团-直方图内最大矩形 + +```java +public int countArea(int[] A, int n) { +    int max = 0; +    for (int i = 0; i < n; i++) { +        int min = A[i]; +        for (int j = i; j < n; j++) { +            min = Math.min(min, A[j]); +            max = Math.max(max, min * (j - i + 1)); +        } +    } +    return max; +} +``` + +# 18. 美团-字符串计数 + +字符串都是å°�写字符,å�¯ä»¥æŠŠå­—符串当æˆ�是 26 进制。但是字典åº�的比较和普通的整数比较ä¸�å�Œï¼Œæ˜¯ä»Žå·¦å¾€å�³è¿›è¡Œæ¯”较,例如 "ac" 和 "abc",字典åº�的比较结果为 "ac" > "abc",如果按照整数方法比较,因为 "abc" 是三ä½�数,显然更大。 + +由于两个字符串的长度å�¯èƒ½ä¸�想等,在 s1 空白部分和 s2 对应部分进行比较时,应该把 s1 的空白部分看æˆ�是 'a' 字符进行填充的。 + +还有一点è¦�注æ„�的是,s1 到 s2 长度为 leni 的字符串个数å�ªæ¯”较å‰�é�¢Â i 个字符。例如 'aaa' 和 'bbb' ,长度为 2 的个数为 'aa' 到 'bb' 的字符串个数,ä¸�需è¦�考虑å�Žé�¢éƒ¨åˆ†çš„字符。 + +在统计个数时,从 len1 开始一直é��历到最大å�ˆæ³•长度,æ¯�次循环都统计长度为 i 的å­�字符串个数。 + +```java +String s1 = in.next(); +String s2 = in.next(); +int len1 = in.nextInt(); +int len2 = in.nextInt(); +int len = Math.min(s2.length(), len2); +int[] subtractArr = new int[len]; +for (int i = 0; i < len; i++) { +    char c1 = i < s1.length() ? s1.charAt(i) : 'a'; +    char c2 = s2.charAt(i); +    subtractArr[i] = c2 - c1; +} +int ret = 0; +for (int i = len1; i <= len; i++) { +    for (int j = 0; j < i; j++) { +        ret += subtractArr[j] * Math.pow(26, i - j - 1); +    } +} +System.out.println(ret - 1); +``` + +# 19. 美团-å¹³å�‡å¹´é¾„ + +```java +int W = in.nextInt(); +double Y = in.nextDouble(); +double x = in.nextDouble(); +int N = in.nextInt(); +while (N-- > 0) { +    Y++; // è€�员工æ¯�年年龄都è¦�加 1 +    Y += (21 - Y) * x; +} +System.out.println((int) Math.ceil(Y)); +``` + +# 20. 百度-罪犯转移 + +部分和问题,将æ¯�次求的部分和缓存起æ�¥ã€‚ + +```java +int n = in.nextInt(); +int t = in.nextInt(); +int c = in.nextInt(); +int[] values = new int[n]; +for (int i = 0; i < n; i++) { +    values[i] = in.nextInt(); +} +int cnt = 0; +int totalValue = 0; +for (int s = 0, e = c - 1; e < n; s++, e++) { +    if (s == 0) { +        for (int j = 0; j < c; j++) totalValue += values[j]; +    } else { +        totalValue = totalValue - values[s - 1] + values[e]; +    } +    if (totalValue <= t) cnt++; +} +System.out.println(cnt); +``` + +# 22. 百度-è£�å‡�网格纸 + +```java +int n = in.nextInt(); +int minX, minY, maxX, maxY; +minX = minY = Integer.MAX_VALUE; +maxX = maxY = Integer.MIN_VALUE; +for (int i = 0; i < n; i++) { +    int x = in.nextInt(); +    int y = in.nextInt(); +    minX = Math.min(minX, x); +    minY = Math.min(minY, y); +    maxX = Math.max(maxX, x); +    maxY = Math.max(maxY, y); +} +System.out.println((int) Math.pow(Math.max(maxX - minX, maxY - minY), 2)); +``` + +# 23. 百度-钓鱼比赛 + +P ( 至少钓一æ�¡é±¼Â ) = 1 - P ( 一æ�¡ä¹Ÿé’“ä¸�到 ) + +å�‘:读å�–概率矩阵的时候,需è¦�一行一行进行读å�–,而ä¸�能直接用 in.nextDouble()。 + +```java +public static void main(String[] args) { +    Scanner in = new Scanner(System.in); +    while (in.hasNext()) { +        int n = in.nextInt(); +        int m = in.nextInt(); +        int x = in.nextInt(); +        int y = in.nextInt(); +        int t = in.nextInt(); +        in.nextLine(); // å�‘ +        double pcc = 0.0; +        double sum = 0.0; +        for (int i = 1; i <= n; i++) { +            String[] token = in.nextLine().split(" "); // å�‘ +            for (int j = 1; j <= m; j++) { +                double p = Double.parseDouble(token[j - 1]); +                //  double p = in.nextDouble(); +                sum += p; +                if (i == x && j == y) { +                    pcc = p; +                } +            } +        } +        double pss = sum / (n * m); +        pcc = computePOfIRT(pcc, t); +        pss = computePOfIRT(pss, t); +        System.out.println(pcc > pss ? "cc" : pss > pcc ? "ss" : "equal"); +        System.out.printf("%.2f\n", Math.max(pcc, pss)); +    } +} + +// compute probability of independent repeated trials +private static double computePOfIRT(double p, int t) { +    return 1 - Math.pow((1 - p), t); +} +``` + +# 24. 百度-蘑è�‡é˜µ + +这题用回溯会超时,需è¦�用 DP。 + +dp[i][j] 表示到达 (i,j) ä½�ç½®ä¸�会触碰蘑è�‡çš„æ¦‚率。对于 N\*M 矩阵,如果 i == N || j == M,那么 (i,j) å�ªèƒ½æœ‰ä¸€ä¸ªç§»åŠ¨æ–¹å�‘;其它情况下能有两个移动方å�‘。 + +考虑以下矩阵,其中第 3 行和第 3 列å�ªèƒ½å¾€ä¸€ä¸ªæ–¹å�‘移动,而其它ä½�ç½®å�¯ä»¥æœ‰ä¸¤ä¸ªæ–¹å�‘移动。 + + +```java +int N = in.nextInt(); +int M = in.nextInt(); +int K = in.nextInt(); +boolean[][] mushroom = new boolean[N][M]; +while (K-- > 0) { +    int x = in.nextInt(); +    int y = in.nextInt(); +    mushroom[x - 1][y - 1] = true; +} +double[][] dp = new double[N][M]; +dp[0][0] = 1; +for (int i = 0; i < N; i++) { +    for (int j = 0; j < M; j++) { +        if (mushroom[i][j]) dp[i][j] = 0; +        else { +            double cur = dp[i][j]; +            if (i == N - 1 && j == M - 1) break; +            if (i == N - 1) dp[i][j + 1] += cur; +            else if (j == M - 1) dp[i + 1][j] += cur; +            else { +                dp[i][j + 1] += cur / 2; +                dp[i + 1][j] += cur / 2; +            } +        } +    } +} +System.out.printf("%.2f\n", dp[N - 1][M - 1]); +``` \ No newline at end of file diff --git a/notes/笔记/2017 校招真题题解.md.txt b/notes/笔记/2017 校招真题题解.md.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/notes/笔记/2017 校招真题题解.md.txt @@ -0,0 +1 @@ + diff --git a/notes/笔记/C++.md.txt b/notes/笔记/C++.md.txt new file mode 100644 index 00000000..7c0d450e --- /dev/null +++ b/notes/笔记/C++.md.txt @@ -0,0 +1,339 @@ +[TOC] + +# const 关键字 + +用于定义常é‡�,一旦åˆ�始化之å�Žå°±æ— æ³•改å�˜ã€‚ + +常é‡�必须在定义的时候进行åˆ�始化,因此用 const 修饰æˆ�员å�˜é‡�,必须在构造函数列表中åˆ�始化。 + +const 修饰指针时,分为顶层 const 和底层 const。 + +顶层 const 表示指针本身是个常é‡�。 + +```c++ +int i = 0; +int* const p = &i; +``` + +底层 const 表示指针所指å�‘的对象时一个常é‡�。 + +```c++ +const int i = 0; +const int* p = &i; +``` + +const 修饰æˆ�员函数,说明该函数ä¸�应该修改é�žé�™æ€�æˆ�员,但是这并ä¸�是å��分å�¯é� çš„,指针所指的é�žæˆ�员对象值å�¯èƒ½ä¼šè¢«æ”¹å�˜ã€‚ + +# static 关键字 + +[static详解](http://blog.csdn.net/shanghairuoxiao/article/details/72904292) + +# extern 关键字 + +[C/C++中extern关键字详解](http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html) + +# volatile 关键字 + +关键字volatile的作用是指示编译器,å�³ä½¿ä»£ç �ä¸�对å�˜é‡�å�šä»»ä½•改动,该å�˜é‡�的值ä»�å�¯èƒ½ä¼šè¢«å¤–界修改。æ“�作系统ã€�硬件或其他线程都有å�¯èƒ½ä¿®æ”¹è¯¥å�˜é‡�。该å�˜é‡�的值有å�¯èƒ½é�­å�—æ„�料之外的修改,因此,æ¯�一次使用时,编译器都会é‡�新从内存中获å�–这个值,而ä¸�是从寄存器中获å�–。 + +volatileå�˜é‡�ä¸�会被优化掉,这é�žå¸¸æœ‰ç”¨ã€‚设想有下é�¢è¿™ä¸ªå‡½æ•°ï¼š + +```c++ +int opt = 1; +void Fn(void) { +    start: +        if (opt == 1) goto start; +        else break; +} +``` + +ä¹�一看,上é�¢çš„代ç �好åƒ�会进入无é™�循环,编译器å�¯èƒ½ä¼šå°†è¿™æ®µä»£ç �优化æˆ�: +```c++ +void Fn(void) { +    start: +        int opt = 1; +        if (true) +        goto start; +} +``` + +这样就å�˜æˆ�了无é™�循环。然å�Žï¼Œå¤–部æ“�作å�¯èƒ½ä¼šå°†Â 0 写入å�˜é‡� opt 的ä½�置,从而终止循环。 + +为了防止编译器执行这类优化,我们需è¦�设法通知编译器,系统其他部分å�¯èƒ½ä¼šä¿®æ”¹è¿™ä¸ªå�˜é‡�。具体å�šæ³•å°±æ˜¯ä½¿ç”¨Â volatile 关键字, + +# new 与 maclloc 区别 + +1. new 分é…�内存按照数æ�®ç±»åž‹è¿›è¡Œåˆ†é…�,malloc 分é…�内存按照大å°�分é…�ï¼› +2. new ä¸�仅分é…�一段内存,而且会调用构造函数,但是 malloc 则ä¸�会。 +3. new 返回的是指定对象的指针,而 malloc 返回的是 void\*,因此 malloc 的返回值一般都需è¦�进行类型转化; +4. new 是一个æ“�作符å�¯ä»¥é‡�载,malloc 是一个库函数; +5. new 分é…�的内存è¦�用 delete 销æ¯�,malloc è¦�用 free æ�¥é”€æ¯�ï¼›delete 销æ¯�的时候会调用对象的æž�构函数,而 free 则ä¸�会; +6. malloc 分é…�的内存ä¸�够的时候,å�¯ä»¥ç”¨Â realloc 扩容。扩容的原ç�†ï¼Ÿnew 没用这样æ“�作; +7. new 如果分é…�失败了会抛出 bad_malloc 的异常,而 malloc 失败了会返回 NULL。因此对于 new,正确的姿势是采用 try...catch 语法,而 malloc 则应该判断指针的返回值。为了兼容很多 c 程åº�员的习惯,C++ 也å�¯ä»¥é‡‡ç”¨Â new nothrow 的方法ç¦�止抛出异常而返回 NULLï¼› +8. new 和 new[] 的区别,new[] 一次分é…�所有内存,多次调用构造函数,分别æ�­é…�使用 delete 和 delete[],å�Œç�†ï¼Œdelete[] 多次调用æž�构函数,销æ¯�数组中的æ¯�个对象。而 malloc 则å�ªèƒ½Â sizeof(int) * nï¼› +9. 如果ä¸�够å�¯ä»¥ç»§ç»­è°ˆÂ new 和 malloc 的实现,空闲链表,分é…�方法 ( 首次适é…�原则,最佳适é…�原则,最差适é…�原则,快速适é…�原则 )。delete 和 free 的实现原ç�†ï¼Œfree 为什么直到销æ¯�多大的空间? + +# 四ç§�类型转æ�¢ + +**const_cast** 用于将 const å�˜é‡�转为é�žÂ const + +**static_cast** 用的最多,对于å�„ç§�éš�å¼�转æ�¢ï¼Œé�žÂ const 转 const,void\* 转指针等 , static_cast 能用于多æ€�想上转化,如果å�‘下转能æˆ�功但是ä¸�安全,结果未知; + +**dynamic_cast** 用于动æ€�类型转æ�¢ã€‚å�ªèƒ½ç”¨äºŽå�«æœ‰è™šå‡½æ•°çš„类,用于类层次间的å�‘上和å�‘下转化。å�ªèƒ½è½¬æŒ‡é’ˆæˆ–引用。å�‘下转化时,如果是é�žæ³•的对于指针返回 NULL,对于引用抛异常。è¦�深入了解内部转æ�¢çš„原ç�†ã€‚ + +**reinterpret_cast** 几乎什么都å�¯ä»¥è½¬ï¼Œæ¯”如将 int 转指针,å�¯èƒ½ä¼šå‡ºé—®é¢˜ï¼Œå°½é‡�少用; + +为什么ä¸�使用 C 的强制转æ�¢ï¼ŸC 的强制转æ�¢è¡¨é�¢ä¸Šçœ‹èµ·æ�¥åŠŸèƒ½å¼ºå¤§ä»€ä¹ˆéƒ½èƒ½è½¬ï¼Œä½†æ˜¯è½¬åŒ–ä¸�够明确,ä¸�能进行错误检查,容易出错。 + +# 指针和引用的区别 + +指针ä¿�存的是所指对象的地å�€ï¼Œå¼•用是所指对象的别å��,指针需è¦�通过解引用间接访问,而引用是直接访问; + +指针å�¯ä»¥æ”¹å�˜åœ°å�€ï¼Œä»Žè€Œæ”¹å�˜æ‰€æŒ‡çš„对象,而引用必须从一而终; + +引用在定义的时候必须åˆ�始化,而指针则ä¸�需è¦�ï¼› + +指针有指å�‘常é‡�的指针和指针常é‡�,而引用没有常é‡�引用; + +指针更ç�µæ´»ï¼Œç”¨çš„好å¨�力无比,用的ä¸�好处处是å�‘,而引用用起æ�¥åˆ™å®‰å…¨å¤šäº†ï¼Œä½†æ˜¯æ¯”较死æ�¿ã€‚ + +# 指针和数组的è�”ç³» + +一个一维 int 数组的数组å��实际上是一个 int\* const 类型; +一个二维 int 数组的数组å��实际上是一个 int (\*const p)[n]; +数组å��å�šå�‚数会退化为指针 + +# 智能指针 + +构造函数中计数åˆ�始化为1ï¼› +æ‹·è´�构造函数中计数值加1ï¼› +赋值è¿�算符中,左边的对象引用计数å‡�一,å�³è¾¹çš„对象引用计数加一; +æž�构函数中引用计数å‡�一; +在赋值è¿�算符和æž�构函数中,如果å‡�一å�Žä¸º0,则调用delete释放对象。 +share_prt与weak_ptr的区别? + +```c++ +//share_ptrå�¯èƒ½å‡ºçŽ°å¾ªçŽ¯å¼•ç”¨ï¼Œä»Žè€Œå¯¼è‡´å†…å­˜æ³„éœ² +class A +{ +public: +    share_ptr p; +}; +class B +{ +public: +    share_ptr p; +} +int main() +{ +    while(true) +    { +        share_prt pa(new A()); //pa的引用计数åˆ�始化为1 +        share_prt pb(new B()); //pb的引用计数åˆ�始化为1 +        pa->p = pb; //pb的引用计数å�˜ä¸º2 +        pb->p = pa; //pa的引用计数å�˜ä¸º2 +    } +    //å�‡è®¾pa先离开,引用计数å‡�一å�˜ä¸º1,ä¸�为0å› æ­¤ä¸�会调用class Açš„æž�构函数,因此其æˆ�员p也ä¸�会被æž�构,pb的引用计数ä»�然为2ï¼› +    //å�Œç�†pb离开的时候,引用计数也ä¸�能å‡�到0 +    return 0; +} +/* +** weak_ptr是一ç§�弱引用指针,其存在ä¸�会影å“�引用计数,从而解决循环引用的问题 +``` + + + + +# 多æ€�性 + +作者:oscarwin +链接:https://www.nowcoder.com/discuss/59394 +æ�¥æº�:牛客网 + +C++多æ€�性与虚函数表 + +C++多æ€�的实现? +多æ€�分为é�™æ€�多æ€�和动æ€�多æ€�。é�™æ€�多æ€�是通过é‡�载和模æ�¿æŠ€æœ¯å®žçŽ°ï¼Œåœ¨ç¼–è¯‘çš„æ—¶å€™ç¡®å®šã€‚åŠ¨æ€�多æ€�通过虚函数和继承关系æ�¥å®žçŽ°ï¼Œæ‰§è¡ŒåŠ¨æ€�绑定,在è¿�行的时候确定。 +动æ€�多æ€�实现有几个æ�¡ä»¶ï¼š +(1) 虚函数; +(2) 一个基类的指针或引用指å�‘派生类的对象; +基类指针在调用æˆ�员函数(虚函数)时,就会去查找该对象的虚函数表。虚函数表的地å�€åœ¨æ¯�个对象的首地å�€ã€‚查找该虚函数表中该函数的指针进行调用。 +æ¯�个对象中ä¿�存的å�ªæ˜¯ä¸€ä¸ªè™šå‡½æ•°è¡¨çš„æŒ‡é’ˆï¼ŒC++内部为æ¯�一个类维æŒ�一个虚函数表,该类的对象的都指å�‘è¿™å�Œä¸€ä¸ªè™šå‡½æ•°è¡¨ã€‚ +虚函数表中为什么就能准确查找相应的函数指针呢?因为在类设计的时候,虚函数表直接从基类也继承过æ�¥ï¼Œå¦‚果覆盖了其中的æŸ�个虚函数,那么虚函数表的指针就会被替æ�¢ï¼Œå› æ­¤å�¯ä»¥æ ¹æ�®æŒ‡é’ˆå‡†ç¡®æ‰¾åˆ°è¯¥è°ƒç”¨å“ªä¸ªå‡½æ•°ã€‚ +虚函数的作用? + +虚函数用于实现多æ€�,这点大家都能答上æ�¥ +但是虚函数在设计上还具有å°�装和抽象的作用。比如抽象工厂模å¼�。 +动æ€�绑定是如何实现的? +第一个问题中基本回答了,主è¦�都是结å�ˆè™šå‡½æ•°è¡¨æ�¥ç­”就行。 + +é�™æ€�多æ€�和动æ€�多æ€�。é�™æ€�多æ€�是指通过模æ�¿æŠ€æœ¯æˆ–者函数é‡�载技术实现的多æ€�,其在编译器确定行为。动æ€�多æ€�是指通过虚函数技术实现在è¿�行期动æ€�绑定的技术。 + +虚函数表 + +虚函数表是针对类的还是针对对象的?å�Œä¸€ä¸ªç±»çš„两个对象的虚函数表是怎么维护的? + +编译器为æ¯�一个类维护一个虚函数表,æ¯�个对象的首地å�€ä¿�å­˜ç�€è¯¥è™šå‡½æ•°è¡¨çš„æŒ‡é’ˆï¼Œå�Œä¸€ä¸ªç±»çš„ä¸�å�Œå¯¹è±¡å®žé™…上指å�‘å�Œä¸€å¼ è™šå‡½æ•°è¡¨ã€‚ +纯虚函数如何定义,为什么对于存在虚函数的类中æž�构函数è¦�定义æˆ�虚函数 +为了实现多æ€�进行动æ€�绑定,将派生类对象指针绑定到基类指针上,对象销æ¯�时,如果æž�构函数没有定义为æž�构函数,则会调用基类的æž�构函数,显然å�ªèƒ½é”€æ¯�部分数æ�®ã€‚如果è¦�调用对象的æž�构函数,就需è¦�将该对象的æž�构函数定义为虚函数,销æ¯�时通过虚函数表找到对应的æž�构函数。 + +1 +2 +//纯虚函数定义 +virtual ~myClass() = 0; +æž�构函数能抛出异常å�— +答案肯定是ä¸�能。 + +C++标准指明æž�构函数ä¸�能ã€�也ä¸�应该抛出异常。C++异常处ç�†æ¨¡åž‹æœ€å¤§çš„特点和优势就是对C++中的é�¢å�‘对象æ��供了最强大的无ç¼�支æŒ�。那么如果对象在è¿�行期间出现了异常,C++异常处ç�†æ¨¡åž‹æœ‰è´£ä»»æ¸…除那些由于出现异常所导致的已ç»�失效了的对象(也å�³å¯¹è±¡è¶…出了它原æ�¥çš„作用域),并释放对象原æ�¥æ‰€åˆ†é…�的资æº�, 这就是调用这些对象的æž�构函数æ�¥å®Œæˆ�释放资æº�的任务,所以从这个æ„�义上说,æž�构函数已ç»�å�˜æˆ�了异常处ç�†çš„一部分。 + +(1) 如果æž�构函数抛出异常,则异常点之å�Žçš„程åº�ä¸�会执行,如果æž�构函数在异常点之å�Žæ‰§è¡Œäº†æŸ�些必è¦�的动作比如释放æŸ�些资æº�,则这些动作ä¸�会执行,会造æˆ�诸如资æº�泄æ¼�的问题。 + +(2) 通常异常å�‘生时,c++的机制会调用已ç»�构造对象的æž�构函数æ�¥é‡Šæ”¾èµ„æº�,此时若æž�构函数本身也抛出异常,则å‰�一个异常尚未处ç�†ï¼Œå�ˆæœ‰æ–°çš„异常,会造æˆ�程åº�崩溃的问题。 + +构造函数和æž�构函数中调用虚函数å�—? + + +# 内存对é½� + +作者:oscarwin +链接:https://www.nowcoder.com/discuss/59394 +æ�¥æº�:牛客网 + +从0ä½�置开始存储; +å�˜é‡�存储的起始ä½�置是该å�˜é‡�大å°�的整数å€�ï¼› +结构体总的大å°�是其最大元素的整数å€�,ä¸�足的å�Žé�¢è¦�è¡¥é½�ï¼› +结构体中包å�«ç»“构体,从结构体中最大元素的整数å€�开始存; +如果加入pragma pack(n) ,å�–nå’Œå�˜é‡�自身大å°�较å°�的一个。 + +# 内è�”函数 + +å®�定义在预编译的时候就会进行å®�替æ�¢ï¼› + +内è�”函数在编译阶段,在调用内è�”函数的地方进行替æ�¢ï¼Œå‡�少了函数的调用过程,但是使得编译文件å�˜å¤§ã€‚因此,内è�”函数适å�ˆç®€å�•函数,对于å¤�æ�‚函数,å�³ä½¿å®šä¹‰äº†å†…è�”编译器å�¯èƒ½ä¹Ÿä¸�会按照内è�”的方å¼�进行编译。 + +内è�”函数相比å®�定义更安全,内è�”函数å�¯ä»¥æ£€æŸ¥å�‚数,而å®�定义å�ªæ˜¯ç®€å�•的文本替æ�¢ã€‚因此推è��使用内è�”函数,而ä¸�是å®�定义。 + +使用å®�定义函数è¦�特别注æ„�给所有å�•元都加上括å�·ï¼Œ#define MUL(a, b) a b,这很å�±é™©ï¼Œæ­£ç¡®å†™æ³•:#define MUL(a, b) ((a) (b)) + +# 内存管ç�† + +C++ 内存分为那几å�—?(堆区,栈区,常é‡�区,é�™æ€�和全局区) +æ¯�å�—存储哪些å�˜é‡�? +学会è¿�移,å�¯ä»¥è¯´åˆ°Â malloc,从 malloc 说到æ“�作系统的内存管ç�†ï¼Œè¯´é�“内核æ€�和用户æ€�,然å�Žå°±ä»€ä¹ˆé«˜ç«¯å†…存,slab 层,伙伴算法,VMA å�¯ä»¥å·´æ‹‰å·´æ‹‰äº†ï¼ŒæŽ¥ç�€å�¯ä»¥è¿�移到 fork()。 + +# STL 的内存池实现 + +STL 内存分é…�分为一级分é…�器和二级分é…�器,一级分é…�器就是采用 malloc 分é…�内存,二级分é…�器采用内存池。 + +二级分é…�器设计的é�žå¸¸å·§å¦™ï¼Œåˆ†åˆ«ç»™Â 8k,16k,..., 128k 等比较å°�的内存片都维æŒ�一个空闲链表,æ¯�个链表的头节点由一个数组æ�¥ç»´æŠ¤ã€‚需è¦�分é…�内存时从å�ˆé€‚大å°�的链表中å�–一å�—下æ�¥ã€‚å�‡è®¾éœ€è¦�分é…�一å�— 10K 的内存,那么就找到最å°�的大于等于 10k 的å�—,也就是 16K,从16K 的空闲链表里å�–出一个用于分é…�。释放该å�—内存时,将内存节点归还给链表。如果è¦�分é…�的内存大于 128K 则直接调用一级分é…�器。 + +为了节çœ�ç»´æŒ�链表的开销,采用了一个 union 结构体,分é…�器使用 union 里的 next 指针æ�¥æŒ‡å�‘下一个节点,而用户则使用 union 的空指针æ�¥è¡¨ç¤ºè¯¥èŠ‚ç‚¹çš„åœ°å�€ã€‚ + +# STL 里的 set 和 map 实现 + +set 和 map 都是基于红黑树实现的。 + +红黑树是一ç§�平衡二å�‰æŸ¥æ‰¾æ ‘,AVL 树是完全平衡的,红黑树基本上是平衡的。 + +与 AVL 相比红黑数æ�’入和删除最多å�ªéœ€è¦� 3 次旋转,而 AVL 树为了维æŒ�其完全平衡性,在å��的情况下è¦�旋转的次数太多。 + +# 必须在构造函数åˆ�始化列表里进行åˆ�始化的数æ�®æˆ�员 + +1. 常é‡�æˆ�员,因为常é‡�å�ªèƒ½åˆ�始化ä¸�能赋值,所以必须放在åˆ�始化列表里é�¢ï¼› +2. 引用类型,引用必须在定义的时候åˆ�始化,并且ä¸�能é‡�新赋值,所以也è¦�写在åˆ�始化列表里é�¢ï¼› +3. 没有默认构造函数的类类型,因为使用åˆ�始化列表å�¯ä»¥ä¸�必调用默认构造函数æ�¥åˆ�始化,而是直接调用拷è´�构造函数åˆ�始化。 + +# 手写 strcpy() + +```c++ +char* strcpy(char* dest, const char* src) +{ +    char *save = dest; +    while (*dest++ = *src++){} +    return save; +} +``` + +```c++ +char src[] = "abc"; +char dest[10]; // dest 必须大于 src +strcpy(dest, src); +cout << dest << endl; +``` + +# 手写 strcat() + +``` +char* strcat(char* dest, const char* src) +{ +    char* save = dest; +    while (*dest) dest++; +    while(*dest++ = *src++){} +    return save; +} +``` + +# 手写 strcmp() + +```c++ +int strcmp(const char* s1, const char* s2) +{ +    while(*s1 == *s2 && *s1) +    { +        s1++; +        s2++; +    } +    return *s1 - *s2; +} +``` + +# 手写 strstr() + +è¦�求ä¸�能用其它库函数。 + +直接使用暴力方法,æ¯�次比较 src 的一部分是å�¦ä¸ŽÂ target 相等。 + +循环体å�ªéœ€è¦�执行 N - M + 1 次å�³å�¯ï¼Œç”±äºŽä¸�能用 strlen() ,因此无法直接计算出 N 与 M,å�¯ä»¥ä½¿ç”¨ä¸€ä¸ªé¢�外的指针,令它先从 src 头部移动 M - 1 次,这样它还å�¯ä»¥å†�移动的次数就为 N - M + 1 次。 + +```c++ +char* strstr(const char* src, const char* target) +{ +    if (!*target) return (char*)src; +    char *p1 = (char*)src, *p2 = (char*)target; +    char* p1_ahead = (char*)src; +    while (*++p2) +        p1_ahead++; +    while (*p1_ahead++) +    { +        char* p1_begin = p1; +        p2 = (char*)target; +        while (*p1 && *p2 && *p1++ == *p2++) +        { +        } +        if (!*p2) return p1_begin; +        p1 = p1_begin + 1; +    } +    return nullptr; +} +``` + + +# 手写 memcpy() + +```c++ +void* memcpy(void* dest, const void* src, size_t len) +{ +    char* d = (char *)dest; +    const char* s = (char *)src; +    while (len--) +        *d++ = *s++; +    return dest; +} +``` + +# å�‚考资料 + +- [C++å�Žå�°å¼€å�‘é�¢è¯•常è§�问题汇总](https://www.nowcoder.com/discuss/59394) +- [函数strcpyã€�strcatå’Œstrcmp实现æº�ç �](http://blog.csdn.net/wangningyu/article/details/4662891) +- [Github : gcc/libgcc/memcpy.c](https://github.com/gcc-mirror/gcc/blob/master/libgcc/memcpy.c) +- [Leetcode : Implement strstr() to Find a Substring in a String](https://articles.leetcode.com/implement-strstr-to-find-substring-in/) \ No newline at end of file diff --git a/notes/笔记/Git.md.txt b/notes/笔记/Git.md.txt new file mode 100644 index 00000000..c399f20c --- /dev/null +++ b/notes/笔记/Git.md.txt @@ -0,0 +1,164 @@ +![](index_files/0f6fe85a-b680-47ea-af67-21ab98a62f8c.jpg) + +[TOC] + +# 学习资料 + +> [git - 简明指å�—](http://rogerdudler.github.io/git-guide/index.zh.html) + +图文å¼�简介 + +> [Github : my-git](https://github.com/xirong/my-git) + +汇总å¼�的资料收集和简介,下é�¢çš„很多资料都是从这里找到的。 + +> [图解 Git](http://marklodato.github.io/visual-git-guide/index-zh-cn.html) + +简æ´�明了。 + +> [廖雪峰 : Git教程](https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b000) + +比较系统的对 git 进行介ç»�,很适å�ˆå­¦ä¹  + +> [Learn Git Branching](https://learngitbranching.js.org/) + +交互å¼�学习 + +# 集中å¼�与分布å¼� + +Git 属于分布å¼�版本控制系统,而 SVN 属于集中å¼�。 + +集中å¼�版本控制å�ªæœ‰ä¸­å¿ƒæœ�务器拥有一份代ç �,而分布å¼�版本控制æ¯�个人的电脑上就有一份完整的代ç �。 + +集中å¼�版本控制有安全性问题,当中心æœ�务器挂了所有人都没办法工作了。 + +集中å¼�版本控制需è¦�连网æ‰�能工作,如果网速过慢,那么æ��交一个文件的会慢的无法让人å¿�å�—。而分布å¼�版本控制ä¸�需è¦�连网就能工作。 + +分布å¼�版本控制新建分支ã€�å�ˆå¹¶åˆ†æ”¯æ“�作速度é�žå¸¸å¿«ï¼Œè€Œé›†ä¸­å¼�版本控制新建一个分支相当于å¤�制一份完整代ç �。 + +# Git 的中心æœ�务器 + +Git 的中心æœ�务器用æ�¥äº¤æ�¢æ¯�个用户的修改。没有中心æœ�务器也能工作,但是中心æœ�务器能够 24 å°�æ—¶ä¿�æŒ�开机状æ€�,这样就能更方便的交æ�¢ä¿®æ”¹ã€‚Github 就是一ç§� Git 中心æœ�务器。 + +# Git 工作æµ� + +![](index_files/a1198642-9159-4d88-8aec-c3b04e7a2563.jpg) + +新建一个版本库之å�Žï¼Œå½“å‰�目录就æˆ�为了工作区,工作区下有一个éš�è—�目录 .git,它属于 Git 的版本库。 + +Git 版本库有一个称为 Stage 的暂存区,还有自动创建的 master 分支以å�ŠæŒ‡å�‘分支的 Head 指针。 + +![](index_files/46f66e88-e65a-4ad0-a060-3c63fe22947c.png) + + +- git add files 把文件的修改添加到暂存区; +- git commit 把暂存区的修改æ��交到当å‰�分支,æ��交之å�Žæš‚存区就被清空了; +- git reset -- files 用æ�¥æ’¤é”€æœ€å�Žä¸€æ¬¡ git add files,也å�¯ä»¥ç”¨ git reset 撤销所有暂存区。 +- git checkout -- files 把文件从暂存区å¤�制到工作目录,用æ�¥ä¸¢å¼ƒæœ¬åœ°ä¿®æ”¹ã€‚ + +![](index_files/17976404-95f5-480e-9cb4-250e6aa1d55f.png) + +å�¯ä»¥è·³è¿‡æš‚存区域直接从仓库å�–出文件或者直接æ��交代ç �。 + +- git commit -a 直接把所有文件的修改添加到暂缓区然å�Žæ‰§è¡Œæ��交。 +- git checkout HEAD -- files 回滚到å¤�制最å�Žä¸€æ¬¡æ��交。 + +# 分支实现 + +Git 把æ¯�次æ��交都连æˆ�一æ�¡æ—¶é—´çº¿ã€‚ + +分支使用指针æ�¥å®žçŽ°ï¼Œä¾‹å¦‚ master 分支指å�‘时间线的最å�Žä¸€ä¸ªèŠ‚ç‚¹ï¼Œä¹Ÿå°±æ˜¯æœ€å�Žä¸€æ¬¡æ��交。 + +HEAD 指针指å�‘的是当å‰�分支。 + +![](index_files/fb546e12-e1fb-4b72-a1fb-8a7f5000dce6.jpg) + +新建分支是新建一个指针指å�‘时间线的最å�Žä¸€ä¸ªèŠ‚ç‚¹ï¼Œå¹¶è®© HEAD 指针指å�‘新分支表示新分支æˆ�为当å‰�分支。 + +![](index_files/bc775758-89ab-4805-9f9c-78b8739cf780.jpg) + +æ¯�次æ��交å�ªä¼šè®©å½“å‰�分支å�‘å‰�移动,而其它分支ä¸�会移动。 + +![](index_files/5292faa6-0141-4638-bf0f-bb95b081dcba.jpg) + +å�ˆå¹¶åˆ†æ”¯ä¹Ÿå�ªéœ€è¦�改å�˜æŒ‡é’ˆå�³å�¯ã€‚ + +![](index_files/1164a71f-413d-494a-9cc8-679fb6a2613d.jpg) + +# 冲çª� + +当两个分支都对å�Œä¸€ä¸ªæ–‡ä»¶è¿›è¡Œäº†ä¿®æ”¹ï¼Œåœ¨åˆ†æ”¯å�ˆå¹¶æ—¶å°±ä¼šäº§ç”Ÿå†²çª�。 + +![](index_files/58e57a21-6b6b-40b6-af85-956dd4e0f55a.jpg) + +Git 会使用 <<<<<<< ,======= ,>>>>>>> 标记出ä¸�å�Œåˆ†æ”¯çš„内容,å�ªéœ€è¦�把ä¸�å�Œåˆ†æ”¯ä¸­å†²çª�部分修改æˆ�一样就能解决冲çª�。 + +``` +<<<<<<< HEAD +Creating a new branch is quick & simple. +======= +Creating a new branch is quick AND simple. +>>>>>>> feature1 +``` + +# Fast forward + +"å¿«è¿›å¼�å�ˆå¹¶"(fast-farward merge),会直接将 master 分支指å�‘å�ˆå¹¶çš„分支,这ç§�模å¼�下进行分支å�ˆå¹¶ä¼šä¸¢å¤±åˆ†æ”¯ä¿¡æ�¯ï¼Œä¹Ÿå°±ä¸�能在分支历å�²ä¸Šçœ‹å‡ºåˆ†æ”¯ä¿¡æ�¯ã€‚ + +å�¯ä»¥åœ¨å�ˆå¹¶æ—¶åŠ ä¸Š --no-ff å�‚æ•°æ�¥ç¦�用 Fast forward 模å¼�,并且加上 -m å�‚数让å�ˆå¹¶æ—¶äº§ç”Ÿä¸€ä¸ªæ–°çš„ commit。 + +``` +$ git merge --no-ff -m "merge with no-ff" dev +``` + +![](index_files/dd78a1fe-1ff3-4bcf-a56f-8c003995beb6.jpg) + +# 分支管ç�†ç­–ç•¥ + +master 分支应该是é�žå¸¸ç¨³å®šçš„,å�ªç”¨æ�¥å�‘布新版本; + +日常开å�‘在开å�‘分支 dev 上进行。 + +![](index_files/245fd2fb-209c-4ad5-bc5e-eb5664966a0e.jpg) + +# 储è—�(Stashing) + +在一个分支上æ“�作之å�Žï¼Œå¦‚果还没有将修改æ��交到分支上,此时进行切æ�¢åˆ†æ”¯ï¼Œé‚£ä¹ˆå�¦ä¸€ä¸ªåˆ†æ”¯ä¸Šä¹Ÿèƒ½çœ‹åˆ°æ–°çš„修改。这是因为所有分支都共用一个工作区的缘故。 + +å�¯ä»¥ä½¿ç”¨ git stash 将当å‰�分支的修改储è—�èµ·æ�¥ï¼Œæ­¤æ—¶å½“å‰�工作区的所有修改都会被存到栈上,也就是说当å‰�工作区是干净的,没有任何未æ��交的修改。此时就å�¯ä»¥å®‰å…¨çš„切æ�¢åˆ°å…¶å®ƒåˆ†æ”¯ä¸Šäº†ã€‚ + +``` +$ git stash +Saved working directory and index state \ "WIP on master: 049d078 added the index file" +HEAD is now at 049d078 added the index file (To restore them type "git stash apply") +``` + +该功能å�¯ä»¥ç”¨äºŽ bug 分支的实现。如果当å‰�正在 dev 分支上进行开å�‘,但是此时 master 上有个 bug 需è¦�ä¿®å¤�,但是 dev 分支上的开å�‘还未完æˆ�,ä¸�想立å�³æ��交。在新建 bug 分支并切æ�¢åˆ° bug 分支之å‰�就需è¦�使用 git stash å°† dev 分支的未æ��交修改储è—�èµ·æ�¥ã€‚ + +# SSH 传输设置 + +Git 仓库和 Github 中心仓库之间是通过 SSH 加密。 + +如果工作区下没有 .ssh 目录,或者该目录下没有 id_rsa å’Œ id_rsa.pub 这两个文件,å�¯ä»¥é€šè¿‡ä»¥ä¸‹å‘½ä»¤æ�¥åˆ›å»º SSH Key: + +``` +$ ssh-keygen -t rsa -C "youremail@example.com" +``` + +ç„¶å�ŽæŠŠå…¬é’¥ id_rsa.pub 的内容å¤�制到 Github "Account settings" çš„ SSH Keys 中。 + +# .gitignore 文件 + +忽略以下文件: + +1. æ“�作系统自动生æˆ�的文件,比如缩略图; +2. 编译生æˆ�的中间文件,比如 Java 编译产生的 .class 文件; +3. 自己的æ•�感信æ�¯ï¼Œæ¯”如存放å�£ä»¤çš„é…�置文件。 + +ä¸�需è¦�全部自己编写,å�¯ä»¥åˆ° [https://github.com/github/gitignore](https://github.com/github/gitignore) 中进行查询。 + +# Git 命令一览 + +![](index_files/7a29acce-f243-4914-9f00-f2988c528412.jpg) + +比较详细的地å�€ï¼šhttp://www.cheat-sheets.org/saved-copy/git-cheat-sheet.pdf \ No newline at end of file diff --git a/notes/笔记/Github.md.txt b/notes/笔记/Github.md.txt new file mode 100644 index 00000000..d34332ab --- /dev/null +++ b/notes/笔记/Github.md.txt @@ -0,0 +1,143 @@ +[TOC] + +# 第 1 章 Github 课程介ç»� + +Git 是一个版本控制工具,由 Linux 之父 Linus 编写完æˆ�。相比于 CVS 和 SVN 等集中å¼�版本管ç�†å·¥å…·ï¼ŒGit 分布å¼�的特点给它带æ�¥äº†å¾ˆå¤§çš„优势:首先它ä¸�需è¦�åƒ�集中å¼�的版本管ç�†å·¥å…·ä¸€æ ·å�ªæœ‰è¿žç½‘æ‰�能进行æ“�作,其次它的分布å¼�特点使得æ¯�个项目å�ˆä½œè€…本地都有一个项目的完整版本,这é�¿å…�了集中å¼�版本管ç�†å·¥å…·ä¼šå‡ºçŽ°çš„å› ä¸ºä¸­å¤®æœ�务器故障而导致的代ç �丢失的问题。需è¦�注æ„�的是,Git 也有一个中央æœ�务器,å�ªä¸�过这个中央æœ�务器是用æ�¥åˆ†å�‘å�„个å�ˆä½œè€…的版本的中介,ä¸�åƒ�集中å¼�那样起到所有版本的管ç�†è€…的角色。 + +Git 能够ç�«èµ·æ�¥æœ‰ä¸€ä¸ªä¸»è¦�的原因是它体现了互è�”网的开æº�文化,GitHub 这个网站是基于 Git 而创建的,将这ç§�å¼€æº�文化å�‘扬光大。GitHub 现在是全ç�ƒæœ€å¤§çš„å¼€æº�代ç �托管平å�°ï¼Œå®ƒé‡�新定义了软件开å�‘çš„æµ�程,因为很多软件功能都å�¯ä»¥åœ¨Â GitHub 上找到相应的æº�代ç �,而ä¸�需è¦�é‡�新编写,这大大å‡�低了软件开å�‘æ—¶é—´å’Œæˆ�本。 + +Git 是一个命令行的工具,GitHub 的图形化界é�¢è®©Â Git 的使用更简å�•,å�¯ä»¥ç»“å�ˆÂ GitHub 的桌é�¢å®¢æˆ·ç«¯å’ŒÂ GitHub 的网站æ�¥ä¸€èµ·ä½¿ç”¨ã€‚ + +# 第 2 章 æµ�览器中使用 Github + +**commit** :GitHub 以一个 commit 作为一个版本。æ¯�当项目被修改å�Žï¼Œéœ€è¦�进行一次 commit æ“�作。å�¯ä»¥æŸ¥çœ‹æ¯�个 commit å�šçš„什么样的修改,包括修改时间,修改人,修改内容。一个 commit 在 GitHub 中 具有一个版本å�·ï¼Œè¿˜æœ‰çˆ¶ç‰ˆæœ¬å�·ï¼Œçˆ¶ç‰ˆæœ¬å�·æ˜¯ä¸ºäº†è®°å½•版本的历å�²çº¿ã€‚ + +![](index_files/25c861a6-e70e-47b7-9447-df17d74b75a1.jpg) + +![](index_files/d0bc7eca-bd58-4fab-b559-7ebdd508702f.jpg) + +# 第 3 章 GitHub 客户端的使用 + +本地有更好用的编辑器和 IDE ,因此基本上需è¦�在本地使用 GitHub。使用桌é�¢å®¢æˆ·ç«¯å�¯ä»¥æ›´ç®€å�•方便地使用 GitHub,如果直接使用 Git 命令行工具,会暴露在å¤�æ�‚的概念é�¢å‰�,ä¸�容易掌æ�¡ã€‚ + +在本地的仓库里é�¢è¿›è¡Œä¿®æ”¹å�Žï¼Œä¼šåœ¨æ¡Œé�¢å®¢æˆ·ç«¯è‡ªåŠ¨æ˜¾ç¤ºÂ change。 + +![](index_files/02e1268b-4e4e-46d4-a437-61f586f8d939.jpg) + +一个 commit 需è¦�有 Summary 和 Description,以便以å�Žå›žå¤´çœ‹è¿™ä¸ªÂ commit 能够知é�“进行了哪些修改。 + +Publish 用于å�‘布一个本地的 repostory 到 GitHub 上。å�‘布之å�Žï¼Œå�¯ä»¥ç”¨Â Sync å�Œæ­¥æœ¬åœ°çš„ commit 到 GitHub æœ�务器上。 + +客户端上的 Undo å�ªèƒ½æ˜¯æ’¤é”€è¿˜æœªå�Œæ­¥çš„一个版本,而 Revert æ‰�能撤销已ç»�å�Œæ­¥çš„版本,它本身也作为一个 commit æ��交到æœ�务器,抵消了上一次的 commit å�šçš„修改。 + +Roll Back to this Commit å�¯ä»¥å›žæ»šåˆ°é€‰å®šçš„一个版本,也是作为一个 commit æ��交到æœ�务器进行æ“�作。 + +# 第 4 章 简å�•分支æ“�作 + +分支是用指针æ�¥å®žçŽ°çš„ï¼Œmaster 分支的指针指å�‘最新的一个版本。 + +![](index_files/3f3d800e-7068-487c-a915-ec723d9c4d15.jpg) + +新建一个分支,没有å¤�制å�„个版本,而是新建的一个指针和 master 指å�‘å�Œä¸€ä¸ªç‰ˆæœ¬ï¼Œåœ¨è¿™ä¸ªåˆ†æ”¯ä¸Šçš„æ“�作å�ªæ˜¯ç§»åŠ¨è¿™ä¸ªåˆ†æ”¯çš„æŒ‡é’ˆã€‚ + +![](index_files/a25b5785-ce00-4703-8462-0cfa06d485e6.jpg) + +![](index_files/a6fa121a-6a48-4da9-8a7a-4b477c397630.jpg) + +新建分支的目的是为了完æˆ�一个新想法,而ä¸�去污染 master 分支。 + +å�¯ä»¥è‡ªç”±çš„切æ�¢åˆ†æ”¯ï¼Œåœ¨ä¸�å�Œåˆ†æ”¯ä¸Šè¿›è¡Œæ“�作互ä¸�å½±å“�。 + +è¦�å�‘布一个新分支å�‘布到 GitHub 上也是用 Publish。 + +删除一个分支:当å‰�分支ä¸�å�¯åˆ é™¤ï¼Œéœ€è¦�切æ�¢åˆ°å…¶å®ƒåˆ†æ”¯æ‰�å�¯ä»¥åˆ é™¤ã€‚Unpublish 是ä¸�å�‘布分支,也就是删除远程æœ�务器上的分支,但是本地上的分支会ä¿�留;而 Delete 是直接删除本地分支,并且远程æœ�务器上的分支也会被删除。 + +master 是默认分支,ä¸�能被删除,å�¯ä»¥é€šè¿‡åœ¨è®¾ç½®ä¸­ä¿®æ”¹é»˜è®¤åˆ†æ”¯ä¸ºå…¶å®ƒåˆ†æ”¯ç„¶å�Žå†�删除 master 分支。需è¦�到 Github 网站上的 setting 中设置默认分支。 + +# 第 5 章 分支å�ˆå¹¶ + +通过 merge å�ˆå¹¶åˆ†æ”¯ä¹‹å�Žï¼Œä¼šä»¥ä¸€ä¸ªÂ commit 的形å¼�æ��交,称为èž�å�ˆç‰ˆæœ¬ï¼Œå®ƒæœ‰ä¸¤ä¸ªçˆ¶ç‰ˆæœ¬å�·ï¼Œå¹¶ä¸” master 指针会指å�‘这个 commit。 + +![](index_files/e6124f92-51f5-4be7-8e03-aa9ea80db04d.jpg) + +在并行开å�‘过程中,两个分支å�¯èƒ½å�Œæ—¶è¿›è¡Œä¿®æ”¹ï¼Œå¦‚果对å�Œä¸€ä¸ªæ–‡ä»¶è¿›è¡Œäº†è€Œä¿®æ”¹ï¼Œå°±ä¼šé€ æˆ�冲çª�。 + +本地 master 和远程 master å�¯ä»¥çœ‹æˆ�两个分支,å�Œæ ·ä¹Ÿå�¯èƒ½å‡ºçް冲çª�的情况,使用 Sync 就是一个å�ˆå¹¶æœ¬åœ°Â master 分支和远端 master 分支的æ“�作。 + +å�‘生冲çª�的文件会自动添加冲çª�标识符,修改的时候也è¦�把冲çª�标示符删除。 + +![](index_files/b4fd1a14-ca5f-4916-b6dd-c5c2784d762e.jpg) + +# 第 6 章 团队å��作æµ�程 + +通过 Github 网站的 Setting 中的 Collaborators å�¯ä»¥ä¸ºä¸€ä¸ªä»“库添加å��作者,å��作者对项目具有写æ�ƒé™�。 + +æ¯�个å��作者å�¯ä»¥ç›´æŽ¥å¯¹ä»“库进行修改,但是很容易产生冲çª�,å�ªæœ‰åœ¨å�šä¸€ç‚¹å°�修改时æ‰�这么å�šã€‚当开å�‘新功能时,一般是新建一个新分支,然å�Žåœ¨æ–°åˆ†æ”¯ä¸Šè¿›è¡Œä¿®æ”¹ã€‚新分支è¦�å�ˆå¹¶åˆ°Â master 分支上之å‰�,先æ��交一个 pull request æ�¥å¼•å�‘讨论和代ç �审核,之å�Žå†�进行å�ˆå¹¶æ“�作。 + +新建分支之å�Žï¼Œä½¿ç”¨Â Sync 就å�¯ä»¥å�‘布一个 pull request,而ä¸�是用 publish 该分支。 + +**Github Flow** + +1. 新建è¯�题分支 +![](index_files/ba69b54f-aa39-4b5c-a474-d89448803f91.jpg) + +2. 实现功能,å�šæˆ�一个个新版本 +![](index_files/ab9ad765-a7b5-427d-ba6b-df0c23721fa7.jpg) + +3. å�‘起 pull request,就是请求项目å�‚与者 pull 该分支并进行审查和讨论。 +![](index_files/f201cd06-a6ce-44b3-919b-3a956d9bd977.jpg) + +4. 审查和讨论。该过程的讨论和论å�›ä¸Šç±»ä¼¼ï¼Œè€Œä¸”该过程也å�¯ä»¥ç»§ç»­æ��交新的 commit,而ä¸�用å†�次å�‘ pull request。 +![](index_files/1cdbd78d-0043-40c4-aad5-400d6a74ec69.jpg) +![](index_files/a96896ee-f50c-4a32-947a-0cb949a5fc38.jpg) + +5. 最å�Žå��作者通过 merge pull request æ�¥å�ˆå¹¶ +![](index_files/60f8eb23-f398-4987-9eb8-69c383d710d9.jpg) + +# 第 7 章 开æº�项目共享æµ�程 + +![](index_files/1ae45cb9-6540-40a4-9edb-02a71172259e.jpg) + +å¼€æº�项目以陌生人为主,ä¸�å�¯èƒ½æ¯�个人都æˆ�为 Collaborators。 + +fork 之å�Žç›¸å½“于拷è´�一份仓库到自己的 Github 上,类似于新建了一个分支。 + +如果å�ªæ˜¯å¯¹æŸ�个文件进行修改,那么å�¯ä»¥åœ¨Â Github 网站上通过修改按钮进行修改,会自动创建一个 pull request,而ä¸�用先 fork。 + + +# 第 8 章 GitHub Issues + +Github æ��供了三ç§�辅助设施:GitHub Pages:æ�­å»ºé¡¹ç›®ä¸»é¡µã€�Wiki:知识库ã€�Issues:事务å�¡ç‰‡ã€‚ + +一个 Issues 相当于一个讨论区,å�¯ä»¥Â @ æŸ�个人让他å�‚与进æ�¥ã€‚æ¯�个 Issues 都有编å�·ï¼Œç”¨Â #+ 编å�·Â å�¯ä»¥æŒ‡å®šæŸ�个 Issues。当è¦�回å¤�å‰�é�¢æŸ�个评论时,å�¯ä»¥ç”¨Â > 引用å‰�é�¢çš„内容,然å�Žå†�在下方写回å¤�。> 是 markdown 的一个标记,其å�Žé�¢éœ€è¦�跟上引用内容。一个评论也有特定的链接,å�¯ä»¥åœ¨æ–°è¯„论中æ�’入该链接æ�¥å¿«é€Ÿå®šä½�。 + +![](index_files/cfdf5e0c-8860-4901-beef-c3d6ccaf4c6a.jpg) + +Pull Request 会创建一个 Issues。 + +在一个 commit 的 sumnary 内容å�Žé�¢åŠ ä¸ŠÂ Issues å�·ï¼Œä¼šè‡ªåŠ¨åœ¨Â Issues å�Žé�¢æ–°å¢žè¿™ä¸ªÂ commit 内容。 + +![](index_files/b7307f8a-52be-4c84-babe-1362e3069086.jpg) + +# 第 9 章 GitHub Pages + +å�¯ä»¥æ�­å»ºçš„网站分为用户和组织ã€�项目。 + +在项目中新建一个 gh-pages 分支,å�¯ä»¥åˆ é™¤é‡Œé�¢çš„其它文件,å�ªæ”¾ç½‘页的文件,比如 index.html。域å��为 用户å�� .Github.io/ 项目å��。 + +å�¯ä»¥ä½¿ç”¨Â Jekyll 等å‰�端框架。 + +# 第 10 章 GitHub 的秘密机关 + +在 Github 网站的项目主页上按 t 快æ�·é”®å�¯ä»¥æ‰“å¼€æ�œç´¢é¡¹ç›®æ–‡ä»¶çš„界é�¢ã€‚ + +![](index_files/454f65d3-d700-432e-9637-e7f7b8da44e6.jpg) + +# 第 11 章 Until Next Time,Goodbye + +GitLab 是一个开æº�å…�费的类似于 GitHub 的项目,å�¯ä»¥ç”¨å®ƒæ�¥æ�­å»ºç§�有仓库。 + +# 资æº� + +- [ 课程地å�€Â ](http://www.imooc.com/learn/390) +- [ 课程的文档地å�€Â ](http://book.haoduoshipin.com/Gitbeijing/) diff --git a/notes/笔记/HTTP+.md.txt b/notes/笔记/HTTP+.md.txt new file mode 100644 index 00000000..7735c4db --- /dev/null +++ b/notes/笔记/HTTP+.md.txt @@ -0,0 +1,29 @@ +# å�„个 HTTP 版本的对比 + +1997 å¹´ 1 月公布的 HTTP/1.1 是目å‰�主æµ�çš„ HTTP å��议版本。HTTP/2 标准于 2015 å¹´ 5 月以 RFC 7540 æ­£å¼�å�‘表。HTTP/2 的标准化工作由Chromeã€�Operaã€�Firefoxã€�Internet Explorer 11ã€�Safariã€�Amazon Silk å�Š Edge ç­‰æµ�览器æ��供支æŒ�。多数主æµ�æµ�览器已ç»�在 2015 年底支æŒ�了该å��议。此外,根æ�® W3Techs 的数æ�®ï¼Œåœ¨ 2017 å¹´ 5 月,在排å��å‰�一å�ƒä¸‡çš„网站中,有 13.7% 支æŒ�了 HTTP/2。 + +## HTTP/1.0 与 HTTP/1.1 的区别 + +- HTTP/1.1 默认是长连接; +- HTTP/1.1 æ��供了范围请求功能; +- HTTP/1.1 æ��供了虚拟主机的功能; +- HTTP/1.1 多了一些缓存处ç�†å­—段; +- HTTP/1.1 多了一些状æ€�ç �ï¼› + +## HTTP/1.1 与 HTTP/2.0 的区别 + +**多路å¤�用** + +HTTP/2.0 使用多路å¤�用技术,å�³ä½¿ç”¨å�Œä¸€ä¸ª TCP 连接æ�¥å¤„ç�†å¤šä¸ªè¯·æ±‚。 + +**首部压缩** + +HTTP1.1 的首部带有大é‡�ä¿¡æ�¯ï¼Œè€Œä¸”æ¯�次都è¦�é‡�å¤�å�‘é€�,HTTP/2.0 è¦�求通讯å�Œæ–¹å�„自缓存一份首部字段表,从而é�¿å…�了é‡�å¤�传输。 + +**æœ�务端推é€�** + +在客户端请求一个资æº�时,会把相关的资æº�一起å�‘é€�给客户端,客户端就ä¸�需è¦�å†�次å�‘起请求了。例如客户端请求 index.html 页é�¢ï¼Œæœ�务端就把 index.js 一起å�‘给客户端。 + +**二进制格å¼�** + +HTTP1.1 的解æž�是基于文本的,而 HTTP2.0 采用二进制格å¼�。 diff --git a/notes/笔记/HTTP.md.txt b/notes/笔记/HTTP.md.txt new file mode 100644 index 00000000..cdb732a1 --- /dev/null +++ b/notes/笔记/HTTP.md.txt @@ -0,0 +1,360 @@ +[TOC] + +# 基础概念 + +## Web基础 + +HTTP(HyperText Transfer Protocol,超为本传输å��议)。 + +WWW(Word Wide Web)的三ç§�技术:HTMLã€�HTTPã€�URL。 + +RFC(Request for Comments,å¾�求修正æ„�è§�书),互è�”网的设计文档。 + +## URL + +URI(Uniform Resource Indentifier,统一资æº�标识符),URL(Uniform Resource Locator,统一资æº�定ä½�符),URN(Uniform Resource Name,统一资æº�å��称),例如 urn:isbn:0-486-27557-4 。URI 包å�« URL å’Œ URN,目å‰� WEB å�ªæœ‰ URL 比较æµ�行,所以è§�到的基本都是 URL。 + +URLæ ¼å¼�: + +![](index_files/4102b7d0-39b9-48d8-82ae-ac4addb7ebfb.jpg) + +## 请求和å“�应报文 + +**请求报文** + +![](index_files/9dbb5fc2-936b-4c6d-b3a7-9617aae45080.jpg) + +**å“�应报文** + +![](index_files/c634b5ed-a14b-4302-b40e-3ee387dd3c8a.jpg) + +# HTTP 方法 + +客户端å�‘é€�的请求报文第一行为请求行,包å�«äº†æ–¹æ³•字段。 + +## GET:获å�–资æº� + +## POST:传输实体主体 + +POST 主è¦�目的ä¸�是获å�–资æº�,而是传输实体主体数æ�®ã€‚ + +GET å’Œ POST 的请求都能使用é¢�外的å�‚数,但是 GET çš„å�‚数是以查询字符串出现在 URL中,而 POST çš„å�‚数存储在实体主体部分。 + +``` +GET /test/demo_form.asp?name1=value1&name2=value2 HTTP/1.1 +``` +``` +POST /test/demo_form.asp HTTP/1.1 +Host: w3schools.com +name1=value1&name2=value2 +``` + +GET 的传å�‚æ–¹å¼�相比于 POST 安全性较差,因为 GET ä¼ çš„å�‚数在 URL 是å�¯è§�的,å�¯èƒ½ä¼šæ³„露ç§�密信æ�¯ã€‚并且 GET å�ªæ”¯æŒ� ASCII 字符,如果å�‚数为中文则å�¯èƒ½ä¼šå‡ºçް乱ç �,而 POST 支æŒ�标准字符集。 + +## HEAD:获å�–报文首部 + +å’Œ GET 方法一样,但是ä¸�返回报文实体主体部分。 + +主è¦�用于确认 URL 的有效性以å�Šèµ„æº�更新的日期时间等。 + +## PUT:上传文件 + +由于自身ä¸�带验è¯�机制,任何人都å�¯ä»¥ä¸Šä¼ æ–‡ä»¶ï¼Œå› æ­¤å­˜åœ¨å®‰å…¨æ€§é—®é¢˜ï¼Œä¸€èˆ¬ WEB 网站ä¸�使用该方法。 + +## DELETE:删除文件 + +与 PUT 功能相å��,并且å�Œæ ·ä¸�带验è¯�机制。 + +## OPTIONS:查询支æŒ�的方法 + +查询指定的 URL 能够支æŒ�的方法。 + +会返回 Allow: GET, POST, HEAD, OPTIONS 这样的内容。 + +## RACE:追踪路径 + +æœ�务器会将通信路径返回给客户端。 + +å�‘é€�请求时,在 Max-Forwards 首部字段中填入数值,æ¯�ç»�过一个æœ�务器就会å‡� 1,当数值为 0 æ—¶å°±å�œæ­¢ä¼ è¾“。 + +TRACE 一般ä¸�会使用,并且它容易å�—到 XST 攻击(Cross-Site Tracing,跨站追踪),因此更ä¸�会去使用它。 + +![](index_files/ca711108-e937-4d7d-99aa-61b325c61f1a.jpg) + +## CONNECT:è¦�求用隧é�“å��议连接代ç�† + +用隧é�“å��议进行 TCP 通信。 + +主è¦�使用 SSL(Secure Sokets Layer,安全套接字)和 TLS(Transport Layer Security,传输层安全)å��议把通信内容加密å�Žç»�网络隧é�“传输。 + +![](index_files/d8355d56-aa2b-4452-8001-8475cc095af1.jpg) + +# HTTP 状æ€�ç � + +æœ�务器返回的å“�应报文中第一行为状æ€�行,包å�«äº†çжæ€�ç �以å�ŠåŽŸå› çŸ­è¯­ï¼Œæ�¥å‘ŠçŸ¥å®¢æˆ·ç«¯è¯·æ±‚的结果。 + +| 状æ€�ç � | 类别 | 原因短语 | +| --- | --- | --- | +| 1XX | Informational(信æ�¯æ€§çжæ€�ç �) | 接收的请求正在处ç�† | +| 2XX | Success(æˆ�功状æ€�ç �) | 请求正常处ç�†å®Œæ¯• | +| 3XX | Redirection(é‡�定å�‘状æ€�ç �) | 需è¦�进行附加æ“�作以完æˆ�请求 | +| 4XX | Client Error(客户端错误状æ€�ç �) | æœ�务器无法处ç�†è¯·æ±‚ | +| 5XX | Server Error(æœ�务器错误状æ€�ç �) | æœ�务器处ç�†è¯·æ±‚出错 | + +## 2XX æˆ�功 + +**200 OK** + +**204 No Content**:请求已ç»�æˆ�功处ç�†ï¼Œä½†æ˜¯è¿”回的å“�应报文ä¸�包å�«å®žä½“的主体部分。一般在å�ªéœ€è¦�从客户端往æœ�务器å�‘é€�ä¿¡æ�¯ï¼Œè€Œä¸�需è¦�返回数æ�®æ—¶ä½¿ç”¨ã€‚ + +**206 Partial Content** + +## 3XX é‡�定å�‘ + +**301 Moved Permanently**:永久性é‡�定å�‘ + +**302 Found**:临时性é‡�定å�‘ + +**303 See Other** + +注:虽然 HTTP å��议规定 301ã€�302 状æ€�下é‡�定å�‘æ—¶ä¸�å…�许把 POST 方法改æˆ� GET 方法,但是大多数æµ�览器都会把 301ã€�302 å’Œ 303 状æ€�下的é‡�定å�‘把 POST 方法改æˆ� GET 方法。 + +**304 Not Modified**:如果请求报文首部包å�«ä¸€äº›æ�¡ä»¶ï¼Œä¾‹å¦‚:If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since,但是ä¸�满足æ�¡ä»¶ï¼Œåˆ™æœ�务器会返回 304 状æ€�ç �。 + +**307 Temporary Redirect**:临时é‡�定å�‘,与 302 çš„å�«ä¹‰ç±»ä¼¼ï¼Œä½†æ˜¯ 307 è¦�求æµ�览器ä¸�会把é‡�定å�‘请求的 POST 方法改æˆ� GET 方法。 + +## 4XX 客户端错误 + +**400 Bad Request**:请求报文中存在语法错误 + +**401 Unauthorized**:该状æ€�ç �表示å�‘é€�的请求需è¦�有通过 HTTP 认è¯�(BASIC 认è¯�ã€�DIGEST 认è¯�)的认è¯�ä¿¡æ�¯ã€‚如果之å‰�已进行过一次请求,则表示用户认è¯�失败。 + +![](index_files/b1b4cf7d-c54a-4ff1-9741-cd2eea331123.jpg) + +**403 Forbidden**:请求被拒ç»�,æœ�务器端没有必è¦�给出拒ç»�的详细ç�†ç”±ã€‚ + +**404 Not Found** + +## 5XX æœ�务器错误 + +**500 Internal Server Error**:æœ�务器正在执行请求时å�‘生错误 + +**503 Service Unavilable**:该状æ€�ç �表明æœ�务器暂时处于超负载或正在进行å�œæœºç»´æŠ¤ï¼ŒçŽ°åœ¨æ— æ³•å¤„ç�†è¯·æ±‚。 + +# HTTP首部 + +HTTP 报文包å�«äº†é¦–部和主体两部分。有 4 ç§�类型的首部字段:通用首部字段ã€�请求首部字段ã€�å“�应首部字段和实体首部字段。å�„ç§�首部字段å�Šå…¶å�«ä¹‰å¦‚下(ä¸�需è¦�全记,仅供查阅): + +## 通用首部字段 + +| 首部字段å�� | 说明 | +| -- | -- | +| Cache-Control | 控制缓存的行为 | +| Connection | é€�跳首部ã€� 连接的管ç�† | +| Date | 创建报文的日期时间 | +| Pragma | 报文指令 | +| Trailer | 报文末端的首部一览 | +| Transfer-Encoding | 指定报文主体的传输编ç �æ–¹å¼� | +| Upgrade | å�‡çº§ä¸ºå…¶ä»–å��è®® | +| Via | 代ç�†æœ�务器的相关信æ�¯ | +| Warning | 错误通知 | + +## 请求首部字段 + +| 首部字段å�� | 说明 | +| -- | -- | +| Accept | 用户代ç�†å�¯å¤„ç�†çš„媒体类型 | +| Accept-Charset | 优先的字符集 | +| Accept-Encoding | 优先的内容编ç � | +| Accept-Language | 优先的语言(自然语言) | +| Authorization | Web认è¯�ä¿¡æ�¯ | +| Expect | 期待æœ�务器的特定行为 | +| From | 用户的电å­�邮箱地å�€ | +| Host | 请求资æº�所在æœ�务器 | +| If-Match | 比较实体标记(ETag) | +| If-Modified-Since | 比较资æº�的更新时间 | +| If-None-Match | 比较实体标记(与 If-Match 相å��) | +| If-Range | 资æº�未更新时å�‘é€�实体 Byte 的范围请求 | +| If-Unmodified-Since | 比较资æº�的更新时间(与If-Modified-Since相å��) | +| Max-Forwards | 最大传输é€�跳数 | +| Proxy-Authorization | 代ç�†æœ�务器è¦�求客户端的认è¯�ä¿¡æ�¯ | +| Range | 实体的字节范围请求 | +| Referer | 对请求中 URI 的原始获å�–æ–¹ | +| TE | 传输编ç �的优先级 | +| User-Agent | HTTP 客户端程åº�的信æ�¯ | + +## å“�应首部字段 + +| 首部字段å�� | 说明 | +| -- | -- | +| Accept-Ranges | 是å�¦æŽ¥å�—字节范围请求 | +| Age | 推算资æº�创建ç»�过时间 | +| ETag | 资æº�的匹é…�ä¿¡æ�¯ | +| Location | 令客户端é‡�定å�‘至指定URI | +| Proxy-Authenticate | 代ç�†æœ�务器对客户端的认è¯�ä¿¡æ�¯ | +| Retry-After | 对å†�次å�‘起请求的时机è¦�求 | +| Server | HTTPæœ�务器的安装信æ�¯ | +| Vary | 代ç�†æœ�务器缓存的管ç�†ä¿¡æ�¯ | +| WWW-Authenticate | æœ�务器对客户端的认è¯�ä¿¡æ�¯ | + +## 实体首部字段 + +| 首部字段å�� | 说明 | +| -- | -- | +| Allow | 资æº�å�¯æ”¯æŒ�çš„HTTP方法 | +| Content-Encoding | 实体主体适用的编ç �æ–¹å¼� | +| Content-Language | 实体主体的自然语言 | +| Content-Length | 实体主体的大å°�(å�•ä½�: 字节) | +| Content-Location | 替代对应资æº�çš„URI | +| Content-MD5 | 实体主体的报文摘è¦� | +| Content-Range | 实体主体的ä½�置范围 | +| Content-Type | 实体主体的媒体类型 | +| Expires | 实体主体过期的日期时间 | +| Last-Modified | 资æº�的最å�Žä¿®æ”¹æ—¥æœŸæ—¶é—´ | + +# 具体应用 + +## Cookie + +HTTP å��议是无状æ€�的,主è¦�是为了让 HTTP å��议尽å�¯èƒ½ç®€å�•,使得它能够处ç�†å¤§é‡�事务。HTTP/1.1 引入 Cookie æ�¥ä¿�存状æ€�ä¿¡æ�¯ã€‚ + +æœ�务器会å�‘é€�çš„å“�应报文包å�« Set-Cookie 字段,客户端得到该相应å�ŽæŠŠ Cookie 内容ä¿�存到æµ�览器中。下次å†�å�‘é€�请求时,从æµ�览器中读出 Cookie 值,在请求报文中包å�« Cookie 字段,这样æœ�务器就知é�“客户端的状æ€�ä¿¡æ�¯äº†ã€‚Cookie 状æ€�ä¿¡æ�¯ä¿�存在客户端æµ�览器中,而ä¸�是æœ�务器上。 + +![](index_files/ff17c103-750a-4bb8-9afa-576327023af9.png) + +Set-Cookie 字段有以下属性: + +| 属性 | 说明 | +| -- | -- | +| NAME=VALUE | 赋予 Cookie çš„å��称和其值(必需项) | +| expires=DATE | Cookie 的有效期(若ä¸�明确指定则默认为æµ�览器关闭å‰�为止) | +| path=PATH | å°†æœ�务器上的文件目录作为 Cookie 的适用对象(若ä¸�指定则默认为文档所在的文件目录) | +| domain=域å�� | 作为 Cookie 适用对象的域å��(若ä¸�指定则默认为创建 Cookie çš„æœ�务器的域å��) | +| Secure | 仅在 HTTPS 安全通信时æ‰�会å�‘é€� Cookie | +| HttpOnly | 加以é™�制,使 Cookie ä¸�能被 JavaScript 脚本访问 | + +**Session å’Œ Cookie 区别** + +Session 是æœ�务器用æ�¥è·Ÿè¸ªç”¨æˆ·çš„一ç§�手段,æ¯�个 Session 都有一个唯一标识:Session ID。当æœ�务器创建了一个 Session 时,给客户端å�‘é€�çš„å“�应报文就包å�«äº† Set-Cookie 字段,其中有一个å��为 sid 的键值对,这个键值对就是 Session ID。客户端收到å�Žå°±æŠŠ Cookie ä¿�存在æµ�览器中,并且之å�Žå�‘é€�的请求报文都包å�« Session ID。HTTP 就是 Session å’Œ Cookie 这两ç§�æ–¹å¼�一起å�ˆä½œæ�¥å®žçŽ°è·Ÿè¸ªç”¨æˆ·çŠ¶æ€�的,而 Session 用于æœ�务器端,Cookie 用于客户端。 + +**æµ�览器ç¦�用 Cookie 的情况** + +会使用 URL é‡�写技术,在 URL å�Žé�¢åŠ ä¸Š sid=xxx 。 + +**使用 Cookie 实现用户å��和密ç �的自动填写** + +网站脚本会自动从 Cookie 中读å�–用户å��和密ç �,从而实现自动填写。 + +## 缓存 + +有两ç§�缓存方法:让代ç�†æœ�务器进行缓存和让客户端æµ�览器进行缓存。 + +Cache-Control 用于控制缓存的行为。 + +Cache-Control: no-cache 有两ç§�å�«ä¹‰ï¼Œå¦‚果是客户端å�‘缓存æœ�务器å�‘é€�的请求报文中å�«æœ‰è¯¥æŒ‡ä»¤ï¼Œè¡¨ç¤ºå®¢æˆ·ç«¯ä¸�想è¦�缓存的资æº�;如果是æº�æœ�务器å�‘缓存æœ�务器å�‘é€�çš„å“�应报文中å�«æœ‰è¯¥æŒ‡ä»¤ï¼Œè¡¨ç¤ºç¼“å­˜æœ�务器ä¸�能对资æº�进行缓存。 + +Expires 字段å�¯ä»¥ç”¨äºŽå‘ŠçŸ¥ç¼“å­˜æœ�务器该资æº�什么时候会过期。当首部字段 Cache-Control 有指定 max-age 指令时,比起首部字段 Expires,会优先处ç�† max-age 指令。 + +## æŒ�久连接 + +当æµ�览器访问一个包å�«å¤šå¼ å›¾ç‰‡çš„ HTML 页é�¢æ—¶ï¼Œé™¤äº†è¯·æ±‚访问 HTML 页é�¢èµ„æº�,还会请求图片资æº�,如果æ¯�进行一次 HTTP 通信就è¦�断开一次 TCP 连接,连接建立和断开的开销会很大。**æŒ�久连接** å�ªéœ€è¦�进行一次 TCP 连接就能进行多次 HTTP 通信。HTTP/1.1开始,所有的连接默认都是æŒ�久连接。 + +![](index_files/c73a0b78-5f46-4d2d-a009-dab2a999b5d8.jpg) + +æŒ�久连接需è¦�使用 Connection 首部字段进行管ç�†ã€‚HTTP/1.1 开始HTTP 默认是æŒ�久化连接的,如果è¦�æ–­å¼€ TCP 连接,需è¦�由客户端或者æœ�务器端æ��出断开,使用 Connection: close ;而在HTTP/1.1之å‰�默认是é�žæŒ�久化连接的,如果è¦�ç»´æŒ�æŒ�续连接,需è¦�使用 Keep-Alive。 + +管线化方å¼�å�¯ä»¥å�Œæ—¶å�‘é€�多个请求和å“�应,而ä¸�需è¦�å�‘é€�一个请求然å�Žç­‰å¾…å“�应之å�Žå†�å�‘下一个请求。 + +![](index_files/6943e2af-5a70-4004-8bee-b33d60f39da3.jpg) + +## ç¼–ç � + +ç¼–ç �(Encoding)主è¦�是为了对实体进行压缩。常用的编ç �有:gzipã€�compressã€�deflateã€�identity,其中 identity 表示ä¸�执行压缩的编ç �æ ¼å¼�。 + +## 分å�—传输 + +分å�—传输(Chunked Transfer Coding)å�¯ä»¥æŠŠæ•°æ�®åˆ†å‰²æˆ�多å�—,让æµ�览器é€�步显示页é�¢ã€‚ + +## 多部分对象集å�ˆ + +一份报文主体内å�¯å�«æœ‰å¤šç±»åž‹çš„实体å�Œæ—¶å�‘é€�,æ¯�个部分之间用 boundary 字段定义的分隔符进行分隔;æ¯�个部分都å�¯ä»¥æœ‰é¦–部字段。 + +例如,上传多个表å�•æ—¶å�¯ä»¥ä½¿ç”¨å¦‚下方å¼�: + +![](index_files/decb0936-e83c-4a55-840a-fe8aa101ac61.png) + +## 范围请求 + +如果网络出现中断,æœ�务器å�ªå�‘é€�了一部分数æ�®ï¼ŒèŒƒå›´è¯·æ±‚使得客户端能够å�ªè¯·æ±‚未å�‘é€�的那部分数æ�®ï¼Œä»Žè€Œé�¿å…�æœ�务器端é‡�æ–°å�‘é€�所有数æ�®ã€‚ + +在请求报文首部中添加 Range 字段,然å�ŽæŒ‡å®šè¯·æ±‚的范围,例如 Range : bytes = 5001-10000。请求æˆ�功的è¯�æœ�务器å�‘é€� 206 Partial Content 状æ€�。 + +## 内容å��商 + +通过内容å��商返回最å�ˆé€‚的内容,例如根æ�®æµ�览器的默认语言选择返回中文界é�¢è¿˜æ˜¯è‹±æ–‡ç•Œé�¢ã€‚ + +涉å�Šä»¥ä¸‹é¦–部字段:Acceptã€�Accept-Charsetã€�Accept-Encodingã€�Accept-Languageã€�Content-Language。 + +## 虚拟主机 + +使用虚拟主机技术,使得一å�°æœ�务器拥有多个域å��,并且在逻辑上å�¯ä»¥çœ‹æˆ�多个æœ�务器。 + +## 通信数æ�®è½¬å�‘ + +**代ç�†** + +代ç�†æœ�务器接å�—客户端的请求,并且转å�‘给其它æœ�务器。代ç�†æœ�务器一般是é€�明的,ä¸�会改å�˜ URL。 + +使用代ç�†çš„主è¦�目的是:缓存ã€�网络访问控制以å�Šè®°å½•访问日志。 + +![](index_files/c07035c3-a9ba-4508-8e3c-d8ae4c6ee9ee.jpg) + +**网关** + +与代ç�†æœ�务器ä¸�å�Œçš„æ˜¯ï¼Œç½‘å…³æœ�务器会将 HTTP 转化为其它å��议进行通信,从而其它é�ž HTTP æœ�务器的æœ�务。 + +![](index_files/81375888-6be1-476f-9521-42eea3e3154f.jpg) + +**éš§é�“** + +使用 SSL 等加密手段,为客户端和æœ�务器之间建立一æ�¡å®‰å…¨çš„通信线路。 + +![](index_files/64b95403-d976-421a-8b45-bac89c0b5185.jpg) + +# HTTPs + +HTTP 有以下安全性问题: + +1. 通信使用明文,内容å�¯èƒ½ä¼šè¢«çªƒå�¬ï¼› +2. ä¸�验è¯�通信方的身份,因此有å�¯èƒ½é�­é�‡ä¼ªè£…ï¼› +3. 无法è¯�明报文的完整性,所以有å�¯èƒ½å·²é�­ç¯¡æ”¹ã€‚ + +HTTPs å¹¶ä¸�是新å��议,而是 HTTP 先和 SSL(Secure Socket Layer)通信,å†�ç”± SSL å’Œ TCP 通信。通过使用 SSL,HTTPs æ��供了加密ã€�认è¯�和完整性ä¿�护。 + +## 加密 + +有两ç§�加密方å¼�:对称密钥加密和公开密钥加密。对称密钥加密的加密和解密使用å�Œä¸€å¯†é’¥ï¼Œè€Œå…¬å¼€å¯†é’¥åŠ å¯†ä½¿ç”¨ä¸€å¯¹å¯†é’¥ç”¨äºŽåŠ å¯†å’Œè§£å¯†ï¼Œåˆ†åˆ«ä¸ºå…¬å¼€å¯†é’¥å’Œç§�有密钥。公开密钥所有人都å�¯ä»¥èŽ·å¾—ï¼Œé€šä¿¡å�‘é€�方获得接收方的公开密钥之å�Žï¼Œå°±å�¯ä»¥ä½¿ç”¨å…¬å¼€å¯†é’¥è¿›è¡ŒåŠ å¯†ï¼ŒæŽ¥æ”¶æ–¹æ”¶åˆ°é€šä¿¡å†…å®¹å�Žä½¿ç”¨ç§�有密钥解密。 + +对称密钥加密的缺点:无法安全传输密钥;公开密钥加密的缺点:相对æ�¥è¯´æ›´è€—时。 + +HTTPs 采用 **æ··å�ˆçš„加密机制**,使用公开密钥加密用于传输对称密钥,之å�Žä½¿ç”¨å¯¹ç§°å¯†é’¥åŠ å¯†è¿›è¡Œé€šä¿¡ã€‚ï¼ˆä¸‹å›¾ä¸­ï¼Œå…±äº«å¯†é’¥å�³å¯¹ç§°å¯†é’¥ï¼‰ + +![](index_files/110b1a9b-87cd-45c3-a21d-824623715b33.jpg) + +## 认è¯� + +通过使用 **è¯�书** æ�¥å¯¹é€šä¿¡æ–¹è¿›è¡Œè®¤è¯�。è¯�书中有公开密钥数æ�®ï¼Œå¦‚æžœå�¯ä»¥éªŒè¯�公开密钥的确属于通信方的,那么就å�¯ä»¥ç¡®å®šé€šä¿¡æ–¹æ˜¯å�¯é� çš„。 + +æ•°å­—è¯�书认è¯�机构(CA,Certificate +Authority)é¢�å�‘的公开密钥è¯�书,å�¯ä»¥é€šè¿‡ CA 对其进行验è¯�。 + +进行 HTTPs 通信时,æœ�务器会把è¯�书å�‘é€�给客户端,客户端å�–得其中的公开密钥之å�Žï¼Œå°±å�¯ä»¥å¼€å§‹åŠ å¯†è¿‡ç¨‹ã€‚ + +使用 OpenSSL 这套开æº�程åº�,æ¯�个人都å�¯ä»¥æž„建一套属于自己的认è¯�机构,从而自己给自己é¢�å�‘æœ�务器è¯�书。æµ�览器在访问该æœ�务器时,会显示“无法确认连接安全性â€�或“该网站的安全è¯�书存在问题â€�等警告消æ�¯ã€‚ + +客户端è¯�书需è¦�用户自行安装,å�ªæœ‰åœ¨ä¸šåŠ¡éœ€è¦�é�žå¸¸é«˜å®‰å…¨æ€§æ—¶æ‰�使用客户端è¯�书,例如网上银行。 + +## 完整性 + +SSL æ��供摘è¦�功能æ�¥éªŒè¯�完整性。 + diff --git a/notes/笔记/JVM.md.txt b/notes/笔记/JVM.md.txt new file mode 100644 index 00000000..469ec6ec --- /dev/null +++ b/notes/笔记/JVM.md.txt @@ -0,0 +1,611 @@ +[TOC] + +# 内存模型 + +![](index_files/dc695f48-4189-4fc7-b950-ed25f6c80f82.jpg) + +注:白色区域为线程ç§�有的,è“�色区域为线程共享的。 + +## 1. 程åº�计数器 + +记录正在执行的虚拟机字节ç �指令的地å�€ï¼ˆå¦‚果正在执行的是 Native 方法则为空)。 + +## 2. Java 虚拟机栈 + +æ¯�个 Java 方法在执行的å�Œæ—¶ä¼šåˆ›å»ºä¸€ä¸ªæ ˆå¸§ç”¨äºŽå­˜å‚¨å±€éƒ¨å�˜é‡�表ã€�æ“�作数栈ã€�动æ€�链接ã€�方法出å�£ç­‰ä¿¡æ�¯ã€‚æ¯�一个方法从调用直至执行完æˆ�的过程,就对应ç�€ä¸€ä¸ªæ ˆå¸§åœ¨Â Java 虚拟机栈中入栈和出栈的过程。 + +该区域å�¯èƒ½æŠ›å‡ºä»¥ä¸‹å¼‚常: + +1. 当线程请求的栈深度超过最大值,会抛出 StackOverflowError 异常; +2. 栈进行动æ€�扩展时如果无法申请导足够内存,会抛出 OutOfMemoryError 异常。 + +## 3. 本地方法栈 + +与 Java 虚拟机栈类似,它们之间的区别å�ªä¸�过是本地方法栈为本地方法æœ�务。 + +## 4. Java 堆 + +所有对象实例都在这里分é…�内存。 + +è¿™å�—区域是垃圾收集器管ç�†çš„主è¦�区域("GC 堆 ")。现在收集器基本都是采用分代收集算法,Java 堆还å�¯ä»¥åˆ†æˆ�:新生代和è€�年代(新生代还å�¯ä»¥åˆ†æˆ� Eden 空间ã€�From Survivor 空间ã€�To Survivor 空间等)。 + +ä¸�需è¦�连续内存,å�¯ä»¥é€šè¿‡Â -Xmx 和 -Xms æ�¥æŽ§åˆ¶åЍæ€�扩展内存大å°�,如果动æ€�扩展失败会抛出 OutOfMemoryError 异常。 + +## 5. 方法区 + +用于存放已被虚拟机加载的类信æ�¯ã€�常é‡�ã€�é�™æ€�å�˜é‡�ã€�å�³æ—¶ç¼–译器编译å�Žçš„代ç �等数æ�®ã€‚ + +和 Java 堆一样ä¸�需è¦�连续的内存,并且å�¯ä»¥åЍæ€�扩展,动æ€�扩展失败一样会抛出 OutOfMemoryError 异常。 + +对这å�—区域进行垃圾回收的主è¦�目标是对常é‡�池的回收和对类的å�¸è½½ï¼Œä½†æ˜¯ä¸€èˆ¬æ¯”较难实现,HotSpot 虚拟机把它当æˆ�永久代æ�¥è¿›è¡Œåžƒåœ¾å›žæ”¶ã€‚ + +## 6. è¿�行时常é‡�æ±  + +è¿�行时常é‡�池是方法区的一部分。 + +类加载å�Žï¼ŒClass 文件中的常é‡�池(用于存放编译期生æˆ�çš„å�„ç§�å­—é�¢é‡�和符å�·å¼•用)就会被放到这个区域。 + +在è¿�行期间也å�¯ä»¥ç”¨è¿‡Â String 类的 intern() 方法将新的常é‡�放入该区域。 + +## 7. 直接内存 + +在 JDK 1.4 中新加入了 NIO 类,引入了一ç§�基于通é�“(Channel)与缓冲区(Buffer)的 I/O 方å¼�,它å�¯ä»¥ä½¿ç”¨Â Native 函数库直接分é…�堆外内存,然å�Žé€šè¿‡ä¸€ä¸ªå­˜å‚¨åœ¨Â Java 堆里的 DirectByteBuffer 对象作为这å�—内存的引用进行æ“�作。这样能在一些场景中显著æ��高性能,因为é�¿å…�了在 Java 堆和 Native 堆中æ�¥å›žå¤�制数æ�®ã€‚ + +# 垃圾收集 + +程åº�计数器ã€�虚拟机栈和本地方法栈这三个区域属于线程ç§�有的,å�ªå­˜åœ¨äºŽçº¿ç¨‹çš„生命周期内,线程结æ�Ÿä¹‹å�Žä¹Ÿä¼šæ¶ˆå¤±ï¼Œå› æ­¤ä¸�需è¦�对这三个区域进行垃圾回收。 + +垃圾回收主è¦�是针对 Java 堆和方法区进行。 + +## 1. 判断一个对象是å�¦å�¯å›žæ”¶ + +### 1.1 引用计数 + +给对象添加一个引用计数器,当对象增加一个引用时计数器加 1,引用失效时计数器å‡� 1。 + +引用计数为 0 的对象å�¯è¢«å›žæ”¶ã€‚ + +两个对象会出现循环引用问题,此时引用计数器永远ä¸�为 0,导致 GC 收集器无法回收。 + +```java +objA.instance = objB; +objB.instance = objA; +``` + +### 1.2 å�¯è¾¾æ€§ + +通过 GC Roots 作为起始点进行æ�œç´¢ï¼Œèƒ½å¤Ÿåˆ°è¾¾åˆ°çš„对象都是都是å�¯ç”¨çš„,ä¸�å�¯è¾¾çš„对象å�¯è¢«å›žæ”¶ã€‚ + +GC Roots 一般包å�«ä»¥ä¸‹å†…容: + +1. 虚拟机栈中引用的对象 +2. 方法区中类é�™æ€�属性引用的对象 +3. 方法区中的常é‡�引用的对象 +4. 本地方法栈中引用的对象 + +### 1.3 引用类型 + +无论是通过引用计算算法判断对象的引用数é‡�,还是通过å�¯è¾¾æ€§åˆ†æž�算法判断对象的引用链是å�¦å�¯è¾¾ï¼Œåˆ¤å®šç‹¬äº«æ˜¯å�¦å­˜æ´»éƒ½ä¸Žâ€œå¼•用â€�有关。 + +#### 1.3.1 强引用 + +å�ªè¦�强引用存在,垃圾回收器永远ä¸�会回收调掉被引用的对象。 + +```java +Object obj = new Object(); +``` + +#### 1.3.2 软引用 + + +é�žå¿…须引用,内存溢出之å‰�进行回收。 + +```java +Object obj = new Object(); +SoftReference sf = new SoftReference(obj); +obj = null; +sf.get(); +``` + +sf 是对 obj 的一个软引用,通过 sf.get() 方法å�¯ä»¥å�–到这个对象,当然,当这个对象被标记为需è¦�回收的对象时,则返回 nullï¼› + +软引用主è¦�用户实现类似缓存的功能,在内存足够的情况下直接通过软引用å�–值,无需从ç¹�忙的真实æ�¥æº�查询数æ�®ï¼Œæ��å�‡é€Ÿåº¦ï¼›å½“内存ä¸�足时,自动删除这部分缓存数æ�®ï¼Œä»ŽçœŸæ­£çš„æ�¥æº�查询这些数æ�®ã€‚ + + +#### 1.3.3 弱引用 + +å�ªèƒ½ç”Ÿå­˜åˆ°ä¸‹ä¸€æ¬¡åžƒåœ¾æ”¶é›†å�‘生之å‰�,当垃圾收集器工作时,无论当å‰�内存是å�¦è¶³å¤Ÿï¼Œéƒ½ä¼šè¢«å›žæ”¶ã€‚ + +```java +Object obj = new Object(); +WeakReference wf = new WeakReference(obj); +obj = null; +wf.get(); +wf.isEnQueued(); +``` + +#### 1.3.4 虚引用 + +å�ˆç§°ä¸ºå¹½ç�µå¼•用或者幻影引用,一个对象是å�¦æœ‰è™šå¼•用的存在,完全ä¸�会对其生存时间构æˆ�å½±å“�,也无法通过虚引用å�–得一个对象实例。为一个对象设置虚引用关è�”的唯一目的就是能在这个对象被收集器回收时收到一个系统通知。 + +```java +Object obj = new Object(); +PhantomReference pf = new PhantomReference(obj); +obj=null; +pf.get(); +pf.isEnQueued(); +``` + +### 1.3 方法区的回收 + +在方法区主è¦�是对常é‡�池的回收和对类的å�¸è½½ã€‚ + +常é‡�池的回收和堆中对象回收类似。 + +类的å�¸è½½æ�¡ä»¶å¾ˆå¤šï¼Œéœ€è¦�满足以下三个æ�¡ä»¶ï¼Œå¹¶ä¸”满足了也ä¸�一定会被å�¸è½½ï¼š + +1. 该类所有的实例都已ç»�被回收,也就是 Java 堆中ä¸�存在该类的任何实例。 +2. 加载该类的 ClassLoader 已ç»�被回收。 +3. 该类对应的 java.lang.Class 对象没有在任何地方被引用,也就无法在任何地方通过å��射访问该类方法。 + +å�¯ä»¥é€šè¿‡Â -Xnoclassgc å�‚æ•°æ�¥æŽ§åˆ¶æ˜¯å�¦å¯¹ç±»è¿›è¡Œå�¸è½½ã€‚ + +在大é‡�使用å��å°„ã€�动æ€�代ç�†ã€�CGLib 等 ByteCode 框架ã€�动æ€�生æˆ� JSP 以å�ŠÂ OSGo 这类频ç¹�自定义 ClassLoader 的场景都需è¦�虚拟机具备类å�¸è½½åŠŸèƒ½ï¼Œä»¥ä¿�è¯�ä¸�会出现内存溢出。 + +### 1.4 finalize() + +当一个对象å�¯è¢«å›žæ”¶æ—¶ï¼Œå¦‚果该对象有必è¦�执行 finalize() 方法,那么就有å�¯èƒ½å�¯èƒ½é€šè¿‡åœ¨è¯¥æ–¹æ³•中让对象é‡�新被引用,从而实现自救。 + +finalize() 类似 C++ 的虚构函数,用æ�¥å�šå…³é—­å¤–部资æº�等工作。但是 try-finally 等方å¼�å�¯ä»¥å�šçš„æ›´å¥½ï¼Œå¹¶ä¸”该方法è¿�行代价高昂,ä¸�确定性大,无法ä¿�è¯�å�„个对象的调用顺åº�,因此最好ä¸�è¦�使用。 + +## 2. 垃圾收集算法 + +### 2.1 标记 - 清除算法 + +![](index_files/a4248c4b-6c1d-4fb8-a557-86da92d3a294.jpg) + +将需è¦�回收的对象进行标记,然å�Žæ¸…除。 + +ä¸�足: + +1. 标记和清除过程效率都ä¸�高 +2. 会产生大é‡�碎片 + +之å�Žçš„算法都是基于该算法进行改进。 + +### 2.2 å¤�制算法 + +![](index_files/e6b733ad-606d-4028-b3e8-83c3a73a3797.jpg) + +将内存划分为大å°�相等的两å�—,æ¯�次å�ªä½¿ç”¨å…¶ä¸­ä¸€å�—,当这一å�—内存用完了就将还存活的对象å¤�制到å�¦ä¸€å�—上é�¢ï¼Œç„¶å�Žå†�把使用过的内存空间进行一次清ç�†ã€‚ + +主è¦�ä¸�足是å�ªä½¿ç”¨äº†å†…存的一å�Šã€‚ + +现在的商业虚拟机都采用这ç§�收集算法æ�¥å›žæ”¶æ–°ç”Ÿä»£ï¼Œä½†æ˜¯å¹¶ä¸�是将内存划分为大å°�相等的两å�—,而是分为一å�—较大的 Eden 空间和两å�—较å°�的 Survior 空间,æ¯�次使用 Eden 空间和其中一å�— Survivor。在回收时,将 Eden 和 Survivor 中还存活ç�€çš„对象一次性å¤�制到å�¦ä¸€å�— Survivor 空间上,最å�Žæ¸…ç�†Â Eden 和 Survivor。HotSpot 虚拟机的 Eden 和 Survivor 的大å°�比例默认为 8:1,ä¿�è¯�了内存的利用率达到 90 %。如果æ¯�次回收有多于 10% 的对象存活,那么一å�— Survivor 空间就ä¸�够用了,需è¦�ä¾�赖于è€�年代进行分é…�æ‹…ä¿�,也就是借用è€�年代的空间。 + +### 2.3 标记 - 整ç�†ç®—法 + +![](index_files/902b83ab-8054-4bd2-898f-9a4a0fe52830.jpg) + +让所有存活的对象都å�‘一段移动,然å�Žç›´æŽ¥æ¸…ç�†æŽ‰ç«¯è¾¹ç•Œä»¥å¤–的内存。 + +### 2.4 分代收集算法 + +现在的商业虚拟机采用分代收集算法,它使用了å‰�é�¢ä»‹ç»�的几ç§�收集算法,根æ�®å¯¹è±¡å­˜æ´»å‘¨æœŸå°†å†…存划分为几å�—,ä¸�å�Œå�—采用适当的收集算法。 + +一般将 Java 堆分为新生代和è€�年代。 + +1. 新生代使用:å¤�制算法 +2. è€�年代使用:标记 - 清ç�†Â æˆ–者 标记 - 整ç�†Â ç®—法。 + +## 3. 垃圾收集器 + +![](index_files/c625baa0-dde6-449e-93df-c3a67f2f430f.jpg) + +以上是 HotSpot 虚拟机中的 7 个垃圾收集器,连线表示垃圾收集器å�¯ä»¥é…�å�ˆä½¿ç”¨ã€‚ + +### 3.1 Serial 收集器 + +![](index_files/22fda4ae-4dd5-489d-ab10-9ebfdad22ae0.jpg) + +它是å�•线程的收集器,ä¸�ä»…æ„�味ç�€å�ªä¼šä½¿ç”¨ä¸€ä¸ªçº¿ç¨‹è¿›è¡Œåžƒåœ¾æ”¶é›†å·¥ä½œï¼Œæ›´é‡�è¦�的是它在进行垃圾收集时,必须暂å�œæ‰€æœ‰å…¶ä»–工作线程,往往造æˆ�过长的等待时间。 + +它的优点是简å�•高效,对于å�•个 CPU 环境æ�¥è¯´ï¼Œç”±äºŽæ²¡æœ‰çº¿ç¨‹äº¤äº’的开销,因此拥有最高的å�•线程收集效率。 + +在 Client 应用场景中,分é…�给虚拟机管ç�†çš„内存一般æ�¥è¯´ä¸�会很大,该收集器收集几å��兆甚至一两百兆的新生代å�œé¡¿æ—¶é—´å�¯ä»¥æŽ§åˆ¶åœ¨ä¸€ç™¾å¤šæ¯«ç§’以内,å�ªè¦�ä¸�是太频ç¹�,这点å�œé¡¿æ˜¯å�¯ä»¥æŽ¥å�—的。 + +### 3.2 ParNew 收集器 + +![](index_files/81538cd5-1bcf-4e31-86e5-e198df1e013b.jpg) + +它是 Serial 收集器的多线程版本。 + +是 Server 模å¼�下的虚拟机首选新生代收集器,除了性能原因外,主è¦�是因为除了 Serial 收集器,å�ªæœ‰å®ƒèƒ½ä¸ŽÂ CMS 收集器é…�å�ˆå·¥ä½œã€‚ + +默认开始的线程数é‡�与 CPU 数é‡�相å�Œï¼Œå�¯ä»¥ä½¿ç”¨Â -XX:ParallelGCThreads å�‚æ•°æ�¥è®¾ç½®çº¿ç¨‹æ•°ã€‚ + +### 3.3 Parallel Scavenge 收集器 + +是并行的多线程收集器。 + +其它收集器关注点是尽å�¯èƒ½ç¼©çŸ­åžƒåœ¾æ”¶é›†æ—¶ç”¨æˆ·çº¿ç¨‹çš„å�œé¡¿æ—¶é—´ï¼Œè€Œå®ƒçš„目标是达到一个å�¯æŽ§åˆ¶çš„å�žå��é‡�,它被称为“å�žå��é‡�优先â€�收集器。这里的å�žå��é‡�指 CPU 用于è¿�行用户代ç �的时间å� æ€»æ—¶é—´çš„æ¯”值。 + +å�œé¡¿æ—¶é—´è¶ŠçŸ­å°±è¶Šé€‚å�ˆéœ€è¦�与用户交互的程åº�,良好的å“�应速度能æ��å�‡ç”¨æˆ·ä½“验。而高å�žå��é‡�则å�¯ä»¥é«˜æ•ˆçŽ‡åœ°åˆ©ç”¨Â CPU 时间,尽快完æˆ�程åº�çš„è¿�算任务,主è¦�适å�ˆåœ¨å�Žå�°è¿�算而ä¸�需è¦�太多交互的任务。 + +æ��供了两个å�‚数用于精确控制å�žå��é‡�,分别是控制最大垃圾收集å�œé¡¿æ—¶é—´Â -XX:MaxGCPauseMillis å�‚数以å�Šç›´æŽ¥è®¾ç½®å�žå��é‡�大å°�的 -XX:GCTimeRatio å�‚数(值为大于 0 且å°�于 100 的整数)。缩短å�œé¡¿æ—¶é—´æ˜¯ä»¥ç‰ºç‰²å�žå��é‡�和新生代空间æ�¥æ�¢å�–的:新生代空间å�˜å°�,垃圾回收å�˜å¾—频ç¹�,导致å�žå��é‡�下é™�。 + +还æ��供了一个å�‚数 -XX:+UseAdaptiveSizePolicy,这是一个开关å�‚数,打开å�‚æ•°å�Žï¼Œå°±ä¸�需è¦�手工指定新生代的大å°�(-Xmn)ã€�Eden 和 Survivor 区的比例(-XX:SurvivorRatio)ã€�晋å�‡è€�年代对象年龄(-XX:PretenureSizeThreshold)等细节å�‚数了,虚拟机会根æ�®å½“å‰�系统的è¿�行情况收集性能监控信æ�¯ï¼ŒåЍæ€�调整这些å�‚数以æ��供最å�ˆé€‚çš„å�œé¡¿æ—¶é—´æˆ–者最大的å�žå��é‡�,这ç§�æ–¹å¼�称为 GC 自适应的调节策略(GC Ergonomics)。自适应调节策略也是它与 ParNew 收集器的一个é‡�è¦�区别。 + +### 3.4 Serial Old 收集器 + +![](index_files/08f32fd3-f736-4a67-81ca-295b2a7972f2.jpg) + +Serial Old 是 Serial 收集器的è€�年代版本,也是给 Client 模å¼�下的虚拟机使用。如果用在 Server 模å¼�下,它有两大用途: + +1. 在 JDK 1.5 以å�Šä¹‹å‰�版本(Parallel Old 诞生以å‰�)中与 Parallel Scavenge 收集器æ�­é…�使用。 +2. 作为 CMS 收集器的å�Žå¤‡é¢„案,在并å�‘收集å�‘生 Concurrent Mode Failure 时使用。 + +### 3.5 Parallel Old 收集器 + +![](index_files/278fe431-af88-4a95-a895-9c3b80117de3.jpg) + +是 Parallel Scavenge 收集器的è€�年代版本。 + +在注é‡�å�žå��é‡�以å�ŠÂ CPU 资æº�æ•�感的场å�ˆï¼Œéƒ½å�¯ä»¥ä¼˜å…ˆè€ƒè™‘ Parallel Scavenge 加 Parallel Old 收集器。 + +### 3.6 CMS 收集器 + +![](index_files/62e77997-6957-4b68-8d12-bfd609bb2c68.jpg) + +CMS(Concurrent Mark Sweep),从 Mark Sweep å�¯ä»¥çŸ¥é�“它是基于 标记 - 清除 算法实现的。 + +特点:并å�‘收集ã€�低å�œé¡¿ã€‚ + +分为以下四个æµ�程: + +1. åˆ�始标记:仅仅å�ªæ˜¯æ ‡è®°ä¸€ä¸‹Â GC Roots 能直接关è�”到的对象,速度很快,需è¦�å�œé¡¿ã€‚ +2. 并å�‘标记:进行 GC Roots Tracing 的过程,它在整个回收过程中耗时最长,ä¸�需è¦�å�œé¡¿ã€‚ +3. é‡�新标记:为了修正并å�‘标记期间因用户程åº�ç»§ç»­è¿�作而导致标记产生å�˜åŠ¨çš„é‚£ä¸€éƒ¨åˆ†å¯¹è±¡çš„æ ‡è®°è®°å½•ï¼Œéœ€è¦�å�œé¡¿ã€‚ +4. 并å�‘清除:ä¸�需è¦�å�œé¡¿ã€‚ + +在整个过程中耗时最长的并å�‘标记和并å�‘清除过程中,收集器线程都å�¯ä»¥ä¸Žç”¨æˆ·çº¿ç¨‹ä¸€èµ·å·¥ä½œï¼Œä¸�需è¦�进行å�œé¡¿ã€‚ + +具有以下缺点: + +1. 对 CPU 资æº�æ•�感。CMS 默认å�¯åŠ¨çš„å›žæ”¶çº¿ç¨‹æ•°æ˜¯Â (CPU 数é‡� + 3) / 4,当 CPU ä¸�足 4 个时,CMS 对用户程åº�的影å“�å°±å�¯èƒ½å�˜å¾—很大,如果本æ�¥Â CPU 负载就比较大,还è¦�分出一å�Šçš„è¿�算能力去执行收集器线程,就å�¯èƒ½å¯¼è‡´ç”¨æˆ·ç¨‹åº�的执行速度忽然é™�低了 50%,其实也让人无法接å�—。并且低å�œé¡¿æ—¶é—´æ˜¯ä»¥ç‰ºç‰²å�žå��é‡�为代价的,导致 CPU 利用率å�˜ä½Žã€‚ + +2. 无法处ç�†æµ®åŠ¨åžƒåœ¾ã€‚ç”±äºŽå¹¶å�‘清ç�†é˜¶æ®µç”¨æˆ·çº¿ç¨‹è¿˜åœ¨è¿�行ç�€ï¼Œä¼´éš�程åº�è¿�行自然就还会有新的垃圾ä¸�断产生。这一部分垃圾出现在标记过程之å�Žï¼ŒCMS 无法在当次收集中处ç�†æŽ‰å®ƒä»¬ï¼Œå�ªå¥½ç•™åˆ°ä¸‹ä¸€æ¬¡Â GC 时å†�清ç�†æŽ‰ï¼Œè¿™ä¸€éƒ¨åˆ†åžƒåœ¾å°±è¢«ç§°ä¸ºâ€œæµ®åŠ¨åžƒåœ¾â€�。也是由于在垃圾收集阶段用户线程还需è¦�è¿�行,那也就还需è¦�预留有足够的内存空间给用户线程使用,因此它ä¸�能åƒ�其他收集器那样等到è€�年代几乎完全被填满了å†�进行收集,需è¦�预留一部分空间æ��供并å�‘收集时的程åº�è¿�作使用。å�¯ä»¥ä½¿ç”¨Â -XX:CMSInitiatingOccupancyFraction 的值æ�¥æ”¹å�˜è§¦å�‘收集器工作的内存å� ç”¨ç™¾åˆ†æ¯”,JDK 1.5 默认设置下该值为 68,也就是当è€�年代使用了 68% 的空间之å�Žä¼šè§¦å�‘收集器工作。如果该值设置的太高,导致浮动垃圾无法ä¿�存,那么就会出现 Concurrent Mode Failure,此时虚拟机将å�¯åЍå�Žå¤‡é¢„案:临时å�¯ç”¨Â Serial Old 收集器æ�¥é‡�新进行è€�年代的垃圾收集。 + +3. 标记 - 清除算法导致的空间碎片,给大对象分é…�带æ�¥å¾ˆå¤§éº»çƒ¦ï¼Œå¾€å¾€å‡ºçްè€�年代空间剩余,但无法找到足够大连续空间æ�¥åˆ†é…�当å‰�对象,ä¸�å¾—ä¸�æ��å‰�出å�‘一次 Full GC。 + +### 3.7 G1 收集器 + +![](index_files/f99ee771-c56f-47fb-9148-c0036695b5fe.jpg) + +G1(Garbage-First)收集器是当今收集器技术å�‘展最å‰�沿的æˆ�果之一,它是一款é�¢å�‘æœ�务端应用的垃圾收集器,HotSpot 开å�‘团队赋予它的使命是(在比较长期的)未æ�¥å�¯ä»¥æ›¿æ�¢æŽ‰Â JDK 1.5 中å�‘布的 CMS 收集器。 + +具备如下特点: + +- 并行与并å�‘:能充分利用多 CPU 环境下的硬件优势,使用多个 CPU æ�¥ç¼©çŸ­å�œé¡¿æ—¶é—´ï¼› +- 分代收集:分代概念ä¾�然得以ä¿�留,虽然它ä¸�需è¦�其它收集器é…�å�ˆå°±èƒ½ç‹¬ç«‹ç®¡ç�†æ•´ä¸ªÂ GC 堆,但它能够采用ä¸�å�Œæ–¹å¼�去处ç�†æ–°åˆ›å»ºçš„对象和已存活一段时间ã€�熬过多次 GC 的旧对象æ�¥èŽ·å�–更好的收集效果。 +- 空间整å�ˆï¼šæ•´ä½“æ�¥çœ‹æ˜¯åŸºäºŽâ€œæ ‡è®°Â - 整ç�†â€�算法实现的收集器,从局部(两个 Region 之间)上æ�¥çœ‹æ˜¯åŸºäºŽâ€œå¤�制â€�算法实现的,这æ„�味ç�€è¿�行期间ä¸�会产生内存空间碎片。 +- å�¯é¢„测的å�œé¡¿ï¼šè¿™æ˜¯å®ƒç›¸å¯¹Â CMS 的一大优势,é™�低å�œé¡¿æ—¶é—´æ˜¯Â G1 和 CMS 共å�Œçš„关注点,但 G1 除了é™�低å�œé¡¿å¤–,还能建立å�¯é¢„测的å�œé¡¿æ—¶é—´æ¨¡åž‹ï¼Œèƒ½è®©ä½¿ç”¨è€…明确指定在一个长度为 M 毫秒的时间片段内,消耗在 GC 上的时间ä¸�得超过 N 毫秒,这几乎已ç»�是实时 Java(RTSJ)的垃圾收集器的特å¾�了。 + +在 G1 之å‰�的其他收集器进行收集的范围都是整个新生代或者è€�生代,而 G1 ä¸�å†�是这样,Java 堆的内存布局与其他收集器有很大区别,将整个 Java 堆划分为多个大å°�相等的独立区域(Region)。虽然还ä¿�留新生代和è€�年代的概念,但新生代和è€�年代ä¸�å†�是物ç�†éš”离的了,而都是一部分 Region(ä¸�需è¦�连续)的集å�ˆã€‚ + +之所以能建立å�¯é¢„测的å�œé¡¿æ—¶é—´æ¨¡åž‹ï¼Œæ˜¯å› ä¸ºå®ƒå�¯ä»¥æœ‰è®¡åˆ’地é�¿å…�在整个 Java 堆中进行全区域的垃圾收集。它跟踪å�„个 Region 里é�¢çš„垃圾堆积的价值大å°�(回收所获得的空间大å°�以å�Šå›žæ”¶æ‰€éœ€æ—¶é—´çš„ç»�验值),在å�Žå�°ç»´æŠ¤ä¸€ä¸ªä¼˜å…ˆåˆ—表,æ¯�次根æ�®å…�许的收集时间,优先回收价值最大的 Region(这也就是 Garbage-First å��ç§°çš„æ�¥ç”±ï¼‰ã€‚è¿™ç§�使用 Region 划分内存空间以å�Šæœ‰ä¼˜å…ˆçº§çš„区域回收方å¼�,ä¿�è¯�了它在有é™�的时间内å�¯ä»¥èŽ·å�–å°½å�¯èƒ½é«˜çš„æ”¶é›†æ•ˆçŽ‡ã€‚ + +Region ä¸�å�¯èƒ½æ˜¯å­¤ç«‹çš„,一个对象分é…�在æŸ�个 Region 中,å�¯ä»¥ä¸Žæ•´ä¸ªÂ Java 堆任æ„�的对象å�‘生引用关系。在å�šå�¯è¾¾æ€§åˆ†æž�确定对象是å�¦å­˜æ´»çš„æ—¶å€™ï¼Œéœ€è¦�扫æ��整个 Java 堆æ‰�能ä¿�è¯�准确性,这显然是对 GC 效率的æž�大伤害。为了é�¿å…�全堆扫æ��çš„å�‘生,æ¯�个 Region 都维护了一个与之对应的 Remembered Set。虚拟机å�‘现程åº�在对 Reference 类型的数æ�®è¿›è¡Œå†™æ“�作时,会产生一个 Write Barrier 暂时中断写æ“�作,检查 Reference 引用的对象是å�¦å¤„于ä¸�å�Œçš„ Region 之中,如果是,便通过 CardTable 把相关引用信æ�¯è®°å½•到被引用对象所属的 Region 的 Remembered Set 之中。当进行内存回收时,在 GC 根节点的枚举范围中加入 Remembered Set å�³å�¯ä¿�è¯�ä¸�对全堆扫æ��也ä¸�会有é�—æ¼�。 + +如果ä¸�计算维护 Remembered Set 的æ“�作,G1 收集器的è¿�作大致å�¯åˆ’分为以下几个步骤: + +1. åˆ�始标记 +2. 并å�‘标记 +3. 最终标记:为了修正在并å�‘标记期间因用户程åº�ç»§ç»­è¿�作而导致标记产生å�˜åŠ¨çš„é‚£ä¸€éƒ¨åˆ†æ ‡è®°è®°å½•ï¼Œè™šæ‹Ÿæœºå°†è¿™æ®µæ—¶é—´å¯¹è±¡å�˜åŒ–记录在线程的 Remembered Set Logs 里é�¢ï¼Œæœ€ç»ˆæ ‡è®°é˜¶æ®µéœ€è¦�把 Remembered Set Logs 的数æ�®å�ˆå¹¶åˆ°Â Remembered Set 中。这阶段需è¦�å�œé¡¿çº¿ç¨‹ï¼Œä½†æ˜¯å�¯å¹¶è¡Œæ‰§è¡Œã€‚ +4. 筛选回收:首先对å�„个 Region 中的回收价值和æˆ�本进行排åº�,根æ�®ç”¨æˆ·æ‰€æœŸæœ›çš„ GC å�œé¡¿æ˜¯æ—¶é—´æ�¥åˆ¶å®šå›žæ”¶è®¡åˆ’。此阶段其实也å�¯ä»¥å�šåˆ°ä¸Žç”¨æˆ·ç¨‹åº�一起并å�‘执行,但是因为å�ªå›žæ”¶ä¸€éƒ¨åˆ†Â Region,时间是用户å�¯æŽ§åˆ¶çš„,而且å�œé¡¿ç”¨æˆ·çº¿ç¨‹å°†å¤§å¹…度æ��高收集效率。 + +### 3.8 七ç§�垃圾收集器的比较 + +| 收集器 | 串行ã€�并行 or 并å�‘ | 新生代 / è€�年代 | 算法 | 目标 | 适用场景 | +| --- | --- | --- | --- | --- | --- | +| **Serial** | 串行 | 新生代 | å¤�制算法 | å“�应速度优先 | å�• CPU 环境下的 Client 模å¼� | +| **Serial Old** | 串行 | è€�年代 | 标记 - 整ç�†Â | å“�应速度优先 | å�• CPU 环境下的 Client 模å¼�ã€�CMS 的å�Žå¤‡é¢„案 | +| **ParNew** | 并行 | 新生代 | å¤�制算法 | å“�应速度优先 | 多 CPU 环境时在 Server 模å¼�下与 CMS é…�å�ˆÂ | +| **Parallel Scavenge** | 并行 | 新生代 | å¤�制算法 | å�žå��é‡�优先 | 在å�Žå�°è¿�算而ä¸�需è¦�太多交互的任务 | +| **Parallel Old** | 并行 | è€�年代 | 标记 - 整ç�†Â | å�žå��é‡�优先 | 在å�Žå�°è¿�算而ä¸�需è¦�太多交互的任务 | +| **CMS** | 并å�‘ | è€�年代 | 标记 - 清除 | å“�应速度优先 | 集中在互è�”网站或 B/S 系统æœ�务端上的 Java 应用 | +| **G1** | 并å�‘ | both | 标记 - 整ç�†Â + å¤�制算法 | å“�应速度优先 | é�¢å�‘æœ�务端应用,将æ�¥æ›¿æ�¢Â CMS | + +## 4. 内存分é…�与回收策略 + +### 4.1 优先在 Eden 分é…� + +大多数情况下,对象在新生代 Eden 区分é…�,当 Eden 区空间ä¸�够时,å�‘起 Minor GCï¼› + +### 4.2 大对象直接进入è€�年代 + +æ��供 -XX:PretenureSizeThreshold å�‚数,大于此值的对象直接在è€�年代分é…�,é�¿å…�在 Eden 区和 Survivor 区之间的大é‡�内存å¤�制; +### 4.3 长期存活的对象进入è€�年代 + +JVM 为对象定义年龄计数器,ç»�过 Minor GC ä¾�然存活且被 Survivor 区容纳的,移动到 Survivor 区,年龄加 1,æ¯�ç»�历一次 Minor GC ä¸�被清ç�†åˆ™å¹´é¾„加 1,增加到一定年龄则移动到è€�年区(默认 15 å²�,通过 -XX:MaxTenuringThreshold 设置); + + +### 4.4 动æ€�对象年龄判定 + +若 Survivor 区中å�Œå¹´é¾„所有对象大å°�总和大于 Survivor 空间一å�Šï¼Œåˆ™å¹´é¾„大于等于该年龄的对象å�¯ä»¥ç›´æŽ¥è¿›å…¥è€�年代; + +### 4.5 空间分é…�æ‹…ä¿� + +在å�‘生 Minor GC 之å‰�,JVM 先检查è€�年代最大å�¯ç”¨è¿žç»­ç©ºé—´æ˜¯å�¦å¤§äºŽæ–°ç”Ÿä»£æ‰€æœ‰å¯¹è±¡æ€»ç©ºé—´ï¼Œæˆ�ç«‹çš„è¯� Minor GC 确认是安全的;å�¦åˆ™ç»§ç»­æ£€æŸ¥è€�年代最大å�¯ç”¨è¿žç»­ç©ºé—´æ˜¯å�¦å¤§äºŽåŽ†æ¬¡æ™‹å�‡åˆ°è€�年代对象的平å�‡å¤§å°�,大于的è¯�进行 Minor GC,å°�于的è¯�进行 Full GC。 + +## 4.6 Full GC 的触å�‘æ�¡ä»¶ + +对于 Minor GC,其触å�‘æ�¡ä»¶é�žå¸¸ç®€å�•,当 Eden 区空间满时,就将触å�‘一次 Minor GC。而 Full GC 则相对å¤�æ�‚,有以下æ�¡ä»¶ï¼š + +### 4.6.1 调用 System.gc() + +此方法的调用是建议 JVM 进行 Full GC,虽然å�ªæ˜¯å»ºè®®è€Œé�žä¸€å®šï¼Œä½†å¾ˆå¤šæƒ…况下它会触å�‘ Full GC,从而增加 Full GC 的频率,也å�³å¢žåŠ äº†é—´æ­‡æ€§å�œé¡¿çš„æ¬¡æ•°ã€‚因此强烈建议能ä¸�使用此方法就ä¸�è¦�使用,让虚拟机自己去管ç�†å®ƒçš„内存,å�¯é€šè¿‡Â -XX:+ DisableExplicitGC æ�¥ç¦�止 RMI 调用 System.gc()。 + +### 4.6.2 è€�年代空间ä¸�è¶³ + +è€�年代空间ä¸�足的常è§�场景为å‰�文所讲的大对象直接进入è€�年代ã€�长期存活的对象进入è€�年代等,当执行 Full GC å�Žç©ºé—´ä»�ç„¶ä¸�足,则抛出如下错误: Java.lang.OutOfMemoryError: Java heap space 为é�¿å…�以上两ç§�状况引起的 Full GC,调优时应尽é‡�å�šåˆ°è®©å¯¹è±¡åœ¨Â Minor GC 阶段被回收ã€�让对象在新生代多存活一段时间å�Šä¸�è¦�创建过大的对象å�Šæ•°ç»„。 + +### 4.6.3 空间分é…�æ‹…ä¿�失败 + +使用å¤�制算法的 Minor GC 需è¦�è€�年代的内存空间作担ä¿�,如果出现了 HandlePromotionFailure 担ä¿�失败,则会触å�‘ Full GC。 + +### 4.6.4 JDK 1.7 å�Šä»¥å‰�的永久代空间ä¸�è¶³ + +在 JDK 1.7 å�Šä»¥å‰�,HotSpot 虚拟机中的方法区是用永久代实现的,永久代中存放的为一些 class 的信æ�¯ã€�常é‡�ã€�é�™æ€�å�˜é‡�等数æ�®ï¼Œå½“系统中è¦�加载的类ã€�å��射的类和调用的方法较多时,Permanet Generation å�¯èƒ½ä¼šè¢«å� æ»¡ï¼Œåœ¨æœªé…�置为采用 CMS GC 的情况下也会执行 Full GC。如果ç»�过 Full GC ä»�然回收ä¸�了,那么 JVM 会抛出如下错误信æ�¯ï¼šjava.lang.OutOfMemoryError: PermGen space 为é�¿å…� PermGen å� æ»¡é€ æˆ� Full GC 现象,å�¯é‡‡ç”¨çš„æ–¹æ³•为增大 PermGen 空间或转为使用 CMS GC。 + +在 JDK 1.8 中用元空间替æ�¢äº†æ°¸ä¹…代作为方法区的实现,元空间是本地内存,因此å‡�少了一ç§� Full GC 触å�‘çš„å�¯èƒ½æ€§ã€‚ + +### 4.6.5 Concurrent Mode Failure + +执行 CMS GC 的过程中å�Œæ—¶æœ‰å¯¹è±¡è¦�放入è€�年代,而此时è€�年代空间ä¸�足(有时候“空间ä¸�è¶³â€�是 CMS GC 时当å‰�的浮动垃圾过多导致暂时性的空间ä¸�足触å�‘ Full GC),便会报 Concurrent Mode Failure 错误,并触å�‘ Full GC。 + +# 类加载机制 + +类是在è¿�行期间动æ€�加载的。 + +## 1 类的生命周期 + +![](index_files/32b8374a-e822-4720-af0b-c0f485095ea2.jpg) + +包括以下 7 个阶段: + +- **加载(Loading)** +- **验è¯�(Verification)** +- **准备(Preparation)** +- **è§£æž�(Resolution)** +- **åˆ�始化(Initialization)** +- 使用(Using) +- å�¸è½½ï¼ˆUnloading) + +其中解æž�过程在æŸ�些情况下å�¯ä»¥åœ¨åˆ�始化阶段之å�Žå†�开始,这是为了支æŒ� Java 的动æ€�绑定。 + +## 2. 类åˆ�始化时机 + +虚拟机规范中并没有强制约æ�Ÿä½•时进行加载,但是规范严格规定了有且å�ªæœ‰ä¸‹åˆ—五ç§�情况必须对类进行åˆ�始化:( 加载ã€�验è¯�ã€�准备都会éš�ç�€å�‘生 ) + +1. é�‡åˆ°Â newã€�getstaticã€�putstaticã€�invokestatic 这四æ�¡å­—节ç �指令时,如果类没有进行过åˆ�始化,则必须先触å�‘å…¶åˆ�始化。最常è§�的生æˆ�这 4 æ�¡æŒ‡ä»¤çš„场景是:使用 new 关键字实例化对象的时候;读å�–或设置一个类的é�™æ€�字段(被 final 修饰ã€�已在编译器把结果放入常é‡�æ± çš„é�™æ€�字段除外)的时候;以å�Šè°ƒç”¨ä¸€ä¸ªç±»çš„é�™æ€�方法的时候。 + +2. 使用 java.lang.reflect 包的方法对类进行å��射调用的时候,如果类没有进行åˆ�始化,则需è¦�先触å�‘å…¶åˆ�始化。 + +3. 当åˆ�始化一个类的时候,如果å�‘现其父类还没有进行过åˆ�始化,则需è¦�先触å�‘其父类的åˆ�始化。 + +4. 当虚拟机å�¯åŠ¨æ—¶ï¼Œç”¨æˆ·éœ€è¦�指定一个è¦�执行的主类(包å�«Â main() 方法的那个类),虚拟机会先åˆ�始化这个主类; + +5. 当使用 jdk1.7 的动æ€�语言支æŒ�时,如果一个 java.lang.invoke.MethodHandle 实例最å�Žçš„è§£æž�结果为 REF_getStatic, REF_putStatic, REF_invokeStatic 的方法å�¥æŸ„,并且这个方法å�¥æŸ„所对应的类没有进行过åˆ�始化,则需è¦�先触å�‘å…¶åˆ�始化; + +以上 5 ç§�场景中的行为称为对一个类进行主动引用。除此之外,所有引用类的方å¼�都ä¸�会触å�‘åˆ�始化,称为被动引用。被动引用的常è§�例å­�包括: + +1\. 通过å­�类引用父类的é�™æ€�字段,ä¸�会导致å­�ç±»åˆ�始化。 + +```java +System.out.println(SubClass.value); // value 字段在 SuperClass 中定义 +``` + +2\. 通过数组定义æ�¥å¼•用类,ä¸�会触å�‘此类的åˆ�始化。该过程会对数组类进行åˆ�始化,数组类是一个由虚拟机自动生æˆ�çš„ã€�直接继承自 Object 的å­�类,其中包å�«äº†æ•°ç»„的属性和方法。 + +```java +SuperClass[] sca = new SuperClass[10]; +``` + +3\. 常é‡�在编译阶段会存入调用类的常é‡�池中,本质上并没有直接引用到定义常é‡�的类,因此ä¸�会触å�‘定义常é‡�的类的åˆ�始化。 + +```java +System.out.println(ConstClass.HELLOWORLD); +``` + +## 3. 类加载过程 + +包å�«äº†åŠ è½½ã€�验è¯�ã€�准备ã€�è§£æž�å’Œåˆ�始化这 5 个阶段。 + +### 3.1 加载 + +加载是类加载的一个阶段,注æ„�ä¸�è¦�混淆。 + +加载过程完æˆ�以下三件事: + +1. 通过一个类的全é™�定å��æ�¥èŽ·å�–定义此类的二进制字节æµ�。 +2. 将这个字节æµ�所代表的é�™æ€�存储结构转化为方法区的è¿�行时存储结构。 +3. 在内存中生æˆ�一个代表这个类的 Class 对象,作为方法区这个类的å�„ç§�æ•°æ�®çš„访问入å�£ã€‚ + +其中二进制字节æµ�å�¯ä»¥ä»Žä»¥ä¸‹æ–¹å¼�中获å�–: + +- 从 ZIP 包读å�–,这很常è§�,最终æˆ�为日å�ŽÂ JARã€�EARã€�WAR 格å¼�的基础。 +- 从网络中获å�–,这ç§�场景最典型的应用是 Applet。 +- è¿�行时计算生æˆ�,这ç§�场景使用得最多得就是动æ€�代ç�†æŠ€æœ¯ï¼Œåœ¨Â java.lang.reflect.Proxy 中,就是用了 ProxyGenerator.generateProxyClass 的代ç�†ç±»çš„二进制字节æµ�。 +- 由其他文件生æˆ�,典型场景是 JSP 应用,å�³ç”±Â JSP 文件生æˆ�对应的 Class 类。 +- 从数æ�®åº“读å�–,这ç§�场景相对少è§�,例如有些中间件æœ�务器(如 SAP Netweaver)å�¯ä»¥é€‰æ‹©æŠŠç¨‹åº�安装到数æ�®åº“中æ�¥å®Œæˆ�程åº�代ç �在集群间的分å�‘。 +... + +### 3.2 验è¯� + +ç¡®ä¿� Class 文件的字节æµ�中包å�«çš„ä¿¡æ�¯ç¬¦å�ˆå½“å‰�虚拟机的è¦�求,并且ä¸�会å�±å®³è™šæ‹Ÿæœºè‡ªèº«çš„安全。 + +主è¦�有以下 4 个阶段: + +1. 文件格å¼�验è¯� +2. 元数æ�®éªŒè¯�(对字节ç �æ��述的信æ�¯è¿›è¡Œè¯­ä¹‰åˆ†æž�) +3. 字节ç �验è¯�(通过数æ�®æµ�和控制æµ�分æž�,确ä¿�程åº�语义是å�ˆæ³•ã€�符å�ˆé€»è¾‘的,将对类的方法体进行校验分æž�) +4. 符å�·å¼•用验è¯� + +### 3.3 准备 + +ç±»å�˜é‡�是被 static 修饰的å�˜é‡�,准备阶段为类å�˜é‡�分é…�内存并设置åˆ�始值,使用的是方法区的内存。 + +实例å�˜é‡�ä¸�会在这阶段分é…�内存,它将会在对象实例化时éš�ç�€å¯¹è±¡ä¸€èµ·åˆ†é…�在 Java 堆中。 + +åˆ�始值一般为 0 值,例如下é�¢çš„ç±»å�˜é‡� value 被åˆ�始化为 0 而ä¸�是 123。 + +```java +public static int value = 123; +``` + +如果类å�˜é‡�是常é‡�,那么会按照表达å¼�æ�¥è¿›è¡Œåˆ�始化,而ä¸�是赋值为 0。 + +```java +public static final int value = 123; +``` + +### 3.4 解æž� + +将常é‡�池的符å�·å¼•用替æ�¢ä¸ºç›´æŽ¥å¼•用的过程。 + +### 3.5 åˆ�始化 + +åˆ�始化阶段å�³è™šæ‹Ÿæœºæ‰§è¡Œç±»æž„造器 <clinit>() 方法的过程。 + +在准备阶段,类å�˜é‡�å·²ç»�赋过一次系统è¦�求的åˆ�始值,而在åˆ�始化阶段,根æ�®ç¨‹åº�员通过程åº�制定的主观计划去åˆ�始化类å�˜é‡�和其它资æº�。 + +<clinit>() 方法具有以下特点: + +- 是由编译器自动收集类中所有类å�˜é‡�的赋值动作和é�™æ€�语å�¥å�—(static{} å�—)中的语å�¥å�ˆå¹¶äº§ç”Ÿçš„,编译器收集的顺åº�由语å�¥åœ¨æº�文件中出现的顺åº�决定。特别注æ„�的是,é�™æ€�语å�¥å�—å�ªèƒ½è®¿é—®åˆ°å®šä¹‰åœ¨å®ƒä¹‹å‰�的类å�˜é‡�,定义在它之å�Žçš„ç±»å�˜é‡�å�ªèƒ½èµ‹å€¼ï¼Œä¸�能访问。例如以下代ç �: + +```java +public class Test { +    static { +        i = 0;                // 给å�˜é‡�赋值å�¯ä»¥æ­£å¸¸ç¼–译通过 +        System.out.print(i);  // 这å�¥ç¼–译器会æ��示“é�žæ³•å�‘å‰�引用â€� +    } +    static int i = 1; +} +``` + +- 与类的构造函数(或者说实例构造器 <init>())ä¸�å�Œï¼Œä¸�需è¦�显å¼�的调用父类的构造器。虚拟机会自动ä¿�è¯�在å­�类的 <clinit>() 方法è¿�行之å‰�,父类的 <clinit>() 方法已ç»�执行结æ�Ÿã€‚因此虚拟机中第一个执行 <clinit>() 方法的类肯定为 java.lang.Object。 + +- 由于父类的 <clinit>() 方法先执行,也就æ„�味ç�€çˆ¶ç±»ä¸­å®šä¹‰çš„é�™æ€�语å�¥å�—è¦�优于å­�类的å�˜é‡�赋值æ“�作。例如以下代ç �: + +```java +static class Parent { +        public static int A = 1; +        static { +            A = 2; +        } +} + +static class Sub extends Parent { +        public static int B = A; +} + +public static void main(String[] args) { +        System.out.println(Sub.B);  // 输出结果是父类中的é�™æ€�å�˜é‡�值 A,也就是 2 +} +``` + +- <clinit>() 方法对于类或接å�£ä¸�是必须的,如果一个类中ä¸�包å�«é�™æ€�语å�¥å�—,也没有对类å�˜é‡�的赋值æ“�作,编译器å�¯ä»¥ä¸�为该类生æˆ� <clinit>() 方法。 + +- 接å�£ä¸­ä¸�å�¯ä»¥ä½¿ç”¨é�™æ€�语å�¥å�—,但ä»�然有类å�˜é‡�åˆ�始化的赋值æ“�作,因此接å�£ä¸Žç±»ä¸€æ ·éƒ½ä¼šç”Ÿæˆ� <clinit>() 方法。但接å�£ä¸Žç±»ä¸�å�Œçš„æ˜¯ï¼Œæ‰§è¡ŒæŽ¥å�£çš„ <clinit>() 方法ä¸�需è¦�先执行父接å�£çš„ <clinit>() 方法。å�ªæœ‰å½“父接å�£ä¸­å®šä¹‰çš„å�˜é‡�使用时,父接å�£æ‰�会åˆ�始化。å�¦å¤–,接å�£çš„实现类在åˆ�始化时也一样ä¸�会执行接å�£çš„ <clinit>() 方法。 + +- 虚拟机会ä¿�è¯�一个类的 <clinit>() 方法在多线程环境下被正确的加é”�å’Œå�Œæ­¥ï¼Œå¦‚果多个线程å�Œæ—¶åˆ�始化一个类,å�ªä¼šæœ‰ä¸€ä¸ªçº¿ç¨‹æ‰§è¡Œè¿™ä¸ªç±»çš„ <clinit>() 方法,其它线程都会阻塞等待,直到活动线程执行 <clinit>() 方法完毕。如果在一个类的 <clinit>() 方法中有耗时的æ“�作,就å�¯èƒ½é€ æˆ�多个进程阻塞,在实际过程中此ç§�阻塞很éš�蔽。 + +## 4. 类加载器 + +虚拟机设计团队把类加载阶段中的“通过一个类的全é™�定å��æ�¥èŽ·å�–æ��述此类的二进制字节æµ� ( å�³å­—节ç � )â€�这个动作放到 Java 虚拟机外部去实现,以便让应用程åº�自己决定如何去获å�–所需è¦�的类。实现这个动作的代ç �模å�—称为“类加载器â€�。 + +### 4.1 类与类加载器 + +对于任æ„�一个类,都需è¦�由加载它的类加载器和这个类本身一å�Œç¡®ç«‹å…¶åœ¨Â Java 虚拟机中的唯一性,æ¯�一个类加载器,都拥有一个独立的类å��称空间。通俗而言:比较两个类是å�¦â€œç›¸ç­‰â€�(这里所指的“相等â€�,包括类的 Class 对象的 equals() 方法ã€�isAssignableFrom() 方法ã€�isInstance() 方法的返回结果,也包括使用 instanceof() 关键字对å�šå¯¹è±¡æ‰€å±žå…³ç³»åˆ¤å®šç­‰æƒ…况),å�ªæœ‰åœ¨è¿™ä¸¤ä¸ªç±»æ—¶ç”±å�Œä¸€ä¸ªç±»åŠ è½½å™¨åŠ è½½çš„å‰�æ��下æ‰�有æ„�义,å�¦åˆ™ï¼Œå�³ä½¿è¿™ä¸¤ä¸ªç±»æ�¥æº�于å�Œä¸€ä¸ªÂ Class 文件,被å�Œä¸€ä¸ªè™šæ‹ŸæœºåŠ è½½ï¼Œå�ªè¦�加载它们的类加载器ä¸�å�Œï¼Œé‚£è¿™ä¸¤ä¸ªç±»å°±å¿…定ä¸�相等。 + +### 4.2 类加载器分类 + +从 Java 虚拟机的角度æ�¥è®²ï¼Œå�ªå­˜åœ¨ä»¥ä¸‹ä¸¤ç§�ä¸�å�Œçš„类加载器: + +一ç§�是å�¯åŠ¨ç±»åŠ è½½å™¨ï¼ˆBootstrap ClassLoader),这个类加载器用 C++ 实现,是虚拟机自身的一部分;å�¦ä¸€ç§�就是所有其他类的加载器,这些类由 Java 实现,独立于虚拟机外部,并且全都继承自抽象类 java.lang.ClassLoader。 + +从 Java 开å�‘人员的角度看,类加载器å�¯ä»¥åˆ’分得更细致一些: + +- å�¯åŠ¨ç±»åŠ è½½å™¨ï¼ˆBootstrap ClassLoader) 此类加载器负责将存放在 \lib 目录中的,或者被 -Xbootclasspath å�‚数所指定的路径中的,并且是虚拟机识别的(仅按照文件å��识别,如 rt.jar,å��å­—ä¸�符å�ˆçš„类库å�³ä½¿æ”¾åœ¨Â lib 目录中也ä¸�会被加载)类库加载到虚拟机内存中。 å�¯åŠ¨ç±»åŠ è½½å™¨æ— æ³•è¢«Â Java 程åº�直接引用,用户在编写自定义类加载器时,如果需è¦�把加载请求委派给引导类加载器,直接使用 null 代替å�³å�¯ã€‚ + +- 扩展类加载器(Extension ClassLoader) 这个类加载器是由 ExtClassLoader(sun.misc.Launcher$ExtClassLoader)实现的。它负责将 /lib/ext 或者被 java.ext.dir 系统å�˜é‡�所指定路径中的所有类库加载到内存中,开å�‘者å�¯ä»¥ç›´æŽ¥ä½¿ç”¨æ‰©å±•类加载器。 + +- 应用程åº�类加载器(Application ClassLoader) 这个类加载器是由 AppClassLoader(sun.misc.Launcher$AppClassLoader)实现的。由于这个类加载器是 ClassLoader 中的 getSystemClassLoader() 方法的返回值,因此一般称为系统类加载器。它负责加载用户类路径(ClassPath)上所指定的类库,开å�‘者å�¯ä»¥ç›´æŽ¥ä½¿ç”¨è¿™ä¸ªç±»åŠ è½½å™¨ï¼Œå¦‚æžœåº”ç”¨ç¨‹åº�中没有自定义过自己的类加载器,一般情况下这个就是程åº�中默认的类加载器。 + +### 4.3 å�Œäº²å§”派模型 + +应用程åº�都是由三ç§�类加载器相互é…�å�ˆè¿›è¡ŒåŠ è½½çš„ï¼Œå¦‚æžœæœ‰å¿…è¦�,还å�¯ä»¥åŠ å…¥è‡ªå·±å®šä¹‰çš„ç±»åŠ è½½å™¨ã€‚ä¸‹å›¾å±•ç¤ºçš„ç±»åŠ è½½å™¨ä¹‹é—´çš„å±‚æ¬¡å…³ç³»ï¼Œç§°ä¸ºç±»åŠ è½½å™¨çš„å�Œäº²å§”派模型(Parents Delegation Model)。该模型è¦�求除了顶层的å�¯åŠ¨ç±»åŠ è½½å™¨å¤–ï¼Œå…¶ä½™çš„ç±»åŠ è½½å™¨éƒ½åº”æœ‰è‡ªå·±çš„çˆ¶ç±»åŠ è½½å™¨ï¼Œè¿™é‡Œç±»åŠ è½½å™¨ä¹‹é—´çš„çˆ¶å­�关系一般通过组å�ˆï¼ˆComposition)关系æ�¥å®žçŽ°ï¼Œè€Œä¸�是通过继承(Inheritance)的关系实现。 + +![](index_files/2cdc3ce2-fa82-4c22-baaa-000c07d10473.jpg) + +**工作过程** + +如果一个类加载器收到了类加载的请求,它首先ä¸�会自己去å°�试加载,而是把这个请求委派给父类加载器,æ¯�一个层次的加载器都是如此,ä¾�次递归,因此所有的加载请求最终都应该传é€�到顶层的å�¯åŠ¨ç±»åŠ è½½å™¨ä¸­ï¼Œå�ªæœ‰å½“父加载器å��馈自己无法完æˆ�此加载请求(它æ�œç´¢èŒƒå›´ä¸­æ²¡æœ‰æ‰¾åˆ°æ‰€éœ€ç±»ï¼‰æ—¶ï¼Œå­�加载器æ‰�会å°�试自己加载。 + +**好处** + +使用å�Œäº²å§”派模型æ�¥ç»„织类加载器之间的关系,使得 Java 类éš�ç�€å®ƒçš„类加载器一起具备了一ç§�带有优先级的层次关系。例如类 java.lang.Object,它存放å†� rt.jar 中,无论哪个类加载器è¦�加载这个类,最终都是委派给处于模型最顶端的å�¯åŠ¨ç±»åŠ è½½å™¨è¿›è¡ŒåŠ è½½ï¼Œå› æ­¤Â Object 类在程åº�çš„å�„ç§�类加载器环境中都是å�Œä¸€ä¸ªç±»ã€‚相å��,如果没有å�Œäº²å§”派模型,由å�„个类加载器自行加载的è¯�,如果用户编写了一个称为`java.lang.Object 的类,并放在程åº�的 ClassPath 中,那系统中将会出现多个ä¸�å�Œçš„ Object 类,程åº�å°†å�˜å¾—一片混乱。如果开å�‘者å°�试编写一个与 rt.jar 类库中已有类é‡�å��的 Java 类,将会å�‘现å�¯ä»¥æ­£å¸¸ç¼–译,但是永远无法被加载è¿�行。 + +**实现** + +```java +protected synchronized Class loadClass(String name, boolean resolve) throws ClassNotFoundException{ +    //check the class has been loaded or not +    Class c = findLoadedClass(name); +    if(c == null) { +        try{ +            if(parent != null) { +                c = parent.loadClass(name, false); +            } else{ +                c = findBootstrapClassOrNull(name); +            } +        } catch(ClassNotFoundException e) { +            //if throws the exception , the father can not complete the load +        } +        if(c == null) { +            c = findClass(name); +        } +    } +    if(resolve) { +        resolveClass(c); +    } +    return c; +} +``` + +# JVM å�‚æ•° + +## GC 优化é…�ç½® + +| é…�置 | æ��述 | +| --- | --- | +| -Xms | åˆ�始化堆内存大å°� | +| -Xmx | 堆内存最大值 | +| -Xmn | 新生代大å°� | +| -XX:PermSize | åˆ�始化永久代大å°� | +| -XX:MaxPermSize | 永久代最大容é‡� | + +## GC 类型设置 + +| é…�置 | æ��述 | +| --- | --- | +| -XX:+UseSerialGC | 串行垃圾回收器 | +| -XX:+UseParallelGC | 并行垃圾回收器 | +| -XX:+UseConcMarkSweepGC | 并å�‘标记扫æ��垃圾回收器 | +| -XX:ParallelCMSThreads= | 并å�‘标记扫æ��垃圾回收器 = 为使用的线程数é‡� | +| -XX:+UseG1GC | G1 垃圾回收器 | + +```java +java -Xmx12m -Xms3m -Xmn1m -XX:PermSize=20m -XX:MaxPermSize=20m -XX:+UseSerialGC -jar java-application.jar +``` \ No newline at end of file diff --git a/notes/笔记/Java IO.md.txt b/notes/笔记/Java IO.md.txt new file mode 100644 index 00000000..e5ad55b4 --- /dev/null +++ b/notes/笔记/Java IO.md.txt @@ -0,0 +1,376 @@ +[TOC] + +# 概览 + +Java 的 I/O 大概å�¯ä»¥åˆ†æˆ�以下几类 + +1. ç£�盘æ“�作:File +2. 字节æ“�作:InputStream 和 OutputStream +3. 字符æ“�作:Reader 和 Writer +4. 对象æ“�作:Serializable +5. 网络æ“�作:Socket +6. é�žé˜»å¡žå¼� IO:NIO + +# ç£�盘æ“�作 + +File 类å�¯ä»¥ç”¨äºŽè¡¨ç¤ºæ–‡ä»¶å’Œç›®å½•,但是它å�ªç”¨äºŽè¡¨ç¤ºæ–‡ä»¶çš„ä¿¡æ�¯ï¼Œè€Œä¸�表示文件的内容。 + +# 字节æ“�作 + +![](index_files/8143787f-12eb-46ea-9bc3-c66d22d35285.jpg) + +Java I/O 使用了装饰者模å¼�æ�¥å®žçŽ°ã€‚ä»¥Â InputStream 为例,InputStream 是抽象组件,FileInputStream 是 InputStream 的å­�类,属于具体组件,æ��供了字节æµ�的输入æ“�作。FilterInputStream 属于抽象装饰者,装饰者用于装饰组件,为组件æ��ä¾›é¢�外的功能,例如 BufferedInputStream 为 FileInputStream æ��供缓存的功能。实例化一个具有缓存功能的字节æµ�对象时,å�ªéœ€è¦�在 FileInputStream 对象上å†�套一层 BufferedInputStream 对象å�³å�¯ã€‚ + +```java +BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); +``` + +DataInputStream 装饰者æ��供了对更多数æ�®ç±»åž‹è¿›è¡Œè¾“入的æ“�作,比如 intã€�double 等基本类型。 + +批é‡�读入文件中的内容到字节数组中 + +```java +byte[] buf = new byte[20*1024]; +int bytes = 0; +// 最多读å�– buf.length 个字节,返回的是实际读å�–的个数,返回 -1 的时候表示读到 eof,å�³æ–‡ä»¶å°¾ +while((bytes = in.read(buf, 0 , buf.length)) != -1) { +    // ... +} +``` + +# 字符æ“�作 + +ä¸�管是ç£�盘还是网络传输,最å°�的存储å�•元都是字节,而ä¸�是字符,所以 I/O æ“�作的都是字节而ä¸�是字符。但是在程åº�中æ“�作的数æ�®é€šå¸¸æ˜¯å­—符形å¼�,因此需è¦�æ��供对字符进行æ“�作的方法。 + +InputStreamReader 实现从文本文件的字节æµ�è§£ç �æˆ�字符æµ�ï¼›OutputStreamWriter 实现字符æµ�ç¼–ç �æˆ�为文本文件的字节æµ�。它们都继承自 Reader 和 Writer。 + +ç¼–ç �就是把字符转æ�¢ä¸ºå­—节,而解ç �是把字节é‡�新组å�ˆæˆ�字符。 + +```java +byte[] bytes = str.getBytes(encoding);     // 编ç � +String str = new String(bytes, encoding); // 解ç � +``` + +GBK 编ç �中,中文å� Â 2 个字节,英文å� Â 1 个字节;UTF-8 编ç �中,中文å� Â 3 个字节,英文å� Â 1 个字节;Java 使用å�Œå­—节编ç � UTF-16be,中文和英文都å� Â 2 个字节。 + +如果编ç �和解ç �过程使用ä¸�å�Œçš„ç¼–ç �æ–¹å¼�那么就出现了乱ç �。 + +# 对象æ“�作 + +åº�列化就是将一个对象转æ�¢æˆ�字节åº�列,方便存储和传输。 + +åº�列化:ObjectOutputStream.writeObject() + +å��åº�列化:ObjectInputStream.readObject() + +åº�列化的类需è¦�实现 Serializable 接å�£ï¼Œå®ƒå�ªæ˜¯ä¸€ä¸ªæ ‡å‡†ï¼Œæ²¡æœ‰ä»»ä½•方法需è¦�实现。 + +transient 关键字å�¯ä»¥ä½¿ä¸€äº›å±žæ€§ä¸�会被åº�列化。 + +**ArrayList åº�列化和å��åº�列化的实现**:ArrayList 中存储数æ�®çš„æ•°ç»„是用 transient 修饰的,因为这个数组是动æ€�扩展的,并ä¸�是所有的空间都被使用,因此就ä¸�需è¦�所有的内容都被åº�列化。通过é‡�写åº�列化和å��åº�列化方法,使得å�¯ä»¥å�ªåº�列化数组中有内容的那部分数æ�®ã€‚ + +``` +private transient Object[] elementData; +``` + +# 网络æ“�作 + +Java 中的网络支æŒ�: + +1. InetAddress:用于表示网络上的硬件资æº�,å�³Â IP 地å�€ï¼› +2. URL:统一资æº�定ä½�符,通过 URL å�¯ä»¥ç›´æŽ¥è¯»å�–或者写入网络上的数æ�®ï¼› +3. Sockets:使用 TCP å��议实现网络通信; +4. Datagram:使用 UDP å��议实现网络通信。 + +## 1. InetAddress + +没有公有构造函数,å�ªèƒ½é€šè¿‡é�™æ€�方法æ�¥åˆ›å»ºå®žä¾‹ï¼Œæ¯”如 InetAddress.getByName(String host)ã€�InetAddress.getByAddress(byte[] addr)。 + +## 2. URL + +å�¯ä»¥ç›´æŽ¥ä»ŽÂ URL 中读å�–字节æµ�æ•°æ�® + +```java +URL url = new URL("http://www.baidu.com"); +InputStream is = url.openStream(); // 字节æµ� +InputStreamReader isr = new InputStreamReader(is, "utf-8");                              // 字符æµ� +BufferedReader br = new BufferedReader(isr); +String line = br.readLine(); +while (line != null) { +    System.out.println(line); +    line = br.readLine(); +} +br.close(); +isr.close(); +is.close(); +``` + +## 3. Sockets + +Socket 通信模型 + +![](index_files/fa4101d7-19ce-4a69-a84f-20bbe64320e5.jpg) + +- ServerSocket:æœ�务器端类 +- Socket:客户端类 + +æœ�务器和客户端通过 InputStream 和 OutputStream 进行输入输出。 + +## 4. Datagram + +- DatagramPacket:数æ�®åŒ…ç±» +- DatagramSocket:通信类 + +# NIO + +NIO 将最耗时的 I/O æ“�作 ( å�³å¡«å……å’Œæ��å�–缓冲区 ) 转移回æ“�作系统,因而 ä¸�需è¦�程åº�员去控制就å�¯ä»¥æž�大地æ��高è¿�行速度。 + +## 1. æµ�与å�— + +I/O 与 NIO 最é‡�è¦�的区别是数æ�®æ‰“包和传输的方å¼�。正如å‰�é�¢æ��到的,I/O 以æµ�的方å¼�处ç�†æ•°æ�®ï¼Œè€ŒÂ NIO 以å�—的方å¼�处ç�†æ•°æ�®ã€‚ + +é�¢å�‘æµ�的 I/O 一次一个字节进行处ç�†æ•°æ�®ï¼Œä¸€ä¸ªè¾“å…¥æµ�产生一个字节的数æ�®ï¼Œä¸€ä¸ªè¾“出æµ�消费一个字节的数æ�®ã€‚为æµ�å¼�æ•°æ�®åˆ›å»ºè¿‡æ»¤å™¨é�žå¸¸å®¹æ˜“,链接几个过滤器,以便æ¯�个过滤器å�ªè´Ÿè´£å�•个å¤�æ�‚处ç�†æœºåˆ¶çš„一部分,这样也是相对简å�•的。ä¸�利的一é�¢æ˜¯ï¼Œé�¢å�‘æµ�的 I/O 通常相当慢。 + +一个é�¢å�‘å�—的 I/O 系统以å�—的形å¼�处ç�†æ•°æ�®ï¼Œæ¯�一个æ“�作都在一步中产生或者消费一个数æ�®å�—。按å�—处ç�†æ•°æ�®æ¯”按æµ�处ç�†æ•°æ�®è¦�快得多。但是é�¢å�‘å�—的 I/O 缺少一些é�¢å�‘æµ�的 I/O 所具有的优雅性和简å�•性。 + +I/O 包和 NIO 已ç»�很好地集æˆ�了,java.io.\* 已ç»�以 NIO 为基础é‡�新实现了,所以现在它å�¯ä»¥åˆ©ç”¨Â NIO 的一些特性。例如, java.io.\* 包中的一些类包å�«ä»¥å�—的形å¼�读写数æ�®çš„æ–¹æ³•,这使得å�³ä½¿åœ¨æ›´é�¢å�‘æµ�的系统中,处ç�†é€Ÿåº¦ä¹Ÿä¼šæ›´å¿«ã€‚ + +## 2. 通é�“与缓冲区 + +### 2.1 通é�“ + +通é�“ Channel 是对原 I/O 包中的æµ�的模拟,å�¯ä»¥é€šè¿‡å®ƒè¯»å�–和写入数æ�®ã€‚ + +通é�“与æµ�çš„ä¸�å�Œä¹‹å¤„在于,æµ�å�ªèƒ½åœ¨ä¸€ä¸ªæ–¹å�‘上移动,(一个æµ�必须是 InputStream 或者 OutputStream 的å­�ç±»), 而通é�“是å�Œå�‘的,å�¯ä»¥ç”¨äºŽè¯»ã€�写或者å�Œæ—¶ç”¨äºŽè¯»å†™ã€‚ + +通é�“包括以下类型: + +- FileChannel:从文件中读写数æ�®ï¼› +- DatagramChannel:通过 UDP 读写网络中数æ�®ï¼› +- SocketChannel:通过 TCP 读写网络中数æ�®ï¼› +- ServerSocketChannel:å�¯ä»¥ç›‘å�¬æ–°è¿›æ�¥çš„ TCP 连接,对æ¯�一个新进æ�¥çš„连接都会创建一个 SocketChannel。 + +### 2.2 缓冲区 + +å�‘é€�给一个通é�“的所有对象都必须首先放到缓冲区中;å�Œæ ·åœ°ï¼Œä»Žé€šé�“中读å�–的任何数æ�®éƒ½è¦�读到缓冲区中。也就是说,ä¸�会直接对通é�“进行读写数æ�®ï¼Œè€Œæ˜¯å…ˆç»�过缓冲区。 + +缓冲区实质上是一个数组,但它ä¸�仅仅是一个数组。缓冲区æ��供了对数æ�®çš„结构化访问,而且还å�¯ä»¥è·Ÿè¸ªç³»ç»Ÿçš„读/写进程。 + +缓冲区包括以下类型: + +- ByteBuffer +- CharBuffer +- ShortBuffer +- IntBuffer +- LongBuffer +- FloatBuffer +- DoubleBuffer + + +## 3. 缓冲区状æ€�å�˜é‡� + +- capacity:最大容é‡�ï¼› +- position:当å‰�å·²ç»�读写的字节数; +- limit:还å�¯ä»¥è¯»å†™çš„字节数。 + +状æ€�å�˜é‡�的改å�˜è¿‡ç¨‹ï¼š + +1\. 新建一个大å°�为 8 个字节的缓冲区,此时 position 为 0,而 limit == capacity == 9。capacity å�˜é‡�ä¸�会改å�˜ï¼Œä¸‹é�¢çš„讨论会忽略它。 + +![](index_files/1bea398f-17a7-4f67-a90b-9e2d243eaa9a.png) + +2\. 从输入通é�“中读å�– 3 个字节数æ�®å†™å…¥ç¼“冲区中,此时 position 移动设为 3,limit ä¿�æŒ�ä¸�å�˜ã€‚ + +![](index_files/4628274c-25b6-4053-97cf-d1239b44c43d.png) + +3\. 在将缓冲区的数æ�®å†™åˆ°è¾“出通é�“之å‰�,需è¦�先调用 flip() 方法,这个方法将 limit 设置为当å‰� position,并将 position 设置为 0。 + +![](index_files/952e06bd-5a65-4cab-82e4-dd1536462f38.png) + +4\. 从缓冲区中å�– 4 个字节到输出缓冲中,此时 position 设为 4。 + +![](index_files/b5bdcbe2-b958-4aef-9151-6ad963cb28b4.png) + +5\. 最å�Žéœ€è¦�调用 clear() 方法æ�¥æ¸…空缓冲区,此时 position 和 limit 都被设置为最åˆ�ä½�置。 + +![](index_files/67bf5487-c45d-49b6-b9c0-a058d8c68902.png) + +## 4. 读写文件实例 + +1\. 为è¦�读å�–的文件创建 FileInputStream,之å�Žé€šè¿‡Â FileInputStream 获å�–输入 FileChannelï¼› + +```java +FileInputStream fin = new FileInputStream("readandshow.txt"); +FileChannel fic = fin.getChannel(); +``` + +2\. 创建一个容é‡�为 1024 的 Buffer + +```java +ByteBuffer buffer = ByteBuffer.allocate(1024); +``` + +3\. 将数æ�®ä»Žè¾“入 FileChannel 写入到 Buffer 中,如果没有数æ�®çš„è¯�, read() 方法会返回 -1 + +```java +int r = fcin.read(buffer); +if (r == -1) { +     break; +} +``` + +4\. 为è¦�写入的文件创建 FileOutputStream,之å�Žé€šè¿‡Â FileOutputStream 获å�–输出 FileChannel + +```java +FileOutputStream fout = new FileOutputStream("writesomebytes.txt"); +FileChannel foc = fout.getChannel(); +``` + +5\. 调用 flip() 切æ�¢è¯»å†™ + +```java +buffer.flip(); +``` + +6\. 把 Buffer 中的数æ�®è¯»å�–到输出 FileChannel 中 + +```java +foc.write(buffer); +``` + +7\. 最å�Žè°ƒç”¨Â clear() é‡�置缓冲区 + +```java +buffer.clear(); +``` + +## 5. 阻塞与é�žé˜»å¡ž + +应当注æ„�,FileChannel ä¸�能切æ�¢åˆ°é�žé˜»å¡žæ¨¡å¼�,套接字 Channel å�¯ä»¥ã€‚ + +### 5.1 阻塞å¼� I/O + +阻塞å¼� I/O 在调用 InputStream.read() 方法时会一直等到数æ�®åˆ°æ�¥æ—¶ï¼ˆæˆ–超时)æ‰�会返回,在调用 ServerSocket.accept() 方法时,也会一直阻塞到有客户端连接æ‰�会返回,æ¯�个客户端连接过æ�¥å�Žï¼Œæœ�务端都会å�¯åŠ¨ä¸€ä¸ªçº¿ç¨‹åŽ»å¤„ç�†è¯¥å®¢æˆ·ç«¯çš„请求。 + +![](index_files/edc23f99-c46c-4200-b64e-07516828720d.jpg) + +### 5.2 é�žé˜»å¡žå¼� I/O + +由一个专门的线程æ�¥å¤„ç�†æ‰€æœ‰çš„ I/O 事件,并负责分å�‘。 + +事件驱动机制:事件到的时候触å�‘,而ä¸�是å�Œæ­¥çš„去监视事件。 + +线程通信:线程之间通过 wait()ã€�notify() 等方å¼�通信,ä¿�è¯�æ¯�次上下文切æ�¢éƒ½æ˜¯æœ‰æ„�义的,å‡�少无谓的线程切æ�¢ã€‚ + +![](index_files/7fcb2fb0-2cd9-4396-bc2d-282becf963c3.jpg) + +## 6. 套接字实例 + +### 6.1 ServerSocketChannel + +æ¯�一个端å�£éƒ½éœ€è¦�有一个 ServerSocketChannel 用æ�¥ç›‘å�¬è¿žæŽ¥ã€‚ + +```java +ServerSocketChannel ssc = ServerSocketChannel.open(); +ssc.configureBlocking(false); // 设置为é�žé˜»å¡ž + +ServerSocket ss = ssc.socket(); +InetSocketAddress address = new InetSocketAddress(ports[i]); +ss.bind(address); // 绑定端å�£å�· +``` + +### 6.2 Selectors + +异步 I/O 通过 Selector 注册对特定 I/O 事件的兴趣 ― å�¯è¯»çš„æ•°æ�®çš„到达ã€�新的套接字连接等等,在å�‘生这样的事件时,系统将会å�‘é€�通知。 + +创建 Selectors 之å�Žï¼Œå°±å�¯ä»¥å¯¹ä¸�å�Œçš„通é�“对象调用 register() 方法。register() 的第一个å�‚数总是这个 Selector。第二个å�‚数是 OP_ACCEPT,这里它指定我们想è¦�监å�¬Â accept 事件,也就是在新的连接建立时所å�‘生的事件。 + +SelectionKey 代表这个通é�“在此 Selector 上的这个注册。当æŸ�个 Selector 通知您æŸ�个传入事件时,它是通过æ��供对应于该事件的 SelectionKey æ�¥è¿›è¡Œçš„。SelectionKey 还å�¯ä»¥ç”¨äºŽå�–消通é�“的注册。 + +```java +Selector selector = Selector.open(); +SelectionKey key = ssc.register(selector, SelectionKey.OP_ACCEPT); +``` + +### 6.3 主循环 + +首先,我们调用 Selector 的 select() 方法。这个方法会阻塞,直到至少有一个已注册的事件å�‘生。当一个或者更多的事件å�‘生时, select() 方法将返回所å�‘生的事件的数é‡�。 + +接下æ�¥ï¼Œæˆ‘们调用 Selector 的 selectedKeys() 方法,它返回å�‘生了事件的 SelectionKey 对象的一个 集å�ˆÂ ã€‚ + +我们通过迭代 SelectionKeys 并ä¾�次处ç�†æ¯�个 SelectionKey æ�¥å¤„ç�†äº‹ä»¶ã€‚对于æ¯�一个 SelectionKey,您必须确定å�‘生的是什么 I/O 事件,以å�Šè¿™ä¸ªäº‹ä»¶å½±å“�哪些 I/O 对象。 + +```java +int num = selector.select(); +  +Set selectedKeys = selector.selectedKeys(); +Iterator it = selectedKeys.iterator(); +  +while (it.hasNext()) { +     SelectionKey key = (SelectionKey)it.next(); +     // ... deal with I/O event ... +} +``` + +### 6.4 监å�¬æ–°è¿žæŽ¥ + +程åº�执行到这里,我们仅注册了 ServerSocketChannel,并且仅注册它们“接收â€�事件。为确认这一点,我们对 SelectionKey 调用 readyOps() 方法,并检查å�‘生了什么类型的事件: + +```java +if ((key.readyOps() & SelectionKey.OP_ACCEPT) +     == SelectionKey.OP_ACCEPT) { +     // Accept the new connection +     // ... +} +``` + +å�¯ä»¥è‚¯å®šåœ°è¯´ï¼ŒÂ readOps() 方法告诉我们该事件是新的连接。 + +### 6.5 接å�—新的连接 + +因为我们知é�“这个æœ�务器套接字上有一个传入连接在等待,所以å�¯ä»¥å®‰å…¨åœ°æŽ¥å�—它;也就是说,ä¸�用担心 accept() æ“�作会阻塞: + +```java +ServerSocketChannel ssc = (ServerSocketChannel)key.channel(); +SocketChannel sc = ssc.accept(); +``` + +下一步是将新连接的 SocketChannel é…�置为é�žé˜»å¡žçš„。而且由于接å�—这个连接的目的是为了读å�–æ�¥è‡ªå¥—接字的数æ�®ï¼Œæ‰€ä»¥æˆ‘们还必须将 SocketChannel 注册到 Selector上,如下所示: + +```java +sc.configureBlocking( false ); +SelectionKey newKey = sc.register( selector, SelectionKey.OP_READ ); +``` + +注æ„�我们使用 register() 的 OP_READ å�‚数,将 SocketChannel 注册用于 读å�– 而ä¸�是 接å�— 新连接。 + +### 6.6 删除处ç�†è¿‡çš„ SelectionKey + +在处ç�†Â SelectionKey 之å�Žï¼Œæˆ‘们几乎å�¯ä»¥è¿”回主循环了。但是我们必须首先将处ç�†è¿‡çš„ SelectionKey 从选定的键集å�ˆä¸­åˆ é™¤ã€‚如果我们没有删除处ç�†è¿‡çš„键,那么它ä»�然会在主集å�ˆä¸­ä»¥ä¸€ä¸ªæ¿€æ´»çš„键出现,这会导致我们å°�试å†�次处ç�†å®ƒã€‚我们调用迭代器的 remove() 方法æ�¥åˆ é™¤å¤„ç�†è¿‡çš„ SelectionKey: + +```java +it.remove(); +``` + +现在我们å�¯ä»¥è¿”回主循环并接å�—从一个套接字中传入的数æ�®(或者一个传入的 I/O 事件)了。 + +### 6.7 传入的 I/O + +当æ�¥è‡ªä¸€ä¸ªå¥—接字的数æ�®åˆ°è¾¾æ—¶ï¼Œå®ƒä¼šè§¦å�‘一个 I/O 事件。这会导致在主循环中调用 Selector.select(),并返回一个或者多个 I/O 事件。这一次, SelectionKey 将被标记为 OP_READ 事件,如下所示: + +```java +} else if ((key.readyOps() & SelectionKey.OP_READ) +     == SelectionKey.OP_READ) { +     // Read the data +     SocketChannel sc = (SocketChannel)key.channel(); +     // ... +} +``` + + +# å�‚考资料 + +- Eckel B, 埃克尔 , 昊é¹� , 等 . Java 编程æ€�想 [M]. 机械工业出版社 , 2002. +- [IBM: NIO 入门](https://www.ibm.com/developerworks/cn/education/java/j-nio/j-nio.html) +- [ 深入分æž� Java I/O 的工作机制 ](https://www.ibm.com/developerworks/cn/java/j-lo-javaio/index.html) +- [NIO 与传统 IO 的区别 ](http://blog.csdn.net/shimiso/article/details/24990499) \ No newline at end of file diff --git a/notes/笔记/Java 基础语法.md.txt b/notes/笔记/Java 基础语法.md.txt new file mode 100644 index 00000000..389b5c51 --- /dev/null +++ b/notes/笔记/Java 基础语法.md.txt @@ -0,0 +1,128 @@ +[TOC] + +# 基础 + +##  final + +**final 数æ�®** + +声明数æ�®ä¸ºå¸¸é‡�,å�¯ä»¥æ˜¯ç¼–译时常é‡�,也å�¯ä»¥æ˜¯åœ¨è¿�行时被åˆ�始化å�Žä¸�能被改å�˜çš„常é‡�。 + +对于基本类型,final 使数值ä¸�å�˜ï¼›å¯¹äºŽå¼•用对象,final 使引用ä¸�å�˜ï¼Œä¹Ÿå°±ä¸�能引用其它对象,但是被引用的对象本身是å�¯ä»¥ä¿®æ”¹çš„。 + +**final 方法** + +声明方法ä¸�能被å­�类覆盖。 + +private 方法éš�å¼�地被指定为 final,如果在å­�类中定义的方法和基类中的一个 private 方法签å��相å�Œï¼Œæ­¤æ—¶å­�类的方法ä¸�是覆盖基类方法,而是é‡�载了。 + +**final 类** + +声明类ä¸�å…�许被继承。 + +## åˆ�始化顺åº� + +static 声明的é�™æ€�æ•°æ�®åœ¨å†…存中å�ªå­˜åœ¨ä¸€ä»½ï¼Œå�ªåœ¨ç±»ç¬¬ä¸€æ¬¡å®žä¾‹åŒ–æ—¶åˆ�始化一次,优先于其它数æ�®çš„åˆ�始化。 + +```java +public static String staticField = "é�™æ€�å�˜é‡�"; +``` + +static 语å�¥å�—和 static 数æ�®ä¸€æ ·åœ¨ç±»ç¬¬ä¸€æ¬¡å®žä¾‹åŒ–æ—¶è¿�行一次,具体哪个先è¿�行å�–决于它们在代ç �中的顺åº�。 + +```java +static { +    System.out.println("é�™æ€�åˆ�始化å�—"); +} +``` + +普通数æ�®å’Œæ™®é€šè¯­å�¥å�—çš„åˆ�始化在é�™æ€�æ•°æ�®å’Œé�™æ€�语å�¥å�—åˆ�始化结æ�Ÿä¹‹å�Žã€‚ + +```java +public String field = "å�˜é‡�"; +``` + +```java +{ +    System.out.println("åˆ�始化å�—"); +} +``` + +最å�Žæ‰�是构造函数中的数æ�®è¿›è¡Œåˆ�始化 + +```java +public InitialOrderTest() +{ +    System.out.println("构造器"); +} +``` + +存在继承的情况下,åˆ�始化顺åº�为: + +1. 父类(é�™æ€�æ•°æ�®ã€�é�™æ€�语å�¥å�—) +2. å­�类(é�™æ€�æ•°æ�®ã€�é�™æ€�语å�¥å�—) +3. 父类(数æ�®ã€�语å�¥å�—) +4. 父类(构造器) +5. å­�类(数æ�®ã€�语å�¥å�—) +6. å­�类(构造器) + +## 访问æ�ƒé™� + +Java 中有三个访问æ�ƒé™�修饰符:privateã€�protected 以å�ŠÂ public,如果ä¸�加访问修饰符,表示包级å�¯è§�。 + +å�¯ä»¥å¯¹ç±»æˆ–类中的æˆ�员(字段以å�Šæ–¹æ³•)加上访问修饰符。æˆ�员å�¯è§�表示其它类å�¯ä»¥ç”¨æˆ�员所在类的对象访问到该æˆ�员;类å�¯è§�表示其它类å�¯ä»¥ç”¨è¿™ä¸ªç±»åˆ›å»ºå¯¹è±¡ï¼Œå�¯ä»¥æŠŠç±»å½“å�šåŒ…中的一个æˆ�员,然å�ŽåŒ…表示一个类,这样就好ç�†è§£äº†ã€‚ + +protected 用于修饰æˆ�员,表示在继承体系中æˆ�员对于å­�ç±»å�¯è§�。但是这个访问修饰符对于类没有æ„�义,因为包没有继承体系。 + +# 容器 + +![](index_files/114c49a6-72e3-4264-ae07-c564127094ac.png) + +容器主è¦�包括 Collection 和 Map 两ç§�,Collection å�ˆåŒ…å�«äº†Â Listã€�Set 以å�ŠÂ Queue。 + +## Set + +- HashSet:使用 Hash 实现,支æŒ�快速查找,但是失去有åº�性; + +- TreeSet:使用树实现,ä¿�æŒ�有åº�,但是查找效率ä¸�如 HashSetï¼› + +- LinkedListHashSet:具有 HashSet 的查找效率,且内部使用链表维护元素的æ�’入顺åº�,因此具有有åº�性。 + +## Queue + +å�ªæœ‰ä¸¤ä¸ªå®žçŽ°ï¼šLinkedList 和 PriorityQueue,其中 LinkedList 支æŒ�å�Œå�‘队列。 + +## Map + +- HashMap:使用 Hash 实现 + +- LinkedHashMap:ä¿�æŒ�有åº�,顺åº�为æ�’入顺åº�或者最近最少使用(LRU)顺åº� + +- TreeMap:基于红黑树实现 + +- ConcurrentHashMap:线程安全 Map,ä¸�涉å�Šå�Œæ­¥åŠ é”� + +# å��å°„ + +æ¯�个类都有一个 **Class** 对象,包å�«äº†ä¸Žç±»æœ‰å…³çš„ä¿¡æ�¯ã€‚当编译一个新类时,会产生一个å�Œå��的 .class 文件,该文件内容ä¿�å­˜ç�€Â Class 对象。 + +类加载相当于 Class 对象的加载。类在第一次使用时æ‰�动æ€�加载到 JVM 中,å�¯ä»¥ä½¿ç”¨Â Class.forName('com.mysql.jdbc.Driver.class') 这ç§�æ–¹å¼�æ�¥æŽ§åˆ¶ç±»çš„加载,该方法会返回一个 Class 对象。 + +å��å°„å�¯ä»¥æ��ä¾›è¿�行时的类信æ�¯ï¼Œå¹¶ä¸”这个类å�¯ä»¥åœ¨è¿�行时æ‰�加载进æ�¥ï¼Œç”šè‡³åœ¨ç¼–译时期该类的 .class ä¸�存在也å�¯ä»¥åŠ è½½è¿›æ�¥ã€‚ + +Class 和 java.lang.reflect 一起对å��å°„æ��供了支æŒ�,java.lang.reflect 类库包å�«äº†Â **Field**ã€�**Method** 以å�ŠÂ **Constructor** 类。å�¯ä»¥ä½¿ç”¨Â get() 和 set() 方法读å�–和修改 Field 对象关è�”的字段,å�¯ä»¥ä½¿ç”¨Â invoke() 方法调用与 Method 对象关è�”的方法,å�¯ä»¥ç”¨Â Constructor 创建新的对象。 + +IDE 使用å��射机制获å�–类的信æ�¯ï¼Œåœ¨ä½¿ç”¨ä¸€ä¸ªç±»çš„对象时,能够把类的字段ã€�方法和构造函数等信æ�¯åˆ—出æ�¥ä¾›ç”¨æˆ·é€‰æ‹©ã€‚ + +# 异常 + +Throwable å�¯ä»¥ç”¨æ�¥è¡¨ç¤ºä»»ä½•å�¯ä»¥ä½œä¸ºå¼‚常抛出的类,分为两ç§�:**Error** 和 **Exception**,其中 Error 用æ�¥è¡¨ç¤ºç¼–译时系统错误。 + +Exception 分为两ç§�:**å�—检异常** 和 **é�žå�—检异常**。å�—检异常需è¦�用 try...catch... 语å�¥æ�•获并进行处ç�†ï¼Œå¹¶ä¸”å�¯ä»¥ä»Žå¼‚常中æ�¢å¤�ï¼›é�žå�—检异常是程åº�è¿�行时错误,例如除 0 会引å�‘ Arithmetic Exception,此时程åº�奔溃并且无法æ�¢å¤�。 + +![](index_files/48f8f98e-8dfd-450d-8b5b-df4688f0d377.jpg) + +# å�‚考资料 + +- Eckel B, 埃克尔 , 昊é¹� , 等 . Java 编程æ€�想 [M]. 机械工业出版社 , 2002. +- [Java 类åˆ�始化顺åº� ](https://segmentfault.com/a/1190000004527951) diff --git a/notes/笔记/Java 容器.md.txt b/notes/笔记/Java 容器.md.txt new file mode 100644 index 00000000..e625d4fa --- /dev/null +++ b/notes/笔记/Java 容器.md.txt @@ -0,0 +1,341 @@ +[TOC] + +# 概览 + +![](index_files/ebf03f56-f957-4435-9f8f-0f605661484d.jpg) + +容器主è¦�包括 Collection 和 Map 两ç§�,Collection å�ˆåŒ…å�«äº†Â Listã€�Set 以å�ŠÂ Queue。 + +## 1. List + +- ArrayList:基于动æ€�数组实现,支æŒ�éš�机访问; + +- LinkedList:基于å�Œå�‘循环链表实现,å�ªèƒ½é¡ºåº�访问,但是å�¯ä»¥å¿«é€Ÿåœ°åœ¨é“¾è¡¨ä¸­é—´æ�’入和删除元素。ä¸�仅如此,LinkedList 还å�¯ä»¥ç”¨ä½œæ ˆã€�队列和å�Œç«¯é˜Ÿåˆ—。 + +## 2. Set + +- HashSet:基于 Hash 实现,支æŒ�快速查找,但是失去有åº�性; + +- TreeSet:基于红黑树实现,ä¿�æŒ�有åº�,但是查找效率ä¸�如 HashSetï¼› + +- LinkedListHashSet:具有 HashSet 的查找效率,且内部使用链表维护元素的æ�’入顺åº�,因此具有有åº�性。 + +## 3. Queue + +å�ªæœ‰ä¸¤ä¸ªå®žçŽ°ï¼šLinkedList 和 PriorityQueue,其中 LinkedList 支æŒ�å�Œå�‘队列,PriorityQueue 是基于堆结构实现。 + +## 4. Map + +- HashMap:基于 Hash 实现 + +- LinkedHashMap:使用链表æ�¥ç»´æŠ¤å…ƒç´ çš„顺åº�,顺åº�为æ�’入顺åº�或者最近最少使用(LRU)顺åº� + +- TreeMap:基于红黑树实现 + +- ConcurrentHashMap:线程安全 Map,ä¸�涉å�Šç±»ä¼¼äºŽÂ HashTable 的å�Œæ­¥åŠ é”� + +## 5. Java 1.0/1.1 容器 + +对于旧的容器,我们决ä¸�应该使用它们,å�ªéœ€è¦�对它们进行了解。 + +- Vector:和 ArrayList 类似,但它是线程安全的 + +- HashTable:和 HashMap 类似,但它是线程安全的 + +# 容器中的设计模å¼� + +## 1. 迭代器模å¼� + +从概览图å�¯ä»¥çœ‹åˆ°ï¼Œæ¯�个集å�ˆç±»éƒ½æœ‰ä¸€ä¸ªÂ Iterator 对象,å�¯ä»¥é€šè¿‡è¿™ä¸ªè¿­ä»£å™¨å¯¹è±¡æ�¥é��历集å�ˆä¸­çš„元素。 + +[Java 中的迭代器模å¼� ](https://github.com/CyC2018/InterviewNotes/blob/master/notes/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F.md#92-java-%E5%86%85%E7%BD%AE%E7%9A%84%E8%BF%AD%E4%BB%A3%E5%99%A8) + +## 2. 适é…�器模å¼� + +java.util.Arrays#asList() å�¯ä»¥æŠŠæ•°ç»„类型转æ�¢ä¸ºÂ List 类型。 + +```java + List list = Arrays.asList(1, 2, 3); + int[] arr = {1, 2, 3}; + list = Arrays.asList(arr); +``` + +# 散列 + +使用 hasCode() æ�¥è¿”回散列值,使用的是对象的地å�€ã€‚ + +而 equals() 是用æ�¥åˆ¤æ–­ä¸¤ä¸ªå¯¹è±¡æ˜¯å�¦ç›¸ç­‰çš„,相等的两个对象散列值一定è¦�相å�Œï¼Œä½†æ˜¯æ•£åˆ—值相å�Œçš„两个对象ä¸�一定相等。 + +相等必须满足以下五个性质: + +1. 自å��性 +2. 对称性 +3. 传递性 +4. 一致性(多次调用 x.equals(y),结果ä¸�å�˜ï¼‰ +5. 对任何ä¸�是 null 的对象 x 调用 x.equals(nul) 结果都为 false + +# æº�ç �分æž� + +建议先阅读 [ 算法 - 查找 ](https://github.com/CyC2018/InterviewNotes/blob/master/notes/%E7%AE%97%E6%B3%95.md#%E7%AC%AC%E4%B8%89%E7%AB%A0-%E6%9F%A5%E6%89%BE) 部分,对集å�ˆç±»æº�ç �çš„ç�†è§£æœ‰å¾ˆå¤§å¸®åŠ©ã€‚ + +æº�ç �下载:[OpenJDK 1.7](http://download.java.net/openjdk/jdk7) + +## 1. ArraList + +[ArraList.java](https://github.com/CyC2018/InterviewNotes/blob/master/notes/src/ArrayList.java) + +实现了 RandomAccess 接å�£ï¼Œå› æ­¤æ”¯æŒ�éš�机访问,这是ç�†æ‰€å½“然的,因为 ArrayList 是基于数组实现的。 + +```java +public class ArrayList extends AbstractList +    implements List, RandomAccess, Cloneable, java.io.Serializable +``` + +基于数组实现,ä¿�存元素的数组使用 transient 修饰,这是因为该数组ä¸�一定所有ä½�置都å� æ»¡å…ƒç´ ï¼Œå› æ­¤ä¹Ÿå°±æ²¡å¿…è¦�全部都进行åº�列化。需è¦�é‡�写 writeObject() 和 readObject()。 + +```java +private transient Object[] elementData; +``` + +数组的默认大å°�为 10 + +```java +public ArrayList(int initialCapacity) { +    super(); +    if (initialCapacity < 0) +        throw new IllegalArgumentException("Illegal Capacity: "+ initialCapacity); +    this.elementData = new Object[initialCapacity]; +} + +public ArrayList() { +    this(10); +} +``` + +删除元素时调用 System.arraycopy() 对元素进行å¤�制,因此删除æ“�作æˆ�本很高,最好在创建时就指定大概的容é‡�大å°�,å‡�å°‘å¤�制æ“�作的执行次数。 + +```java +public E remove(int index) { +    rangeCheck(index); + +    modCount++; +    E oldValue = elementData(index); + +    int numMoved = size - index - 1; +    if (numMoved > 0) +        System.arraycopy(elementData, index+1, elementData, index, numMoved); +    elementData[--size] = null; // Let gc do its work + +    return oldValue; +} +``` + +添加元素时使用 ensureCapacity() 方法æ�¥ä¿�è¯�容é‡�足够,如果ä¸�够时,需è¦�进行扩容,使得新容é‡�为旧容é‡�的 1.5 å€�。 + +modCount 用æ�¥è®°å½• ArrayList å�‘生å�˜åŒ–的次数,因为æ¯�次在进行 add() 和 addAll() 时都需è¦�调用 ensureCapacity(),因此直接在 ensureCapacity() 中对 modCount 进行修改。 + +```java +public void ensureCapacity(int minCapacity) { +    if (minCapacity > 0) +        ensureCapacityInternal(minCapacity); +} + +private void ensureCapacityInternal(int minCapacity) { +    modCount++; +    // overflow-conscious code +    if (minCapacity - elementData.length > 0) +        grow(minCapacity); +} + +private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8; + +private void grow(int minCapacity) { +    // overflow-conscious code +    int oldCapacity = elementData.length; +    int newCapacity = oldCapacity + (oldCapacity >> 1); +    if (newCapacity - minCapacity < 0) +        newCapacity = minCapacity; +    if (newCapacity - MAX_ARRAY_SIZE > 0) +        newCapacity = hugeCapacity(minCapacity); +    // minCapacity is usually close to size, so this is a win: +    elementData = Arrays.copyOf(elementData, newCapacity); +} + +private static int hugeCapacity(int minCapacity) { +    if (minCapacity < 0) // overflow +        throw new OutOfMemoryError(); +    return (minCapacity > MAX_ARRAY_SIZE) ? +        Integer.MAX_VALUE : +        MAX_ARRAY_SIZE; +} +``` + +在进行åº�列化或者迭代等æ“�作时,需è¦�比较æ“�作å‰�å�ŽÂ modCount 是å�¦æ”¹å�˜ï¼Œå¦‚果改å�˜äº†éœ€è¦�抛出 ConcurrentModificationException。 + +```java +private void writeObject(java.io.ObjectOutputStream s) +    throws java.io.IOException{ +    // Write out element count, and any hidden stuff +    int expectedModCount = modCount; +    s.defaultWriteObject(); + +    // Write out array length +    s.writeInt(elementData.length); + +    // Write out all elements in the proper order. +    for (int i=0; i()); 返回一个线程安全的 ArrayList,也å�¯ä»¥ä½¿ç”¨Â concurrent 并å�‘包下的 CopyOnWriteArrayList 类; + +**和 LinkedList 的区别** + +1.  ArrayList 基于动æ€�数组实现,LinkedList 基于å�Œå�‘循环链表实现; +2. ArrayList 支æŒ�éš�机访问,LinkedList ä¸�支æŒ�ï¼› +3. LinkedList 在任æ„�ä½�置添加删除元素更快。 + +## 2. Vector 与 Stack + +[Vector.java](https://github.com/CyC2018/InterviewNotes/blob/master/notes/src/Vector.java) + +## 3. LinkedList + +[LinkedList.java](https://github.com/CyC2018/InterviewNotes/blob/master/notes/src/LinkedList.java) + +## 4. TreeMap + +[TreeMap.java](https://github.com/CyC2018/InterviewNotes/blob/master/notes/src/TreeMap.java) + +## 5. HashMap + +[HashMap.java](https://github.com/CyC2018/InterviewNotes/blob/master/notes/src/HashMap.java) + +使用拉链法æ�¥è§£å†³å†²çª�。 + +默认容é‡� capacity 为 16,需è¦�注æ„�的是容é‡�å¿…é¡»ä¿�è¯�为 2 的次方。容é‡�就是 Entry[] table 数组的长度,size 是数组的实际使用é‡�。 + +threshold 规定了一个 size 的临界值,size 必须å°�于 threshold,如果大于等于,就必须进行扩容æ“�作。 + +threshold = capacity * load_factor,其中 load_factor 为 table 数组能够使用的比例,load_factor 过大会导致è�šç°‡çš„出现,从而影å“�查询和æ�’入的效率,详è§�算法笔记。 + +```java +static final int DEFAULT_INITIAL_CAPACITY = 16; + +static final int MAXIMUM_CAPACITY = 1 << 30; + +static final float DEFAULT_LOAD_FACTOR = 0.75f; + +transient Entry[] table; + +transient int size; + +int threshold; + +final float loadFactor; + +transient int modCount; +``` + +从下é�¢çš„æ·»åŠ å…ƒç´ ä»£ç �中å�¯ä»¥çœ‹å‡ºï¼Œå½“需è¦�扩容时,令 capacity 为原æ�¥çš„两å€�。 + +```java +void addEntry(int hash, K key, V value, int bucketIndex) { +    Entry e = table[bucketIndex]; +    table[bucketIndex] = new Entry<>(hash, key, value, e); +    if (size++ >= threshold) +        resize(2 * table.length); +} +``` + +Entry 用æ�¥è¡¨ç¤ºä¸€ä¸ªé”®å€¼å¯¹å…ƒç´ ï¼Œå…¶ä¸­çš„ next 指针在åº�列化时会使用。 + +```java +static class Entry implements Map.Entry { +    final K key; +    V value; +    Entry next; +    final int hash; +} +``` + +get() æ“�作需è¦�分æˆ�两ç§�情况,key 为 null 和 ä¸�为 null,从中å�¯ä»¥çœ‹å‡ºÂ HashMap å…�许æ�’入 null 作为键。 + +```java +public V get(Object key) { +    if (key == null) +        return getForNullKey(); +    int hash = hash(key.hashCode()); +    for (Entry e = table[indexFor(hash, table.length)]; e != null; e = e.next) { +        Object k; +        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) +            return e.value; +    } +    return null; +} +``` + +put() æ“�作也需è¦�æ ¹æ�®Â key 是å�¦ä¸ºÂ null å�šä¸�å�Œçš„处ç�†ï¼Œéœ€è¦�注æ„�的是如果本æ�¥æ²¡æœ‰Â key 为 null 的键值对,新æ�’入一个 key 为 null 的键值对时默认是放在数组的 0 ä½�置,这是因为 null ä¸�能计算 hash 值,也就无法知é�“应该放在哪个链表上。 + +```java +public V put(K key, V value) { +    if (key == null) +        return putForNullKey(value); +    int hash = hash(key.hashCode()); +    int i = indexFor(hash, table.length); +    for (Entry e = table[i]; e != null; e = e.next) { +        Object k; +        if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { +            V oldValue = e.value; +            e.value = value; +            e.recordAccess(this); +            return oldValue; +        } +    } + +    modCount++; +    addEntry(hash, key, value, i); +    return null; +} +``` + +```java +private V putForNullKey(V value) { +    for (Entry e = table[0]; e != null; e = e.next) { +        if (e.key == null) { +            V oldValue = e.value; +            e.value = value; +            e.recordAccess(this); +            return oldValue; +        } +    } +    modCount++; +    addEntry(0, null, value, 0); +    return null; +} +``` + +## 6. LinkedHashMap + +[LinkedHashMap.java](https://github.com/CyC2018/InterviewNotes/blob/master/notes/src/HashMap.java) + +## 7. ConcurrentHashMap + +[ConcurrentHashMap.java](https://github.com/CyC2018/InterviewNotes/blob/master/notes/src/HashMap.java) + +[ 探索 ConcurrentHashMap 高并å�‘性的实现机制 ](https://www.ibm.com/developerworks/cn/java/java-lo-concurrenthashmap/) + +# å�‚考资料 + +- Java 编程æ€�想 \ No newline at end of file diff --git a/notes/笔记/Java å¹¶å�‘.md.txt b/notes/笔记/Java å¹¶å�‘.md.txt new file mode 100644 index 00000000..1aaa1254 --- /dev/null +++ b/notes/笔记/Java å¹¶å�‘.md.txt @@ -0,0 +1,536 @@ +[TOC] + +# 使用线程 + +有三ç§�使用线程的方法: + +1. 实现 Runnable 接å�£ï¼› +2. 实现 Callable 接å�£ï¼› +3. 继承 Tread 类; + +实现 Runnable 和 Callable 接å�£çš„ç±»å�ªèƒ½å½“å�šä¸€ä¸ªå�¯ä»¥åœ¨çº¿ç¨‹ä¸­è¿�行的任务,ä¸�是真正æ„�义上的线程,因此最å�Žè¿˜éœ€è¦� Thread æ�¥è°ƒç”¨ã€‚å�¯ä»¥è¯´ä»»åŠ¡æ˜¯é€šè¿‡çº¿ç¨‹é©±åŠ¨ä»Žè€Œæ‰§è¡Œçš„ã€‚ + +## 1. 实现 Runnable 接å�£ + +有一个 run() 方法需è¦�实现 + +需è¦� Thread 调用 start() æ�¥å�¯åŠ¨çº¿ç¨‹ + +```java +public class MyRunnable implements Runnable { +    public void run() { +        // ... +    } +    public static void main(String[] args) { +        MyRunnable instance = new MyRunnable(); +        Tread thread = new Thread(instance); +        thread.start(); +    } +} +``` + +## 2. 实现 Callable 接å�£ + +与 Runnable 相比,Callable å�¯ä»¥æœ‰è¿”回值,返回值通过 FutureTask 进行å°�装。 + +```java +public  class  MyCallable  implements  Callable { +    public Integer call() { +        // ... +    } +    public  static  void  main(String[]  args) { +        MyCallable mc = new MyCallable(); +        FutureTask ft = new FutureTask<>(mc); +        Thread thread = new Thread(ft); +        thread.start(); +        System.out.println(ft.get()); +    } +} +``` + +## 3. 继承 Tread 类 + +å�Œæ ·ä¹Ÿæ˜¯éœ€è¦�实现 run() 方法,并且最å�Žä¹Ÿæ˜¯è°ƒç”¨Â start() 方法æ�¥å�¯åŠ¨çº¿ç¨‹ã€‚ + +```java +class MyThread extends Thread { +    public void run() { +        // ... +    } +    public  static  void  main(String[]  args) { +        MyThread mt = new MyThread(); +        mt.start(); +    } +} +``` + +## 4. 实现接å�£Â vs 继承 Thread + +实现接å�£ä¼šæ›´å¥½ä¸€äº›ï¼Œå› ä¸ºï¼š + +1. Java ä¸�支æŒ�多é‡�继承,因此继承了 Thread 类就无法继承其它类,但是å�¯ä»¥å®žçŽ°å¤šä¸ªæŽ¥å�£ã€‚ +2. 类å�¯èƒ½å�ªè¦�求å�¯æ‰§è¡Œå�³å�¯ï¼Œç»§æ‰¿æ•´ä¸ªÂ Thread 类开销会过大。 + +# Executor + +Executor 管ç�†å¤šä¸ªå¼‚步任务的执行,而无需程åº�员显示地管ç�†çº¿ç¨‹çš„生命周期。 + +主è¦�有三ç§� Excutor: + +1. CachedTreadPool:一个任务创建一个线程; +2. FixedThreadPool:所有任务å�ªèƒ½ä½¿ç”¨å›ºå®šå¤§å°�的线程; +3. SingleThreadExecutor:相当于大å°�为 1 的 FixedThreadPool。 + +```java +ExecutorService exec = Executors.newCachedThreadPool(); +for(int i = 0; i < 5; i++) { +    exec.execute(new MyRunnable()); +} +``` + +# 基础线程机制 + +## 1. sleep() + +**Thread.sleep(millisec)** 方法会休眠当å‰�正在执行的线程,millisec å�•ä½�为毫秒。也å�¯ä»¥ä½¿ç”¨Â TimeUnit.TILLISECONDS.sleep(millisec)。 + +sleep() å�¯èƒ½ä¼šæŠ›å‡ºÂ InterruptedException。因为异常ä¸�能跨线程传播回 main() 中,因此必须在本地进行处ç�†ã€‚线程中抛出的其它异常也å�Œæ ·éœ€è¦�在本地进行处ç�†ã€‚ + +```java +public void run() { +    try { +        // ... +        Thread.sleep(1000); +        // ... +    } catch(InterruptedException e) { +        System.err.println(e); +    } +} +``` + +## 2. yield() + +对é�™æ€�方法 **Thread.yield()** 的调用声明了当å‰�线程已ç»�完æˆ�了生命周期中最é‡�è¦�的部分,å�¯ä»¥åˆ‡æ�¢ç»™å…¶å®ƒçº¿ç¨‹æ�¥æ‰§è¡Œã€‚ + +```java +public void run() { +    // ... +    Thread.yield(); +} +``` + +## 3. join() + +在线程中调用å�¦ä¸€ä¸ªçº¿ç¨‹çš„ **join()** 方法,会将当å‰�线程挂起,直到目标线程结æ�Ÿã€‚ + +å�¯ä»¥åŠ ä¸€ä¸ªè¶…æ—¶å�‚数。 + +## 4. deamon + +å�Žå�°çº¿ç¨‹ï¼ˆ**deamon**)是程åº�è¿�行时在å�Žå�°æ��ä¾›æœ�务的线程,并ä¸�属于程åº�中ä¸�å�¯æˆ–缺的部分。 + +当所有é�žå�Žå�°çº¿ç¨‹ç»“æ�Ÿæ—¶ï¼Œç¨‹åº�也就终止,å�Œæ—¶ä¼šæ�€æ­»æ‰€æœ‰å�Žå�°çº¿ç¨‹ã€‚ + +main() 属于é�žå�Žå�°çº¿ç¨‹ã€‚ + +使用 setDaemon() 方法将一个线程设置为å�Žå�°çº¿ç¨‹ã€‚ + +# 线程之间的å��作 + +- **线程通信**:ä¿�è¯�线程以一定的顺åº�执行; +- **线程å�Œæ­¥**:ä¿�è¯�线程对临界资æº�的互斥访问。 + +线程通信往往是基于线程å�Œæ­¥çš„基础上完æˆ�的,因此很多线程通信问题也是线程å�Œæ­¥é—®é¢˜ã€‚ + +## 1. 线程通信 + +**wait()ã€�notify() 和 notifyAll()** 三者实现了线程之间的通信。 + +wait() 会在等待时将线程挂起,而ä¸�是忙等待,并且å�ªæœ‰åœ¨Â notify() 或者 notifyAll() 到达时æ‰�唤醒。 + +sleep() 和 yield() 并没有释放é”�,但是 wait() 会释放é”�。实际上,å�ªæœ‰åœ¨å�Œæ­¥æŽ§åˆ¶æ–¹æ³•或å�Œæ­¥æŽ§åˆ¶å�—里æ‰�能调用 wait() ã€�notify() 和 notifyAll()。 + +这几个方法属于基类的一部分,而ä¸�属于 Thread。 + +```java +private boolean flag = false; + +public synchronized void after() { +    while(flag == false) { +        wait(); +        // ... +    } +} + +public synchronized void before() { +    flag = true; +    notifyAll(); +} +``` + +**wait() 和 sleep() 的区别** + +1. wait() 是 Object 类的方法,而 sleep() 是 Thread 的é�™æ€�方法; +2. wait() 会放弃é”�,而 sleep() ä¸�会。 + +## 2. 线程å�Œæ­¥ + +给定一个进程内的所有线程,都共享å�Œä¸€å­˜å‚¨ç©ºé—´ï¼Œè¿™æ ·æœ‰å¥½å¤„å�ˆæœ‰å��处。这些线程就å�¯ä»¥å…±äº«æ•°æ�®ï¼Œé�žå¸¸æœ‰ç”¨ã€‚ä¸�过,在两个线程å�Œæ—¶ä¿®æ”¹æŸ�一资æº�时,这也会造æˆ�一些问题。Java æ��供了å�Œæ­¥æœºåˆ¶ï¼Œä»¥æŽ§åˆ¶å¯¹å…±äº«èµ„æº�的互斥访问。 + +### 2.1 synchronized + +**å�Œæ­¥ä¸€ä¸ªæ–¹æ³•** + +使多个线程ä¸�能å�Œæ—¶è®¿é—®è¯¥æ–¹æ³•。 + +```java +public synchronized void func(String name) { +    // ... +} +``` + +**å�Œæ­¥ä¸€ä¸ªä»£ç �å�—** + +```java +public void func(String name) { +    synchronized(this) { +        // ... +    } +} +``` + +### 2.2 Lock + +è‹¥è¦�实现更细粒度的控制,我们å�¯ä»¥ä½¿ç”¨é”�(lock)。 + +```java +private Lock lock; +public int func(int value) { +    lock.lock(); +    // ... +    lock.unlock(); +} +``` + +### 2.3 BlockingQueue + +java.util.concurrent.BlockingQueue 接å�£æœ‰ä»¥ä¸‹é˜»å¡žé˜Ÿåˆ—的实现: + +- **FIFO 队列**:LinkedBlockingQueueã€�ArrayListBlockingQueue(固定长度) +- **优先级队列**:PriorityBlockingQueue + +æ��供了阻塞的 take() 和 put() 方法:如果队列为空 take() 将一直阻塞到队列中有内容,如果队列为满  put() 将阻塞到队列有空闲ä½�置。它们å“�应中断,当收到中断请求的时候会抛出 InterruptedException,从而æ��å‰�结æ�Ÿé˜»å¡žçжæ€�。 + +**使用 BlockingQueue 实现生产者消费者问题** + +```java +// 生产者 +import java.util.concurrent.BlockingQueue; + +public class Producer implements Runnable { +    private BlockingQueue queue; + +    public Producer(BlockingQueue queue) { +        this.queue = queue; +    } + +    @Override +    public void run() { +        System.out.println(Thread.currentThread().getName() + " is making product..."); +        String product = "made by " + Thread.currentThread().getName(); +        try { +            queue.put(product); +        } catch (InterruptedException e) { +            e.printStackTrace(); +        } +    } +} +``` + +```java +// 消费者 +import java.util.concurrent.BlockingQueue; + +public class Consumer implements Runnable{ +    private BlockingQueue queue; + +    public Consumer(BlockingQueue queue) { +        this.queue = queue; +    } + +    @Override +    public void run() { +        try { +            String  product = queue.take(); +            System.out.println(Thread.currentThread().getName() + " is consuming product " + product + "..."); +        } catch (InterruptedException e) { +            e.printStackTrace(); +        } +    } +} +``` + +```java +// 客户端 +import java.util.concurrent.BlockingQueue; +import java.util.concurrent.LinkedBlockingQueue; + +public class Client { +    public static void main(String[] args) { +        BlockingQueue queue = new LinkedBlockingQueue<>(5); +        for (int i = 0; i < 2; i++) { +            new Thread(new Consumer(queue), "Producer" + i).start(); +        } +        for (int i = 0; i < 5; i++) { +            // å�ªæœ‰ä¸¤ä¸ªÂ Product,因此å�ªèƒ½æ¶ˆè´¹ä¸¤ä¸ªï¼Œå…¶å®ƒä¸‰ä¸ªæ¶ˆè´¹è€…被阻塞 +            new Thread(new Producer(queue), "Consumer" + i).start(); +        } +        for (int i = 2; i < 5; i++) { +            new Thread(new Consumer(queue), "Producer" + i).start(); +        } +    } +} +``` + +```html +// è¿�行结果 +Consumer0 is making product... +Producer0 is consuming product made by Consumer0... +Consumer1 is making product... +Producer1 is consuming product made by Consumer1... +Consumer2 is making product... +Consumer3 is making product... +Consumer4 is making product... +Producer2 is consuming product made by Consumer2... +Producer3 is consuming product made by Consumer3... +Producer4 is consuming product made by Consumer4... +``` + +# 线程状æ€� + +JDK 从 1.5 开始在 Thread 类中增添了 State 枚举,包å�«ä»¥ä¸‹å…­ç§�状æ€�: + +1. **NEW**(新建) +2. **RUNNABLE**(当线程正在è¿�行或者已ç»�就绪正等待 CPU 时间片) +3. **BLOCKED**(阻塞,线程在等待获å�–对象å�Œæ­¥é”�) +4. **Waiting**(调用ä¸�带超时的 wait() 或 join()) +5. **TIMED_WAITING**(调用 sleep()ã€�带超时的 wait() 或者 join()) +6. **TERMINATED**(死亡) + +![](index_files/19f2c9ef-6739-4a95-8e9d-aa3f7654e028.jpg) + +# 结æ�Ÿçº¿ç¨‹ + +## 1. 阻塞 + +一个线程进入阻塞状æ€�å�¯èƒ½æœ‰ä»¥ä¸‹åŽŸå› ï¼š + +1. 调用 Thread.sleep() 方法进入休眠状æ€�ï¼› +2. 通过 wait() 使线程挂起,直到线程得到 notify() 或 notifyAll() 消æ�¯ï¼ˆæˆ–者 java.util.concurrent 类库中等价的 signal() 或 signalAll() 消æ�¯ï¼› +3. 等待æŸ�个 I/O 的完æˆ�ï¼› +4. 试图在æŸ�个对象上调用其å�Œæ­¥æŽ§åˆ¶æ–¹æ³•,但是对象é”�ä¸�å�¯ç”¨ï¼Œå› ä¸ºå�¦ä¸€ä¸ªçº¿ç¨‹å·²ç»�获得了这个é”�。 + +## 2. 中断 + +使用中断机制å�³å�¯ç»ˆæ­¢é˜»å¡žçš„线程。 + +使用 **interrupt()** 方法æ�¥ä¸­æ–­æŸ�个线程,它会设置线程的中断状æ€�。Object.wait(), Thread.join() 和 Thread.sleep() 三ç§�方法在收到中断请求的时候会清除中断状æ€�,并抛出 InterruptedException。 + +应当æ�•获这个 InterruptedException 异常,从而å�šä¸€äº›æ¸…ç�†èµ„æº�çš„æ“�作。 + +**ä¸�å�¯ä¸­æ–­çš„阻塞** + +ä¸�能中断 I/O 阻塞和 synchronized é”�阻塞。 + +**Executor 的中断æ“�作** + +Executor é�¿å…�对 Thread 对象的直接æ“�作,但是使用 interrupt() 方法必须æŒ�有 Thread 对象。Executor 使用 shutdownNow() 方法æ�¥ä¸­æ–­æ‰€æœ‰å®ƒé‡Œé�¢çš„æ‰€æœ‰çº¿ç¨‹ï¼ŒshutdownNow() 方法会å�‘é€� interrupt() 调用给所有线程。 + +如果å�ªæƒ³ä¸­æ–­ä¸€ä¸ªçº¿ç¨‹ï¼Œé‚£ä¹ˆä½¿ç”¨Â Executor 的 submit() 而ä¸�是 executor() æ�¥å�¯åŠ¨çº¿ç¨‹ï¼Œå°±å�¯ä»¥æŒ�有线程的上下文。submit() 将返回一个泛型 Futrue,å�¯ä»¥åœ¨å®ƒä¹‹ä¸Šè°ƒç”¨Â cancel(),如果将 true 传递给 cancel(),那么它将会å�‘é€� interrupt() 调用给特定的线程。 + +**检查中断** + +通过中断的方法æ�¥ç»ˆæ­¢çº¿ç¨‹ï¼Œéœ€è¦�线程进入阻塞状æ€�æ‰�能终止。如果编写的 run() 方法循环æ�¡ä»¶ä¸ºÂ true,但是该线程ä¸�å�‘生阻塞,那么线程就永远无法终止。 + +interrupt() 方法会设置中断状æ€�,å�¯ä»¥é€šè¿‡Â interrupted() 方法æ�¥æ£€æŸ¥ä¸­æ–­çŠ¶ï¼Œä»Žè€Œåˆ¤æ–­ä¸€ä¸ªçº¿ç¨‹æ˜¯å�¦å·²ç»�被中断。 + +interrupted() 方法在检查完中断状æ€�之å�Žä¼šæ¸…除中断状æ€�,这样å�šæ˜¯ä¸ºäº†ç¡®ä¿�一次中断æ“�作å�ªä¼šäº§ç”Ÿä¸€æ¬¡å½±å“�。 + +# 原å­�性 + +对于除 long 和 double 之外的基本类型å�˜é‡�的读写,å�¯ä»¥çœ‹æˆ�是具有原å­�性的,以ä¸�å�¯åˆ†å‰²çš„æ­¥éª¤æ“�作内存。 + +JVM 将 64 ä½�å�˜é‡�(long 和 double)的读写当å�šä¸¤ä¸ªåˆ†ç¦»çš„ 32 ä½�æ“�作æ�¥æ‰§è¡Œï¼Œåœ¨ä¸¤ä¸ªæ“�作之间å�¯èƒ½ä¼šå�‘生上下文切æ�¢ï¼Œå› æ­¤ä¸�具有原å­�性。å�¯ä»¥ä½¿ç”¨Â **volatile** 关键字æ�¥å®šä¹‰Â long 和 double å�˜é‡�,从而获得原å­�性。 + +**AtomicIntegerã€�AtomicLongã€�AtomicReference** 等特殊的原å­�性å�˜é‡�ç±»æ��供了下é�¢å½¢å¼�的原å­�性æ�¡ä»¶æ›´æ–°è¯­å�¥ï¼Œä½¿å¾—比较和更新这两个æ“�作能够ä¸�å�¯åˆ†å‰²åœ°æ‰§è¡Œã€‚ + +```java +boolean compareAndSet(expectedValue, updateValue); +``` + +AtomicInteger 使用举例: + +```java +private AtomicInteger ai = new AtomicInteger(0); + +public int next() { +    return ai.addAndGet(2) +} +``` + +原å­�性具有很多å¤�æ�‚问题,应当尽é‡�使用å�Œæ­¥è€Œä¸�是原å­�性。 + +# volatile + +ä¿�è¯�了内存å�¯è§�性和ç¦�止指令é‡�排,没法ä¿�è¯�原å­�性。 + +## 1. 内存å�¯è§�性 + +普通共享å�˜é‡�被修改之å�Žï¼Œä»€ä¹ˆæ—¶å€™è¢«å†™å…¥ä¸»å­˜æ˜¯ä¸�确定的。 + +volatile 关键字会ä¿�è¯�æ¯�次修改共享å�˜é‡�之å�Žè¯¥å€¼ä¼šç«‹å�³æ›´æ–°åˆ°å†…存中,并且在读å�–时会从内存中读å�–值。 + +synchronized 和 Lock 也能够ä¿�è¯�内存å�¯è§�性。它们能ä¿�è¯�å�Œä¸€æ—¶åˆ»å�ªæœ‰ä¸€ä¸ªçº¿ç¨‹èŽ·å�–é”�ç„¶å�Žæ‰§è¡Œå�Œæ­¥ä»£ç �,并且在释放é”�之å‰�会将对å�˜é‡�的修改刷新到主存当中。ä¸�过å�ªæœ‰å¯¹å…±äº«å�˜é‡�的 set() 和 get() 方法都加上 synchronized æ‰�能ä¿�è¯�å�¯è§�性,如果å�ªæœ‰Â set() 方法加了 synchronized,那么 get() 方法并ä¸�能ä¿�è¯�会从内存中读å�–最新的数æ�®ã€‚ + +## 2. ç¦�止指令é‡�排 + +在 Java 内存模型中,å…�许编译器和处ç�†å™¨å¯¹æŒ‡ä»¤è¿›è¡Œé‡�排åº�,é‡�排åº�过程ä¸�会影å“�到å�•线程程åº�的执行,å�´ä¼šå½±å“�到多线程并å�‘执行的正确性。 + +volatile 关键字通过添加内存å±�障的方å¼�æ�¥è¿›åˆ¶æŒ‡ä»¤é‡�排,å�³é‡�排åº�æ—¶ä¸�能把å�Žé�¢çš„æŒ‡ä»¤æ”¾åˆ°å†…å­˜å±�障之å‰�。 + +å�¯ä»¥é€šè¿‡Â synchronized 和 Lock æ�¥ä¿�è¯�有åº�性,它们ä¿�è¯�æ¯�个时刻å�ªæœ‰ä¸€ä¸ªçº¿ç¨‹æ‰§è¡Œå�Œæ­¥ä»£ç �,相当于是让线程顺åº�执行å�Œæ­¥ä»£ç �,自然就ä¿�è¯�了有åº�性。 + +# å�¯é‡�入内置é”� + +æ¯�个Java对象都å�¯ä»¥ç”¨å�šä¸€ä¸ªå®žçްå�Œæ­¥çš„é”�,这些é”�被称为内置é”�或监视器é”�。线程在进入å�Œæ­¥ä»£ç �å�—之å‰�会自动获å�–é”�,并且在退出å�Œæ­¥ä»£ç �å�—时会自动释放é”�。获得内置é”�的唯一途径就是进入由这个é”�ä¿�护的å�Œæ­¥ä»£ç �å�—或方法。 + +当æŸ�个线程请求一个由其他线程æŒ�有的é”�时,å�‘出请求的线程就会阻塞。然而,由于内置é”�是å�¯é‡�入的,因此如果æŸ�个线程试图获得一个已ç»�由它自己æŒ�有的é”�,那么这个请求就会æˆ�功。“é‡�å…¥â€�æ„�味ç�€èŽ·å�–é”�çš„æ“�作的粒度是“线程â€�,而ä¸�是调用。é‡�入的一ç§�实现方法是,为æ¯�个é”�å…³è�”一个获å�–计数值和一个所有者线程。 + +é‡�入进一步æ��å�‡äº†åŠ é”�行为的å°�装性,因此简化了é�¢å�‘对象并å�‘代ç �的开å�‘。分æž�如下程åº�: + +```java +public class Father +{ +    public synchronized void doSomething(){ +        ...... +    } +} + +public class Child extends Father +{ +    public synchronized void doSomething(){ +        ...... +        super.doSomething(); +    } +} +``` + +å­�类覆写了父类的å�Œæ­¥æ–¹æ³•,然å�Žè°ƒç”¨çˆ¶ç±»ä¸­çš„æ–¹æ³•,此时如果没有å�¯é‡�入的é”�,那么这段代ç �件产生死é”�。 + +由于Fitherå’ŒChild中的doSomething()方法都是synchronized方法,因此æ¯�个doSomething()方法在执行å‰�都会获å�–Child对象实例上的é”�。如果内置é”�ä¸�是å�¯é‡�入的,那么在调用super.doSomething()时将无法获得该Child对象上的互斥é”�,因为这个é”�å·²ç»�被æŒ�有,从而线程会永远阻塞下去,一直在等待一个永远也无法获å�–çš„é”�。é‡�入则é�¿å…�了这ç§�æ­»é”�情况的å�‘生。 + +å�Œä¸€ä¸ªçº¿ç¨‹åœ¨è°ƒç”¨æœ¬ç±»ä¸­å…¶ä»–synchronized方法/å�—或父类中的synchronized方法/å�—时,都ä¸�会阻ç¢�该线程地执行,因为互斥é”�æ—¶å�¯é‡�入的。 + + +# Concurrent + +**Concurrent包里的其他东西:ArrayBlockingQueueã€�CountDownLatch等等。** + +CyclicBarrier 和 CountDownLatch 区别 + +这两个类é�žå¸¸ç±»ä¼¼ï¼Œéƒ½åœ¨Â java.util.concurrent 下,都å�¯ä»¥ç”¨æ�¥è¡¨ç¤ºä»£ç �è¿�行到æŸ�个点上,二者的区别在于: + +*   CyclicBarrier 的æŸ�个线程è¿�行到æŸ�个点上之å�Žï¼Œè¯¥çº¿ç¨‹å�³å�œæ­¢è¿�行,直到所有的线程都到达了这个点,所有线程æ‰�é‡�æ–°è¿�行;CountDownLatch 则ä¸�是,æŸ�线程è¿�行到æŸ�个点上之å�Žï¼Œå�ªæ˜¯ç»™æŸ�个数值 -1 而已,该线程继续è¿�行 + +*   CyclicBarrier å�ªèƒ½å”¤èµ·ä¸€ä¸ªä»»åŠ¡ï¼ŒCountDownLatch å�¯ä»¥å”¤èµ·å¤šä¸ªä»»åŠ¡ + +*   CyclicBarrier å�¯é‡�用,CountDownLatch ä¸�å�¯é‡�用,计数值为 0 该 CountDownLatch 就ä¸�å�¯å†�用了 + +# å…�é”�容器 + +å…�é”�容器通用策略是:对容器的修改å�¯ä»¥ä¸Žè¯»å�–æ“�作å�Œæ—¶å�‘生,å�ªè¦�读å�–è¿™å�ªèƒ½çœ‹åˆ°å®Œæˆ�修改地结果å�³å�¯ã€‚修改实在容器数æ�®ç»“构的æŸ�个部分的一个å�•独的副本(å�ˆæ˜¯æ˜¯æ•´ä¸ªæ•°æ�®ç»“构的副本)上执行的,并且这个副本在修改过程是ä¸�å�¯è§†çš„。å�ªæœ‰å½“修改完æˆ�å�Žï¼Œè¢«ä¿®æ”¹åœ°ç»“æž„æ‰�会自动地与主数æ�®ç»“构进行交æ�¢ï¼Œä¹‹å�Žè¯»å�–者就å�¯ä»¥çœ‹åˆ°è¿™ä¸ªä¿®æ”¹ç‰ˆæœ¬äº†ã€‚ + +**CopyOnWriteArrayList** 和 **CopyOnWriteArraySet** 在写入时都会导致创建整个底层数组的副本,而 **ConcurrentHashMap** 和 **ConcurrentLinkedQueue** å�ªä¼šåˆ›å»ºéƒ¨åˆ†å‰¯æœ¬ã€‚ + +1).Java.util 包中: +HashMapã€� HashSetã€� ArrayList 都ä¸�是线程安全的, Vectorã€� HashTable 是线程 +安全的。通过 Collections.synchronizedList/Set/Map/SortedSet/SortedMap å�¯ä»¥è¿”回 +一个å�Œæ­¥çš„对应集å�ˆ +通过对æ¯�一个公共方法进行å�Œæ­¥å®žçŽ°çº¿ç¨‹å®‰å…¨ã€‚ä½†æ˜¯åœ¨å¤šçº¿ç¨‹çŽ¯å¢ƒä¸‹å¯¹å®ƒä»¬ +进行诸如“缺少å�³åŠ å…¥â€�这类符å�ˆæ“�作时, 就会出现问题。ã€�解决】: 客户端加é”�, +è¦�注æ„�é”�定的对象是对 List 等集å�ˆç±»ï¼Œè€Œä¸�是客户端类 +ã€�ConcurrentModificationException】 +使用 Vector 或者å�Œæ­¥çš„ List,返回的 Iterator 迭代器都是 fail-fast 的, 这æ„�味 +ç�€å¦‚果在迭代过程中, 任何其他线程修改 List,都会失败, 抛出上异常,若想é�¿ +å…�该异常则必须在迭代期间对容器加é”�。 +2).Java.util.concurrent 包: +以下类在迭代期间都无需对容器加é”� +CopyOnWriteArrayList ã€� CopyOnWriteArraySet ã€� ConcurrentHashMap ã€� +ConcurrentLinkedQueue ã€� ConcurrentSkipListMap( 替 代 SortedMap) ã€� +ConcurrentSkipListSet( 替代 SortedSet) +CopyOnWriteArrayList:底层维护一个 volatile 的基础数组, æŸ�线程在对容器 +修改的时候先显示获å�–é”�(å�ªèƒ½æœ‰ä¸€ä¸ªçº¿ç¨‹ä¿®æ”¹ï¼‰ï¼ŒÂ ç„¶å�Žå¤�制基础数组(ä¿�è¯�了 +其他读线程ä¸�会出错), 最å�Žæ›´æ–°åŽŸæ•°ç»„ï¼ˆå› ä¸ºæ˜¯Â volatile 的,所以对其他读线程 +ç«‹å�³å�¯è§�)。 因为å¤�制数组开销较大,所以适å�ˆå…ƒç´ å°‘,修改æ“�作少的情况。 + +## HashTableã€�HashMapã€�ConcurrentHashMap 的区别 + +1). 主è¦�区别: +1). 直观使用上: HashTable ä¸�接å�— key 为 null, HashMap 接å�— key 为 null +2). 哈希冲çª�的概率ä¸�å�Œï¼šÂ æ ¹æ�®Â Hash 值计算数组下标的算法ä¸�å�Œï¼ŒÂ HashTable +直接使用对象的 hashCode, hashMap å�šäº†é‡�新计算, HashTable 的冲çª�几率比 +HashMap 高 +hashTable 默认的数组大å°�为 11, hashMap 默认数组大å°�为 16,他们的默认 +负载因å­�都是 0.75, HashTable 扩展为 2*size+1, HashMap 扩展为 2*size +3). 线程安全: HashTable 是线程安全的, HashMap 则ä¸�是线程安全的 , 但是 +仅仅是 Hashtable 仅仅是对æ¯�个方法进行了 synchronized å�Œæ­¥ï¼ŒÂ é¦–先这样的效率 +会比较低;其次它本身的å�Œæ­¥å¹¶ä¸�能ä¿�è¯�程åº�在并å�‘æ“�作下的正确性(虽然æ¯�个 +方法都是å�Œæ­¥çš„,但客户端调用å�¯èƒ½åœ¨ä¸€ä¸ªæ“�作中调用多个方法,就ä¸�能ä¿�è¯�æ“� +作原å­�性了),需è¦�高层次的并å�‘ä¿�护。 +2).ConcurrentHashMap 改进: + +å¹¶å�‘效率问题: Hashtable 和 Collections.synchronizedMap 通过å�Œæ­¥æ¯�个方 +法获得线程安全。 å�³å½“一个线程执行一个 Map 方法时,无论其他线程è¦�对 Map +进行什么样æ“�作,都ä¸�能执行,直到第一个线程结æ�Ÿæ‰�å�¯ä»¥ã€‚对比æ�¥è¯´ï¼Œ +ConcurrentHashMap 所使用的é”�分段技术,首先将数æ�®åˆ†æˆ�一段一段的存储,然 +å�Žç»™æ¯�一段数æ�®é…�一把é”�,当一个线程å� ç”¨é”�访问其中一个段数æ�®çš„æ—¶å€™ï¼Œå…¶ä»– +段的数æ�®ä¹Ÿèƒ½è¢«å…¶ä»–线程访问。 从而å�¯ä»¥æœ‰æ•ˆæ��高并å�‘效率。 + +迭代问题: ConcurrentHashMap 返回的 iterator 是弱一致性的,并ä¸�会抛出 +ConcurrentModifiedException。 弱一致性的迭代器å�¯ä»¥å®¹è®¸å¹¶å�‘修改,迭代器å�¯ä»¥ +感应到迭代器在被创建å�Žï¼Œå¯¹å®¹å™¨çš„修改。 +增加了常è§�的原å­�æ“�作 API: 它的 API 中包å�«ä¸€äº›åŽŸå­�å½¢å¼�的“putIfAbsent()ã€� +相等便移除ã€� 相等便替æ�¢â€�这些在 HashTable 中é�žåŽŸå­�æ“�作 + +## ConcurrentHashMap æº�ç �分æž� + +[探索 ConcurrentHashMap 高并å�‘性的实现机制](https://www.ibm.com/developerworks/cn/java/java-lo-concurrenthashmap/) + +# ThreadLocal + +é‡�点:ThreadLocal的设计ç�†å¿µä¸Žä½œç”¨ï¼ŒThreadPool用法与优势 + +[ThreadLocal æº�ç �深入分æž� ](http://www.sczyh30.com/posts/Java/java-concurrent-threadlocal/) + +# 线程池 + +**线程池的底层实现和工作原ç�†ï¼ˆå»ºè®®å†™ä¸€ä¸ªé›�形简版æº�ç �实现)** + +[线程ã€�多线程与线程池总结](https://www.jianshu.com/p/b8197dd2934c) + +# 多线程开å�‘良好的实践 + +- 给线程命å��ï¼› +- 最å°�化å�Œæ­¥èŒƒå›´ï¼› +- 优先使用 volatileï¼› +- 尽å�¯èƒ½ä½¿ç”¨æ›´é«˜å±‚次的并å�‘工具而é�žÂ wait 和 notify() æ�¥å®žçŽ°çº¿ç¨‹é€šä¿¡ï¼Œå¦‚Â BlockingQueue, Semeaphoreï¼› +- 多用并å�‘容器,少用å�Œæ­¥å®¹å™¨ï¼Œå¹¶å�‘容器å£�å�Œæ­¥å®¹å™¨çš„å�¯æ‰©å±•性更好。 +- 考虑使用线程池 +- 最低é™�度的使用å�Œæ­¥å’Œé”�,缩å°�临界区。因此相对于å�Œæ­¥æ–¹æ³•,å�Œæ­¥å�—会更好。 + +# å�‚考资料 + +- Java 编程æ€�想 +- [Java 线程é�¢è¯•题 Top 50](http://www.importnew.com/12773.html) +- [Java é�¢è¯•专题 - 多线程 & 并å�‘编程 ](https://www.jianshu.com/p/e0c8d3dced8a) +- [å�¯é‡�入内置é”�](https://github.com/francistao/LearningNotes/blob/master/Part2/JavaConcurrent/%E5%8F%AF%E9%87%8D%E5%85%A5%E5%86%85%E7%BD%AE%E9%94%81.md) \ No newline at end of file diff --git a/notes/笔记/Java æº�ç �è§£æž�.md.txt b/notes/笔记/Java æº�ç �è§£æž�.md.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/notes/笔记/Java æº�ç �è§£æž�.md.txt @@ -0,0 +1 @@ + diff --git a/notes/笔记/Leetcode 题解.md.txt b/notes/笔记/Leetcode 题解.md.txt new file mode 100644 index 00000000..45346260 --- /dev/null +++ b/notes/笔记/Leetcode 题解.md.txt @@ -0,0 +1,4844 @@ +[TOC] + +# 算法æ€�想 + +## 二分查找 + +二分查找æ€�想简å�•,但是在实现时有一些需è¦�注æ„�的细节: + +1. 在计算 mid 时ä¸�能使用 mid = (l + h) / 2 这ç§�æ–¹å¼�,因为 l + h å�¯èƒ½ä¼šå¯¼è‡´åŠ æ³•æº¢å‡ºï¼Œåº”è¯¥ä½¿ç”¨Â mid = l + (h - l) / 2 。 + +2. 对 h 的赋值和循环æ�¡ä»¶æœ‰å…³ï¼Œå½“循环æ�¡ä»¶ä¸ºÂ l <= h 时,h = mid - 1;当循环æ�¡ä»¶ä¸ºÂ l < h 时,h = mid。 +解释如下:在循环æ�¡ä»¶ä¸ºÂ l <= h 时,如果 h = mid,会出现循环无法退出的情况,例如 l = 1,h = 1,此时 mid 也等于 1,如果此时继续执行 h = mid ,那么就会无é™�循环;在循环æ�¡ä»¶ä¸ºÂ l < h ,如果 h = mid - 1,会错误跳过查找的数,例如对于数组 1,2,3 ,è¦�查找 1 ,最开始 l = 0,h = 2,mid = 1,判断 key < arr[mid] 执行 h = mid - 1 = 0,此时循环退出,直接把查找的数跳过了。 + +3. l 的赋值一般都为 l = mid + 1。 + +```java +public int search(int key, int[] arr) { +    int l = 0, h = arr.length - 1; +    while (l <= h) { +        int mid = l + (h - l) / 2; +        if (key == arr[mid]) return mid; +        if (key < arr[mid]) h = mid - 1; +        else l = mid + 1; +    } +    return -1; +} +``` + +**求开方** + +[Leetcode : 69. Sqrt(x) (Easy)](https://leetcode.com/problems/sqrtx/description/) + +一个数 x 的开方 sqrt 一定在 0 ~ x 之间,并且满足 sqrt == x / sqrt 。å�¯ä»¥åˆ©ç”¨äºŒåˆ†æŸ¥æ‰¾åœ¨Â 0 ~ x 之间查找 sqrt。 + +```java +public int mySqrt(int x) { +    if(x <= 1) return x; +    int l = 1, h = x; +    while(l <= h){ +        int mid = l + (h - l) / 2; +        int sqrt = x / mid; +        if(sqrt == mid) return mid; +        else if(sqrt < mid) h = mid - 1; +        else l = mid + 1; +    } +    return h; +} +``` + +**摆硬å¸�** + +[Leetcode : 441. Arranging Coins (Easy)](https://leetcode.com/problems/arranging-coins/description/) + +```html +n = 8 + +The coins can form the following rows: +¤ +¤ ¤ +¤ ¤ ¤ +¤ ¤ + +Because the 4th row is incomplete, we return 3. +``` + +题目æ��述:第 i 行摆 i 个,统计能够排列的行数。 + +返回 h 而ä¸�是 l,因为摆的硬å¸�最å�Žä¸€è¡Œä¸�能算进去。 + +```java +public int arrangeCoins(int n) { +    int l = 0, h = n; +    while(l <= h){ +        int m = l + (h - l) / 2; +        long x = m * (m + 1L) / 2; +        if(x == n) return m; +        else if(x < n) l = m + 1; +        else h = m - 1; +    } +    return h; +} +``` + +å�¯ä»¥ä¸�用二分查找,更直观的解法如下: + +```java +public int arrangeCoins(int n) { +    int level = 1; +    while (n > 0) { +        n -= level; +        level++; +    } +    return n == 0 ? level - 1 : level - 2; +} +``` + +**有åº�数组的 Single Element** + +[Leetcode : 540. Single Element in a Sorted Array (Medium)](https://leetcode.com/problems/single-element-in-a-sorted-array/description/) + +题目æ��述:一个有åº�数组å�ªæœ‰ä¸€ä¸ªæ•°ä¸�出现两次,找出这个数。 + +```java +public int singleNonDuplicate(int[] nums) { +    int l = 0, h = nums.length - 1; +    while(l < h) { +        int m = l + (h - l) / 2; +        if(m % 2 == 1) m--; // ä¿�è¯� l/h/m 都在å�¶æ•°ä½�,使得查找区间大å°�一直都是 奇数 +        if(nums[m] == nums[m + 1]) l = m + 2; +        else h = m; +    } +    return nums[l]; +} +``` + +## 贪心æ€�想 + +贪心æ€�想ä¿�è¯�æ¯�次æ“�作都是局部最优的,并且最å�Žå¾—到的结果是全局最优的。 + +**分é…�饼干** + +[Leetcode : 455. Assign Cookies (Easy)](https://leetcode.com/problems/assign-cookies/description/) + +题目æ��述:æ¯�个孩å­�都有一个满足度,æ¯�个饼干都有一个大å°�,å�ªæœ‰é¥¼å¹²çš„大å°�大于一个孩å­�的满足度,该孩å­�æ‰�会获得满足。求解最多å�¯ä»¥èŽ·å¾—æ»¡è¶³çš„å­©å­�æ•°é‡�。 + +因为最å°�的孩å­�最容易得到满足,因此先满足最å°�å­©å­�。给一个孩å­�的饼干应当尽é‡�å°�å�ˆèƒ½æ»¡è¶³è¯¥å­©å­�,这样大饼干就能拿æ�¥ç»™æ»¡è¶³åº¦æ¯”较大的孩å­�。 + +è¯�明:å�‡è®¾åœ¨æŸ�次选择中,贪心策略选择给第 i 个孩å­�分é…�第 m 个饼干,并且第 i 个孩å­�满足度最å°�,第 m 个饼干为å�¯ä»¥æ»¡è¶³ç¬¬Â i 个孩å­�的最å°�饼干,利用贪心策略最终å�¯ä»¥æ»¡è¶³Â k 个孩å­�。å�‡è®¾æœ€ä¼˜ç­–略在这次选择中给 i 个孩å­�分é…�第 n 个饼干,并且这个饼干大于第 m 个饼干,那么最优策略最终需è¦�满足大于 k 个孩å­�。我们å�‘现使用第 m 个饼干去替代第 n 个饼干完全ä¸�å½±å“�å�Žç»­çš„结果,因此贪心策略就是最优策略,因此贪心策略是最优的。 + +```java +public int findContentChildren(int[] g, int[] s) { +    Arrays.sort(g); +    Arrays.sort(s); +    int i = 0, j = 0; +    while(i < g.length && j < s.length){ +        if(g[i] <= s[j]) i++; +        j++; +    } +    return i; +} +``` + +**投飞镖刺气ç�ƒ** + +[Leetcode : 452. Minimum Number of Arrows to Burst Balloons (Medium)](https://leetcode.com/problems/minimum-number-of-arrows-to-burst-balloons/description/) + +``` +Input: +[[10,16], [2,8], [1,6], [7,12]] + +Output: +2 +``` + +题目æ��述:气ç�ƒåœ¨ä¸€ä¸ªæ°´å¹³æ•°è½´ä¸Šæ‘†æ”¾ï¼Œå�¯ä»¥é‡�å� ï¼Œé£žé•–垂直射å�‘å��标轴,使得路径上的气ç�ƒéƒ½ä¼šåˆºç ´ï¼Œæ±‚解最å°�的投飞镖次数。 + +```java +public int findMinArrowShots(int[][] points) { +    if(points.length == 0) return 0; +    Arrays.sort(points,(a,b) -> (a[1] - b[1])); +    int curPos = points[0][1]; +    int ret = 1; +    for (int i = 1; i < points.length; i++) { +        if(points[i][0] <= curPos) { +            continue; +        } +        curPos = points[i][1]; +        ret++; +    } +    return ret; + } +``` + +**股票的最大收益** + +[Leetcode : 122. Best Time to Buy and Sell Stock II (Easy)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-ii/description/) + +先买入股票,然å�Žå‡ºå”®è‚¡ç¥¨ï¼Œä»Žè€Œè޷得差价另æ�¥çš„æ”¶ç›Šã€‚ + +对于一个交易 [a, b, c, d],如果有 a <= b <= c <= d ,那么最大收益为 d - a = (d - c) + (c - b) + (b - a) 。当访问到一个 prices[i] 且  prices[i] - prices[i-1] ,那么就把 prices[i] - prices[i-1] 加到收益中,从而在局部最优的情况下也ä¿�è¯�全局最优。 + +```java +public int maxProfit(int[] prices) { +    int profit = 0; +    for(int i = 1; i < prices.length; i++){ +        if(prices[i] > prices[i-1]) profit += (prices[i] - prices[i-1]); +    } +    return profit; +} +``` + +**ç§�æ¤�花朵** + +[Leetcode : 605. Can Place Flowers (Easy)](https://leetcode.com/problems/can-place-flowers/description/) + +```html +Input: flowerbed = [1,0,0,0,1], n = 1 +Output: True +``` + +题目æ��述:花朵之间至少需è¦�一个å�•ä½�的间隔。 + +```java +public boolean canPlaceFlowers(int[] flowerbed, int n) { +    int cnt = 0; +    for(int i = 0; i < flowerbed.length; i++){ +        if(flowerbed[i] == 1) continue; +        int pre = i == 0 ? 0 : flowerbed[i - 1]; +        int next = i == flowerbed.length - 1 ? 0 : flowerbed[i + 1]; +        if(pre == 0 && next == 0) { +            cnt++; +            flowerbed[i] = 1; +        } +    } +    return cnt >= n; +} +``` + +**修改一个数æˆ�为é�žé€’å‡�数组** + +[Leetcode : 665. Non-decreasing Array (Easy)](https://leetcode.com/problems/non-decreasing-array/description/) + +题目æ��述:判断一个数组能ä¸�能å�ªä¿®æ”¹ä¸€ä¸ªæ•°å°±æˆ�为é�žé€’å‡�数组。 + +在 nums[i] < nums[i - 1] 的情况下,会优先考虑令 nums[i - 1] = nums[i],因为如果修改 nums[i] = nums[i - 1] 的è¯�,那么 nums[i] 这个数会å�˜å¤§ï¼Œé‚£ä¹ˆå°±æœ‰å�¯èƒ½æ¯” nums[i + 1] 大,我们è¦�å°½é‡�使 nums[i] 更å°�。 + +但是在 nums[i] < nums[i - 2] 的情况下,å�ªä¿®æ”¹Â nums[i - 1] ä¸�能令数组æˆ�为é�žé€’å‡�,å�ªèƒ½é€šè¿‡ä¿®æ”¹Â nums[i] = nums[i - 1] æ‰�行。 + +```java +public boolean checkPossibility(int[] nums) { +    int cnt = 0; +    for(int i = 1; i < nums.length; i++){ +        if(nums[i] < nums[i - 1]){ +            cnt++; +            if(i - 2 >= 0 && nums[i - 2] > nums[i]) nums[i] = nums[i-1]; +            else nums[i - 1] = nums[i]; +        } +    } +    return cnt <= 1; +} +``` + +**判断是å�¦ä¸ºå­�串** + +[Leetcode : 392. Is Subsequence (Medium)](https://leetcode.com/problems/is-subsequence/description/) + +```html +s = "abc", t = "ahbgdc" +Return true. +``` + +```java +public boolean isSubsequence(String s, String t) { +    for (int i = 0, pos = 0; i < s.length(); i++, pos++) { +        pos = t.indexOf(s.charAt(i), pos); +        if(pos == -1) return false; +    } +    return true; +} +``` + +**分隔字符串使å�Œç§�字符出现在一起** + +[Leetcode : 763. Partition Labels (Medium)](https://leetcode.com/problems/partition-labels/description/) + +```java +public List partitionLabels(String S) { +    List ret = new ArrayList<>(); +    int[] lastIdxs = new int[26]; +    for(int i = 0; i < S.length(); i++) lastIdxs[S.charAt(i) - 'a'] = i; +    int startIdx = 0; +    while(startIdx < S.length()) { +        int endIdx = startIdx; +        for(int i = startIdx; i < S.length() && i <= endIdx; i++) { +            int lastIdx = lastIdxs[S.charAt(i) - 'a']; +            if(lastIdx == i) continue; +            if(lastIdx > endIdx) endIdx = lastIdx; +        } +        ret.add(endIdx - startIdx + 1); +        startIdx = endIdx + 1; +    } +    return ret; +} +``` + +**æ ¹æ�®èº«é«˜å’Œåº�å�·é‡�组队列** + +```html +Input: +[[7,0], [4,4], [7,1], [5,0], [6,1], [5,2]] + +Output: +[[5,0], [7,0], [5,2], [6,1], [4,4], [7,1]] +``` + +一个学生用两个分é‡� (h, k) æ��述,h 表示身高,k 表示排在å‰�é�¢çš„æœ‰Â k 个学生的身高比他高或者和他一样高。 + +先排åº�:身高é™�åº�ã€�k 值å�‡åº�,然å�ŽæŒ‰æŽ’好åº�的顺åº�æ�’入队列的第 k 个ä½�置中。 + +```java +public int[][] reconstructQueue(int[][] people) { +    if(people == null || people.length == 0 || people[0].length == 0) return new int[0][0]; +     +    Arrays.sort(people, new Comparator() { +       public int compare(int[] a, int[] b) { +           if(a[0] == b[0]) return a[1] - b[1]; +           return b[0] - a[0]; +       }  +    }); +     +    int n = people.length; +    List tmp = new ArrayList<>(); +    for(int i = 0; i < n; i++) { +        tmp.add(people[i][1], new int[]{people[i][0], people[i][1]}); +    } +     +    int[][] ret = new int[n][2]; +    for(int i = 0; i < n; i++) { +        ret[i][0] = tmp.get(i)[0]; +        ret[i][1] = tmp.get(i)[1]; +    } +    return ret; +} +``` + + +## å�ŒæŒ‡é’ˆ + +å�ŒæŒ‡é’ˆä¸»è¦�用于é��历数组,两个指针指å�‘ä¸�å�Œçš„元素,从而å��å�Œå®Œæˆ�任务。 + +**从一个已ç»�排åº�的数组中查找出两个数,使它们的和为 0** + +[Leetcode :167. Two Sum II - Input array is sorted (Easy)](https://leetcode.com/problems/two-sum-ii-input-array-is-sorted/description/) + +使用å�ŒæŒ‡é’ˆï¼Œä¸€ä¸ªæŒ‡é’ˆæŒ‡å�‘元素较å°�的值,一个指针指å�‘元素较大的值。指å�‘较å°�元素的指针从头å�‘å°¾é��历,指å�‘较大元素的指针从尾å�‘头é��历。 + +如果两个指针指å�‘元素的和 sum == target,那么得到è¦�求的结果;如果 sum > target,移动较大的元素,使 sum å�˜å°�一些;如果 sum < target,移动较å°�的元素,使 sum å�˜å¤§ä¸€äº›ã€‚ + +```java +public int[] twoSum(int[] numbers, int target) { +    int i = 0, j = numbers.length - 1; +    while (i < j) { +        int sum = numbers[i] + numbers[j]; +        if (sum == target) return new int[]{i + 1, j + 1}; +        else if (sum < target) i++; +        else j--; +    } +    return null; +} +``` + +此问题å�¯æ‰©å±•æˆ�三个元素和为 0 的问题:[程åº�员代ç �é�¢è¯•指å�— P351](#) + +**数组中累加和为给定值的最长å­�数组长度** + +[程åº�员代ç �é�¢è¯•指å�— P354/P355/P358](#) + +**在行和列都排好åº�的矩阵中查找元素** + +[程åº�员代ç �é�¢è¯•指å�— P347](#) + +**å��转字符串中的元音字符** + +[Leetcode : 345. Reverse Vowels of a String (Easy)](https://leetcode.com/problems/reverse-vowels-of-a-string/description/) + +使用å�ŒæŒ‡é’ˆï¼ŒæŒ‡å�‘å¾…å��转的两个元音字符,一个指针从头å�‘å°¾é��历,一个指针从尾到头é��历。 + +```java +private HashSet vowels = new HashSet<>(Arrays.asList('a','e','i','o','u','A','E','I','O','U')); + +public String reverseVowels(String s) { +    if(s.length() == 0) return s; +    int i = 0, j = s.length() - 1; +    char[] result = new char[s.length()]; +    while(i <= j){ +        char ci = s.charAt(i); +        char cj = s.charAt(j); +        if(!vowels.contains(ci)){ +            result[i] = ci; +            i++; +        } else if(!vowels.contains(cj)){ +            result[j] = cj; +            j--; +        } else{ +            result[i] = cj; +            result[j] = ci; +            i++; +            j--; +        } +    } +    return new String(result); +} +``` + +**两数平方和** + +[Leetcode : 633. Sum of Square Numbers (Easy)](https://leetcode.com/problems/sum-of-square-numbers/description/) + +判断一个数是å�¦ä¸ºä¸¤ä¸ªæ•°çš„平方和,例如 5 = 12 + 22。 + +```java +public boolean judgeSquareSum(int c) { +    int left = 0, right = (int) Math.sqrt(c); +    while(left <= right){ +        int powSum = left * left + right * right; +        if(powSum == c) return true; +        else if(powSum > c) right--; +        else left++; +    } +    return false; +} +``` + +**字符串回文数(å�¯åˆ é™¤ä¸€ä¸ªå­—符)** + +[Leetcode : 680. Valid Palindrome II (Easy)](https://leetcode.com/problems/valid-palindrome-ii/description/) + +```java +public boolean validPalindrome(String s) { +    int i = 0, j = s.length() -1; +    while(i < j){ +        if(s.charAt(i) != s.charAt(j)){ +            return isPalindrome(s, i, j - 1) || isPalindrome(s, i + 1, j); +        } +        i++; +        j--; +    } +    return true; +} + +private boolean isPalindrome(String s, int l, int r){ +    while(l < r){ +        if(s.charAt(l) != s.charAt(r)) +            return false; +        l++; +        r--; +    } +    return true; +} +``` + +**归并两个有åº�数组** + +[Leetcode : 88. Merge Sorted Array (Easy)](https://leetcode.com/problems/merge-sorted-array/description/) + +把归并结果存到第一个数组上。 + +```java +public void merge(int[] nums1, int m, int[] nums2, int n) { +    int i = m - 1, j = n - 1; // 需è¦�从尾开始é��历,å�¦åˆ™åœ¨Â nums1 上归并得到的值会覆盖还未进行归并比较的值 +    int idx = m + n - 1; +    while(i >= 0 || j >= 0){ +        if(i < 0) nums1[idx] = nums2[j--]; +        else if(j < 0) nums1[idx] = nums1[i--]; +        else if(nums1[i] > nums2[j]) nums1[idx] = nums1[i--]; +        else nums1[idx] = nums2[j--]; +        idx--; +    } +} +``` + +**判断链表是å�¦å­˜åœ¨çޝ** + +[Leetcode : 141. Linked List Cycle (Easy)](https://leetcode.com/problems/linked-list-cycle/description/) + +使用å�ŒæŒ‡é’ˆï¼Œä¸€ä¸ªæŒ‡é’ˆæ¯�次移动一个节点,一个指针æ¯�次移动两个节点,如果存在环,那么这两个指针一定会相é�‡ã€‚ + +```java +public boolean hasCycle(ListNode head) { +    if(head == null) return false; +    ListNode l1 = head, l2 = head.next; +    while(l1 != null && l2 != null){ +        if(l1 == l2) return true; +        l1 = l1.next; +        if(l2.next == null) break; +        l2 = l2.next.next; +    } +    return false; +} +``` + +**最长å­�åº�列** + +[Leetcode : 524. Longest Word in Dictionary through Deleting (Medium)](https://leetcode.com/problems/longest-word-in-dictionary-through-deleting/description/) + +``` +Input: +s = "abpcplea", d = ["ale","apple","monkey","plea"] + +Output: +"apple" +``` + +```java +public String findLongestWord(String s, List d) { +    String ret = ""; +    for (String str : d) { +        for (int i = 0, j = 0; i < s.length() && j < str.length(); i++) { +            if (s.charAt(i) == str.charAt(j)) j++; +            if (j == str.length()) { +                if (ret.length() < str.length() +                        || (ret.length() == str.length() && ret.compareTo(str) > 0)) { +                    ret = str; +                } +            } +        } +    } +    return ret; +} +``` + +## 排åº� + +### 快速选择 + +一般用于求解 **Kth Element** 问题,å�¯ä»¥åœ¨Â O(n) 时间å¤�æ�‚度,O(1) 空间å¤�æ�‚度完æˆ�求解工作。 + +与快速排åº�一样,快速选择一般需è¦�先打乱数组,å�¦åˆ™æœ€å��情况下时间å¤�æ�‚度为 O(n2)。 + +### 堆排åº� + +堆排åº�用于求解 **TopK Elements** 问题,通过维护一个大å°�为 K 的堆,堆中的元素就是 TopK Elements。当然它也å�¯ä»¥ç”¨äºŽæ±‚解 Kth Element 问题,因为最å�Žå‡ºå †çš„那个元素就是 Kth Element。快速选择也å�¯ä»¥æ±‚解 TopK Elements 问题,因为找到 Kth Element 之å�Žï¼Œå†�é��历一次数组,所有å°�于等于  Kth Element 的元素都是 TopK Elements。å�¯ä»¥çœ‹åˆ°ï¼Œå¿«é€Ÿé€‰æ‹©å’Œå †æŽ’åº�都å�¯ä»¥æ±‚解 Kth Element 和 TopK Elements 问题,å�ªæ˜¯æœ‰å�¯èƒ½éœ€è¦�间接求解。 + +**Kth Element** + +[Leetocde : 215. Kth Largest Element in an Array (Medium)](https://leetcode.com/problems/kth-largest-element-in-an-array/description/) + +解题å�‚考:[Solution explained](https://leetcode.com/problems/kth-largest-element-in-an-array/discuss/60294/Solution-explained) + +- 时间å¤�æ�‚度 O(nlgn),空间å¤�æ�‚度 O(1) 解法:排åº� +- 时间å¤�æ�‚度 O(nlgk),空间å¤�æ�‚度 O(k) 解法:堆排åº� +- 时间å¤�æ�‚度 O(n),空间å¤�æ�‚度 O(1) 解法:QuickSelect + +**ToK Elements** + +[程åº�员代ç �é�¢è¯•指å�— P336](#) + +### 桶排åº� + + +**找出出现频率最多的 k 个数** + +[Leetcode : 347. Top K Frequent Elements (Medium)](https://leetcode.com/problems/top-k-frequent-elements/description/) + +桶排åº� + +```java +public List topKFrequent(int[] nums, int k) { +    List ret = new ArrayList<>(); +    Map map = new HashMap<>(); +    for(int num : nums) { +        map.put(num, map.getOrDefault(num, 0) + 1); +    } +    List[] bucket = new List[nums.length + 1]; +    for(int key : map.keySet()) { +        int frequency = map.get(key); +        if(bucket[frequency] == null) { +            bucket[frequency] = new ArrayList<>(); +        } +        bucket[frequency].add(key); +    } +     +    for(int i = bucket.length - 1; i >= 0 && ret.size() < k; i--) { +        if(bucket[i] != null) { +            ret.addAll(bucket[i]); +        } +    } +    return ret; +} +``` + +## æ�œç´¢ + +深度优先æ�œç´¢å’Œå¹¿åº¦ä¼˜å…ˆæ�œç´¢å¹¿æ³›è¿�用于树和图中,但是它们的应用远远ä¸�止如此。 + +### BFS + +![](index_files/4ff355cf-9a7f-4468-af43-e5b02038facc.jpg) + +广度优先æ�œç´¢çš„æ�œç´¢è¿‡ç¨‹æœ‰ç‚¹åƒ�一层一层地进行é��历:从节点 0 出å�‘,é��历到 6ã€�2ã€�1 和 5 这四个新节点。 + +继续从 6 开始é��历,得到节点 4 ;从 2 开始é��历,没有下一个节点;从 1 开始é��历,没有下一个节点;从 5 开始é��历,得到 3 和 4 节点。这一轮总共得到两个新节点:4 和 3 。 + +å��å¤�从新节点出å�‘进行上述的é��历æ“�作。 + +å�¯ä»¥çœ‹åˆ°ï¼Œæ¯�一轮é��历的节点都与根节点路径长度相å�Œã€‚设 di 表示第 i 个节点与根节点的路径长度,推导出一个结论:对于先é��历的节点 i 与å�Žé��历的节点 j,有 di<=dj。利用这个结论,å�¯ä»¥æ±‚解最短路径 **最优解** 问题:第一次é��历到目的节点,其所ç»�过的路径为最短路径,如果继续é��历,之å�Žå†�é��历到目的节点,所ç»�过的路径就ä¸�是最短路径。 + +在程åº�实现 BFS 时需è¦�考虑以下问题: + +- 队列:用æ�¥å­˜å‚¨æ¯�一轮é��历的节点 +- 标记:对于é��历过得节点,应该将它标记,防止é‡�å¤�é��历; + + +**计算在网格中从原点到特定点的最短路径长度** + +```html +[[1,1,0,1], +[1,0,1,0], +[1,1,1,1], +[1,0,1,1]] +``` + +```java +public int minPathLength(int[][] grids, int tr, int tc) { +    int[][] next = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; +    int m = grids.length, n = grids[0].length; +    Queue queue = new LinkedList<>(); +    queue.add(new Position(0, 0, 1)); +    while (!queue.isEmpty()) { +        Position pos = queue.poll(); +        for (int i = 0; i < 4; i++) { +            Position nextPos = new Position(pos.r + next[i][0], pos.c + next[i][1], pos.length + 1); +            if (nextPos.r < 0 || nextPos.r >= m || nextPos.c < 0 || nextPos.c >= n) continue; +            if (grids[nextPos.r][nextPos.c] != 1) continue; +            grids[nextPos.r][nextPos.c] = 0; +            if (nextPos.r == tr && nextPos.c == tc) return nextPos.length; +            queue.add(nextPos); +        } +    } +    return -1; +} + +private class Position { +    int r, c, length; +    public Position(int r, int c, int length) { +        this.r = r; +        this.c = c; +        this.length = length; +    } +} +``` + + +### DFS + +![](index_files/f7f7e3e5-7dd4-4173-9999-576b9e2ac0a2.png) + +广度优先æ�œç´¢ä¸€å±‚一层é��历,æ¯�一层é��历到的所有新节点,è¦�用队列先存储起æ�¥ä»¥å¤‡ä¸‹ä¸€å±‚é��历的时候å†�é��历;而深度优先æ�œç´¢åœ¨é��历到一个新节点时立马对新节点进行é��历:从节点 0 出å�‘开始é��历,得到到新节点 6 时,立马对新节点 6 进行é��历,得到新节点 4;如此å��å¤�以这ç§�æ–¹å¼�é��历新节点,直到没有新节点了,此时返回。返回到根节点 0 的情况是,继续对根节点 0 进行é��历,得到新节点 2,然å�Žç»§ç»­ä»¥ä¸Šæ­¥éª¤ã€‚ + +从一个节点出å�‘,使用 DFS 对一个图进行é��历时,能够é��历到的节点都是从åˆ�始节点å�¯è¾¾çš„,DFS 常用æ�¥æ±‚解这ç§� **å�¯è¾¾æ€§** 问题。 + +在程åº�实现 DFS 时需è¦�考虑以下问题: + +- 栈:用栈æ�¥ä¿�存当å‰�节点信æ�¯ï¼Œå½“é��历新节点返回时能够继续é��历当å‰�节点。也å�¯ä»¥ä½¿ç”¨é€’归栈。 +- 标记:和 BFS 一样å�Œæ ·éœ€è¦�对已ç»�é��历过得节点进行标记。 + + +**查找最大的连通é�¢ç§¯** + +[Leetcode : 695. Max Area of Island (Easy)](https://leetcode.com/problems/max-area-of-island/description/) + +```html +[[0,0,1,0,0,0,0,1,0,0,0,0,0], +[0,0,0,0,0,0,0,1,1,1,0,0,0], +[0,1,1,0,1,0,0,0,0,0,0,0,0], +[0,1,0,0,1,1,0,0,1,0,1,0,0], +[0,1,0,0,1,1,0,0,1,1,1,0,0], +[0,0,0,0,0,0,0,0,0,0,1,0,0], +[0,0,0,0,0,0,0,1,1,1,0,0,0], +[0,0,0,0,0,0,0,1,1,0,0,0,0]] +``` + +```java +public int maxAreaOfIsland(int[][] grid) { +    int m = grid.length, n = grid[0].length; +    int max = 0; +    for(int i = 0; i < m; i++){ +        for(int j = 0; j < n; j++){ +            if(grid[i][j] == 1) max = Math.max(max, dfs(grid, i, j)); +        } +    } +    return max; +} + +private int dfs(int[][] grid, int i, int j){ +    int m = grid.length, n = grid[0].length; +    if(i < 0 || i >= m || j < 0 || j >= n) return 0; +    if(grid[i][j] == 0) return 0; +    grid[i][j] = 0; +    return dfs(grid, i + 1, j) + dfs(grid, i - 1, j) + dfs(grid, i, j + 1) + dfs(grid, i, j - 1) + 1; +} +``` + +**图的连通分é‡�** + +[Leetcode : 547. Friend Circles (Medium)](https://leetcode.com/problems/friend-circles/description/) + +```html +Input: +[[1,1,0], + [1,1,0], + [0,0,1]] +Output: 2 +Explanation:The 0th and 1st students are direct friends, so they are in a friend circle. +The 2nd student himself is in a friend circle. So return 2. +``` + +```java +public int findCircleNum(int[][] M) { +    int n = M.length; +    int ret = 0; +    boolean[] hasFind = new boolean[n]; +    for(int i = 0; i < n; i++) { +        if(!hasFind[i]) { +            dfs(M, i, hasFind); +            ret++; +        } + +    } +    return ret; +} + +private void dfs(int[][] M, int i, boolean[] hasFind) { +    hasFind[i] = true; +    int n = M.length; +    for(int k = 0; k < n; k++) { +        if(M[i][k] == 1 && !hasFind[k]) { +            dfs(M, k, hasFind); +        } +    } +} +``` + +**矩阵中的连通区域数é‡�** + +[Leetcode : 200. Number of Islands (Medium)](https://leetcode.com/problems/number-of-islands/description/) + +```html +11110 +11010 +11000 +00000 +Answer: 1 +``` + +```java +private int m, n; +private int[][] direction = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; + +public int numIslands(char[][] grid) { +    if (grid == null || grid.length == 0) return 0; +    m = grid.length; +    n = grid[0].length; +    int ret = 0; +    for (int i = 0; i < m; i++) { +        for (int j = 0; j < n; j++) { +            if (grid[i][j] == '1') { +                dfs(grid, i, j); +                ret++; +            } +        } +    } +    return ret; +} + +private void dfs(char[][] grid, int i, int j) { +    if (i < 0 || i >= m || j < 0 || j >= n || grid[i][j] == '0') return; +    grid[i][j] = '0'; +    for (int k = 0; k < direction.length; k++) { +        dfs(grid, i + direction[k][0], j + direction[k][1]); +    } +} +``` + +**输出二å�‰æ ‘中所有从根到å�¶å­�的路径** + +[Leetcode : 257. Binary Tree Paths (Easy)](https://leetcode.com/problems/binary-tree-paths/description/) + +```html +  1 +/  \ +2    3 +\ +  5 +``` +```html +["1->2->5", "1->3"] +``` + +```java +public List binaryTreePaths(TreeNode root) { +    List ret = new ArrayList(); +    if(root == null) return ret; +    dfs(root, "", ret); +    return ret; +} + +private void dfs(TreeNode root, String prefix, List ret){ +    if(root == null) return; +    if(root.left == null && root.right == null){ +        ret.add(prefix + root.val); +        return; +    } +    prefix += (root.val + "->"); +    dfs(root.left, prefix, ret); +    dfs(root.right, prefix, ret); +} +``` + +**å¡«å……å°�闭区域** + +[Leetcode : 130. Surrounded Regions (Medium)](https://leetcode.com/problems/surrounded-regions/description/) + +```html +For example, +X X X X +X O O X +X X O X +X O X X + +After running your function, the board should be: +X X X X +X X X X +X X X X +X O X X +``` + +题目æ��述:使得被 'X' 的 'O' 转æ�¢ä¸ºÂ 'X'。 + +å�¯ä»¥é€‰æ‹©å…ˆå¡«å……最外侧,剩下的就是里侧了。 + +```java +private int[][] direction = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; +private int m, n; + +public void solve(char[][] board) { +    if (board == null || board.length == 0) return; +    m = board.length; +    n = board[0].length; +    for (int i = 0; i < m; i++) { +        dfs(board, i, 0); +        dfs(board, i, n - 1); +    } +    for (int i = 0; i < n; i++) { +        dfs(board, 0, i); +        dfs(board, m - 1, i); +    } +    for (int i = 0; i < m; i++) { +        for (int j = 0; j < n; j++) { +            if (board[i][j] == 'T') board[i][j] = 'O'; +            else if (board[i][j] == 'O') board[i][j] = 'X'; +        } +    } +} + +private void dfs(char[][] board, int r, int c) { +    if (r < 0 || r >= m || c < 0 || c >= n || board[r][c] != 'O') return; +    board[r][c] = 'T'; +    for (int i = 0; i < direction.length; i++) { +        dfs(board, r + direction[i][0], c + direction[i][1]); +    } +} +``` + +**从两个方å�‘都能到达的区域** + +[Leetcode : 417. Pacific Atlantic Water Flow (Medium)](https://leetcode.com/problems/pacific-atlantic-water-flow/description/) + +```html +Given the following 5x5 matrix: + +  Pacific ~   ~   ~   ~   ~  +       ~  1   2   2   3  (5) * +       ~  3   2   3  (4) (4) * +       ~  2   4  (5)  3   1  * +       ~ (6) (7)  1   4   5  * +       ~ (5)  1   1   2   4  * +          *   *   *   *   * Atlantic + +Return: +[[0, 4], [1, 3], [1, 4], [2, 2], [3, 0], [3, 1], [4, 0]] (positions with parentheses in above matrix). +``` + +题目æ��述:左边和上边是太平洋,å�³è¾¹å’Œä¸‹è¾¹æ˜¯å¤§è¥¿æ´‹ï¼Œå†…部的数字代表海拔,海拔高的地方的水能够æµ�到低的地方,求解水能够æµ�到太平洋和大西洋的所有地方。 + +```java +private int m, n; +private int[][] matrix; +private int[][] direction = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; + +public List pacificAtlantic(int[][] matrix) { +    List ret = new ArrayList<>(); +    if (matrix == null || matrix.length == 0) return ret; +    this.m = matrix.length; +    this.n = matrix[0].length; +    this.matrix = matrix; +    boolean[][] canReachP = new boolean[m][n]; +    boolean[][] canReachA = new boolean[m][n]; +    for (int i = 0; i < m; i++) { +        dfs(i, 0, canReachP); +        dfs(i, n - 1, canReachA); +    } +    for (int i = 0; i < n; i++) { +        dfs(0, i, canReachP); +        dfs(m - 1, i, canReachA); +    } +    for (int i = 0; i < m; i++) { +        for (int j = 0; j < n; j++) { +            if (canReachP[i][j] && canReachA[i][j]) { +                ret.add(new int[]{i, j}); +            } +        } +    } +    return ret; +} + +private void dfs(int r, int c, boolean[][] canReach) { +    if(canReach[r][c]) return; +    canReach[r][c] = true; +    for (int i = 0; i < direction.length; i++) { +        int nextR = direction[i][0] + r; +        int nextC = direction[i][1] + c; +        if (nextR < 0 || nextR >= m || nextC < 0 || nextC >= n +                || matrix[r][c] > matrix[nextR][nextC]) continue; +        dfs(nextR, nextC, canReach); +    } +} +``` + +**N 皇å�Ž** + +[Leetcode : 51. N-Queens (Hard)](https://leetcode.com/problems/n-queens/description/) + +![](index_files/1f080e53-4758-406c-bb5f-dbedf89b63ce.jpg) + +题目æ��述:在 n\*n 的矩阵中摆放 n 个皇å�Žï¼Œå¹¶ä¸”æ¯�个皇å�Žä¸�能在å�Œä¸€è¡Œï¼Œå�Œä¸€åˆ—,å�Œä¸€å¯¹è§’线上,è¦�求解所有的 n 皇å�Žè§£ã€‚ + +一行一行地摆放,在确定一行中的那个皇å�Žåº”该摆在哪一列时,需è¦�用三个标记数组æ�¥ç¡®å®šæŸ�一列是å�¦å�ˆæ³•,这三个标记数组分别为:列标记数组ã€�45 度对角线标记数组和 135 度对角线标记数组。 + +45 度对角线标记数组的维度为 2\*n - 1,通过下图å�¯ä»¥æ˜Žç¡®Â (r,c) 的ä½�置所在的数组下标为 r + c。 + +![](index_files/85583359-1b45-45f2-9811-4f7bb9a64db7.jpg) + +135 度对角线标记数组的维度也是 2\*n - 1,(r,c) 的ä½�置所在的数组下标为 n - 1 - (r - c)。 + +![](index_files/9e80f75a-b12b-4344-80c8-1f9ccc2d5246.jpg) + +```java +private List> ret; +private char[][] nQueens; +private boolean[] colUsed; +private boolean[] diagonals45Used; +private boolean[] diagonals135Used; +private int n; + +public List> solveNQueens(int n) { +    ret = new ArrayList<>(); +    nQueens = new char[n][n]; +    Arrays.fill(nQueens, '.'); +    colUsed = new boolean[n]; +    diagonals45Used = new boolean[2 * n - 1]; +    diagonals135Used = new boolean[2 * n - 1]; +    this.n = n; +    backstracking(0); +    return ret; +} + +private void backstracking(int row) { +    if (row == n) { +        List list = new ArrayList<>(); +        for (char[] chars : nQueens) { +            list.add(new String(chars)); +        } +        ret.add(list); +        return; +    } + +    for (int col = 0; col < n; col++) { +        int diagonals45Idx = row + col; +        int diagonals135Idx = n - 1 - (row - col); +        if (colUsed[col] || diagonals45Used[diagonals45Idx] || diagonals135Used[diagonals135Idx]) { +            continue; +        } +        nQueens[row][col] = 'Q'; +        colUsed[col] = diagonals45Used[diagonals45Idx] = diagonals135Used[diagonals135Idx] = true; +        backstracking(row + 1); +        colUsed[col] = diagonals45Used[diagonals45Idx] = diagonals135Used[diagonals135Idx] = false; +        nQueens[row][col] = '.'; +    } +} +``` + +### Backtracking + +回溯是 DFS 的一ç§�,它ä¸�是用在é��历图的节点上,而是用于求解 **排列组å�ˆ** 问题,例如有 { 'a','b','c' } 三个字符,求解所有由这三个字符排列得到的字符串。 + +在程åº�实现时,回溯需è¦�注æ„�对元素进行标记的问题。使用递归实现的回溯,在访问一个新元素进入新的递归调用,此时需è¦�将新元素标记为已ç»�访问,这样æ‰�能在继续递归调用时ä¸�用é‡�å¤�访问该元素;但是在递归返回时,需è¦�将该元素标记为未访问,因为å�ªéœ€è¦�ä¿�è¯�在一个递归链中ä¸�å�Œæ—¶è®¿é—®ä¸€ä¸ªå…ƒç´ ï¼Œè€Œåœ¨ä¸�å�Œçš„递归链是å�¯ä»¥è®¿é—®å·²ç»�访问过但是ä¸�在当å‰�递归链中的元素。 + +**数字键盘组å�ˆ** + +[Leetcode : 17. Letter Combinations of a Phone Number (Medium)](https://leetcode.com/problems/letter-combinations-of-a-phone-number/description/) + +![](index_files/a3f34241-bb80-4879-8ec9-dff2d81b514e.jpg) + +```html +Input:Digit string "23" +Output: ["ad", "ae", "af", "bd", "be", "bf", "cd", "ce", "cf"]. +``` + +```java +private static final String[] KEYS = {"", "", "abc", "def", "ghi", "jkl", "mno", "pqrs", "tuv", "wxyz"}; + +public List letterCombinations(String digits) { +    List ret = new ArrayList<>(); +    if (digits != null && digits.length() != 0) { +        combination("", digits, 0, ret); +    } +    return ret; +} + +private void combination(String prefix, String digits, int offset, List ret) { +    if (offset == digits.length()) { +        ret.add(prefix); +        return; +    } +    String letters = KEYS[digits.charAt(offset) - '0']; +    for (char c : letters.toCharArray()) { +        combination(prefix + c, digits, offset + 1, ret); +    } +} +``` + +**在矩阵中寻找字符串** + +[Leetcode : 79. Word Search (Medium)](https://leetcode.com/problems/word-search/description/) + +```html +For example, +Given board = +[ +  ['A','B','C','E'], +  ['S','F','C','S'], +  ['A','D','E','E'] +] +word = "ABCCED", -> returns true, +word = "SEE", -> returns true, +word = "ABCB", -> returns false. +``` + +```java +private static int[][] shift = {{1, 0}, {-1, 0}, {0, 1}, {0, -1}}; +private static boolean[][] visited; +private int m; +private int n; + +public boolean exist(char[][] board, String word) { +    if (word == null || word.length() == 0) return true; +    if (board == null || board.length == 0 || board[0].length == 0) return false; +    m = board.length; +    n = board[0].length; +    visited = new boolean[m][n]; +    for (int i = 0; i < m; i++) { +        for (int j = 0; j < n; j++) { +            if (dfs(board, word, 0, i, j)) return true; +        } +    } +    return false; +} + +private boolean dfs(char[][] board, String word, int start, int r, int c) { +    if (start == word.length()) { +        return true; +    } +    if (r < 0 || r >= m || c < 0 || c >= n || board[r][c] != word.charAt(start) ||  visited[r][c] ) { +        return false; +    } +    visited[r][c] = true; +    for (int i = 0; i < shift.length; i++) { +        int nextR = r + shift[i][0]; +        int nextC = c + shift[i][1]; +        if (dfs(board, word, start + 1, nextR, nextC)) return true; +    } +    visited[r][c] = false; +    return false; +} +``` + +**IP 地å�€åˆ’分** + +[Leetcode : 93. Restore IP Addresses(Medium)](https://leetcode.com/problems/restore-ip-addresses/description/) + +```html +Given "25525511135", +return ["255.255.11.135", "255.255.111.35"]. +``` + +```java +private List ret; + +public List restoreIpAddresses(String s) { +    ret = new ArrayList<>(); +    doRestore(0, "", s); +    return ret; +} + +private void doRestore(int k, String path, String s) { +    if (k == 4 || s.length() == 0) { +        if (k == 4 && s.length() == 0) { +            ret.add(path); +        } +        return; +    } +    for (int i = 0; i < s.length() && i <= 2; i++) { +        if (i != 0 && s.charAt(0) == '0') break; +        String part = s.substring(0, i + 1); +        if (Integer.valueOf(part) <= 255) { +            doRestore(k + 1, path.length() != 0 ? path + "." + part : part, s.substring(i + 1)); +        } +    } +} +``` + +**排列** + +[Leetcode : 46. Permutations (Medium)](https://leetcode.com/problems/permutations/description/) + +题目æ��述:找出一组数的所有排列。 + +```java +public List> permute(int[] nums) { +    List> ret = new ArrayList<>(); +    List permuteList = new ArrayList<>(); +    boolean[] visited = new boolean[nums.length]; +    backtracking(permuteList, visited, nums, ret); +    return ret; +} + +private void backtracking(List permuteList, boolean[] visited, int[] nums, List> ret){ +    if(permuteList.size() == nums.length){ +        ret.add(new ArrayList(permuteList)); +        return; +    } + +    for(int i = 0; i < visited.length; i++){ +        if(visited[i]) continue; +        visited[i] = true; +        permuteList.add(nums[i]); +        backtracking(permuteList, visited, nums, ret); +        permuteList.remove(permuteList.size() - 1); +        visited[i] = false; +    } +} +``` + +**ä¸�能é‡�å¤�的排列** + +[Leetcode : 47. Permutations II (Medium)](https://leetcode.com/problems/permutations-ii/description/) + +```html +[1,1,2] have the following unique permutations: +[[1,1,2], [1,2,1], [2,1,1]] +``` + +在实现上,和 Permutations ä¸�å�Œçš„æ˜¯è¦�先排åº�,然å�Žåœ¨æ·»åŠ ä¸€ä¸ªå…ƒç´ æ—¶ï¼Œåˆ¤æ–­è¿™ä¸ªå…ƒç´ æ˜¯å�¦ç­‰äºŽå‰�一个元素,如果等于,并且å‰�一个元素还未访问,那么就跳过这个元素。 + +```java +public List> permuteUnique(int[] nums) { +    List> ret = new ArrayList<>(); +    List permuteList = new ArrayList<>(); +    Arrays.sort(nums); +    boolean[] visited = new boolean[nums.length]; +    backtracking(permuteList, visited, nums, ret); +    return ret; +} + +private void backtracking(List permuteList, boolean[] visited, int[] nums, List> ret) { +    if (permuteList.size() == nums.length) { +        ret.add(new ArrayList(permuteList)); +        return; +    } + +    for (int i = 0; i < visited.length; i++) { +        if (i != 0 && nums[i] == nums[i - 1] && !visited[i - 1]) continue; +        if (visited[i]) continue; +        visited[i] = true; +        permuteList.add(nums[i]); +        backtracking(permuteList, visited, nums, ret); +        permuteList.remove(permuteList.size() - 1); +        visited[i] = false; +    } +} +``` + +**组å�ˆ** + +[Leetcode : 77. Combinations (Medium)](https://leetcode.com/problems/combinations/description/) + +题目æ��述:找出从 1 ~ n 中å�–出 k 个元素的所有å�¯èƒ½çš„组å�ˆã€‚ + +```java +public List> combine(int n, int k) { +    List> ret = new ArrayList<>(); +    List combineList = new ArrayList<>(); +    backtracking(1, n, k, combineList, ret); +    return ret; +} + +private void backtracking(int start, int n, int k, List combineList, List> ret){ +    if(k == 0){ +        ret.add(new ArrayList(combineList)); // 这里è¦�é‡�新构造一个 List +        return; +    } +     +    for(int i = start; i <= n - k + 1; i++){ // 剪æž� + +        combineList.add(i);                        // 把 i 标记为已访问 +        backtracking(i + 1, n, k - 1, combineList, ret); +        combineList.remove(combineList.size() - 1); // 把 i 标记为未访问 +    } +} +``` + +**组å�ˆæ±‚å’Œ** + +[Leetcode : 39. Combination Sum (Medium)](https://leetcode.com/problems/combination-sum/description/) + +```html +given candidate set [2, 3, 6, 7] and target 7, +A solution set is: +[[7],[2, 2, 3]] +``` + + +```java + private List> ret; + + public List> combinationSum(int[] candidates, int target) { +     ret = new ArrayList<>(); +     doCombination(candidates, target, 0, new ArrayList<>()); +     return ret; + } + + private void doCombination(int[] candidates, int target, int start, List list) { +     if (target == 0) { +         ret.add(new ArrayList<>(list)); +         return; +     } +     for (int i = start; i < candidates.length; i++) { +         if (candidates[i] <= target) { +             list.add(candidates[i]); +             doCombination(candidates, target - candidates[i], i, list); +             list.remove(list.size() - 1); +         } +     } + } +``` + +**ä¸�能é‡�å¤�的组å�ˆæ±‚å’Œ** + +[Leetcode : 40. Combination Sum II (Medium)](https://leetcode.com/problems/combination-sum-ii/description/) + +```html +For example, given candidate set [10, 1, 2, 7, 6, 1, 5] and target 8,  +A solution set is:  +[ +  [1, 7], +  [1, 2, 5], +  [2, 6], +  [1, 1, 6] +] +``` + +```java +private List> ret; + +public List> combinationSum2(int[] candidates, int target) { +    ret = new ArrayList<>(); +    Arrays.sort(candidates); +    doCombination(candidates, target, 0, new ArrayList<>(), new boolean[candidates.length]); +    return ret; +} + +private void doCombination(int[] candidates, int target, int start, List list, boolean[] visited) { +    if (target == 0) { +        ret.add(new ArrayList<>(list)); +        return; +    } +    for (int i = start; i < candidates.length; i++) { +        if (i != 0 && candidates[i] == candidates[i - 1] && !visited[i - 1]) continue; +        if (candidates[i] <= target) { +            list.add(candidates[i]); +            visited[i] = true; +            doCombination(candidates, target - candidates[i], i + 1, list, visited); +            visited[i] = false; +            list.remove(list.size() - 1); +        } +    } +} +``` + + +**å­�集** + +[Leetcode : 78. Subsets (Medium)](https://leetcode.com/problems/subsets/description/) + +题目æ��述:找出集å�ˆçš„æ‰€æœ‰å­�集,å­�集ä¸�能é‡�å¤�,[1, 2] 和 [2, 1] 这ç§�å­�集算é‡�å¤� + +```java +private List> ret; +private List subsetList; + +public List> subsets(int[] nums) { +    ret = new ArrayList<>(); +    subsetList = new ArrayList<>(); +    for (int i = 0; i <= nums.length; i++) { +        backtracking(0, i, nums); +    } +    return ret; +} + +private void backtracking(int startIdx, int size, int[] nums) { +    if (subsetList.size() == size) { +        ret.add(new ArrayList(subsetList)); +        return; +    } + +    for (int i = startIdx; i < nums.length; i++) { +        subsetList.add(nums[i]); +        backtracking(i + 1, size, nums); // startIdx 设为下一个元素,使 subset 中的元素都递增排åº� +        subsetList.remove(subsetList.size() - 1); +    } +} +``` + +**ä¸�能é‡�å¤�çš„å­�集** + +[Leetcode : 90. Subsets II (Medium)](https://leetcode.com/problems/subsets-ii/description/) + +```html +For example, +If nums = [1,2,2], a solution is: + +[ +  [2], +  [1], +  [1,2,2], +  [2,2], +  [1,2], +  [] +] +``` + +```java +private List> ret; +private List subsetList; +private boolean[] visited; + +public List> subsetsWithDup(int[] nums) { +    ret = new ArrayList<>(); +    subsetList = new ArrayList<>(); +    visited = new boolean[nums.length]; +    Arrays.sort(nums); +    for (int i = 0; i <= nums.length; i++) { +        backtracking(0, i, nums); +    } +    return ret; +} + +private void backtracking(int startIdx, int size, int[] nums) { +    if (subsetList.size() == size) { +        ret.add(new ArrayList(subsetList)); +        return; +    } + +    for (int i = startIdx; i < nums.length; i++) { +        if (i != 0 && nums[i] == nums[i - 1] && !visited[i - 1]) continue; +        subsetList.add(nums[i]); +        visited[i] = true; +        backtracking(i + 1, size, nums); +        visited[i] = false; +        subsetList.remove(subsetList.size() - 1); +    } +} +``` + +**分割字符串使得æ¯�部分都是回文数** + +[Leetcode : 131. Palindrome Partitioning (Medium)](https://leetcode.com/problems/palindrome-partitioning/description/) + +```java +private List> ret; + +public List> partition(String s) { +    ret = new ArrayList<>(); +    doPartion(new ArrayList<>(), s); +    return ret; +} + +private void doPartion(List list, String s) { +    if (s.length() == 0) { +        ret.add(new ArrayList<>(list)); +        return; +    } +    for (int i = 0; i < s.length(); i++) { +        if (isPalindrome(s, 0, i)) { +            list.add(s.substring(0, i + 1)); +            doPartion(list, s.substring(i + 1)); +            list.remove(list.size() - 1); +        } +    } +} + +private boolean isPalindrome(String s, int begin, int end) { +    while (begin < end) { +        if (s.charAt(begin++) != s.charAt(end--)) return false; +    } +    return true; +} +``` + +**数独** + +[Leetcode : 37. Sudoku Solver (Hard)](https://leetcode.com/problems/sudoku-solver/description/) + +![](index_files/1ca52246-c443-48ae-b1f8-1cafc09ec75c.png) + +```java +private boolean[][] rowsUsed = new boolean[9][10]; +private boolean[][] colsUsed = new boolean[9][10]; +private boolean[][] cubesUsed = new boolean[9][10]; +private char[][] board; + +public void solveSudoku(char[][] board) { +    this.board = board; +    for (int i = 0; i < 9; i++) { +        for (int j = 0; j < 9; j++) { +            if (board[i][j] == '.') continue; +            int num = board[i][j] - '0'; +            rowsUsed[i][num] = true; +            colsUsed[j][num] = true; +            cubesUsed[cubeNum(i, j)][num] = true; +        } +    } +    for (int i = 0; i < 9; i++) { +        for (int j = 0; j < 9; j++) { +            backtracking(i, j); +        } +    } +} + +private boolean backtracking(int row, int col) { +    while (row < 9 && board[row][col] != '.') { +        row = col == 8 ? row + 1 : row; +        col = col == 8 ? 0 : col + 1; +    } +    if (row == 9) { +        return true; +    } +    for (int num = 1; num <= 9; num++) { +        if (rowsUsed[row][num] || colsUsed[col][num] || cubesUsed[cubeNum(row, col)][num]) continue; +        rowsUsed[row][num] = colsUsed[col][num] = cubesUsed[cubeNum(row, col)][num] = true; +        board[row][col] = (char) (num + '0'); +        if (backtracking(row, col)) return true; +        board[row][col] = '.'; +        rowsUsed[row][num] = colsUsed[col][num] = cubesUsed[cubeNum(row, col)][num] = false; +    } +    return false; +} + +private int cubeNum(int i, int j) { +    int r = i / 3; +    int c = j / 3; +    return r * 3 + c; +} +``` + +## 分治 + +**给表达å¼�加括å�·** + +[Leetcode : 241. Different Ways to Add Parentheses (Medium)](https://leetcode.com/problems/different-ways-to-add-parentheses/description/) + +```html +Input: "2-1-1". + +((2-1)-1) = 0 +(2-(1-1)) = 2 + +Output : [0, 2] +``` + +```java +public List diffWaysToCompute(String input) { +    int n = input.length(); +    List ret = new ArrayList<>(); +    for (int i = 0; i < n; i++) { +        char c = input.charAt(i); +        if (c == '+' || c == '-' || c == '*') { +            List left = diffWaysToCompute(input.substring(0, i)); +            List right = diffWaysToCompute(input.substring(i + 1)); +            for (int l : left) { +                for (int r : right) { +                    switch (c) { +                        case '+': ret.add(l + r); break; +                        case '-': ret.add(l - r); break; +                        case '*': ret.add(l * r); break; +                    } +                } +            } +        } +    } +    if (ret.size() == 0) ret.add(Integer.valueOf(input)); +    return ret; +} +``` + +## 递归 + +将原始问题分解æˆ�较å°�的问题æ�¥æ±‚解。 + +## 动æ€�规划 + +将原问题拆解æˆ�多个å­�问题,在求解å­�问题的时候ä¿�å­˜å­�问题的解,使得å­�问题å�ªæ±‚解一次。 + +### 分割整数 + +**分割整数的最大乘积** + +[Leetcode : 343. Integer Break (Medim)](https://leetcode.com/problems/integer-break/description/) + +题目æ��述:For example, given n = 2, return 1 (2 = 1 + 1); given n = 10, return 36 (10 = 3 + 3 + 4). + +```java +public int integerBreak(int n) { +    int[] dp = new int[n + 1]; +    dp[1] = 1; +    for(int i = 2; i <= n; i++) { +        for(int j = 1; j <= i - 1; j++) { +            dp[i] = Math.max(dp[i], Math.max(j * dp[i - j], j * (i - j))); +        } +    } +    return dp[n]; +} +``` + +**按平方数æ�¥åˆ†å‰²æ•´æ•°** + +[Leetcode : 279. Perfect Squares(Medium)](https://leetcode.com/problems/perfect-squares/description/) + +题目æ��述:For example, given n = 12, return 3 because 12 = 4 + 4 + 4; given n = 13, return 2 because 13 = 4 + 9. + +```java +public int numSquares(int n) { +    List squares = new ArrayList<>(); // 存储å°�于 n 的平方数 +    int diff = 3; +    while(square <= n) { +        squares.add(square); +        square += diff; +        diff += 2; +    } +    int[] dp = new int[n + 1]; +    for(int i = 1; i <= n; i++) { +        int max = Integer.MAX_VALUE; +        for(int s : squares) { +            if(s > i) break; +            max = Math.min(max, dp[i - s] + 1); +        } +        dp[i] = max; +    } +    return dp[n]; +} +``` + +**分割整数构æˆ�å­—æ¯�字符串** + +[Leetcode : 91. Decode Ways (Medium)](https://leetcode.com/problems/decode-ways/description/) + +题目æ��述:Given encoded message "12", it could be decoded as "AB" (1 2) or "L" (12). + +```java +public int numDecodings(String s) { +    if(s == null || s.length() == 0) return 0; +    int n = s.length(); +    int[] dp = new int[n + 1]; +    dp[0] = 1; +    dp[1] = s.charAt(0) == '0' ? 0 : 1; +    for(int i = 2; i <= n; i++) { +        int one = Integer.valueOf(s.substring(i - 1, i)); +        if(one != 0) dp[i] += dp[i - 1]; +        if(s.charAt(i - 2) == '0') continue; +        int two = Integer.valueOf(s.substring(i - 2, i)); +        if(two <= 26) dp[i] += dp[i - 2]; +    } +    return dp[n]; +} +``` + +### 矩阵路径 + +**矩阵的总路径数** + +[Leetcode : 62. Unique Paths (Medium)](https://leetcode.com/problems/unique-paths/description/) + +题目æ��述:统计从矩阵左上角到å�³ä¸‹è§’的路径总数,æ¯�次å�ªèƒ½å�‘左和å�‘下移动。 + +```java +public int uniquePaths(int m, int n) { +    int[] dp = new int[n]; +    for (int i = 0; i < m; i++) { +        for (int j = 0; j < n; j++) { +            if(i == 0) dp[j] = 1; +            else if(j != 0) dp[j] = dp[j] + dp[j - 1]; +        } +    } +    return dp[n - 1]; +} +``` + +**矩阵的最å°�路径和** + +[Leetcode : 64. Minimum Path Sum (Medium)](https://leetcode.com/problems/minimum-path-sum/description/) + +题目æ��述:求从矩阵的左上角到å�³ä¸‹è§’的最å°�路径和,æ¯�次å�ªèƒ½å�‘左和å�‘下移动。 + +```java +public int minPathSum(int[][] grid) { +    if(grid.length == 0 || grid[0].length == 0) return 0; +    int m = grid.length, n = grid[0].length; +    int[] dp = new int[n]; +    for(int i = 0; i < m; i++) { +        for(int j = 0; j < n; j++) { +            if(j == 0) dp[0] = dp[0] + grid[i][0]; +            else if(i == 0) dp[j] = dp[j - 1] + grid[0][j]; +            else dp[j] = Math.min(dp[j - 1], dp[j]) + grid[i][j]; +        } +    } +    return dp[n - 1]; +} +``` + +### æ–�波那契数列 + +程åº�员代ç �é�¢è¯•指å�—第 4 章的方法将求æ–�波那契第 N 项问题转æ�¢ä¸ºçŸ©é˜µä¹˜æ³•è¿�算,从而将时间å¤�æ�‚度缩å°�为 O(lgN)。 + +**爬楼梯** + +[Leetcode : 70. Climbing Stairs (Easy)](https://leetcode.com/problems/climbing-stairs/description/) + +题目æ��述:有 N 阶楼梯,æ¯�次å�¯ä»¥ä¸Šä¸€é˜¶æˆ–者两阶,求有多少ç§�上楼梯的方法。 + +定义一个数组 dp 存储上楼梯的方法数(为了方便讨论,数组下标从 1 开始),dp[i] 表示走到第 i 个楼梯的方法数目。第 i 个楼梯å�¯ä»¥ä»Žç¬¬Â i-1 和 i-2 个楼梯å†�走一步到达,走到第 i 个楼梯的方法数为走到第 i-1 和第 i-2 个楼梯的方法数之和。 + +
dp[i] = dp[i-1] + dp[i-2]
+ +dp[N] �为所求。 + +考虑到 dp[i] �与 dp[i - 1] 和 dp[i - 2] 有关,因此�以�用两个���存储 dp[i - 1] 和 dp[i - 2] ��,使得原�的 O(n) 空间��度优化为 O(1) ��度。 + +```java +public int climbStairs(int n) { +    if(n == 1) return 1; +    if(n == 2) return 2; +    // �一个楼梯��一个楼梯 +    int pre1 = 2, pre2 = 1; +    for(int i = 2; i < n; i++){ +        int cur = pre1 + pre2; +        pre2 = pre1; +        pre1 = cur; +    } +    return pre1; +} +``` + +**�牛生产** + +[程�员代��试指�-P181](#) + +题目�述:�设农场中�熟的�牛�年都会生 1 头��牛,并且永远�会死。第一年有 1 ���牛,从第二年开始,�牛开始生��牛。����牛 3 年之��熟��以生��牛。给定整数 N,求 N 年�牛的数�。 + +第 i 年�熟的牛的数�为: + +
dp[i] = dp[i-1] + dp[i-3]
+ +**强盗抢劫** + +[Leetcode : 198. House Robber (Easy)](https://leetcode.com/problems/house-robber/description/) + +题目�述:抢劫一排�户,但是�能抢邻近的�户,求最大抢劫�。 + +定义 dp 数组用�存储最大的抢劫�,其中 dp[i] 表示抢到第 i 个�户时的最大抢劫�。由于�能抢劫邻近�户,因此如果抢劫了第 i 个�户那么�能抢劫 i - 2 和 i - 3 的�户,所以 + +$$ dp[i] = max(dp[i - 2], dp[i - 3]) + nums[i] $$ + +O(n) 空间��度实现方法: + +```java +public int rob(int[] nums) { +    int n = nums.length; +    if(n == 0) return 0; +    if(n == 1) return nums[0]; +    if(n == 2) return Math.max(nums[0], nums[1]); +    int[] dp = new int[n]; +    dp[0] = nums[0]; +    dp[1] = nums[1]; +    dp[2] = nums[0] + nums[2]; +    for(int i = 3; i < n; i++){ +        dp[i] = Math.max(dp[i -2], dp[i - 3]) + nums[i]; +    } +    return Math.max(dp[n - 1], dp[n - 2]); +} +``` + +O(1) 空间��度实现方法: + +```java +public int rob(int[] nums) { +    int n = nums.length; +    if(n == 0) return 0; +    if(n == 1) return nums[0]; +    if(n == 2) return Math.max(nums[0], nums[1]); +    int pre3 = nums[0], pre2 = nums[1], pre1 = nums[2] + nums[0]; +    for(int i = 3; i < n; i++){ +        int cur = Math.max(pre2, pre3) + nums[i]; +        pre3 = pre2; +        pre2 = pre1; +        pre1 = cur; +    } +    return Math.max(pre1, pre2); +} +``` + +**强盗在环形街区抢劫** + +[Leetcode : 213. House Robber II (Medium)](https://leetcode.com/problems/house-robber-ii/description/) + +```java +public int rob(int[] nums) { +    if(nums == null || nums.length == 0) return 0; +    int n = nums.length; +    if(n == 1) return nums[0]; +    return Math.max(rob(nums, 0, n - 2), rob(nums, 1, n - 1)); +} + +private int rob(int[] nums, int s, int e) { +    int n = nums.length; +    if(e - s == 0) return nums[s]; +    if(e - s == 1) return Math.max(nums[s], nums[s + 1]); +    int[] dp = new int[n]; +    dp[s] = nums[s]; +    dp[s + 1] = nums[s + 1]; +    dp[s + 2] = nums[s] + nums[s + 2]; +    for (int i = s + 3; i <= e; i++) { +        dp[i] = Math.max(dp[i - 2], dp[i - 3]) + nums[i]; +    } +    return Math.max(dp[e], dp[e - 1]); +} +``` + + +**信件错排** + +题目�述:有 N 个 信 和 信�,它们被打乱,求错误装信的方�数�。 + +定义一个数组 dp 存储错误方�数�,dp[i] 表示� i 个信和信�的错误方�数�。�设第 i 个信装到第 j 个信�里�,而第 j 个信装到第 k 个信�里�。根� i 和 k 是�相等,有两�情况: + +① i==k,交� i 和 k 的信�,它们的信和信�在正确的�置,但是其余 i-2 �信有 dp[i-2] �错误装信的方�。由于 j 有 i-1 ��值,因此共有 (i-1)\*dp[i-2] �错误装信方�。 + +② i != k,交� i 和 j 的信�,第 i 个信和信�在正确的�置,其余 i-1 �信有 dp[i-1] �错误装信方�。由于 j 有 i-1 ��值,因此共有 (n-1)\*dp[i-1] �错误装信方�。 + +综上所述,错误装信数�方�数�为: + +
 dp[i] = (i-1) \* dp[i-2] + (i-1) \* dp[i-1] 
+ +dp[N] å�³ä¸ºæ‰€æ±‚。 + +和上楼梯问题一样,dp[i] å�ªä¸ŽÂ dp[i-1] 和 dp[i-2] 有关,因此也å�¯ä»¥å�ªç”¨ä¸¤ä¸ªå�˜é‡�æ�¥å­˜å‚¨Â dp[i-1] 和 dp[i-2]。 + +### 最长递增å­�åº�列 + +已知一个åº�列 {S1, S2,...,Sn} ,å�–出若干数组æˆ�æ–°çš„åº�列 {Si1, Si2,..., Sim},其中 i1ã€�i2 ... im ä¿�æŒ�递增,å�³æ–°åº�列中å�„个数ä»�ç„¶ä¿�æŒ�原数列中的先å�Žé¡ºåº�,称新åº�列为原åº�列的一个**å­�åº�列**。 + +如果在å­�åº�列中,当下标 ix > iy 时,Six > Siy,称å­�åº�列为原åº�列的一个**递增å­�åº�列**。 + +定义一个数组 dp 存储最长递增å­�åº�列的长度,dp[n] 表示以 Sn 结尾的åº�列的最长递增å­�åº�列长度。对于一个递增å­�åº�列 {Si1, Si2,...,Sim},如果 im < n 并且 Sim < Sn ,此时 {Si1, Si2,..., Sim, Sn} 为一个递增å­�åº�列,递增å­�åº�列的长度增加 1。满足上述æ�¡ä»¶çš„递增å­�åº�列中,长度最长的那个递增å­�åº�列就是è¦�找的,在长度最长的递增å­�åº�列上加上 Sn 就构æˆ�了以 Sn 为结尾的最长递增å­�åº�列。因此 dp[n] = max{ dp[i]+1 | Si < Sn && i < n} 。 + +因为在求 dp[n] 时å�¯èƒ½æ— æ³•找到一个满足æ�¡ä»¶çš„递增å­�åº�列,此时 {Sn} 就构æˆ�了递增å­�åº�列,因此需è¦�对å‰�é�¢çš„æ±‚解方程å�šä¿®æ”¹ï¼Œä»¤Â dp[n] 最å°�为 1,å�³ï¼š + +$$ dp[n] = max\{ 1, dp[i]+1 | S_i < S_n \&\& i < n \} $$ + +对于一个长度为 N 的åº�列,最长å­�åº�列并ä¸�一定会以 SN 为结尾,因此 dp[N] ä¸�是åº�列的最长递增å­�åº�列的长度,需è¦�é��历 dp 数组找出最大值æ‰�是所è¦�的结果,å�³Â max{ dp[i] | 1 <= i <= N} å�³ä¸ºæ‰€æ±‚。 + +**最长递增å­�åº�列** + +[Leetcode : 300. Longest Increasing Subsequence (Medium)](https://leetcode.com/problems/longest-increasing-subsequence/description/) + +```java +public int lengthOfLIS(int[] nums) { +    int n = nums.length; +    int[] dp = new int[n]; +    for(int i = 0; i < n; i++){ +        int max = 1; +        for(int j = 0; j < i; j++){ +            if(nums[i] > nums[j]) max = Math.max(max, dp[j] + 1); +        } +        dp[i] = max; +    } +    int ret = 0; +    for(int i = 0; i < n; i++){ +        ret = Math.max(ret, dp[i]); +    } +    return ret; +} +``` + +以上解法的时间å¤�æ�‚度为 O(n2) ,å�¯ä»¥ä½¿ç”¨äºŒåˆ†æŸ¥æ‰¾ä½¿å¾—æ—¶é—´å¤�æ�‚度é™�低为 O(nlogn)。定义一个 tails 数组,其中 tails[i] 存储长度为 i + 1 的最长递增å­�åº�列的最å�Žä¸€ä¸ªå…ƒç´ ï¼Œä¾‹å¦‚对于数组 [4,5,6,3],有 + +```html +len = 1  :      [4], [5], [6], [3]  => tails[0] = 3 +len = 2  :      [4, 5], [5, 6]      => tails[1] = 5 +len = 3  :      [4, 5, 6]            => tails[2] = 6 +``` + +对于一个元素 x,如果它大于 tails 数组所有的值,那么把它添加到 tails å�Žé�¢ï¼›å¦‚果 tails[i-1] < x <= tails[i],那么更新 tails[i] = x 。 + +å�¯ä»¥çœ‹å‡ºÂ tails 数组ä¿�æŒ�有åº�,因此在查找 Si ä½�于 tails 数组的ä½�置时就å�¯ä»¥ä½¿ç”¨äºŒåˆ†æŸ¥æ‰¾ã€‚ + +```java +public int lengthOfLIS(int[] nums) { +    int n = nums.length; +    int[] tails = new int[n]; +    int size = 0; +    for(int i = 0; i < n; i++){ +        int idx = binarySearch(tails, 0, size, nums[i]); +        tails[idx] = nums[i]; +        if(idx == size) size++; +    } +    return size; +} + +private int binarySearch(int[] nums, int sIdx, int eIdx, int key){ +    while(sIdx < eIdx){ +        int mIdx = sIdx + (eIdx - sIdx) / 2; +        if(nums[mIdx] == key) return mIdx; +        else if(nums[mIdx] > key) eIdx = mIdx; +        else sIdx = mIdx + 1; +    } +    return sIdx; +} +``` + +**最长摆动å­�åº�列** + +[Leetcode : 376. Wiggle Subsequence (Medium)](https://leetcode.com/problems/wiggle-subsequence/description/) + +è¦�求:使用 O(n) 时间å¤�æ�‚度求解。 + +使用两个状æ€� up 和 down。 + +```java +public int wiggleMaxLength(int[] nums) { +    int len = nums.length; +    if (len == 0) return 0; +    int up = 1, down = 1; +    for (int i = 1; i < len; i++) { +        if (nums[i] > nums[i - 1]) up = down + 1; +        else if (nums[i] < nums[i - 1]) down = up + 1; +    } +    return Math.max(up, down); +} +``` + +### 最长公共å­�系列 + +对于两个å­�åº�列 S1 和 S2,找出它们最长的公共å­�åº�列。 + +定义一个二维数组 dp 用æ�¥å­˜å‚¨æœ€é•¿å…¬å…±å­�åº�列的长度,其中 dp[i][j] 表示 S1 的å‰� i 个字符与 S2 的å‰� j 个字符最长公共å­�åº�列的长度。考虑 S1i 与 S2j 值是å�¦ç›¸ç­‰ï¼Œåˆ†ä¸ºä¸¤ç§�情况: + +① 当 S1i==S2j 时,那么就能在 S1 的å‰� i-1 个字符与 S2 的å‰� j-1 个字符最长公共å­�åº�列的基础上å†�加上 S1i 这个值,最长公共å­�åº�列长度加 1 ,å�³Â dp[i][j] = dp[i-1][j-1] + 1。 + +② 当 S1i != S2j 时,此时最长公共å­�åº�列为 S1 的å‰� i-1 个字符和 S2 的å‰� j 个字符最长公共å­�åº�列,与 S1 的å‰� i 个字符和 S2 的å‰� j-1 个字符最长公共å­�åº�列,它们的最大者,å�³Â dp[i][j] = max{ dp[i-1][j], dp[i][j-1] }。 + +综上,最长公共å­�系列的状æ€�转移方程为: + +$$ +dp[i][j]=\left\{ +\begin{array}{rcl} +dp[i-1][j-1]  &&  { S1_i==S2_j }\\ +max(dp[i-1][j], dp[i][j-1])  &&{ S1_i <> S2_j } +\end{array} \right. +$$ + +对于长度为 N 的åº�列 S1 和 长度为 M 的åº�列 S2,dp[N][M] 就是åº�列 S1 和åº�列 S2 的最长公共å­�åº�列长度。 + +与最长递增å­�åº�列相比,最长公共å­�åº�列有以下ä¸�å�Œç‚¹ï¼š + +① 针对的是两个åº�列,求它们的最长公共å­�åº�列。 +② 在最长递增å­�åº�列中,dp[i] 表示以 Si 为结尾的最长递增å­�åº�列长度,å­�åº�列必须包å�«Â Si ;在最长公共å­�åº�列中,dp[i][j] 表示 S1 中å‰� i 个字符与 S2 中å‰� j 个字符的最长公共å­�åº�列长度,ä¸�一定包å�«Â S1i 和 S2j 。 +③ 由于 2 ,在求最终解时,最长公共å­�åº�列中 dp[N][M] 就是最终解,而最长递增å­�åº�列中 dp[N] ä¸�是最终解,因为以 SN 为结尾的最长递增å­�åº�列ä¸�一定是整个åº�列最长递增å­�åº�列,需è¦�é��历一é�� dp 数组找到最大者。 + +```java +public int lengthOfLCS(int[] nums1, int[] nums2) { +    int n1 = nums1.length, n2 = nums2.length; +    int[][] dp = new int[n1 + 1][n2 + 1]; +    for (int i = 1; i <= n1; i++) { +        for (int j = 1; j <= n2; j++) { +            if (nums1[i - 1] == nums2[j - 1]) dp[i][j] = dp[i - 1][j - 1] + 1; +            else dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]); +        } +    } +    return dp[n1][n2]; +} +``` + +### 0-1 背包 + +有一个容é‡�为 N 的背包,è¦�用这个背包装下物å“�的价值最大,这些物å“�有两个属性:体积 w 和价值 v。 + +定义一个二维数组 dp 存储最大价值,其中 dp[i][j] 表示体积ä¸�超过 j 的情况下,å‰� i 件物å“�能达到的最大价值。设第 i 件物å“�体积为 w,价值为 v,根æ�®ç¬¬Â i 件物å“�是å�¦æ·»åŠ åˆ°èƒŒåŒ…ä¸­ï¼Œå�¯ä»¥åˆ†ä¸¤ç§�情况讨论: + +① 第 i 件物å“�没添加到背包,总体积ä¸�超过 j 的å‰� i 件物å“�的最大价值就是总体积ä¸�超过 j 的å‰� i-1 件物å“�的最大价值,dp[i][j] = dp[i-1][j]。 +② 第 i 件物å“�添加到背包中,dp[i][j] = dp[i-1][j-w] + v。 + +第 i 件物å“�å�¯æ·»åŠ ä¹Ÿå�¯ä»¥ä¸�添加,å�–决于哪ç§�情况下最大价值更大。 + +综上,0-1 背包的状æ€�转移方程为: + +$$ dp[i][j] = max ( dp[i-1][j], dp[i-1][j-w] + v ) $$ + +```java +public int knapsack(int W, int N, int[] weights, int[] values) { +    int[][] dp = new int[N][W]; +    for (int i = W - 1; i >= 0; i--) { +        dp[0][i] = i > weights[0] ? values[0] : 0; +    } +    for (int i = 1; i < N; i++) { +        for (int j = W - 1; j >= weights[i]; j--) { +            dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weights[i]] + values[i]); +        } +        for (int j = weights[i - 1] - 1; j >= 0; j--) { +            dp[i][j] = dp[i - 1][j]; +        } +    } +    return dp[N - 1][W - 1]; +} +``` + +**空间优化** + +在程åº�实现时å�¯ä»¥å¯¹Â 0-1 背包å�šä¼˜åŒ–。观察状æ€�转移方程å�¯ä»¥çŸ¥é�“,å‰� i 件物å“�的状æ€�ä»…ç”±å‰� i-1 件物å“�的状æ€�有关,因此å�¯ä»¥å°†Â dp 定义为一维数组,其中 dp[j] 既å�¯ä»¥è¡¨ç¤ºÂ dp[i-1][j] 也å�¯ä»¥è¡¨ç¤ºÂ dp[i][j]。此时, + +$$ dp[j] = max ( dp[j], dp[j-w] + v ) $$ + +因为 dp[j-w] 表示 dp[i-1][j-w],因此ä¸�能先求 dp[i][j-w] 防止将 dp[i-1][j-w] 覆盖。也就是说è¦�先计算 dp[i][j] å†�计算 dp[i][j-w],在程åº�实现时需è¦�按倒åº�æ�¥å¾ªçŽ¯æ±‚è§£ã€‚ + + +**无法使用贪心算法的解释** + +0-1 背包问题无法使用贪心算法æ�¥æ±‚解,也就是说ä¸�能按照先添加性价比最高的物å“�æ�¥è¾¾åˆ°æœ€ä¼˜ï¼Œè¿™æ˜¯å› ä¸ºè¿™ç§�æ–¹å¼�å�¯èƒ½é€ æˆ�背包空间的浪费,从而无法达到最优。考虑下é�¢çš„物å“�和一个容é‡�为 5 的背包,如果先添加物å“� 0 å†�添加物å“� 1,那么å�ªèƒ½å­˜æ”¾çš„价值为 16,浪费了大å°�为 2 的空间。最优的方å¼�是存放物å“� 1 和物å“� 2,价值为 22. + +| id | w | v | v/w | +| --- | --- | --- | --- | +| 0 | 1 | 6 | 6 | +| 1 | 2 | 10 | 5 | +| 2 | 3 | 12 | 4 | + +**å�˜ç§�** + +完全背包:物å“�å�¯ä»¥æ— é™�个,å�¯ä»¥è½¬æ�¢ä¸ºÂ 0-1 背包,令æ¯�ç§�物å“�的体积和价值å�˜ä¸ºÂ 1/2/4... å€�数,把它们都当æˆ�一个新物å“�,然å�Žä¸€ç§�物å“�å�ªèƒ½æ·»åŠ ä¸€æ¬¡ã€‚ + +多é‡�背包:物å“�æ•°é‡�有é™�制,å�Œæ ·å�¯ä»¥è½¬æ�¢ä¸ºÂ 0-1 背包。 + +多维费用背包:物å“�ä¸�仅有é‡�é‡�,还有体积,å�Œæ—¶è€ƒè™‘这两ç§�é™�制。 + +其它:物å“�之间相互约æ�Ÿæˆ–者ä¾�赖。 + +**划分数组为和相等的两部分** + +[Leetcode : 416. Partition Equal Subset Sum (Medium)](https://leetcode.com/problems/partition-equal-subset-sum/description/) + +å�¯ä»¥çœ‹æˆ�一个背包大å°�为 sum/2 的 0-1 背包问题,但是也有ä¸�å�Œçš„地方,这里没有价值属性,并且背包必须被填满。 + +以下实现使用了空间优化。 + +```java +public boolean canPartition(int[] nums) { +    int sum = 0; +    for (int num : nums) { +        sum += num; +    } +    if (sum % 2 != 0) { +        return false; +    } +    int W = sum / 2; +    boolean[] dp = new boolean[W + 1]; +    int n = nums.length; +    for(int i = 0; i <= W; i++) { +        if(nums[0] == i) dp[i] = true; +    } +    for(int i = 1; i < n; i++) { +        for(int j = W; j >= nums[i]; j--) { +            dp[j] = dp[j] || dp[j - nums[i]]; +        } +    } + +    return dp[W]; +} +``` + +**字符串按å�•è¯�列表分割** + +[Leetcode : 139. Word Break (Medium)](https://leetcode.com/problems/word-break/description/) + +```html +s = "leetcode", +dict = ["leet", "code"]. +Return true because "leetcode" can be segmented as "leet code". +``` + +```java +public boolean wordBreak(String s, List wordDict) { +    int n = s.length(); +    boolean[] dp = new boolean[n + 1]; +    dp[0] = true; +    for (int i = 1; i <= n; i++) { +        for (String word : wordDict) { +            if (word.length() <= i +                    && word.equals(s.substring(i - word.length(), i))) { +                dp[i] = dp[i] || dp[i - word.length()]; +            } +        } +    } +    return dp[n]; +} +``` + +**改å�˜ä¸€ç»„数的正负å�·ä½¿å¾—它们的和为一给定数** + +[Leetcode : 494. Target Sum (Medium)](https://leetcode.com/problems/target-sum/description/) + +```html +Input: nums is [1, 1, 1, 1, 1], S is 3.  +Output: 5 +Explanation:  + +-1+1+1+1+1 = 3 ++1-1+1+1+1 = 3 ++1+1-1+1+1 = 3 ++1+1+1-1+1 = 3 ++1+1+1+1-1 = 3 + +There are 5 ways to assign symbols to make the sum of nums be target 3. +``` + +该问题å�¯ä»¥è½¬æ�¢ä¸ºÂ subset sum 问题,从而使用 0-1 背包的方法æ�¥æ±‚解。å�¯ä»¥å°†è¿™ç»„数看æˆ�两部分,P 和 N,其中 P 使用正å�·ï¼ŒN 使用负å�·ï¼Œæœ‰ä»¥ä¸‹æŽ¨å¯¼ï¼š + +```html +                  sum(P) - sum(N) = target +sum(P) + sum(N) + sum(P) - sum(N) = target + sum(P) + sum(N) +                       2 * sum(P) = target + sum(nums) +``` + +å› æ­¤å�ªè¦�找到一个å­�集,令它们都å�–æ­£å�·ï¼Œå¹¶ä¸”和等于 (target + sum(nums))/2,就è¯�明存在解。 + +```java +public int findTargetSumWays(int[] nums, int S) { +    int sum = 0; +    for (int num : nums) { +        sum += num; +    } +    if (sum < S || (sum + S) % 2 == 1) { +        return 0; +    } +    return subsetSum(nums, (sum + S) >>> 1); +} + +private int subsetSum(int[] nums, int targetSum) { +    Arrays.sort(nums); +    int[] dp = new int[targetSum + 1]; +    dp[0] = 1; +    for (int i = 0; i < nums.length; i++) { +        int num = nums[i]; +        for (int j = targetSum; j >= num; j--) { +            dp[j] = dp[j] + dp[j - num]; +        } +    } +    return dp[targetSum]; +} +``` + +**01字符构æˆ�最多的字符串** + +[Leetcode : 474. Ones and Zeroes (Medium)](https://leetcode.com/problems/ones-and-zeroes/description/) + +```html +Input: Array = {"10", "0001", "111001", "1", "0"}, m = 5, n = 3 +Output: 4 + +Explanation: This are totally 4 strings can be formed by the using of 5 0s and 3 1s, which are “10,â€�0001â€�,â€�1â€�,â€�0â€� +``` + +这是一个多维费用的 0-1 背包问题,有两个背包大å°�,0 的数é‡�和 1 的数é‡�。 + +```java +public int findMaxForm(String[] strs, int m, int n) { +    if (strs == null || strs.length == 0) return 0; +    int l = strs.length; +    int[][] dp = new int[m + 1][n + 1]; +    for (int i = 0; i < l; i++) { +        String s = strs[i]; +        int ones = 0, zeros = 0; +        for (char c : s.toCharArray()) { +            if (c == '0') zeros++; +            else if (c == '1') ones++; +        } +        for (int j = m; j >= zeros; j--) { +            for (int k = n; k >= ones; k--) { +                if (zeros <= j && ones <= k) { +                    dp[j][k] = Math.max(dp[j][k], dp[j - zeros][k - ones] + 1); +                } +            } +        } +    } +    return dp[m][n]; +} +``` + +**找零钱** + +[Leetcode : 322. Coin Change (Medium)](https://leetcode.com/problems/coin-change/description/) + +题目æ��述:给一些é�¢é¢�的硬å¸�,è¦�求用这些硬å¸�æ�¥ç»„æˆ�给定é�¢é¢�的钱数,并且使得硬å¸�æ•°é‡�最少。硬å¸�å�¯ä»¥é‡�å¤�使用。 + +这是一个完全背包问题,完全背包问题和 0-1背包问题在实现上唯一的ä¸�å�Œæ˜¯ï¼Œç¬¬äºŒå±‚循环是从 0 开始的,而ä¸�是从尾部开始。 + +```java +public int coinChange(int[] coins, int amount) { +    int[] dp = new int[amount + 1]; +    Arrays.fill(dp, amount + 1); +    dp[0] = 0; +    for (int i = 1; i <= amount; i++) { +        for (int j = 0; j < coins.length; j++) { +            if (coins[j] <= i) { +                dp[i] = Math.min(dp[i], dp[i - coins[j]] + 1); +            } +        } +    } +    return dp[amount] > amount ? -1 : dp[amount]; +} +``` + +**组å�ˆæ€»å’Œ** + +[Leetcode : 377. Combination Sum IV (Medium)](https://leetcode.com/problems/combination-sum-iv/description/) + +```html +nums = [1, 2, 3] +target = 4 + +The possible combination ways are: +(1, 1, 1, 1) +(1, 1, 2) +(1, 2, 1) +(1, 3) +(2, 1, 1) +(2, 2) +(3, 1) + +Note that different sequences are counted as different combinations. + +Therefore the output is 7. +``` + +```java +public int combinationSum4(int[] nums, int target) { +    int[] dp = new int[target + 1]; +    dp[0] = 1; +    for (int i = 1; i <= target; i++) { +        for (int j = 0; j < nums.length; j++) { +            if(nums[j] <= i) { +                dp[i] += dp[i - nums[j]]; +            } +        } +    } +    return dp[target]; +} +``` + +**å�ªèƒ½è¿›è¡Œä¸¤æ¬¡çš„股票交易** + +[Leetcode : 123. Best Time to Buy and Sell Stock III (Hard)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iii/description/) + +```java +public int maxProfit(int[] prices) { +    int firstBuy = Integer.MIN_VALUE, firstSell = 0; +    int secondBuy = Integer.MIN_VALUE, secondSell = 0; +    for (int curPrice : prices) { +        if (firstBuy < -curPrice) firstBuy = -curPrice; +        if (firstSell < firstBuy + curPrice) firstSell = firstBuy + curPrice; +        if (secondBuy < firstSell - curPrice) secondBuy = firstSell - curPrice; +        if (secondSell < secondBuy + curPrice) secondSell = secondBuy + curPrice; +    } +    return secondSell; +} +``` + +**å�ªèƒ½è¿›è¡ŒÂ k 次的股票交易** + +[Leetcode : 188. Best Time to Buy and Sell Stock IV (Hard)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-iv/description/) + +```html +dp[i, j] = max(dp[i, j-1], prices[j] - prices[jj] + dp[i-1, jj]) { jj in range of [0, j-1] } = max(dp[i, j-1], prices[j] + max(dp[i-1, jj] - prices[jj])) +``` + +```java +public int maxProfit(int k, int[] prices) { +    int n = prices.length; +    if (k >= n/2) { +        int maxPro = 0; +        for (int i = 1; i < n; i++) { +            if (prices[i] > prices[i-1]) +                maxPro += prices[i] - prices[i-1]; +        } +        return maxPro; +    } +    int[][] dp = new int[k + 1][n]; +    for (int i = 1; i <= k; i++) { +        int localMax = dp[i - 1][0] - prices[0]; +        for (int j = 1; j < n; j++) { +            dp[i][j] = Math.max(dp[i][j - 1], prices[j] + localMax); +            localMax = Math.max(localMax, dp[i - 1][j] - prices[j]); +        } +    } +    return dp[k][n - 1]; +} +``` + +### 数组区间 + +**数组区间和** + +[Leetcode : 303. Range Sum Query - Immutable (Easy)](https://leetcode.com/problems/range-sum-query-immutable/description/) + +求区间 i ~ j 的和,å�¯ä»¥è½¬æ�¢ä¸ºÂ sum[j] - sum[i-1],其中 sum[i] 为 0 ~ j 的和。 + +```java +class NumArray { +     +    int[] nums; +     +    public NumArray(int[] nums) { +        for(int i = 1; i < nums.length; i++) +            nums[i] += nums[i - 1]; +        this.nums = nums; +    } +     +    public int sumRange(int i, int j) { +        return i == 0 ? nums[j] : nums[j] - nums[i - 1]; +    } +} +``` + +**å­�数组最大的和** + +[Leetcode : 53. Maximum Subarray (Easy)](https://leetcode.com/problems/maximum-subarray/description/) + +令 sum[i] 为以 num[i] 为结尾的å­�数组最大的和,å�¯ä»¥ç”±Â sum[i-1] 得到 sum[i] 的值,如果 sum[i-1] å°�于 0,那么以 num[i] 为结尾的å­�数组ä¸�能包å�«å‰�é�¢çš„内容,因为加上å‰�é�¢çš„部分,那么和一定会比 num[i] 还å°�。 + +```java +public int maxSubArray(int[] nums) { +    int n = nums.length; +    int[] sum = new int[n]; +    sum[0] = nums[0]; +    int max = sum[0]; +    for(int i = 1; i < n; i++){ +        sum[i] = (sum[i-1] > 0 ? sum[i-1] : 0) + nums[i]; +        max = Math.max(max, sum[i]); +    } +    return max; +} +``` + +**数组中等差递增å­�区间的个数** + +[Leetcode : 413. Arithmetic Slices (Medium)](https://leetcode.com/problems/arithmetic-slices/description/) + +```html +A = [1, 2, 3, 4] + +return: 3, for 3 arithmetic slices in A: [1, 2, 3], [2, 3, 4] and [1, 2, 3, 4] itself. +``` + +对于 (1,2,3,4),它有三ç§�组æˆ�递增å­�区间的方å¼�,而对于 (1,2,3,4,5),它组æˆ�递增å­�区间的方å¼�除了 (1,2,3,4) 的三ç§�外还多了一ç§�,å�³Â (1,2,3,4,5),因此 dp[i] = dp[i - 1] + 1。 + +```java +public int numberOfArithmeticSlices(int[] A) { +    int n = A.length; +    int[] dp = new int[n]; +    for(int i = 2; i < n; i++) { +        if(A[i] - A[i - 1] == A[i - 1] - A[i - 2]) { +            dp[i] = dp[i - 1] + 1; +        } +    } +    int ret = 0; +    for(int cnt : dp) { +        ret += cnt; +    } +    return ret; +} +``` + +### 字符串编辑 + +**删除两个字符串的字符使它们相等** + +[Leetcode : 583. Delete Operation for Two Strings (Medium)](https://leetcode.com/problems/delete-operation-for-two-strings/description/) + +å�¯ä»¥è½¬æ�¢ä¸ºæ±‚两个字符串的最长公共å­�åº�列问题。 + +```java +public int minDistance(String word1, String word2) { +    int m = word1.length(), n = word2.length(); +    int[][] dp = new int[m + 1][n + 1]; +    for (int i = 0; i <= m; i++) { +        for (int j = 0; j <= n; j++) { +            if (i == 0 || j == 0) continue; +            dp[i][j] = word1.charAt(i - 1) == word2.charAt(j - 1) ? dp[i - 1][j - 1] + 1 +                    : Math.max(dp[i][j - 1], dp[i - 1][j]); +        } +    } +    return m + n - 2 * dp[m][n]; +} +``` + + +**修改一个字符串称为å�¦ä¸€ä¸ªå­—符串** // TODO + +[Leetcode : 72. Edit Distance (Hard)](https://leetcode.com/problems/edit-distance/description/) + +**修改一个字符串使它æˆ�为回文字符串**// TODO + +[程åº�员代ç �é�¢è¯•指å�—-字符串](#) + +### 其它问题 + +**需è¦�冷å�´æœŸçš„股票交易** + +[Leetcode : 309. Best Time to Buy and Sell Stock with Cooldown(Medium)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/) + +题目æ��述:交易之å�Žéœ€è¦�有一天的冷å�´æ—¶é—´ã€‚ + +![](index_files/ac9b31ec-cef1-4880-a875-fc4571ca10e1.png) + +```html +s0[i] = max(s0[i - 1], s2[i - 1]); // Stay at s0, or rest from s2 +s1[i] = max(s1[i - 1], s0[i - 1] - prices[i]); // Stay at s1, or buy from s0 +s2[i] = s1[i - 1] + prices[i]; // Only one way from s1 +``` + + +```java +public int maxProfit(int[] prices) { +    if (prices == null || prices.length == 0) return 0; +    int n = prices.length; +    int[] s0 = new int[n]; +    int[] s1 = new int[n]; +    int[] s2 = new int[n]; +    s0[0] = 0; +    s1[0] = -prices[0]; +    s2[0] = Integer.MIN_VALUE; +    for (int i = 1; i < n; i++) { +        s0[i] = Math.max(s0[i - 1], s2[i - 1]); +        s1[i] = Math.max(s1[i - 1], s0[i - 1] - prices[i]); +        s2[i] = Math.max(s2[i - 1], s1[i - 1] + prices[i]); +    } +    return Math.max(s0[n - 1], s2[n - 1]); +} +``` + + +**统计从 0 ~ n æ¯�个数的二进制表示中 1 的个数** + +[Leetcode : 338. Counting Bits (Medium)](https://leetcode.com/problems/counting-bits/description/) + +对于数字 6(110),它å�¯ä»¥çœ‹æˆ�是数字 2(10) å‰�é�¢åŠ ä¸Šä¸€ä¸ªÂ 1 ,因此 dp[i] = dp[i&(i-1)] + 1; + +```java +    public int[] countBits(int num) { +        int[] ret = new int[num + 1]; +        for(int i = 1; i <= num; i++){ +            ret[i] = ret[i&(i-1)] + 1; +        } +        return ret; +    } +``` + +**一组整数对能够构æˆ�的最长链** + +[Leetcode : 646. Maximum Length of Pair Chain (Medium)](https://leetcode.com/problems/maximum-length-of-pair-chain/description/) + +对于 (a, b) 和 (c, d) ,如果 b < c,则它们å�¯ä»¥æž„æˆ�一æ�¡é“¾ã€‚ + +```java +public int findLongestChain(int[][] pairs) { +    if(pairs == null || pairs.length == 0) { +        return 0; +    } +    Arrays.sort(pairs, (a, b) -> (a[0] - b[0])); +    int n = pairs.length; +    int[] dp = new int[n]; +    Arrays.fill(dp, 1); +    for(int i = 0; i < n; i++) { +        for(int j = 0; j < i; j++) { +            if(pairs[i][0] > pairs[j][1]){ +                dp[i] = Math.max(dp[i], dp[j] + 1); +            } +        } +    } +     +    int ret = 0; +    for(int num : dp) { +        ret = Math.max(ret, num); +    } +    return ret; +} +``` + +**买入和售出股票最大的收益** + +[Leetcode : 121. Best Time to Buy and Sell Stock (Easy)](https://leetcode.com/problems/best-time-to-buy-and-sell-stock/description/) + +å�ªè¿›è¡Œä¸€æ¬¡äº¤æ˜“。 + +å�ªè¦�记录å‰�é�¢çš„æœ€å°�价格,将这个最å°�价格作为买入价格,然å�Žå°†å½“å‰�的价格作为售出价格,查看这个价格是å�¦æ˜¯å½“å‰�的最大价格。 + +```java +public int maxProfit(int[] prices) { +    int n = prices.length; +    if(n == 0) return 0; +    int soFarMin = prices[0]; +    int max = 0; +    for(int i = 1; i < n; i++){ +        if(soFarMin > prices[i]) soFarMin = prices[i]; +        else max = Math.max(max, prices[i] - soFarMin); +    } +    return max; +} +``` + +**å¤�制粘贴字符** + +[Leetcode : 650. 2 Keys Keyboard (Medium)](https://leetcode.com/problems/2-keys-keyboard/description/) + +```java +public int minSteps(int n) { +    int[] dp = new int[n + 1]; +    for (int i = 2; i <= n; i++) { +        dp[i] = i; +        for (int j = i - 1; j >= 0; j--) { +            if (i % j == 0) { +                dp[i] = dp[j] + dp[i / j]; +                break; +            } +        } +    } +    return dp[n]; +} +``` + +```java +public int minSteps(int n) { +    if (n == 1) return 0; +    for (int i = 2; i <= Math.sqrt(n); i++) { +        if (n % i == 0) return i + minSteps(n / i); +    } +    return n; +} +``` + +## 数学 + +### 素数 + +**素数分解** + +æ¯�一个数都å�¯ä»¥åˆ†è§£æˆ�素数的乘积,例如 84 = 22 \* 31 \* 50 \* 71 \* 110 \* 130 \* 170 \* … + +**整除** + +令 x = 2m0 \* 3m1 \* 5m2 \* 7m3 \* 11m4 \* … +令 y = 2n0 \* 3n1 \* 5n2 \* 7n3 \* 11n4 \* … + +如果 x 整除 y(y mod x == 0),则对于所有 i,mi <= ni。 + +x 和 y 的 **最大公约数** 为:gcd(x,y) =  2min(m0,n0) \* 3min(m1,n1) \* 5min(m2,n2) \* ... + +x 和 y 的 **最å°�å…¬å€�æ•°** 为:lcm(x,y) =  2max(m0,n0) \* 3max(m1,n1) \* 5max(m2,n2) \* ... + +**生æˆ�ç´ æ•°åº�列** + +[Leetcode : 204. Count Primes (Easy)](https://leetcode.com/problems/count-primes/description/) + +埃拉托斯特尼筛法在æ¯�次找到一个素数时,将能被素数整除的数排除掉。 + +```java +public int countPrimes(int n) { +    boolean[] notPrimes = new boolean[n + 1]; +    int cnt = 0; +    for(int i = 2; i < n; i++){ +        if(notPrimes[i]) continue; +        cnt++; +        // 从 i * i 开始,因为如果 k < i,那么 k * i 在之å‰�就已ç»�被去除过了 +        for(long j = (long) i * i; j < n; j += i){ +            notPrimes[(int) j] = true; +        } +    } +    return cnt; +} +``` + +### 最大公约数 + +```java +int gcd(int a, int b) { +    if (b == 0) return a; +    return gcd(b, a % b); +} +``` + +最大公å€�数为两数的乘积除以最大公约数。 + +```java +int lcm(int a, int b){ +    return a * b / gcd(a, b); +} +``` + +对于最大公约数问题,因为需è¦�计算 a % b ,而这个æ“�作是比较耗时的,å�¯ä»¥ä½¿ç”¨Â [ 编程之美:2.7]() 的方法,利用å‡�法和移ä½�æ“�作æ�¥æ›¿æ�¢å®ƒã€‚ + +对于 a 和 b 的最大公约数 f(a, b),有: + +1\. 如果 a 和 b å�‡ä¸ºå�¶æ•°ï¼Œf(a, b) = 2\*f(a/2, b/2); +2\. 如果 a 是å�¶æ•°Â b 是奇数,f(a, b) = f(a/2, b); +3\. 如果 b 是å�¶æ•°Â a 是奇数,f(a, b) = f(a, b/2); +4\. 如果 a 和 b å�‡ä¸ºå¥‡æ•°ï¼Œf(a, b) = f(a, a-b); + +乘 2 和除 2 都å�¯ä»¥è½¬æ�¢ä¸ºç§»ä½�æ“�作。 + +### 进制转æ�¢ + +Java 中 static String toString(int num, int radix) å�¯ä»¥å°†ä¸€ä¸ªæ•´æ•°è£…æ�¢ä¸ºÂ redix 进制表示的字符串。 + +**7 进制** + +[Leetcode : 504. Base 7 (Easy)](https://leetcode.com/problems/base-7/description/) + +```java +public String convertToBase7(int num) { +    if (num < 0) { +        return '-' + convertToBase7(-num); +    } +    if (num < 7) { +        return num + ""; +    } +    return convertToBase7(num / 7) + num % 7; +} +``` + +**16 进制** + +[Leetcode : 405. Convert a Number to Hexadecimal (Easy)](https://leetcode.com/problems/convert-a-number-to-hexadecimal/description/) + +```java +public String toHex(int num) { +    char[] map = {'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'}; +    if(num == 0) return "0"; +    String ret = ""; +    while(num != 0){ +        ret = map[(num & 0b1111)] + ret; +        num >>>= 4; +    } +    return ret; +} +``` + +### 阶乘 + +**统计阶乘尾部有多少个 0** + +[Leetcode : 172. Factorial Trailing Zeroes (Easy)](https://leetcode.com/problems/factorial-trailing-zeroes/description/) + +尾部的 0 由 2 * 5 得æ�¥ï¼Œ2 的数é‡�明显多于 5 的数é‡�,因此å�ªè¦�统计有多少个 5 å�³å�¯ã€‚ + +对于一个数 N,它所包å�«Â 5 的个数为:N/5 + N/52 + N/53 + ...,其中 N/5 表示ä¸�大于 N 的数中 5 的å€�数贡献一个 5,N/52 表示ä¸�大于 N 的数中 52 的å€�æ•°å†�贡献一个 5 ...。 + +```java +public int trailingZeroes(int n) { +    return n == 0 ? 0 : n / 5 + trailingZeroes(n / 5); +} +``` + +如果统计的是 N! 的二进制表示中最低ä½� 1 的ä½�置,å�ªè¦�统计有多少个 2 å�³å�¯ï¼Œè¯¥é¢˜ç›®å‡ºè‡ªÂ [ 编程之美:2.2](#) 。和求解有多少个 5 一样,2 的个数为 N/2 + N/22 + N/23 + ... + +### 字符串加法å‡�法 + +**二进制加法** + +[Leetcode : 67. Add Binary (Easy)](https://leetcode.com/problems/add-binary/description/) + +```java +public String addBinary(String a, String b) { +    int i = a.length() - 1, j = b.length() - 1, carry = 0; +    String str = ""; +    while(i >= 0 || j >= 0){ +        if(i >= 0 && a.charAt(i--) == '1') carry++; +        if(j >= 0 && b.charAt(j--) == '1') carry++; +        str = (carry % 2) + str; +        carry /= 2; +    } +    if(carry == 1) str = "1" + str; +    return str; +} +``` + +**字符串加法** + +[Leetcode : 415. Add Strings (Easy)](https://leetcode.com/problems/add-strings/description/) + +题目æ��述:字符串的值为é�žè´Ÿæ•´æ•° + +```java +public String addStrings(String num1, String num2) { +    StringBuilder sb = new StringBuilder(); +    int carry = 0; +    for(int i = num1.length() - 1, j = num2.length() - 1; i >= 0 || j >= 0 || carry == 1; i--, j--){ +        int x = i < 0 ? 0 : num1.charAt(i) - '0'; +        int y = j < 0 ? 0 : num2.charAt(j) - '0'; +        sb.append((x + y + carry) % 10); +        carry = (x + y + carry) / 10; +    } +    return sb.reverse().toString(); +} +``` + +### 相é�‡é—®é¢˜ + +**改å�˜æ•°ç»„元素使所有的数组元素都相等** + +[Leetcode : 462. Minimum Moves to Equal Array Elements II (Medium)](https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/description/) + +题目æ��述:æ¯�次å�¯ä»¥å¯¹ä¸€ä¸ªæ•°ç»„元素加一或者å‡�一,求最å°�的改å�˜æ¬¡æ•°ã€‚ + +这是个典型的相é�‡é—®é¢˜ï¼Œç§»åЍè·�离最å°�的方å¼�是所有元素都移动到中ä½�数。ç�†ç”±å¦‚下: + +设 m 为中ä½�数。a 和 b 是 m 两边的两个元素,且 b > a。è¦�使 a 和 b 相等,它们总共移动的次数为 b - a,这个值等于 (b - m) + (m - a),也就是把这两个数移动到中ä½�数的移动次数。 + +设数组长度为 N,则å�¯ä»¥æ‰¾åˆ°Â N/2 对 a 和 b 的组å�ˆï¼Œä½¿å®ƒä»¬éƒ½ç§»åŠ¨åˆ°Â m 的ä½�置。 + +**解法 1** + +先排åº�,时间å¤�æ�‚度:O(NlgN) + +```java +public int minMoves2(int[] nums) { +    Arrays.sort(nums); +    int ret = 0; +    int l = 0, h = nums.length - 1; +    while(l <= h) { +        ret += nums[h] - nums[l]; +        l++; +        h--; +    } +    return ret; +} +``` + +**解法 2** + +使用快速排åº�找到中ä½�数,时间å¤�æ�‚度 O(N) + +```java +public int minMoves2(int[] nums) { +    int ret = 0; +    int n = nums.length; +    int median = quickSelect(nums, 0, n - 1, n / 2 + 1); +    for(int num : nums) ret += Math.abs(num - median); +    return ret; +} + +private int quickSelect(int[] nums, int start, int end, int k) { +    int l = start, r = end, privot = nums[(l + r) / 2]; +    while(l <= r) { +        while(nums[l] < privot) l++; +        while(nums[r] > privot) r--; +        if(l >= r) break; +        swap(nums, l, r); +        l++; r--; +    } +    int left = l - start + 1; +    if(left > k) return quickSelect(nums, start, l - 1, k); +    if(left == k && l == r) return nums[l]; +    int right = r - start + 1; +    return quickSelect(nums, r + 1, end, k - right); +} + +private void swap(int[] nums, int i, int j) { +    int tmp = nums[i]; nums[i] = nums[j]; nums[j] = tmp; +} +``` + +### 多数投票问题 + +**数组中出现次数多于 n / 2 的元素** + +[Leetcode : 169. Majority Element (Easy)](https://leetcode.com/problems/majority-element/description/) + +先对数组排åº�,最中间那个数出现次数一定多于 n / 2 + +```java +public int majorityElement(int[] nums) { +    Arrays.sort(nums); +    return nums[nums.length / 2]; +} +``` + +å�¯ä»¥åˆ©ç”¨Â Boyer-Moore Majority Vote Algorithm æ�¥è§£å†³è¿™ä¸ªé—®é¢˜ï¼Œä½¿å¾—æ—¶é—´å¤�æ�‚度为 O(n)。å�¯ä»¥è¿™ä¹ˆç�†è§£è¯¥ç®—法:使用 cnt æ�¥ç»Ÿè®¡ä¸€ä¸ªå…ƒç´ å‡ºçŽ°çš„æ¬¡æ•°ï¼Œå½“é��历到的元素和统计元素ä¸�想等时,令 cnt--。如果å‰�é�¢æŸ¥æ‰¾äº†Â i 个元素,且 cnt == 0 ,说明å‰� i 个元素没有 majority,或者有 majority,但是出现的次数少于 i / 2 ,因为如果多于 i / 2 的è¯� cnt 就一定ä¸�会为 0 。此时剩下的 n - i 个元素中,majority 的数目多于 (n - i) / 2,因此继续查找就能找出 majority。 + +```java +public int majorityElement(int[] nums) { +    int cnt = 0, majority = 0; +    for(int i = 0; i < nums.length; i++){ +        if(cnt == 0) { +            majority = nums[i]; +            cnt++; +        } +        else if(majority == nums[i]) cnt++; +        else cnt--; +    } +    return majority; +} +``` + +**数组中出现次数多于 n / k 的元素** + +[程åº�员代ç �é�¢è¯•指å�— P343](#) + +选 k - 1 个候选 + +### 其它 + +**平方数** + +[Leetcode : 367. Valid Perfect Square (Easy)](https://leetcode.com/problems/valid-perfect-square/description/) + +平方åº�列:1,4,9,16,.. +间隔:3,5,7,... + +间隔为等差数列,使用这个特性å�¯ä»¥å¾—到从 1 开始的平方åº�列。 + +```java +public boolean isPerfectSquare(int num) { +    int subNum = 1; +    while (num > 0) { +        num -= subNum; +        subNum += 2; +    } +    return num == 0; +} +``` + +**3 的 n 次方** + +[Leetcode : 326. Power of Three (Easy)](https://leetcode.com/problems/power-of-three/description/) + +```java +public boolean isPowerOfThree(int n) { +    return n > 0 && (1162261467 % n == 0); +} +``` + +**找出数组中的乘积最大的三个数** + +[Leetcode : 628. Maximum Product of Three Numbers (Easy)](https://leetcode.com/problems/maximum-product-of-three-numbers/description/) + +```java +public int maximumProduct(int[] nums) { +    int max1 = Integer.MIN_VALUE, max2 = Integer.MIN_VALUE, max3 = Integer.MIN_VALUE, min1 = Integer.MAX_VALUE, min2 = Integer.MAX_VALUE; +    for (int n : nums) { +        if (n > max1) { +            max3 = max2; +            max2 = max1; +            max1 = n; +        } else if (n > max2) { +            max3 = max2; +            max2 = n; +        } else if (n > max3) { +            max3 = n; +        } + +        if (n < min1) { +            min2 = min1; +            min1 = n; +        } else if (n < min2) { +            min2 = n; +        } +    } +    return Math.max(max1*max2*max3, max1*min1*min2); +} +``` + +**乘积数组** + +[Leetcode : 238. Product of Array Except Self (Medium)](https://leetcode.com/problems/product-of-array-except-self/description/) + +题目æ��述:给定一个数组,创建一个新数组,新数组的æ¯�个元素为原始数组中除了该ä½�置上的元素之外所有元素的乘积。 + +题目è¦�求:时间å¤�æ�‚度为 O(n),并且ä¸�能使用除法。 + +```java +public int[] productExceptSelf(int[] nums) { +    int n = nums.length; +    int[] ret = new int[n]; +    ret[0] = 1; +    for(int i = 1; i < n; i++) { +        ret[i] = ret[i - 1] * nums[i - 1]; +    } +    int right = 1; +    for(int i = n - 1; i >= 0; i--) { +        ret[i] *= right; +        right *= nums[i]; +    } +    return ret; +} +``` + +# 数æ�®ç»“构相关 + +## 栈和队列 + +**用栈实现队列** + +一个栈实现: + +```java +class  MyQueue { +    private Stack st = new Stack(); + +    public void push(int x) { +        Stack temp = new Stack(); +        while(!st.isEmpty()){ +            temp.push(st.pop()); +        } +        st.push(x); +        while(!temp.isEmpty()){ +            st.push(temp.pop()); +        } +    } + +    public int pop() { +        return st.pop(); +    } + +    public int peek() { +        return st.peek(); +    } + +    public boolean empty() { +        return st.isEmpty(); +    } +} +``` + +两个栈实现: + +```java +class  MyQueue { +    private Stack in = new Stack(); +    private Stack out = new Stack(); +   +    public void push(int x) { +        in.push(x); +    } + +    public int pop() { +        in2out(); +        return out.pop(); +    } + +    public int peek() { +        in2out(); +        return out.peek(); +    } +     +    private void in2out(){ +        if(out.isEmpty()){ +            while(!in.isEmpty()){ +                out.push(in.pop()); +            } +        } +    } + +    public boolean empty() { +        return in.isEmpty() && out.isEmpty(); +    } +} +``` + +**用队列实现栈** + +[Leetcode : 225. Implement Stack using Queues (Easy)](https://leetcode.com/problems/implement-stack-using-queues/description/) + +```java +class MyStack { +     +    private Queue queue; + +    public MyStack() { +        queue = new LinkedList<>(); +    } +     +    public void push(int x) { +        queue.add(x); +        for(int i = 1; i < queue.size(); i++){ // 翻转 +            queue.add(queue.remove()); +        } +    } +     +    public int pop() { +        return queue.remove(); +    } +     +    public int top() { +        return queue.peek(); +    } +     +    public boolean empty() { +        return queue.isEmpty(); +    } +} +``` + +**最å°�值栈** + +[Leetcode : 155. Min Stack (Easy)](https://leetcode.com/problems/min-stack/description/) + +用两个栈实现,一个存储数æ�®ï¼Œä¸€ä¸ªå­˜å‚¨æœ€å°�值。 + +```java +class MinStack { +     +    private Stack dataStack; +    private Stack minStack; +    private int min; + +    public MinStack() { +        dataStack = new Stack<>(); +        minStack = new Stack<>(); +        min = Integer.MAX_VALUE; +    } +     +    public void push(int x) { +        dataStack.add(x); +        if(x < min) { +            min = x; +        } +        minStack.add(min); +    } +     +    public void pop() { +        dataStack.pop(); +        minStack.pop(); +        if(!minStack.isEmpty()) { +            min = minStack.peek(); +        } else{ +            min = Integer.MAX_VALUE; +        } +    } +     +    public int top() { +        return dataStack.peek(); +    } +     +    public int getMin() { +        return min; +    } +} +``` + +对于实现最å°�值队列问题,å�¯ä»¥å…ˆå°†é˜Ÿåˆ—使用栈æ�¥å®žçŽ°ï¼Œç„¶å�Žå°±å°†é—®é¢˜è½¬æ�¢ä¸ºæœ€å°�值栈,这个问题出现在 编程之美:3.7。 + +**用栈实现括å�·åŒ¹é…�** + +[Leetcode : 20. Valid Parentheses (Easy)](https://leetcode.com/problems/valid-parentheses/description/) + +```html +"()[]{}" + +Output : true +``` + +```java +public boolean isValid(String s) { +    Stack stack = new Stack<>(); +    for(int i = 0; i < s.length(); i++){ +        char c = s.charAt(i); +        if(c == '(' || c == '{' || c == '[') stack.push(c); +        else{ +            if(stack.isEmpty()) return false; +            char cStack = stack.pop(); +            if(c == ')' && cStack != '(' || +              c == ']' && cStack != '[' || +              c == '}' && cStack != '{' ) { +                return false; +            } +        } +    } +    return stack.isEmpty(); +} +``` + +**数组中比当å‰�元素大的下一个数组元素的è·�离** + +```html +Input: [73, 74, 75, 71, 69, 72, 76, 73] +Output: [1, 1, 4, 2, 1, 1, 0, 0] +``` + +[Leetcode : 739. Daily Temperatures (Medium)](https://leetcode.com/problems/daily-temperatures/description/) + +使用栈æ�¥å­˜å‚¨è¿˜æœªè®¡ç®—的元素。å�¯ä»¥ä¿�è¯�从栈顶å�‘下元素递增,å�¦åˆ™ä¸Šé�¢æœ‰ä¸€ä¸ªæ¯”下é�¢æŸ�个元素大的元素进入栈中,下é�¢é‚£ä¸ªå…ƒç´ å·²ç»�找到比它大的元素,因此会出栈。 + +```java +public int[] dailyTemperatures(int[] temperatures) { +    int n = temperatures.length; +    int[] ret = new int[n]; +    Stack stack = new Stack<>(); +    for(int i = 0; i < n; i++) { +        while(!stack.isEmpty() && temperatures[i] > temperatures[stack.peek()]) { +            int idx = stack.pop(); +            ret[idx] = i - idx; +        } +        stack.add(i); +    } +    return ret; +} +``` + +**数组中下一个比当å‰�数大的数** + +[Leetcode : 496. Next Greater Element I (Easy)](https://leetcode.com/problems/next-greater-element-i/description/) + +```html +Input: nums1 = [4,1,2], nums2 = [1,3,4,2]. +Output: [-1,3,-1] +``` + +在é��历数组时用 Stack 把数组中的数存起æ�¥ï¼Œå¦‚果当å‰�é��历的数比栈顶元素æ�¥çš„大,说明栈顶元素的下一个比它大的数就是当å‰�元素。 + +```java +public int[] nextGreaterElement(int[] nums1, int[] nums2) { +    Map map = new HashMap<>(); +    Stack stack = new Stack<>(); +    for(int num : nums2){ +        while(!stack.isEmpty() && num > stack.peek()){ +            map.put(stack.pop(), num); +        } +        stack.add(num); +    } +    int[] ret = new int[nums1.length]; +    for(int i = 0; i < nums1.length; i++){ +        if(map.containsKey(nums1[i])) ret[i] = map.get(nums1[i]); +        else ret[i] = -1; +    } +    return ret; +} +``` + +**循环数组中下一个比当å‰�元素大的数** + +[Leetcode : 503. Next Greater Element II (Medium)](https://leetcode.com/problems/next-greater-element-ii/description/) + +```java +public int[] nextGreaterElements(int[] nums) { +    int n = nums.length, next[] = new int[n]; +    Arrays.fill(next, -1); +    Stack stack = new Stack<>(); +    for (int i = 0; i < n * 2; i++) { +        int num = nums[i % n]; +        while (!stack.isEmpty() && nums[stack.peek()] < num) +            next[stack.pop()] = num; +        if (i < n) stack.push(i); +    } +    return next; +} +``` + + +## 哈希表 + +利用 Hash Table å�¯ä»¥å¿«é€ŸæŸ¥æ‰¾ä¸€ä¸ªå…ƒç´ æ˜¯å�¦å­˜åœ¨ç­‰é—®é¢˜ï¼Œä½†æ˜¯éœ€è¦�一定的空间æ�¥å­˜å‚¨ã€‚在优先考虑时间å¤�æ�‚度的情况下,å�¯ä»¥åˆ©ç”¨Â Hash Table 这ç§�空间æ�¢å�–æ—¶é—´çš„å�šæ³•ã€‚ + +Java 中的 **HashSet** 用于存储一个集å�ˆï¼Œå¹¶ä»¥Â O(1) 的时间å¤�æ�‚度查找元素是å�¦åœ¨é›†å�ˆä¸­ã€‚ + +如果元素有穷,并且范围ä¸�大,那么å�¯ä»¥ç”¨ä¸€ä¸ªå¸ƒå°”数组æ�¥å­˜å‚¨ä¸€ä¸ªå…ƒç´ æ˜¯å�¦å­˜åœ¨ï¼Œä¾‹å¦‚对于å�ªæœ‰å°�写字符的元素,就å�¯ä»¥ç”¨ä¸€ä¸ªé•¿åº¦ä¸ºÂ 26 的布尔数组æ�¥å­˜å‚¨ä¸€ä¸ªå­—符集å�ˆï¼Œä½¿å¾—空间å¤�æ�‚度é™�低为 O(1)。 + +Java 中的 **HashMap** 主è¦�用于映射关系,从而把两个元素è�”系起æ�¥ã€‚ + +在对一个内容进行压缩或者其它转æ�¢æ—¶ï¼Œåˆ©ç”¨Â HashMap å�¯ä»¥æŠŠåŽŸå§‹å†…å®¹å’Œè½¬æ�¢å�Žçš„内容è�”系起æ�¥ã€‚例如在一个简化 url 的系统中([Leetcdoe : 535. Encode and Decode TinyURL (Medium)](https://leetcode.com/problems/encode-and-decode-tinyurl/description/)),利用 HashMap 就å�¯ä»¥å­˜å‚¨ç²¾ç®€å�Žçš„ url 到原始 url 的映射,使得ä¸�ä»…å�¯ä»¥æ˜¾ç¤ºç®€åŒ–的 url,也å�¯ä»¥æ ¹æ�®ç®€åŒ–的 url 得到原始 url 从而定ä½�到正确的资æº�。 + +HashMap 也å�¯ä»¥ç”¨æ�¥å¯¹å…ƒç´ è¿›è¡Œè®¡æ•°ç»Ÿè®¡ï¼Œæ­¤æ—¶é”®ä¸ºå…ƒç´ ï¼Œå€¼ä¸ºè®¡æ•°ã€‚和 HashSet 类似,如果元素有穷并且范围ä¸�大,å�¯ä»¥ç”¨æ•´åž‹æ•°ç»„æ�¥è¿›è¡Œç»Ÿè®¡ã€‚ + + +**数组中的两个数和为给定值** + +[Leetcode : 1. Two Sum (Easy)](https://leetcode.com/problems/two-sum/description/) + +å�¯ä»¥å…ˆå¯¹æ•°ç»„进行排åº�,然å�Žä½¿ç”¨å�ŒæŒ‡é’ˆæ–¹æ³•或者二分查找方法。这样å�šçš„æ—¶é—´å¤�æ�‚度为 O(nlgn),空间å¤�æ�‚度为 O(1)。 + +用 HashMap 存储数组元素和索引的映射,在访问到 nums[i] 时,判断 HashMap 中是å�¦å­˜åœ¨Â target - nums[i] ,如果存在说明 target - nums[i] 所在的索引和 i 就是è¦�找的两个数。该方法的时间å¤�æ�‚度为 O(n),空间å¤�æ�‚度为 O(n),使用空间æ�¥æ�¢å�–时间。 + +```java +public int[] twoSum(int[] nums, int target) { +    HashMap map = new HashMap<>(); +    for(int i = 0; i < nums.length; i++){ +        if(map.containsKey(target - nums[i])) return new int[]{map.get(target - nums[i]), i}; +        else map.put(nums[i], i); +    } +    return null; +} +``` + +**最长和è°�åº�列** + +å’Œè°�åº�列中最大数和最å°�æ•°å�ªå·®æ­£å¥½ä¸ºÂ 1 + +[Leetcode : 594. Longest Harmonious Subsequence (Easy)](https://leetcode.com/problems/longest-harmonious-subsequence/description/) + +```java +public int findLHS(int[] nums) { +    Map map = new HashMap<>(); +    for (long num : nums) { +        map.put(num, map.getOrDefault(num, 0) + 1); +    } +    int result = 0; +    for (long key : map.keySet()) { +        if (map.containsKey(key + 1)) { +            result = Math.max(result, map.get(key + 1) + map.get(key)); +        } +    } +    return result; +} +``` + +## 字符串 + +**两个字符串的包å�«çš„字符是å�¦å®Œå…¨ç›¸å�Œ** + +[Leetcode : 242. Valid Anagram (Easy)](https://leetcode.com/problems/valid-anagram/description/) + +字符串å�ªåŒ…å�«å°�写字符,总共有 26 个å°�写字符。å�¯ä»¥ç”¨Â Hash Table æ�¥æ˜ å°„字符与出现次数,因为键值范围很å°�,因此å�¯ä»¥ç”¨æ•°ç»„æ�¥è¿›è¡Œæ˜ å°„。 + +使用长度为 26 的整型数组对字符串出现的字符进行统计,比较两个字符串出现的字符数é‡�是å�¦ç›¸å�Œã€‚ + +```java +public boolean isAnagram(String s, String t) { +    int[] cnts = new int[26]; +    for(int i  = 0; i < s.length(); i++) cnts[s.charAt(i) - 'a'] ++; +    for(int i  = 0; i < t.length(); i++) cnts[t.charAt(i) - 'a'] --; +    for(int i  = 0; i < 26; i++) if(cnts[i] != 0) return false; +    return true; +} +``` + +**字符串å�Œæž„** + +[Leetcode : 205. Isomorphic Strings (Easy)](https://leetcode.com/problems/isomorphic-strings/description/) + +例如 "egg" 和 "add" 就属于å�Œæž„字符串。 + +记录一个字符上次出现的ä½�置,如果两个字符串中æŸ�个字符上次出现的ä½�置一样,那么就属于å�Œæž„。 + +```java +public boolean isIsomorphic(String s, String t) { +    int[] m1 = new int[256]; +    int[] m2 = new int[256]; +    for(int i = 0; i < s.length(); i++){ +        if(m1[s.charAt(i)] != m2[t.charAt(i)]) { +            return false; +        } +        m1[s.charAt(i)] = i + 1; +        m2[t.charAt(i)] = i + 1; +    } +    return true; +} +``` + +**计算一组字符集å�ˆå�¯ä»¥ç»„æˆ�的回文字符串的最大长度** + +[Leetcode : 409. Longest Palindrome](https://leetcode.com/problems/longest-palindrome/description/) + +使用长度为 128 的整型数组æ�¥ç»Ÿè®¡æ¯�个字符出现的个数,æ¯�个字符有å�¶æ•°ä¸ªå�¯ä»¥ç”¨æ�¥æž„æˆ�回文字符串。因为回文字符串最中间的那个字符å�¯ä»¥å�•独出现,所以如果有å�•独的字符就把它放到最中间。 + +```java +public int longestPalindrome(String s) { +    int[] cnts = new int[128]; // ascii ç �总共 128 个 +    for(char c : s.toCharArray()) cnts[c]++; +    int ret = 0; +    for(int cnt : cnts)  ret += (cnt / 2) * 2; +    if(ret < s.length()) ret ++; // 这个æ�¡ä»¶ä¸‹Â s 中一定有å�•个未使用的字符存在,å�¯ä»¥æŠŠè¿™ä¸ªå­—符放到回文的最中间 +    return ret; +} +``` + +**判断一个整数是å�¦æ˜¯å›žæ–‡æ•°** + +[Leetcode : 9. Palindrome Number (Easy)](https://leetcode.com/problems/palindrome-number/description/) + +è¦�求ä¸�能使用é¢�外空间,也就ä¸�能将整数转æ�¢ä¸ºå­—符串进行判断。 + +将整数分æˆ�å·¦å�³ä¸¤éƒ¨åˆ†ï¼Œå�³è¾¹é‚£éƒ¨åˆ†éœ€è¦�转置,然å�Žåˆ¤æ–­è¿™ä¸¤éƒ¨åˆ†æ˜¯å�¦ç›¸ç­‰ã€‚ + +```java +public boolean isPalindrome(int x) { +    if(x == 0) return true; +    if(x < 0) return false; +    if(x % 10 == 0) return false; +    int right = 0; +    while(x > right){ +        right = right * 10 + x % 10; +        x /= 10; +    } +    return x == right || x == right / 10; +} +``` + +**回文å­�字符串** + +[Leetcode : 647. Palindromic Substrings (Medium)](https://leetcode.com/problems/palindromic-substrings/description/) + +解决方案是从字符串的æŸ�一ä½�开始,å°�试ç�€åŽ»æ‰©å±•å­�字符串。 + +```java +private int cnt = 0; +public int countSubstrings(String s) { +    for(int i = 0; i < s.length(); i++) { +        extendSubstrings(s, i, i);    // 奇数长度 +        extendSubstrings(s, i, i + 1); // å�¶æ•°é•¿åº¦ +    } +    return cnt; +} + +private void extendSubstrings(String s, int start, int end) { +    while(start >= 0 && end < s.length() && s.charAt(start) == s.charAt(end)) { +        start--; +        end++; +        cnt++; +    } +} +``` + +**统计二进制字符串中连续 1 和 连续 0 数é‡�相å�Œçš„å­�字符串个数** + +```html +Input: "00110011" +Output: 6 +Explanation: There are 6 substrings that have equal number of consecutive 1's and 0's: "0011", "01", "1100", "10", "0011", and "01". +``` + +[Leetcode : 696. Count Binary Substrings (Easy)](https://leetcode.com/problems/count-binary-substrings/description/) + +```java +public int countBinarySubstrings(String s) { +    int preLen = 0, curLen = 1, ret = 0; +    for(int i = 1; i < s.length(); i++){ +        if(s.charAt(i) == s.charAt(i-1)) curLen++; +        else{ +            preLen = curLen; +            curLen = 1; +        } + +        if(preLen >= curLen) ret++; +    } +    return ret; +} +``` + +**字符串循环移ä½�包å�«** + +[ 编程之美:3.1](#) + +给定两个字符串 s1 和 s2 ,è¦�求判定 s2 是å�¦èƒ½å¤Ÿè¢«Â s1 å�šå¾ªçŽ¯ç§»ä½�得到的字符串包å�«ã€‚ + +```html +s1 = AABCD, s2 = CDAA +Return : true +``` + +s1 进行循环移ä½�的结果是 s1s1 的å­�字符串,因此å�ªè¦�判断 s2 是å�¦æ˜¯Â s1s1 的å­�字符串å�³å�¯ã€‚ + +**字符串循环移ä½�** + +[ 编程之美:2.17](#) + +将字符串å�‘å�³å¾ªçŽ¯ç§»åŠ¨Â k ä½�。 + +例如 abcd123 å�‘å�³ç§»åŠ¨Â 3 ä½� 得到 123abcd + +将 abcd123 中的 abcd 和 123 å�•独逆åº�,得到 dcba321,然å�Žå¯¹æ•´ä¸ªå­—符串进行逆åº�,得到123abcd。 + +**字符串中å�•è¯�的翻转** + +[程åº�员代ç �é�¢è¯•指å�—](#) + +例如将 "I am a student" 翻转æˆ� "student a am I" + +å°†æ¯�个å�•è¯�逆åº�,然å�Žå°†æ•´ä¸ªå­—符串逆åº�。 + +## 数组与矩阵 + +**矩阵旋转** // TODO + +[程åº�员é�¢è¯•金典 P114](#) + +**之字型打å�°** //TODO + +[程åº�员代ç �é�¢è¯•指å�— P335](#) + +**把数组中的 0 移到末尾** + +[Leetcode : 283. Move Zeroes (Easy)](https://leetcode.com/problems/move-zeroes/description/) + +```java +    public void moveZeroes(int[] nums) { +        int n = nums.length; +        int idx = 0; +        for(int i = 0; i < n; i++){ +            if(nums[i] != 0) nums[idx++] = nums[i]; +        } +        while(idx < n){ +            nums[idx++] = 0; +        } +    } +``` + +**一个数组元素在 [1, n] 之间,其中一个数被替æ�¢ä¸ºå�¦ä¸€ä¸ªæ•°ï¼Œæ‰¾å‡ºä¸¢å¤±çš„æ•°å’Œé‡�å¤�的数** + +[Leetcode : 645. Set Mismatch (Easy)](https://leetcode.com/problems/set-mismatch/description/) + +最直接的方法是先对数组进行排åº�,这ç§�方法时间å¤�æ�‚度为 O(nlogn),本题å�¯ä»¥ä»¥Â O(n) 的时间å¤�æ�‚度ã€�O(1) 空间å¤�æ�‚度æ�¥æ±‚解。 + +主è¦�æ€�想是让通过交æ�¢æ•°ç»„元素,使得数组上的元素在正确的ä½�置上。 + +é��历数组,如果第 i ä½�上的元素ä¸�是 i + 1 ,那么就交æ�¢ç¬¬Â i ä½� 和 nums[i] - 1 ä½�上的元素,使得 num[i] - 1 的元素为 nums[i] ,也就是该ä½�的元素是正确的。交æ�¢æ“�作需è¦�循环进行,因为一次交æ�¢æ²¡åŠžæ³•ä½¿å¾—ç¬¬Â i ä½�上的元素是正确的。但是è¦�交æ�¢çš„两个元素å�¯èƒ½å°±æ˜¯é‡�å¤�元素,那么循环就å�¯èƒ½æ°¸è¿œè¿›è¡Œä¸‹åŽ»ï¼Œç»ˆæ­¢å¾ªçŽ¯çš„æ–¹æ³•æ˜¯åŠ ä¸ŠÂ nums[i] != nums[nums[i] - 1 æ�¡ä»¶ã€‚ + +类似题目: + +- [Leetcode :448. Find All Numbers Disappeared in an Array (Easy)](https://leetcode.com/problems/find-all-numbers-disappeared-in-an-array/description/),寻找所有丢失的元素 +- [Leetcode : 442. Find All Duplicates in an Array (Medium)](https://leetcode.com/problems/find-all-duplicates-in-an-array/description/),寻找所有é‡�å¤�的元素。 + +```java +public int[] findErrorNums(int[] nums) { +    for(int i = 0; i < nums.length; i++){ +        while(nums[i] != i + 1 && nums[i] != nums[nums[i] - 1]) swap(nums, i, nums[i] - 1); +    } +     +    for(int i = 0; i < nums.length; i++){ +        if(i + 1 != nums[i]) return new int[]{nums[i], i + 1}; +    } +     +    return null; +} + +private void swap(int[] nums, int i, int j){ +    int tmp = nums[i]; +    nums[i] = nums[j]; +    nums[j] = tmp; +} +``` + +**找出数组中é‡�å¤�的数,数组值在 [0, n-1] 之间** + +[Leetcode : 287. Find the Duplicate Number (Medium)](https://leetcode.com/problems/find-the-duplicate-number/description/) + +二分查找解法: + +```java +public int findDuplicate(int[] nums) { +     int l = 1, h = nums.length - 1; +     while (l <= h) { +         int mid = l + (h - l) / 2; +         int cnt = 0; +         for (int i = 0; i < nums.length; i++) { +             if (nums[i] <= mid) cnt++; +         } +         if (cnt > mid) h = mid - 1; +         else l = mid + 1; +     } +     return l; +} +``` + +å�ŒæŒ‡é’ˆè§£æ³•,类似于有环链表中找出环的入å�£ï¼š + +```java +public int findDuplicate(int[] nums) { +      int slow = nums[0], fast = nums[nums[0]]; +      while (slow != fast) { +          slow = nums[slow]; +          fast = nums[nums[fast]]; +      } + +      fast = 0; +      while (slow != fast) { +          slow = nums[slow]; +          fast = nums[fast]; +      } +      return slow; +} +``` + +### 有åº�矩阵 + +有åº�矩阵指的是行和列分别有åº�的矩阵。 + +一般å�¯ä»¥åˆ©ç”¨æœ‰åº�性使用二分查找方法。 + +```html +[ +   [ 1,  5,  9], +   [10, 11, 13], +   [12, 13, 15] +] +``` + +**有åº�矩阵查找** + +[Leetocde : 240. Search a 2D Matrix II (Medium)](https://leetcode.com/problems/search-a-2d-matrix-ii/description/) + +```java +public boolean searchMatrix(int[][] matrix, int target) { +    if (matrix == null || matrix.length == 0 || matrix[0].length == 0) return false; +    int m = matrix.length, n = matrix[0].length; +    int row = 0, col = n - 1; +    while (row < m && col >= 0) { +        if (target == matrix[row][col]) return true; +        else if (target < matrix[row][col]) col--; +        else row++; +    } +    return false; +} +``` + +**有åº�矩阵的 Kth Element** + +[Leetcode : 378. Kth Smallest Element in a Sorted Matrix ((Medium))](https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/description/) + +```html +matrix = [ +  [ 1,  5,  9], +  [10, 11, 13], +  [12, 13, 15] +], +k = 8, + +return 13. +``` + +解题å�‚考:[Share my thoughts and Clean Java Code](https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/discuss/85173) + +二分查找解法: + +```java +public int kthSmallest(int[][] matrix, int k) { +    int m = matrix.length, n = matrix[0].length; +    int lo = matrix[0][0], hi = matrix[m - 1][n - 1]; +    while(lo <= hi) { +        int mid = lo + (hi - lo) / 2; +        int cnt = 0; +        for(int i = 0; i < m; i++) { +            for(int j = 0; j < n && matrix[i][j] <= mid; j++) { +                cnt++; +            } +        } +        if(cnt < k) lo = mid + 1; +        else hi = mid - 1; +    } +    return lo; +} +``` + +堆解法: + +```java +public int kthSmallest(int[][] matrix, int k) { +    int m = matrix.length, n = matrix[0].length; +    PriorityQueue pq = new PriorityQueue(); +    for(int j = 0; j < n; j++) pq.offer(new Tuple(0, j, matrix[0][j])); +    for(int i = 0; i < k - 1; i++) { // å°�根堆,去掉 k - 1 个堆顶元素,此时堆顶元素就是第 k 的数 +        Tuple t = pq.poll(); +        if(t.x == m - 1) continue; +        pq.offer(new Tuple(t.x + 1, t.y, matrix[t.x + 1][t.y])); +    } +    return pq.poll().val; +} + +class Tuple implements Comparable { +    int x, y, val; +    public Tuple(int x, int y, int val) { +        this.x = x; this.y = y; this.val = val; +    } + +    @Override +    public int compareTo(Tuple that) { +        return this.val - that.val; +    } +} +``` + +## 链表 + +**判断两个链表的交点** + +[Leetcode : 160. Intersection of Two Linked Lists](https://leetcode.com/problems/intersection-of-two-linked-lists/description/) + +```html +A:          a1 → a2 +                  ↘ +                    c1 → c2 → c3 +                  ↗ +B:    b1 → b2 → b3 +``` + +è¦�求:时间å¤�æ�‚度为 O(n) 空间å¤�æ�‚度为 O(1) + +设 A 的长度为 a + c,B 的长度为 b + c,其中 c 为尾部公共部分长度,å�¯çŸ¥Â a + c + b = b + c + a。 + +当访问 A 链表的指针访问到链表尾部时,令它从链表 B 的头部开始访问链表 Bï¼›å�Œæ ·åœ°ï¼Œå½“访问 B 链表的指针访问到链表尾部时,令它从链表 A 的头部开始访问链表 A。这样就能控制访问 A 和 B 两个链表的指针能å�Œæ—¶è®¿é—®åˆ°äº¤ç‚¹ã€‚ + +```java +public ListNode getIntersectionNode(ListNode headA, ListNode headB) { +    if(headA == null || headB == null) return null; +    ListNode l1 = headA, l2 = headB; +    while(l1 != l2){ +        l1 = (l1 == null) ? headB : l1.next; +        l2 = (l2 == null) ? headA : l2.next; +    } +    return l1; +} +``` + +如果å�ªæ˜¯åˆ¤æ–­æ˜¯å�¦å­˜åœ¨äº¤ç‚¹ï¼Œé‚£ä¹ˆå°±æ˜¯å�¦ä¸€ä¸ªé—®é¢˜ï¼Œå�³Â ç¼–程之美:3.6 的问题。有两ç§�解法:把第一个链表的结尾连接到第二个链表的开头,看第二个链表是å�¦å­˜åœ¨çŽ¯ï¼›æˆ–è€…ç›´æŽ¥æ¯”è¾ƒç¬¬ä¸€ä¸ªé“¾è¡¨æœ€å�Žä¸€ä¸ªèŠ‚ç‚¹å’Œç¬¬äºŒä¸ªé“¾è¡¨æœ€å�Žä¸€ä¸ªèŠ‚ç‚¹æ˜¯å�¦ç›¸å�Œã€‚ + + + +**链表å��转** + +[Leetcode : 206. Reverse Linked List](https://leetcode.com/problems/reverse-linked-list/description/) + +头æ�’法能够按逆åº�构建链表。 + +```java +public ListNode reverseList(ListNode head) { +    ListNode newHead = null; // 设为 null ,作为新链表的结尾 +    while(head != null){ +        ListNode nextNode = head.next; +        head.next = newHead; +        newHead = head; +        head = nextNode; +    } +    return newHead; +} +``` + +**归并两个有åº�的链表** + +[Leetcode : 21. Merge Two Sorted Lists](https://leetcode.com/problems/merge-two-sorted-lists/description/) + +链表和树一样,å�¯ä»¥ç”¨é€’å½’æ–¹å¼�æ�¥å®šä¹‰ï¼šé“¾è¡¨æ˜¯ç©ºèŠ‚ç‚¹ï¼Œæˆ–è€…æœ‰ä¸€ä¸ªå€¼å’Œä¸€ä¸ªæŒ‡å�‘下一个链表的指针,因此很多链表问题å�¯ä»¥ç”¨é€’å½’æ�¥å¤„ç�†ã€‚ + +```java +public ListNode mergeTwoLists(ListNode l1, ListNode l2) { +    if(l1 == null) return l2; +    if(l2 == null) return l1; +    ListNode newHead = null; +    if(l1.val < l2.val){ +        newHead = l1; +        newHead.next = mergeTwoLists(l1.next, l2); +    } else{ +        newHead = l2; +        newHead.next = mergeTwoLists(l1, l2.next); +    } +    return newHead; +} +``` + +**从有åº�链表中删除é‡�å¤�节点** + +[Leetcode : 83. Remove Duplicates from Sorted List (Easy)](https://leetcode.com/problems/remove-duplicates-from-sorted-list/description/) + +```java +public ListNode deleteDuplicates(ListNode head) { +    if(head == null || head.next == null) return head; +    head.next = deleteDuplicates(head.next); +    return head.next != null && head.val == head.next.val ? head.next : head; +} +``` + +**回文链表** + +[Leetcode : 234. Palindrome Linked List (Easy)](https://leetcode.com/problems/palindrome-linked-list/description/) + +切æˆ�两å�Šï¼ŒæŠŠå�Žå�Šæ®µå��转,然å�Žæ¯”较两å�Šæ˜¯å�¦ç›¸ç­‰ã€‚ + +```java +public boolean isPalindrome(ListNode head) { +    if(head == null || head.next == null) return true; +    ListNode slow = head, fast = head.next; +    while(fast != null && fast.next != null){ +        slow = slow.next; +        fast = fast.next.next; +    } + +    if(fast != null){  // å�¶æ•°èŠ‚ç‚¹ï¼Œè®©Â slow 指å�‘下一个节点 +        slow = slow.next; +    } + +    cut(head, slow); // 切æˆ�两个链表 +    ListNode l1 = head, l2 = slow; +    l2 = reverse(l2); +    return isEqual(l1, l2); +} + +private void cut(ListNode head, ListNode cutNode){ +    while( head.next != cutNode ) head = head.next; +    head.next = null; +} + +private ListNode reverse(ListNode head){ +    ListNode newHead = null; +    while(head != null){ +        ListNode nextNode = head.next; +        head.next = newHead; +        newHead = head; +        head = nextNode; +    } +    return newHead; +} + +private boolean isEqual(ListNode l1, ListNode l2){ +    while(l1 != null && l2 != null){ +        if(l1.val != l2.val) return false; +        l1 = l1.next; +        l2 = l2.next; +    } +    return true; +} +``` + +**从链表中删除节点** + +[编程之美:3.4]() + +![](index_files/2c968ec5-0967-49ce-ac06-f8f5c9ab33bc.jpg) + +```java +B.val = C.val; +B.next = C.next; +``` + +**链表元素按奇å�¶è�šé›†** + +[Leetcode : 328. Odd Even Linked List (Medium)](https://leetcode.com/problems/odd-even-linked-list/description/) + +```java +public ListNode oddEvenList(ListNode head) { +    if (head == null) { +        return head; +    } +    ListNode odd = head, even = head.next, evenHead = even; +    while (even != null && even.next != null) { +        odd.next = odd.next.next; +        odd = odd.next; +        even.next = even.next.next; +        even = even.next; +    } +    odd.next = evenHead; +    return head; +} +``` + +## 树 + +### 递归 + +一棵树è¦�么是空树,è¦�么有两个指针,æ¯�个指针指å�‘一棵树。树是一ç§�递归结构,很多树的问题å�¯ä»¥ä½¿ç”¨é€’å½’æ�¥å¤„ç�†ã€‚ + +**树的高度** + +[Leetcode : 104. Maximum Depth of Binary Tree (Easy)](https://leetcode.com/problems/maximum-depth-of-binary-tree/description/) + +```java +public int maxDepth(TreeNode root) { +    if(root == null) return 0; +    return Math.max(maxDepth(root.left), maxDepth(root.right)) + 1; +} +``` + +**翻转树** + +[Leetcode : 226. Invert Binary Tree (Easy)](https://leetcode.com/problems/invert-binary-tree/description/) + +```java +public TreeNode invertTree(TreeNode root) { +    if(root == null) return null; +    TreeNode left = root.left; // å�Žé�¢çš„æ“�作会改å�˜Â left 指针,因此先ä¿�存下æ�¥ +    root.left = invertTree(root.right); +    root.right = invertTree(left); +    return root; +} +``` + +**归并两棵树** + +[Leetcode : 617. Merge Two Binary Trees (Easy)](https://leetcode.com/problems/merge-two-binary-trees/description/) + +```java +public TreeNode mergeTrees(TreeNode t1, TreeNode t2) { +    if(t1 == null && t2 == null) return null; +    if(t1 == null) return t2; +    if(t2 == null) return t1; +    TreeNode root = new TreeNode(t1.val + t2.val); +    root.left = mergeTrees(t1.left, t2.left); +    root.right = mergeTrees(t1.right, t2.right); +    return root; +} +``` + +**判断路径和是å�¦ç­‰äºŽä¸€ä¸ªæ•°** + +[Leetcdoe : 112. Path Sum (Easy)](https://leetcode.com/problems/path-sum/description/) + +题目æ��述:路径和定义为从 root 到 leaf 的所有节点的和 + +```java +public boolean hasPathSum(TreeNode root, int sum) { +    if(root == null) return false; +    if(root.left == null && root.right == null && root.val == sum) return true; +    return hasPathSum(root.left, sum - root.val) || hasPathSum(root.right, sum - root.val); +} +``` + +**统计路径和等于一个数的路径数é‡�** + +[Leetcode : 437. Path Sum III (Easy)](https://leetcode.com/problems/path-sum-iii/description/) + +题目æ��述:路径ä¸�一定以 root 开头并以 leaf 结尾,但是必须连续 + +pathSumStartWithRoot() 方法统计以æŸ�个节点开头的路径个数。 + +```java +public int pathSum(TreeNode root, int sum) { +    if(root == null) return 0; +    int ret = pathSumStartWithRoot(root, sum) + pathSum(root.left, sum) + pathSum(root.right, sum); +    return ret; +} + +private int pathSumStartWithRoot(TreeNode root, int sum){ +    if(root == null) return 0; +    int ret = 0; +    if(root.val == sum) ret++; +    ret += pathSumStartWithRoot(root.left, sum - root.val) + pathSumStartWithRoot(root.right, sum - root.val); +    return ret; +} +``` + +**树的对称** + +[Leetcode : 101. Symmetric Tree (Easy)](https://leetcode.com/problems/symmetric-tree/description/) + +```java +public boolean isSymmetric(TreeNode root) { +    if(root == null) return true; +    return isSymmetric(root.left, root.right); +} + +private boolean isSymmetric(TreeNode t1, TreeNode t2){ +    if(t1 == null && t2 == null) return true; +    if(t1 == null || t2 == null) return false; +    if(t1.val != t2.val) return false; +    return isSymmetric(t1.left, t2.right) && isSymmetric(t1.right, t2.left); +} +``` + +**平衡树** + +[Leetcode : 110. Balanced Binary Tree (Easy)](https://leetcode.com/problems/balanced-binary-tree/description/) + +题目æ��述:左å�³å­�树高度差是å�¦éƒ½å°�于等于 1 + +```java +private boolean result = true; + +public boolean isBalanced(TreeNode root) { +    maxDepth(root); +    return result; +} + +public int maxDepth(TreeNode root) { +    if (root == null) return 0; +    int l = maxDepth(root.left); +    int r = maxDepth(root.right); +    if (Math.abs(l - r) > 1) result = false; +    return 1 + Math.max(l, r); +} +``` + +**最å°�路径** + +[Leetcode : 111. Minimum Depth of Binary Tree (Easy)](https://leetcode.com/problems/minimum-depth-of-binary-tree/description/) + +题目æ��述:树的根节点到å�¶å­�节点的最å°�长度 + +```java +public int minDepth(TreeNode root) { +    if(root == null) return 0; +    int left = minDepth(root.left); +    int right = minDepth(root.right); +    if(left == 0 || right == 0) return left + right + 1; +    return Math.min(left, right) + 1; +} +``` + +**统计左å�¶å­�节点的和** + +[Leetcode : 404. Sum of Left Leaves (Easy)](https://leetcode.com/problems/sum-of-left-leaves/description/) + +```java +public int sumOfLeftLeaves(TreeNode root) { +    if(root == null) return 0; +    if(isLeaf(root.left)) return root.left.val +  sumOfLeftLeaves(root.right); +    return sumOfLeftLeaves(root.left) + sumOfLeftLeaves(root.right); +} + +private boolean isLeaf(TreeNode node){ +    if(node == null) return false; +    return node.left == null && node.right == null; +} +``` + +**修剪一棵树** + +[Leetcode : 669. Trim a Binary Search Tree (Easy)](https://leetcode.com/problems/trim-a-binary-search-tree/description/) + +题目æ��述:å�ªä¿�留值在 L ~ R 之间的节点 + +```java +public TreeNode trimBST(TreeNode root, int L, int R) { +    if(root == null) return null; +    if(root.val > R) return trimBST(root.left, L, R); +    if(root.val < L) return trimBST(root.right, L, R); +    root.left = trimBST(root.left, L, R); +    root.right = trimBST(root.right, L, R); +    return root; +} +``` + +**å­�æ ‘** + +[Leetcode : 572. Subtree of Another Tree (Easy)](https://leetcode.com/problems/subtree-of-another-tree/description/) + +```java +public boolean isSubtree(TreeNode s, TreeNode t) { +    if(s == null && t == null) return true; +    if(s == null || t == null) return false; +    if(s.val == t.val && isSame(s, t)) return true; +    return isSubtree(s.left, t) || isSubtree(s.right, t); +} + +private boolean isSame(TreeNode s, TreeNode t){ +    if(s == null && t == null) return true; +    if(s == null || t == null) return false; +    if(s.val != t.val) return false; +    return isSame(s.left, t.left) && isSame(s.right, t.right); +} +``` + +**从有åº�数组中构造二å�‰æŸ¥æ‰¾æ ‘** + +[Leetcode : 108. Convert Sorted Array to Binary Search Tree (Easy)](https://leetcode.com/problems/convert-sorted-array-to-binary-search-tree/description/) + +二å�‰æŸ¥æ‰¾æ ‘(BST):根节点大于等于左å­�树所有节点,å°�于等于å�³å­�树所有节点。 + +```java +public TreeNode sortedArrayToBST(int[] nums) { +    return toBST(nums, 0, nums.length - 1); +} + +private TreeNode toBST(int[] nums, int sIdx, int eIdx){ +    if(sIdx > eIdx) return null; +    int mIdx = (sIdx + eIdx) / 2; +    TreeNode root = new TreeNode(nums[mIdx]); +    root.left =  toBST(nums, sIdx, mIdx - 1); +    root.right = toBST(nums, mIdx + 1, eIdx); +    return root; +} +``` + +**两节点的最长路径** + +```html +          1 +        / \ +        2  3 +      / \ +      4  5 + +Return 3, which is the length of the path [4,2,1,3] or [5,2,1,3]. +``` + +```java +private int max = 0; + +public int diameterOfBinaryTree(TreeNode root) { +    depth(root); +    return max; +} + +private int depth(TreeNode root) { +    if (root == null) { +        return 0; +    } +    int leftDepth = depth(root.left); +    int rightDepth = depth(root.right); +    max = Math.max(max, leftDepth + rightDepth); +    return Math.max(leftDepth, rightDepth) + 1; +} +``` + +**找出二å�‰æ ‘中第二å°�的节点** + +[Leetcode : 671. Second Minimum Node In a Binary Tree (Easy)](https://leetcode.com/problems/second-minimum-node-in-a-binary-tree/description/) + +```html +Input: +    2 +  / \ +  2  5 +    / \ +    5  7 + +Output: 5 +``` + +一个节点è¦�么具有 0 个或 2 个å­�节点,如果有å­�节点,那么根节点是最å°�的节点。 + +```java +public int findSecondMinimumValue(TreeNode root) { +    if(root == null) return -1; +    if(root.left == null && root.right == null) return -1; +    int leftVal = root.left.val; +    int rightVal = root.right.val; +    if(leftVal == root.val) leftVal = findSecondMinimumValue(root.left); +    if(rightVal == root.val) rightVal = findSecondMinimumValue(root.right); +    if(leftVal != -1 && rightVal != -1) return Math.min(leftVal, rightVal); +    if(leftVal != -1) return leftVal; +    return rightVal; +} +``` + +**寻找两个节点的最近公共祖先** + +[Leetcode : 235. Lowest Common Ancestor of a Binary Search Tree (Easy)](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-search-tree/description/) + +```java +public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { +    if(root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q); +    if(root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q); +    return root; +} +``` + +**最近公共祖先** + +[Leetcode : 236. Lowest Common Ancestor of a Binary Tree (Medium) ](https://leetcode.com/problems/lowest-common-ancestor-of-a-binary-tree/description/) + +```java +public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { +    if (root == null || root == p || root == q) return root; +    TreeNode left = lowestCommonAncestor(root.left, p, q); +    TreeNode right = lowestCommonAncestor(root.right, p, q); +    return left == null ? right : right == null ? left : root; +} +``` + +**最大相å�ŒèŠ‚ç‚¹å€¼çš„è·¯å¾„é•¿åº¦** + +[Leetcode : 687. Longest Univalue Path (Easy)](https://pomotodo.com/app/) + +```html +              1 +            / \ +            4  5 +          / \  \ +          4  4  5 + +Output : 2 +``` + +```java +private int path = 0; +public int longestUnivaluePath(TreeNode root) { +    dfs(root); +    return path; +} + +private int dfs(TreeNode root){ +    if(root == null) return 0; +    int left = dfs(root.left); +    int right = dfs(root.right); +    int leftPath = root.left != null && root.left.val == root.val ? left + 1 : 0; +    int rightPath = root.right != null && root.right.val == root.val ? right + 1 : 0; +    path = Math.max(path, leftPath + rightPath); +    return Math.max(leftPath, rightPath); +} +``` + +**é—´éš”é��历** + +[Leetcode : 337. House Robber III (Medium)](https://leetcode.com/problems/house-robber-iii/description/) + +```java +public int rob(TreeNode root) { +    if (root == null) return 0; +    int val1 = root.val; +    if (root.left != null) { +        val1 += rob(root.left.left) + rob(root.left.right); +    } +    if (root.right != null) { +        val1 += rob(root.right.left) + rob(root.right.right); +    } +    int val2 = rob(root.left) + rob(root.right); +    return Math.max(val1, val2); +} +``` + +### 层次é��历 + +使用 BFS,ä¸�需è¦�使用两个队列æ�¥åˆ†åˆ«å­˜å‚¨å½“å‰�层的节点和下一层的节点, 因为在开始é��历一层的节点时,当å‰�队列中的节点数就是当å‰�层的节点数,å�ªè¦�控制é��历这么多节点数,就能ä¿�è¯�这次é��历的都是当å‰�层的节点。 + +**计算一棵树æ¯�层节点的平å�‡æ•°** + +[637. Average of Levels in Binary Tree (Easy)](https://leetcode.com/problems/average-of-levels-in-binary-tree/description/) + +```java +public List averageOfLevels(TreeNode root) { +    List ret = new ArrayList<>(); +    if(root == null) return ret; +    Queue queue = new LinkedList<>(); +    queue.add(root); +    while(!queue.isEmpty()){ +        int cnt = queue.size(); +        double sum = 0; +        for(int i = 0; i < cnt; i++){ +            TreeNode node = queue.poll(); +            sum += node.val; +            if(node.left != null) queue.add(node.left); +            if(node.right != null) queue.add(node.right); +        } +        ret.add(sum / cnt); +    } +    return ret; +} +``` + +**得到左下角的节点** + +[Leetcode : 513. Find Bottom Left Tree Value (Easy)](https://leetcode.com/problems/find-bottom-left-tree-value/description/) + +```java +public int findBottomLeftValue(TreeNode root) { +    Queue queue = new LinkedList<>(); +    queue.add(root); +    while(!queue.isEmpty()){ +        root = queue.poll(); +        if(root.right != null) queue.add(root.right); +        if(root.left != null) queue.add(root.left); +    } +    return root.val; +} +``` + +### å‰�中å�Žåº�é��历 + +```html +   1 +  / \ +  2  3 + / \  \ +4  5  6 +``` + +层次é��历顺åº�:[1 2 3 4 5 6] +å‰�åº�é��历顺åº�:[1 2 4 5 3 6] +中åº�é��历顺åº�:[4 2 5 1 3 6] +å�Žåº�é��历顺åº�:[4 5 2 6 3 1] + +层次é��历使用 BFS 实现,利用的就是 BFS 一层一层é��历的特性;而å‰�åº�ã€�中åº�ã€�å�Žåº�é��历利用了 DFS 实现。 + +å‰�åº�ã€�中åº�ã€�å�Žåº�é��å�ªæ˜¯åœ¨å¯¹èŠ‚ç‚¹è®¿é—®çš„é¡ºåº�有一点ä¸�å�Œï¼Œå…¶å®ƒéƒ½ç›¸å�Œã€‚ + +① å‰�åº� + +```java +void dfs(TreeNode root){ +    visit(root); +    dfs(root.left); +    dfs(root.right); +} +``` + +② 中åº� + +```java +void dfs(TreeNode root){ +    dfs(root.left); +    visit(root); +    dfs(root.right); +} +``` + +③ å�Žåº� + +```java +void dfs(TreeNode root){ +    dfs(root.left); +    dfs(root.right); +    visit(root); +} +``` + +**é�žé€’归实现二å�‰æ ‘çš„å‰�åº�é��历** + +[Leetcode : 144. Binary Tree Preorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-preorder-traversal/description/) + +```java +public List preorderTraversal(TreeNode root) { +    List ret = new ArrayList<>(); +    if (root == null) return ret; +    Stack stack = new Stack<>(); +    stack.push(root); +    while (!stack.isEmpty()) { +        TreeNode node = stack.pop(); +        ret.add(node.val); +        if (node.right != null) stack.push(node.right); +        if (node.left != null) stack.push(node.left); // 先添加å�³å­�æ ‘å†�添加左å­�树,这样是为了让左å­�树在栈顶 +    } +    return ret; +} +``` + +**é�žé€’归实现二å�‰æ ‘çš„å�Žç»­é��历** + +[Leetcode : ### 145. Binary Tree Postorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-postorder-traversal/description/) + +å‰�åº�é��历为 root -> left -> right,å�Žåº�é��历为 left -> right -> root,å�¯ä»¥ä¿®æ”¹å‰�åº�é��历æˆ�为 root -> right -> left,那么这个顺åº�就和å�Žåº�é��历正好相å��。 + +```java +public List postorderTraversal(TreeNode root) { +    List ret = new ArrayList<>(); +    if (root == null) return ret; +    Stack stack = new Stack<>(); +    stack.push(root); +    while (!stack.isEmpty()) { +        TreeNode node = stack.pop(); +        ret.add(node.val); +        if (node.left != null) stack.push(node.left); +        if (node.right != null) stack.push(node.right); +    } +    Collections.reverse(ret); +    return ret; +} +``` + +**é�žé€’归实现二å�‰æ ‘的中åº�é��历** + +[Leetcode : 94. Binary Tree Inorder Traversal (Medium)](https://leetcode.com/problems/binary-tree-inorder-traversal/description/) + +```java +public List inorderTraversal(TreeNode root) { +    List ret = new ArrayList<>(); +    Stack stack = new Stack<>(); +    TreeNode cur = root; +    while(cur != null || !stack.isEmpty()) { +        while(cur != null) { // 模拟递归栈的ä¸�断深入 +            stack.add(cur); +            cur = cur.left; +        } +        TreeNode node = stack.pop(); +        ret.add(node.val); +        cur = node.right; +    } +    return ret; +} +``` + +**使用中åº�é��历和å‰�åº�é��历åº�列é‡�建二å�‰æ ‘** //TODO + +### BST + +主è¦�利用 BST 中åº�é��历有åº�的特点。 + +**在 BST 中寻找两个节点,使它们的和为一个给定值。** + +[653. Two Sum IV - Input is a BST](https://leetcode.com/problems/two-sum-iv-input-is-a-bst/description/) + +使用中åº�é��历得到有åº�数组之å�Žï¼Œå†�利用å�ŒæŒ‡é’ˆå¯¹æ•°ç»„进行查找。 + +应该注æ„�到,这一题ä¸�能用分别在左å�³å­�树两部分æ�¥å¤„ç�†è¿™ç§�æ€�想,因为两个待求的节点å�¯èƒ½åˆ†åˆ«åœ¨å·¦å�³å­�树中。 + +```java +public boolean findTarget(TreeNode root, int k) { +    List nums = new ArrayList<>(); +    inOrder(root, nums); +    int i = 0, j = nums.size() - 1; +    while(i < j){ +        int sum = nums.get(i) + nums.get(j); +        if(sum == k) return true; +        if(sum < k) i++; +        else j--; +    } +    return false; +} + +private void inOrder(TreeNode root, List nums){ +    if(root == null) return; +    inOrder(root.left, nums); +    nums.add(root.val); +    inOrder(root.right, nums); +} +``` + +**在 BST 中查找最å°�的两个节点之差的ç»�对值** + +[Leetcode : 530. Minimum Absolute Difference in BST (Easy)](https://leetcode.com/problems/minimum-absolute-difference-in-bst/description/) + +利用 BST 的中åº�é��历为有åº�的性质,计算中åº�é��历中临近的两个节点之差的ç»�对值,å�–最å°�值。 + +```java +private int minDiff = Integer.MAX_VALUE; +private int preVal = -1; + +public int getMinimumDifference(TreeNode root) { +    inorder(root); +    return minDiff; +} + +private void inorder(TreeNode node){ +    if(node == null) return; +    inorder(node.left); +    if(preVal != -1) minDiff = Math.min(minDiff, Math.abs(node.val - preVal)); +    preVal = node.val; +    inorder(node.right); +} +``` + +**把 BST æ¯�个节点的值都加上比它大的节点的值** + +[Leetcode : Convert BST to Greater Tree (Easy)](https://leetcode.com/problems/convert-bst-to-greater-tree/description/) + +å…ˆé��历å�³å­�树。 + +```java +private int sum = 0; + +public TreeNode convertBST(TreeNode root) { +    traver(root); +    return root; +} + +private void traver(TreeNode root) { +    if (root == null) { +        return; +    } +    if (root.right != null) { +        traver(root.right); +    } +    sum += root.val; +    root.val = sum; +    if (root.left != null) { +        traver(root.left); +    } +} +``` + +**寻找 BST 中出现次数最多的节点** + +```java +private int cnt = 1; +private int maxCnt = 1; +private TreeNode preNode = null; +private List list; + +public int[] findMode(TreeNode root) { +    list = new ArrayList<>(); +    inorder(root); +    int[] ret = new int[list.size()]; +    int idx = 0; +    for(int num : list){ +        ret[idx++] = num; +    } +    return ret; +} + +private void inorder(TreeNode node){ +    if(node == null) return; +    inorder(node.left); +    if(preNode != null){ +        if(preNode.val == node.val) cnt++; +        else cnt = 1; +    } +    if(cnt > maxCnt){ +        maxCnt = cnt; +        list.clear(); +        list.add(node.val); +    } else if(cnt == maxCnt){ +        list.add(node.val); +    } +    preNode = node; +    inorder(node.right); +} +``` + +**寻找 BST 的第 k 个元素** + +[Leetcode : 230. Kth Smallest Element in a BST (Medium)](https://leetcode.com/problems/kth-smallest-element-in-a-bst/description/) + +递归解法: + +```java +public int kthSmallest(TreeNode root, int k) { +    int leftCnt = count(root.left); +    if(leftCnt == k - 1) return root.val; +    if(leftCnt > k - 1) return kthSmallest(root.left, k); +    return kthSmallest(root.right, k - leftCnt - 1); +} + +private int count(TreeNode node) { +    if(node == null) return 0; +    return 1 + count(node.left) + count(node.right); +} +``` + +中åº�é��历解法: + +```java +private int cnt = 0; +private int val; + +public int kthSmallest(TreeNode root, int k) { +    inorder(root, k); +    return val; +} + +private void inorder(TreeNode node, int k) { +    if(node == null) return; +    inorder(node.left, k); +    cnt++; +    if(cnt == k) { +        val = node.val; +        return; +    } +    inorder(node.right, k); +} +``` + + +### Trie + +![](index_files/5c638d59-d4ae-4ba4-ad44-80bdc30f38dd.jpg) + +Trie,å�ˆç§°å‰�缀树或字典树,用于判断字符串是å�¦å­˜åœ¨æˆ–者是å�¦å…·æœ‰æŸ�ç§�字符串å‰�缀。 + +**实现一个 Trie** + +[Leetcode : 208. Implement Trie (Prefix Tree) (Medium)](https://leetcode.com/problems/implement-trie-prefix-tree/description/) + +```java +class Trie { +     +    private class Node{ +        Node[] childs = new Node[26]; +        boolean isLeaf; +    } +     +    private Node root = new Node(); +     +    /** Initialize your data structure here. */ +    public Trie() { +    } +     +    /** Inserts a word into the trie. */ +    public void insert(String word) { +        int idx = word.charAt(0) - 'a'; +        insert(word, root); +    } +     +    private void insert(String word, Node node){ +        int idx = word.charAt(0) - 'a'; +        if(node.childs[idx] == null){ +            node.childs[idx] = new Node(); +        } +        if(word.length() == 1) node.childs[idx].isLeaf = true; +        else insert(word.substring(1), node.childs[idx]); +    } +     +    /** Returns if the word is in the trie. */ +    public boolean search(String word) { +        return search(word, root);  +    } +     +    private boolean search(String word, Node node){ +        if(node == null) return false; +        int idx = word.charAt(0) - 'a'; +        if(node.childs[idx] == null) return false; +        if(word.length() == 1) return node.childs[idx].isLeaf; +        return search(word.substring(1), node.childs[idx]); +    } +     +    /** Returns if there is any word in the trie that starts with the given prefix. */ +    public boolean startsWith(String prefix) { +        return startWith(prefix, root); +    } +     +    private boolean startWith(String prefix, Node node){ +        if(node == null) return false; +        if(prefix.length() == 0) return true; +        int idx = prefix.charAt(0) - 'a'; +        return startWith(prefix.substring(1), node.childs[idx]); +    } +} +``` + +**实现一个 Trie,用æ�¥æ±‚å‰�缀和** + +[Leetcode : 677. Map Sum Pairs (Medium)](https://leetcode.com/problems/map-sum-pairs/description/) + +```java +class MapSum { +    private class Trie { +        int val; +        Map childs; +        boolean isWord; +         +        Trie() { +            childs = new HashMap<>(); +        } +    } +     +    private Trie root; + +    public MapSum() { +        root = new Trie(); +    } +     +    public void insert(String key, int val) { +        Trie cur = root; +        for(char c : key.toCharArray()) { +            if(!cur.childs.containsKey(c)) { +                Trie next = new Trie(); +                cur.childs.put(c, next); +            } +            cur = cur.childs.get(c); +        } +        cur.val = val; +        cur.isWord = true; +    } +     +    public int sum(String prefix) { +        Trie cur = root; +        for(char c : prefix.toCharArray()) { +            if(!cur.childs.containsKey(c)) return 0; +            cur = cur.childs.get(c); +        } +        return dfs(cur); +    } +     +    private int dfs(Trie cur) { +        int sum = 0; +        if(cur.isWord) { +            sum += cur.val; +        } +        for(Trie next : cur.childs.values()) { +            sum += dfs(next); +        } +        return sum; +    } +} +``` + +## 图 + +## ä½�è¿�ç®— + +**1. 基本原ç�†** + +0s 表示 一串 0 ,1s 表示一串 1。 + +``` +x ^ 0s = x      x & 0s = 0      x | 0s = x +x ^ 1s = ~x     x & 1s = x      x | 1s = 1s +x ^ x = 0       x & x = x       x | x = x +``` + +① 利用 x ^ 1s = ~x 的特点,å�¯ä»¥å°†ä½�级表示翻转;利用 x ^ x = 0 的特点,å�¯ä»¥å°†ä¸‰ä¸ªæ•°ä¸­é‡�å¤�的两个数去除,å�ªç•™ä¸‹å�¦ä¸€ä¸ªæ•°ï¼› +② 利用 x & 0s = 0 和 x & 1s = x 的特点,å�¯ä»¥å®žçŽ°æŽ©ç �æ“�作。一个数 num 与 mask :00111100 进行ä½�与æ“�作,å�ªä¿�留 num 中与 mask 的 1 部分相对应的ä½�ï¼› +③ 利用 x | 0s = x 和 x | 1s = 1s 的特点,å�¯ä»¥å®žçŽ°è®¾ç½®æ“�作。一个数 num 与 mask:00111100 进行ä½�或æ“�作,将 num 中与 mask 的 1 部分相对应的ä½�都设置为 1 。 + +\>\> n 为算术å�³ç§»ï¼Œç›¸å½“于除以 2nï¼› +\>\>\> n 为无符å�·å�³ç§»ï¼Œå·¦è¾¹ä¼šè¡¥ä¸ŠÂ 0。 +<< n 为算术左移,相当于乘以 2n。 + +n&(n-1) 该ä½�è¿�算是去除 n 的ä½�级表示中最低的那一ä½�。例如对于二进制表示 10110**100**,å‡�去 1 得到 10110**011**,这两个数相与得到 10110**000**。 + +n-n&(~n+1) 概è¿�算是去除 n 的ä½�级表示中最高的那一ä½�。 + +n&(-n) 该è¿�算得到 n 的ä½�级表示中最低的那一ä½�。-n 得到 n 的å��ç �加 1,对于二进制表示 10110**100**,-n 得到 01001**100**,相与得到 00000**100** + +**2. mask 计算** + +è¦�获å�– 111111111,将 0 å�–å��å�³å�¯ï¼Œ~0。 + +è¦�得到å�ªæœ‰ç¬¬Â i ä½�为 1 的 mask,将 1 å�‘左移动 i ä½�å�³å�¯ï¼Œ1<<i 。例如 1<<5 得到å�ªæœ‰ç¬¬Â 5 ä½�为 1 的 mask :00010000。 + +è¦�得到 1 到 i ä½�为 1 的 mask,1<<(i+1)-1 å�³å�¯ï¼Œä¾‹å¦‚将 1<<(4+1)-1 = 00010000-1 = 00001111。 + +è¦�得到 1 到 i ä½�为 0 的 mask,å�ªéœ€å°†Â 1 到 i ä½�为 1 的 mask å�–å��,å�³Â ~(1<<(i+1)-1)。 + +**3. ä½�æ“�作举例** + +① 获å�–第 i ä½� + +num & 00010000 != 0 + +```java +(num & (1 << i)) != 0; +``` + +② 将第 i ä½�设置为 1 + +num | 00010000 + +```java +num | (1 << i); +``` + +③ 将第 i ä½�清除为 0 + +num & 11101111 + +```java +num & (~(1 << i)) +``` + +④ 将最高ä½�到第 i ä½�清除为 0 + +num & 00001111 + +```java +num & ((1 << i) - 1); +``` + +⑤ 将第 0 ä½�到第 i ä½�清除为 0 + +num & 11110000 + +```java +num & (~((1 << (i+1)) - 1)); +``` + +⑥ 将第 i ä½�设置为 0 或者 1 + +先将第 i ä½�清零,然å�Žå°†Â v 左移 i ä½�,执行“ä½�或â€�è¿�算。 + +```java +(num & (1 << i)) | (v << i); +``` + +**4. Java 中的ä½�æ“�作** + +```html +static int Integer.bitCount()            // 统计 1 的数é‡� +static int Integer.highestOneBit()       // 获得最高ä½� +static String toBinaryString(int i)      // 转æ�¢ä½�二进制表示的字符串 +``` + +**统计两个数的二进制表示有多少ä½�ä¸�å�Œ** + +[Leetcode : 461. Hamming Distance (Easy)](https://leetcode.com/problems/hamming-distance/) + +对两个数进行异或æ“�作,ä¸�å�Œçš„那一ä½�结果为 1 ,统计有多少个 1 å�³å�¯ã€‚ + +```java +public int hammingDistance(int x, int y) { +    int z = x ^ y; +    int cnt = 0; +    while(z != 0){ +        if((z & 1) == 1) cnt++; +        z = z >> 1; +    } +    return cnt; +} +``` + +å�¯ä»¥ä½¿ç”¨Â Integer.bitcount() æ�¥ç»Ÿè®¡Â 1 个的个数。 + +```java +public int hammingDistance(int x, int y) { +    return Integer.bitCount(x ^ y); +} +``` + +**翻转一个数的比特ä½�** + +[Leetcode : 190. Reverse Bits (Easy)](https://leetcode.com/problems/reverse-bits/description/) + +```java +public int reverseBits(int n) { +    int ret = 0; +    for(int i = 0; i < 32; i++){ +        ret <<= 1; +        ret |= (n & 1); +        n >>>= 1; +    } +    return ret; +} +``` + +**ä¸�用é¢�外å�˜é‡�交æ�¢ä¸¤ä¸ªæ•´æ•°** + +[程åº�员代ç �é�¢è¯•指å�— :P317](#) + +```java +a = a ^ b; +b = a ^ b; +a = a ^ b; +``` + +将 c = a ^ b,那么 b ^ c = b ^ b ^ a = a,a ^ c = a ^ a ^ b = b。 + +**判断一个数是ä¸�是 4 的 n 次方** + +[Leetcode : 342. Power of Four (Easy)](https://leetcode.com/problems/power-of-four/) + +该数二进制表示有且å�ªæœ‰ä¸€ä¸ªå¥‡æ•°ä½�为 1 ,其余的都为 0 ,例如 16 : 10000。å�¯ä»¥æ¯�次把 1 å�‘左移动 2 ä½�,就能构造出这ç§�数字,然å�Žæ¯”较构造出æ�¥çš„æ•°ä¸Žè¦�判断的数是å�¦ç›¸å�Œã€‚ + +```java +public boolean isPowerOfFour(int num) { +    int i = 1; +    while(i > 0){ +        if(i == num) return true; +        i = i << 2; +    } +    return false; +} +``` + +也å�¯ä»¥ç”¨Â Java 的 Integer.toString() 方法将该数转æ�¢ä¸ºÂ 4 进制形å¼�的字符串,然å�Žåˆ¤æ–­å­—符串是å�¦ä»¥Â 1 开头。 + +```java +public boolean isPowerOfFour(int num) { +    return Integer.toString(num, 4).matches("10*"); +} +``` + +**判断一个数是ä¸�是 2 的 n 次方** + +[Leetcode : 231. Power of Two (Easy)](https://leetcode.com/problems/power-of-two/description/) + +å�Œæ ·å�¯ä»¥ç”¨Â Power of Four 的方法,但是 2 的 n 次方更特殊,它的二进制表示å�ªæœ‰ä¸€ä¸ªÂ 1 存在。 + +```java +public boolean isPowerOfTwo(int n) { +    return n > 0 && Integer.bitCount(n) == 1; +} +``` + +利用 1000 & 0111 == 0 这ç§�性质,得到以下解法: + +```java +public boolean isPowerOfTwo(int n) { +    return n > 0 && (n & (n - 1)) == 0; +} +``` + +**数组中唯一一个ä¸�é‡�å¤�的元素** + +[Leetcode : 136. Single Number (Easy)](https://leetcode.com/problems/single-number/description/) + +两个相å�Œçš„æ•°å¼‚或的结果为 0,对所有数进行异或æ“�作,最å�Žçš„结果就是å�•独出现的那个数。 + +类似的有:[Leetcode : 389. Find the Difference (Easy)](https://leetcode.com/problems/find-the-difference/description/),两个字符串仅有一个字符ä¸�相å�Œï¼Œä½¿ç”¨å¼‚或æ“�作å�¯ä»¥ä»¥Â O(1) 的空间å¤�æ�‚度æ�¥æ±‚解,而ä¸�需è¦�使用 HashSet。 + +```java +public int singleNumber(int[] nums) { +    int ret = 0; +    for(int n : nums) ret = ret ^ n; +    return ret; +} +``` + +**数组中ä¸�é‡�å¤�的两个元素** + +[Leetcode : 260. Single Number III (Medium)](https://leetcode.com/problems/single-number-iii/description/) + +两个ä¸�相等的元素在ä½�级表示上必定会有一ä½�存在ä¸�å�Œã€‚ + +将数组的所有元素异或得到的结果为ä¸�存在é‡�å¤�的两个元素异或的结果。 + +diff &= -diff 得到出 diff 最å�³ä¾§ä¸�为 0 的ä½�,也就是ä¸�存在é‡�å¤�的两个元素在ä½�级表示上最å�³ä¾§ä¸�å�Œçš„那一ä½�,利用这一ä½�å°±å�¯ä»¥å°†ä¸¤ä¸ªå…ƒç´ åŒºåˆ†å¼€æ�¥ã€‚ + + +```java +public int[] singleNumber(int[] nums) { +    int diff = 0; +    for(int num : nums) diff ^= num; +    // 得到最å�³ä¸€ä½� +    diff &= -diff; +    int[] ret = new int[2]; +    for(int num : nums) { +        if((num & diff) == 0) ret[0] ^= num; +        else ret[1] ^= num; +    } +    return ret; +} +``` + +**判断一个数的ä½�级表示是å�¦ä¸�会出现连续的 0 和 1** + +[Leetcode : 693. Binary Number with Alternating Bits (Easy)](https://leetcode.com/problems/binary-number-with-alternating-bits/description/) + +对于 10101 这ç§�ä½�级表示的数,把它å�‘å�³ç§»åŠ¨Â 1 ä½�得到 1010 ,这两个数æ¯�个ä½�都ä¸�å�Œï¼Œå› æ­¤å¼‚或得到的结果为 11111。 + +```java +public boolean hasAlternatingBits(int n) { +    int a = (n ^ (n >> 1)); +    return (a & (a + 1)) == 0; +} +``` + +**求一个数的补ç �** + +[Leetcode : 476. Number Complement (Easy)](https://leetcode.com/problems/number-complement/description/) + +ä¸�考虑二进制表示中的首 0 部分 + +对于 00000101,è¦�求补ç �å�¯ä»¥å°†å®ƒä¸ŽÂ 00000111 进行异或æ“�作。那么问题就转æ�¢ä¸ºæ±‚掩ç � 00000111。 + +```java +public int findComplement(int num) { +    if(num == 0) return 1; +    int mask = 1 << 30; +    while((num & mask) == 0) mask >>= 1; +    mask = (mask << 1) - 1; +    return num ^ mask; +} +``` + +å�¯ä»¥åˆ©ç”¨Â Java 的 Integer.highestOneBit() 方法æ�¥èŽ·å¾—å�«æœ‰é¦– 1 的数。 + +```java +public int findComplement(int num) { +    if(num == 0) return 1; +    int mask = Integer.highestOneBit(num); +    mask = (mask << 1) - 1; +    return num ^ mask; +} +``` + +对于 10000000 这样的数è¦�扩展æˆ� 11111111,å�¯ä»¥åˆ©ç”¨ä»¥ä¸‹æ–¹æ³•: + +```html +mask |= mask >> 1    11000000 +mask |= mask >> 2    11110000 +mask |= mask >> 4    11111111 +``` + +```java +public int findComplement(int num) { +    int mask = num; +    mask |= mask >> 1; +    mask |= mask >> 2; +    mask |= mask >> 4; +    mask |= mask >> 8; +    mask |= mask >> 16; +    return (mask ^ num); +} +``` + +**实现整数的加法** + +[Leetcode : 371. Sum of Two Integers (Easy)](https://leetcode.com/problems/sum-of-two-integers/description/) + +a ^ b 表示没有考虑进ä½�的情况下两数的和,(a & b) << 1 就是进ä½�。递归会终止的原因是 (a & b) << 1 最å�³è¾¹ä¼šå¤šä¸€ä¸ªÂ 0,那么继续递归,进ä½�最å�³è¾¹çš„ 0 会慢慢增多,最å�Žè¿›ä½�会å�˜ä¸ºÂ 0,递归终止。 + +```java +public int getSum(int a, int b) { +    return b == 0 ? a : getSum((a ^ b), (a & b) << 1); +} +``` + +**实现整数乘法** + +[程åº�员代ç �é�¢è¯•指å�— P319](#) + +**字符串数组最大乘积** + +[Leetcode : 318. Maximum Product of Word Lengths (Medium)](https://leetcode.com/problems/maximum-product-of-word-lengths/description/) + +题目æ��述:字符串数组的字符串å�ªå�«æœ‰å°�写字符。求解字符串数组中两个字符串长度的最大乘积,è¦�求这两个字符串ä¸�能å�«æœ‰ç›¸å�Œå­—符。 + +解题æ€�路:本题主è¦�问题是判断两个字符串是å�¦å�«ç›¸å�Œå­—符,由于字符串å�ªå�«æœ‰å°�写字符,总共 26 ä½�,因此å�¯ä»¥ç”¨ä¸€ä¸ªÂ 32 ä½�的整数æ�¥å­˜å‚¨æ¯�个字符是å�¦å‡ºçŽ°è¿‡ã€‚ + +```java +public int maxProduct(String[] words) { +    int n = words.length; +    if (n == 0) return 0; +    int[] val = new int[n]; +    for (int i = 0; i < n; i++) { +        for (char c : words[i].toCharArray()) { +            val[i] |= 1 << (c - 'a'); +        } +    } +    int ret = 0; +    for (int i = 0; i < n; i++) { +        for (int j = i + 1; j < n; j++) { +            if ((val[i] & val[j]) == 0) { +                ret = Math.max(ret, words[i].length() * words[j].length()); +            } +        } +    } +    return ret; +} +``` + +# å�‚考资料 + +- [Leetcode](https://leetcode.com/problemset/algorithms/?status=Todo) +- 剑指 Offer +- 程åº�员é�¢è¯•金典 +- 编程之美 +- 程åº�员代ç �é�¢è¯•指å�— +- 数æ�®ç»“构与算法分æž� +- 算法 +- 王é�“论å�›è®¡ç®—机考研机试指å�— + diff --git a/notes/笔记/Linux+.md.txt b/notes/笔记/Linux+.md.txt new file mode 100644 index 00000000..fa95dbd5 --- /dev/null +++ b/notes/笔记/Linux+.md.txt @@ -0,0 +1,17 @@ +## 孤儿进程和僵死进程 + +### 孤儿进程 + +一个父进程退出,而它的一个或多个å­�进程还在è¿�行,那么那些å­�进程将æˆ�为孤儿进程。孤儿进程将被 init 进程(进程å�·ä¸º 1)所收养,并由 init 进程对它们完æˆ�状æ€�收集工作。由于孤儿进程会被 init 进程收养,所以孤儿进程ä¸�会对系统造æˆ�å�±å®³ + +### 僵尸进程 + +一个å­�进程的进程æ��述符在å­�进程退出时ä¸�会释放,å�ªæœ‰å½“父进程通过 wait 或 waitpid 获å�–了å­�进程信æ�¯å�Žæ‰�会释放。如果å­�进程退出,而父进程并没有调用 wait 或 waitpid,那么å­�进程的进程æ��述符ä»�ç„¶ä¿�存在系统中,这ç§�进程称之为僵死进程。 + +僵死进程通过 ps 命令显示出æ�¥çš„状æ€�为 Z。 + +系统所能使用的进程å�·æ˜¯æœ‰é™�的,如果大é‡�的产生僵死进程,将因为没有å�¯ç”¨çš„进程å�·è€Œå¯¼è‡´ç³»ç»Ÿä¸�能产生新的进程。 + +è¦�消ç�­ç³»ç»Ÿä¸­å¤§é‡�的僵死进程,å�ªéœ€è¦�将其父进程æ�€æ­»ï¼Œæ­¤æ—¶æ‰€æœ‰çš„僵死进程就会å�˜æˆ�孤儿进程,从而被 init 所收养,这样 init 就会释放所有的僵死进程所å� æœ‰çš„资æº�,从而结æ�Ÿåƒµæ­»è¿›ç¨‹ã€‚ + +- [Linux 之守护进程ã€�僵死进程与孤儿进程](http://liubigbin.github.io/2016/03/11/Linux-%E4%B9%8B%E5%AE%88%E6%8A%A4%E8%BF%9B%E7%A8%8B%E3%80%81%E5%83%B5%E6%AD%BB%E8%BF%9B%E7%A8%8B%E4%B8%8E%E5%AD%A4%E5%84%BF%E8%BF%9B%E7%A8%8B/) \ No newline at end of file diff --git a/notes/笔记/Linux.md.txt b/notes/笔记/Linux.md.txt new file mode 100644 index 00000000..d4ec050a --- /dev/null +++ b/notes/笔记/Linux.md.txt @@ -0,0 +1,987 @@ +[TOC] + +# 常用æ“�作以å�Šæ¦‚念 + +## 求助 + +**1. --help** + +指令的基本用法与选项介ç»�。 + +**2. man** + +man 是 manual 的缩写,将指令的具体信æ�¯æ˜¾ç¤ºå‡ºæ�¥ã€‚ + +当执行 man date 时,有 DATE(1) 出现,其中的数字代表指令的类型,常用的数字å�Šå…¶ç±»åž‹å¦‚下: + +| 代å�· | 类型 | +| -- | -- | +| 1 | 用户在 shell 环境中å�¯ä»¥æ“�作的指令或者å�¯æ‰§è¡Œæ–‡ä»¶ | +| 5 | é…�置文件 | +| 8 | 系统管ç�†å‘˜å�¯ä»¥ä½¿ç”¨çš„管ç�†æŒ‡ä»¤ | + +**3. info** + +info 与 man 类似,但是 info 将文档分æˆ�一个个页é�¢ï¼Œæ¯�个页é�¢å�¯ä»¥è¿›è¡Œè·³è½¬ã€‚ + +## 关机 + +**1. æ•°æ�®å�Œæ­¥å†™å…¥ç£�盘 sync** + +为了加快对ç£�盘上文件的读写速度,ä½�于内存中的文件数æ�®ä¸�会立å�³å�Œæ­¥åˆ°ç£�盘上,因此关机之å‰�需è¦�先进行 sync å�Œæ­¥æ“�作。 + +**2. shutdown** + +```html +# /sbin/shutdown [-krhc] [æ—¶é—´] [警告讯æ�¯] +-k : ä¸�会关机,å�ªæ˜¯å�‘é€�警告讯æ�¯ï¼Œé€šçŸ¥æ‰€æœ‰åœ¨çº¿çš„用户 +-r : 将系统的æœ�务å�œæŽ‰å�Žå°±é‡�æ–°å�¯åЍ +-h : 将系统的æœ�务å�œæŽ‰å�Žå°±ç«‹å�³å…³æœº +-c : å�–消已ç»�在进行的 shutdown 指令内容 +``` + +**3. 其它关机指令** + +rebootã€�haltã€�poweroff。 + +## 查看进程 + +ps 指令。 + +例如查看 theadx 的相关信æ�¯ï¼š + +```html +ps aux | grep threadx +``` + +## 查看端å�£ + +netstat 指令。 + +例如查看端å�£ 80 是å�¦è¢«å� ç”¨ï¼š + +```html +netstat -anp | grep 80 +``` + +## PATH + +å�¯ä»¥åœ¨çŽ¯å¢ƒå�˜é‡� PATH 中声明å�¯æ‰§è¡Œæ–‡ä»¶çš„路径,路径之间用 : 分隔。 + +```html +/usr/local/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/dmtsai/.local/bin:/home/dmtsai/bin +``` + +## è¿�行等级 + +0:关机模å¼� +1:å�•用户模å¼�(å�¯ç”¨äºŽç ´è§£root密ç �) +2:无网络支æŒ�的多用户模å¼� +3:有网络支æŒ�的多用户模å¼�(文本模å¼�,工作中最常用的模å¼�) +4:ä¿�留,未使用 +5:有网络支æŒ�çš„ X-windows 支æŒ�多用户模å¼�(桌é�¢ï¼‰ +6:é‡�新引导系统,å�³é‡�å�¯ + +## sudo + +使用 sudo å…�许一般用户使用 root å�¯æ‰§è¡Œçš„命令。用户必须在 /etc/sudoers 中æ‰�能使用该指令。 + +## GNU + +GNU 计划,å�ˆè¯‘为é�©å¥´è®¡åˆ’,它的目标是创建一套完全自由的æ“�作系统,称为 GNU,其内容软件完全以 GPL æ–¹å¼�å�‘布。其中 GPL 全称为 GNU 通用公共许å�¯å��议,包å�«äº†ä»¥ä¸‹å†…容: + +- 以任何目的è¿�行此程åº�的自由; +- å†�å¤�制的自由; +- 改进此程åº�,并公开å�‘布改进的自由。 + +## 包管ç�†å·¥å…· + +RPM å’Œ DPKG 为最常è§�的两类软件包管ç�†å·¥å…·ã€‚RPM 全称为 Redhat Package Manager,最早由 Red Hat å…¬å�¸åˆ¶å®šå®žæ–½ï¼Œéš�å�Žè¢« GNU å¼€æº�æ“�作系统接å�—å¹¶æˆ�为很多 Linux 系统 (RHEL) 的既定软件标准。与 RPM 进行竞争的是基于 Debian æ“�作系统 (UBUNTU) çš„ DEB 软件包管ç�†å·¥å…·ï¼� DPKG,全称为 Debian Package,功能方é�¢ä¸Ž RPM 相似。 + +YUM 基于 RPM 包管ç�†å·¥å…·ï¼Œèƒ½å¤Ÿä»ŽæŒ‡å®šçš„æº�空间(æœ�务器,本地目录等)自动下载目标 RPM 包并且安装,具有ä¾�赖管ç�†åŠŸèƒ½ï¼Œå�¯ä»¥è‡ªåЍ处ç�†ä¾�赖关系并进行下载ã€�安装,无须ç¹�ç��地手动下载ã€�安装æ¯�一个需è¦�çš„ä¾�赖包。此外,YUM çš„å�¦ä¸€ä¸ªåŠŸèƒ½æ˜¯è¿›è¡Œç³»ç»Ÿä¸­æ‰€æœ‰è½¯ä»¶çš„å�‡çº§ã€‚ + +## 常è§�å�‘行版本 + +Linux å�‘行版是预先集æˆ�好的 Linux 内核å�Šå�„ç§�应用软件。 + +**基于 DPKG** + +商业å�‘行版 + +- Ubuntu + +社区å�‘行版 + +- Debian + +**基于 RPM** + +商业å�‘行版 + +- Red Hat + +社区å�‘行版 + +- Fedora +- CentOS + +# 分区 + +## ç£�盘的文件å�� + +Linux 中æ¯�个硬件都被当å�šä¸€ä¸ªæ–‡ä»¶ã€‚ + +常è§�ç£�盘的文件å��: + +- SCSI/SATA/USB ç£�盘:/dev/sd[a-p] +- IDE ç£�盘:/dev/hd[a-d] + +其中文件å��å�Žé�¢çš„åº�å�·çš„确定与ç£�盘æ�’入的顺åº�有关,而与ç£�盘所æ�’入的æ�’æ§½ä½�置无关。 + +## 分区表 + +ç£�盘分区表主è¦�有两ç§�æ ¼å¼�,一ç§�是é™�制较多的 MBR 分区表,一ç§�是较新且é™�制较少的 GPT 分区表。 + +### 1. MBR + +MBR 中,第一个扇区最é‡�è¦�,里é�¢æœ‰ï¼šä¸»è¦�开机记录(Master boot record, MBR)å�Šåˆ†åŒºè¡¨ï¼ˆpartition table),其中 MBR å�  446 bytes,partition table å�  64 bytes。 + +分区表å�ªæœ‰ 64 bytes,最多å�ªèƒ½å­˜å‚¨ 4 个分区,这 4 个分区为主分区(Primary)和扩展分区(Extended)。其中扩展分区å�ªæœ‰ä¸€ä¸ªï¼Œå®ƒå°†å…¶å®ƒç©ºé—´ç”¨æ�¥è®°å½•分区表,å�¯ä»¥è®°å½•更多的分区,因此通过扩展分区å�¯ä»¥åˆ†å‡ºæ›´å¤šåŒºåˆ†ï¼Œè¿™äº›åˆ†åŒºç§°ä¸ºé€»è¾‘分区。 + +Linux 也把分区当æˆ�文件,分区文件的命å��æ–¹å¼�为:ç£�盘文件å��+ç¼–å�·ï¼Œä¾‹å¦‚ /dev/sda1。注æ„�,逻辑分区的编å�·ä»Ž 5 开始。 + +### 2. GPT + +ä¸�å�Œçš„ç£�盘有ä¸�å�Œçš„æ‰‡åŒºå¤§å°�,例如 512bytes 和最新ç£�盘的 4k。GPT 为了兼容所有ç£�盘,在定义扇区上使用逻辑区å�—地å�€ï¼ˆLogical Block Address, LBA)。 + +GPT 第 1 个区å�—记录了 MBR,紧接ç�€æ˜¯ 33 个区å�—记录分区信æ�¯ï¼Œå¹¶æŠŠæœ€å�Žçš„ 33 个区å�—用于对分区信æ�¯è¿›è¡Œå¤‡ä»½ã€‚ + +GPT 没有扩展分区概念,都是主分区,最多å�¯ä»¥åˆ† 128 个分区。 + +![](index_files/a5c25452-6fa5-49e7-9322-823077442775.jpg) + +## 开机检测程åº� + +### 1. BIOS + +BIOS 是开机的时候计算机执行的第一个程åº�,这个程åº�知é�“å�¯ä»¥å¼€æœºçš„ç£�盘,并读å�–ç£�盘第一个扇区的 MBR,由 MBR 执行其中的开机管ç�†ç¨‹åº�,这个开机管ç�†ç¨‹åº�的会加载æ“�作系统的核心文件。 + +MBR 中的开机管ç�†ç¨‹åº�æ��供以下功能:选å�•ã€�载入核心文件以å�Šè½¬äº¤å…¶å®ƒå¼€æœºç®¡ç�†ç¨‹åº�。转交这个功能å�¯ä»¥ç”¨æ�¥å®žçŽ°äº†å¤šé‡�引导,å�ªéœ€è¦�å°†å�¦ä¸€ä¸ªæ“�作系统的开机管ç�†ç¨‹åº�安装其它分区的å�¯åŠ¨æ‰‡åŒºä¸Šï¼Œåœ¨å�¯åЍ MBR 中的开机管ç�†ç¨‹åº�时,就å�¯ä»¥é€‰æ‹©å�¯åЍ当å‰�çš„æ“�作系统或者转交给其它开机管ç�†ç¨‹åº�从而å�¯åЍå�¦ä¸€ä¸ªæ“�作系统。 + +![](index_files/f900f266-a323-42b2-bc43-218fdb8811a8.jpg) + +安装多é‡�引导,最好先安装 Windows å†�安装 Linux。因为安装 Windows 时会覆盖掉 MBR,而 Linux å�¯ä»¥é€‰æ‹©å°†å¼€æœºç®¡ç�†ç¨‹åº�安装在 MBR 或者其它分区的å�¯åŠ¨æ‰‡åŒºï¼Œå¹¶ä¸”å�¯ä»¥è®¾ç½®å¼€æœºç®¡ç�†ç¨‹åº�的选å�•。 + +### 2. UEFI + +UEFI 相比于 BIOS æ�¥è¯´åŠŸèƒ½æ›´ä¸ºå…¨é�¢ï¼Œä¹Ÿæ›´ä¸ºå®‰å…¨ã€‚ + +## 挂载 + +挂载利用目录作为分区的进入点,也就是说,进入目录之å�Žå°±å�¯ä»¥è¯»å�–分区的数æ�®ã€‚ + +![](index_files/249f3bb1-feee-4805-a259-a72699d638ca.jpg) + +# 文件æ�ƒé™�与目录é…�ç½® + +## 文件æ�ƒé™�概念 + +把用户分为三ç§�:文件拥有者ã€�群组以å�Šå…¶å®ƒäººï¼Œå¯¹ä¸�å�Œçš„用户有ä¸�å�Œçš„æ–‡ä»¶æ�ƒé™�。 + +使用 ls 查看一个文件时,会出现一个文件的信æ�¯ï¼Œä¾‹å¦‚ drwxr-xr-x. 3 root root 17 May 6 00:14 .config,对这个内容的解释如下: + +- drwxr-xr-x:文件类型以å�Šæ�ƒé™�,第 1 ä½�为文件类型字段,å�Ž 9 ä½�为文件æ�ƒé™�字段。 +- 3:链接数; +- root:文件拥有者; +- root:所属群组; +- 17:文件大å°�ï¼› +- May 6 00:14:文件最å�Žè¢«ä¿®æ”¹çš„æ—¶é—´ï¼› +- .config:文件å��。 + +常è§�的文件类型å�Šå…¶å�«ä¹‰æœ‰ï¼š + +- d:目录; +- -:文件; +- l:链接文件; + +9 ä½�的文件æ�ƒé™�字段中,æ¯� 3 个为一组,共 3 组,æ¯�一组分别代表对文件拥有者ã€�所属群组以å�Šå…¶å®ƒäººçš„æ–‡ä»¶æ�ƒé™�。一组æ�ƒé™�中的 3 ä½�分别为 rã€�wã€�x æ�ƒé™�,表示å�¯è¯»ã€�å�¯å†™ã€�å�¯æ‰§è¡Œã€‚ + +## 文件属性以å�Šæ�ƒé™�的修改 + +### 1. 修改文件所属群组 + +```html +# chgrp [-R] groupname dirname/filename +-R:递归修改 +``` + +### 2. 修改文件拥有者 + +ä¸�ä»…å�¯ä»¥ä¿®æ”¹æ–‡ä»¶æ‹¥æœ‰è€…,也å�¯ä»¥ä¿®æ”¹æ–‡ä»¶æ‰€å±žç¾¤ç»„。 + +```html +# chown [-R] 用户å��:群组å�� dirname/filename +``` + +### 3. 修改æ�ƒé™� + +å�¯ä»¥å°†ä¸€ç»„æ�ƒé™�用数字æ�¥è¡¨ç¤ºï¼Œæ­¤æ—¶ä¸€ç»„æ�ƒé™�çš„ 3 个ä½�当å�šäºŒè¿›åˆ¶æ•°å­—çš„ä½�,从左到å�³æ¯�个ä½�çš„æ�ƒå€¼ä¸º 4ã€�2ã€�1,å�³æ¯�个æ�ƒé™�对应的数字æ�ƒå€¼ä¸º r:4ã€�w:2ã€�x:1。 + +```html +# chmod [-R] xyz dirname/filename +``` + +范例:将 .bashrc 文件的æ�ƒé™�修改为 -rwxr-xr--。 + +```html +# chmod 754 .bashrc +``` + +也å�¯ä»¥ä½¿ç”¨ç¬¦å�·æ�¥è®¾å®šæ�ƒé™�。 + +```html +# chmod [ugoa] [+-=] [rwx] dirname/filename +- u:拥有者 +- g:所属群组 +- o:其他人 +- a:所有人 +- +:添加æ�ƒé™� +- -:移除æ�ƒé™� +- =:设定æ�ƒé™� +``` + +范例:为 .bashrc 文件的所有用户添加写æ�ƒé™�。 + +```html +# chmod a+w .bashrc +``` + +## 目录的æ�ƒé™� + +文件å��ä¸�是存储在一个文件的内容中,而是存储在一个文件所在的目录中。因此,拥有文件的 w æ�ƒé™�å¹¶ä¸�能对文件å��进行修改。 + +目录存储文件列表,一个目录的æ�ƒé™�也就是对其文件列表的æ�ƒé™�。因此,目录的 r æ�ƒé™�表示å�¯ä»¥è¯»å�–文件列表;w æ�ƒé™�表示å�¯ä»¥ä¿®æ”¹æ–‡ä»¶åˆ—表,具体æ�¥è¯´ï¼Œå°±æ˜¯æ·»åŠ åˆ é™¤æ–‡ä»¶ï¼Œå¯¹æ–‡ä»¶å��进行修改;x æ�ƒé™�å�¯ä»¥è®©è¯¥ç›®å½•æˆ�为工作目录,x æ�ƒé™�是 r å’Œ w æ�ƒé™�的基础,如果ä¸�能使一个目录æˆ�为工作目录,也就没办法读å�–文件列表以å�Šå¯¹æ–‡ä»¶åˆ—表进行修改了。 + +## 文件默认æ�ƒé™� + +文件默认æ�ƒé™�:文件默认没有å�¯æ‰§è¡Œæ�ƒé™�,因此为 666 ,也就是 -rw-rw-rw- 。 +目录默认æ�ƒé™�:目录必须è¦�能够进入,也就是必须拥有å�¯æ‰§è¡Œæ�ƒé™�,因此为 777 ,也就是 drwxrwxrwx。 + +å�¯ä»¥é€šè¿‡ umask 设置或者查看文件的默认æ�ƒé™�,通常以掩ç �的形å¼�æ�¥è¡¨ç¤ºï¼Œä¾‹å¦‚ 002 表示其它用户的æ�ƒé™�去除了一个 2 çš„æ�ƒé™�,也就是写æ�ƒé™�,因此建立新文件时默认的æ�ƒé™�为 -rw-rw-r-- 。 + +## 目录é…�ç½® + +为了使ä¸�å�Œ Linux å�‘行版本的目录结构ä¿�æŒ�一致性,Filesystem Hierarchy Standard (FHS) 规定了 Linux 的目录结构。最基础的三个目录如下: + +- / (root, 根目录) +- /usr (unix software resource):所有系统默认软件都会安装到这个目录; +- /var (variable):存放系统或程åº�è¿�行过程中的数æ�®æ–‡ä»¶ã€‚ + +完整的目录树如下: + +![](index_files/27ace615-558f-4dfb-8ad4-7ac769c10118.jpg) + +# 文件与目录 + +## 文件时间 + +1. modification time (mtime):文件的内容更新就会更新; +2. status time (ctime):文件的状æ€�(æ�ƒé™�ã€�属性)更新就会更新; +3. access time (atime):读å�–文件时就会更新。 + +## 文件与目录的基本æ“�作 + +### 1. ls + +列出文件或者目录的信æ�¯ï¼Œç›®å½•的信æ�¯å°±æ˜¯å…¶ä¸­åŒ…å�«çš„æ–‡ä»¶ã€‚ + +```html +# ls [-aAdfFhilnrRSt] file|dir +-a :列出全部的文件 +-d :仅列出目录本身 +-l :以长数æ�®ä¸²è¡Œåˆ—出,包å�«æ–‡ä»¶çš„属性与æ�ƒé™�等等数æ�® +``` + +### 2. cp + +å¤�制æ“�作。 + +如果æº�文件有两个以上,则目的文件一定è¦�是目录æ‰�行。 + +```html +cp [-adfilprsu] source destination +-a :相当于 -dr --preserve=all çš„æ„�æ€�,至于 dr 请å�‚考下列说明 +-d :若æ�¥æº�文件为链接文件,则å¤�制链接文件属性而é�žæ–‡ä»¶æœ¬èº« +-i :若目标文件已ç»�存在时,在覆盖å‰�会先询问 +-p :连å�Œæ–‡ä»¶çš„属性一起å¤�制过去 +-r :递归æŒ�ç»­å¤�制 +-u :destination 比 source æ—§æ‰�æ›´æ–° destination,或 destination ä¸�存在的情况下æ‰�å¤�制 +--preserve=all :除了 -p çš„æ�ƒé™�相关å�‚数外,还加入 SELinux 的属性, links, xattr 等也å¤�制了 +``` + +### 3. rm + +移除æ“�作。 + +```html +# rm [-fir] 文件或目录 +-r :递归删除 +``` + +### 4. mv + +移动æ“�作。 + +```html +# mv [-fiu] source destination +# mv [options] source1 source2 source3 .... directory +-f : force 强制的æ„�æ€�,如果目标文件已ç»�存在,ä¸�会询问而直接覆盖 +``` + +## 获å�–文件内容 + +### 1. cat + +å�–得文件内容。 + +```html +# cat [-AbEnTv] filename +-n :打å�°å‡ºè¡Œå�·ï¼Œ 连å�Œç©ºç™½è¡Œä¹Ÿä¼šæœ‰è¡Œå�·ï¼Œä¸Ž -b 的选项ä¸�å�Œ +``` + +### 2. tac + +是 cat çš„å��å�‘æ“�作,从最å�Žä¸€è¡Œå¼€å§‹æ‰“å�°ã€‚ + +### 3. more + +å�¯ä»¥ä¸€é¡µä¸€é¡µæŸ¥çœ‹æ–‡ä»¶å†…容,和文本编辑器类似。 + +### 4. less + +å’Œ more 类似。 + +### 5. head + +å�¯ä»¥å�–得文件å‰�几行。 + +```html +# head [-n number] filename +-n :å�Žé�¢æŽ¥æ•°å­—,代表显示几行的æ„�æ€� +``` + +### 6. tail + +是 head çš„å��å�‘æ“�作,å�ªæ˜¯å�–得是å�Žå‡ è¡Œã€‚ + +### 7. od + +å�¯ä»¥ä»¥å­—符或者å��六进制的形å¼�显示二进制文件。 + +### 8. touch + +修改文件时间或者建立新文件。 + +```html +# touch [-acdmt] filename +-a : æ›´æ–° atime +-c : æ›´æ–° ctime,若该文件ä¸�存在则ä¸�建立新文件 +-m : æ›´æ–° mtime +-d : å�Žé�¢å�¯ä»¥æŽ¥æ¬²æ›´æ–°çš„æ—¥æœŸè€Œä¸�用目å‰�的日期,也å�¯ä»¥ä½¿ç”¨ --date="日期或时间" +-t :å�Žé�¢å�¯ä»¥æŽ¥æ¬²æ›´æ–°çš„æ—¶é—´è€Œä¸�用目å‰�的时间,格å¼�为[YYYYMMDDhhmm] +``` + +## 指令与文件æ�œç´¢ + +### 1. which + +指令æ�œç´¢ã€‚ + +```html +# which [-a] command +-a :将所有指令列出,而ä¸�是å�ªåˆ—第一个 +``` + +### 2. whereis + +whereis æ�œç´¢æ–‡ä»¶çš„速度比较快,因为它å�ªæ�œç´¢å‡ ä¸ªç‰¹å®šçš„目录。 + +```html +# whereis [-bmsu] dirname/filename +``` + +### 3. locate + +locate å�¯ä»¥ç”¨å…³é”®å­—或者正则表达å¼�进行æ�œç´¢ã€‚ + +locate 使用 /var/lib/mlocate/ 这个数æ�®åº“æ�¥è¿›è¡Œæ�œç´¢ï¼Œå®ƒå­˜å‚¨åœ¨å†…存中,并且æ¯�天更新一次,所以无法用 locate æ�œç´¢æ–°å»ºçš„æ–‡ä»¶ã€‚å�¯ä»¥ä½¿ç”¨ updatedb æ�¥ç«‹å�³æ›´æ–°æ•°æ�®åº“。 + +```html +# locate [-ir] keyword +-r:接正则表达å¼� +``` + +### 4. find + +find å�¯ä»¥ä½¿ç”¨æ–‡ä»¶çš„属性和æ�ƒé™�进行æ�œç´¢ã€‚ + +```html +# find filename [option] +``` + +#### 4.1 与时间有关的选项 + +```html +-mtime n :列出在 n 天å‰�的那一天修改过内容的文件 +-mtime +n :列出在 n 天之å‰�(ä¸�å�« n 天本身)修改过内容的文件 +-mtime -n :列出在 n 天之内(å�« n 天本身)修改过内容的文件 +-newer file : 列出比 file 更新的文件 +``` + ++4ã€�4 å’Œ -4 的指示的时间范围如下: + +![](index_files/658fc5e7-79c0-4247-9445-d69bf194c539.png) + +#### 4.2 与文件拥有者和所属群组有关的选项 + +```html +-uid n +-gid n +-user name +-group name +-nouser :æ�œç´¢æ‹¥æœ‰è€…ä¸�存在 /etc/passwd 的文件 +-nogroup:æ�œç´¢æ‰€å±žç¾¤ç»„ä¸�存在于 /etc/group 的文件 +``` + +#### 4.3 与文件æ�ƒé™�å’Œå��称有关的选项 + +```html +-name filename +-size [+-]SIZE:æ�œå¯»æ¯” SIZE 还è¦�大(+)或å°�(-)的文件。这个 SIZE 的规格有:c: 代表 byte,k: 代表 1024bytes。所以,è¦�找比 50KB还è¦�大的文件,就是 -size +50k +-type TYPE +-perm mode :æ�œç´¢æ�ƒé™�等于 mode 的文件 +-perm -mode :æ�œç´¢æ�ƒé™�包å�« mode 的文件 +-perm /mode :æ�œç´¢æ�ƒé™�包å�«ä»»ä¸€ mode 的文件 +``` + +# ç£�盘与文件系统 + +## 文件系统的组æˆ� + +对分区进行格å¼�化是为了在分区上建立文件系统。一个分区通常å�ªèƒ½æ ¼å¼�化为一个文件系统,但是ç£�盘阵列等技术å�¯ä»¥å°†ä¸€ä¸ªåˆ†åŒºæ ¼å¼�化为多个文件系统,因此å�ªæœ‰æ–‡ä»¶ç³»ç»Ÿèƒ½è¢«æŒ‚载,而分区ä¸�能被挂载。 + +文件系统有以下三个结构: + +1. superblock:记录文件系统的整体信æ�¯ï¼ŒåŒ…括 inode å’Œ block 的总é‡�ã€�使用é‡�ã€�剩余é‡�,以å�Šæ–‡ä»¶ç³»ç»Ÿçš„æ ¼å¼�与相关信æ�¯ç­‰ï¼› +2. inode:一个文件å� ç”¨ä¸€ä¸ª inode,记录文件的属性,å�Œæ—¶è®°å½•此文件的数æ�®æ‰€åœ¨çš„ block å�·ç �ï¼› +3. block:记录文件的内容,若文件太大时,会å� ç”¨å¤šä¸ª block。 + +当è¦�读å�–一个文件的内容时,先在 inode 中去查找文件内容所在的所有 block,然å�ŽæŠŠæ‰€æœ‰ block 的内容读出æ�¥ã€‚ + +ç£�盘碎片是指一个文件内容所在的 block 过于分散。 + +Ext2 文件系统使用了上述的文件结构,并在此之上加入了 block 群组的概念,也就是将一个文件系统划分为多个 block 群组,方便管ç�†ã€‚ + +![](index_files/1974a836-aa6b-4fb8-bce1-6eb11969284a.jpg) + +## inode + +Ext2 文件系统支æŒ�çš„ block 大å°�有 1kã€�2k å’Œ 4k 三ç§�,ä¸�å�Œçš„ block 大å°�é™�制了å�•一文件的大å°�。而æ¯�个 inode 大å°�是固定为 128 bytes。 + +inode 中记录了文件内容所在的 block,但是æ¯�个 block é�žå¸¸å°�,一个大文件éš�便都需è¦�几å��万的 block,而一个 inode 大å°�有é™�,无法直接引用这么多 block。因此引入了间接ã€�å�Œé—´æŽ¥ã€�三间接引用,使用用 block æ�¥æ‰©å……大å°�,也就是让 block æ�¥è®°å½•文件包å�«çš„ block。 + +![](index_files/89091427-7b2b-4923-aff6-44681319a8aa.jpg) + +inode 具体包å�«ä»¥ä¸‹ä¿¡æ�¯ï¼š + +- 该文件的存å�–模å¼�(read/write/excute)ï¼› +- 该文件的拥有者与群组(owner/group)ï¼› +- 该文件的容é‡�ï¼› +- 该文件建立或状æ€�改å�˜çš„æ—¶é—´(ctime)ï¼› +- 最近一次的读å�–æ—¶é—´(atime)ï¼› +- 最近修改的时间(mtime)ï¼› +- 定义文件特性的旗标(flag),如 SetUID...ï¼› +- 该文件真正内容的指å�‘ (pointer)。 + +## 目录的 inode 与 block + +建立一个目录时,会分é…�一个 inode 与至少一个 block。block 记录的内容是目录下所有文件的 inode ç¼–å�·ä»¥å�Šæ–‡ä»¶å��,å�¯ä»¥çœ‹å‡ºæ–‡ä»¶çš„ inode 本身ä¸�记录文件å��,文件å��记录在目录中,因此新增文件ã€�删除文件ã€�更改文件å��这些æ“�作与目录的 w æ�ƒé™�有关。 + +## 实体链接与符å�·é“¾æŽ¥ + +```html +# ln [-sf] source_filename dist_filename +-s :默认是 hard link,加 -s 为 symbolic link +-f :如果目标5文件存在时,先删除目标文件 +``` + +### 1. 实体链接 + +hard link å�ªæ˜¯åœ¨æŸ�个目录下新增一个æ�¡ç›®ï¼Œä½¿å¾—新增的æ�¡ç›®é“¾æŽ¥åˆ°æ–‡ä»¶çš„ inode 上。删除任æ„�一个æ�¡ç›®ï¼Œæ–‡ä»¶è¿˜æ˜¯å­˜åœ¨ï¼Œå�ªè¦�引用数é‡�ä¸�为 0。 + +有以下é™�制:ä¸�能跨越 Filesystemï¼›ä¸�能对目录进行链接。 + +```html +# ln /etc/crontab . +# ll -i /etc/crontab crontab +34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 crontab +34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab +``` + +### 2. 符å�·é“¾æŽ¥ + +symbolic link å�¯ä»¥ç�†è§£ä¸º Windows 的快æ�·æ–¹å¼�,通过建立一个独立的文件,这个文件的数æ�®çš„读å�–指å�‘链接的那个文件。当æº�文件被删除了,链接文件就打ä¸�开了。 + +symbolic link å�¯ä»¥ä¸ºç›®å½•建立链接。 + +```html +# ll -i /etc/crontab /root/crontab2 +34474855 -rw-r--r--. 2 root root 451 Jun 10 2014 /etc/crontab +53745909 lrwxrwxrwx. 1 root root 12 Jun 23 22:31 /root/crontab2 -> /etc/crontab +``` + +# 压缩与打包 + +## 压缩 + +Linux 底下有很多压缩文件的扩展å��,常è§�的如下: + +| 扩展å�� | 压缩程åº� | +| -- | -- | +| \*.Z | compress | +|\*.zip | zip | +|\*.gz | gzip| +|\*.bz2 | bzip2 | +|\*.xz | xz | +|\*.tar | tar 程åº�打包的数æ�®ï¼Œæ²¡æœ‰ç»�过压缩 | +|\*.tar.gz | tar 程åº�打包的文件,ç»�过 gzip 的压缩 | +|\*.tar.bz2 | tar 程åº�打包的文件,ç»�过 bzip2 的压缩 | +|\*.tar.xz | tar 程åº�打包的文件,ç»�过 xz 的压缩 | + +### 1. gzip + +gzip 是 Linux 使用最广的压缩指令,å�¯ä»¥è§£å¼€ compressã€�zip 与 gzip 所压缩的文件。 + +ç»�过 gzip 压缩过,æº�文件就ä¸�存在了。 + +有 9 个ä¸�å�Œçš„压缩等级å�¯ä»¥ä½¿ç”¨ã€‚ + +å�¯ä»¥ä½¿ç”¨ zcatã€�zmoreã€�zless æ�¥è¯»å�–压缩文件的内容。 + +```html +$ gzip [-cdtv#] filename +-c :将压缩的数æ�®è¾“出到å±�幕上 +-d :解压缩 +-t :检验压缩文件是å�¦å‡ºé”™ +-v :显示压缩比等信æ�¯ +-# : # 为数字的æ„�æ€�,代表压缩等级,数字越大压缩比越高,默认为6 +``` + +### 2. bzip2 + +æ��供比 gzip 更高的压缩比。 + +查看命令:bzcatã€�bzmoreã€�bzlessã€�bzgrep。 + +```html +$ bzip2 [-cdkzv#] filename +-k :ä¿�ç•™æº�文件 +``` + +### 3. xz + +æ��供比 bzip2 更佳的压缩比。 + +å�¯ä»¥çœ‹åˆ°ï¼Œgzipã€�bzip2ã€�xz 的压缩比ä¸�断优化,ä¸�过è¦�注æ„�,压缩比越高,压缩的时间也越长。 + +查看命令:xzcatã€�xzmoreã€�xzlessã€�xzgrep。 + +```html +$ xz [-dtlkc#] filename +``` + +## 打包 + +压缩指令å�ªèƒ½å¯¹ä¸€ä¸ªæ–‡ä»¶è¿›è¡ŒåŽ‹ç¼©ï¼Œè€Œæ‰“åŒ…èƒ½å¤Ÿå°†å¤šä¸ªæ–‡ä»¶æ‰“åŒ…æˆ�一个大文件。tar ä¸�ä»…å�¯ä»¥ç”¨äºŽæ‰“包,也å�¯ä»¥ä½¿ç”¨ gipã€�bzip2ã€�xz 将打包文件进行压缩。 + +```html +$ tar [-z|-j|-J] [cv] [-f 新建的tar文件] filename... ==打包压缩 +$ tar [-z|-j|-J] [tv] [-f 已有的tar文件] ==查看 +$ tar [-z|-j|-J] [xv] [-f 已有的tar文件] [-C 目录] ==解压缩 +-z :使用zipï¼› +-j :使用bzip2ï¼› +-J :使用xzï¼› +-c :新建打包文件; +-t :查看打包文件里é�¢æœ‰å“ªäº›æ–‡ä»¶ï¼› +-x :解打包或解压缩的功能; +-v :在压缩/解压缩的过程中,显示正在处ç�†çš„æ–‡ä»¶å��ï¼› +-f : filename:è¦�处ç�†çš„æ–‡ä»¶ï¼› +-C 目录 : 在特定目录解压缩。 +``` + +最常用的方å¼�如下: + +打包压缩 : tar -jcv -f filename.tar.bz2 è¦�被压缩的文件或目录å��ç§° +查 看       ï¼š tar -jtv -f filename.tar.bz2 +解压缩     ï¼štar -jxv -f filename.tar.bz2 -C è¦�解压缩的目录 + +# BASH + +å�¯ä»¥é€šè¿‡ shell 请求内核æ��ä¾›æœ�务,Bash 正是 shell 的一ç§�。 + +## Bash特性 + +**1. 命令历å�²** + +记录使用过的命令。本次登录所执行的命令都会暂时存放到内存中, ~/.bash_history 文件中记录的是å‰�一次登录所执行过的命令。 + +**2. 命令与文件补全** + +å¿«æ�·é”®ï¼štab + +**3. 命å��别å��** + +例如 lm 是 ls -al 的别å��。 + +**4. shell scripts** + +**5. 通é…�符** + +例如 ls -l /usr/bin/X\* 列出 /usr/bin 下é�¢æ‰€æœ‰ä»¥ X 开头的文件。 + +## å�˜é‡�æ“�作 + +对一个å�˜é‡�赋值直接使用 = ,对å�˜é‡�å�–用需è¦�在å�˜é‡�å‰�加上 \$ ,也å�¯ä»¥ç”¨ \${} 的形å¼�,输出å�˜é‡�使用 echo 命令。 + +```bash +$ var=abc +$ echo $var +$ echo ${var} +``` + +å�˜é‡�内容如果有空格,需è¦�使用å�Œå¼•å�·æˆ–者å�•引å�·ã€‚å�Œå¼•å�·å†…的特殊字符å�¯ä»¥ä¿�留原本特性,例如var="lang is \$LANG",则var的值为 lang is zh_TW.UTF-8;而å�•引å�·å†…的特殊字符就是特殊字符本身,例如 var='lang is \$LANG',则 var 的值为 lang is \$LANG。 + + +å�¯ä»¥ä½¿ç”¨ \`指令\` 或者 \$(指令) 的方å¼�将指令的执行结果赋值给å�˜é‡�。例如 version=\$(uname -r),则 version 的值为 3.10.0-229.el7.x86_64。 + +å�¯ä»¥ä½¿ç”¨ export 命令将自定义å�˜é‡�转æˆ�环境å�˜é‡�,环境å�˜é‡�å�¯ä»¥åœ¨å­�程åº�中使用,所谓å­�程åº�就是由当å‰� Bash 而产生的å­� Bash。 + +Bash çš„å�˜é‡�å�¯ä»¥å£°æ˜Žä¸ºæ•°ç»„和整数数字。注æ„�数字类型没有浮点数。如果ä¸�进行声明,默认是字符串类型。å�˜é‡�的声明使用 declare 命令: + +```html +$ declare [-aixr] variable +-a : 定义为数组类型 +-i : 定义为整数类型 +-x : 定义为环境å�˜é‡� +-r : 定义为readonly类型 +``` + +使用 [ ] æ�¥å¯¹æ•°ç»„进行æ“�作: + +```bash +$ array[1]=a +$ array[2]=b +$ echo ${array[1]} +``` + +## 指令æ�œç´¢é¡ºåº� + +1. 以ç»�对或相对路径æ�¥æ‰§è¡ŒæŒ‡ä»¤ï¼Œä¾‹å¦‚ /bin/ls 或者 ./ls ï¼› +2. 由别å��找到该指令æ�¥æ‰§è¡Œï¼› +3. ç”± Bash 内建的指令æ�¥æ‰§è¡Œï¼› +4. 按 \$PATH å�˜é‡�指定的æ�œç´¢è·¯å¾„的顺åº�找到第一个指令æ�¥æ‰§è¡Œã€‚ + +## æ•°æ�®æµ�é‡�定å�‘ + +é‡�定å�‘就是使用文件代替标准输入ã€�标准输出和标准错误输出。 + +1. 标准输入 (stdin)      ï¼šä»£ç �为 0 ,使用 < 或 << ï¼› +2. 标准输出 (stdout)    ï¼šä»£ç �为 1 ,使用 > 或 >> ï¼› +3. 标准错误输出(stderr):代ç �为 2 ,使用 2> 或 2>> ï¼› + +其中,有一个箭头的表示以覆盖的方å¼�é‡�定å�‘,而有两个箭头的表示以追加的方å¼�é‡�定å�‘。 + +å�¯ä»¥å°†ä¸�需è¦�的标准输出以å�Šæ ‡å‡†é”™è¯¯è¾“出é‡�定å�‘到 /dev/null ,相当于扔进垃圾箱。 + +如果需è¦�将标准输出以å�Šæ ‡å‡†é”™è¯¯è¾“出å�Œæ—¶é‡�定å�‘到一个文件,需è¦�å°†æŸ�个输出转æ�¢ä¸ºå�¦ä¸€ä¸ªè¾“出,例如 2>&1 表示将标准错误输出转æ�¢ä¸ºæ ‡å‡†è¾“出。 + +```bash +$ find /home -name .bashrc > list 2>&1 +``` + +## 管线指令 + +管线是将一个命令的标准输出作为å�¦ä¸€ä¸ªå‘½ä»¤çš„æ ‡å‡†è¾“入,在数æ�®éœ€è¦�ç»�过多个步骤的处ç�†ä¹‹å�Žæ‰�能得到我们想è¦�的格å¼�æ—¶å°±å�¯ä»¥ä½¿ç”¨ç®¡çº¿ã€‚在命令之间使用 | 分隔å�„个管线命令。 + +```bash +$ ls -al /etc | less +``` + +### 1. æ��å�–指令:cut + +æ��å�–过程一行一行地进行。 + +cut 对数æ�®è¿›è¡Œåˆ‡åˆ†ï¼Œå�–出想è¦�的部分。 + +```html +$ cut +-d :分隔符 +-f :ç»�过 -d 分隔å�Žï¼Œä½¿ç”¨ -f n å�–出第 n 个区间 +-c :以字符为å�•ä½�å�–出区间 +``` + +范例1:last 将显示的登入者的信æ�¯ï¼Œè¦�求仅显示用户å��。 + +```html +$ last +root pts/1 192.168.201.101 Sat Feb 7 12:35 still logged in +root pts/1 192.168.201.101 Fri Feb 6 12:13 - 18:46 (06:33) +root pts/1 192.168.201.254 Thu Feb 5 22:37 - 23:53 (01:16) + +$ last | cut -d ' ' -f 1 +``` + +范例2:将 export 输出的讯æ�¯ï¼Œå�–得第 12 字符以å�Žçš„æ‰€æœ‰å­—符串。 + +```html +$ export +declare -x HISTCONTROL="ignoredups" +declare -x HISTSIZE="1000" +declare -x HOME="/home/dmtsai" +declare -x HOSTNAME="study.centos.vbird" +.....(å…¶ä»–çœ�ç•¥)..... + +$ export | cut -c 12 +``` + +### 2. 排åº�命令:sortã€�uniq + +**sort** 进行排åº�。 + +```html +$ sort [-fbMnrtuk] [file or stdin] +-f :忽略大å°�写 +-b :忽略最å‰�é�¢çš„空格 +-M :以月份的å��å­—æ�¥æŽ’åº�,例如 JAN, DEC +-n :使用数字 +-r :å��å�‘排åº� +-u :相当于 unique ,é‡�å¤�内容å�ªå‡ºçŽ°ä¸€æ¬¡ +-t :分隔符,默认为tab +-k :指定排åº�的区间 +``` + +范例:/etc/passwd 内容是以 : æ�¥åˆ†éš”的,以第三æ �æ�¥æŽ’åº�。 + +```html +$ cat /etc/passwd | sort -t ':' -k 3 +root:x:0:0:root:/root:/bin/bash +dmtsai:x:1000:1000:dmtsai:/home/dmtsai:/bin/bash +alex:x:1001:1002::/home/alex:/bin/bash +arod:x:1002:1003::/home/arod:/bin/bash +``` + +**uniq** å�¯ä»¥å°†é‡�å¤�的数æ�®å�ªå�–一个。 + +```html +$ uniq [-ic] +-i :忽略大å°�写 +-c :进行计数 +``` + +范例:å�–å¾—æ¯�个人的登录总次数 + +```html +$ last | cut -d ' ' -f 1 | sort | uniq -c +1 +6 (unknown +47 dmtsai +4 reboot +7 root +1 wtmp +``` + +### 3. å�Œå�‘输出é‡�定å�‘:tee + +输出é‡�定å�‘会将输出内容é‡�定å�‘到文件中,而 **tee** ä¸�仅能够完æˆ�这个功能,还能ä¿�ç•™å±�幕上的输出。也就是说,使用 tee 指令,一个输出会å�Œæ—¶ä¼ é€�到文件和å±�幕上。 + +```html +$ tee [-a] file +``` + +### 4. 字符转æ�¢æŒ‡ä»¤ï¼štrã€�colã€�expandã€�joinã€�paste + + **tr** 用æ�¥åˆ é™¤ä¸€è¡Œä¸­çš„字符,或者对字符进行替æ�¢ã€‚ + +```html +$ tr [-ds] SET1 ... +-d : 删除行中 SET1 这个字符串 +``` + +范例,将 last 输出的信æ�¯æ‰€æœ‰å°�写转æ�¢ä¸ºå¤§å†™ã€‚ + +```html +$ last | tr '[a-z]' '[A-Z]' +``` + + **col** å°† tab 字符转为空格字符。 + +```html +$ col [-xb] +-x : å°† tab 键转æ�¢æˆ�对等的空格键 +``` + +**expand** å°† tab 转æ�¢ä¸€å®šæ•°é‡�的空格,默认是 8 个。 + +```html +$ expand [-t] file +-t :tab 转为空格的数é‡� +``` + +**join** 将有相å�Œæ•°æ�®çš„那一行å�ˆå¹¶åœ¨ä¸€èµ·ã€‚ + +```html +$ join [-ti12] file1 file2 +-t :分隔符,默认为空格 +-i :忽略大å°�写的差异 +-1 :第一个文件所用的比较字段 +-2 :第二个文件所用的比较字段 +``` + +**paste** 直接将两行粘贴在一起。 + +```html +$ paste [-d] file1 file2 +-d :分隔符,默认为 tab +``` + +### 5. 分区指令:split + +**split** 将一个文件划分æˆ�多个文件。 + +```html +$ split [-bl] file PREFIX +-b :以大å°�æ�¥è¿›è¡Œåˆ†åŒºï¼Œå�¯åŠ å�•ä½�,例如 b, k, m ç­‰ +-l :以行数æ�¥è¿›è¡Œåˆ†åŒºã€‚ +- PREFIX :分区文件的å‰�导å��ç§° +``` + +# 正规表示法与文件格å¼�化处ç�† + +## grep + +使用正则表示å¼�把匹é…�的行æ��å�–出æ�¥ã€‚ + +```html +$ grep [-acinv] [--color=auto] æ�œå¯»å­—符串 filename +-a : å°† binary 文件以 text 文件的方å¼�进行æ�œå¯» +-c : 计算找到个数 +-i : 忽略大å°�写 +-n : 输出行å�· +-v : å��å�‘选择,亦å�³æ˜¾ç¤ºå‡ºæ²¡æœ‰ æ�œå¯»å­—符串 内容的那一行 +--color=auto :找到的关键字加颜色显示 +``` + +范例:把å�«æœ‰ the 字符串的行æ��å�–出æ�¥ï¼ˆæ³¨æ„�默认会有 --color=auto 选项,因此以下内容在 Linux 中有颜色显示 the 字符串) + +```html +$ grep -n 'the' regular_express.txt +8:I can't finish the test. +12:the symbol '*' is represented as start. +15:You are the best is mean you are the no. 1. +16:The world Happy is the same with "glad". +18:google is the best tools for search keyword +``` + +因为 { 与 } 的符å�·åœ¨ shell 是有特殊æ„�义的,因此必须è¦�使用使用转义字符进行转义。 + +```html +$ grep -n 'go\{2,5\}g' regular_express.txt +``` + +其它正则表达å¼�请å�‚考 [正则表达å¼�](https://github.com/00000H/notes/blob/master/notes/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F.md). + +## printf + +用于格å¼�化输出。 + +它ä¸�属于管é�“命令,在给 printf ä¼ æ•°æ�®æ—¶éœ€è¦�使用 $( ) å½¢å¼�。 + +```html +$ printf '%10s %5i %5i %5i %8.2f \n' $(cat printf.txt) + DmTsai 80 60 92 77.33 + VBird 75 55 80 70.00 + Ken 60 90 70 73.33 +``` + +## awk + +```html +$ awk 'æ�¡ä»¶ç±»åž‹ 1{动作 1} æ�¡ä»¶ç±»åž‹ 2{动作 2} ...' filename +``` + +awk æ¯�次处ç�†ä¸€è¡Œï¼Œå¤„ç�†çš„æœ€å°�å�•ä½�是字段,æ¯�个字段的命å��æ–¹å¼�为:\$n,n 为字段å�·ï¼Œä»Ž 1 开始,\$0 表示一整行。 + +范例 1:å�–出登录用户的用户å��å’Œ ip + +```html +$ last -n 5 +dmtsai pts/0 192.168.1.100 Tue Jul 14 17:32 still logged in +dmtsai pts/0 192.168.1.100 Thu Jul 9 23:36 - 02:58 (03:22) +dmtsai pts/0 192.168.1.100 Thu Jul 9 17:23 - 23:36 (06:12) +dmtsai pts/0 192.168.1.100 Thu Jul 9 08:02 - 08:17 (00:14) +dmtsai tty1 Fri May 29 11:55 - 12:11 (00:15) + +$ last -n 5 | awk '{print $1 "\t" $3} +``` + +awk å�˜é‡�: + +| å�˜é‡�å��ç§° | 代表æ„�义 | +| -- | -- | +| NF | æ¯�一行拥有的字段总数 | +| NR | ç›®å‰�所处ç�†çš„æ˜¯ç¬¬å‡ è¡Œæ•°æ�® | +| FS | ç›®å‰�的分隔字符,默认是空格键 | + +范例 2:输出正在处ç�†çš„行å�·ï¼Œå¹¶æ˜¾ç¤ºæ¯�一行有多少字段 + +```html +$ last -n 5 | awk '{print $1 "\t lines: " NR "\t columns: " NF}' +dmtsai lines: 1 columns: 10 +dmtsai lines: 2 columns: 10 +dmtsai lines: 3 columns: 10 +dmtsai lines: 4 columns: 10 +dmtsai lines: 5 columns: 9 +``` + +å�¯ä»¥ä½¿ç”¨å¤§äºŽç­‰äºŽé€»è¾‘,其中等于使用 ==。 + +范例 3:/etc/passwd 文件第三个字段为 UID,对 UID å°�于 10 的数æ�®è¿›è¡Œå¤„ç�†ã€‚ + +```text +cat /etc/passwd | awk 'BEGIN {FS=":"} $3 < 10 {print $1 "\t " $3}' +root 0 +bin 1 +daemon 2 +``` + +# vim 三个模å¼� + +![](index_files/341c632a-1fc1-4068-9b9f-bf7ef68ebb4c.jpg) + +在指令列模å¼�下,有以下命令用于离开或者存储文件。 + +| 命令 | 作用 | +| -- | -- | +| :w | 写入ç£�盘| +| :w! | 当文件为å�ªè¯»æ—¶ï¼Œå¼ºåˆ¶å†™å…¥ç£�盘。到底能ä¸�能写入,与用户对该文件的æ�ƒé™�有关 | +| :q | 离开| +| :q! | 强制离开ä¸�ä¿�å­˜| +| :wq | 写入ç£�盘å�Žç¦»å¼€| +| :wq!| 强制写入ç£�盘å�Žç¦»å¼€| + + +# å�‚考资料 + +- 鸟哥. 鸟 å“¥ çš„ Linux ç§� 房 è�œ 基 ç¡€ 篇 第 三 版[J]. 2009. +- [Linux å¹³å�°ä¸Šçš„软件包管ç�†](https://www.ibm.com/developerworks/cn/linux/l-cn-rpmdpkg/index.html) + diff --git a/notes/笔记/MapReduce.md.txt b/notes/笔记/MapReduce.md.txt new file mode 100644 index 00000000..a7b08654 --- /dev/null +++ b/notes/笔记/MapReduce.md.txt @@ -0,0 +1,176 @@ +# 直观ç�†è§£ + +统计一堆牌中有多少张黑桃,最简å�•的方法是一张一张去数。而 MapReduce 的方法是: + +1. 把这堆牌分é…�给多个玩家; +2. 让æ¯�个玩家数自己手中有多少张黑桃; +3. 把所有玩家数出的黑桃数加起æ�¥å°±æ˜¯æœ€å�Žçš„结果。 + +通过让多个玩家æ�¥å¹¶è¡Œåœ°è¿›è¡Œç»Ÿè®¡ï¼ŒMapReduce å�¯ä»¥å°†ç»Ÿè®¡æ—¶é—´å¤§å¤§ç¼©çŸ­ã€‚ + +# 大数æ�® + +从大é‡�æ•°æ�®ä¸­å¿«é€Ÿæ��å�–出有价值的信æ�¯ã€‚注æ„�到这里的数æ�®ä¸�一定需è¦�å�Œç§�类型的数æ�®ï¼Œå�¯ä»¥æ˜¯å¤šç§�多样的数æ�®ï¼ŒåŒ…括é�žç»“构化数æ�®ã€�å�Šç»“构化数æ�®ä»¥å�Šç»“构化数æ�®ã€‚ + +# 基本原ç�† + +MapReduce 用æ�¥å¯¹å¤§æ•°æ�®ä¸­çš„æµ·é‡�æ•°æ�®è¿›è¡Œç¦»çº¿åˆ†æž�。 + +MapReduce 分为两个阶段:Map 阶段和 Reduce 阶段。 + +在下图中,file 包å�«å¤šä¸ªÂ block,æ¯�个å�—代表一个海é‡�æ•°æ�®ã€‚file 被划分为多个 split,æ¯�个分片由一个 Mapper Task 去处ç�†ã€‚Map 过程中输入的是 [K1, V1] 数æ�®ï¼Œè¿™ç§�是一ç§�键值对形å¼�的数æ�®ï¼Œé”®ä¸ºæ³›åž‹Â K1 的类型,值为泛型 V1 的类型。输入也是一个泛型的键值对 [K2, V2]。Shuffle 过程主è¦�是对 Map 阶段输出的键值对进行整å�ˆï¼Œå°†é”®ç›¸å�Œçš„键值对整å�ˆåˆ°ä¸€ç»„中,得到 [K2, {V2,...}] 的整å�ˆæ•°æ�®ï¼Œä½œä¸ºÂ Reudce 阶段的输入。Reduce 处ç�†å®Œä¹‹å�Žå¾—到 [K3, V3] 键值对,Hadoop 会将输出的数æ�®å­˜åˆ°åˆ†å¸ƒå¼�文件系统 HDFS 中。 + +![](index_files/e2026020-d669-4faa-9e16-ca726619bb9f.jpg) + +# WordCount 实战 + +## 开å�‘环境é…�ç½® + +创建 Maven 项目,在 pom.xml 中添加以下ä¾�赖: + +``` +     +        3.0.0 +     + +     +         +            org.apache.hadoop +            hadoop-common +            ${hadoopVersion} +         +         +            org.apache.hadoop +            hadoop-hdfs +            ${hadoopVersion} +         + +         +            org.apache.hadoop +            hadoop-mapreduce-client-core +            ${hadoopVersion} +         +         +            org.apache.hadoop +            hadoop-client +            ${hadoopVersion} +         +     +``` + +## 文本 + +```html +the weather is good +today is good +good weather is good +today has good weather +``` + +将文本的æ¯�一行分æˆ�一片,æ¯�一片的数æ�®æ��供给 Mapper 进行处ç�†ï¼Œå› æ­¤éœ€è¦� 4 个 Mapper。其中 K1 为行å�·ï¼ŒV1 ä½�该行的字符串。 + +```html +Split-0: [0, "the weather is good] +Split-1: [1, "today is good"] +Split-2: [2, "good weather is good"] +Split-3: [3, "today has good weather] +``` + +## Mapper + +Mapper 类需è¦�æ��供四个泛型,分别为 K1, V1, K2, V2。 + +```java +class WordCountMappper extends Mapper { +    @Override +    protected void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException { +        String line = value.toString(); +        String[] words = line.split(" "); +        for (String word : words) { +            context.write(new Text(word), new IntWritable(1)); +        } +    } +} +``` + +```html +Mapper-0: ["the", 1], ["weather", 1], ["is", 1], ["good", 1] +Mapper-1: ["today", 1], ["is", 1], ["good", 1] +Mapper-2: ["good", 2], ["weather", 1], ["is", 1] +Mapper-3: [today", 1], ["has", 1], ["good", 1], ["weater", 1] +``` + +## Shuffle + +排åº�并将拥有相å�Œé”®çš„æ•°æ�®æ•´å�ˆã€‚ + +```html +["good", {1, 1, 2, 1}] +["has", {1}] +["is", {1, 1, 1}] +["the", {1}] +["today", {1, 2}] +["weater", {1,1}] +``` + +## Reducer + +Reducer å�Œæ ·è¦�指定 4 个泛型:K2, V2, K3, V3 + +```java +public class WordCountReducer extends Reducer { +    @Override +    protected void reduce(Text key, Iterable values, Context context) throws IOException, InterruptedException { +        Integer count = 0; +        for (IntWritable value : values) { +            count += value.get(); +        } +        context.write(key, new IntWritable(count)); +    } +} +``` + +```html +Reducer-0: ["good", 5] +Reducer-1: ["has", 1] +Reducer-2: ["is", 3] +Reducer-3: ["the", 1] +Reducer-4: ["today", 2] +Reducer-5: ["weather", 3] +``` + +## Job + +将项目打包æˆ� jar 包å�Žä½¿ç”¨Â Hadoop æ�¥è¿�行。 + +```java +public class WordCountMapReduce { +    public static void main(String[] args) throws IOException, ClassNotFoundException, InterruptedException { +        Configuration conf = new Configuration(); + // 新建 Job +        Job job = Job.getInstance(conf, "wordcount"); +        job.setJarByClass(WordCountMapReduce.class); +        job.setMapperClass(WordCountMappper.class); +        job.setReducerClass(WordCountReducer.class); +        // 设置 Mapper 和 Reducer 的 Key Value 类型 +        job.setMapOutputKeyClass(Text.class); +        job.setOutputValueClass(IntWritable.class); +        job.setOutputKeyClass(Text.class); +        job.setOutputValueClass(IntWritable.class); + // 设置 HDFS 路径 +        FileInputFormat.setInputPaths(job, new Path("hdfs://domain:8020/words")); +        FileOutputFormat.setOutputPath(job, new Path("hdfs://domain:8020/words")); + // è¿�行 +        boolean b = job.waitForCompletion(true); +        if (!b) { +            System.err.println("This task has failed!!!"); +        } +    } +} +``` + + +# å�‚考资料 + +- [Hadoop MapReduce 入门](http://www.jikexueyuan.com/course/2686.html) + diff --git a/notes/笔记/MySQL+.md.txt b/notes/笔记/MySQL+.md.txt new file mode 100644 index 00000000..627d1e8e --- /dev/null +++ b/notes/笔记/MySQL+.md.txt @@ -0,0 +1,28 @@ +# 主从å¤�制与读写分离 + +## 1. 主从å¤�制 + +![](index_files/QQ_u622A_u56FE20180220095110.png) + +主è¦�涉å�Šä¸‰ä¸ªçº¿ç¨‹ï¼šbinlog 线程ã€�I/O 线程和 SQL 线程。 + +1. **binlog 线程**:负责将主æœ�务器上的数æ�®æ›´æ”¹å†™å…¥äºŒè¿›åˆ¶æ–‡ä»¶ï¼ˆbinlog)中。 +2. **I/O 线程**:负责从主æœ�务器上读å�–二进制日志文件,并写入中继日志中。 +3. **SQL 线程**:负责读å�–中继日志并é‡�放其中的 SQL 语å�¥ã€‚ + +## 2. 读写分离 + +![](index_files/QQ_u622A_u56FE20180220095116.png) + +主æœ�务器用æ�¥å¤„ç�†å†™æ“�作,而从æœ�务器用æ�¥å¤„ç�†è¯»æ“�作。 + +读写分离常用代ç�†æ–¹å¼�æ�¥å®žçŽ°ï¼Œä»£ç�†æœ�务器接收应用层传æ�¥çš„读写请求,然å�Žå†³å®šè½¬å�‘到哪个æœ�务器,例如 Amoeba 代ç�†æœ�务器。 + +MySQL 读写分离能æ��高性能的原因在于: + +1. 主从æœ�务器负责å�„自的读和写,æž�大程度缓解了é”�的争用; +2. 从æœ�务器å�¯ä»¥é…�置 MyISAM 引擎,æ��å�‡æŸ¥è¯¢æŠ€èƒ½ä»¥å�ŠèŠ‚çº¦ç³»ç»Ÿå¼€é”€ï¼› +3. 增加冗余,æ��高å�¯ç”¨æ€§ã€‚ + +- [MySQL 读写分离介ç»�å�Šæ�­å»ºÂ ](https://segmentfault.com/a/1190000003716617) +- [Mysql 分表和分区的区别ã€�分库分表介ç»�与区别 ](http://www.cnblogs.com/langtianya/p/4997768.html) diff --git a/notes/笔记/MySQL.md.txt b/notes/笔记/MySQL.md.txt new file mode 100644 index 00000000..63e0cbff --- /dev/null +++ b/notes/笔记/MySQL.md.txt @@ -0,0 +1,382 @@ +[TOC] + +# 存储引擎 + +## 1. InnoDB + +InnoDB 是 MySQL 的默认事务型引擎,å�ªæœ‰åœ¨éœ€è¦� InnoDB ä¸�支æŒ�的特性时,æ‰�考虑使用其它存储引擎。 + +采用 MVCC æ�¥æ”¯æŒ�高并å�‘,并且实现了四个标准的隔离级别,默认级别是å�¯é‡�å¤�读。 + +表是基于è�šç°‡ç´¢å¼•建立的,它对主键的查询性能有很高的æ��å�‡ã€‚ + +内部å�šäº†å¾ˆå¤šä¼˜åŒ–,包括从ç£�盘读å�–æ•°æ�®æ—¶é‡‡ç”¨çš„å�¯é¢„测性读,能够自动在内存中创建 hash 索引以加速读æ“�作的自适应哈希索引,以å�Šèƒ½å¤ŸåŠ é€Ÿæ�’å…¥æ“�作的æ�’入缓冲区等。 + +通过一些机制和工具支æŒ�真正的热备份。 + +## 2. MyISAM + +MyISAM æ��供了大é‡�的特性,包括全文索引ã€�压缩ã€�空间函数(GIS)等。但 MyISAM ä¸�支æŒ�事务和行级é”�,而且奔溃å�Žæ— æ³•安全æ�¢å¤�。 + +å�ªèƒ½å¯¹æ•´å¼ è¡¨åŠ é”�,而ä¸�是针对行。 + +å�¯ä»¥æ‰‹å·¥æˆ–者自动执行检查和修å¤�æ“�作,但是和事务æ�¢å¤�以å�Šå¥”溃æ�¢å¤�ä¸�å�Œï¼Œå�¯èƒ½å¯¼è‡´ä¸€äº›æ•°æ�®ä¸¢å¤±ï¼Œè€Œä¸”ä¿®å¤�æ“�作是é�žå¸¸æ…¢çš„。 + +å�¯ä»¥åŒ…å�«åЍæ€�或者é�™æ€�的行。 + +如果指定了 DELAY_KEY_WRITE 选项,在æ¯�次修改执行完æˆ�时,ä¸�会立å�³å°†ä¿®æ”¹çš„索引数æ�®å†™å…¥ç£�盘,而是会写到内存中的键缓冲区,å�ªæœ‰åœ¨æ¸…ç�†é”®ç¼“冲区或者关闭表的时候æ‰�会将对应的索引å�—写入ç£�盘。这ç§�æ–¹å¼�å�¯ä»¥æž�大的æ��å�‡å†™å…¥æ€§èƒ½ï¼Œä½†æ˜¯åœ¨æ•°æ�®åº“或者主机奔溃时会造æˆ�索引æ�Ÿå��,需è¦�执行修å¤�æ“�作。 + +如果表在创建并导入数æ�®ä»¥å�Žï¼Œä¸�会å†�进行修改æ“�作,那么这样的表适å�ˆé‡‡ç”¨ MyISAM 压缩表。 + +对于å�ªè¯»æ•°æ�®ï¼Œæˆ–者表比较å°�ã€�å�¯ä»¥å®¹å¿�ä¿®å¤�æ“�作,则ä¾�ç„¶å�¯ä»¥ç»§ç»­ä½¿ç”¨ MyISAM。 + +MyISAM 设计简å�•,数æ�®ä»¥ç´§å¯†æ ¼å¼�存储,所以在æŸ�些场景下性能很好。 + +## 3. InnoDB 与 MyISAM 的比较 + +**事务** + +InnoDB 是事务型的。 + +**备份** + +InnoDB 支æŒ�在线热备份。 + +**奔溃æ�¢å¤�** + +MyISAM 奔溃å�Žå�‘生æ�Ÿå��的概率比 InnoDB 高很多,而且æ�¢å¤�的速度也更慢。 + +**å¹¶å�‘** + +MyISAM å�ªæ”¯æŒ�表级é”�,而 InnoDB 还支æŒ�行级é”�。 + +**其它特性** + +MyISAM 支æŒ�全文索引,地ç�†ç©ºé—´ç´¢å¼•ï¼› + +# æ•°æ�®ç±»åž‹ + +## 1. æ•´åž‹ + +TINYINT, SMALLINT, MEDIUMINT, INT, BIGINT 分别使用 8, 16, 24, 64 ä½�存储空间,一般情况下越å°�的列越好。 + +INT(11) 中的数字å�ªæ˜¯è§„定了交互工具显示字符的个数,对于存储和计算æ�¥è¯´æ˜¯æ²¡æœ‰æ„�义的。 + +## 2. 浮点数 + +FLOAT å’Œ DOUBLE 为浮点类型,DECIMAL 为高精度å°�数类型。CPU 原生支æŒ�浮点è¿�算,但是ä¸�支æŒ� DECIMAl 类型的计算,因此 DECIMAL 的计算比浮点类型需è¦�更高的代价。 + +FLOATã€�DOUBLE å’Œ DECIMAL 都å�¯ä»¥æŒ‡å®šåˆ—宽,例如 DECIMAL(18, 9) 表示总共 18 ä½�,å�– 9 ä½�存储å°�数部分,剩下 9 ä½�存储整数部分。 + +## 3. 字符串 + +主è¦�有 CHAR å’Œ VARCHAR 两ç§�类型,一ç§�是定长的,一ç§�是å�˜é•¿çš„。 + +VARCHAR è¿™ç§�å�˜é•¿ç±»åž‹èƒ½å¤ŸèŠ‚çœ�空间,因为å�ªéœ€è¦�存储必è¦�的内容。但是在执行 UPDATE æ—¶å�¯èƒ½ä¼šä½¿è¡Œå�˜å¾—比原æ�¥é•¿ï¼Œå½“超出一个页所能容纳的大å°�时,就è¦�执行é¢�外的æ“�作,MyISAM 会将行拆æˆ�ä¸�å�Œçš„片段存储,而 InnoDB 则需è¦�分裂页æ�¥ä½¿è¡Œæ”¾è¿›é¡µå†…。 + +VARCHAR 会ä¿�留字符串末尾的空格,而 CHAR 会删除。 + +## 4. 时间和日期 + +MySQL æ��供了两ç§�相似的日期时间类型:DATATIME å’Œ TIMESTAMP。 + +**DATATIME** + +能够ä¿�存从 1001 年到 9999 年的日期和时间,精度为秒,使用 8 字节的存储空间。 + +它与时区无关。 + +默认情况下,MySQL 以一ç§�å�¯æŽ’åº�çš„ã€�无歧义的格å¼�显示 DATATIME 值,例如“2008-01016 22:37:08â€�,这是 ANSI 标准定义的日期和时间表示方法。 + +**TIMESTAMP** + +å’Œ UNIX 时间戳相å�Œï¼Œä¿�存从 1970 å¹´ 1 月 1 æ—¥å�ˆå¤œï¼ˆæ ¼æž—å¨�治时间)以æ�¥çš„秒数,使用 4 个字节,å�ªèƒ½è¡¨ç¤ºä»Ž 1970 å¹´ 到 2038 年。 + +它和时区有关。 + +MySQL æ��供了 FROM_UNIXTIME() 函数把 Unxi 时间戳转æ�¢ä¸ºæ—¥æœŸï¼Œå¹¶æ��供了 UNIX_TIMESTAMP() 函数把日期转æ�¢ä¸º Unix 时间戳。 + +默认情况下,如果æ�’入时没有指定 TIMESTAMP 列的值,会将这个值设置为当å‰�时间。 + +应该尽é‡�使用 TIMESTAMP,因为它比 DATETIME 空间效率更高。 + +# 索引 + +索引是在存储引擎层实现的,而ä¸�是在æœ�务器层实现的,所以ä¸�å�Œå­˜å‚¨å¼•擎具有ä¸�å�Œçš„索引类型和实现。 + +索引能够轻易将查询性能æ��å�‡å‡ ä¸ªæ•°é‡�级。 + +对于é�žå¸¸å°�的表ã€�大部分情况下简å�•的全表扫æ��比建立索引更高效。对于中到大型的表,索引就é�žå¸¸æœ‰æ•ˆã€‚但是对于特大型的表,建立和使用索引的代价将会éš�之增长。这ç§�情况下,需è¦�用到一ç§�技术å�¯ä»¥ç›´æŽ¥åŒºåˆ†å‡ºéœ€è¦�查询的一组数æ�®ï¼Œè€Œä¸�是一æ�¡è®°å½•一æ�¡è®°å½•地匹é…�,例如å�¯ä»¥ä½¿ç”¨åˆ†åŒºæŠ€æœ¯ã€‚ + +## 1. 索引分类 + +### 1.1 B-Tree 索引 + +B-Tree 索引是大多数 MySQL 存储引擎的默认索引类型。 + +因为ä¸�å†�需è¦�进行全表扫æ��,å�ªéœ€è¦�对树进行æ�œç´¢å�³å�¯ï¼Œå› æ­¤æŸ¥æ‰¾é€Ÿåº¦å¿«å¾ˆå¤šã€‚ + +å�¯ä»¥æŒ‡å®šå¤šä¸ªåˆ—作为索引列,多个索引列共å�Œç»„æˆ�键。B-Tree 索引适用于全键值ã€�键值范围和键å‰�缀查找,其中键å‰�缀查找å�ªé€‚用于最左å‰�缀查找。 + +除了用于查找,还å�¯ä»¥ç”¨äºŽæŽ’åº�和分组。 + +如果ä¸�是按照索引列的顺åº�进行查找,则无法使用索引。 + +### 1.2 哈希索引 + +基于哈希表实现,优点是查找é�žå¸¸å¿«ã€‚ + +在 MySQL 中å�ªæœ‰ Memory 引擎显å¼�支æŒ�哈希索引。 + +InnoDB 引擎有一个特殊的功能å�«â€œè‡ªé€‚应哈希索引â€�,当æŸ�个索引值被使用的é�žå¸¸é¢‘ç¹�时,会在 B-Tree 索引之上å†�创建一个哈希索引,这样就让 B-Tree 索引具有哈希索引的一些优点,比如快速的哈希查找。 + +é™�制:哈希索引å�ªåŒ…å�«å“ˆå¸Œå€¼å’Œè¡ŒæŒ‡é’ˆï¼Œè€Œä¸�存储字段值,所以ä¸�能使用索引中的值æ�¥é�¿å…�读å�–行。ä¸�过,访问内存中的行的速度很快,所以大部分情况下这一点对性能影å“�å¹¶ä¸�明显;无法用于分组与排åº�ï¼›å�ªæ”¯æŒ�精确查找,无法用于部分查找和范围查找;如果哈希冲çª�很多,查找速度会å�˜å¾—很慢。 + +### 1.3. 空间索引数æ�®ï¼ˆR-Tree) + +MyISAM 存储引擎支æŒ�空间索引,å�¯ä»¥ç”¨äºŽåœ°ç�†æ•°æ�®å­˜å‚¨ã€‚ + +空间索引会从所有维度æ�¥ç´¢å¼•æ•°æ�®ï¼Œå�¯ä»¥æœ‰æ•ˆåœ°ä½¿ç”¨ä»»æ„�维度æ�¥è¿›è¡Œç»„å�ˆæŸ¥è¯¢ã€‚ + +### 1.4 全文索引 + +MyISAM 存储引擎支æŒ�全文索引,用于查找文本中的关键è¯�,而ä¸�是直接比较索引中的值。 + +使用 MATCH AGAINST,而ä¸�是普通的 WHERE。 + +## 2. 索引的优点 + +- 大大å‡�少了æœ�务器需è¦�扫æ��的数æ�®é‡�ï¼› + +- 帮助æœ�务器é�¿å…�进行排åº�和创建临时表; + +- å°†éš�机 I/O å�˜ä¸ºé¡ºåº� I/O。 + +## 3. 索引优化 + +### 3.1 独立的列 + +在进行查询时,索引列ä¸�能是表达å¼�的一部分,也ä¸�能是函数的å�‚数,å�¦åˆ™æ— æ³•使用索引。 + +例如下é�¢çš„æŸ¥è¯¢ä¸�能使用 actor_id 列的索引: + +```sql +SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5; +``` + +### 3.2 å‰�缀索引 + +对于 BLOBã€�TEXT å’Œ VARCHAR 类型的列,必须使用å‰�缀索引,å�ªç´¢å¼•开始的部分字符。 + +对于å‰�缀长度的选å�–需è¦�æ ¹æ�® **索引选择性** æ�¥ç¡®å®šï¼šä¸�é‡�å¤�的索引值和记录总数的比值。选择性越高,查询效率也越高。最大值为 1 ,此时æ¯�个记录都有唯一的索引与其对应。 + +### 3.3 多列索引 + +在需è¦�使用多个列作为æ�¡ä»¶è¿›è¡ŒæŸ¥è¯¢æ—¶ï¼Œä½¿ç”¨å¤šåˆ—索引比使用多个å�•列索引性能更好。例如下é�¢çš„语å�¥ä¸­ï¼Œæœ€å¥½æŠŠ actor_id å’Œ file_id 设置为多列索引。 + +```sql +SELECT file_id, actor_ id FROM sakila.film_actor +WhERE actor_id = 1 OR film_id = 1; +``` + +### 3.4 索引列的顺åº� + +让选择性最强的索引列放在å‰�é�¢ï¼Œä¾‹å¦‚下é�¢æ˜¾ç¤ºçš„结果中 customer_id 的选择性比 staff_id 更高,因此最好把 customer_id 列放在多列索引的å‰�é�¢ã€‚ + +```sql +SELECT COUNT(DISTINCT staff_id)/COUNT(*) AS staff_id_selectivity, +COUNT(DISTINCT customer_id)/COUNT(*) AS customer_id_selectivity, +COUNT(*) +FROM payment; +``` + +```html + staff_id_selectivity: 0.0001 +customer_id_selectivity: 0.0373 + COUNT(*): 16049 +``` + +### 3.5 è�šç°‡ç´¢å¼• + +![](index_files/b9e9ae8c-e216-4c01-b267-a50dbeb98fa4.jpg) + +è�šç°‡ç´¢å¼•å¹¶ä¸�是一ç§�索引类型,而是一ç§�æ•°æ�®å­˜å‚¨æ–¹å¼�。 + +术语“è�šç°‡â€�表示数æ�®è¡Œå’Œç›¸é‚»çš„键值紧密地存储在一起,InnoDB çš„è�šç°‡ç´¢å¼•的数æ�®è¡Œå­˜æ”¾åœ¨ B-Tree çš„å�¶å­�页中。 + +因为无法把数æ�®è¡Œå­˜æ”¾åœ¨ä¸¤ä¸ªä¸�å�Œçš„地方,所以一个表å�ªèƒ½æœ‰ä¸€ä¸ªè�šç°‡ç´¢å¼•。 + +**优点** + +1. å�¯ä»¥æŠŠç›¸å…³æ•°æ�®ä¿�存在一起,å‡�å°‘ I/O æ“�作; +2. 因为数æ�®ä¿�存在 B-Tree 中,因此数æ�®è®¿é—®æ›´å¿«ã€‚ + +**缺点** + +1. è�šç°‡ç´¢å¼•最大é™�度æ��高了 I/O 密集型应用的性能,但是如果数æ�®å…¨éƒ¨æ”¾åœ¨å†…存,就没必è¦�用è�šç°‡ç´¢å¼•。 +2. æ�’入速度严é‡�ä¾�赖于æ�’入顺åº�,按主键的顺åº�æ�’入是最快的。 +3. æ›´æ–°æ“�作代价很高,因为æ¯�个被更新的行都会移动到新的ä½�置。 +4. 当æ�’入到æŸ�个已满的页中,存储引擎会将该页分裂æˆ�两个页é�¢æ�¥å®¹çº³è¯¥è¡Œï¼Œé¡µåˆ†è£‚会导致表å� ç”¨æ›´å¤šçš„ç£�盘空间。 +5. 如果行比较稀ç–�,或者由于页分裂导致数æ�®å­˜å‚¨ä¸�连续时,è�šç°‡ç´¢å¼•å�¯èƒ½å¯¼è‡´å…¨è¡¨æ‰«æ��速度å�˜æ…¢ã€‚ + +### 3.6 覆盖索引 + +索引包å�«æ‰€æœ‰éœ€è¦�查询的字段的值。 + +## 4. B-Tree å’Œ B+Tree 原ç�† + +### 4. 1 B-Tree + +![](index_files/5ed71283-a070-4b21-85ae-f2cbfd6ba6e1.jpg) + +为了æ��è¿° B-Tree,首先定义一æ�¡æ•°æ�®è®°å½•为一个二元组 [key, data],key 为记录的键,data 为数æ�®è®°å½•除 key 外的数æ�®ã€‚ + +B-Tree 是满足下列æ�¡ä»¶çš„æ•°æ�®ç»“构: + +- 所有å�¶èŠ‚ç‚¹å…·æœ‰ç›¸å�Œçš„æ·±åº¦ï¼Œä¹Ÿå°±æ˜¯è¯´ B-Tree 是平衡的; +- 一个节点中的 key 从左到å�³é�žé€’å‡�排列; +- 如果æŸ�个指针的左å�³ç›¸é‚» key 分别是 keyi å’Œ keyi+1,且ä¸�为 null,则该指针指å�‘节点的所有 key 大于 keyi 且å°�于 keyi+1。 + +在 B-Tree 中按 key 检索数æ�®çš„算法é�žå¸¸ç›´è§‚:首先从根节点进行二分查找,如果找到则返回对应节点的 data,å�¦åˆ™å¯¹ç›¸åº”区间的指针指å�‘的节点递归进行查找,直到找到节点或找到 null 指针,å‰�者查找æˆ�功,å�Žè€…查找失败。 + +由于æ�’入删除新的数æ�®è®°å½•会破å�� B-Tree 的性质,因此在æ�’入删除时,需è¦�对树进行一个分裂ã€�å�ˆå¹¶ã€�转移等æ“�作以ä¿�æŒ� B-Tree 性质。 + +### 4.2 B+Tree + +![](index_files/63cd5b50-d6d8-4df6-8912-ef4a1dd5ba13.jpg) + +与 B-Tree 相比,B+Tree 有以下ä¸�å�Œç‚¹ï¼š + +- æ¯�个节点的指针上é™�为 2d 而ä¸�是 2d+1ï¼› +- 内节点ä¸�存储 data,å�ªå­˜å‚¨ key,å�¶å­�节点ä¸�存储指针。 + +### 4.3 带有顺åº�访问指针的 B+Tree + +![](index_files/1ee5f0a5-b8df-43b9-95ab-c516c54ec797.jpg) + +一般在数æ�®åº“系统或文件系统中使用的 B+Tree 结构都在ç»�å…¸ B+Tree 基础上进行了优化,在å�¶å­�节点增加了顺åº�访问指针,å�šè¿™ä¸ªä¼˜åŒ–的目的是为了æ��高区间访问的性能。 + +### 4.4 为什么使用 B-Tree å’Œ B+Tree + +红黑树等数æ�®ç»“构也å�¯ä»¥ç”¨æ�¥å®žçŽ°ç´¢å¼•ï¼Œä½†æ˜¯æ–‡ä»¶ç³»ç»Ÿå�Šæ•°æ�®åº“系统普é��采用 B-/+Tree 作为索引结构。 + +页是计算机管ç�†å­˜å‚¨å™¨çš„逻辑å�—,硬件å�Šæ“�作系统往往将主存和ç£�盘存储区分割为连续的大å°�相等的å�—,æ¯�个存储å�—称为一页(在许多æ“�作系统中,页得大å°�通常为 4k),主存和ç£�盘以页为å�•ä½�交æ�¢æ•°æ�®ã€‚ + +一般æ�¥è¯´ï¼Œç´¢å¼•本身也很大,ä¸�å�¯èƒ½å…¨éƒ¨å­˜å‚¨åœ¨å†…存中,因此索引往往以索引文件的形å¼�存储的ç£�盘上。为了å‡�å°‘ç£�盘 I/O,ç£�盘往往ä¸�是严格按需读å�–,而是æ¯�次都会预读。这样å�šçš„ç�†è®ºä¾�æ�®æ˜¯è®¡ç®—机科学中著å��的局部性原ç�†ï¼šå½“一个数æ�®è¢«ç”¨åˆ°æ—¶ï¼Œå…¶é™„近的数æ�®ä¹Ÿé€šå¸¸ä¼šé©¬ä¸Šè¢«ä½¿ç”¨ã€‚æ•°æ�®åº“系统的设计者巧妙利用了ç£�盘预读原ç�†ï¼Œå°†ä¸€ä¸ªèŠ‚ç‚¹çš„å¤§å°�设为等于一个页,这样æ¯�个节点å�ªéœ€è¦�一次 I/O å°±å�¯ä»¥å®Œå…¨è½½å…¥ã€‚B-Tree 中一次检索最多需è¦� h-1 次 I/O(根节点常驻内存),æ¸�è¿›å¤�æ�‚度为 O(h)=O(logdN)。一般实际应用中,出度 d 是é�žå¸¸å¤§çš„æ•°å­—,通常超过 100,因此 h é�žå¸¸å°�(通常ä¸�超过 3)。而红黑树这ç§�结构,h 明显è¦�深的多。并且于逻辑上很近的节点(父å­�)物ç�†ä¸Šå�¯èƒ½å¾ˆè¿œï¼Œæ— æ³•利用局部性,效率明显比 B-Tree 差很多。 + +B+Tree 更适å�ˆå¤–存索引,原因和内节点出度 d 有关。由于 B+Tree 内节点去掉了 data 域,因此å�¯ä»¥æ‹¥æœ‰æ›´å¤§çš„出度,拥有更好的性能。 + +# 查询性能优化 + +## 1. Explain + +用æ�¥åˆ†æž� SQL 语å�¥ï¼Œåˆ†æž�结果中比较é‡�è¦�的字段有: + +- select_type : 查询类型,有简å�•查询ã€�è�”å�ˆæŸ¥è¯¢å’Œå­�查询 + +- key : 使用的索引 + +- rows : 扫æ��的行数 + +## 2. å‡�少返回的列 + +慢查询主è¦�是因为访问了过多数æ�®ï¼Œé™¤äº†è®¿é—®è¿‡å¤šè¡Œä¹‹å¤–,也包括访问过多列。 + +最好ä¸�è¦�使用 SELECT * 语å�¥ï¼Œè¦�æ ¹æ�®éœ€è¦�选择查询的列。 + +## 3. å‡�少返回的行 + +最好使用 LIMIT 语å�¥æ�¥å�–出想è¦�的那些行。 + +还å�¯ä»¥å»ºç«‹ç´¢å¼•æ�¥å‡�å°‘æ�¡ä»¶è¯­å�¥çš„全表扫æ��。例如对于下é�¢çš„语å�¥ï¼Œä¸�适用索引的情况下需è¦�进行全表扫æ��,而使用索引å�ªéœ€è¦�扫æ��几行记录å�³å�¯ï¼Œä½¿ç”¨ Explain 语å�¥å�¯ä»¥é€šè¿‡è§‚察 rows 字段æ�¥çœ‹å‡ºè¿™ç§�差异。 + +```sql +SELECT * FROM sakila.film_actor WHERE film_id = 1; +``` + +## 4. 拆分大的 DELETE 或 INSERT 语å�¥ + +如果一次性执行的è¯�,å�¯èƒ½ä¸€æ¬¡é”�ä½�很多数æ�®ã€�å� æ»¡æ•´ä¸ªäº‹åŠ¡æ—¥å¿—ã€�耗尽系统资æº�ã€�阻塞很多å°�的但é‡�è¦�的查询。 + +```sql +DELEFT FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH); +``` +```sql +rows_affected = 0 +do { + rows_affected = do_query( + "DELETE FROM messages WHERE create < DATE_SUB(NOW(), INTERVAL 3 MONTH) LIMIT 10000") +} while rows_affected > 0 +``` + +# 分库与分表 + +**1. 分表与分区的ä¸�å�Œ** + +分表,就是讲一张表分æˆ�多个å°�表,这些å°�表拥有ä¸�å�Œçš„表å��;而分区是将一张表的数æ�®åˆ†ä¸ºå¤šä¸ªåŒºå�—,这些区å�—å�¯ä»¥å­˜å‚¨åœ¨å�Œä¸€ä¸ªç£�盘上,也å�¯ä»¥å­˜å‚¨åœ¨ä¸�å�Œçš„ç£�盘上,这ç§�æ–¹å¼�下表ä»�ç„¶å�ªæœ‰ä¸€ä¸ªã€‚ + +**2. 使用分库与分表的原因** + +éš�ç�€æ—¶é—´å’Œä¸šåŠ¡çš„å�‘展,数æ�®åº“中的表会越æ�¥è¶Šå¤šï¼Œå¹¶ä¸”表中的数æ�®é‡�也会越æ�¥è¶Šå¤§ï¼Œé‚£ä¹ˆè¯»å†™æ“�作的开销也会éš�ç�€å¢žå¤§ã€‚ + +**3. 垂直切分** + +将表按功能模å�—ã€�关系密切程度划分出æ�¥ï¼Œéƒ¨ç½²åˆ°ä¸�å�Œçš„库上。例如,我们会建立商å“�æ•°æ�®åº“ payDBã€�用户数æ�®åº“ userDB 等,分别用æ�¥å­˜å‚¨é¡¹ç›®ä¸Žå•†å“�有关的表和与用户有关的表。 + +**4. 水平切分** + +把表中的数æ�®æŒ‰ç…§æŸ�ç§�规则存储到多个结构相å�Œçš„表中,例如按 id 的散列值ã€�性别等进行划分, + +**5. 垂直切分与水平切分的选择** + +如果数æ�®åº“中的表太多,并且项目å�„项业务逻辑清晰,那么垂直切分是首选。 + +如果数æ�®åº“的表ä¸�多,但是å�•表的数æ�®é‡�很大,应该选择水平切分。 + +**6. 水平切分的实现方å¼�** + +最简å�•的是使用 merge 存储引擎。 + +**7. 分库与分表存在的问题** + +(1) 事务问题 + +在执行分库分表之å�Žï¼Œç”±äºŽæ•°æ�®å­˜å‚¨åˆ°äº†ä¸�å�Œçš„库上,数æ�®åº“事务管ç�†å‡ºçŽ°äº†å›°éš¾ã€‚å¦‚æžœä¾�èµ–æ•°æ�®åº“本身的分布å¼�事务管ç�†åŠŸèƒ½åŽ»æ‰§è¡Œäº‹åŠ¡ï¼Œå°†ä»˜å‡ºé«˜æ˜‚çš„æ€§èƒ½ä»£ä»·ï¼›å¦‚æžœç”±åº”ç”¨ç¨‹åº�去å��助控制,形æˆ�程åº�逻辑上的事务,å�ˆä¼šé€ æˆ�编程方é�¢çš„负担。 + +(2) 跨库跨表连接问题 + +在执行了分库分表之å�Žï¼Œéš¾ä»¥é�¿å…�会将原本逻辑关è�”性很强的数æ�®åˆ’分到ä¸�å�Œçš„表ã€�ä¸�å�Œçš„库上。这时,表的连接æ“�作将å�—到é™�制,我们无法连接ä½�于ä¸�å�Œåˆ†åº“的表,也无法连接分表粒度ä¸�å�Œçš„表,导致原本å�ªéœ€è¦�一次查询就能够完æˆ�的业务需è¦�进行多次æ‰�能完æˆ�。 + +# 故障转移和故障æ�¢å¤� + +故障转移也å�«å�šåˆ‡æ�¢ï¼Œå½“主库出现故障时就切æ�¢åˆ°å¤‡åº“,使备库æˆ�为主库。故障æ�¢å¤�顾å��æ€�义就是从故障中æ�¢å¤�过æ�¥ï¼Œå¹¶ä¸”ä¿�è¯�æ•°æ�®çš„æ­£ç¡®æ€§ã€‚ + +## 1. 故障转移 + +**1.1 æ��å�‡å¤‡åº“或切æ�¢è§’色** + +æ��å�‡ä¸€å�°å¤‡åº“为主库,或者在一个主-主å¤�制结构中调整主动和被动角色。 + +**1.2 虚拟 IP 地å�€å’Œ IP 托管** + +为 MySQL 实例指定一个逻辑 IP 地å�€ï¼Œå½“ MySQL 实例失效时,å�¯ä»¥å°† IP 地å�€è½¬ç§»åˆ°å�¦ä¸€å�° MySQL æœ�务器上。 + +**1.3 中间件解决方案** + +通过代ç�†ï¼Œå�¯ä»¥è·¯ç”±æµ�é‡�到å�¯ä»¥ä½¿ç”¨çš„æœ�务器上。 + +![](index_files/fabd5fa0-b75e-48d0-9e2c-31471945ceb9.jpg) + +**1.4 在应用中处ç�†æ•…障转移** + +将故障转移整å�ˆåˆ°åº”用中å�¯èƒ½å¯¼è‡´åº”用å�˜å¾—太过笨拙。 + +## 2. æ•…éšœæ�¢å¤� + + +# å�‚考资料 + +- 高性能 MySQL +- [MySQL 索引背å�Žçš„æ•°æ�®ç»“æž„å�Šç®—法原ç�† ](http://blog.codinglabs.org/articles/theory-of-mysql-index.html) +- [MySQL 索引优化全攻略 ](http://www.runoob.com/w3cnote/mysql-index.html) +- [20+ æ�¡ MySQL 性能优化的最佳ç»�验 ](https://www.jfox.info/20-tiao-mysql-xing-nen-you-hua-de-zui-jia-jing-yan.html) \ No newline at end of file diff --git a/notes/笔记/PHP.md.txt b/notes/笔记/PHP.md.txt new file mode 100644 index 00000000..9556bd6d --- /dev/null +++ b/notes/笔记/PHP.md.txt @@ -0,0 +1 @@ + diff --git a/notes/笔记/Python 基本语法.md.txt b/notes/笔记/Python 基本语法.md.txt new file mode 100644 index 00000000..be80c9a5 --- /dev/null +++ b/notes/笔记/Python 基本语法.md.txt @@ -0,0 +1,548 @@ +[TOC] + +# 第 1 章 作为命令行脚本 + +第一行注释告诉 Linux/Unix 系统当执行程åº�的时候,它应该使用哪个解释器。 + +```python +#!/usr/bin/python +# Filename : helloworld.py +print 'Hello World' +``` + +需è¦�先给脚本设置å�¯æ‰§è¡Œçš„æ�ƒé™�。 + +```html +$ chmod a+x helloworld.py +$ ./helloworld.py +Hello World +``` + +通过以下命令å�¯ä»¥æŠŠä¸€ä¸ªæ–‡ä»¶å¤¹ä¸‹çš„脚本都添加到 PATH 目录下,则å�¯ä»¥åœ¨ä»»ä½•地方è¿�行该脚本。 + +```html +PATH=$PATH:/home/username/dir +``` + +print 函数会自动加æ�¢è¡Œç¬¦ï¼Œå�¯ä»¥åœ¨Â print 之å�ŽåР逗å�·Â , æ�¥å�–消æ�¢è¡Œã€‚ + +# 第 2 章 基本概念 + +## 2.1 å¤�æ•° + +(2.3-4.6j) + +## 2.2 字符串 + +å�•引å�·å’Œå�Œå¼•å�·è¡¨ç¤ºçš„字符串完全相å�Œï¼Œä¸‰å¼•å�·è¡¨ç¤ºçš„字符串中间å�¯ä»¥æœ‰å�•引å�·å’Œå�Œå¼•å�·ï¼Œå¹¶ä¸”å�¯ä»¥æ�¢è¡Œã€‚ + +```html +'''This is the first line. +This is the second line. +"What's your name?," I asked. +He said "Bond, James Bond." +''' +``` + +字符串行末的å��æ–œæ� è¡¨ç¤ºä¸‹ä¸€è¡Œç»§ç»­ã€‚ + +```html +"This is the first sentence.\ +This is the second sentence." +``` + +自然字符串用 r 作为å‰�缀,当ä¸�想让字符串中的内容转义时使用,比如正则表达å¼�。 + +```html +r"Newlines are indicated by \n" +``` + +Unicode 是书写国际文本的标准方法。在处ç�†æ–‡æœ¬æ–‡ä»¶çš„æ—¶å€™åº”该使用 Unicode 字符串,特别是这个文件å�«æœ‰ç”¨é�žè‹±è¯­çš„语言写的文本时使用。 + +```html +u"This is a Unicode string." +``` + +## 2.3 对象 + +Python 中用到的任何东西都被称为对象; + +## 2.4 逻辑行与物ç�†è¡Œ + +å�¯ä»¥å°†å¤šä¸ªé€»è¾‘行写在一个物ç�†è¡Œä¸­ï¼Œéœ€è¦�用分å�·åˆ†å‰²ï¼›å�¯ä»¥å°†ä¸€ä¸ªé€»è¾‘行写在多个物ç�†è¡Œä¸­ï¼Œéœ€è¦�在行末加 \ 。 + +## 2.5 缩进 + +å�Œä¸€å±‚次的语å�¥å¿…须拥有相å�Œçš„缩进。 + +# 第 3 章 è¿�算符 + +|  è¿�算符 | 说明  | +| --- | --- | +|  ** | 幂  | +|  // | å�–整除  | +|  % | å�–模,ä¸�å�–整  | +|  ~ | 按ä½�翻转,-(x+1) | +|  and | 与  | +|  or | 或  | +|  not | é�žÂ Â | + + +# 第 4 章 控制æµ� + +## 4.1 æ�¡ä»¶è¯­å�¥ + +Java 中的 else if 在 Python 中对应的语å�¥ä¸ºï¼šelif。 + +True False + +## 4.2 控制å�°è¾“å…¥ + +从控制å�°ä¸­è¾“入一行: + +``` +guess = int(raw_input('Enter an integer : ')) +``` + +## 4.3 循环 + +range(m, n, step),返回一个从 m 到 n,步长为 stap 的åº�列,ä¸�包å�«Â n 。 + +for å�Žé�¢çš„ else 语å�¥åœ¨Â break 退出的情况下ä¸�会执行: +``` +for i in range(1, 5): +      print i +else: +      print 'The for loop is over +``` + +len(str) 返回字符串的长度; + +# 第 5 章 函数 + +``` +def sayHello(): +    print 'hello world!' + +sayHello() +``` + +global 用æ�¥å£°æ˜Žå…¨å±€å�˜é‡�。 + +## 5.1 默认å�‚æ•° + +``` +def say(message, times = 1): +    print message * times + +say('Hello') +say('World', 5) +``` + +## 5.2 关键å�‚æ•° + +使用å��字而ä¸�是ä½�ç½®æ�¥æŒ‡å®šå�‚æ•° + +``` +def func(a, b=5, c=10): +    print 'a is', a, 'and b is', b, 'and c is', c + +func(3, 7) +func(25, c=24) +func(c=50, a=100) +``` + +## 5.3 return + +没有 return 语å�¥çš„函数默认 return None ,None 在 Python 中是指一个没有任何值的特殊类型。 + +## 5.4 DocStrings + +使用函数的 \_\_doc\_\_ 属性å�¯ä»¥è¿”回函数中的文档字符串。 + +``` +def printMax(x, y): +'''Prints the maximum of two numbers. +The two values must be integers.''' +x = int(x) +y = int(y) +if x > y: +    print x, 'is maximum' +else: +    print y, 'is maximum' + +printMax(3, 5) +print printMax.__doc__ +``` + +# 第 6 章 模å�— + +模å�—基本上就是一个包å�«å®šä¹‰å‡½æ•°å’Œå�˜é‡�的文件,使用 import 语å�¥å¯¼å…¥ä¸€ä¸ªæ¨¡å�—ï¼› + +``` +import sys +``` + +.pyc 是字节文件,会比æº�文件快很多,而且与平å�°æ— å…³ã€‚ + +使用 from sys import argv 之å�Žå�¯ä»¥ç›´æŽ¥åœ¨ä»£ç �中使用 argv ,而ä¸�用 sys.argv。但是为了易读性,最好ä¸�è¦�用这ç§�æ–¹å¼�。 + +\_\_name\_\_ 属性为一个模å�—çš„å��字。 + +``` +if __name__ == '__main__': +    print 'This program is being run by itself' +else: +    print 'I am being imported from another module +``` + +创建一个 python 文件之å�Žï¼Œè¦�使得å�¦ä¸€ä¸ªÂ python 文件å�¯ä»¥ä½¿ç”¨å®ƒï¼Œéœ€è¦�把它放在这个文件的å�Œç›®å½•下,或者把它放到 sys.path 目录下。 + +使用 . è¿�算符æ�¥å¼•用模å�—中的æˆ�员。 + +dir() 函数å�¯ä»¥åˆ—出一个模å�—的函数ã€�å�˜é‡�和类。 + +# 第 7 章 数æ�®ç»“æž„ + +## 7.1 列表 + +列表是处ç�†ä¸€ç»„有åº�的集å�ˆï¼Œå¹¶ä¸�说排好åº�了,而是有顺åº�。使用 [ ] æ�¥å®šä¹‰ä¸€ä¸ªåˆ—表。 + +```python +# This is my shopping list +shoplist = ['apple', 'mango', 'carrot', 'banana'] +print 'I have', len(shoplist),'items to purchase.' +print 'These items are:', # Notice the comma at end of the line +for item in shoplist: +     print item, +shoplist.append('rice') +shoplist.sort() +del shoplist[0] +``` + +## 7.2 元组 + +元组ä¸�å�¯å�˜ã€‚ + +一个元组å�¯ä»¥åŒ…å�«å�¦ä¸€ä¸ªå…ƒç»„。 + +使用 ( ) 定义一个元组。 + +``` +zoo = ('wolf', 'elephant', 'penguin') +new_zoo = ('monkey', 'dolphin', zoo) +print 'Last animal brought from old zoo is', new_zoo[2][2] +``` + +元组å�¯ä»¥ç”¨åœ¨æ‰“å�°è¯­å�¥ä¸­ã€‚ + +``` +age = 22 +name = 'Swaroop' +print '%s is %d years old' % (name, age) +print 'Why is %s playing with that python?' % name +``` + +## 7.3 字典 + +必须使用ä¸�å�¯å�˜çš„对象作为键。 + +d = {key1 : value1, key2 : value2 } 定义一个字典。 + +items() 方法返回所有 key。 + +has_key() 方法判断是å�¦å�«æœ‰ä¸€ä¸ªÂ key。 + +## 7.4 åº�列 + +字符串,元组和列表都是åº�列,åº�列主è¦�具有索引和切片æ“�作; + +简å�•å¤�制语å�¥ä¸�会创建拷è´�,è¦�æ‹·è´�一个åº�列时用切片æ“�作 + +``` +mylist = shoplist[:] +``` + +## 7.5 字符串 + +startwith() + +in æ“�作符å�¯ä»¥åˆ¤æ–­ä¸€ä¸ªç»™å®šå­—符串是å�¦åœ¨å�¦ä¸€ä¸ªå­—符串中。 + +find() 查找一个字符串在å�¦ä¸€ä¸ªå­—符串中的ä½�置,如果查找失败返回 -1。 + +# 第 8 章 é�¢å�‘对象 + +## 8.1 self + +self 类似于 java 中的 this 指针。 + +## 8.2 类 + +``` +class Person: +    pass # An empty block + +p = Person() +print p +``` + +## 8.3 对象的方法 + +方法和函数最主è¦�的区别是方法需è¦�传入一个 self å�˜é‡�。 + +``` +class Person: +    def sayHi(self): +       print 'Are you OK?' + +leijun = Person() +p.sayHi() +``` + +## 8.4 \_\_init\_\_() + +构造函数 + +``` +class Person: +  def __init__(self, name): +    self.name = name +  def sayHi(self): +    print 'Hello, my name is', self.name + +p = Person('Swaroop') +p.sayHi() +``` + +## 8.5 类与对象的方法 + +æˆ�员å��有å�Œä¸‹åˆ’线å‰�缀 \_\_ ,比如 \_\_init\_\_(),则为ç§�有æˆ�员。如果自己定义的类中æŸ�个æˆ�员想定义为ç§�有æˆ�员,则在该æˆ�员å��å‰�加å�•下划线 \_,虽然 Python 没有规定这样å�šå�¯ä»¥æŠŠæˆ�员å�˜æˆ�ç§�有æˆ�员,但是å�¯ä»¥ä½œä¸ºä¸€ç§�编程约定æ�¥ä½¿ç”¨ã€‚ + +## 8.6 \_\_del\_\_() + +æž�构函数 + +## 8.7 继承 + +``` +class Person: +    def __init__(self, name, age): +        self.__name = name +        self.__age = age + +class Worker(Person): +    def __init__(self, name, age, salary): +        Person.__init__(self, name, age) +        self.salary = salary +``` + +# 第 9 章 输入 / 输出 + +## 9.1 文件 + +``` +poem = '''\ +Programming is fun +When the work is done +if you wanna make your work also fun: +use Python! +''' +f = file('poem.txt', 'w') +f.write(poem) +f.close() + +f = file('poem.txt') +while True: +    line = f.readline() +    if len(line) == 0: +        break +    print line +f.close() + +``` + +## 9.2 åº�列化 + +pickle 模å�—å�¯ä»¥ç”¨äºŽå­˜å�–一个对象。 + +cPickle 功能完全相å�Œï¼Œä½†æ˜¯ç”¨Â c 语言编写的,速度快 1000 å€�ï¼› + +``` +import cPickle as p + +shoplistfile = 'shoplist.data' +shoplist = ['apple', 'mango', 'carrot'] + +f = file(shoplistfile, 'w') +p.dump(shoplist, f) +f.close() + +del shoplist + +f = file(shoplistfile) +storedlist = p.load(f) +print storedlist + +``` + +# 第 10 章 异常 + +## 10.1 try-except + +å�¯ä»¥è·Ÿä¸Šä¸€ä¸ªÂ else 从å�¥ï¼Œå½“没有异常å�‘生时会执行; + +``` +import sys +try: +    s = raw_input('Enter something --> ') +except EOFError: +    print '\nWhy did you do an EOF on me?' +    sys.exit() # exit the program +except: +    print '\nSome error/exception occurred.' +# here, we are not exiting the program +print 'Done' + +``` + +## 10.2 引å�‘异常 + +raise 语å�¥å�¯ä»¥å¼•å�‘一个异常,引å�‘的异常应该是 Error 或者 Exception 的类或者å­�类; + +``` +class MyException(Exception): +    def __init__(self): +        self.name = 'MyException' + +try: +    raise MyException +except MyException, e: +    print e.name +else: +    print 'nothing' +``` + +## 10.3 finally + +finally å�¯ä»¥ä¿�è¯�一个语å�¥å�—无论如何都会执行。 + +# 第 11 章 Python 标准库 + +## 11.1 sys 模å�— + +sys.argv å�‚数列表。 + +sys.stdin sys.stdout sys.stderr。 + +## 11.2 os 模å�— + +该模å�—包å�«äº†æ™®é��çš„æ“�作系统功能,使程åº�能够与平å�°æ— å…³ï¼› + +os.name 字符串指示你正在使用的平å�°ã€‚比如对于 Windows,它是 'nt' ,而对于 Linux/Unix 用户,它是 'posix'。 + +os.getcwd() 函数得到当å‰�工作目录,å�³å½“å‰� Python 脚本工作的目录路径。 + +os.getenv() 和 os.putenv() 函数分别用æ�¥è¯»å�–和设置环境å�˜é‡�。 + +os.listdir() 返回指定目录下的所有文件和目录å��。 + +os.remove() 函数用æ�¥åˆ é™¤ä¸€ä¸ªæ–‡ä»¶ã€‚ + +os.system() 函数用æ�¥è¿�行 shell 命令。 + +os.linesep 字符串给出当å‰�å¹³å�°ä½¿ç”¨çš„行终止符。例如,Windows 使用 '\r\n',Linux 用 '\n' 而 Mac 使用 '\r'。 + +os.path.split() 函数返回一个路径的目录å��和文件å��。 + +``` +os.path.split('/home/swaroop/byte/code/poem.txt') +('/home/swaroop/byte/code', 'poem.txt') +``` + +os.path.isfile() 和 os.path.isdir() 函数分别检验给出的路径是一个文件还是目录。类似地,os.path.exists() 函数用æ�¥æ£€éªŒç»™å‡ºçš„路径是å�¦çœŸåœ°å­˜åœ¨ã€‚ + +# 第 12 章 更多 Python 的内容 + +## 12.1 特殊的方法 + +特殊的方法主è¦�用于模仿æŸ�个行为。 + +| å��称 | 说明 | +| ------------ | ------------ | +| __init__(self,...) | 这个方法在新建对象æ�°å¥½è¦�被返回使用之å‰�被调用。 | +| __del__(self) | æ�°å¥½åœ¨å¯¹è±¡è¦�被删除之å‰�调用。 | +| __str__(self) | 在我们对对象使用 print 语å�¥æˆ–是使用 str() 的时候调用。 | +| __lt__(self, other) | 当使用 å°�于 è¿�算符(<)的时候调用。类似地,对于所有的è¿�算符(+,> 等等)都有特殊的方法。 | +| __getitem__(self, key) | 使用 x[key] 索引æ“�作符的时候调用。 | +| __len__(self) | 对åº�列对象使用内建的 len() 函数的时候调用。 | + +## 12.2 列表综å�ˆ + +``` +listone = [2, 3, 4] +listtwo = [2*i for i in listone if i > 2] +print listtwo +``` + +## 12.3 在函数中接å�—元组和列表 + +``` +def powersum(power, *args): +  total = 0 +  for i in args: +  total += pow(i, power) +  return tota +``` + +由于在 args å�˜é‡�å‰�有 \* å‰�缀,所有多余的函数å�‚数都会作为一个元组存储在 args 中。如果使用的是 \*\* å‰�缀,多余的å�‚数则会被认为是一个字典的 键 / 值 对。 + +## 12.4 lambada 形å¼� + +lambda 语å�¥è¢«ç”¨æ�¥åˆ›å»ºæ–°çš„函数对象,并且在è¿�行时返回它们。 + +``` +def make_repeater(n): +  return lambda s: s*n +twice = make_repeater(2) +print twice('word') +print twice(5) + +wordword +10 +``` + +## 12.5 exec 和 eval() + +``` +exec 'print "Hello World"' +eval('2*3') +``` + +## 12.6 assert 语å�¥ + +asser t 断言在é�žçœŸæ—¶ä¼šå¼•å�‘一个 AssertionErro。 + +``` +mylist = ['item'] +assert len(mylist) >= 1 +``` + +## 12.7 repr() 函数 + +repr() 函数和å��引å�·ç”¨æ�¥èŽ·å�–对象的å�¯æ‰“å�°çš„表示形å¼�。 + +å�¯ä»¥é€šè¿‡å®šä¹‰ç±»çš„\_\_repr\_\_() 方法æ�¥æŽ§åˆ¶ä½ çš„对象在被 repr 函数调用的时候返回的内容。 + +``` +>>> i = [] +>>> i.append('item') +>>> `i` +"['item']" +>>> repr(i) +"['item'] +``` + +# å�‚考资料 + +1. 《简明 Python 教程》 \ No newline at end of file diff --git a/notes/笔记/Python 知识点扩展.md.txt b/notes/笔记/Python 知识点扩展.md.txt new file mode 100644 index 00000000..dc4dbac2 --- /dev/null +++ b/notes/笔记/Python 知识点扩展.md.txt @@ -0,0 +1,471 @@ +[TOC] + + +# 实现å�•例模å¼� + +## 1 使用\_\_new\_\_方法 + +```python +class Singleton(object): +    def __new__(cls, *args, **kw): +        if not hasattr(cls, '_instance'): +            orig = super(Singleton, cls) +            cls._instance = orig.__new__(cls, *args, **kw) +        return cls._instance + +class MyClass(Singleton): +    a = 1 +``` + +## 2 共享属性 + +创建实例时把所有实例的`__dict__`指å�‘å�Œä¸€ä¸ªå­—典 , 这样它们具有相å�Œçš„属性和方法 . + +```python + +class Borg(object): +    _state = {} +    def __new__(cls, *args, **kw): +        ob = super(Borg, cls).__new__(cls, *args, **kw) +        ob.__dict__ = cls._state +        return ob + +class MyClass2(Borg): +    a = 1 +``` + +## 3 装饰器版本 + +```python +def singleton(cls, *args, **kw): +    instances = {} +    def getinstance(): +        if cls not in instances: +            instances[cls] = cls(*args, **kw) +        return instances[cls] +    return getinstance + +@singleton +class MyClass: +  ... +``` + +## 4 import 方法 + +作为 python 的模å�—是天然的å�•例模å¼� + +```python +# mysingleton.py +class My_Singleton(object): +    def foo(self): +        pass + +my_singleton = My_Singleton() + +# to use +from mysingleton import my_singleton + +my_singleton.foo() + +``` + + + +# 垃圾回收机制 + +Python GC 主è¦�使用引用计数(reference counting)æ�¥è·Ÿè¸ªå’Œå›žæ”¶åžƒåœ¾ã€‚在引用计数的基础上,通过“标记 - 清除â€�(mark and sweep)解决容器对象å�¯èƒ½äº§ç”Ÿçš„循环引用问题,通过“分代回收â€�(generation collection)以空间æ�¢æ—¶é—´çš„æ–¹æ³•æ��高垃圾回收效率。 + +## 1 引用计数 + +PyObject 是æ¯�个对象必有的内容,其中`ob_refcnt`就是å�šä¸ºå¼•用计数。当一个对象有新的引用时,它的`ob_refcnt`就会增加,当引用它的对象被删除,它的`ob_refcnt`就会å‡�少 . 引用计数为 0 时,该对象生命就结æ�Ÿäº†ã€‚ + +优点 : + +1. 简å�• +2. 实时性 + +缺点 : + +1. 维护引用计数消耗资æº� +2. 循环引用 + +## 2 标记 - 清除机制 + +基本æ€�路是先按需分é…�,等到没有空闲内存的时候从寄存器和程åº�栈上的引用出å�‘,é��历以对象为节点ã€�以引用为边构æˆ�的图,把所有å�¯ä»¥è®¿é—®åˆ°çš„对象打上标记,然å�Žæ¸…扫一é��内存空间,把所有没标记的对象释放。 + +## 3 分代技术 + +分代回收的整体æ€�想是:将系统中的所有内存å�—æ ¹æ�®å…¶å­˜æ´»æ—¶é—´åˆ’分为ä¸�å�Œçš„集å�ˆï¼Œæ¯�个集å�ˆå°±æˆ�为一个“代â€�,垃圾收集频率éš�ç�€â€œä»£â€�的存活时间的增大而å‡�å°�,存活时间通常利用ç»�过几次垃圾回收æ�¥åº¦é‡�。 + +Python 默认定义了三代对象集å�ˆï¼Œç´¢å¼•数越大,对象存活时间越长。 + +举例: +当æŸ�些内存å�— M ç»�过了 3 次垃圾收集的清洗之å�Žè¿˜å­˜æ´»æ—¶ï¼Œæˆ‘们就将内存å�— M 划到一个集å�ˆÂ A 中去,而新分é…�的内存都划分到集å�ˆÂ B 中去。当垃圾收集开始工作时,大多数情况都å�ªå¯¹é›†å�ˆÂ B 进行垃圾回收,而对集å�ˆÂ A 进行垃圾回收è¦�隔相当长一段时间å�Žæ‰�进行,这就使得垃圾收集机制需è¦�处ç�†çš„内存少了,效率自然就æ��高了。在这个过程中,集å�ˆÂ B 中的æŸ�些内存å�—由于存活时间长而会被转移到集å�ˆÂ A 中,当然,集å�ˆÂ A 中实际上也存在一些垃圾,这些垃圾的回收会因为这ç§�分代的机制而被延迟。 + +# list 实现 + +https://www.jianshu.com/p/J4U6rR + +# Python 2 和 3 的区别 + +http://chenqx.github.io/2014/11/10/Key-differences-between-Python-2-7-x-and-Python-3-x/ + +# 去除列表中é‡�å¤�的数 + +```python +a = [1, 2, 4, 2, 4, 5, 6, 5, 7, 8, 9, 0] +a = list(set(a)) +``` + +# 替æ�¢å­—符串 + +使用 replace() 函数 + +```python +str = "aaa bbb ccc" +str = str.replace("aaa", "111") +``` + +使用 re 模å�—的 sub() 函数进行查询和替æ�¢ã€‚ + +```python +import re + +str = "aaa bbb ccc" +rex = r'(aaa|bbb)' +str = re.sub(rex, "111", str) +``` + +# read, readline 和 readlines + +- read 读å�–整个文件 +- readline 读å�–下一行 , 使用生æˆ�器方法 +- readlines 读å�–整个文件到一个迭代器以供我们é��历 + +# is 与 == + +is 比较地å�€ï¼Œ== 比较值 + + +# å�¯å�˜å¯¹è±¡ä¸Žä¸�å�¯å�˜å¯¹è±¡ + +在 python 中,strings, tuples, 和 numbers 是ä¸�å�¯æ›´æ”¹çš„对象,而 list, dict, set 等则是å�¯ä»¥ä¿®æ”¹çš„对象。 + +当一个å�˜é‡�引用了一个ä¸�å�¯å�˜å¯¹è±¡æ—¶ï¼Œå�˜é‡�值å�‘生改å�˜ï¼Œå�˜é‡�所引用的对象也å�‘生改å�˜ï¼Œä¹Ÿå°±æ˜¯å¯¹è±¡å¼•用的地å�€ä¹Ÿå�‘生了改å�˜ã€‚ + +# é�™æ€�方法和类方法 + +Python 其实有 3 个方法 , å�³é�™æ€�方法 (staticmethod), 类方法 (classmethod) 和对象方法。 + +其中对象方法的第一个å�‚数 selft,在使用类对象调用时会将对象éš�å¼�传入;类方法的第一个å�‚数 cls,在使用类调用时会将类éš�å¼�传入;而é�™æ€�方法没有éš�å¼�å�‚数。 + +```python +def foo(x): +    print "executing foo(%s)"%(x) + +class A(object): +    def foo(self, x): +        print "executing foo(%s,%s)"%(self, x) + +    @classmethod +    def class_foo(cls, x): +        print "executing class_foo(%s,%s)"%(cls, x) + +    @staticmethod +    def static_foo(x): +        print "executing static_foo(%s)"%x + +``` + +详情:[What is the difference between @staticmethod and @classmethod in Python? +](https://stackoverflow.com/questions/136097/what-is-the-difference-between-staticmethod-and-classmethod-in-python) + +# 拷è´� + +赋值创建了对象的一个新的引用;浅拷è´�创建一个新的对象,但它包å�«çš„æ˜¯å¯¹åŽŸå§‹å¯¹è±¡ä¸­åŒ…å�«é¡¹çš„引用,而深拷è´�会递归的å¤�制它所包å�«çš„对象。 + +创建浅拷è´�的方å¼�: + +- 完全切片方法; +- 工厂函数,如 list()ï¼› +- copy 模å�—的 copy() 函数 + +创建深拷è´�的方å¼�: + +- copy 模å�—的 deepcopy() 函数 + + +```python +import copy +a = [1, 2, 3, 4, ['a', 'b']]  # 原始对象 + +b = a  # 赋值,传对象的引用 +c = copy.copy(a)  # 对象拷è´�,浅拷è´� +d = copy.deepcopy(a)  # 对象拷è´�,深拷è´� + +a.append(5)  # 修改对象 a +a[4].append('c')  # 修改对象 a 中的 ['a', 'b'] 数组对象 + +print 'a = ', a +print 'b = ', b +print 'c = ', c +print 'd = ', d + +输出结果: +a =  [1, 2, 3, 4, ['a', 'b', 'c'], 5] +b =  [1, 2, 3, 4, ['a', 'b', 'c'], 5] +c =  [1, 2, 3, 4, ['a', 'b', 'c']] +d =  [1, 2, 3, 4, ['a', 'b']] +``` + +# 作用域 + +当 Python é�‡åˆ°ä¸€ä¸ªå�˜é‡�çš„è¯�他会按照这样的顺åº�进行æ�œç´¢ï¼š + +本地作用域(Local)→当å‰�作用域被嵌入的本地作用域(Enclosing locals)→全局 / 模å�—作用域(Global)→内置作用域(Built-in) + + + +# 类å�˜é‡�与实例å�˜é‡� + +```python +class Test(object): +    num_of_instance = 0 +    def __init__(self, name): +        self.name = name +        Test.num_of_instance += 1 + +if __name__ == '__main__': +    print Test.num_of_instance   # 0 +    t1 = Test('jack') +    print Test.num_of_instance   # 1 +    t2 = Test('lucy') +    print t1.name , t1.num_of_instance  # jack 2 +    print t2.name , t2.num_of_instance  # lucy 2 +``` + +# 自çœ� + +类似于 Java 的å��å°„ + +```python +a = [1, 2, 3] +b = {'a':1,'b':2,'c':3} +c = True +print type(a), type(b), type(c) #    +print isinstance(a, list)  # True +``` + +# 字典推导å¼� + +```python +d = {key: value for (key, value) in iterable} +``` + +# å�•下划线和å�Œä¸‹åˆ’线 + +```python +>>> class MyClass(): +...     def __init__(self): +...             self.__superprivate = "Hello" +...             self._semiprivate = ", world!" +... +>>> mc = MyClass() +>>> print mc.__superprivate +Traceback (most recent call last): +  File "", line 1, in  +AttributeError: myClass instance has no attribute '__superprivate' +>>> print mc._semiprivate +, world! +>>> print mc.__dict__ +{'_MyClass__superprivate': 'Hello', '_semiprivate': ', world!'} +``` + +\_\_foo\_\_: 一ç§�约定 , Python 内部的å��字 , 用æ�¥åŒºåˆ«å…¶ä»–用户自定义的命å�� , 以防冲çª�,就是例如\_\_init\_\_(),\_\_del\__(),\__call\__() 这些特殊方法 + +\_foo: 一ç§�约定 , 用æ�¥æŒ‡å®šå�˜é‡�ç§�有 . 程åº�员用æ�¥æŒ‡å®šç§�有å�˜é‡�的一ç§�æ–¹å¼� . ä¸�能用 from module import * 导入,其他方é�¢å’Œå…¬æœ‰ä¸€æ ·è®¿é—®ï¼› + +\_\_foo: 这个有真正的æ„�义 : 解æž�器用\_classname\_\_foo æ�¥ä»£æ›¿è¿™ä¸ªå��字 , 以区别和其他类相å�Œçš„命å�� , 它无法直接åƒ�公有æˆ�员一样éš�便访问 , 通过对象å�� .\_ç±»å��\_\_xxx 这样的方å¼�å�¯ä»¥è®¿é—®Â . + +# 迭代器和生æˆ�器 + +这里有个关于生æˆ�器的创建问题é�¢è¯•官有考: 问: 将列表生æˆ�å¼�中 [] 改æˆ� () 之å�Žæ•°æ�®ç»“构是å�¦æ”¹å�˜ï¼ŸÂ ç­”案:是,从列表å�˜ä¸ºç”Ÿæˆ�器 + +```python +>>> L = [x*x for x in range(10)] +>>> L +[0, 1, 4, 9, 16, 25, 36, 49, 64, 81] +>>> g = (x*x for x in range(10)) +>>> g + at 0x0000028F8B774200> +``` + +通过列表生æˆ�å¼�,å�¯ä»¥ç›´æŽ¥åˆ›å»ºä¸€ä¸ªåˆ—表。但是,å�—到内存é™�制,列表容é‡�肯定是有é™�的。而且,创建一个包å�«ç™¾ä¸‡å…ƒç´ çš„列表,ä¸�仅是å� ç”¨å¾ˆå¤§çš„内存空间,如:我们å�ªéœ€è¦�访问å‰�é�¢çš„几个元素,å�Žé�¢å¤§éƒ¨åˆ†å…ƒç´ æ‰€å� çš„空间都是浪费的。因此,没有必è¦�创建完整的列表(节çœ�大é‡�内存空间)。在 Python 中,我们å�¯ä»¥é‡‡ç”¨ç”Ÿæˆ�器:边循环,边计算的机制—>generator + +http://stackoverflow.com/questions/231767/what-does-the-yield-keyword-do-in-python + +10 \*args and \*\*kwargs +用\*args 和\*\*kwargs å�ªæ˜¯ä¸ºäº†æ–¹ä¾¿å¹¶æ²¡æœ‰å¼ºåˆ¶ä½¿ç”¨å®ƒä»¬Â . + +当你ä¸�确定你的函数里将è¦�传递多少å�‚æ•°æ—¶ä½ å�¯ä»¥ç”¨\*args. 例如 , 它å�¯ä»¥ä¼ é€’ä»»æ„�æ•°é‡�çš„å�‚数 : +```python +>>> def print_everything(*args): +        for count, thing in enumerate(args): +...         print '{0}. {1}'.format(count, thing) +... +>>> print_everything('apple', 'banana', 'cabbage') +0. apple +1. banana +2. cabbage +``` +相似的 ,\*\*kwargs å…�许你使用没有事先定义的å�‚æ•°å�� : +```python +>>> def table_things(**kwargs): +...     for name, value in kwargs.items(): +...         print '{0} = {1}'.format(name, value) +... +>>> table_things(apple = 'fruit', cabbage = 'vegetable') +cabbage = vegetable +apple = fruit +``` +你也å�¯ä»¥æ··ç�€ç”¨Â . 命å��å�‚数首先获得å�‚数值然å�Žæ‰€æœ‰çš„å…¶ä»–å�‚数都传递给\*args 和\*\*kwargs. 命å��å�‚数在列表的最å‰�端 . 例如 : + +```python +def table_things(titlestring, **kwargs) +``` +\*args 和*\\*kwargs å�¯ä»¥å�Œæ—¶åœ¨å‡½æ•°çš„定义中 , 但是\*args 必须在\**\kwargs å‰�é�¢Â . + +当调用函数时你也å�¯ä»¥ç”¨\*å’Œ\*\*语法 . 例如 : +```python +>>> def print_three_things(a, b, c): +...     print 'a = {0}, b = {1}, c = {2}'.format(a, b, c) +... +>>> mylist = ['aardvark', 'baboon', 'cat'] +>>> print_three_things(*mylist) + +a = aardvark, b = baboon, c = cat +``` + +å°±åƒ�你看到的一样 , 它å�¯ä»¥ä¼ é€’列表 ( 或者元组 ) 的æ¯�一项并把它们解包 . 注æ„�必须与它们在函数里的å�‚数相å�»å�ˆÂ . 当然 , 你也å�¯ä»¥åœ¨å‡½æ•°å®šä¹‰æˆ–者函数调用时用*. + +http://stackoverflow.com/questions/3394835/args-and-kwargs + +# é�¢å�‘切é�¢ç¼–程 AOP 和装饰器 + +装饰器是一个很著å��的设计模å¼�,ç»�常被用于有切é�¢éœ€æ±‚的场景,较为ç»�典的有æ�’入日志ã€�性能测试ã€�事务处ç�†ç­‰ã€‚装饰器是解决这类问题的ç»�佳设计,有了装饰器,我们就å�¯ä»¥æŠ½ç¦»å‡ºå¤§é‡�函数中与函数功能本身无关的雷å�Œä»£ç �å¹¶ç»§ç»­é‡�用。概括的讲,装饰器的作用就是为已ç»�存在的对象添加é¢�外的功能。 + +这个问题比较大 , 推è�� : http://stackoverflow.com/questions/739654/how-can-i-make-a-chain-of-function-decorators-in-python + +# 鸭å­�类型 + +“当看到一å�ªé¸Ÿèµ°èµ·æ�¥åƒ�鸭å­�ã€�游泳起æ�¥åƒ�鸭å­�ã€�å�«èµ·æ�¥ä¹Ÿåƒ�鸭å­�,那么这å�ªé¸Ÿå°±å�¯ä»¥è¢«ç§°ä¸ºé¸­å­�。â€� + +我们并ä¸�关心对象是什么类型,到底是ä¸�是鸭å­�,å�ªå…³å¿ƒè¡Œä¸ºã€‚ + +比如在 python 中,有很多 file-like 的东西,比如 StringIO, GzipFile, socket。它们有很多相å�Œçš„æ–¹æ³•,我们把它们当作文件使用。 + +å�ˆæ¯”如 list.extend() 方法中 , 我们并ä¸�关心它的å�‚数是ä¸�是 list, å�ªè¦�它是å�¯è¿­ä»£çš„ , 所以它的å�‚æ•°å�¯ä»¥æ˜¯Â list/tuple/dict/ 字符串 / 生æˆ�器等 . + +鸭å­�类型在动æ€�语言中ç»�常使用,é�žå¸¸ç�µæ´»ï¼Œä½¿å¾— python ä¸�想 java 那样专门去弄一大堆的设计模å¼�。 + +# é‡�è½½ + +缺çœ�å�‚数实现é‡�载。 + +http://www.zhihu.com/question/20053359 + +# 新å¼�类和旧å¼�ç±» + +这篇文章很好的介ç»�了新å¼�类的特性 : http://www.cnblogs.com/btchenguang/archive/2012/09/17/2689146.html + +æ–°å¼�类很早在 2.2 就出现了 , 所以旧å¼�类完全是兼容的问题 , Python3 里的类全部都是新å¼�类 . 这里有一个 MRO 问题å�¯ä»¥äº†è§£ä¸‹Â ( 新å¼�类是广度优先 , 旧å¼�类是深度优先 ), 里讲的也很多 . + +一个旧å¼�类的深度优先的例å­� + +```python +class A(): +    def foo1(self): +        print "A" +class B(A): +    def foo2(self): +        pass +class C(A): +    def foo1(self): +        print "C" +class D(B, C): +    pass + +d = D() +d.foo1() + +# A +``` + +**按照ç»�典类的查找顺åº�`从左到å�³æ·±åº¦ä¼˜å…ˆ`的规则,在访问`d.foo1()`的时候 , D 这个类是没有的 .. 那么往上查找 , 先找到 B, 里é�¢æ²¡æœ‰Â , 深度优先 , 访问 A, 找到了 foo1(), 所以这时候调用的是 A 的 foo1(),从而导致 C é‡�写的 foo1() 被绕过** + +__new__是一个é�™æ€�方法 , 而__init__是一个实例方法 . +__new__方法会返回一个创建的实例 , 而__init__什么都ä¸�返回 . +å�ªæœ‰åœ¨__new__返回一个 cls 的实例时å�Žé�¢çš„__init__æ‰�能被调用 . +当创建一个新实例时调用__new__, åˆ�始化一个实例时用__init__. + +# `__new__`å’Œ`__init__`的区别 + +这个`__new__`确实很少è§�到 , 先å�šäº†è§£å�§Â . + +1. `__new__`是一个é�™æ€�方法 , 而`__init__`是一个实例方法 . +2. `__new__`方法会返回一个创建的实例 , 而`__init__`什么都ä¸�返回 . +3. å�ªæœ‰åœ¨`__new__`返回一个 cls 的实例时å�Žé�¢çš„`__init__`æ‰�能被调用 . +4. 当创建一个新实例时调用`__new__`, åˆ�始化一个实例时用`__init__`. + +[stackoverflow](http://stackoverflow.com/questions/674304/pythons-use-of-new-and-init) + +# lambda 函数 + +其实就是一个匿å��函数 , 为什么å�«Â lambda? 因为和å�Žé�¢çš„函数å¼�编程有关 . + +推è�� : [ 知乎 ](http://www.zhihu.com/question/20125256) + +# Python 函数å¼�编程 + +推è�� : [ 酷壳 ](http://coolshell.cn/articles/10822.html) + +python 中函数å¼�编程支æŒ� : + +filter 函数的功能相当于过滤器。调用一个布尔函数 bool_func æ�¥è¿­ä»£é��历æ¯�个 seq 中的元素;返回一个使 bool_seq 返回值为 true 的元素的åº�列。 + +```python +>>>a = [1, 2, 3, 4, 5, 6, 7] +>>>b = filter(lambda x: x > 5, a) +>>>print b +>>>[6, 7] +``` + +map 函数是对一个åº�列的æ¯�个项ä¾�次执行函数,下é�¢æ˜¯å¯¹ä¸€ä¸ªåº�列æ¯�个项都乘以 2: + +```python +>>> a = map(lambda x:x*2,[1, 2, 3]) +>>> list(a) +[2, 4, 6] +``` + +reduce 函数是对一个åº�列的æ¯�个项迭代调用函数,下é�¢æ˜¯æ±‚ 3 的阶乘: + +```python +>>> reduce(lambda x, y:x*y, range(1, 4)) +6 +``` + +# 闭包 + +闭包 (closure) 是函数å¼�编程的é‡�è¦�的语法结构。 + +创建一个闭包必须满足以下几点 : + +1. 必须有一个内嵌函数 +2. 内嵌函数必须引用外部函数中的å�˜é‡� +3. 外部函数的返回值必须是内嵌函数 + + +# å�‚考资料 + +- [Github:interview_python](https://github.com/taizilongxu/interview_python) \ No newline at end of file diff --git a/notes/笔记/Redis.md.txt b/notes/笔记/Redis.md.txt new file mode 100644 index 00000000..9c3bcc69 --- /dev/null +++ b/notes/笔记/Redis.md.txt @@ -0,0 +1,284 @@ +[TOC] + +# Redis是什么 + +Redis 是速度é�žå¸¸å¿«çš„é�žå…³ç³»åž‹ï¼ˆnosql)内存键值数æ�®åº“,å�¯ä»¥å­˜å‚¨é”®å’Œäº”ç§�ä¸�å�Œç±»åž‹çš„值之间的映射。 + +五ç§�类型数æ�®ç±»åž‹ä¸ºï¼šå­—符串ã€�列表ã€�集å�ˆã€�有åº�集å�ˆã€�散列表。 + +Redis 支æŒ�很多特性,例如å�¯ä»¥å°†å†…存中的数æ�®æŒ�久化到硬盘中,å�¯ä»¥ä½¿ç”¨å¤�制æ�¥æ‰©å±•读性能,å�¯ä»¥ä½¿ç”¨åˆ†ç‰‡æ�¥æ‰©å±•写性能。 + +# Redis的五ç§�基本类型 + +| 数æ�®ç±»åž‹Â | å�¯ä»¥å­˜å‚¨çš„值 | æ“�作 | +| -- | -- | -- | +| STRING | 字符串ã€�整数或者浮点数 | 对整个字符串或者字符串的其中一部分执行æ“�作;
 对整数和浮点数执行自增或者自��作 | +| LIST | 链表 | 从两端压入或者弹出元素;
 读��个或者多个元素;
 进行修剪,��留一个范围内的元素。 | +| SET | 无�集� | 添加�获��移除�个元素;
 检查一个元素是�存在于集�中;
 计算交集�并集�差集;
 从集�里��机获�元素。 | +| HASH | 包�键值对的无�散列表 | 添加�获��移除�个键值对;
 获�所有键值对;
 检查�个键是�存在。| +| ZSET | 有�集�1 | 添加�获��删除元素个元素;
 根�分值范围或者�员�获�元素;
 计算一个键的排å��。 | + +注 1:有åº�集å�ˆçš„æ¯�个集å�ˆå…ƒç´ éƒ½å¯¹åº”一个分值,根æ�®è¿™ä¸ªåˆ†å€¼çš„大å°�æ�¥å¯¹é›†å�ˆå…ƒç´ è¿›è¡ŒæŽ’åº�。有因此有åº�集å�ˆç›¸å½“于是有åº�的散列表,键是集å�ˆå…ƒç´ ï¼Œå€¼ä¸ºå…ƒç´ å¯¹åº”的分值。 + +# 键的过期时间 + +Redis å�¯ä»¥ä¸ºæ¯�个键设置过期时间,当键过期时,会自动删除该键。 + +对于散列表这ç§�容器,å�ªèƒ½ä¸ºæ•´ä¸ªé”®è®¾ç½®è¿‡æœŸæ—¶é—´ï¼ˆæ•´ä¸ªæ•£åˆ—表),而ä¸�能为键里é�¢çš„å�•个元素设置过期时间。 + +过期时间对于清ç�†ç¼“存数æ�®é�žå¸¸æœ‰ç”¨ã€‚ + +# å�‘布与订阅 + +å�‘布与订阅实际上是观察者模å¼�,订阅者订阅了频é�“之å�Žï¼Œå�‘布者å�‘频é�“å�‘é€�字符串消æ�¯ä¼šè¢«æ‰€æœ‰è®¢é˜…者接收到。 + +å�‘布与订阅有一些问题,很少使用它,而是使用替代的解决方案。问题如下: + +1. 如果订阅者读å�–消æ�¯çš„速度很慢,会使得消æ�¯ä¸�断积压在å�‘布者的输出缓存区中,造æˆ�内存å� ç”¨è¿‡å¤šï¼› +2. 如果订阅者在执行订阅的过程中网络出现问题,那么就会丢失断线期间å�‘é€�的所有消æ�¯ã€‚ + +# 事务 + +Redis 最简å�•的事务实现方å¼�是使用 MULTI 和 EXEC 命令将事务æ“�作包围起æ�¥ã€‚ + +MULTI 和 EXEC 中的æ“�作将会一次性å�‘é€�ç»™æœ�务器,而ä¸�是一æ�¡ä¸€æ�¡å�‘é€�,这ç§�æ–¹å¼�称为æµ�水线,它å�¯ä»¥å‡�少客户端与æœ�务器之间的网络通信次数从而æ��å�‡æ€§èƒ½ã€‚ + +# æŒ�久化 + +Redis 是内存型数æ�®åº“,为了ä¿�è¯�æ•°æ�®åœ¨æ–­ç”µå�Žä¸�会丢失,需è¦�将内存中的数æ�®æŒ�久化到硬盘上。 + +## 1. 快照æŒ�久化 + +å°†æŸ�个时间点的所有数æ�®éƒ½å­˜æ”¾åˆ°ç¡¬ç›˜ä¸Šã€‚ + +å�¯ä»¥å°†å¿«ç…§å¤�制到其它æœ�务器从而创建具有相å�Œæ•°æ�®çš„æœ�务器副本。 + +如果系统å�‘生故障,将会丢失最å�Žä¸€æ¬¡åˆ›å»ºå¿«ç…§ä¹‹å�Žçš„æ•°æ�®ã€‚并且如果数æ�®é‡�很大,ä¿�存快照的时间也会很长。 + +## 2. AOF æŒ�久化 + +AOF æŒ�久化将写命令添加到 AOF 文件(Append Only File)的末尾。 + +对硬盘的文件进行写入时,写入的内容首先会被存储到缓冲区,然å�Žç”±æ“�作系统决定什么时候将该内容å�Œæ­¥åˆ°ç¡¬ç›˜ï¼Œç”¨æˆ·å�¯ä»¥è°ƒç”¨Â file.flush() 方法请求æ“�作系统尽快将缓冲区存储的数æ�®å�Œæ­¥åˆ°ç¡¬ç›˜ã€‚因此将写命令添加到 AOF 文件时,è¦�æ ¹æ�®éœ€æ±‚æ�¥ä¿�è¯�何时将添加的数æ�®å�Œæ­¥åˆ°ç¡¬ç›˜ä¸Šï¼Œæœ‰ä»¥ä¸‹å�Œæ­¥é€‰é¡¹ï¼š + +| 选项 | å�Œæ­¥é¢‘率 | +| -- | -- | +| always | æ¯�个写命令都å�Œæ­¥Â | +| everysec | æ¯�ç§’å�Œæ­¥ä¸€æ¬¡Â | +| no | 让æ“�作系统æ�¥å†³å®šä½•æ—¶å�Œæ­¥Â | + +always 选项会严é‡�å‡�低æœ�务器的性能;everysec 选项比较å�ˆé€‚,å�¯ä»¥ä¿�è¯�系统奔溃时å�ªä¼šä¸¢å¤±ä¸€ç§’å·¦å�³çš„æ•°æ�®ï¼Œå¹¶ä¸” Redis æ¯�秒执行一次å�Œæ­¥å¯¹æœ�务器性能几乎没有任何影å“�ï¼›no 选项并ä¸�能给æœ�务器性能带æ�¥å¤šå¤§çš„æ��å�‡ï¼Œè€Œä¸”也会增加系统奔溃时数æ�®ä¸¢å¤±çš„æ•°é‡�。 + +éš�ç�€æœ�务器写请求的增多,AOF 文件会越æ�¥è¶Šå¤§ï¼›Redis æ��供了一ç§�将 AOF é‡�写的特性,能够去除 AOF 文件中的冗余写命令。 + +# å¤�制 + +通过使用 slaveof host port 命令æ�¥è®©ä¸€ä¸ªæœ�务器æˆ�为å�¦ä¸€ä¸ªæœ�务器的从æœ�务器。 + +一个从æœ�务器å�ªèƒ½æœ‰ä¸€ä¸ªä¸»æœ�务器,并且ä¸�支æŒ�主主å¤�制。 + +**1. 从æœ�务器连接主æœ�务器的过程** + +(1) 主æœ�务器创建快照文件,å�‘é€�给从æœ�务器,并在å�‘é€�期间使用缓冲区记录执行的写命令。快照文件å�‘é€�完毕之å�Žï¼Œå¼€å§‹å�‘从æœ�务器å�‘é€�存储在缓冲区中的写命令; +(2) 从æœ�务器丢弃所有旧数æ�®ï¼Œè½½å…¥ä¸»æœ�务器å�‘æ�¥çš„快照文件,之å�Žä»Žæœ�务器开始接å�—主æœ�务器å�‘æ�¥çš„写命令; +(3) 主æœ�务器æ¯�执行一次写命令,就å�‘从æœ�务器å�‘é€�相å�Œçš„写命令。 + +**2. 主从链** + +éš�ç�€è´Ÿè½½ä¸�断上å�‡ï¼Œä¸»æœ�务器å�¯èƒ½æ— æ³•很快地更新所有从æœ�务器,或者é‡�新连接和é‡�æ–°å�Œæ­¥ä»Žæœ�务器而导致系统超载。为了解决这个问题,å�¯ä»¥åˆ›å»ºä¸€ä¸ªä¸­é—´å±‚æ�¥åˆ†æ‹…主æœ�务器的å¤�制工作。中间层的æœ�务器是最上层æœ�务器的从æœ�务器,å�ˆæ˜¯æœ€ä¸‹å±‚æœ�务器的主æœ�务器。 + +![](index_files/b242fafc-5945-42a8-805e-6e3f1f2f89b4.jpg) + +# 处ç�†æ•…éšœ + +è¦�用到æŒ�久化文件æ�¥æ�¢å¤�æœ�务器的数æ�®ã€‚ + +æŒ�久化文件å�¯èƒ½å› ä¸ºæœ�务器出错也有错误,因此è¦�先对æŒ�久化文件进行验è¯�和修å¤�。对 AOF 文件就行验è¯�和修å¤�很容易,修å¤�æ“�作将第一个出错命令和其å�Žçš„æ‰€æœ‰å‘½ä»¤éƒ½åˆ é™¤ï¼›ä½†æ˜¯å�ªèƒ½éªŒè¯�快照文件,无法对快照文件进行修å¤�,因为快照文件进行了压缩,出现在快照文件中间的错误å�¯èƒ½ä¼šå¯¼è‡´æ•´ä¸ªå¿«ç…§æ–‡ä»¶çš„剩余部分无法读å�–。 + +当主æœ�务器出现故障时,Redis 常用的å�šæ³•æ˜¯æ–°å¼€ä¸€å�°æœ�务器作为主æœ�务器,具体步骤如下:å�‡è®¾Â A 为主æœ�务器,B 为从æœ�务器,当 A 出现故障时,让 B 生æˆ�一个快照文件,将快照文件å�‘é€�给 C,并让 C æ�¢å¤�快照文件的数æ�®ã€‚最å�Žï¼Œè®©Â B æˆ�为 C 的从æœ�务器。 + +# 分片 + +Redis 中的分片类似于 MySQL 的分表æ“�作,分片是将数æ�®åˆ’分为多个部分的方法,对数æ�®çš„划分å�¯ä»¥åŸºäºŽé”®åŒ…å�«çš„ IDã€�基于键的哈希值,或者基于以上两者的æŸ�ç§�组å�ˆã€‚通过对数æ�®è¿›è¡Œåˆ†ç‰‡ï¼Œç”¨æˆ·å�¯ä»¥å°†æ•°æ�®å­˜å‚¨åˆ°å¤šå�°æœºå™¨é‡Œé�¢ï¼Œä¹Ÿå�¯ä»¥ä»Žå¤šå�°æœºå™¨é‡Œé�¢èŽ·å�–æ•°æ�®ï¼Œè¿™ç§�方法在解决æŸ�些问题时å�¯ä»¥èŽ·å¾—çº¿æ€§çº§åˆ«çš„æ€§èƒ½æ��å�‡ã€‚ + +å�‡è®¾æœ‰Â 4 个 Reids 实例 R0,R1,R2,R3,还有很多表示用户的键 user:1,user:2,... 等等,有ä¸�å�Œçš„æ–¹å¼�æ�¥é€‰æ‹©ä¸€ä¸ªæŒ‡å®šçš„键存储在哪个实例中。最简å�•的方å¼�是范围分片,例如用户 id 从 0~1000 的存储到实例 R0 中,用户 id 从 1001~2000 的存储到实例 R1 中,等等。但是这样需è¦�维护一张映射范围表,维护æ“�作代价很高。还有一ç§�æ–¹å¼�是哈希分片,使用 CRC32 哈希函数将键转æ�¢ä¸ºä¸€ä¸ªæ•°å­—,å†�对实例数é‡�求模就能知é�“应该存储的实例。 + +**1. 客户端分片** + +客户端使用一致性哈希等算法决定键应当分布到哪个节点。 + +**2. 代ç�†åˆ†ç‰‡** + +将客户端请求å�‘é€�到代ç�†ä¸Šï¼Œç”±ä»£ç�†è½¬å�‘请求到正确的节点上。 + +**3. æœ�务器分片** + +Redis Cluster。 + +# 事件 + +**1. 事件类型** + +(1) 文件事件:æœ�务器有许多套接字,事件产生时会对这些套接字进行æ“�作,æœ�务器通过监å�¬å¥—接字æ�¥å¤„ç�†äº‹ä»¶ã€‚常è§�的文件事件有:客户端的连接事件;客户端的命令请求事件;æœ�务器å�‘客户端返回命令结果的事件; + +(2) 时间事件:å�ˆåˆ†ä¸ºä¸¤ç±»ï¼Œå®šæ—¶äº‹ä»¶æ˜¯è®©ä¸€æ®µç¨‹åº�在指定的时间之内执行一次;周期性时间是让一段程åº�æ¯�隔指定时间就执行一次。 + +**2. 事件的调度与执行** + +æœ�务器需è¦�ä¸�断监å�¬æ–‡ä»¶äº‹ä»¶çš„套接字æ‰�能得到待处ç�†çš„æ–‡ä»¶äº‹ä»¶ï¼Œä½†æ˜¯ä¸�能监å�¬å¤ªä¹…,å�¦åˆ™æ—¶é—´äº‹ä»¶æ— æ³•在规定的时间内执行,因此监å�¬æ—¶é—´åº”该根æ�®è·�离现在最近的时间事件æ�¥å†³å®šã€‚ + +事件调度与执行由 aeProcessEvents 函数负责,伪代ç �如下: + +```python +def aeProcessEvents(): + +    # 获å�–到达时间离当å‰�时间最接近的时间事件 +    time_event = aeSearchNearestTimer() + +    #计算最接近的时间事件è·�离到达还有多少毫秒 +    remaind_ms = time_event.when - unix_ts_now() + +    # 如果事件已到达,那么 remaind_ms 的值å�¯èƒ½ä¸ºè´Ÿæ•°ï¼Œå°†å®ƒè®¾ä¸ºÂ 0 +    if remaind_ms < 0: +        remaind_ms = 0 + +    # 根æ�®Â remaind_ms 的值,创建 timeval +    timeval = create_timeval_with_ms(remaind_ms) + +    # 阻塞并等待文件事件产生,最大阻塞时间由传入的 timeval 决定 +    aeApiPoll(timeval) + +    # 处ç�†æ‰€æœ‰å·²äº§ç”Ÿçš„æ–‡ä»¶äº‹ä»¶ +    procesFileEvents() + +    # 处ç�†æ‰€æœ‰å·²åˆ°è¾¾çš„æ—¶é—´äº‹ä»¶ +    processTimeEvents() +``` + +将 aeProcessEvents 函数置于一个循环里é�¢ï¼ŒåŠ ä¸Šåˆ�始化和清ç�†å‡½æ•°ï¼Œå°±æž„æˆ�了 Redis æœ�务器的主函数,伪代ç �如下: + +```python +def main(): +     +    # åˆ�始化æœ�务器 +    init_server() +     +    # 一直处ç�†äº‹ä»¶ï¼Œç›´åˆ°æœ�务器关闭为止 +    while server_is_not_shutdown(): +        aeProcessEvents() +     +    # æœ�务器关闭,执行清ç�†æ“�作 +    clean_server() +``` + +事件处ç�†çš„角度下æœ�务器è¿�行æµ�程如下: + +![](index_files/73b73189-9e95-47e5-91d0-9378b8462e15.png) + +# Redis与Memcached的区别 + +两者都是é�žå…³ç³»åž‹å†…存键值数æ�®åº“。有以下主è¦�ä¸�å�Œï¼š + +**1. 数æ�®ç±»åž‹** + +Memcached 仅支æŒ�字符串类型,而 Redis 支æŒ�五ç§�ä¸�å�Œç§�类的数æ�®ç±»åž‹ï¼Œä½¿å¾—它å�¯ä»¥æ›´ç�µæ´»åœ°è§£å†³é—®é¢˜ã€‚ + +**2. 数æ�®æŒ�久化** + +Redis 支æŒ�两ç§�æŒ�久化策略:RDB 快照和 AOF 日志,而 Memcached ä¸�支æŒ�æŒ�久化。 + +**3. 分布å¼�** + +Memcached ä¸�支æŒ�分布å¼�,å�ªèƒ½é€šè¿‡åœ¨å®¢æˆ·ç«¯ä½¿ç”¨åƒ�一致性哈希这样的分布å¼�算法æ�¥å®žçŽ°åˆ†å¸ƒå¼�存储,这ç§�æ–¹å¼�在存储和查询时都需è¦�先在客户端计算一次数æ�®æ‰€åœ¨çš„节点。 + +Redis Cluster 实现了分布å¼�的支æŒ�。 + +**4. 内存管ç�†æœºåˆ¶** + +在 Redis 中,并ä¸�是所有数æ�®éƒ½ä¸€ç›´å­˜å‚¨åœ¨å†…存中,å�¯ä»¥å°†ä¸€äº›å¾ˆä¹…没用的 value 交æ�¢åˆ°ç£�盘。而 Memcached 的数æ�®åˆ™ä¼šä¸€ç›´åœ¨å†…存中。 + +Memcached 将内存分割æˆ�特定长度的å�—æ�¥å­˜å‚¨æ•°æ�®ï¼Œä»¥å®Œå…¨è§£å†³å†…存碎片的问题,但是这ç§�æ–¹å¼�会使得内存的利用率ä¸�高,例如å�—的大å°�为 128 bytes,å�ªå­˜å‚¨Â 100 bytes 的数æ�®ï¼Œé‚£ä¹ˆå‰©ä¸‹çš„ 28 bytes 就浪费掉了。 + +# Redis适用场景 + +**1. 缓存** + +适用 Redis 作为缓存,将热点数æ�®æ”¾åˆ°å†…存中。 + +**2. 消æ�¯é˜Ÿåˆ—** + +Redis 的 list 类型是å�Œå�‘链表,很适å�ˆç”¨äºŽæ¶ˆæ�¯é˜Ÿåˆ—。 + +**3. 计数器** + +Redis 这ç§�内存数æ�®åº“æ‰�能支æŒ�计数器的频ç¹�读写æ“�作。 + +**4. 好å�‹å…³ç³»** + +使用 set 类型的交集很容易就å�¯ä»¥çŸ¥é�“两个用户的共å�Œå¥½å�‹ã€‚ + +# 数æ�®æ·˜æ±°ç­–ç•¥ + +å�¯ä»¥è®¾ç½®å†…存最大使用é‡�,当内存使用é‡�超过时施行淘汰策略,具体有 6 ç§�淘汰策略。 + +| 策略 | æ��述 | +| -- | -- | +| volatile-lru | 从已设置过期时间的数æ�®é›†ä¸­æŒ‘选最近最少使用的数æ�®æ·˜æ±°Â | +| volatile-ttl | 从已设置过期时间的数æ�®é›†ä¸­æŒ‘选将è¦�过期的数æ�®æ·˜æ±°Â | +|volatile-random | 从已设置过期时间的数æ�®é›†ä¸­ä»»æ„�选择数æ�®æ·˜æ±°Â | +| allkeys-lru | 从所有数æ�®é›†ä¸­æŒ‘选最近最少使用的数æ�®æ·˜æ±°Â | +| allkeys-random | 从所有数æ�®é›†ä¸­ä»»æ„�选择数æ�®è¿›è¡Œæ·˜æ±°Â | +| no-envicition | ç¦�止驱é€�æ•°æ�®Â | + +如果使用 Redis æ�¥ç¼“存数æ�®æ—¶ï¼Œè¦�ä¿�è¯�所有数æ�®éƒ½æ˜¯çƒ­ç‚¹æ•°æ�®ï¼Œå�¯ä»¥å°†å†…存最大使用é‡�设置为热点数æ�®å� ç”¨çš„内存é‡�,然å�Žå�¯ç”¨Â allkeys-lru 淘汰策略,将最近最少使用的数æ�®æ·˜æ±°ã€‚ + +具体问题:MySQL 里有 2000w 数æ�®ï¼ŒRedis 中å�ªå­˜Â 20w 的数æ�®ï¼Œå¦‚何ä¿�è¯� Redis 中的数æ�®éƒ½æ˜¯çƒ­ç‚¹æ•°æ�®? + +# 一个简å�•的论å�›ç³»ç»Ÿåˆ†æž� + +该论å�›ç³»ç»ŸåŠŸèƒ½å¦‚ä¸‹ï¼š + +1. å�¯ä»¥å�‘布文章; +2. å�¯ä»¥å¯¹æ–‡ç« è¿›è¡Œç‚¹èµžï¼› +3. 在首页å�¯ä»¥æŒ‰æ–‡ç« çš„å�‘布时间或者文章的点赞数进行排åº�显示; + +**1. 文章信æ�¯** + +文章包括标题ã€�作者ã€�赞数等信æ�¯ï¼Œåœ¨å…³ç³»åž‹æ•°æ�®åº“中很容易构建一张表æ�¥å­˜å‚¨è¿™äº›ä¿¡æ�¯ï¼Œåœ¨Â Redis 中å�¯ä»¥ä½¿ç”¨Â HASH æ�¥å­˜å‚¨æ¯�ç§�ä¿¡æ�¯ä»¥å�Šå…¶å¯¹åº”的值的映射。 + +Redis 没有表的概念将å�Œç±»åž‹çš„æ•°æ�®å­˜æ”¾åœ¨ä¸€èµ·ï¼Œè€Œæ˜¯ä½¿ç”¨å‘½å��空间的方å¼�æ�¥å®žçŽ°è¿™ä¸€åŠŸèƒ½ã€‚é”®å��çš„å‰�é�¢éƒ¨åˆ†å­˜å‚¨å‘½å��空间,å�Žé�¢éƒ¨åˆ†çš„内容存储 ID,通常使用 : æ�¥è¿›è¡Œåˆ†éš”。例如下é�¢çš„ HASH 的键å��为 article:92617,其中 article 为命å��空间,ID 为 92617。 + +![](index_files/2d078e08-3a49-46d0-b784-df780b7e4bc3.jpg) + +**2. 点赞功能** + +当有用户为一篇文章点赞时,除了è¦�对该文章的 votes 字段进行加 1 æ“�作,还必须记录该用户已ç»�对该文章进行了点赞,防止用户ä¸�断点赞。å�¯ä»¥å»ºç«‹æ–‡ç« çš„已投票用户集å�ˆæ�¥è¿›è¡Œè®°å½•。 + +为了节约内存,规定一篇文章å�‘布满一周之å�Žï¼Œå°±ä¸�能å†�对它进行投票,而文章的已投票集å�ˆä¹Ÿä¼šè¢«åˆ é™¤ï¼Œå�¯ä»¥ä¸ºæ–‡ç« çš„已投票集å�ˆè®¾ç½®ä¸€ä¸ªä¸€å‘¨çš„过期时间就能实现这个规定。 + +![](index_files/0e4c8a7f-f84c-4c4e-9544-49cd40167af8.png) + +**3. 对文章进行排åº�** + +为了按å�‘布时间和点赞数进行排åº�,å�¯ä»¥å»ºç«‹ä¸€ä¸ªæ–‡ç« å�‘布时间的有åº�集å�ˆå’Œä¸€ä¸ªæ–‡ç« ç‚¹èµžæ•°çš„æœ‰åº�集å�ˆã€‚(下图中的 score 就是这里所说的点赞数;下é�¢æ‰€ç¤ºçš„æœ‰åº�集å�ˆåˆ†å€¼å¹¶ä¸�直接是时间和点赞数,而是根æ�®å®ƒä»¬é—´æŽ¥è®¡ç®—出æ�¥çš„) + +![](index_files/ea5e434a-a218-44b5-aa72-4cd08991abcf.jpg) + +# 案例分æž� + +**1. å�‡è®¾æœ‰ä¸€ä¸ªå�šå®¢ç³»ç»Ÿï¼Œæ•°æ�®åº“存储采用 MySQL,用户数é‡�为 1000 万,预计文章总数为 10 亿,æ¯�天有至少 10 万的更新é‡�,æ¯�天访问é‡�为 5000 万,对数æ�®åº“的读写æ“�作的比例超过 10:1,你如何设计该系统以确ä¿�系统高效ã€�稳定的è¿�行?** + +æ��示:å�¯ä»¥ä»Žæ•°æ�®åº“设计ã€�系统框架ã€�å�Šç½‘络架构方é�¢è¿›è¡Œæ��述,å�¯ä»¥è‡ªç”±å�‘挥。 + +① 考虑到读æ“�作比写æ“�作多的多,因此å�¯ä»¥ä½¿ç”¨ä¸»ä»Žæž¶æž„,让主æœ�务器处ç�†å†™è¯·æ±‚,从æœ�务器处ç�†è¯»è¯·æ±‚,并且从æœ�务器å�¯ä»¥ä½¿ç”¨è¯»æ€§èƒ½æ¯”较高的 MyISAM 存储引擎; +② å�šå®¢ç³»ç»Ÿæœ‰ä¸ªç‰¹ç‚¹ï¼Œå°±æ˜¯çƒ­ç‚¹æ•°æ�®ç‰¹åˆ«æ˜Žæ˜¾ï¼Œæ¯”如精å�Žæ–‡ç« ã€�推è��文章等,对这部分热点数æ�®å�¯ä»¥ä½¿ç”¨Â Redis 进行缓存; +③ 由于文章总数很大,å�¯ä»¥é€‰æ‹©æ ¹æ�®ç”¨æˆ·æ•£åˆ—æ�¥è¿›è¡Œåˆ†è¡¨æ“�作。 + + +# å�‚考资料 + +1. Redis实战 +2. Reids设计与实现 +3. [论述Rediså’ŒMemcached的差异](http://www.cnblogs.com/loveincode/p/7411911.html) +4. [Redis 3.0 中文版- 分片](http://wiki.jikexueyuan.com/project/redis-guide) +5. [Redis应用场景](http://www.scienjus.com/redis-use-case/) \ No newline at end of file diff --git a/notes/笔记/SQL 实战.md.txt b/notes/笔记/SQL 实战.md.txt new file mode 100644 index 00000000..2fd030a5 --- /dev/null +++ b/notes/笔记/SQL 实战.md.txt @@ -0,0 +1,225 @@ +[TOC] + +# 查找最晚入è�Œå‘˜å·¥çš„æ‰€æœ‰ä¿¡æ�¯ + +```sql +select * +from employees +order by hire_date desc +limit 1; +``` + +# 查找入è�Œå‘˜å·¥æ—¶é—´æŽ’å��倒数第三的员工所有信æ�¯ + +```sql +select * +from employees +order by hire_date desc +limit 2, 1; +``` + +# 查找å�„个部门当å‰�领导当å‰�薪水详情以å�Šå…¶å¯¹åº”部门编å�·dept_no + +```sql +select s.emp_no, s.salary, s.from_date, s.to_date, d.dept_no +from salaries as s inner join dept_manager as d +on d.emp_no = s.emp_no +and d.to_date = '9999-01-01' +and s.to_date = '9999-01-01'; +``` + +# 查找所有已ç»�分é…�部门的员工的last_nameå’Œfirst_name + +```sql +select e.last_name, e.first_name, d.dept_no +from employees as e inner join dept_emp as d +on e.emp_no = d.emp_no; +``` + +# 查找所有员工的last_nameå’Œfirst_name以å�Šå¯¹åº”部门编å�·dept_no + +也包括展示没有分é…�具体部门的员工 + +```sql +select e.last_name, e.first_name, d.dept_no +from employees as e left outer join dept_emp as d +on e.emp_no = d.emp_no; +``` + +# 查找所有员工入è�Œæ—¶å€™çš„薪水情况 + +```sql +select e.emp_no, s.salary +from employees as e inner join salaries as s +on e.emp_no = s.emp_no and e.hire_date = s.from_date +order by e.emp_no desc; +``` + +# 查找薪水涨幅超过15次的员工å�·emp_no以å�Šå…¶å¯¹åº”的涨幅次数t + +```sql +select emp_no, count(*) as t +from salaries +group by emp_no +having t > 15; +``` + +# 找出所有员工当å‰�具体的薪水salary情况 + +```sql +select distinct salary +from salaries +where to_date = '9999-01-01' +order by salary desc; +``` + +# 获å�–所有部门当å‰�manager的当å‰�薪水情况 + +```sql +select d.dept_no, d.emp_no, s.salary +from salaries as s inner join dept_manager as d +on d.emp_no = s.emp_no +and d.to_date = '9999-01-01' +and s.to_date = '9999-01-01'; +``` + +# 获å�–所有é�žmanager的员工emp_no + +```sql +select emp_no +from employees +where emp_no not in ( + select emp_no +    from dept_manager +) +``` + +# 获å�–所有员工当å‰�çš„manager + +```sql +select d1.emp_no, d2.emp_no as manager_no +from dept_emp as d1 inner join dept_manager as d2 +on d1.dept_no = d2.dept_no +and d1.to_date = '9999-01-01' +and d2.to_date = '9999-01-01' +and d1.emp_no <> d2.emp_no +``` + +# 获å�–所有部门中当å‰�员工薪水最高的相关信æ�¯ + +```sql +select d.dept_no, d.emp_no, MAX(s.salary) as salary +from dept_emp as d inner join salaries as s +on d.emp_no = s.emp_no +and d.to_date = '9999-01-01' +and s.to_date = '9999-01-01' +group by d.dept_no +``` + +# 从titles表获å�–按照title进行分组 + +```sql +select title, COUNT(*) as t +from titles +group by title +having t >= 2 +``` + +# 从titles表获å�–按照title进行分组,注æ„�对于é‡�å¤�çš„emp_no进行忽略。 + +```sql +select title, COUNT(distinct emp_no) as t +from titles +group by title +having t >= 2 +``` + +# 查找employees表所有emp_no为奇数 + +```sql +select * +from employees +where emp_no % 2 = 1 and last_name != 'Mary' +order by hire_date desc +``` + +# 统计出当å‰�å�„个title类型对应的员工当å‰�薪水对应的平å�‡å·¥èµ„ + +```sql +select t.title, AVG(s.salary) as avg +from titles as t inner join salaries as s +on t.emp_no = s.emp_no +and t.to_date = '9999-01-01' +and s.to_date = '9999-01-01' +group by t.title +``` + +# 获å�–当å‰�薪水第二多的员工的emp_no以å�Šå…¶å¯¹åº”的薪水salary + +```sql +select emp_no, salary +from salaries +order by salary desc +limit 1, 1 +``` + +# 查找当å‰�薪水排å��第二多的员工编å�·emp_no + +```sql +select e.emp_no, MAX(s.salary) as salary, e.last_name, e.first_name +from employees as e, salaries as s +where e.emp_no = s.emp_no +and s.to_date = '9999-01-01' +and s.salary not in ( +    select MAX(salary) +    from salaries +    where s.to_date = '9999-01-01' +) +``` + +#  查找所有员工的last_nameå’Œfirst_name以å�Šå¯¹åº”çš„dept_name + +查找所有员工的last_nameå’Œfirst_name以å�Šå¯¹åº”çš„dept_name,也包括暂时没有分é…�部门的员工 + +本题æ€�路为è¿�用两次LEFT JOIN连接嵌套 +1ã€�第一次LEFT JOIN连接employees表与dept_emp表,得到所有员工的last_nameå’Œfirst_name以å�Šå¯¹åº”çš„dept_no,也包括暂时没有分é…�部门的员工 +2ã€�第二次LEFT JOIN连接上表与departments表,å�³è¿žæŽ¥dept_no与dept_name,得到所有员工的last_nameå’Œfirst_name以å�Šå¯¹åº”çš„dept_name,也包括暂时没有分é…�部门的员工 + +```sql +SELECT em.last_name, em.first_name, dp.dept_name +FROM (employees AS em LEFT JOIN dept_emp AS de ON em.emp_no = de.emp_no) +LEFT JOIN departments AS dp ON de.dept_no = dp.dept_no +``` + +# 查找员工编å�·emp_no为10001其自入è�Œä»¥æ�¥çš„薪水salary涨幅值growth + +```sql +SELECT (MAX(salary)-MIN(salary)) AS growth +FROM salaries WHERE emp_no = '10001' +``` + +# 查找所有员工自入è�Œä»¥æ�¥çš„薪水涨幅情况 + +```sql +select a.emp_no, (b.salary - c.salary) as growth +from + employees as a + inner join salaries as b + on a.emp_no = b.emp_no and b.to_date = '9999-01-01' + inner join salaries as c + on a.emp_no = c.emp_no and a.hire_date = c.from_date +order by growth asc +``` + +# 统计å�„个部门对应员工涨幅的次数总和 + +本题关键是è¦�将 æ¯�个部门分组,并分别统计工资记录总数,æ€�路如下: +1ã€�用INNER JOIN连接dept_emp表和salaries表,并以dept_emp.no分组,统计æ¯�个部门所有员工工资的记录总数 +2ã€�å†�将上表用INNER JOIN连接departments表,é™�制æ�¡ä»¶ä¸ºä¸¤è¡¨çš„dept_no相等,找到dept_no与dept_name的对应关系,最å�Žä¾�次输出dept_noã€�dept_nameã€�sum + +```sql +SELECT de.dept_no, dp.dept_name, COUNT(s.salary) AS sum +FROM (dept_emp AS de INNER JOIN salaries AS s ON de.emp_no = s.emp_no) +INNER JOIN departments AS dp ON de.dept_no = dp.dept_no +GROUP BY de.dept_no +``` \ No newline at end of file diff --git a/notes/笔记/SQL 语法.md.txt b/notes/笔记/SQL 语法.md.txt new file mode 100644 index 00000000..c5d5c4af --- /dev/null +++ b/notes/笔记/SQL 语法.md.txt @@ -0,0 +1,702 @@ +[TOC] + +# 基础 + +模å¼�:定义了数æ�®å¦‚何存储ã€�存储什么样的数æ�®ä»¥å�Šæ•°æ�®å¦‚何分解等信æ�¯ï¼Œæ•°æ�®åº“和表都有模å¼�。 + +主键的值ä¸�å…�许修改,也ä¸�å…�许å¤�用(ä¸�能使用已ç»�删除的主键值赋给新数æ�®è¡Œçš„主键)。 + +SQL(Structured Query Language),标准 SQL 由 ANSI 标准委员会管ç�†ï¼Œä»Žè€Œç§°ä¸ºÂ ANSI SQL,å�„个 DBMS 都有自己的实现,如 PL/SQLã€�Transact-SQL 等。 + +# 查询 + +SQL 语å�¥ä¸�区分大å°�写,但是数æ�®åº“表å��ã€�列å��和值是å�¦åŒºåˆ†ä¾�赖于具体的 DBMS 以å�Šé…�置。 + +**DISTINCT** + +相å�Œå€¼å�ªä¼šå‡ºçŽ°ä¸€æ¬¡ã€‚å®ƒä½œç”¨äºŽæ‰€æœ‰åˆ—ï¼Œä¹Ÿå°±æ˜¯è¯´æ‰€æœ‰åˆ—çš„å€¼éƒ½ç›¸å�Œæ‰�算相å�Œã€‚ + +```sql +SELECT DISTINCT col1, col2 +FROM mytable; +``` + +**LIMIT** + +é™�制返回的行数。å�¯ä»¥æœ‰ä¸¤ä¸ªå�‚数,第一个å�‚数为起始行,从 0 开始;第二个å�‚数为返回的总行数。 + +返回å‰� 5 行的 SQL: + +```sql +SELECT * +FROM mytable +LIMIT 5; +``` + +```sql +SELECT * +FROM mytable +LIMIT 0, 5; +``` + +返回第 3 ~ 5 行: + +```sql +SELECT * +FROM mytable +LIMIT 2, 3; +``` + +**注释** + +```sql +# 注释 +SELECT * +FROM mytable -- 注释 +/* 注释1 +   注释2 */ +``` + +# 排åº� + +**ASC**:å�‡åº�(默认) +**DESC**:é™�åº� + +å�¯ä»¥æŒ‰å¤šä¸ªåˆ—进行排åº�: + +```sql +SELECT * +FROM mytable +ORDER BY col1 DESC, col2 ASC; +``` + +# 过滤 + +在应用层也å�¯ä»¥è¿‡æ»¤æ•°æ�®ï¼Œä½†æ˜¯ä¸�在æœ�务器端进行过滤的数æ�®é�žå¸¸å¤§ï¼Œå¯¼è‡´é€šè¿‡ç½‘络传输了很多多余的数æ�®ï¼Œä»Žè€Œæµªè´¹äº†ç½‘络带宽。 + +```sql +SELECT * +FROM mytable +WHERE col IS NULL; +``` + +下表显示了 WHERE å­�å�¥å�¯ç”¨çš„æ“�作符 + +|  æ“�作符 | 说明  | +| ------------ | ------------ | +| = <  >  | 等于 å°�于 大于 | +| <> !=  | ä¸�等于  | +| <= !> | å°�于等于 | +| >= !< | 大于等于 | +| BETWEEN | 在两个值之间 | +| IS NULL | 为NULL值 | + +应该注æ„�到,NULL 与 0 ã€�空字符串都ä¸�å�Œã€‚ + +**AND OR** 用于连接多个过滤æ�¡ä»¶ã€‚优先处ç�†Â AND,因此当一个过滤表达å¼�涉å�Šåˆ°å¤šä¸ªÂ AND 和 OR 时,应当使用 () æ�¥å†³å®šä¼˜å…ˆçº§ã€‚ + +**IN** æ“�作符用于匹é…�一组值,其å�Žä¹Ÿå�¯ä»¥æŽ¥ä¸€ä¸ªÂ SELECT å­�å�¥ï¼Œä»Žè€ŒåŒ¹é…�å­�查询得到的一组值。 + +**NOT** æ“�作符用于å�¦å®šä¸€ä¸ªæ�¡ä»¶ã€‚ + +# 通é…�符 + +通é…�符也是用在过滤语å�¥ä¸­ï¼Œå�ªèƒ½ç”¨äºŽæ–‡æœ¬å­—段。 + +- **%** 匹é…� >=0 个任æ„�字符,类似于 \*ï¼› + +- **\_** 匹é…� ==1 个任æ„�字符,类似于 \.ï¼› + +- **[ ]** å�¯ä»¥åŒ¹é…�集å�ˆå†…的字符,用脱字符 ^ å�¯ä»¥å¯¹å…¶è¿›è¡Œå�¦å®š + +使用 Like æ�¥è¿›è¡Œé€šé…�符匹é…�。 + +```sql +SELECT * +FROM mytable +WHERE col LIKE '[^AB]%' -- ä¸�以AB开头的任æ„�文本 +``` + +ä¸�è¦�滥用通é…�符,通é…�符ä½�于开头处匹é…�会é�žå¸¸æ…¢ã€‚ + +# 计算字段 + +在数æ�®åº“æœ�务器上完æˆ�æ•°æ�®çš„转æ�¢å’Œæ ¼å¼�化的工作往往比客户端上快得多,并且转æ�¢å’Œæ ¼å¼�化å�Žçš„æ•°æ�®é‡�æ›´å°‘çš„è¯�å�¯ä»¥å‡�少网络通信é‡�。 + +计算字段通常需è¦�使用 **AS** æ�¥å�–别å��,å�¦åˆ™è¾“出的时候字段å��为计算表达å¼�。 + +```sql +SELECT col1*col2 AS alias +FROM mytable +``` + +**Concat()** 用于连接两个字段。许多数æ�®åº“会使用空格把一个值填充为列宽,因此连接的结果会出现一些ä¸�å¿…è¦�的空格,使用 **TRIM()** å�¯ä»¥åŽ»é™¤é¦–å°¾ç©ºæ ¼ã€‚ + +```sql +SELECT Concat(TRIM(col1), ' (', TRIM(col2), ')') +FROM mytable +``` + +# 函数 + +å�„个 DBMS 的函数都是ä¸�相å�Œçš„,因此ä¸�å�¯ç§»æ¤�。 + +## 文本处ç�† + +| 函数  | 说明  | +| ------------ | ------------ | +|  LEFT() RIGHT() |  左边或者å�³è¾¹çš„字符 | +|  LOWER() UPPER() |  转æ�¢ä¸ºå°�写或者大写 | +| LTRIM() RTIM() | 去除左边或者å�³è¾¹çš„空格 | +| LENGTH() | 长度 | +| SUNDEX() | 转æ�¢ä¸ºè¯­éŸ³å€¼Â | + +其中,**SOUNDEX()** 是将一个字符串转æ�¢ä¸ºæ��述其语音表示的字æ¯�数字模å¼�的算法,它是根æ�®å�‘音而ä¸�是字æ¯�比较。 + +```sql +SELECT * +FROM mytable +WHERE SOUNDEX(col1) = SOUNDEX('apple') +``` +## 日期和时间处ç�† + +日期格å¼�:YYYY-MM-DD + +æ—¶é—´æ ¼å¼�:HH:MM:SS + +|函 数 | 说 明| +| --- | --- | +| AddDate() | 增加一个日期(天ã€�周等)| +| AddTime() | 增加一个时间(时ã€�分等)| +| CurDate() | 返回当å‰�日期 | +| CurTime() | 返回当å‰�时间 | +|Date() |返回日期时间的日期部分| +|DateDiff() |计算两个日期之差| +|Date_Add() |高度ç�µæ´»çš„æ—¥æœŸè¿�算函数| +|Date_Format() |返回一个格å¼�化的日期或时间串| +|Day()| 返回一个日期的天数部分| +|DayOfWeek() |对于一个日期,返回对应的星期几| +|Hour() |返回一个时间的å°�时部分| +|Minute() |返回一个时间的分钟部分| +|Month() |返回一个日期的月份部分| +|Now() |返回当å‰�日期和时间| +|Second() |返回一个时间的秒部分| +|Time() |返回一个日期时间的时间部分| +|Year() |返回一个日期的年份部分| + +```sql +mysql> SELECT NOW(); +        -> '2017-06-28 14:01:52' +``` + +## 数值处ç�† + +| 函数 | 说明 | +| --- | --- | +| SIN() | 正弦 | +|COS() | 余弦 | +| TAN() | 正切 | +| ABS() | ç»�对值 | +| SQRT() | 平方根| +| MOD() | 余数| +| EXP() | 指数| +| PI() | 圆周率| +|RAND() | éš�机数| + +## 汇总 + +|函 数 |说 明| +| --- | --- | +|AVG() |返回æŸ�列的平å�‡å€¼| +|COUNT()| 返回æŸ�列的行数| +|MAX()| 返回æŸ�列的最大值| +|MIN()| 返回æŸ�列的最å°�值| +|SUM() |返回æŸ�列值之和| + +AVG() 会忽略 NULL 行。 + +DISTINCT 关键字会å�ªæ±‡æ€»ä¸�å�Œçš„值。 + +```sql +SELECT AVG(DISTINCT col1) AS avg_col +FROM mytable +``` + +# 分组 + +分组就是把相å�Œçš„æ•°æ�®æ”¾åœ¨å�Œä¸€ç»„中。 + +å�¯ä»¥å¯¹æ¯�组数æ�®ä½¿ç”¨æ±‡æ€»å‡½æ•°è¿›è¡Œå¤„ç�†ï¼Œä¾‹å¦‚求æ¯�组数的平å�‡å€¼ç­‰ã€‚ + +按 col 排åº�并分组数æ�®ï¼š + +```sql +SELECT col, COUNT(*) AS num +FROM mytable +GROUP BY col; +``` + +WHERE 过滤行,HAVING 过滤分组,行过滤应当先与分组过滤; + +```sql +SELECT col, COUNT(*) AS num +FROM mytable +WHERE col > 2 +GROUP BY col +HAVING COUNT(*) >= 2; +``` + +GROUP BY 的排åº�结果为分组字段,而 ORDER BY 也å�¯ä»¥ä»¥è�šé›†å­—段æ�¥è¿›è¡ŒæŽ’åº�。 + +```sql +SELECT col, COUNT(*) AS num +FROM mytable +GROUP BY col +ORDER BY num; +``` + +分组规定: + +1. GROUP BY å­�å�¥å‡ºçŽ°åœ¨Â WHERE å­�å�¥ä¹‹å�Žï¼ŒORDER BY å­�å�¥ä¹‹å‰�ï¼› +2. 除了汇总计算语å�¥ä¹‹å¤–,SELECT 语å�¥ä¸­çš„æ¯�一列都必须在 GROUP BY å­�å�¥ä¸­ç»™å‡ºï¼› +3. NULL 的行会å�•独分为一组; +4. 大多数 SQL 实现ä¸�支æŒ� GROUP BY 列具有å�¯å�˜é•¿åº¦çš„æ•°æ�®ç±»åž‹ã€‚ + +# å­�查询 + +å­�查询中å�ªèƒ½è¿”回一个列。 + +å�¯ä»¥å°†å­�查询的结果作为 WHRER 语å�¥çš„过滤æ�¡ä»¶ï¼š + +``` +SELECT * +FROM mytable1 +WHERE col1 IN (SELECT col2 +                 FROM mytable2); +``` + +下é�¢çš„语å�¥å�¯ä»¥æ£€ç´¢å‡ºå®¢æˆ·çš„订å�•æ•°é‡�。å­�查询语å�¥ä¼šå¯¹æ£€ç´¢å‡ºçš„æ¯�个客户执行一次: + +```sql +SELECT cust_name, (SELECT COUNT(*) +                   FROM Orders +                   WHERE Orders.cust_id = Customers.cust_id) +                   AS orders_num +FROM Customers +ORDER BY cust_name; +``` + +# 连接 + +连接用于连接多个表,使用 JOIN 关键字,并且æ�¡ä»¶è¯­å�¥ä½¿ç”¨Â ON。 + +连接å�¯ä»¥æ›¿æ�¢å­�查询,并且比å­�查询的效率一般会更快。 + +å�¯ä»¥ç”¨Â AS 给列å��ã€�计算字段和表å��å�–别å��,给表å��å�–别å��是为了简化 SQL 语å�¥ä»¥å�Šè¿žæŽ¥ç›¸å�Œè¡¨ã€‚ + +## 内连接 + +内连接å�ˆç§°ç­‰å€¼è¿žæŽ¥ï¼Œä½¿ç”¨Â INNER JOIN 关键字。 + +``` +select a, b, c +from A inner join B +on A.key = B.key +``` + +å�¯ä»¥ä¸�明确使用 INNER JOIN,而使用普通查询并在 WHERE 中将两个表中è¦�连接的列用等值方法连接起æ�¥ã€‚ + +``` +select a, b, c +from A, B +where A.key = B.key +``` + +在没有æ�¡ä»¶è¯­å�¥çš„æƒ…况下返回笛å�¡å°”积。 + +## 自连接 + +自连接å�¯ä»¥çœ‹æˆ�内连接的一ç§�,å�ªæ˜¯è¿žæŽ¥çš„表是自身而已。 + +一张员工表,包å�«å‘˜å·¥å§“å��和员工所属部门,è¦�找出与 Jim 处在å�Œä¸€éƒ¨é—¨çš„æ‰€æœ‰å‘˜å·¥å§“å��。 + +**å­�查询版本** + +``` +select name +from employee +where department = ( +      select department +      from employee +      where name = "Jim"); +``` + +**自连接版本** + +``` +select name +from employee as e1, employee as e2 +where e1.department = e2.department +      and e1.name = "Jim"; +``` + +连接一般比å­�查询的效率高。 + +## 自然连接 + +自然连接是把å�Œå��列通过等值测试连接起æ�¥çš„,å�Œå��列å�¯ä»¥æœ‰å¤šä¸ªã€‚ + +内连接和自然连接的区别:内连接æ��供连接的列,而自然连接自动连接所有å�Œå��列;内连接属于自然连接。 + +``` +select * +from employee natural join department; +``` + +## 外连接 + +外连接ä¿�留了没有关è�”的那些行。分为左外连接,å�³å¤–连接以å�Šå…¨å¤–连接,左外连接就是ä¿�留左表的所有行。 + +检索所有顾客的订å�•ä¿¡æ�¯ï¼ŒåŒ…括还没有订å�•ä¿¡æ�¯çš„顾客。 + +``` +select Customers.cust_id, Orders.order_num +   from Customers left outer join Orders +   on Customers.cust_id = Orders.curt_id +``` + +如果需è¦�统计顾客的订å�•数,使用è�šé›†å‡½æ•°ã€‚ + +``` +select Customers.cust_id, +       COUNT(Orders.order_num) as num_ord +from Customers left outer join Orders +on Customers.cust_id = Orders.curt_id +group by Customers.cust_id +``` + +# 组å�ˆæŸ¥è¯¢ + +使用 **UNION** æ�¥è¿žæŽ¥ä¸¤ä¸ªæŸ¥è¯¢ï¼Œæ¯�个查询必须包å�«ç›¸å�Œçš„列ã€�表达å¼�或者è�šé›†å‡½æ•°ã€‚ + +默认会去除相å�Œè¡Œï¼Œå¦‚果需è¦�ä¿�留相å�Œè¡Œï¼Œä½¿ç”¨Â UNION ALL 。 + +å�ªèƒ½åŒ…å�«ä¸€ä¸ªÂ ORDER BY å­�å�¥ï¼Œå¹¶ä¸”å¿…é¡»ä½�于语å�¥çš„æœ€å�Žã€‚ + +```sql +SELECT col +FROM mytable +WHERE col = 1 +UNION +SELECT col +FROM mytable +WHERE col =2; +``` + +# æ�’å…¥ + +**普通æ�’å…¥** + +```sql +INSERT INTO mytable(col1, col2) +VALUES(val1, val2); +``` + +**æ�’入检索出æ�¥çš„æ•°æ�®** + +```sql +INSERT INTO mytable1(col1, col2) +SELECT col1, col2 +FROM mytable2; +``` + +**将一个表的内容å¤�制到一个新表** + +```sql +CREATE TABLE newtable AS +SELECT * FROM mytable; +``` + +# 更新 + +```sql +UPDATE mytable +SET col = val +WHERE id = 1; +``` + +# 删除 + +```sql +DELETE FROM mytable +WHERE id = 1; +``` + +**TRUNCATE TABLE** å�¯ä»¥æ¸…空表,也就是删除所有行。 + +使用更新和删除æ“�作时一定è¦�用 WHERE å­�å�¥ï¼Œä¸�然会把整张表的数æ�®éƒ½ç ´å��。å�¯ä»¥å…ˆç”¨Â SELECT 语å�¥è¿›è¡Œæµ‹è¯•,防止错误删除。 + +# 创建表 + +```sql +CREATE TABLE mytable ( +  id INT NOT NULL AUTO_INCREMENT, +  col1 INT NOT NULL DEFAULT 1, +  col2 VARCHAR(45) NULL, +  col3 DATE NULL, +  PRIMARY KEY (`id`)); +``` + +# 修改表 + +**添加列** + +```sql +ALTER TABLE mytable +ADD col CHAR(20); +``` + +**删除列** + +```sql +ALTER TABLE mytable +DROP COLUMN col; +``` + +**删除表** + +```sql +DROP TABLE mytable; +``` + +# 视图 + +视图是虚拟的表,本身ä¸�包å�«æ•°æ�®ï¼Œä¹Ÿå°±ä¸�能对其进行索引æ“�作。对视图的æ“�作和对普通表的æ“�作一样。 + +视图具有如下好处: + +1. 简化å¤�æ�‚的 SQL æ“�作,比如å¤�æ�‚çš„è�”结; +2. å�ªä½¿ç”¨å®žé™…表的一部分数æ�®ï¼› +3. 通过å�ªç»™ç”¨æˆ·è®¿é—®è§†å›¾çš„æ�ƒé™�,ä¿�è¯�æ•°æ�®çš„安全性; +4. 更改数æ�®æ ¼å¼�和表示。 + +```sql +CREATE VIEW myview AS +SELECT Concat(col1, col2) AS concat_col, col3*col4 AS count_col +FROM mytable +WHERE col5 = val; +``` + +# 存储过程 + +存储过程å�¯ä»¥çœ‹æˆ�是对一系列 SQL æ“�作的批处ç�†ï¼› + +**使用存储过程的好处** + +1. 把实现å°�装在了存储过程中,ä¸�仅简å�•,也ä¿�è¯�了安全性; +2. å�¯ä»¥å¤�用代ç �ï¼› +3. 由于是预先编译,因此具有很高的性能。 + +**创建存储过程** + +命令行中创建存储过程需è¦�自定义分隔符,因为命令行是以 ; 为结æ�Ÿç¬¦ï¼Œè€Œå­˜å‚¨è¿‡ç¨‹ä¸­ä¹ŸåŒ…å�«äº†åˆ†å�·ï¼Œå› æ­¤ä¼šé”™è¯¯æŠŠè¿™éƒ¨åˆ†åˆ†å�·å½“æˆ�是结æ�Ÿç¬¦ï¼Œé€ æˆ�语法错误。 + +包å�«Â inã€�out 和 inout 三ç§�å�‚数。 + +ç»™å�˜é‡�赋值都需è¦�用 select into 语å�¥ã€‚ + +æ¯�次å�ªèƒ½ç»™ä¸€ä¸ªå�˜é‡�赋值,ä¸�支æŒ�集å�ˆçš„æ“�作。 + +```sql +delimiter // + +create procedure myprocedure( out ret int ) +    begin +        declare y int; +        select sum(col1) +        from mytable +        into y; +        select y*y into ret; +    end // +delimiter ; +``` + +```sql +call myprocedure(@ret); +select @ret; +``` + +# 游标 + +在存储过程中使用游标å�¯ä»¥å¯¹ä¸€ä¸ªç»“果集进行移动é��历。 + +游标主è¦�用于交互å¼�应用,其中用户需è¦�对数æ�®é›†ä¸­çš„ä»»æ„�行进行æµ�览和修改。 + +**使用游标的四个步骤:** + +1. 声明游标,这个过程没有实际检索出数æ�®ï¼› +2. 打开游标; +3. å�–出数æ�®ï¼› +4. 关闭游标; + +```sql +delimiter // +create procedure myprocedure(out ret int) +    begin +        declare done boolean default 0; + +        declare mycursor cursor for +        select col1 from mytable; +        # 定义了一个continue handler,当 sqlstate '02000' 这个æ�¡ä»¶å‡ºçŽ°æ—¶ï¼Œä¼šæ‰§è¡ŒÂ set done = 1 +        declare continue handler for sqlstate '02000' set done = 1; + +        open mycursor; + +        repeat +            fetch mycursor into ret; +            select ret; +        until done end repeat; + +        close mycursor; +    end // + delimiter ; +``` + +# 触å�‘器 + +触å�‘器会在æŸ�个表执行以下语å�¥æ—¶è€Œè‡ªåŠ¨æ‰§è¡Œï¼šDELETEã€�INSERTã€�UPDATE + +触å�‘器必须指定在语å�¥æ‰§è¡Œä¹‹å‰�还是之å�Žè‡ªåŠ¨æ‰§è¡Œï¼Œä¹‹å‰�执行使用 BEFORE 关键字,之å�Žæ‰§è¡Œä½¿ç”¨Â AFTER 关键字。BEFORE 用于数æ�®éªŒè¯�和净化。 + +INSERT 触å�‘器包å�«ä¸€ä¸ªå��为 NEW 的虚拟表。 + +```sql +CREATE TRIGGER mytrigger AFTER INSERT ON mytable +FOR EACH ROW SELECT NEW.col; +``` + +DELETE 触å�‘器包å�«ä¸€ä¸ªå��为 OLD 的虚拟表,并且是å�ªè¯»çš„。 + +UPDATE 触å�‘器包å�«ä¸€ä¸ªå��为 NEW 和一个å��为 OLD 的虚拟表,其中 NEW 是å�¯ä»¥è¢«ä¿®æ”¹åœ°ï¼Œè€ŒÂ OLD 是å�ªè¯»çš„。 + +å�¯ä»¥ä½¿ç”¨è§¦å�‘器æ�¥è¿›è¡Œå®¡è®¡è·Ÿè¸ªï¼ŒæŠŠä¿®æ”¹è®°å½•到å�¦å¤–一张表中。 + +MySQL ä¸�å…�许在触å�‘器中使用 CALL 语å�¥Â ï¼Œä¹Ÿå°±æ˜¯ä¸�能调用存储过程。 + +# 事务处ç�† + +**基本术语** + +1. 事务(transaction)指一组 SQL 语å�¥ï¼› +2. 回退(rollback)指撤销指定 SQL 语å�¥çš„过程; +3. æ��交(commit)指将未存储的 SQL 语å�¥ç»“果写入数æ�®åº“表; +4. ä¿�留点(savepoint)指事务处ç�†ä¸­è®¾ç½®çš„临时å� ä½�符(placeholder),你å�¯ä»¥å¯¹å®ƒå�‘布回退(与回退整个事务处ç�†ä¸�å�Œï¼‰ã€‚ + +ä¸�能回退 SELECT 语å�¥ï¼Œå›žé€€Â SELECT 语å�¥ä¹Ÿæ²¡æ„�义;也ä¸�能回退 CRETE 和 DROP 语å�¥ã€‚ + +MySQL 的事务æ��交默认是éš�å¼�æ��交,也就是æ¯�执行一æ�¡è¯­å�¥å°±ä¼šæ��交一次。当出现 START TRANSACTION 语å�¥æ—¶ï¼Œä¼šå…³é—­éš�å¼�æ��交;当 COMMIT 或 ROLLBACK 语å�¥æ‰§è¡Œå�Žï¼Œäº‹åŠ¡ä¼šè‡ªåŠ¨å…³é—­ï¼Œé‡�æ–°æ�¢å¤�éš�å¼�æ��交。 + +通过设置 autocommit 为 0 å�¯ä»¥å�–消自动æ��交,直到 autocommit 被设置为 1 æ‰�会æ��交;autocommit 标记是针对æ¯�个连接而ä¸�是针对æœ�务器的。 + +如果没有设置ä¿�留点,ROLLBACK 会回退到 START TRANSACTION 语å�¥å¤„;如果设置了ä¿�留点,并且在 ROLLBACK 中指定该ä¿�留点,则会回退到该ä¿�留点。 + +```sql +START TRANSACTION +// ... +SAVEPOINT delete1 +// ... +ROLLBACK TO delete1 +// ... +COMMIT +``` + +# 字符集 + +**基本术语** + +1. 字符集为字æ¯�和符å�·çš„集å�ˆï¼› +2. 编ç �为æŸ�个字符集æˆ�员的内部表示; +3. 校对字符指定如何比较,主è¦�用于排åº�和分组。 + +除了给表指定字符集和校对外,也å�¯ä»¥ç»™åˆ—指定: + +```sql +CREATE TABLE mytable +(col VARCHAR(10) CHARACTER SET latin COLLATE latin1_general_ci ) +DEFAULT CHARACTER SET hebrew COLLATE hebrew_general_ci; +``` + +å�¯ä»¥åœ¨æŽ’åº�ã€�分组时指定校对: + +```sql +SELECT * +FROM mytable +ORDER BY col COLLATE latin1_general_ci; +``` + +# æ�ƒé™�管ç�† + +MySQL 的账户信æ�¯ä¿�存在 mysql 这个数æ�®åº“中。 + +```sql +USE mysql; +SELECT user FROM user; +``` + +**创建账户** + +```sql +CREATE USER myuser IDENTIFIED BY 'mypassword'; +``` + +新创建的账户没有任何æ�ƒé™�。 + +**修改账户å��** + +```sql +RENAME myuser TO newuser; +``` + +**删除账户** + +```sql +DROP USER myuser; +``` + +**查看æ�ƒé™�** + +```sql +SHOW GRANTS FOR myuser; +``` +![](index_files/c73aa08e-a987-43c9-92be-adea4a884c25.png) + +账户用 username@host 的形å¼�定义,username@% 使用的是默认主机å��。 + +**授予æ�ƒé™�** + +```sql +GRANT SELECT, INSERT ON mydatabase.* TO myuser; +``` + +**删除æ�ƒé™�** + +```sql +REVOKE SELECT, INSERT ON mydatabase.* FROM myuser; +``` + +GRANT 和 REVOKE å�¯åœ¨å‡ ä¸ªå±‚次上控制访问æ�ƒé™�: + +- 整个æœ�务器,使用 GRANT ALL和 REVOKE ALLï¼› +- 整个数æ�®åº“,使用 ON database.\*ï¼› +- 特定的表,使用 ON database.tableï¼› +- 特定的列; +- 特定的存储过程。 + +**更改密ç �** + +必须使用 Password() 函数 + +```sql +SET PASSWROD FOR myuser = Password('newpassword'); +``` + diff --git a/notes/笔记/一致性原ç�†.md.txt b/notes/笔记/一致性原ç�†.md.txt new file mode 100644 index 00000000..00360a0b --- /dev/null +++ b/notes/笔记/一致性原ç�†.md.txt @@ -0,0 +1,219 @@ +[TOC] +# 两阶段æ��交å��议(2PC) + +ä¿�è¯�多个节点æ“�作的原å­�性,实现事务æ“�作。 + +包å�«ä¸¤ç±»èŠ‚ç‚¹ï¼šå��调者(coordinator)和å�‚与者(participants),å��调者å�ªæœ‰ä¸€ä¸ªï¼Œå�‚与者å�¯ä»¥æœ‰å¤šä¸ªã€‚ + +**Phase1:**请求阶段,å��调者通知事务å�‚与者准备æ��交或者å�–消事务,然å�Žè¿›å…¥è¡¨å†³è¿‡ç¨‹ã€‚在表决过程中,å�‚与者告知å��调者自己的决策:如果事务在本地执行æˆ�功,就告知å�Œæ„�,å�¦è€…告知å�–消。 + +**Phase2:**æ��交阶段,å��调者将基于表决阶段的投票结果进行决策,当且仅当所有å�‚与者å�Œæ„�æ��交事务,决策结果æ‰�为å�Œæ„�,å�¦è€…为å�–消。å��调者把决策结果通知所有的å�‚与者,å�‚与者接收到å��调者å�‘æ�¥çš„æ¶ˆæ�¯å�Žæ‰§è¡Œç›¸åº”çš„æ“�作。 + +# Paxoså��è®® + +Paxos用于确ä¿�多个节点对æŸ�个投票达æˆ�一致。常用æ�¥é€‰ä¸¾ä¸»èŠ‚ç‚¹ï¼Œå½“ä¸»èŠ‚ç‚¹å‡ºçŽ°æ•…éšœæ—¶ï¼Œä½¿ç”¨Paxoså��议就å�¯ä»¥ä»Žå¤‡èŠ‚ç‚¹ä¸­é€‰ä¸¾å‡ºæ–°çš„ä¸»èŠ‚ç‚¹ã€‚ä¹Ÿç”¨æ�¥æž„建高å�¯ç”¨çš„全局æœ�务,例如分布å¼�é”�æœ�务,全局命å��å’Œé…�ç½®æœ�务等,Apache Zookeeper就实现了Paxos。 + +Paxoså��议涉å�Šä¸¤ç±»èŠ‚ç‚¹ï¼šæ��议者(proposer)和接å�—者(acceptor)。 + +在å�ªæœ‰ä¸€ä¸ªproposer的情况下,Paxoså��议执行步骤如下: + +1. 批准:proposerå�‘é€�æ��议给acceptor,acceptor决定接å�—或者拒ç»�这个æ��议; +2. 确认:如果超过一å�Šçš„acceptor接å�—,则æ��议生效,proposerå�‘é€�acknowledge消æ�¯é€šçŸ¥æ‰€æœ‰çš„acceptoræ��议生效。 + +如果存在网络分区的情况下,å�¯èƒ½ä¼šå­˜åœ¨å¤šä¸ªproposer,用æ��è®®å�·æ�¥æŽ§åˆ¶æ¯�个æ��议,å�ªæœ‰æ��è®®å�·æœ€å¤§çš„æ‰�会被接å�—。 + +![](index_files/f257d633-48e9-431e-9206-625ec36bfab5.jpg) + +# Raftå��è®® + +Raftå’ŒPoxaså�Œä¸ºä¸€è‡´æ€§å��议,但是更容易ç�†è§£ï¼Œä¹Ÿæ›´å®¹æ˜“实现。 + +[Raftå�¯è§†åŒ–](http://thesecretlivesofdata.com/raft/) + +有三ç§�节点:Followerã€�Candidateå’ŒLeader。 + +Leader会周期性的å�‘é€�消æ�¯ç»™Follower。æ¯�个Follower都设置了一个éš�机的竞选超时时间,一般为150ms~300ms,如果在这个时间内没有收到Leader的消æ�¯ï¼Œåˆ™èŠ‚ç‚¹å°±ä¼šå�˜æˆ�Candidate,进入竞选阶段。最开始系统å�ªæœ‰Follower。 + +![](index_files/5.gif) + +Candidate会请求其它所有节点的投票,如果一个Candidate获得多数票,则它æˆ�为Leader。 + +所有æ�¥è‡ªå®¢æˆ·ç«¯çš„修改都会被传到Leader,æ¯�个修改被作为一个entry添加到节点的日志。Leaderå…ˆä¸�会修改其节点值,而是把entry都赋值到所有的Follower,å�ªæœ‰æ‰€æœ‰çš„Follower都写入这个entry,Leaderæ‰�会修改节点值,并且通知所有的Follower也修改节点值。 + +![](index_files/4.gif) + +该å��议也å�¯ä»¥ç”¨æ�¥å¤„ç�†ç½‘络分区的问题。 + +![](index_files/3.gif) + +# 拜å� åº­å°†å†›é—®é¢˜ + +该问题主è¦�用于ä¿�è¯�分布å¼�系统的一致性和å�¯ç”¨æ€§ã€‚ + +## 问题场景 + +拜å� åº­å¸�国想è¦�进攻一个强大的敌人,为此派出了10支军队去包围这个敌人。这个敌人虽ä¸�比拜å� åº­å¸�国,但也足以抵御5支常规拜å� åº­å†›é˜Ÿçš„å�Œæ—¶è¢­å‡»ã€‚基于一些原因,这10支军队ä¸�能集å�ˆåœ¨ä¸€èµ·å�•点çª�破,必须在分开的包围状æ€�下å�Œæ—¶æ”»å‡»ã€‚他们任一支军队å�•独进攻都毫无胜算,除é�žæœ‰è‡³å°‘6支军队å�Œæ—¶è¢­å‡»æ‰�能攻下敌国。他们分散在敌国的四周,ä¾�é� é€šä¿¡å…µç›¸äº’通信æ�¥å��商进攻æ„�å�‘å�Šè¿›æ”»æ—¶é—´ã€‚困扰这些将军的问题是,他们ä¸�确定他们中是å�¦æœ‰å�›å¾’,å�›å¾’å�¯èƒ½æ“…自å�˜æ›´è¿›æ”»æ„�å�‘或者进攻时间。在这ç§�状æ€�下,拜å� åº­å°†å†›ä»¬èƒ½å�¦æ‰¾åˆ°ä¸€ç§�分布å¼�çš„å��è®®æ�¥è®©ä»–们能够远程å��商,从而赢å�–战斗?这就是著å��的拜å� åº­å°†å†›é—®é¢˜ã€‚ + +## 相关问题:两军问题 + +拜å� åº­å°†å†›é—®é¢˜ä¸­å¹¶ä¸�去考虑通信兵是å�¦ä¼šè¢«æˆªèŽ·æˆ–æ— æ³•ä¼ è¾¾ä¿¡æ�¯ç­‰é—®é¢˜ï¼Œå�³æ¶ˆæ�¯ä¼ é€’的信é�“ç»�无问题。如果需è¦�考虑信é�“是有问题的,这涉å�Šåˆ°äº†å�¦ä¸€ä¸ªç›¸å…³é—®é¢˜ï¼šä¸¤å†›é—®é¢˜ã€‚ + +![](index_files/a8ec729f-cb9b-4daa-93a4-c6851db6e111.jpg) + +白军驻扎在沟渠里,è“�军则分散在沟渠两边。白军比任何一支è“�军都更为强大,但是è“�军若能å�Œæ—¶å�ˆåŠ›è¿›æ”»åˆ™èƒ½å¤Ÿæ‰“è´¥ç™½å†›ã€‚ä»–ä»¬ä¸�能够远程的沟通,å�ªèƒ½æ´¾é�£é€šä¿¡å…µç©¿è¿‡æ²Ÿæ¸ åŽ»é€šçŸ¥å¯¹æ–¹è“�军å��商进攻时间。是å�¦å­˜åœ¨ä¸€ä¸ªèƒ½ä½¿è“�军必胜的通信å��议,这就是两军问题。通信兵得ç»�过敌人的沟渠,在这过程中他å�¯èƒ½è¢«æ�•,也就是说,两军问题中信é�“是ä¸�å�¯é� çš„,并且其中没有å�›å¾’之说,这就是两军问题和拜å� åº­å°†å†›é—®é¢˜çš„æ ¹æœ¬æ€§ä¸�å�Œã€‚ + +倘若1å�·è“�军(简称1)å�‘2å�·è“�军(简称2)派出了通信兵,若1è¦�知é�“2是å�¦æ”¶åˆ°äº†è‡ªå·±çš„ä¿¡æ�¯ï¼Œ1å¿…é¡»è¦�求2给自己传输一个回执,说“你的信æ�¯æˆ‘å·²ç»�收到了,我å�Œæ„�ä½ æ��议的明天早上10点9分准时进攻â€�。然而,就算2å·²ç»�é€�出了这æ�¡ä¿¡æ�¯ï¼Œ2也ä¸�能确定1就一定会在这个时间进攻,因为2å�‘出的回执1å¹¶ä¸�一定能够收到。所以,1å¿…é¡»å†�ç»™2å�‘出一个回执说“我收到了â€�,但是1也ä¸�会知é�“2是å�¦æ”¶åˆ°äº†è¿™æ ·ä¸€ä¸ªå›žæ‰§ï¼Œæ‰€ä»¥1还会期待一个2的回执。但在这个系统中永远需è¦�存在一个回执,这对于两方æ�¥è¯´éƒ½å¹¶ä¸�一定能够达æˆ�å��足的确信。更è¦�命的是,我们还没有考虑,通信兵的信æ�¯è¿˜æœ‰å�¯èƒ½è¢«ç¯¡æ”¹ã€‚由此å�¯è§�,ç»�典情形下两军问题是ä¸�å�¯è§£çš„,并ä¸�存在一个能使è“�军一定胜利的通信å��议。 + +ä¸�幸的是,两军问题作为现代通信系统中必须解决的问题,我们尚ä¸�能将之完全解决,这æ„�味ç�€ä½ æˆ‘传输信æ�¯æ—¶ä»�ç„¶å�¯èƒ½å‡ºçް䏢失ã€�监å�¬æˆ–篡改的情况。但我们能ä¸�能通过一ç§�相对å�¯é� çš„æ–¹å¼�æ�¥è§£å†³å¤§éƒ¨åˆ†æƒ…形呢?这需è¦�谈到TCPå��议。 + +![](index_files/10a84b72-c2fe-470b-b10c-07720c7380d1.jpg) + +TCPå��议中,Aå…ˆå�‘Bå�‘出一个éš�机数x,B收到x了以å�Žï¼Œå�‘ç»™Aå�¦ä¸€ä¸ªéš�机数y以å�Šx+1作为答å¤�,这样A就知é�“Bå·²ç»�收到了,因为è¦�ç ´è§£éš�机数xå�¯èƒ½æ€§å¹¶ä¸�大;然å�ŽAå†�å�‘回y+1ç»™B,这样B就知é�“Aå·²ç»�收到了。这样,Aå’ŒB之间就建立一个å�¯é� çš„连接,彼此相信对方已ç»�收到并确认了信æ�¯ã€‚而事实上,Aå¹¶ä¸�会知é�“B是å�¦æ”¶åˆ°äº†y+1;并且,由于信é�“çš„ä¸�å�¯é� æ€§ï¼Œx或者y都是å�¯èƒ½è¢«æˆªèŽ·çš„ï¼Œè¿™äº›é—®é¢˜è¯´æ˜Žäº†å�³ä½¿æ˜¯ä¸‰æ¬¡æ�¡æ‰‹ï¼Œä¹Ÿå¹¶ä¸�能够彻底解决两军问题,å�ªæ˜¯åœ¨çŽ°å®žæˆ�本å�¯æŽ§çš„æ�¡ä»¶ä¸‹ï¼Œæˆ‘们把TCPå��议当作了两军问题的现实å�¯è§£æ–¹æ³•。 + +## 问题形å¼�化 + +å�ªè¦�忠诚的将军能够让别的将军接å�—到自己真实æ„�图,并且所有忠诚将军能够达æˆ�一致的决定,就能解决该问题。 + +定义一个å�˜é‡�vi,作为其他将军收到的第i个将军的命令值;之å�Žï¼Œå®šä¹‰ä¸€ä¸ªå‡½æ•°æ�¥å¤„ç�†å�‘é‡�(v1,v2,…,vn),å�„将军用这个函数的结果作为自己最终采用的命令。 + +**一致性æ�¡ä»¶**:æ¯�一个忠诚的将军必须得到相å�Œçš„(v1,v2,…,vn)。这æ„�味ç�€ï¼Œå¿ è¯šçš„将军并ä¸�一定使用i将军é€�æ�¥çš„ä¿¡æ�¯ä½œä¸ºvi,i将军也å�¯èƒ½æ˜¯å�›å¾’。 + +**正确性æ�¡ä»¶**:若i将军是忠诚的,其他忠诚的将军必须以他é€�出的值作为vi。 + +改写一致性æ�¡ä»¶å¦‚下:无论i将军是忠诚或是å�›å¾’,任何两个忠诚的将军都使用相å�Œçš„vi。这是很巧妙的一步转æ�¢ï¼Œå¦‚此一致性æ�¡ä»¶ï¼‰å’Œæ­£ç¡®æ€§æ�¡ä»¶éƒ½å�ªæ¶‰å�Šä¸€ä¸ªå°†å†›i如何帮别的将军接å�—自己é€�出的值vi,所以å�¯ä»¥å°†é—®é¢˜æ”¹ä¸ºå�¸ä»¤-副官模å¼�æ�¥ç®€åŒ–问题,å�³ä¸€ä¸ªå�¸ä»¤æŠŠè‡ªå·±çš„命令传递给n-1个副官。 + +**IC1:**所有忠诚的副官é�µå®ˆä¸€ä¸ªå‘½ä»¤ï¼Œå�³ä¸€è‡´æ€§ã€‚ + +**IC2:**è‹¥å�¸ä»¤æ˜¯å¿ è¯šçš„,æ¯�一个忠诚的副官é�µå®ˆä»–å�‘出的命令,å�³æ­£ç¡®æ€§ã€‚ + +å�¸ä»¤-副官模å¼�å�ªè¦�å°†å�¸ä»¤é��历å�„个将军,就å�¯ä»¥å�˜æˆ�完整问题,而他们采用的算法å�¯ä»¥æ˜¯å®Œå…¨ä¸€è‡´çš„。在这ç§�模å¼�下,å�¸ä»¤å‰¯å®˜çš„å½¢å¼�下达æˆ�的一致æ„�味ç�€å�¸ä»¤çš„命令得到了有效传达,若出现了异议,有异议的将军会作为å�¸ä»¤å�‘èµ·æ–°çš„å�¸ä»¤å‰¯å®˜æ¨¡å¼�寻求自己的观点表达,以å��商达æˆ�一致。 + +有两ç§�解决方法:å�£å¤´å��议和书é�¢å��议。 + +**4.4 å�£å¤´å��è®®** + +å�£å¤´å��议满足以下æ�¡ä»¶ï¼š + +**A1:**æ¯�个被å�‘é€�的消æ�¯éƒ½èƒ½å¤Ÿè¢«æ­£ç¡®çš„æŠ•递 + +**A2:**ä¿¡æ�¯æŽ¥æ”¶è€…知é�“是è°�å�‘é€�的消æ�¯ + +**A3:**能够知é�“缺少的消æ�¯ + +**4.4.1 OM(m)** + +采用å�£å¤´å��议,若å�›å¾’数少于1/3,则拜å� åº­å°†å†›é—®é¢˜å�¯è§£ã€‚这个结论说明了,对于拜å� åº­å°†å†›é—®é¢˜ï¼Œç”±äºŽå�›å¾’å�¯ä»¥å�šå‡ºå�„ç§�å�„样的判断,就必须四模冗余系统æ‰�足够容错。 + +**OM(0)算法** + +**(1)**å�¸ä»¤å°†ä»–的命令å�‘é€�ç»™æ¯�个副官。 + +**(2)**æ¯�个副官采用从å�¸ä»¤å�‘æ�¥çš„命令;如果没有收到命令,则默认为撤退命令。 + +**OM(m)算法** + +**(1)**å�¸ä»¤å°†ä»–的命令å�‘é€�ç»™æ¯�个副官。 + +**(2)**对于æ¯�个i,vi是æ¯�个副官i从å�¸ä»¤æ”¶åˆ°çš„命令,如果没有收到命令,则默认为撤退命令。副官i在OM(m-1) 中作为å�‘令者将之å�‘é€�ç»™å�¦å¤–n-2 个副官。 + +**(3)**对于æ¯�个i,和æ¯�个j ≠ i,vj 是副官i 从第2步中的副官j (使用OM(m-1)算法)å�‘é€�过æ�¥çš„命令,如果没有收到第2步中副官j 的命令,则默认为撤退命令。最å�Žå‰¯å®˜i 使用majority(v1,…,vn-1)得到命令。 + +这个算法是一个递归算法,在OM(m)中需è¦�采用OM(m-1)得到相关结果。m代表的是å�›å¾’æ•°é‡�,从m到0,æ„�味ç�€å¯¹äºŽæ¯�个将军,需è¦�m+1轮的算法æ‰�能完æˆ�。 + +该算法是关于m的,æ„�味ç�€ä½¿ç”¨è¯¥ç®—法必须知é�“有多少个å�›å¾’。 + +对于任æ„�kn,将该哈希空间看æˆ�一个哈希环,将æ¯�个节点都é…�置到哈希环上。æ¯�个数æ�®å¯¹è±¡é€šè¿‡å“ˆå¸Œå�–模得到哈希值之å�Žï¼Œå­˜æ”¾åˆ°å“ˆå¸ŒçŽ¯ä¸­é¡ºæ—¶é’ˆæ–¹å�‘第一个大于等于该哈希值的节点上。 + +![](index_files/d2d34239-e7c1-482b-b33e-3170c5943556.jpg) + +一致性哈希的优点是在加入或者删除节点时å�ªä¼šå½±å“�到哈希环中相邻的节点,例如下图中新增节点 X,å�ªéœ€è¦�将数æ�®å¯¹è±¡Â C é‡�新存放到节点 X 上å�³å�¯ï¼Œè€Œå¯¹äºŽèŠ‚ç‚¹Â Aã€�Bã€�D 都没有影å“�。 + +![](index_files/91ef04e4-923a-4277-99c0-6be4ce81e5ac.jpg) + +## 顺åº�分布 + +顺åº�分布将有åº�的数æ�®åˆ’分为多个连续的部分,按一定策略分布到ä¸�å�ŒèŠ‚ç‚¹ä¸Šã€‚ + +## 负载å�‡è¡¡ + +分布å¼�存储系统中æ¯�个集群都有一个总控节点,其它节点为工作节点,由总控节点根æ�®å…¨å±€è´Ÿè½½ä¿¡æ�¯è¿›è¡Œæ•´ä½“调度。系统è¿�行过程中需è¦�ä¸�断地执行数æ�®è¿�移工作,将数æ�®ä»Žè´Ÿè½½è¾ƒé«˜çš„工作节点è¿�移到负载较低的工作节点。 + +工作节点通过心跳包(Heartbeat,定时å�‘é€�)将节点负载相关的信æ�¯ï¼Œå¦‚ CPUã€�内存ã€�ç£�盘ã€�网络等资æº�使用情况å�‘é€�给总控节点。 + +考虑到一个新上线的节点由于其负载较低,如果ä¸�加控制,总控节点会将大é‡�æ•°æ�®å�Œæ—¶è¿�移到该节点上,造æˆ�该节点一段时间内无法工作。因此负载å�‡è¡¡æ“�作需è¦�平滑进行,新加入的节点需è¦�较长的一段时间æ�¥è¾¾åˆ°æ¯”较å�‡è¡¡çš„状æ€�。 + +# å¤�制 + +## 主从å¤�制 + +分布å¼�存储系统采用冗余机制,将一份数æ�®ä¿�存多份副本。多个副本通常有一个为主副本,其它为备副本。主副本用æ�¥å¤„ç�†å†™è¯·æ±‚,并将写æ“�作日志å�Œæ­¥åˆ°å¤‡å‰¯æœ¬ï¼Œå¤‡å‰¯æœ¬é€šè¿‡å›žæ”¾æ“�作日志æ�¥ä¿�è¯�æ•°æ�®ä¸€è‡´æ€§ã€‚主副本和备副本都å�¯ä»¥å¤„ç�†è¯»è¯·æ±‚。当主副本出现故障时,å�¯ä»¥å°†ä¸€ä¸ªå¤‡å‰¯æœ¬é€‰ä¸¾ä¸ºä¸»å‰¯æœ¬ã€‚ + +有两ç§�å�Œæ­¥æ–¹å¼�:强å�Œæ­¥å¤�制和异步å¤�制。强å�Œæ­¥å¤�制è¦�求备副本对写æ“�作日志回放æˆ�功之å�Žæ‰�算完æˆ�,而异步å¤�制å�ªéœ€è¦�主副本在本地上的修改完æˆ�就算完æˆ�。强å�Œæ­¥å¤�制一致性好,但是å�¯ç”¨æ€§å·®ï¼Œå¼‚æ­¥å¤�制方å¼�相å��。 + +## CAP + +分布å¼�存储系统ä¸�å�¯èƒ½å�Œæ—¶ç¡®ä¿�一致性(Consistency)ã€�å�¯ç”¨æ€§ï¼ˆAvailablity)和分区容å¿�性(Partition),设计中往往需è¦�弱化对æŸ�个特性的ä¿�è¯�。 + +- 一致性:读æ“�作总是能读å�–到之å‰�完æˆ�的写æ“�作结果,满足这个æ�¡ä»¶çš„系统称为强一致性系统; +- å�¯ç”¨æ€§ï¼šè¯»å†™æ“�作在å�•å�°æœºå™¨å�‘生故障的情况下ä»�然能够正常执行; +- 分区容å¿�性:å…�许å�‘生网络分区。 + +# 容错 + +大规模集群æ¯�天都有故障å�‘生,分布å¼�存储系统需è¦�实现自动化容错,æ‰�能实现高å�¯ç”¨ä»¥å�Šå‡�少人工è¿�ç»´æˆ�本。 + +## 故障检测 + +通过**租约机制**æ�¥å¯¹æ•…障进行检测。å�‡è®¾èŠ‚ç‚¹Â A 为主控节点,节点 A å�‘节点 B å�‘é€�租约,节点 B 在租约规定的期é™�内æ‰�能æ��ä¾›æœ�务。当节点 B 拥有的租约规定的期é™�å�—到达时,节点 B å�‘ A é‡�新申请租约,å�¦åˆ™ä¸»åЍå�œæ­¢æœ�务。 + +## 故障æ�¢å¤� + +当æŸ�个节点故障时,就将它上é�¢çš„æœ�务è¿�移到其它节点。 + +# CDN 架构 + +CND 通过将网络内容å�‘布到é� è¿‘用户的边缘节点,使ä¸�å�Œåœ°åŸŸçš„用户在访问相å�Œç½‘页时å�¯ä»¥å°±è¿‘获å�–。这样既å�¯ä»¥å‡�è½»æœ�务器的负担,也å�¯ä»¥æ��高用户的访问速度。 + +从下图å�¯ä»¥çœ‹å‡ºï¼ŒDNS 在对域å��è§£æž�æ—¶ä¸�å†�å�‘用户返回æº�æœ�务器的 IP 地å�€ï¼Œè€Œæ˜¯è¿”回边缘节点的 IP 地å�€ï¼Œæ‰€ä»¥ç”¨æˆ·æœ€ç»ˆè®¿é—®çš„æ˜¯è¾¹ç¼˜èŠ‚ç‚¹ã€‚è¾¹ç¼˜ä¼šå…ˆä»Žæº�æœ�务器中获å�–用户所需的数æ�®ï¼Œå¦‚果请求æˆ�功,边缘节点会将页é�¢ç¼“存下æ�¥ï¼Œä¸‹æ¬¡ç”¨æˆ·è®¿é—®æ—¶å�¯ä»¥ç›´æŽ¥è¯»å�–。 + +![](index_files/dbd60b1f-b700-4da6-a993-62578e892333.jpg) + + +# å�‚考资料 + +- æ�¨ä¼ è¾‰. 大规模分布å¼�存储系统: 原ç�†è§£æž�与架构实战[M]. 机械工业出版社, 2013. \ No newline at end of file diff --git a/notes/笔记/剑指 offer 题解.md.txt b/notes/笔记/剑指 offer 题解.md.txt new file mode 100644 index 00000000..44193c47 --- /dev/null +++ b/notes/笔记/剑指 offer 题解.md.txt @@ -0,0 +1,1728 @@ +[TOC] + +# 第二章 é�¢è¯•需è¦�的基础知识 + +## 2. 实现 Singleton + +**ç»�典实现** + +以下实现中,ç§�有é�™æ€�å�˜é‡�被延迟化实例化,这样å�šçš„好处是,如果没有用到该类,那么就ä¸�会创建该ç§�有é�™æ€�å�˜é‡�,从而节约资æº�。这个实现在多线程环境下是ä¸�安全的,因为多个线程能够å�Œæ—¶è¿›å…¥ if(uniqueInstance == null) 内的语å�¥å�—,那么就会多次实例化 uniqueInstance ç§�有é�™æ€�å�˜é‡�。 + +```java +public class Singleton { + private static Singleton uniqueInstance; + private Singleton() { + } + public static Singleton getUniqueInstance() { + if (uniqueInstance == null) { + uniqueInstance = new Singleton(); + } + return uniqueInstance; + } +} +``` + +**线程ä¸�安全问题的解决方案一** + +å�ªéœ€è¦�对 getUniqueInstance() 方法加é”�,就能让该方法一次å�ªèƒ½ä¸€ä¸ªçº¿ç¨‹è®¿é—®ï¼Œä»Žè€Œé�¿å…�了对 uniqueInstance å�˜é‡�进行多次实例化的问题。但是这样有一个问题是一次å�ªèƒ½ä¸€ä¸ªçº¿ç¨‹è¿›å…¥ï¼Œæ€§èƒ½ä¸Šä¼šæœ‰ä¸€å®šçš„æµªè´¹ã€‚ + +```java +public static synchronized Singleton getUniqueInstance() { + if (uniqueInstance == null) { + uniqueInstance = new Singleton(); + } + return uniqueInstance; +} +``` +**线程ä¸�安全问题的解决方案二** + +ä¸�用延迟实例化,采用直接实例化。 + +```java +private static Singleton uniqueInstance = new Singleton(); +``` + +**线程ä¸�安全问题的解决方案三** + +考虑第一个解决方案,它是直接对 getUniqueInstance() 方法进行加é”�,而实际上å�ªéœ€è¦�对 uniqueInstance = new Singleton(); è¿™æ�¡è¯­å�¥åŠ é”�å�³å�¯ã€‚使用两个æ�¡ä»¶è¯­å�¥æ�¥åˆ¤æ–­ uniqueInstance 是å�¦å·²ç»�实例化,如果没有实例化æ‰�需è¦�加é”�。 + +```java +public class Singleton { + private volatile static Singleton uniqueInstance; + private Singleton() { + } + public static synchronized Singleton getUniqueInstance() { + if (uniqueInstance == null) { + synchronized (Singleton.class) { + if (uniqueInstance == null) { + uniqueInstance = new Singleton(); + } + } + } + return uniqueInstance; + } +} +``` + +## 3. 数组中é‡�å¤�的数字 + +**题目æ��è¿°** + +在一个长度为 n 的数组里的所有数字都在 0 到 n-1 的范围内。 数组中æŸ�些数字是é‡�å¤�的,但ä¸�知é�“有几个数字是é‡�å¤�的。也ä¸�知é�“æ¯�个数字é‡�å¤�几次。请找出数组中任æ„�一个é‡�å¤�的数字。 例如,如果输入长度为 7 的数组 {2, 3, 1, 0, 2, 5, 3},那么对应的输出是第一个é‡�å¤�的数字 2。 + +**解题æ€�è·¯** + +è¿™ç§�数组元素在 [0, n-1] 范围内的问题,å�¯ä»¥å°†å€¼ä¸º i 的元素放到第 i 个ä½�置上。 + +```java +public boolean duplicate(int numbers[], int length, int[] duplication) { + for (int i = 0; i < length; i++) { + while (numbers[i] != i && numbers[i] != numbers[numbers[i]]) { + swap(numbers, i, numbers[i]); + } + if (numbers[i] != i && numbers[i] == numbers[numbers[i]]) { + duplication[0] = numbers[i]; + return true; + } + } + return false; +} + +private void swap(int[] numbers, int i, int j) { + int t = numbers[i]; + numbers[i] = numbers[j]; + numbers[j] = t; +} +``` + +## 4. 二维数组中的查找 + +**题目æ��è¿°** + +在一个二维数组中,æ¯�一行都按照从左到å�³é€’增的顺åº�排åº�,æ¯�一列都按照从上到下递增的顺åº�排åº�。请完æˆ�一个函数,输入这样的一个二维数组和一个整数,判断数组中是å�¦å�«æœ‰è¯¥æ•´æ•°ã€‚ + +```java +public boolean Find(int target, int [][] array) { + if (array == null || array.length == 0 || array[0].length == 0) return false; + int m = array.length, n = array[0].length; + int row = 0, col = n - 1; + while (row < m && col >= 0) { + if (target == array[row][col]) return true; + else if (target < array[row][col]) col--; + else row++; + } + return false; +} +``` + +## 5. 替æ�¢ç©ºæ ¼ + +**题目æ��è¿°** + +请实现一个函数,将一个字符串中的空格替æ�¢æˆ�“%20â€�。例如,当字符串为 We Are Happy. 则ç»�过替æ�¢ä¹‹å�Žçš„字符串为 We%20Are%20Happy。 + +**题目è¦�求** + +以 O(1) 的空间å¤�æ�‚度æ�¥æ±‚解。 + +```java +public String replaceSpace(StringBuffer str) { + int n = str.length(); + for (int i = 0; i < n; i++) { + if (str.charAt(i) == ' ') str.append(" "); // 尾部填充两个 + } + + int idxOfOriginal = n - 1; + int idxOfNew = str.length() - 1; + while (idxOfOriginal >= 0 && idxOfNew > idxOfOriginal) { + if (str.charAt(idxOfOriginal) == ' ') { + str.setCharAt(idxOfNew--, '0'); + str.setCharAt(idxOfNew--, '2'); + str.setCharAt(idxOfNew--, '%'); + } else { + str.setCharAt(idxOfNew--, str.charAt(idxOfOriginal)); + } + idxOfOriginal--; + } + return str.toString(); +} +``` + +## 6. 从尾到头打å�°é“¾è¡¨ + +æ­£å�‘é��历然å�Žè°ƒç”¨ Collections.reverse(). + +```java +public ArrayList printListFromTailToHead(ListNode listNode) { + ArrayList ret = new ArrayList<>(); + while (listNode != null) { + ret.add(listNode.val); + listNode = listNode.next; + } + Collections.reverse(ret); + return ret; +} +``` + +递归 + +```java +public ArrayList printListFromTailToHead(ListNode listNode) { + ArrayList ret = new ArrayList<>(); + if(listNode != null) { + ret.addAll(printListFromTailToHead(listNode.next)); + ret.add(listNode.val); + } + return ret; +} +``` + +ä¸�使用库函数,并且ä¸�使用递归的迭代实现,利用链表的头æ�’法为逆åº�的特性。 + +```java +public ArrayList printListFromTailToHead(ListNode listNode) { + ListNode head = new ListNode(-1); // 头结点 + ListNode cur = listNode; + while (cur != null) { + ListNode next = cur.next; + cur.next = head.next; + head.next = cur; + cur = next; + } + ArrayList ret = new ArrayList<>(); + head = head.next; + while (head != null) { + ret.add(head.val); + head = head.next; + } + return ret; +} +``` + +## 7. é‡�建二å�‰æ ‘ + +**题目æ��è¿°** + +æ ¹æ�®äºŒå�‰æ ‘çš„å‰�åº�é��历和中åº�é��历的结果,é‡�建出该二å�‰æ ‘。 + +```java +public TreeNode reConstructBinaryTree(int[] pre, int[] in) { + return reConstructBinaryTree(pre, 0, pre.length - 1, in, 0, in.length - 1); +} +private TreeNode reConstructBinaryTree(int[] pre, int preL, int preR, int[] in, int inL, int inR) { + if(preL > preR || inL > inR) return null; + TreeNode root = new TreeNode(pre[preL]); + if (preL != preR) { + int idx = inL; + while (idx <= inR && in[idx] != root.val) idx++; + int leftTreeLen = idx - inL; + root.left = reConstructBinaryTree(pre, preL + 1, preL + leftTreeLen, in, inL, inL + leftTreeLen - 1); + root.right = reConstructBinaryTree(pre, preL + leftTreeLen + 1, preR, in, inL + leftTreeLen + 1, inR); + } + return root; +} +``` + +## 8. 二å�‰æ ‘的下一个结点 + +**题目æ��è¿°** + +给定一个二å�‰æ ‘和其中的一个结点,请找出中åº�é��历顺åº�的下一个结点并且返回。注æ„�,树中的结点ä¸�仅包å�«å·¦å�³å­�结点,å�Œæ—¶åŒ…å�«æŒ‡å�‘父结点的指针。 + +```java +public TreeLinkNode GetNext(TreeLinkNode pNode) { + if (pNode == null) return null; + if (pNode.right != null) { + pNode = pNode.right; + while (pNode.left != null) pNode = pNode.left; + return pNode; + } else { + TreeLinkNode parent = pNode.next; + while (parent != null) { + if (parent.left == pNode) return parent; + pNode = pNode.next; + parent = pNode.next; + } + } + return null; +} +``` + +## 9. 用两个栈实现队列 + +```java +Stack stack1 = new Stack(); +Stack stack2 = new Stack(); + +public void push(int node) { + stack1.push(node); +} + +public int pop() { + if (stack2.isEmpty()) { + while (!stack1.isEmpty()) { + stack2.push(stack1.pop()); + } + } + return stack2.pop(); +} +``` + +## 10.1 æ–�波那契数列 + +```java +private int[] fib = new int[40]; + +public Solution() { + fib[1] = 1; + fib[2] = 2; + for (int i = 2; i < fib.length; i++) { + fib[i] = fib[i - 1] + fib[i - 2]; + } +} + +public int Fibonacci(int n) { + return fib[n]; +} +``` + +## 10.2 è·³å�°é˜¶ + +```java +public int JumpFloor(int target) { + if (target == 1) return 1; + int[] dp = new int[target]; + dp[0] = 1; + dp[1] = 2; + for (int i = 2; i < dp.length; i++) { + dp[i] = dp[i - 1] + dp[i - 2]; + } + return dp[target - 1]; +} +``` + +## 10.3 å�˜æ€�è·³å�°é˜¶ + +```java +public int JumpFloorII(int target) { + int[] dp = new int[target]; + Arrays.fill(dp, 1); + for (int i = 1; i < target; i++) { + for (int j = 0; j < i; j++) { + dp[i] += dp[j]; + } + } + return dp[target - 1]; +} +``` + +## 10.4 矩形覆盖 + +**题目æ��è¿°** + +我们å�¯ä»¥ç”¨ 2\*1 çš„å°�矩形横ç�€æˆ–者竖ç�€åŽ»è¦†ç›–æ›´å¤§çš„çŸ©å½¢ã€‚è¯·é—®ç”¨ n 个 2\*1 çš„å°�矩形无é‡�å� åœ°è¦†ç›–一个 2\*n 的大矩形,总共有多少ç§�方法? + +```java +public int RectCover(int target) { + if (target <= 2) return target; + return RectCover(target - 1) + RectCover(target - 2); +} +``` + + +## 11. 旋转数组的最å°�æ•°å­— + +**题目æ��è¿°** + +把一个数组最开始的若干个元素æ�¬åˆ°æ•°ç»„的末尾,我们称之为数组的旋转。 输入一个é�žé€’å‡�排åº�的数组的一个旋转,输出旋转数组的最å°�元素。 例如数组 {3, 4, 5, 1, 2} 为 {1, 2, 3, 4, 5} 的一个旋转,该数组的最å°�值为 1。 NOTE:给出的所有元素都大于 0,若数组大å°�为 0,请返回 0。 + +```java +public int minNumberInRotateArray(int[] array) { + if (array.length == 0) return 0; + for (int i = 0; i < array.length - 1; i++) { + if (array[i] > array[i + 1]) return array[i + 1]; + } + return 0; +} +``` + +## 12. 矩阵中的路径 + +**题目æ��è¿°** + +请设计一个函数,用æ�¥åˆ¤æ–­åœ¨ä¸€ä¸ªçŸ©é˜µä¸­æ˜¯å�¦å­˜åœ¨ä¸€æ�¡åŒ…å�«æŸ�字符串所有字符的路径。路径å�¯ä»¥ä»ŽçŸ©é˜µä¸­çš„ä»»æ„�一个格å­�开始,æ¯�一步å�¯ä»¥åœ¨çŸ©é˜µä¸­å�‘左,å�‘å�³ï¼Œå�‘上,å�‘下移动一个格å­�。如果一æ�¡è·¯å¾„ç»�过了矩阵中的æŸ�一个格å­�,则该路径ä¸�能å†�进入该格å­�。 例如 a b c e s f c s a d e e 矩阵中包å�«ä¸€æ�¡å­—符串 "bcced" 的路径,但是矩阵中ä¸�包å�« "abcb" 路径,因为字符串的第一个字符 b å� æ�®äº†çŸ©é˜µä¸­çš„第一行第二个格å­�之å�Žï¼Œè·¯å¾„ä¸�能å†�次进入该格å­�。 + +```java +private int[][] next = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}}; + +public boolean hasPath(char[] matrix, int rows, int cols, char[] str) { + if (rows == 0 || cols == 0) return false; + char[][] m = new char[rows][cols]; + for (int i = 0, idx = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + m[i][j] = matrix[idx++]; + } + } + + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + if (backtracking(m, rows, cols, str, new boolean[rows][cols], 0, i, j)) return true; + } + } + return false; +} + +private boolean backtracking(char[][] m, int rows, int cols, char[] str, boolean[][] used, int path, int r, int c) { + if (path == str.length) return true; + if (r < 0 || r >= rows || c < 0 || c >= cols) return false; + if (m[r][c] != str[path]) return false; + if (used[r][c]) return false; + used[r][c] = true; + for (int i = 0; i < next.length; i++) { + if (backtracking(m, rows, cols, str, used, path + 1, r + next[i][0], c + next[i][1])) return true; + } + used[r][c] = false; + return false; +} +``` + + +## 13. 机器人的è¿�动范围 + +**题目æ��è¿°** + +地上有一个 m 行和 n 列的方格。一个机器人从å��æ ‡ 0, 0 的格å­�开始移动,æ¯�一次å�ªèƒ½å�‘左,å�³ï¼Œä¸Šï¼Œä¸‹å››ä¸ªæ–¹å�‘移动一格,但是ä¸�能进入行å��标和列å��标的数ä½�之和大于 k 的格å­�。 例如,当 k 为 18 时,机器人能够进入方格(35, 37),因为 3+5+3+7 = 18。但是,它ä¸�能进入方格(35, 38),因为 3+5+3+8 = 19。请问该机器人能够达到多少个格å­�? + +```java +private int cnt = 0; +private int[][] next = {{0, -1}, {0, 1}, {-1, 0}, {1, 0}}; +private int[][] digitSum; + +public int movingCount(int threshold, int rows, int cols) { + initDigitSum(rows, cols); + dfs(new boolean[rows][cols], threshold, rows, cols, 0, 0); + return cnt; +} + +private void dfs(boolean[][] visited, int threshold, int rows, int cols, int r, int c) { + if (r < 0 || r >= rows || c < 0 || c >= cols) return; + if (visited[r][c]) return; + visited[r][c] = true; + if (this.digitSum[r][c] > threshold) return; + this.cnt++; + for (int i = 0; i < this.next.length; i++) { + dfs(visited, threshold, rows, cols, r + next[i][0], c + next[i][1]); + } +} + +private void initDigitSum(int rows, int cols) { + int[] digitSumOne = new int[Math.max(rows, cols)]; + for (int i = 0; i < digitSumOne.length; i++) { + int n = i; + while (n > 0) { + digitSumOne[i] += n % 10; + n /= 10; + } + } + this.digitSum = new int[rows][cols]; + for (int i = 0; i < rows; i++) { + for (int j = 0; j < cols; j++) { + this.digitSum[i][j] = digitSumOne[i] + digitSumOne[j]; + } + } +} +``` + +## 14. 剪绳å­� + +**题目æ��è¿°** + +把一根绳å­�剪æˆ�多段,并且使得æ¯�段的长度乘积最大。 + +**解题æ€�è·¯** + +å°½å�¯èƒ½å¤šå¾—剪长度为 3 的绳å­�,并且ä¸�å…�许有长度为 1 的绳å­�出现,如果出现了,就从已ç»�切好长度为 3 的绳å­�中拿出一段与长度为 1 的绳å­�é‡�新组å�ˆï¼ŒæŠŠå®ƒä»¬åˆ‡æˆ�两段长度为 2 的绳å­�。 + +```java +int maxProductAfterCuttin(int length) { + if (length < 2) return 0; + if (length == 2) return 1; + if (length == 3) return 2; + int timesOf3 = length / 3; + if (length - timesOf3 * 3 == 1) timesOf3--; + int timesOf2 = (length - timesOf3 * 3) / 2; + return (int) (Math.pow(3, timesOf3)) * (int) (Math.pow(2, timesOf2)); +} +``` + +## 15. 二进制中 1 的个数 + +```java +public int NumberOf1(int n) { + return Integer.bitCount(n); +} +``` + +n&(n-1) 该ä½�è¿�算是去除 n çš„ä½�级表示中最低的那一ä½�。例如对于二进制表示 10110100,å‡�去 1 得到 10110011,这两个数相与得到 10110000。 + +```java +public int NumberOf1(int n) { + int cnt = 0; + while (n != 0) { + cnt++; + n &= (n - 1); + } + return cnt; +} + +``` + +# 第三章 高质é‡�的代ç � + +## 16. 数值的整数次方 + +```java +public double Power(double base, int exponent) { + if (exponent == 0) return 1; + if (exponent == 1) return base; + boolean isNegative = false; + if (exponent < 0) { + exponent = -exponent; + isNegative = true; + } + double pow = Power(base * base, exponent / 2); + if (exponent % 2 != 0) pow = pow * base; + return isNegative ? 1 / pow : pow; +} +``` + +## 18. 删除链表中é‡�å¤�的结点 + +```java +public ListNode deleteDuplication(ListNode pHead) { + if (pHead == null) return null; + if (pHead.next == null) return pHead; + if (pHead.val == pHead.next.val) { + ListNode next = pHead.next; + while (next != null && pHead.val == next.val) { + next = next.next; + } + return deleteDuplication(next); + } else { + pHead.next = deleteDuplication(pHead.next); + return pHead; + } +} +``` + +## 19. 正则表达å¼�匹é…� + +**题目æ��è¿°** + +请实现一个函数用æ�¥åŒ¹é…�包括 '.' å’Œ '\*' 的正则表达å¼�。模å¼�中的字符 '.' 表示任æ„�一个字符,而 '\*' 表示它å‰�é�¢çš„字符å�¯ä»¥å‡ºçް任æ„�次(包å�« 0 次)。 在本题中,匹é…�是指字符串的所有字符匹é…�整个模å¼�。例如,字符串 "aaa" 与模å¼� "a.a" å’Œ "ab\*ac\*a" 匹é…�,但是与 "aa.a" å’Œ "ab\*a" å�‡ä¸�匹é…� + +```java +public boolean match(char[] str, char[] pattern) { + int n = str.length, m = pattern.length; + boolean[][] dp = new boolean[n + 1][m + 1]; + dp[0][0] = true; + for (int i = 1; i <= m; i++) { + if (pattern[i - 1] == '*') dp[0][i] = dp[0][i - 2]; + } + for (int i = 1; i <= n; i++) { + for (int j = 1; j <= m; j++) { + if (str[i - 1] == pattern[j - 1] || pattern[j - 1] == '.') dp[i][j] = dp[i - 1][j - 1]; + else if (pattern[j - 1] == '*') { + if (pattern[j - 2] != str[i - 1] && pattern[j - 2] != '.') dp[i][j] = dp[i][j - 2]; + else dp[i][j] = dp[i][j - 1] || dp[i][j - 2] || dp[i - 1][j]; + } + } + } + return dp[n][m]; +} +``` + +## 20. 表示数值的字符串 + +**题目æ��è¿°** + +请实现一个函数用æ�¥åˆ¤æ–­å­—符串是å�¦è¡¨ç¤ºæ•°å€¼ï¼ˆåŒ…括整数和å°�数)。例如,字符串 "+100","5e2","-123","3.1416" å’Œ "-1E-16" 都表示数值。 但是 "12e","1a3.14","1.2.3","+-5" å’Œ "12e+4.3" 都ä¸�是。 + +```java +public boolean isNumeric(char[] str) { + String string = String.valueOf(str); + return string.matches("[\\+-]?[0-9]*(\\.[0-9]*)?([eE][\\+-]?[0-9]+)?"); +} +``` + +## 21. 调整数组顺åº�使奇数ä½�于å�¶æ•°å‰�é�¢ + +æ—¶é—´å¤�æ�‚度 : O(n2) +空间å¤�æ�‚度 : O(1) + +```java +public void reOrderArray(int[] array) { + int n = array.length; + for (int i = 0; i < n; i++) { + if (array[i] % 2 == 0) { + int nextOddIdx = i + 1; + while (nextOddIdx < n && array[nextOddIdx] % 2 == 0) nextOddIdx++; + if (nextOddIdx == n) break; + int nextOddVal = array[nextOddIdx]; + for (int j = nextOddIdx; j > i; j--) { + array[j] = array[j - 1]; + } + array[i] = nextOddVal; + } + } +} +``` + +æ—¶é—´å¤�æ�‚度 : O(n) +空间å¤�æ�‚度 : O(n) + +```java +public void reOrderArray(int[] array) { + int oddCnt = 0; + for (int num : array) if (num % 2 == 1) oddCnt++; + int[] copy = array.clone(); + int i = 0, j = oddCnt; + for (int num : copy) { + if (num % 2 == 1) array[i++] = num; + else array[j++] = num; + } +} +``` + +## 22. 链表中倒数第 k 个结点 + +```java +public ListNode FindKthToTail(ListNode head, int k) { + if (head == null) return null; + ListNode fast, slow; + fast = slow = head; + while (fast != null && k-- > 0) fast = fast.next; + if (k > 0) return null; + while (fast != null) { + fast = fast.next; + slow = slow.next; + } + return slow; +} +``` + + + +## 23. 链表中环的入å�£ç»“点 + +```java +public ListNode EntryNodeOfLoop(ListNode pHead) { + if (pHead == null) return null; + ListNode slow = pHead, fast = pHead; + while (fast != null && fast.next != null) { + fast = fast.next.next; + slow = slow.next; + if (slow == fast) { + fast = pHead; + while (slow != fast) { + slow = slow.next; + fast = fast.next; + } + return slow; + } + } + return null; +} +``` + +## 24. å��转链表 + +```java +public ListNode ReverseList(ListNode head) { + ListNode newList = new ListNode(-1); + while (head != null) { + ListNode next = head.next; + head.next = newList.next; + newList.next = head; + head = next; + } + return newList.next; +} +``` + +## 25. å�ˆå¹¶ä¸¤ä¸ªæŽ’åº�的链表 + +```java +public ListNode Merge(ListNode list1, ListNode list2) { + ListNode head = new ListNode(-1); + ListNode cur = head; + while (list1 != null && list2 != null) { + if (list1.val < list2.val) { + cur.next = list1; + list1 = list1.next; + } else { + cur.next = list2; + list2 = list2.next; + } + cur = cur.next; + } + if (list1 != null) cur.next = list1; + if (list2 != null) cur.next = list2; + return head.next; +} +``` + +## 26. æ ‘çš„å­�结构 + +```java +public boolean HasSubtree(TreeNode root1, TreeNode root2) { + if (root1 == null || root2 == null) return false; + return isSubtree(root1, root2) || HasSubtree(root1.left, root2) || HasSubtree(root1.right, root2); +} + +private boolean isSubtree(TreeNode root1, TreeNode root2) { + if (root1 == null && root2 == null) return true; + if (root1 == null) return false; + if (root2 == null) return true; + if (root1.val != root2.val) return false; + return isSubtree(root1.left, root2.left) && isSubtree(root1.right, root2.right); +} +``` + +# 第四章 解决é�¢è¯•题的æ€�è·¯ + +## 27. 二å�‰æ ‘的镜åƒ� + +```java +public void Mirror(TreeNode root) { + if (root == null) return; + TreeNode t = root.left; + root.left = root.right; + root.right = t; + Mirror(root.left); + Mirror(root.right); +} +``` + +## 28.1 对称的二å�‰æ ‘ + +```java +boolean isSymmetrical(TreeNode pRoot) { + if (pRoot == null) return true; + return isSymmetrical(pRoot.left, pRoot.right); +} + +boolean isSymmetrical(TreeNode t1, TreeNode t2) { + if (t1 == null && t2 == null) return true; + if (t1 == null || t2 == null) return false; + if (t1.val != t2.val) return false; + return isSymmetrical(t1.left, t2.right) && isSymmetrical(t1.right, t2.left); +} +``` + +## 28.2 平衡二å�‰æ ‘ + +```java +private boolean isBalanced = true; + +public boolean IsBalanced_Solution(TreeNode root) { + height(root); + return isBalanced; +} + +private int height(TreeNode root) { + if (root == null) return 0; + int left = height(root.left); + int right = height(root.right); + if (Math.abs(left - right) > 1) isBalanced = false; + return 1 + Math.max(left, right); +} +``` + +## 29. 顺时针打å�°çŸ©é˜µ + +```java +public ArrayList printMatrix(int[][] matrix) { + ArrayList ret = new ArrayList<>(); + int r1 = 0, r2 = matrix.length - 1, c1 = 0, c2 = matrix[0].length - 1; + while (r1 <= r2 && c1 <= c2) { + for (int i = c1; i <= c2; i++) ret.add(matrix[r1][i]); + for (int i = r1 + 1; i <= r2; i++) ret.add(matrix[i][c2]); + if (r1 != r2) for (int i = c2 - 1; i >= c1; i--) ret.add(matrix[r2][i]); + if (c1 != c2) for (int i = r2 - 1; i > r1; i--) ret.add(matrix[i][c1]); + r1++; r2--; c1++; c2--; + } + return ret; +} +``` + +## 30. 包å�« min 函数的栈 + +```java +private Stack stack = new Stack<>(); +private Stack minStack = new Stack<>(); +private int min = Integer.MAX_VALUE; + +public void push(int node) { + stack.push(node); + if (min > node) min = node; + minStack.push(min); +} + +public void pop() { + stack.pop(); + minStack.pop(); + min = minStack.peek(); +} + +public int top() { + return stack.peek(); +} + +public int min() { + return minStack.peek(); +} +``` + +## 31. 栈的压入ã€�弹出åº�列 + +```java +public boolean IsPopOrder(int[] pushA, int[] popA) { + int n = pushA.length; + Stack stack = new Stack<>(); + for (int i = 0, j = 0; i < n; i++) { + stack.push(pushA[i]); + while (j < n && stack.peek() == popA[j]) { + stack.pop(); + j++; + } + } + return stack.isEmpty(); +} +``` + +## 32.1 从上往下打å�°äºŒå�‰æ ‘ + +```java +public ArrayList PrintFromTopToBottom(TreeNode root) { + Queue queue = new LinkedList<>(); + ArrayList ret = new ArrayList<>(); + if (root == null) return ret; + queue.add(root); + while (!queue.isEmpty()) { + int cnt = queue.size(); + for (int i = 0; i < cnt; i++) { + TreeNode t = queue.poll(); + if (t.left != null) queue.add(t.left); + if (t.right != null) queue.add(t.right); + ret.add(t.val); + } + } + return ret; +} +``` + +## 32.3 把二å�‰æ ‘打å�°æˆ�多行 + +```java +ArrayList> Print(TreeNode pRoot) { + ArrayList> ret = new ArrayList<>(); + if (pRoot == null) return ret; + Queue queue = new LinkedList<>(); + queue.add(pRoot); + while (!queue.isEmpty()) { + int cnt = queue.size(); + ArrayList list = new ArrayList<>(); + for (int i = 0; i < cnt; i++) { + TreeNode node = queue.poll(); + list.add(node.val); + if (node.left != null) queue.add(node.left); + if (node.right != null) queue.add(node.right); + } + ret.add(list); + } + return ret; +} +``` + +## 32.3 按之字形顺åº�打å�°äºŒå�‰æ ‘ + +```java +public ArrayList> Print(TreeNode pRoot) { + ArrayList> ret = new ArrayList<>(); + if (pRoot == null) return ret; + Queue queue = new LinkedList<>(); + queue.add(pRoot); + boolean reverse = false; + while (!queue.isEmpty()) { + int cnt = queue.size(); + ArrayList list = new ArrayList<>(); + for (int i = 0; i < cnt; i++) { + TreeNode node = queue.poll(); + list.add(node.val); + if (node.left != null) queue.add(node.left); + if (node.right != null) queue.add(node.right); + } + if (reverse) { + Collections.reverse(list); + reverse = false; + } else { + reverse = true; + } + ret.add(list); + } + return ret; +} +``` + + +## 33. 二å�‰æ�œç´¢æ ‘çš„å�Žåº�é��历åº�列 + +```java +public boolean VerifySquenceOfBST(int[] sequence) { + if (sequence.length == 0) return false; + return verify(sequence, 0, sequence.length - 1); +} + +private boolean verify(int[] sequence, int start, int end) { + if (end - start <= 1) return true; + int rootVal = sequence[end]; + int cutIdx = start; + while (cutIdx < end) { + if (sequence[cutIdx] > rootVal) break; + cutIdx++; + } + for (int i = cutIdx + 1; i < end; i++) { + if (sequence[i] < rootVal) return false; + } + return verify(sequence, start, cutIdx - 1) && verify(sequence, cutIdx, end - 1); +} +``` + +## 34. 二å�‰æ ‘中和为æŸ�一值的路径 + +```java +private ArrayList> ret = new ArrayList<>(); + +public ArrayList> FindPath(TreeNode root, int target) { + dfs(root, target, 0, new ArrayList<>()); + return ret; +} + +private void dfs(TreeNode node, int target, int curSum, ArrayList path) { + if (node == null) return; + curSum += node.val; + path.add(node.val); + if (curSum == target && node.left == null && node.right == null) { + ret.add(new ArrayList(path)); + } else { + dfs(node.left, target, curSum, path); + dfs(node.right, target, curSum, path); + } + path.remove(path.size() - 1); +} +``` + +## 35. å¤�æ�‚链表的å¤�制 + +**题目æ��è¿°** + +输入一个å¤�æ�‚链表(æ¯�个节点中有节点值,以å�Šä¸¤ä¸ªæŒ‡é’ˆï¼Œä¸€ä¸ªæŒ‡å�‘下一个节点,å�¦ä¸€ä¸ªç‰¹æ®ŠæŒ‡é’ˆæŒ‡å�‘ä»»æ„�一个节点),返回结果为å¤�制å�Žå¤�æ�‚链表的 head。(注æ„�,输出结果中请ä¸�è¦�返回å�‚数中的节点引用,å�¦åˆ™åˆ¤é¢˜ç¨‹åº�会直接返回空) + +第一步,在æ¯�个节点的å�Žé�¢æ�’å…¥å¤�制的节点。 + +![](index_files/f8b12555-967b-423d-a84e-bc9eff104b8b.jpg) + +第二步,对å¤�制节点的 random 链接进行赋值。 + +![](index_files/7b877a2a-8fd1-40d8-a34c-c445827300b8.jpg) + +第三步,拆分。 + +![](index_files/b2b6253c-c701-4b30-aff4-bc3c713542a7.jpg) + + +```java +public RandomListNode Clone(RandomListNode pHead) { + if (pHead == null) return null; + // æ�’入新节点 + RandomListNode cur = pHead; + while (cur != null) { + RandomListNode node = new RandomListNode(cur.label); + node.next = cur.next; + cur.next = node; + cur = node.next; + } + // 建立 random 链接 + cur = pHead; + while (cur != null) { + RandomListNode clone = cur.next; + if (cur.random != null) { + clone.random = cur.random.next; + } + cur = clone.next; + } + // 拆分 + RandomListNode pCloneHead = pHead.next; + cur = pHead; + while (cur.next != null) { + RandomListNode t = cur.next; + cur.next = t.next; + cur = t; + } + return pCloneHead; +} +``` + +## 36. 二å�‰æ�œç´¢æ ‘与å�Œå�‘链表 + +**题目æ��è¿°** + +输入一棵二å�‰æ�œç´¢æ ‘,将该二å�‰æ�œç´¢æ ‘转æ�¢æˆ�一个排åº�çš„å�Œå�‘链表。è¦�求ä¸�能创建任何新的结点,å�ªèƒ½è°ƒæ•´æ ‘中结点指针的指å�‘。 + +```java +private TreeNode pre = null; +public TreeNode Convert(TreeNode pRootOfTree) { + if(pRootOfTree == null) return null; + inOrder(pRootOfTree); + while(pRootOfTree.left != null) pRootOfTree = pRootOfTree.left; + return pRootOfTree; +} + +private void inOrder(TreeNode node) { + if(node == null) return; + inOrder(node.left); + node.left = pre; + if(pre != null) pre.right = node; + pre = node; + inOrder(node.right); +} +``` + +## 37. åº�列化二å�‰æ ‘ + +```java +private String serizeString = ""; + +String Serialize(TreeNode root) { + if (root == null) return "#"; + return root.val + " " + Serialize(root.left) + " " + + Serialize(root.right); +} + +TreeNode Deserialize(String str) { + this.serizeString = str; + return Deserialize(); +} + +private TreeNode Deserialize() { + if (this.serizeString.length() == 0) return null; + int idx = this.serizeString.indexOf(" "); + if (idx == -1) return null; + String sub = this.serizeString.substring(0, idx); + this.serizeString = this.serizeString.substring(idx + 1); + if (sub.equals("#")) { + return null; + } + int val = Integer.valueOf(sub); + TreeNode t = new TreeNode(val); + t.left = Deserialize(); + t.right = Deserialize(); + return t; +} +``` + +## 38. 字符串的排列 + +**题目æ��è¿°** + +输入一个字符串 , 按字典åº�打å�°å‡ºè¯¥å­—符串中字符的所有排列。例如输入字符串 abc, 则打å�°å‡ºç”±å­—符 a, b, c 所能排列出æ�¥çš„æ‰€æœ‰å­—符串 abc, acb, bac, bca, cab å’Œ cba。 + +```java +private ArrayList ret = new ArrayList<>(); + +public ArrayList Permutation(String str) { + if (str.length() == 0) return new ArrayList<>(); + char[] chars = str.toCharArray(); + Arrays.sort(chars); + backtracking(chars, new boolean[chars.length], ""); + return ret; +} + +private void backtracking(char[] chars, boolean[] used, String s) { + if (s.length() == chars.length) { + ret.add(s); + return; + } + for (int i = 0; i < chars.length; i++) { + if (used[i]) continue; + if (i != 0 && chars[i] == chars[i - 1] && !used[i - 1]) continue; // ä¿�è¯�ä¸�é‡�å¤� + used[i] = true; + backtracking(chars, used, s + chars[i]); + used[i] = false; + } +} +``` + +# 第五章 优化时间和空间效率 + +## 39. 数组中出现次数超过一å�Šçš„æ•°å­— + +```java +public int MoreThanHalfNum_Solution(int[] array) { + int cnt = 1, num = array[0]; + for (int i = 1; i < array.length; i++) { + if (array[i] == num) cnt++; + else cnt--; + if (cnt == 0) { + num = array[i]; + cnt = 1; + } + } + cnt = 0; + for (int i = 0; i < array.length; i++) { + if (num == array[i]) cnt++; + } + return cnt > array.length / 2 ? num : 0; +} +``` + + +## 40. 最å°�çš„ K 个数 + +构建大å°�为 k çš„å°�顶堆。 + +æ—¶é—´å¤�æ�‚度:O(nlgk) +空间å¤�æ�‚度:O(k) + +```java +public ArrayList GetLeastNumbers_Solution(int[] input, int k) { + if (k > input.length || k <= 0) return new ArrayList<>(); + PriorityQueue pq = new PriorityQueue<>((o1, o2) -> o2 - o1); + for (int num : input) { + pq.add(num); + if (pq.size() > k) { + pq.poll(); + } + } + ArrayList ret = new ArrayList<>(pq); + return ret; +} +``` + +利用快速选择 + +æ—¶é—´å¤�æ�‚度:O(n) +空间å¤�æ�‚度:O(1) + +```java +public ArrayList GetLeastNumbers_Solution(int[] input, int k) { + if (k > input.length || k <= 0) return new ArrayList<>(); + int kthSmallest = findKthSmallest(input, k - 1); + ArrayList ret = new ArrayList<>(); + for (int num : input) { + if(num <= kthSmallest && ret.size() < k) ret.add(num); + } + return ret; +} + +public int findKthSmallest(int[] nums, int k) { + int lo = 0; + int hi = nums.length - 1; + while (lo < hi) { + int j = partition(nums, lo, hi); + if (j < k) { + lo = j + 1; + } else if (j > k) { + hi = j - 1; + } else { + break; + } + } + return nums[k]; +} + +private int partition(int[] a, int lo, int hi) { + int i = lo; + int j = hi + 1; + while (true) { + while (i < hi && less(a[++i], a[lo])) ; + while (j > lo && less(a[lo], a[--j])) ; + if (i >= j) { + break; + } + exch(a, i, j); + } + exch(a, lo, j); + return j; +} + +private void exch(int[] a, int i, int j) { + final int tmp = a[i]; + a[i] = a[j]; + a[j] = tmp; +} + +private boolean less(int v, int w) { + return v < w; +} +``` + +## 41.1 æ•°æ�®æµ�中的中ä½�æ•° + + +**题目æ��è¿°** + +如何得到一个数æ�®æµ�中的中ä½�数?如果从数æ�®æµ�中读出奇数个数值,那么中ä½�数就是所有数值排åº�之å�Žä½�于中间的数值。如果从数æ�®æµ�中读出å�¶æ•°ä¸ªæ•°å€¼ï¼Œé‚£ä¹ˆä¸­ä½�数就是所有数值排åº�之å�Žä¸­é—´ä¸¤ä¸ªæ•°çš„å¹³å�‡å€¼ã€‚ + +```java +private PriorityQueue maxHeap = new PriorityQueue<>((o1, o2) -> o2-o1); // 实现左边部分 +private PriorityQueue minHeep = new PriorityQueue<>(); // 实现å�³è¾¹éƒ¨åˆ†ï¼Œå�³è¾¹éƒ¨åˆ†æ‰€æœ‰å…ƒç´ å¤§äºŽå·¦è¾¹éƒ¨åˆ† +private int cnt = 0; + +public void Insert(Integer num) { + // æ�’å…¥è¦�ä¿�è¯�两个堆存于平衡状æ€� + if(cnt % 2 == 0) { + // 为å�¶æ•°çš„æƒ…况下æ�’入到最å°�堆,先ç»�过最大堆筛选,这样就能ä¿�è¯�最大堆中的元素都å°�于最å°�堆中的元素 + maxHeap.add(num); + minHeep.add(maxHeap.poll()); + } else { + minHeep.add(num); + maxHeap.add(minHeep.poll()); + } + cnt++; +} + +public Double GetMedian() { + if(cnt % 2 == 0) { + return (maxHeap.peek() + minHeep.peek()) / 2.0; + } else { + return (double) minHeep.peek(); + } +} +``` + +## 14.2 字符æµ�中第一个ä¸�é‡�å¤�的字符 + +**题目æ��è¿°** + +请实现一个函数用æ�¥æ‰¾å‡ºå­—符æµ�中第一个å�ªå‡ºçŽ°ä¸€æ¬¡çš„å­—ç¬¦ã€‚ä¾‹å¦‚ï¼Œå½“ä»Žå­—ç¬¦æµ�中å�ªè¯»å‡ºå‰�两个字符 "go" 时,第一个å�ªå‡ºçŽ°ä¸€æ¬¡çš„å­—ç¬¦æ˜¯ "g"。当从该字符æµ�中读出å‰�六个字符“google" 时,第一个å�ªå‡ºçŽ°ä¸€æ¬¡çš„å­—ç¬¦æ˜¯ "l"。 + +```java +//Insert one char from stringstream +private int[] cnts = new int[256]; +private Queue queue = new LinkedList<>(); + +public void Insert(char ch) { + cnts[ch]++; + queue.add(ch); + while (!queue.isEmpty() && cnts[queue.peek()] > 1) { + queue.poll(); + } +} + +//return the first appearence once char in current stringstream +public char FirstAppearingOnce() { + if (queue.isEmpty()) return '#'; + return queue.peek(); +} +``` + + +## 42. 连续å­�数组的最大和 + +```java +public int FindGreatestSumOfSubArray(int[] array) { + if(array.length == 0) return 0; + int ret = Integer.MIN_VALUE; + int sum = 0; + for(int num : array) { + if(sum <= 0) sum = num; + else sum += num; + ret = Math.max(ret, sum); + } + return ret; +} +``` + +## 43. 从 1 到 n 整数中 1 出现的次数 + +解题å�‚考:[Leetcode : 233. Number of Digit One](https://leetcode.com/problems/number-of-digit-one/discuss/64381/4+-lines-O(log-n)-C++JavaPython) + +```java +public int NumberOf1Between1AndN_Solution(int n) { + int cnt = 0; + for (int m = 1; m <= n; m *= 10) { + int a = n / m, b = n % m; + cnt += (a + 8) / 10 * m + (a % 10 == 1 ? b + 1 : 0); + } + return cnt; +} +``` + +## 45. 把数组排æˆ�最å°�的数 + +**题目æ��è¿°** + +输入一个正整数数组,把数组里所有数字拼接起æ�¥æŽ’æˆ�一个数,打å�°èƒ½æ‹¼æŽ¥å‡ºçš„æ‰€æœ‰æ•°å­—中最å°�的一个。例如输入数组 {3,32,321},则打å�°å‡ºè¿™ä¸‰ä¸ªæ•°å­—能排æˆ�的最å°�数字为 321323。 + +```java +public String PrintMinNumber(int[] numbers) { + int n = numbers.length; + String[] nums = new String[n]; + for (int i = 0; i < n; i++) nums[i] = numbers[i] + ""; + Arrays.sort(nums, (s1, s2) -> (s1 + s2).compareTo(s2 + s1)); + String ret = ""; + for (String str : nums) ret += str; + return ret; +} +``` + +## 49. 丑数 + +**题目æ��è¿°** + +把å�ªåŒ…å�«å› å­� 2ã€�3 å’Œ 5 的数称作丑数(Ugly Number)。例如 6ã€�8 都是丑数,但 14 ä¸�是,因为它包å�«å› å­� 7。 习惯上我们把 1 当å�šæ˜¯ç¬¬ä¸€ä¸ªä¸‘æ•°ã€‚æ±‚æŒ‰ä»Žå°�到大的顺åº�的第 N 个丑数。 + +```java +public int GetUglyNumber_Solution(int index) { + if (index <= 6) return index; + int i2 = 0, i3 = 0, i5 = 0; + int cnt = 1; + int[] dp = new int[index]; + dp[0] = 1; + while (cnt < index) { + int n2 = dp[i2] * 2, n3 = dp[i3] * 3, n5 = dp[i5] * 5; + int tmp = Math.min(n2, Math.min(n3, n5)); + dp[cnt++] = tmp; + if (tmp == n2) i2++; + if (tmp == n3) i3++; + if (tmp == n5) i5++; + } + return dp[index - 1]; +} +``` + +## 50. 第一个å�ªå‡ºçŽ°ä¸€æ¬¡çš„å­—ç¬¦ä½�ç½® + +```java +public int FirstNotRepeatingChar(String str) { + int[] cnts = new int[256]; + for (int i = 0; i < str.length(); i++) cnts[str.charAt(i)]++; + for (int i = 0; i < str.length(); i++) if (cnts[str.charAt(i)] == 1) return i; + return -1; +} +``` + +## 51. 数组中的逆åº�对 + +```java +private long cnt = 0; + +public int InversePairs(int[] array) { + mergeSortUp2Down(array, 0, array.length - 1); + return (int) (cnt % 1000000007); +} + +private void mergeSortUp2Down(int[] a, int start, int end) { + if (end - start < 1) return; + int mid = start + (end - start) / 2; + mergeSortUp2Down(a, start, mid); + mergeSortUp2Down(a, mid + 1, end); + merge(a, start, mid, end); +} + +private void merge(int[] a, int start, int mid, int end) { + int[] tmp = new int[end - start + 1]; + int i = start, j = mid + 1, k = 0; + while (i <= mid || j <= end) { + if (i > mid) tmp[k] = a[j++]; + else if (j > end) tmp[k] = a[i++]; + else if (a[i] < a[j]) tmp[k] = a[i++]; + else { + tmp[k] = a[j++]; + this.cnt += mid - i + 1; // a[i] > a[j] ,说明 a[i...mid] 都大于 a[j] + } + k++; + } + + for (k = 0; k < tmp.length; k++) { + a[start + k] = tmp[k]; + } +} +``` + +## 52. 两个链表的第一个公共结点 + +```java +public ListNode FindFirstCommonNode(ListNode pHead1, ListNode pHead2) { + ListNode l1 = pHead1, l2 = pHead2; + while (l1 != l2) { + if (l1 == null) l1 = pHead2; + else l1 = l1.next; + if (l2 == null) l2 = pHead1; + else l2 = l2.next; + } + return l1; +} +``` + +# 第六章 é�¢è¯•中的å�„项能力 + +## 53 数字在排åº�数组中出现的次数 + + + +```java +public int GetNumberOfK(int[] array, int k) { + int l = 0, h = array.length - 1; + while (l <= h) { + int m = l + (h - l) / 2; + if (array[m] >= k) h = m - 1; + else l = m + 1; + } + int cnt = 0; + while (l < array.length && array[l++] == k) cnt++; + return cnt; +} +``` + +## 54. 二å�‰æ�œç´¢æ ‘的第 k 个结点 + +```java +TreeNode ret; +int cnt = 0; + +TreeNode KthNode(TreeNode pRoot, int k) { + inorder(pRoot, k); + return ret; +} + +private void inorder(TreeNode root, int k) { + if (root == null) return; + if (cnt > k) return; + inorder(root.left, k); + cnt++; + if (cnt == k) ret = root; + inorder(root.right, k); +} +``` + +## 55 二å�‰æ ‘的深度 + +```java +public int TreeDepth(TreeNode root) { + if (root == null) return 0; + return 1 + Math.max(TreeDepth(root.left), TreeDepth(root.right)); +} +``` + +## 56. 数组中å�ªå‡ºçŽ°ä¸€æ¬¡çš„æ•°å­— + +**题目æ��è¿°** + +一个整型数组里除了两个数字之外,其他的数字都出现了两次,找出这两个数。 + +**解题æ€�è·¯** + +两个ä¸�相等的元素在ä½�级表示上必定会有一ä½�存在ä¸�å�Œã€‚ + +将数组的所有元素异或得到的结果为ä¸�存在é‡�å¤�的两个元素异或的结果。 + +diff &= -diff 得到出 diff 最å�³ä¾§ä¸�为 0 çš„ä½�,也就是ä¸�存在é‡�å¤�的两个元素在ä½�级表示上最å�³ä¾§ä¸�å�Œçš„那一ä½�,利用这一ä½�å°±å�¯ä»¥å°†ä¸¤ä¸ªå…ƒç´ åŒºåˆ†å¼€æ�¥ã€‚ + +```java +public void FindNumsAppearOnce(int[] array, int num1[], int num2[]) { + int diff = 0; + for (int num : array) diff ^= num; + // 得到最å�³ä¸€ä½� + diff &= -diff; + for (int num : array) { + if ((num & diff) == 0) num1[0] ^= num; + else num2[0] ^= num; + } +} +``` + +## 57.1 和为 S 的两个数字 + +**题目æ��è¿°** + +输入一个递增排åº�的数组和一个数字 S,在数组中查找两个数,是的他们的和正好是 S,如果有多对数字的和等于 S,输出两个数的乘积最å°�的。 + +```java +public ArrayList FindNumbersWithSum(int[] array, int sum) { + int i = 0, j = array.length - 1; + while (i < j) { + int cur = array[i] + array[j]; + if (cur == sum) return new ArrayList(Arrays.asList(array[i], array[j])); + else if (cur < sum) i++; + else j--; + } + return new ArrayList(); +} +``` + +## 57.2 和为 S 的连续正数åº�列 + +**题目æ��è¿°** + +和为 100 的连续åº�列有 18, 19, 20, 21, 22 + +```java +public ArrayList> FindContinuousSequence(int sum) { + ArrayList> ret = new ArrayList<>(); + int start = 1, end = 2; + int mid = sum / 2; + int curSum = 3; + while (start <= mid && end < sum) { + if (curSum > sum) { + curSum -= start; + start++; + } else if (curSum < sum) { + end++; + curSum += end; + } else { + ArrayList list = new ArrayList<>(); + for (int i = start; i <= end; i++) { + list.add(i); + } + ret.add(list); + curSum -= start; + start++; + end++; + curSum += end; + } + } + return ret; +} +``` + +## 58.1 翻转å�•è¯�顺åº�列 + +**题目æ��è¿°** + +输入:"I am a student." + +输出:"student. a am I" + +```java +public String ReverseSentence(String str) { + if (str.length() == 0) return str; + int n = str.length(); + char[] chars = str.toCharArray(); + int start = 0, end = 0; + while (end <= n) { + if (end == n || chars[end] == ' ') { + reverse(chars, start, end - 1); + start = end + 1; + } + end++; + } + reverse(chars, 0, n - 1); + return new String(chars); +} + +private void reverse(char[] c, int start, int end) { + while (start < end) { + char t = c[start]; + c[start] = c[end]; + c[end] = t; + start++; + end--; + } +} +``` + +## 58.2 左旋转字符串 + +**题目æ��è¿°** + +对于一个给定的字符åº�列 S,请你把其循环左移 K ä½�å�Žçš„åº�列输出。例如,字符åº�列 S=â€�abcXYZdefâ€�, è¦�求输出循环左移 3 ä½�å�Žçš„结果,å�³â€œXYZdefabcâ€�。 + +```java +public String LeftRotateString(String str, int n) { + if (str.length() == 0) return ""; + char[] c = str.toCharArray(); + reverse(c, 0, n - 1); + reverse(c, n, c.length - 1); + reverse(c, 0, c.length - 1); + return new String(c); +} + +private void reverse(char[] c, int i, int j) { + while (i < j) { + char t = c[i]; + c[i] = c[j]; + c[j] = t; + i++; + j--; + } +} +``` + +## 59. 滑动窗å�£çš„æœ€å¤§å€¼ + +**题目æ��è¿°** + +给定一个数组和滑动窗å�£çš„大å°�,找出所有滑动窗å�£é‡Œæ•°å€¼çš„æœ€å¤§å€¼ã€‚例如,如果输入数组 {2, 3, 4, 2, 6, 2, 5, 1} å�Šæ»‘动窗å�£çš„大å°� 3,那么一共存在 6 个滑动窗å�£ï¼Œä»–们的最大值分别为 {4, 4, 6, 6, 6, 5}ï¼› + +```java +public ArrayList maxInWindows(int[] num, int size) { + ArrayList ret = new ArrayList<>(); + if (size > num.length || size < 1) return ret; + PriorityQueue heap = new PriorityQueue((o1, o2) -> o2 - o1); + for (int i = 0; i < size; i++) heap.add(num[i]); + ret.add(heap.peek()); + for (int i = 1; i + size - 1 < num.length; i++) { + heap.remove(num[i - 1]); + heap.add(num[i + size - 1]); + ret.add(heap.peek()); + } + return ret; +} +``` + +## 61. 扑克牌顺å­� + +**题目æ��è¿°** + +五张牌,其中大å°�鬼为癞å­�,牌é�¢å¤§å°�为 0。判断是å�¦èƒ½ç»„æˆ�顺å­�。 + +```java +public boolean isContinuous(int[] numbers) { + if (numbers.length < 5) return false; + Arrays.sort(numbers); + int cnt = 0; + for (int num : numbers) if (num == 0) cnt++; + for (int i = cnt; i < numbers.length - 1; i++) { + if (numbers[i + 1] == numbers[i]) return false; + int cut = numbers[i + 1] - numbers[i] - 1; + if (cut > cnt) return false; + cnt -= cut; + } + return true; +} +``` + +## 62. 圆圈中最å�Žå‰©ä¸‹çš„æ•° + +**题目æ��è¿°** + +让å°�朋å�‹ä»¬å›´æˆ�一个大圈。然å�Ž , ä»–éš�机指定一个数 m, 让编å�·ä¸º 0 çš„å°�朋å�‹å¼€å§‹æŠ¥æ•°ã€‚æ¯�次喊到 m-1 的那个å°�朋å�‹è¦�出列唱首歌 , ç„¶å�Žå�¯ä»¥åœ¨ç¤¼å“�箱中任æ„�的挑选礼物 , 并且ä¸�å†�回到圈中 , 从他的下一个å°�朋å�‹å¼€å§‹ , ç»§ç»­ 0...m-1 报数 .... 这样下去 .... 直到剩下最å�Žä¸€ä¸ªå°�朋å�‹ , å�¯ä»¥ä¸�用表演。 + +**解题æ€�è·¯** + +约瑟夫环 + +```java +public int LastRemaining_Solution(int n, int m) { + if (n == 0) return -1; + if (n == 1) return 0; + return (LastRemaining_Solution(n - 1, m) + m) % n; +} +``` + +## 63. 股票的最大利润 + +**题目æ��è¿°** + +å�¯ä»¥æœ‰ä¸€æ¬¡ä¹°å…¥å’Œä¸€æ¬¡å�–出,买入必须在å‰�。求最大收益。 + +```java +public int maxProfit(int[] prices) { + int n = prices.length; + if(n == 0) return 0; + int soFarMin = prices[0]; + int max = 0; + for(int i = 1; i < n; i++) { + if(soFarMin > prices[i]) soFarMin = prices[i]; + else max = Math.max(max, prices[i] - soFarMin); + } + return max; +} +``` + +## 64. 求 1+2+3+...+n + +**题目æ��è¿°** + +求 1+2+3+...+n,è¦�求ä¸�能使用乘除法ã€�forã€�whileã€�ifã€�elseã€�switchã€�case 等关键字å�Šæ�¡ä»¶åˆ¤æ–­è¯­å�¥ï¼ˆA?B:C) + +```java +public int Sum_Solution(int n) { + if(n == 0) return 0; + return n + Sum_Solution(n - 1); +} +``` + +## 65. ä¸�用加å‡�乘除å�šåŠ æ³• + +a ^ b 表示没有考虑进ä½�的情况下两数的和,(a & b) << 1 就是进ä½�。递归会终止的原因是 (a & b) << 1 最å�³è¾¹ä¼šå¤šä¸€ä¸ª 0,那么继续递归,进ä½�最å�³è¾¹çš„ 0 会慢慢增多,最å�Žè¿›ä½�会å�˜ä¸º 0,递归终止。 + +```java +public int Add(int num1, int num2) { + if(num2 == 0) return num1; + return Add(num1 ^ num2, (num1 & num2) << 1); +} +``` + +## 66. 构建乘积数组 + +**题目æ��è¿°** + +给定一个数组 A[0, 1,..., n-1], 请构建一个数组 B[0, 1,..., n-1], 其中 B 中的元素 B[i]=A[0]\*A[1]\*...\*A[i-1]\*A[i+1]\*...\*A[n-1]。ä¸�能使用除法。 + +```java +public int[] multiply(int[] A) { + int n = A.length; + int[][] dp = new int[n][n]; + for (int i = 0; i < n; i++) { + dp[i][i] = A[i]; + } + for (int i = 0; i < n; i++) { + for (int j = i + 1; j < n; j++) { + dp[i][j] = dp[i][j - 1] * A[j]; + } + } + + int[] B = new int[n]; + Arrays.fill(B, 1); + for (int i = 0; i < n; i++) { + if (i != 0) B[i] *= dp[0][i - 1]; + if (i != n - 1) B[i] *= dp[i + 1][n - 1]; + } + return B; +} +``` + +# 第七章 两个é�¢è¯•案例 + +## 67. 把字符串转æ�¢æˆ�æ•´æ•° + +```java +public int StrToInt(String str) { + if (str.length() == 0) return 0; + char[] chars = str.toCharArray(); + boolean isNegative = chars[0] == '-'; + int ret = 0; + for (int i = 0; i < chars.length; i++) { + if (i == 0 && (chars[i] == '+' || chars[i] == '-')) continue; + if (chars[i] < '0' || chars[i] > '9') return 0; + ret = ret * 10 + (chars[i] - '0'); + } + return isNegative ? -ret : ret; +} +``` + +## 68. 树中两个节点的最低公共祖先 + +树是二å�‰æŸ¥æ‰¾æ ‘的最低公共祖先问题: + +```java +public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) { + if(root.val > p.val && root.val > q.val) return lowestCommonAncestor(root.left, p, q); + if(root.val < p.val && root.val < q.val) return lowestCommonAncestor(root.right, p, q); + return root; +} +``` diff --git a/notes/笔记/扩展性与空间é™�制.md.txt b/notes/笔记/扩展性与空间é™�制.md.txt new file mode 100644 index 00000000..52e22a4f --- /dev/null +++ b/notes/笔记/扩展性与空间é™�制.md.txt @@ -0,0 +1,163 @@ +[TOC] + +# 正在完æˆ�... + +# 解题æ€�è·¯ + +空间é™�制问题基本æ€�路是拆分。如果一个数æ�®å¾ˆå¤§ï¼Œæ— æ³•放在一å�°æœºå™¨ä¸Šï¼Œå°±ç”¨åˆ†å¸ƒå¼�的方法放到多å�°æœºå™¨ä¸Šï¼›åœ¨ç¨‹åº�è¿�行时无法直接加载一个大文件,就分多次加载,并且æ¯�次è¿�行结果都ä¿�存到一个å°�文件中。 + + + +# 布隆过滤器 + +**题目** + +ä¸�安全网页的黑å��å�•包å�«Â 100 亿个黑å��å�•网页,æ¯�个网页的 URL 最多å� ç”¨Â 64B。现在想è¦�实现一ç§�网页过滤系统,å�¯ä»¥æ ¹æ�®ç½‘页的 URL 判断该网页是å�¦åœ¨é»‘å��å�•上,请设计该系统。 + +**è¦�求** + +1. 该系统å…�许有万分之一以下的判断失误率。 +2. 使用的é¢�外空间ä¸�è¦�超过 30GB。 + +![](index_files/82fec0f5-2fdf-4e27-aea9-2e1b2a3cf9eb.jpg) + +[程åº�员代ç �é�¢è¯•指å�— P303]() + +# 查找所有包å�«æŸ�一组è¯�的文件 + +> 给定数百万份文件,设计一个程åº�找出所有包å�«æŸ�一组è¯�的文件,该程åº�会被多次调用。 + +## 1. 预处ç�† + +预处ç�†æ¯�个文件,并创建一个散列表的索引。这个散列表会将è¯�映射到å�«æœ‰è¿™ä¸ª +è¯�的一组文件。 + +```html +“booksâ€� -> {doc2, doc3, doc6, doc8} +“manyâ€� -> {doc1, doc3, doc7, doc8, doc9} +``` + +è‹¥è¦�查找“many booksâ€�,å�ªéœ€å¯¹â€œbooksâ€�和“manyâ€�的值进行交集è¿�算,于是得到结果{doc3, doc8}。 + +## 2. 拆分 + +若有数百万份文件,那么一å�°æœºå™¨æ— æ³•放下这么多文件,需è¦�存放到多å�°æœºå™¨ä¸Šã€‚并且散列表å�¯èƒ½ä¹Ÿä¼šå¾ˆå¤§ï¼Œä¸€å�°æœºå™¨å�¯èƒ½æ— æ³•放下整个散列表,因此需è¦�将散列表拆分到多å�°æœºå™¨ä¸Šã€‚ + +拆分的方法有很多,例如根æ�®é”®çš„æ•£åˆ—值,或者根æ�®é”®çš„范围。 + +## 3. 查找 + +例如查找“after builds boat amaze bananaâ€�,先划分æˆ�å�•è¯�åº�列,然å�Žæ¯�个å�•è¯�都到存放该å�•è¯�散列表的机器上去查找,最å�Žå°†æ¯�个å�•è¯�的查找结果å�šäº¤é›†è¿�算。 + +# 大型社交网站计算两个人的好å�‹å…³ç³» + +> 你会如何设计诸如Facebook或LinkedIn的超大型社交网站?请设计一ç§�算法,展示两个人之间的“连接关系â€�或“社交路径â€�(比如,我 → é²�勃 → è‹�ç�ŠÂ â†’ æ�°æ£®Â â†’ 你) + +## 1. 好å�‹å…³ç³»çš„实现 + +为æ¯�个用户ä¿�存好å�‹Â id 的列表,利用这个列表,å�¯ä»¥æž„建一个图,æ¯�个用户看作一个结点,两个结点之间若有连线,则表示这两个用户为朋å�‹ã€‚ + +è¦�找到两个人之间的连接,å�¯ä»¥ä»Žå…¶ä¸­ä¸€ä¸ªäººå¼€å§‹ï¼Œç›´æŽ¥è¿›è¡Œå¹¿åº¦ä¼˜å…ˆæ�œç´¢ã€‚为什么深度优先æ�œç´¢æ•ˆæžœä¸�彰呢?因为它é�žå¸¸ä½Žæ•ˆã€‚两个用户å�¯èƒ½å�ªæœ‰ä¸€åº¦ä¹‹éš”,å�´å�¯èƒ½è¦�在他们的“å­�æ ‘â€�中æ�œç´¢å‡ ç™¾ä¸‡ä¸ªç»“点å�Žï¼Œæ‰�能找到这æ�¡é�žå¸¸ç®€å�•而直接的连接。 + +```java +public class Person { +    private ArrayList friendIDs; +} +``` + +## 2. 进行查找 + +处ç�†LinkedIn或Facebookè¿™ç§�规模的æœ�务时,ä¸�å�¯èƒ½å°†æ‰€æœ‰æ•°æ�®å­˜æ”¾åœ¨ä¸€å�°æœºå™¨ä¸Šã€‚这就æ„�味ç�€å‰�é�¢å®šä¹‰çš„简å�•æ•°æ�®ç»“æž„Personå¹¶ä¸�管用,朋å�‹çš„资料和我们的资料ä¸�一定在å�Œä¸€å�°æœºå™¨ä¸Šã€‚ + +1. 针对æ¯�个朋å�‹ID,找出所在机器的ä½�置:int machine_index = getMachineIDForUser(personID); +2. 转到编å�·ä¸º#machine_index的机器。 +3. 在那å�°æœºå™¨ä¸Šï¼Œæ‰§è¡Œï¼šPerson friend = getPersonWithID(person_id);。 + +下é�¢çš„代ç �æ��绘了这一过程。我们定义了一个Server类,包å�«ä¸€ä»½æ‰€æœ‰æœºå™¨çš„列表,还有一个Machine类,代表一å�°å�•独的机器。这两个类都用了散列表,从而有效地查找数æ�®ã€‚ + +```java +public class Server { +    HashMap machines = new HashMap(); +    HashMap personToMachineMap = new HashMap(); +     +    public Machine getMachineWithId(int machineID) { +        return machines.get(machineID); +    } +     +    public int getMachineIDForUser(int personID) { +        Integer machineID = personToMachineMap.get(personID); +        return machineID == null ? -1 : machineID; +    } +     +    public Person getPersonWithID(int personID) { +        Integer machineID = personToMachineMap.get(personID); +        if (machineID == null) { +            return null; +        } +        Machine machine = getMachineWithId(machineID); +        if (machine == null) { +            return null; +        } +        return machine.getPersonWithID(personID); +    } +} +``` + +```java +public class Person { +    private ArrayList friends; +    private int personID; +    private String info; +     +    public String getInfo() { return info; } +    public void setInfo(String info) { +        this.info = info; +    } + +    public int[] getFriends() { +        int[] temp = new int[friends.size()]; +        for (int i = 0; i < temp.length; i++) { +            temp[i] = friends.get(i); +        } +        return temp; +    } +    public int getID() { return personID; } +    public void addFriend(int id) { friends.add(id); } +     +    public Person(int id) { +        this.personID = id; +    } +} +``` + +```java +public class Machine { +    public HashMap persons = new HashMap(); +    public int machineID; +     +    public Person getPersonWithID(int personID) { +        return persons.get(personID); +    }     +} +``` + +## 3. 优化 + +**å‡�少机器间跳转的次数** + +从一å�°æœºå™¨è·³è½¬åˆ°å�¦ä¸€å�°æœºå™¨çš„开销很昂贵。ä¸�è¦�为了找到æŸ�个朋å�‹å°±åœ¨æœºå™¨ä¹‹é—´ä»»æ„�跳转,而是试ç�€æ‰¹å¤„ç�†è¿™äº›è·³è½¬åŠ¨ä½œã€‚ä¸¾ä¾‹æ�¥è¯´ï¼Œå¦‚果有五个朋å�‹éƒ½åœ¨å�Œä¸€å�°æœºå™¨ä¸Šï¼Œé‚£å°±åº”该一次性找出æ�¥ã€‚ + +**智能划分用户和机器** + +人们跟生活在å�Œä¸€å›½å®¶çš„人æˆ�为朋å�‹çš„å�¯èƒ½æ€§æ¯”较大。因此,ä¸�è¦�éš�æ„�将用户划分到ä¸�å�Œæœºå™¨ä¸Šï¼Œè€Œåº”该尽é‡�按国家ã€�城市ã€�州等进行划分。这样一æ�¥ï¼Œå°±å�¯ä»¥å‡�少跳转的次数。 + +**广度优先æ�œç´¢é€šå¸¸è¦�求“标记â€�访问过的结点。在这ç§�情况下你会怎么å�šï¼Ÿ** + +在广度优先æ�œç´¢ä¸­ï¼Œé€šå¸¸æˆ‘们会设定结点类的visited标志,以标记访问过的结点。但针对此题,我们并ä¸�想这么å�šã€‚å�Œä¸€æ—¶é—´å�¯èƒ½ä¼šæ‰§è¡Œå¾ˆå¤šæ�œç´¢æ“�作,因此直接编辑数æ�®çš„å�𿳕并ä¸�妥当。å��之,我们å�¯ä»¥åˆ©ç”¨æ•£åˆ—表模仿结点的标记动作,以查询结点id,看它是å�¦è®¿é—®è¿‡ã€‚ + +## 4. 其它扩展问题 + +1. 在真实世界中,æœ�务器会出故障。这会对你造æˆ�什么影å“�? +2. 你会如何利用缓存? +3. 你会一直æ�œç´¢ï¼Œç›´åˆ°å›¾çš„终点(无é™�)å�—?该如何判断何时放弃? +4. 在现实生活中,有些人比其他人拥有更多朋å�‹çš„æœ‹å�‹ï¼Œå› æ­¤æ›´å®¹æ˜“在你和其他人之间构建一æ�¡è·¯å¾„。该如何利用该数æ�®é€‰æ‹©ä»Žå“ªé‡Œå¼€å§‹é��历? diff --git a/notes/笔记/æ•°æ�®åº“系统原ç�†.md.txt b/notes/笔记/æ•°æ�®åº“系统原ç�†.md.txt new file mode 100644 index 00000000..52dd2e76 --- /dev/null +++ b/notes/笔记/æ•°æ�®åº“系统原ç�†.md.txt @@ -0,0 +1,301 @@ +[TOC] + +# 事务四大特性 + +## 原å­�性 + +è¦�么都执行,è¦�么都ä¸�执行。 + +## 一致性 + +事务执行å‰�å�Žéƒ½ä¿�æŒ�一致性状æ€�。在一致性状æ€�下,所有事务对一个数æ�®çš„读å�–结果都是相å�Œçš„。 + +## 隔离性 + +多个事务å�•独执行,互ä¸�å½±å“�。 + +## æŒ�久性 + +å�³ä½¿ç³»ç»Ÿå�‘生故障,事务执行的结果也ä¸�能丢失。æŒ�久性通过数æ�®åº“备份和æ�¢å¤�æ�¥ä¿�è¯�。 + +# 数æ�®ä¸�一致 + +## 丢失修改 + +T1 和 T2 两个事务å�Œæ—¶å¯¹ä¸€ä¸ªæ•°æ�®è¿›è¡Œä¿®æ”¹ï¼ŒT1 先修改,T2 éš�å�Žä¿®æ”¹ï¼ŒT2 的修改覆盖了 T1 的修改。 + +## 读è„�æ•°æ�® + +T1 å�šä¿®æ”¹å�Žå†™å…¥æ•°æ�®åº“,T2 读å�–这个修改å�Žçš„æ•°æ�®ï¼Œä½†æ˜¯å¦‚果 T1 撤销了这次修改,使得 T2 读å�–的数æ�®æ˜¯è„�æ•°æ�®ã€‚ + +## ä¸�å�¯é‡�å¤�读 + +T1 读入æŸ�个数æ�®ï¼ŒT2 对该数æ�®å�šäº†ä¿®æ”¹ï¼Œå¦‚果 T1 å†�读这个数æ�®ï¼Œè¯¥æ•°æ�®å·²ç»�改å�˜ï¼Œå’Œæœ€å¼€å§‹è¯»å…¥çš„æ˜¯ä¸�一样的。 + +# 隔离级别 + +æ•°æ�®åº“管ç�†ç³»ç»Ÿéœ€è¦�防止数æ�®å‡ºçްä¸�一致,并且有多ç§�级别å�¯ä»¥å®žçŽ°ï¼Œè¿™äº›çº§åˆ«ç§°ä¸ºéš”ç¦»çº§åˆ«ã€‚ + +## 未æ��交读(READ UNCOMMITTED) + +一个事务å�¯ä»¥è¯»å�–自己的未æ��交数æ�®ï¼Œä¹Ÿè¢«ç§°ä¸ºè„�读。 + +## æ��交读(READ COMMITTED) + +一个事务å�¯ä»¥è¯»å�–自己的已æ��交数æ�®ï¼Œä½†æ˜¯è¯¥æ•°æ�®å�¯èƒ½è¿‡å�Žå°±ä¼šè¢«å…¶å®ƒäº‹åŠ¡æ”¹å�˜ï¼Œå› æ­¤ä¹Ÿç§°ä¸ºä¸�å�¯é‡�å¤�读。 + +## å�¯é‡�å¤�读(REPEATABLE READ) + +ä¿�è¯�在å�Œä¸€ä¸ªäº‹åŠ¡ä¸­å¤šæ¬¡è¯»å�–å�Œæ ·çš„记录结果是一致的。但是会出现幻读的问题,所谓幻读,指的是æŸ�个事务在读å�–æŸ�个范围内的记录时,其它事务会在范围内æ�’入数æ�®ï¼Œäº§ç”Ÿå¹»è¡Œã€‚ + +## å�¯ä¸²è¡ŒåŒ–(SERIALIXABLE) + +强制事务串行执行,é�¿å…�幻行的出现。 + +# å�¯ä¸²è¡ŒåŒ–调度 + +如果并行的事务的执行结果和æŸ�一个串行的方å¼�执行的结果一样,那么å�¯ä»¥è®¤ä¸ºç»“果是正确的。 + +# å°�é”�类型 + +排它é”� (X é”� ),共享é”� (S é”� ) + +一个事务 T 对数æ�®å¯¹è±¡Â A 加了 X é”�,T 就å�¯ä»¥å¯¹Â A 进行读å�–和更新。加é”�期间其它事务ä¸�能对数æ�®å¯¹è±¡Â A 加任何其它é”�ï¼› + +一个事务 T 对数æ�®å¯¹è±¡åŠ äº†Â S é”�,T å�¯ä»¥å¯¹Â A 进行读å�–æ“�作,但是ä¸�能进行更新æ“�作。加é”�期间其它事务能对数æ�®å¯¹è±¡Â A 加 S é”�,但是ä¸�能加 X é”�。 + +# å°�é”�粒度 + +粒度å�¯ä»¥æ˜¯æ•´ä¸ªæ•°æ�®åº“,也å�¯ä»¥æ˜¯è¡¨ï¼Œè¡Œï¼Œæˆ–者分é‡�。 + +粒度越å°�,开销越大。 + +# å°�é”�å��è®® + +## 三级å°�é”�å��è®® + +(1) 1 级å°�é”�å��è®® + +事务 T è¦�修改数æ�®Â A 时必须加 X é”�,直到事务结æ�Ÿæ‰�释放é”�。 + +å�¯ä»¥è§£å†³ä¸¢å¤±ä¿®æ”¹é—®é¢˜ï¼› + +(2) 2 级å°�é”�å��è®® + +在 1 级的基础上,è¦�求读å�–æ•°æ�®Â A 时必须加 S é”�,读å�–完马上释放 S é”�。 + +å�¯ä»¥è§£å†³è¯»è„�æ•°æ�®é—®é¢˜ï¼Œå› ä¸ºå¦‚果一个事务在对数æ�®Â A 进行修改,根æ�®Â 1 级å°�é”�å��议,会加 X é”�,那么就ä¸�能å†�加 S é”�了,也就是ä¸�会读入数æ�®ã€‚ + +(3) 3 级å°�é”�å��è®® + +在 2 级的基础上,è¦�求读å�–æ•°æ�®Â A 时必须加 S é”�,直到事务结æ�Ÿäº†æ‰�能释放 S é”�。 + +å�¯ä»¥è§£å†³ä¸�å�¯é‡�å¤�读的问题,因为读 A 时,其它事务ä¸�能对 A 加 X é”�,从而é�¿å…�了在读的期间数æ�®å�‘生改å�˜ã€‚ + +![](index_files/785806ed-c46b-4dca-b756-cebe7bf8ac3a.jpg) + +## 两段é”�å��è®® + +加é”�和解é”�分为两个阶段进行。两段é”�是并行事务å�¯ä¸²è¡ŒåŒ–的充分æ�¡ä»¶ï¼Œä½†ä¸�是必è¦�æ�¡ä»¶ã€‚ + +```html +lock-x(A)...lock-s(B)...lock-s(c)...unlock(A)...unlock(C)...unlock(B) +``` + +# ä¹�è§‚é”�和悲观é”� + +## 悲观é”� + +å�‡å®šä¼šå�‘生并å�‘冲çª�,å±�蔽一切å�¯èƒ½è¿�å��æ•°æ�®å®Œæ•´æ€§çš„æ“�作。 + +Java synchronized 就属于悲观é”�的一ç§�实现,æ¯�次线程è¦�修改数æ�®æ—¶éƒ½å…ˆèŽ·å¾—é”�,ä¿�è¯�å�Œä¸€æ—¶åˆ»å�ªæœ‰ä¸€ä¸ªçº¿ç¨‹èƒ½æ“�作数æ�®ï¼Œå…¶ä»–线程则会被阻塞。 + +## ä¹�è§‚é”� + +å�‡è®¾ä¸�会å�‘生并å�‘冲çª�,å�ªåœ¨æ��交æ“�作时检查是å�¦è¿�å��æ•°æ�®å®Œæ•´æ€§ã€‚ + +Java JUC 中的 atomic 包就是ä¹�è§‚é”�的一ç§�实现,AtomicInteger 通过 CAS(Compare And Set)æ“�作实现线程安全的自增。 + +ä¹�è§‚é”�有两ç§�实现方å¼�,数æ�®ç‰ˆæœ¬å’Œæ—¶é—´æˆ³ã€‚它们都需è¦�在数æ�®åº“表中增加一个字段,使用这个字段æ�¥åˆ¤æ–­æ•°æ�®æ˜¯å�¦è¿‡æœŸã€‚例如,数æ�®ç‰ˆæœ¬å®žçŽ°æ–¹å¼�中,需è¦�在数æ�®åº“表中增加一个数字类型的 version 字段,当读å�–æ•°æ�®æ—¶ï¼Œå°†Â version 字段的值一å�Œè¯»å‡ºã€‚éš�å�Žæ•°æ�®æ¯�更新一次,对此 version 值加 1。当æ��交更新的时候,判断读出的 version 和数æ�®åº“表中的 version 是å�¦ä¸€è‡´ï¼Œå¦‚果一致,则予以更新;å�¦åˆ™è®¤ä¸ºæ˜¯è¿‡æœŸæ•°æ�®ã€‚ + +## MySQL éš�å¼�和显示é”�定 + +MySQL InnoDB 采用的是两阶段é”�å��议。在事务执行过程中,éš�时都å�¯ä»¥æ‰§è¡Œé”�定,é”�å�ªæœ‰åœ¨æ‰§è¡ŒÂ COMMIT 或者 ROLLBACK 的时候æ‰�会释放,并且所有的é”�是在å�Œä¸€æ—¶åˆ»è¢«é‡Šæ”¾ã€‚å‰�é�¢æ��è¿°çš„é”�定都是éš�å¼�é”�定,InnoDB 会根æ�®äº‹åŠ¡éš”ç¦»çº§åˆ«åœ¨éœ€è¦�的时候自动加é”�。 + +å�¦å¤–,InnoDB 也支æŒ�通过特定的语å�¥è¿›è¡Œæ˜¾ç¤ºé”�定,这些语å�¥ä¸�属于 SQL 规范: + +- ELECT ... LOCK IN SHARE MODE +- SELECT ... FOR UPDATE + +# 范å¼� + +记 A->B 表示 A 函数决定于 B,也就是 B 函数ä¾�赖于 A。 + +如果 {A1,A2,... ,An} 是关系的一个或多个属性的集å�ˆï¼Œè¯¥é›†å�ˆå†³å®šäº†å…³ç³»çš„其它所有属性并且是最å°�的,那么该集å�ˆå°±ç§°ä¸ºé”®ç �。 + +对于函数ä¾�赖 W->A,如果能找到 W 的真å­�集使得 A ä¾�赖于这个真å­�集,那么就是部分ä¾�赖,å�¦åˆ™å°±æ˜¯å®Œå…¨ä¾�èµ–ï¼› + +以下关系中,Sno 表示学å�·ï¼ŒCname 表示课程å��,Sname 表示学生姓å��,Sdept 表示学院,Mname 表示院长姓å��。函数ä¾�赖为 (Sno, Cname) -> (Sname, Sdept, Mname)。注:实际开å�‘过程中,ä¸�会出现这ç§�表,而是æ¯�个实体都放在å�•独一张表中,然å�Žå®žä½“之间的è�”系表用实体 id æ�¥è¡¨ç¤ºã€‚ + +![](index_files/b6a678c0-c875-4038-afba-301846620786.jpg) + +ä¸�符å�ˆèŒƒå¼�的关系,会产生很多异常。主è¦�有以下四ç§�异常: + +1. 冗余数æ�® +2. 修改异常 +3. 删除异常 +4. æ�’入异常,比如如果新æ�’入一个学生的信æ�¯ï¼Œè€Œè¿™ä¸ªå­¦ç”Ÿè¿˜æ²¡é€‰è¯¾ï¼Œé‚£ä¹ˆå°±æ— æ³•æ�’入该学生。 + +关系数æ�®åº“的范å¼�ç�†è®ºå°±æ˜¯æ˜¯ä¸ºäº†è§£å†³è¿™å››ç§�异常。 + +高级别范å¼�çš„ä¾�赖基于低级别的范å¼�。 + +## 第一范å¼� (1NF) + +属性ä¸�å�¯åˆ†ã€‚ + +## 第二范å¼� (2NF) + +æ¯�个é�žä¸»å±žæ€§å®Œå…¨å‡½æ•°ä¾�赖于键ç �。 + +å�¯ä»¥é€šè¿‡åˆ†è§£æ�¥æ»¡è¶³ã€‚ + +**分解å‰�** + +S(Sno, Cname, Sname, Sdept, Mname) + +(Sno, Cname) -> (Sname, Sdept, Mname) + +**分解å�Ž** + +S1(Sno, Sname, Sdept, Mname) + +(Sno) -> (Sname, Sdept, Mname) + +(Sdept) ->  (Mname) + +![](index_files/8ef22836-8800-4765-b4b8-ade80096b323.jpg) + +S2(Sno, Cname, Grade) + +(Sno, Cname) ->  (Grade) + +![](index_files/b0748916-1acd-4138-b24c-69326cb452fe.jpg) + + +## 第三范å¼� (3NF) + +é�žä¸»å±žæ€§ä¸�传递ä¾�赖于键ç �。 + +上述 S1 存在传递ä¾�赖,Mname ä¾�赖于 Sdept,而 Sdept å�ˆä¾�赖于 Sno,å�¯ä»¥ç»§ç»­åˆ†è§£ã€‚ + +![](index_files/4995b547-5620-45af-89d7-10f35c9621a1.jpg) + +## BC 范å¼�(BCNF) + +所有属性ä¸�传递ä¾�赖于键ç �。 + +关系模å¼� STC(Sname, Tname, Cname, Grade),其中四个属性分别为学生姓å��ã€�教师姓å��ã€�课程å��å’Œæˆ�绩。有以下函数ä¾�赖: + +(Sname, Cname) -> (Tname) + +(Sname, Cname) -> (Grade) + +(Sname, Tname) -> (Cname) + +(Sname, Tname) -> (Grade) + +(Tname) -> (Cname) + +分解æˆ� SC(Sname, Cname, Grade) 和 ST(Sname, Tname),对于 ST,属性之间是多对多关系,无函数ä¾�赖。 + +# 约æ�Ÿ + +## 键ç � + +用于唯一表示一个实体。键ç �å�¯ä»¥ç”±å¤šä¸ªå±žæ€§æž„æˆ�,æ¯�个构æˆ�é”®ç �的属性æˆ�为ç �。 + +## å�•值约æ�Ÿ + +æŸ�个属性的值是唯一的。 + +## 引用完整性约æ�Ÿ + +一个实体的属性引用的值在å�¦ä¸€ä¸ªå®žä½“çš„æŸ�个属性中存在。 + +## 域约æ�Ÿ + +æŸ�个属性的值在特定范围之内。 + +## 一般约æ�Ÿ + +一般性约æ�Ÿï¼Œæ¯”如大å°�约æ�Ÿï¼Œæ•°é‡�约æ�Ÿã€‚ + +# 数æ�®åº“的三层模å¼�和两层映åƒ� + +外模å¼�:局部逻辑结构;模å¼�:全局逻辑结构;内模å¼�:物ç�†ç»“构。 + +## 外模å¼� + +å�ˆç§°ç”¨æˆ·æ¨¡å¼�,是用户和数æ�®åº“系统的接å�£ï¼Œç‰¹å®šçš„用户å�ªèƒ½è®¿é—®æ•°æ�®åº“系统æ��供给他的外模å¼�中的数æ�®ã€‚例如ä¸�å�Œçš„用户创建了ä¸�å�Œæ•°æ�®åº“,那么一个用户å�ªèƒ½è®¿é—®ä»–有æ�ƒé™�访问的数æ�®åº“。一个数æ�®åº“å�¯ä»¥æœ‰å¤šä¸ªå¤–模å¼�,一个用户å�ªèƒ½æœ‰ä¸€ä¸ªå¤–模å¼�,但是一个外模å¼�å�¯ä»¥ç»™å¤šä¸ªç”¨æˆ·ä½¿ç”¨ã€‚ + +## 模å¼� + +å�¯ä»¥åˆ†ä¸ºæ¦‚念模å¼�和逻辑模å¼�,概念模å¼�å�¯ä»¥ç”¨æ¦‚念 - 关系æ�¥æ��述;逻辑模å¼�使用特定的数æ�®æ¨¡å¼�(比如关系模型)æ�¥æ��è¿°æ•°æ�®çš„逻辑结构,这ç§�逻辑结构包括数æ�®çš„组æˆ�ã€�æ•°æ�®é¡¹çš„å��ç§°ã€�类型ã€�å�–值范围。ä¸�仅如此,逻辑模å¼�还è¦�æ��è¿°æ•°æ�®ä¹‹é—´çš„关系,数æ�®çš„完整性与安全性è¦�求。 + +## 内模å¼� + +å�ˆç§°ä¸ºå­˜å‚¨æ¨¡å¼�,æ��述记录的存储方å¼�,例如索引的组织方å¼�ã€�æ•°æ�®æ˜¯å�¦åŽ‹ç¼©ä»¥å�Šæ˜¯å�¦åŠ å¯†ç­‰ç­‰ã€‚ + +## 外模å¼�/模å¼�映åƒ� + +把外模å¼�的局部逻辑结构和模å¼�的全局逻辑结构è�”系起æ�¥ã€‚该映åƒ�å�¯ä»¥ä¿�è¯�æ•°æ�®å’Œåº”用程åº�的逻辑独立性。 + +## 模å¼�/内模å¼�映åƒ� + +把模å¼�的全局逻辑结构和内模å¼�的物ç�†ç»“æž„è�”系起æ�¥ï¼Œè¯¥æ˜ åƒ�å�¯ä»¥ä¿�è¯�æ•°æ�®å’Œåº”用程åº�的物ç�†ç‹¬ç«‹æ€§ã€‚ + +# ER 图 + +Entity-Relationship,包å�«ä¸‰ä¸ªéƒ¨åˆ†ï¼šå®žä½“ã€�属性ã€�è�”系。 + +## 实体的三ç§�è�”ç³» + +è�”系包å�«Â 1 对 1,1 对多,多对多三ç§�。 + +如果 A 到 B 是 1 对多关系,那么画个带箭头的线段指å�‘ B;如果是 1 对 1,画两个带箭头的线段;如果是多对多,画两个ä¸�带箭头的线段。 + +![](index_files/292b4a35-4507-4256-84ff-c218f108ee31.jpg) + +## 表示出现多次的关系 + +一个实体在è�”系出现几次,就è¦�用几æ�¡çº¿è¿žæŽ¥ã€‚如下表示一个课程的先修关系,先修关系中,应当出现两个 Course 实体,第一个是先修课程,å�Žä¸€ä¸ªæ˜¯å�Žä¿®è¯¾ç¨‹ï¼Œå› æ­¤éœ€è¦�用两æ�¡çº¿æ�¥è¡¨ç¤ºè¿™ç§�关系。 + +![](index_files/8b798007-e0fb-420c-b981-ead215692417.jpg) + +## è�”系的多å�‘性 + +下图中一个è�”系表示三个实体的关系。虽然è€�师å�¯ä»¥å¼€è®¾å¤šé—¨è¯¾ï¼Œå¹¶ä¸”å�¯ä»¥æ•™æŽˆå¤šå��学生,但是对于特定的学生和课程,å�ªæœ‰ä¸€ä¸ªè€�师教授,这就构æˆ�了一个三元è�”系。 + +![](index_files/423f2a40-bee1-488e-b460-8e76c48ee560.png) + +一般å�ªä½¿ç”¨äºŒå…ƒè�”系,å�¯ä»¥æŠŠå¤šå…ƒå…³ç³»è½¬æ�¢ä¸ºäºŒå…ƒå…³ç³»ã€‚ + +![](index_files/de9b9ea0-1327-4865-93e5-6f805c48bc9e.png) + +## 表示å­�ç±» + +用 is-a è�”ç³»æ�¥è¡¨ç¤ºå­�类,具体å�šæ³•æ˜¯ç”¨ä¸€ä¸ªä¸‰è§’å½¢å’Œä¸¤æ�¡çº¿æ�¥è¿žæŽ¥ç±»å’Œå­�类。与å­�类有关的属性和è�”系都连到å­�类上,而与父类和å­�类都有关的连到父类上。 + +![](index_files/7ec9d619-fa60-4a2b-95aa-bf1a62aad408.jpg) + +# 一些概念 + +**æ•°æ�®æ¨¡åž‹** 由数æ�®ç»“æž„ã€�æ•°æ�®æ“�作和完整性三个è¦�素组æˆ�。 + +**æ•°æ�®åº“系统** 包括了数æ�®åº“,数æ�®åº“管ç�†ç³»ç»Ÿï¼Œåº”用程åº�以å�Šæ•°æ�®åº“管ç�†å‘˜å’Œç”¨æˆ·ï¼Œè¿˜åŒ…括相关的硬件和软件。也就是说数æ�®åº“系统包å�«æ‰€æœ‰ä¸Žæ•°æ�®åº“相关的内容。 + +# å�‚考资料 + +- å�²å˜‰æ�ƒ. 数æ�®åº“系统概论[M]. 清å�Žå¤§å­¦å‡ºç‰ˆç¤¾æœ‰é™�å…¬å�¸, 2006. +- [MySQL ä¹�è§‚é”�与悲观é”� ](https://www.jianshu.com/p/f5ff017db62a) \ No newline at end of file diff --git a/notes/笔记/文档-Google Java 编程风格指å�—.md.txt b/notes/笔记/文档-Google Java 编程风格指å�—.md.txt new file mode 100644 index 00000000..6505ac48 --- /dev/null +++ b/notes/笔记/文档-Google Java 编程风格指å�—.md.txt @@ -0,0 +1,115 @@ +[TOC] + +# 地å�€ + +[Google Java编程风格指å�—](http://www.hawstein.com/posts/google-java-style.html) + +# 命å��约定 + +在 Google 其它编程语言风格中使用的特殊å‰�缀或å�Žç¼€ï¼Œå¦‚ name_ , mName , s_name å’Œ kName ,在 Java 编程风格中都ä¸�å†�使用。 + +**1. 包å��** + +包å��全部å°�写,连续的å�•è¯�å�ªæ˜¯ç®€å�•地连接起æ�¥ï¼Œä¸�使用下划线。 + +**2. ç±»å��** + +ç±»å��都以 UpperCamelCase 风格编写。 + +ç±»å��通常是å��è¯�或å��è¯�短语,接å�£å��称有时å�¯èƒ½æ˜¯å½¢å®¹è¯�或形容è¯�短语。 + +测试类的命å��以它è¦�测试的类的å��称开始,以 Test 结æ�Ÿã€‚ + +**3. 方法å��** + +方法å��都以 lowerCamelCase 风格编写。 + +方法å��通常是动è¯�或动è¯�短语。 + +下划线å�¯èƒ½å‡ºçŽ°åœ¨JUnit测试方法å��称中用以分隔å��称的逻辑组件。一个典型的模å¼�是: test<MethodUnderTest>\_<state> ,例如 testPop_emptyStack 。 å¹¶ä¸�存在唯一正确的方å¼�æ�¥å‘½å��测试方法。 + +**4. 常é‡�å��** + +常é‡�å��命å��模å¼�为 CONSTANT_CASE ,全部字æ¯�大写,用下划线分隔å�•è¯�。 + +æ¯�个常é‡�都是一个é�™æ€�final字段,但ä¸�是所有é�™æ€�final字段都是常é‡�。 + +**5. é�žå¸¸é‡�字段å��** + +é�žå¸¸é‡�字段å��以 lowerCamelCase 风格编写。 + +**6. å�‚æ•°å��** + +å�‚æ•°å��以 lowerCamelCase 风格编写。 + +**7. 局部å�˜é‡�å��** + +局部å�˜é‡�å��以 lowerCamelCase 风格编写 + +**8. 类型å�˜é‡�å��** + +类型å�˜é‡�å�¯ç”¨ä»¥ä¸‹ä¸¤ç§�风格之一进行命å��: + +- å�•个的大写字æ¯�,å�Žé�¢å�¯ä»¥è·Ÿä¸€ä¸ªæ•°å­—(如:E, T, X, T2)。 +- 以类命å��æ–¹å¼�,å�Žé�¢åŠ ä¸ªå¤§å†™çš„ T (如:RequestT, FooBarT)。 + +**9. 驼峰å¼�命å��法** + +1. 把短语转æ�¢ä¸ºçº¯ ASCII ç �,并且移除任何å�•引å�·ã€‚例如:"Müller’s algorithm" å°†å�˜æˆ� "Muellers algorithm"。 +2. 把这个结果切分æˆ�å�•è¯�,在空格或其它标点符å�·(通常是连字符)处分割开。 +3. 现在将所有字æ¯�都å°�写(包括缩写),然å�Žå°†å�•è¯�的第一个字æ¯�大写。 +4. 最å�Žå°†æ‰€æœ‰çš„å�•è¯�连接起æ�¥å¾—到一个标识符。 + +```html +Prose form Correct Incorrect +------------------------------------------------------------------ +"XML HTTP request" XmlHttpRequest XMLHTTPRequest +"new customer ID" newCustomerId newCustomerID +"inner stopwatch" innerStopwatch innerStopWatch +"supports IPv6 on iOS?" supportsIpv6OnIos supportsIPv6OnIOS +"YouTube importer" YouTubeImporter + YoutubeImporter* +``` + +# 编程实践 + +- 覆盖的方法加上 @Override 注释。 + +- 异常ä¸�能忽视,å�¦åˆ™éœ€è¦�在 catch 中注释说明。 + +``` +try { + int i = Integer.parseInt(response); + return handleNumericResponse(i); +} catch (NumberFormatException ok) { + // it's not numeric; that's fine, just continue +} +return handleTextResponse(response); +``` + +- 使用类调用é�™æ€�æˆ�员 + +```java +Foo.aStaticMethod(); +``` + +- ç¦�止使用 finalize() + +# Javadoc + +基本格å¼�如下: + +```java +/** + * Multiple lines of Javadoc text are written here, + * wrapped normally... + */ +``` + +或者å�•行形å¼�: +``` +/** An especially short bit of Javadoc. */ +``` + +标准的 Javadoc 标记按以下顺åº�出现:@param, @return, @throws, @deprecated,å‰�é�¢è¿™4ç§�标记如果出现,æ��述都ä¸�能为空。当æ��述无法在一行中容纳,连续行需è¦�至少å†�缩进4个空格。 + diff --git a/notes/笔记/智力题.md.txt b/notes/笔记/智力题.md.txt new file mode 100644 index 00000000..02a631e5 --- /dev/null +++ b/notes/笔记/智力题.md.txt @@ -0,0 +1,193 @@ +[TOC] + +# 智力题 + +**1. 有 20 ç“¶è�¯ä¸¸ï¼Œå…¶ä¸­ 19 瓶装有 1 å…‹/ç²’çš„è�¯ä¸¸ï¼Œä½™ä¸‹ä¸€ç“¶è£…有 1.1 å…‹/ç²’çš„è�¯ä¸¸ã€‚给你一å�°ç§°é‡�精准的天平,怎么找出比较é‡�的那瓶è�¯ä¸¸ï¼Ÿå¤©å¹³å�ªèƒ½ç”¨ä¸€æ¬¡ã€‚** + +å�¯ä»¥ä»Žè�¯ä¸¸çš„æ•°é‡�上æ�¥åˆ¶é€ å·®å¼‚:从第 i ç“¶è�¯ä¸¸ä¸­å�–出 i 个è�¯ä¸¸ï¼Œç„¶å�Žä¸€èµ·ç§°é‡�。å�¯ä»¥çŸ¥é�“,如果第 i ç“¶è�¯ä¸¸é‡� 1.1 å…‹/粒,那么称é‡�结果就会比正常情况下é‡� 0.1 * i 克。 + +**2. 有个 8×8 棋盘,其中对角的角è�½ä¸Šï¼Œä¸¤ä¸ªæ–¹æ ¼è¢«åˆ‡æŽ‰äº†ã€‚给定 31 å�—多米诺骨牌,一å�—骨牌æ�°å¥½å�¯ä»¥è¦†ç›–两个方格。用这 31 å�—骨牌能å�¦ç›–ä½�整个棋盘?** + +![](index_files/0588c158-1dff-434c-b590-9cd2fe5fc7e2.jpg) + +将棋盘划分æˆ�黑白两ç§�颜色,æ¯�ç§�颜色ä¸�相邻,那么一å�—骨牌需è¦�å�Œæ—¶è¦†ç›–黑色和白色两个方格。å�‡è®¾åˆ‡æŽ‰çš„两个对角的方格是黑色的,那么å�ªå‰©ä¸‹ 32 å�—白色方格和 30 å�—黑色方格,因此ä¸�能用 31 å�—骨牌覆盖。 + +**3. 有两个水壶,容é‡�分别为 5 夸脱和 3 夸脱,若水的供应ä¸�é™�é‡�,怎么用这两个水壶得到刚好 4 夸脱的水?** + +![](index_files/9ba3b88b-eace-4a3a-9095-1e9c5c62a6cf.png) + +**4. 有个岛上ä½�ç�€ä¸€ç¾¤äººï¼Œæœ‰ä¸€å¤©æ�¥äº†ä¸ªæ¸¸å®¢ï¼Œå®šäº†ä¸€æ�¡å¥‡æ€ªçš„规矩:所有è“�眼ç�›çš„人都必须尽快离开这个岛。 æ¯�晚 8 点会有一个航ç�­ç¦»å²›ã€‚æ¯�个人都看得è§�别人眼ç�›çš„颜色,但ä¸�知é�“自己的(别人也ä¸�å�¯ä»¥å‘ŠçŸ¥ï¼‰ã€‚此外,他们ä¸�知é�“岛上到底有多少人是è“�眼ç�›çš„,å�ªçŸ¥é�“至少有一个人的眼ç�›æ˜¯è“�色的。所有è“�眼ç�›çš„人è¦�花几天æ‰�能离开这个岛?** + +å�‡å®šè¿™ä¸ªå²›ä¸Šä¸€å…±æœ‰ n 人,其中 c 人有è“�眼ç�›ã€‚ + +1\. 情况 c = 1 +å�‡è®¾å²›ä¸Šæ‰€æœ‰äººéƒ½æ˜¯è�ªæ˜Žçš„,è“�眼ç�›çš„人四处观察之å�Žï¼Œå�‘现没有人是è“�眼ç�›çš„。但他知é�“至少有一人是è“�眼ç�›çš„,于是就能推导出自己一定是è“�眼ç�›çš„。因此,他会æ�­ä¹˜å½“晚的飞机离开。 + +2\. 情况 c = 2 +两个è“�眼ç�›çš„人看到对方,并ä¸�确定 c 是 1 还是 2,但是由上一ç§�情况,他们知é�“,如果 c = 1,那个è“�眼ç�›çš„人第一晚就会离岛。因此,å�‘现å�¦ä¸€ä¸ªè“�眼ç�›çš„人ä»�在岛上,他一定能推断出 c = 2,也就æ„�味ç�€ä»–自己也是è“�眼ç�›çš„。于是,两个è“�眼ç�›çš„人都会在第二晚离岛。 + +3\. 情况 c > 2:一般情况 +é€�æ­¥æ��高 c 时,我们å�¯ä»¥çœ‹å‡ºä¸Šè¿°é€»è¾‘ä»�旧适用。如果 c = 3,那么,这三个人会立å�³æ„�识到有 2 到 3 人是è“�眼ç�›çš„。如果有两人是è“�眼ç�›çš„,那么这两人会在第二晚离岛。因此,如果过了第二晚å�¦å¤–两人还在岛上,æ¯�个è“�眼ç�›çš„人都能推断出 c = 3,因此这三人都有è“�眼ç�›ã€‚他们会在第三晚离岛。ä¸�论 c 为什么值,都å�¯ä»¥å¥—用这个模å¼�。所以,如果有 c 人是è“�眼ç�›çš„,则 **所有è“�眼ç�›çš„人è¦�用 c 晚æ‰�能离岛,且都在å�Œä¸€æ™šç¦»å¼€**。 + +**5. 有栋建筑物高 100 层。若从第 N 层或更高的楼层扔下æ�¥ï¼Œé¸¡è›‹å°±ä¼šç ´æŽ‰ã€‚若从第 N 层以下的楼层扔下æ�¥åˆ™ä¸�会破掉。给你 2 个鸡蛋,请找出 N,并è¦�求最差情况下扔鸡蛋的次数为最少。** + +首先,让我们试ç�€ä»Ž 10 层开始扔鸡蛋,然å�Žæ˜¯ 20 层,等等。 +1\. 如果鸡蛋1第一次扔下楼(10层)就破掉了,那么,最多需è¦�扔 10 次。 +2\. 如果鸡蛋1最å�Žä¸€æ¬¡æ‰”下楼(100层)æ‰�破掉,那么,最多è¦�扔 19 次(10ã€� 20ã€�…ã€� 90ã€�100 层,然å�Žæ˜¯ 91 到 99 层)。 + +这么å�šä¹ŸæŒºä¸�错,但我们å�ªè€ƒè™‘了ç»�对最差情况。我们应该进行“负载å�‡è¡¡â€�,让这两ç§�情况下扔鸡蛋的次数更å�‡åŒ€ã€‚ + +我们的目标是设计一ç§�扔鸡蛋的方法,使得扔鸡蛋1时,ä¸�论是在第一次还是最å�Žä¸€æ¬¡æ‰”下楼æ‰�破掉,次数越稳定越好。 + +完美负载å�‡è¡¡è¦�求æ¯�次鸡蛋1多扔一次,鸡蛋2就应该少扔一次,这样æ¯�ç§�情况下扔鸡蛋的次数都相å�Œã€‚由此å�¯çŸ¥ï¼Œé¸¡è›‹1必须从 X 层开始往下扔,然å�Žå†�往上增加 X - 1 层……直至到达 100 层。 + +求解方程å¼� X + (X-1) + (X-2) + … + 1 = 100,得到X (X + 1) / 2 = 100 → X = 14。 + +我们先从 14 层开始,然å�Žæ˜¯ 27 层,接ç�€æ˜¯ 39 层,ä¾�此类推,最差情况下鸡蛋è¦�扔 14 次。 + +正如解决其他许多最大化/最å°�化的问题一样,这类问题的关键在于“平衡最差情况â€�。 + +**6. 走廊上有 100 个关上的储物柜。有个人先是将 100 个柜å­�全都打开。接ç�€ï¼Œæ¯�数两个柜å­�关上一个。然å�Žï¼Œåœ¨ç¬¬ä¸‰è½®æ—¶ï¼Œå†�æ¯�隔两个就切æ�¢ç¬¬ä¸‰ä¸ªæŸœå­�的开关状æ€�。照此规律å��å¤�æ“�作 100 次,在第 i 轮,这个人会æ¯�æ•° i 个就切æ�¢ç¬¬ i 个柜å­�的状æ€�。当第 100 è½®ç»�过走廊时,å�ªåˆ‡æ�¢ç¬¬ 100 个柜å­�的开关状æ€�,此时有几个柜å­�是开ç�€çš„?** + +1\. 问题:柜å­�会在哪几轮切æ�¢çжæ€�? +柜å­�n会在nçš„æ¯�个因å­�(包括 1 å’Œ n 本身)对应的那一轮切æ�¢çжæ€�。也就是说,柜å­�15会在第 1ã€� 3ã€� 5 å’Œ 15 轮开或关一次。 + +2\. 问题:柜å­�什么时候还是开ç�€çš„? +如果因å­�个数(记作 x )为奇数,则这个柜å­�是开ç�€çš„。你å�¯ä»¥æŠŠä¸€å¯¹å› å­�比作开和关,若还剩一个因å­�,则柜å­�就是开ç�€çš„。 + +3\. 问题: x 什么时候为奇数? +è‹¥ n 为完全平方数,则 x 的值为奇数。ç�†ç”±å¦‚下:将 n 的两个互补因å­�é…�对。例如,如 n 为 36,则因å­�é…�对情况为: (1, 36)ã€� (2, 18)ã€� (3, 12)ã€� (4, 9)ã€� (6, 6)。注æ„�, (6, 6) 其实å�ªæœ‰ä¸€ä¸ªå› å­�,因此 n 的因å­�个数为奇数。 +4\. 问题:有多少个完全平方数? +一共有 10 个完全平方数:1\*1, 2\*2, 3\*3, ..., 10\*10 + +因此,**最å�Žå…±æœ‰ 10 个柜å­�是开ç�€çš„**。 + +**7. 给定两æ�¡ç»³å­�,æ¯�æ�¡ç»³å­�燃烧殆尽正好è¦�用一个å°�时。怎样用这两æ�¡ç»³å­�准确计é‡� 15 分钟?注æ„�这些绳å­�密度ä¸�å�‡åŒ€ï¼Œå› æ­¤çƒ§æŽ‰å�Šæˆªç»³å­�ä¸�一定正好用å�Šä¸ªå°�时。** + +1\. 点燃绳å­� 1 两头的å�Œæ—¶ï¼Œç‚¹ç‡ƒç»³å­� 2 的一头。 +2\. 当绳å­� 1 烧完,正好过去 30 分钟。而绳å­� 2 还å�¯ä»¥å†�烧 30 分钟。 +3\. 点燃绳å­� 2 çš„å�¦ä¸€å¤´ã€‚ +4\. 15 分钟å�Žï¼Œç»³å­� 2 将全部烧完。 + +**8. 给定 9 个ç�ƒï¼Œå…¶ä¸­ 8 个ç�ƒçš„é‡�é‡�相å�Œï¼Œå�ªæœ‰ä¸€ä¸ªæ¯”较é‡�。然å�Žç»™å®šä¸€ä¸ªå¤©å¹³ï¼Œå�¯ä»¥ç§°å‡ºå·¦å�³ä¸¤è¾¹å“ªè¾¹æ›´é‡�。最多用两次天平,找出这个é‡�ç�ƒã€‚** + +将这些ç�ƒå�‡åˆ†æˆ� 3 个一组共 3 组,称é‡�一次就能知é�“哪一组ç�ƒæ›´é‡�。我们甚至å�¯ä»¥æ€»ç»“出一æ�¡è§„律:给定 N 个ç�ƒï¼Œå…¶ä¸­ N 能被 3 整除,称é‡�一次便能找到包å�«é‡�ç�ƒçš„那一组ç�ƒã€‚ + +找到这一组 3 个ç�ƒä¹‹å�Žï¼Œæˆ‘们å�ªæ˜¯ç®€å�•地é‡�å¤�æ­¤å‰�的模å¼�:先把一个ç�ƒæ”¾åˆ°ä¸€è¾¹ï¼Œç§°é‡�剩下的两个ç�ƒã€‚从中挑出那个é‡�ç�ƒï¼›æˆ–者,如果这两个ç�ƒé‡�é‡�相å�Œï¼Œé‚£ç¬¬ 3 个ç�ƒä¾¿æ˜¯é‡�ç�ƒã€‚ + +**9. 考虑一个å�Œäººæ¸¸æˆ�。游æˆ�在一个圆桌上进行。æ¯�个游æˆ�者都有足够多的硬å¸�。他们需è¦�在桌å­�上轮æµ�放置硬å¸�,æ¯�次必需且å�ªèƒ½æ”¾ç½®ä¸€æžšç¡¬å¸�,è¦�求硬å¸�完全置于桌é�¢å†…(ä¸�能有一部分悬在桌å­�外é�¢ï¼‰ï¼Œå¹¶ä¸”ä¸�能与原æ�¥æ”¾è¿‡çš„硬å¸�é‡�å� ã€‚è°�没有地方放置新的硬å¸�,è°�就输了。游æˆ�的先行者还是å�Žè¡Œè€…有必胜策略?** + +先行者在桌å­�中心放置一枚硬å¸�,以å�Žçš„硬å¸�总是放在与å�Žè¡Œè€…刚æ‰�放的地方相对称的ä½�置。这样,å�ªè¦�å�Žè¡Œè€…能放,先行者一定也有地方放。先行者必胜。 + +**10. 一个矩形蛋糕,蛋糕内部有一å�—矩形的空洞。å�ªç”¨ä¸€åˆ€ï¼Œå¦‚何将蛋糕切æˆ�大å°�相等的两å�—?** + +注æ„�到平分矩形é�¢ç§¯çš„线都ç»�过矩形的中心。过大矩形和空心矩形å�„自的中心画一æ�¡çº¿ï¼Œè¿™æ�¡çº¿æ˜¾ç„¶æŠŠä¸¤ä¸ªçŸ©å½¢éƒ½åˆ†æˆ�了一å�Šï¼Œå®ƒä»¬çš„差当然也是相等的。 + +**11. 一å�—矩形的巧克力,åˆ�å§‹æ—¶ç”± N x M 个å°�å�—组æˆ�。æ¯�一次你å�ªèƒ½æŠŠä¸€å�—巧克力掰æˆ�两个å°�矩形。最少需è¦�几次æ‰�能把它们掰æˆ� N x M å�— 1x1 çš„å°�巧克力?** + +因为æ¯�掰一次å�Žå½“å‰�巧克力的å�—æ•°å�ªèƒ½å¢žåŠ  1,把巧克力分æˆ� N x M å�—当然需è¦�至少掰 N x M - 1 次。 + +**12. 地ç�ƒä¸Šæœ‰å¤šå°‘个点,使得从该点出å�‘å�‘å�—走一英里,å�‘东走一英里,å†�å�‘北走一英里之å�Žæ�°å¥½å›žåˆ°äº†èµ·ç‚¹ï¼Ÿ** + +“北æž�点â€�是一个传统的答案,其实这个问题还有其它的答案。事实上,满足è¦�求的点有无穷多个。所有è·�离å�—æž�点 1 + 1/(2Ï€) 英里的地方都是满足è¦�求的,å�‘å�—走一英里å�Žåˆ°è¾¾è·�离å�—æž�点 1/(2Ï€) 的地方,å�‘东走一英里å�Žæ­£å¥½ç»•行纬度圈一周,å†�å�‘北走原路返回到起点。事实上,这ä»�ç„¶ä¸�是满足è¦�求的全部点。è·�离å�—æž�点 1 + 1/(2kÏ€) 的地方都是å�¯ä»¥çš„,其中 k å�¯ä»¥æ˜¯ä»»æ„�一个正整数。 + +**13. Aã€�B 两人分别在两座岛上。B 生病了,A 有 B 所需è¦�çš„è�¯ã€‚C 有一艘å°�船和一个å�¯ä»¥ä¸Šé”�的箱å­�。C æ„¿æ„�在 A å’Œ B 之间è¿�东西,但东西å�ªèƒ½æ”¾åœ¨ç®±å­�里。å�ªè¦�ç®±å­�没被上é”�,C 都会å�·èµ°ç®±å­�里的东西,ä¸�管箱å­�里有什么。如果 A å’Œ B å�„自有一把é”�å’Œå�ªèƒ½å¼€è‡ªå·±é‚£æŠŠé”�的钥匙,A 应该如何把东西安全递交给 B ?** + +A 把è�¯æ”¾è¿›ç®±å­�,用自己的é”�把箱å­�é”�上。B 拿到箱å­�å�Žï¼Œå†�在箱å­�上加一把自己的é”�。箱å­�è¿�回 A å�Žï¼ŒA å�–下自己的é”�。箱å­�å†�è¿�到 B 手中时,B å�–下自己的é”�,获得è�¯ç‰©ã€‚ + +**14. 一对夫妇邀请 N-1 对夫妇å�‚加è�šä¼šï¼ˆå› æ­¤è�šä¼šä¸Šæ€»å…±æœ‰ 2N 人)。æ¯�个人都和所有自己ä¸�认识的人æ�¡äº†ä¸€æ¬¡æ‰‹ã€‚ç„¶å�Žï¼Œç”·ä¸»äººé—®å…¶ä½™æ‰€æœ‰äººï¼ˆå…± 2N-1 个人)å�„自都æ�¡äº†å‡ æ¬¡æ‰‹ï¼Œå¾—到的答案全部都ä¸�一样。å�‡è®¾æ¯�个人都认识自己的é…�å�¶ï¼Œé‚£ä¹ˆå¥³ä¸»äººæ�¡äº†å‡ æ¬¡æ‰‹ï¼Ÿ** + +æ�¡æ‰‹æ¬¡æ•°å�ªå�¯èƒ½æ˜¯ä»Ž 0 到 2N-2 è¿™ 2N-1 个数。除去男主人外,一共有 2N-1 个人,因此æ¯�个数æ�°å¥½å‡ºçŽ°äº†ä¸€æ¬¡ã€‚å…¶ä¸­æœ‰ä¸€ä¸ªäºº(0)没有æ�¡æ‰‹ï¼Œæœ‰ä¸€ä¸ªäºº(2N-2)和所有其它的夫妇都æ�¡äº†æ‰‹ã€‚这两个人肯定是一对夫妻,å�¦åˆ™å�Žè€…将和å‰�者æ�¡æ‰‹ï¼ˆä»Žè€Œå‰�者的æ�¡æ‰‹æ¬¡æ•°ä¸�å†�是 0)。除去这对夫妻外,有一个人(1)å�ªä¸Ž(2N-2)æ�¡è¿‡æ‰‹ï¼Œæœ‰ä¸€ä¸ªäºº(2N-3)和除了(0)以外的其它夫妇都æ�¡äº†æ‰‹ã€‚这两个人肯定是一对夫妻,å�¦åˆ™å�Žè€…将和å‰�者æ�¡æ‰‹ï¼ˆä»Žè€Œå‰�者的æ�¡æ‰‹æ¬¡æ•°ä¸�å†�是 1)。以此类推,直到æ�¡è¿‡ N-2 次手的人和æ�¡è¿‡ N 次手的人é…�æˆ�一对。此时,除了男主人å�Šå…¶é…�å�¶ä»¥å¤–,其余所有人都已ç»�é…�对。根æ�®æŽ’除法,最å�Žå‰©ä¸‹æ�¥çš„那个æ�¡æ‰‹æ¬¡æ•°ä¸º N-1 的人就是女主人了。 + +**15. 你在一幢 100 层大楼下,有 21 根电线线头标有数字 1..21。这些电线一直延伸到大楼楼顶,楼顶的线头处标有字æ¯� A..U。你ä¸�知é�“下é�¢çš„æ•°å­—和上é�¢çš„å­—æ¯�的对应关系。你有一个电池,一个ç�¯æ³¡ï¼Œå’Œè®¸å¤šå¾ˆçŸ­çš„电线。如何å�ªä¸Šä¸‹æ¥¼ä¸€æ¬¡å°±èƒ½ç¡®å®šç”µçº¿çº¿å¤´çš„对应关系?** + +在下é�¢æŠŠ 2,3 连在一起,把 4 到 6 全连在一起,把 7 到 10 全连在一起,等等,这样你就把电线分æˆ�了 6 个“等价类â€�,大å°�分别为 1, 2, 3, 4, 5, 6。然å�Žåˆ°æ¥¼é¡¶ï¼Œæµ‹å‡ºå“ªæ ¹çº¿å’Œå…¶å®ƒæ‰€æœ‰ç”µçº¿éƒ½ä¸�相连,哪些线和å�¦å¤–一根相连,哪些线和å�¦å¤–两根相连,等等,从而确定出字æ¯� A..U å�„属于哪个等价类。现在,把æ¯�个等价类中的第一个字æ¯�连在一起,形æˆ�一个大å°�为 6 的新等价类;å†�把å�Ž 5 个等价类中的第二个字æ¯�连在一起,形æˆ�一个大å°�为 5 的新等价类;以此类推。回到楼下,把新的等价类区别出æ�¥ã€‚这样,你就知é�“了æ¯�个数字对应了哪一个原等价类的第几个字æ¯�,从而解决问题。 + +**16. æŸ�ç§�è�¯æ–¹è¦�求é�žå¸¸ä¸¥æ ¼ï¼Œä½ æ¯�天需è¦�å�Œæ—¶æœ�用 Aã€�B 两ç§�è�¯ç‰‡å�„一颗,ä¸�能多也ä¸�能少。这ç§�è�¯é�žå¸¸è´µï¼Œä½ ä¸�希望有任何一点的浪费。一天,你打开装è�¯ç‰‡ A çš„è�¯ç“¶ï¼Œå€’出一粒è�¯ç‰‡æ”¾åœ¨æ‰‹å¿ƒï¼›ç„¶å�Žæ‰“å¼€å�¦ä¸€ä¸ªè�¯ç“¶ï¼Œä½†ä¸�å°�心倒出了两粒è�¯ç‰‡ã€‚现在,你手心上有一颗è�¯ç‰‡ A,两颗è�¯ç‰‡ B,并且你无法区别哪个是 A,哪个是 B。你如何æ‰�能严格é�µå¾ªè�¯æ–¹æœ�用è�¯ç‰‡ï¼Œå¹¶ä¸”ä¸�能有任何的浪费?** + +把手上的三片è�¯å�„自切æˆ�两å�Šï¼Œåˆ†æˆ�两堆摆放。å†�å�–出一粒è�¯ç‰‡ A,也把它切æˆ�两å�Šï¼Œç„¶å�Žåœ¨æ¯�一堆里加上å�Šç‰‡çš„ A。现在,æ¯�一堆è�¯ç‰‡æ�°å¥½åŒ…å�«ä¸¤ä¸ªå�Šç‰‡çš„ A 和两个å�Šç‰‡çš„ B。一天æœ�用其中一堆å�³å�¯ã€‚ + +**17. 你在一个飞船上,飞船上的计算机有 n 个处ç�†å™¨ã€‚çª�然,飞船å�—到外星激光武器的攻击,一些处ç�†å™¨è¢«æ�Ÿå��了。你知é�“有超过一å�Šçš„处ç�†å™¨ä»�然是好的。你å�¯ä»¥å�‘一个处ç�†å™¨è¯¢é—®å�¦ä¸€ä¸ªå¤„ç�†å™¨æ˜¯å¥½çš„还是å��的。一个好的处ç�†å™¨æ€»æ˜¯è¯´çœŸè¯�,一个å��的处ç�†å™¨æ€»æ˜¯è¯´å�‡è¯�。用 n-2 次询问找出一个好的处ç�†å™¨ã€‚** + +给处ç�†å™¨ä»Ž 1 到 n æ ‡å�·ï¼Œå¹¶ç”¨ç¬¦å�· a->b 表示å�‘æ ‡å�·ä¸º a 的处ç�†å™¨è¯¢é—®å¤„ç�†å™¨ b 是ä¸�是好的。 + +首先 1->2,如果 1 说ä¸�是,就把他们俩都去掉(去掉了一个好的和一个å��的,则剩下的处ç�†å™¨ä¸­å¥½çš„ä»�然过å�Šï¼‰ï¼Œç„¶å�Žä»Ž 3->4 开始继续å�‘问;如果 1 说 2 是好的,就继续问 2->3,3->4,…… 直到æŸ�一次 j 说 j+1 是å��的,把 j å’Œ j+1 去掉,然å�Žé—® j-1 -> j+2,如果å‰�é�¢å·²ç»�没有 j-1 了,从 j+2 -> j+3 开始å�‘问。 + +注æ„�到你始终维护ç�€è¿™æ ·ä¸€ä¸ªâ€œé“¾â€�,å‰�é�¢çš„æ¯�一个处ç�†å™¨éƒ½è¯´å�Žé�¢é‚£ä¸ªæ˜¯å¥½çš„。这æ�¡é“¾é‡Œçš„æ‰€æœ‰å¤„ç�†å™¨è¦�么都是好的,è¦�么都是å��的。当这æ�¡é“¾è¶Šæ�¥è¶Šé•¿ï¼Œå‰©ä¸‹çš„处ç�†å™¨è¶Šæ�¥è¶Šå°‘时,总有一个时候这æ�¡é“¾è¶…过了剩下的处ç�†å™¨çš„一å�Šï¼Œæ­¤æ—¶å�¯ä»¥è‚¯å®šè¿™æ�¡é“¾é‡Œçš„æ‰€æœ‰å¤„ç�†å™¨éƒ½æ˜¯å¥½çš„。或者,越æ�¥è¶Šå¤šçš„处ç�†å™¨éƒ½è¢«åŽ»æŽ‰äº†ï¼Œé“¾çš„é•¿åº¦ä¾�旧为 0,而最å�Žå�ªå‰©ä¸‹ä¸€ä¸ªæˆ–两个处ç�†å™¨æ²¡è¢«é—®è¿‡ï¼Œé‚£ä»–们一定就是好的了。å�¦å¤–注æ„�到,第一个处ç�†å™¨çš„好å��从æ�¥æ²¡è¢«é—®è¿‡ï¼Œä»”细想想你会å�‘现最å�Žä¸€ä¸ªå¤„ç�†å™¨çš„好å��也ä¸�å�¯èƒ½è¢«é—®åˆ°ï¼ˆä¸€æ—¦é“¾é•¿è¶…过剩余处ç�†å™¨çš„一å�Šï¼Œæˆ–者最å�Žæ²¡è¢«åŽ»æŽ‰çš„å°±å�ªå‰©è¿™ä¸€ä¸ªäº†æ—¶ï¼Œä½ å°±ä¸�问了),因此询问次数ä¸�会超过 n-2。 + +**18. 有 25 匹马,速度都ä¸�å�Œï¼Œä½†æ¯�匹马的速度都是定值。现在å�ªæœ‰ 5 æ�¡èµ›é�“,无法计时,å�³æ¯�赛一场最多å�ªèƒ½çŸ¥é�“ 5 匹马的相对快慢。问最少赛几场å�¯ä»¥æ‰¾å‡º 25 匹马中速度最快的å‰� 3 å��?(百度2008å¹´é�¢è¯•题)** + +æ¯�匹马都至少è¦�有一次å�‚赛的机会,所以 25 匹马分æˆ� 5 组,一开始的这 5 场比赛是å…�ä¸�了的。接下æ�¥è¦�找冠军也很容易,æ¯�一组的冠军在一起赛一场就行了(第 6 场)。最å�Žå°±æ˜¯è¦�找第 2 和第 3 å��。我们按照第 6 场比赛中得到的å��次ä¾�次把它们在å‰� 5 场比赛中所在的组命å��为 Aã€�Bã€�Cã€�Dã€�E。å�³ï¼šA 组的冠军是第 6 场的第 1 å��,B 组的冠军是第 6 场的第 2 å��……æ¯�一组的 5 匹马按照他们已ç»�赛出的æˆ�绩从快到慢编å�·ï¼š + +A组:1,**2,3**,4,5 +B组:**1,2**,3,4,5 +C组:**1,**2,3,4,5 +D组:1,2,3,4,5 +E组:1,2,3,4,5 + +从现在所得到的信æ�¯ï¼Œæˆ‘们å�¯ä»¥çŸ¥é�“哪些马已ç»�被排除在 3 å��以外。å�ªè¦�å·²ç»�能确定有 3 匹或 3 匹以上的马比这匹马快,那么它就已ç»�被淘汰了。å�¯ä»¥çœ‹åˆ°ï¼Œå�ªæœ‰ä¸Šè¡¨ä¸­ç²—体的那 5 匹马æ‰�有å�¯èƒ½ä¸º 2ã€�3 å��的。å�³ï¼šA 组的 2ã€�3 å��ï¼›B 组的 1ã€�2 å��,C 组的第 1 å��。å�–è¿™ 5 匹马进行第 7 场比赛,第 7 场比赛的å‰�两å��就是 25 匹马中的 2ã€�3 å��。故一共最少è¦�èµ› 7 场。 + +**19. 有 7 å…‹ã€�2 å…‹ç �ç �å�„一个,天平一å�ªï¼Œå¦‚何å�ªç”¨è¿™äº›ç‰©å“�三次将140 å…‹çš„ç›�分æˆ� 50ã€�90 å…‹å�„一份?** + +第一步:把 140 å…‹ç›�分æˆ�两等份,æ¯�份 70 克。 +第二步:把天平一边放上 2+7 å…‹ç �ç �,å�¦ä¸€è¾¹æ”¾ç›�,这样就得到 9 å…‹å’Œ 61 克分开的ç›�。 +第三步:将 9 å…‹ç›�å’Œ 2 å…‹ç �ç �放在天平一边,å�¦ä¸€è¾¹æ”¾ç›�,这样就得到 11 å…‹å’Œ 50 克。于是 50 å’Œ 90 就分开了。 + +**20. 有三ç­�水果,一ç­�装的全是苹果,第二ç­�装的全是橘å­�,第三ç­�是橘å­�与苹果混在一起。ç­�上的标签都是骗人的,(比如,如果标签写的是橘å­�,那么å�¯ä»¥è‚¯å®šç­�里ä¸�会å�ªæœ‰æ©˜å­�,å�¯èƒ½è¿˜æœ‰è‹¹æžœï¼‰ä½ çš„任务是拿出其中一ç­�,从里é�¢å�ªæ‹¿ä¸€å�ªæ°´æžœï¼Œç„¶å�Žæ­£ç¡®å†™å‡ºä¸‰ç­�水果的标签。** + +从贴有苹果和橘å­�标签的ç­�中拿出一个水果,如果是苹果,说明这个ç­�中全是苹果,那么贴苹果标签的ç­�里装的全是桔å­�,则贴有桔å­�标签的ç­�中装的苹果和桔å­�;如果拿出的一个水果是桔å­�,说明这个ç­�中全是桔å­�,那么贴桔å­�标签的ç­�里装的全是苹果,贴苹果标签的ç­�里装的是苹果和桔å­�。 + +# 数字推ç�† + +数列常è§�的有等差等比关系,等差关系中数之间的 **é—´éš”** 相å�Œï¼Œç­‰æ¯”关系中数之间的 **比值** 相å�Œã€‚ä¸�规则的数列,间隔和比值都ä¸�会相å�Œï¼Œä½†æ˜¯é—´éš”和比值å�ˆå�¯ä»¥å½“å�šä¸€ä¸ªæ•°åˆ—,并且这个数列具有等差等比关系。例如 3,4,6,9,13,18,间隔数列为 1, 2, 3, 4, 5 为等差数列,8,8,12,24,60,180,比值数列为 1, 1.5, 2, 2.5 为等比数列。 + +数列也å�¯èƒ½å’Œ **平方ã€�ç«‹æ–¹ã€�次方** 相关。例如 66,83,102,123,146 为 8, 9, 10, 11, 12 的平方å†�加 2 所得,0,6,24,60,120,210 为 n3 - 1。 + +当相邻的数都没规律时,考虑 **é”™ä½�** 的情况。例如 5,4,10,8,15,16,20,32 ,奇数列和å�¶æ•°åˆ—分别为一个等差数列和一个等比数列。 + +数列中一个数ä¸�一定å�ªå’Œå‰�一个数有关,有å�¯èƒ½ **å’Œå‰�两个数有关**,例如 2,5,10,50,500,第三个数为å‰�两个数的乘积。 + +# 图形推ç�† + +**1. 结构类** + +- 对称性(水平对称ã€�垂直对称ã€�中心对称) +- 直曲性(直线ã€�曲线) +- å°�闭与开放 + +**2. ä½�置类** + +- 相对ä½�置(相交ã€�相离ã€�相切;相对与相邻;独立于覆盖) +- 移动ã€�旋转ã€�翻转 + +**3. å� åŠ ç±»** + +- 直接å� åŠ  +- 去å�Œå­˜å¼‚ +- 去异存å�Œ +- 自定义å� åŠ ï¼ˆé˜´å½±å�˜åŒ–) + +**4. 组å�ˆç±»** + +**5. æ•°é‡�ç±»** + +- 点(å��字交å�‰ç‚¹ã€�T 字交å�‰ç‚¹ã€�切点ã€�接触点数é‡�) +- 线(线æ�¡æ•°ï¼šç›´çº¿æ•°ã€�曲线数ã€�线æ�¡æ€»æ•°ï¼›ç¬”画数;一笔画与多笔画) +- 角(é”�è§’ã€�ç›´è§’ã€�é’�角的数é‡�) +- é�¢ï¼ˆå°�闭区域数ã€�é�¢ç§¯å¤§å°�ã€�é�¢çš„个数) + +æ•°é‡�关系有: + +- 相å�Œ +- 等差 +- 等比 +- 和相等 + +![](index_files/FireShot_20Capture_209_20-_20_u.png) + +# å�‚考资料 + +1. 程åº�员é�¢è¯•金典 +2. [数字推ç�†é¢˜çš„å�„ç§�规律范例题型](http://www.linquan.info/archives/62.html) +3. [程åº�员有趣的é�¢è¯•智力题](http://blog.csdn.net/hackbuteer1/article/details/6726419) +4. [图形推ç�†50题 答案å�Šè§£æž�](http://blog.sina.com.cn/s/blog_7815fa370100tdgm.html) \ No newline at end of file diff --git a/notes/笔记/正则表达å¼�.md.txt b/notes/笔记/正则表达å¼�.md.txt new file mode 100644 index 00000000..13eab5b9 --- /dev/null +++ b/notes/笔记/正则表达å¼�.md.txt @@ -0,0 +1,391 @@ +[TOC] + +# 第 1 章 概述 + +正则表达å¼�用于文本内容的查找和替æ�¢ã€‚ + +正则表达å¼�内置于其它语言或者软件产å“�中,它本身ä¸�是一ç§�语言或者软件。 + +一个问题往往å�¯ä»¥ç”¨å¤šç§�正则表达å¼�方案æ�¥è§£å†³ã€‚ + +[ 正则表达å¼�在线工具 ](http://tool.chinaz.com/regex) + +# 第 2 章 匹é…�å�•个字符 + +正则表达å¼�一般是区分大å°�写的,但是也有些实现是ä¸�区分。 + +**.** å�¯ä»¥ç”¨æ�¥åŒ¹é…�任何的å�•个字符,但是在ç»�大多数实现里é�¢ï¼Œä¸�能匹é…�æ�¢è¡Œç¬¦ï¼› + +**\\** 是元字符,表示它有特殊的å�«ä¹‰ï¼Œè€Œä¸�是字符本身的å�«ä¹‰ã€‚如果需è¦�匹é…� . ,那么è¦�用 \ 进行转义,å�³åœ¨Â . å‰�é�¢åŠ ä¸ŠÂ \ 。 + + +**正则表达å¼�** + +``` +nam. +``` + +**匹é…�结果** + +My **name** is Zheng. + + +# 第 3 章 匹é…�一组字符 + +**[ ]** 定义一个字符集å�ˆï¼› + +0-9ã€�a-z 定义了一个字符区间,区间使用 ASCII ç �æ�¥ç¡®å®šã€‚字符区间å�ªèƒ½ç”¨åœ¨Â [ ] 之间,因此 **-** 元字符å�ªæœ‰åœ¨Â [ ] 之间æ‰�是元字符,在 [ ] 之外就是一个普通字符; + +**^** 是å�–é�žæ“�作,必须在 [ ] 字符集å�ˆä¸­ä½¿ç”¨ï¼› + +**应用** + +匹é…�以 abc 为开头,并且最å�Žä¸€ä¸ªå­—æ¯�ä¸�为数字的字符串: + +**正则表达å¼�** + +``` +abc[^0-9] +``` + +**匹é…�结果** + +**abcd** +abc1 +abc2 + +# 第 4 章 使用元字符 + +## 4.1 匹é…�空白字符 + +|  元字符 | 说明  | +| ------------ | ------------ | +|  [\b] | 回退(删除)一个字符   | +|  \f |  æ�¢é¡µç¬¦Â | +|  \n |  æ�¢è¡Œç¬¦Â | +|  \r |  回车符 | +|  \t |  制表符 | +|  \v |  垂直制表符 | + +\r\n 是 Windows 中的文本行结æ�Ÿæ ‡ç­¾ï¼Œåœ¨Â Unix/Linux 则是 \n ;\r\n\r\n å�¯ä»¥åŒ¹é…� Windows 下的空白行,因为它将匹é…�两个连续的行尾标签,而这正是两æ�¡è®°å½•之间的空白行; + +. 是元字符,å‰�æ��是没有对它们进行转义; f 和 n 也是元字符,但是å‰�æ��是对他们进行了转义。 + +## 4.2 匹é…�特定的字符类别 + +**1. 数字元字符** + +|  元字符 | 说明  | +| ------------ | ------------ | +| \d  | 数字字符,等价于 [0-9]  | +| \D  | é�žæ•°å­—字符,等价于 [^0-9]   | + +**2. 字æ¯�数字元字符** + +|  元字符 | 说明  | +| ------------ | ------------ | +| \w  |  大å°�写字æ¯�,下划线和数字,等价于 [a-zA-Z0-9\_] | +|  \W |  对 \w å�–é�žÂ | + +**3. 空白字符元字符** + +| 元字符  | 说明  | +| ------------ | ------------ | +|  \s | 任何一个空白字符,等价于 [\f\n\r\t\v]  | +| \S  |  对 \s å�–é�žÂ Â | + + +\x 匹é…�å��六进制字符,\0 匹é…�八进制,例如 \x0A 对应 ASCII 字符 10 ,等价于 \n,也就是它会匹é…� \n 。 + +## 4.3 使用 POSIX 字符类 + +| 字符类 | 说明 | +| --- | --- | +| [:alnum:] | 字æ¯�数字字符 | +| [:alpha:] | 字æ¯�字符 | +| [:cntrl:] | 控制字符 | +| [:digit:] | 数字字符 | +| [:graph:] | é�žç©ºç™½å­—符 ( é�žç©ºæ ¼ã€�控制字符等 ) | +| [:lower:] | å°�写字æ¯� | +| [:print:] | 与 [:graph:] 相似,但是包å�«ç©ºæ ¼å­—符 | +| [:punct:] | 标点字符 | +| [:space:] | 所有的空白字符 ( æ�¢è¡Œç¬¦ã€�空格ã€�制表符 ) | +| [:upper:] | 大写字æ¯� | +| [:xdigit:] | å…�许å��六进制的数字 (0-9a-fA-F) | + +å¹¶ä¸�是所有正则表达å¼�实现都支æŒ� POSIX 字符类,也ä¸�一定使用它。 + +使用时需è¦�用两对方括å�·ï¼Œä¾‹å¦‚ [[:alpha:]]。 + +# 第 5 章 é‡�å¤�匹é…� + +**\+** 匹é…� 1 个或者多个字符, **\*** 匹é…� 0 个或者多个,**?** 匹é…� 0 个或者 1 个。 + +**应用** + +匹é…�邮箱地å�€ã€‚ + +**正则表达å¼�** + +``` +[\w.]+@\w+.\w+ +``` + +[\w.] 匹é…�的是字æ¯�数字或者 . ,在其å�Žé�¢åŠ ä¸ŠÂ + ,表示匹é…�多次。在字符集å�ˆÂ [ ] 里,. ä¸�是元字符; + +**匹é…�结果** + +**abc.def@qq.com** + +为了å�¯è¯»æ€§ï¼Œå¸¸å¸¸æŠŠè½¬ä¹‰çš„字符放到字符集å�ˆÂ [ ] 中,但是å�«ä¹‰ç¡®å®žç›¸å�Œçš„。 + +``` +\w+@\w+.\w+ +[\w]+@[\w]+.[\w]+ +``` + +**{n}** 匹é…� n 个字符,**{m, n}** 匹é…� m~n 个字符,**{m,}** 至少匹é…� m 个字符; + +\* 和 + 都是贪婪型元字符,会匹é…�最多的内容,在元字符å�Žé�¢åŠ Â ? å�¯ä»¥è½¬æ�¢ä¸ºæ‡’惰型元字符,例如 \*?ã€�+? 和 {m, n}? 。 + +**正则表达å¼�** + +``` +a.+c +``` + +由于 + 是贪婪型的,因此 .+ 会匹é…�æ›´å�¯èƒ½å¤šçš„内容,所以会把整个 abcabcabc 文本都匹é…�,而ä¸�是å�ªåŒ¹é…�å‰�é�¢çš„ abc 文本。用懒惰型å�¯ä»¥å®žçŽ°åŒ¹é…�å‰�é�¢çš„。 + +**匹é…�结果** + +**abcabcabc** + +# 第 6 章 ä½�置匹é…� + +## 6.1 å�•è¯�边界 + +**\b** å�¯ä»¥åŒ¹é…�一个å�•è¯�的边界,边界是指ä½�于 \w 和 \W 之间的ä½�置;**\B** 匹é…�一个ä¸�是å�•è¯�边界的ä½�置。 + +\b å�ªåŒ¹é…�ä½�置,ä¸�匹é…�字符,因此 \babc\b 匹é…�出æ�¥çš„结果为 3 个字符。 + +## 6.2 字符串边界 + +**^** 匹é…�整个字符串的开头,**$** 匹é…�结尾。 + +^ 元字符在字符集å�ˆä¸­ç”¨ä½œæ±‚é�žï¼Œåœ¨å­—符集å�ˆå¤–用作匹é…�字符串的开头。 + +使用 (?m) æ�¥æ‰“开分行匹é…�模å¼�,在该模å¼�下,æ�¢è¡Œè¢«å½“å�šå­—符串的边界。 + +**应用** + +匹é…�代ç �中以 // 开始的注释行 + +**正则表达å¼�** + +``` +(?m)^\s*//.*$ +``` + +如果没用 (?m),则å�ªä¼šåŒ¹é…� // 注释 1 以å�Šä¹‹å�Žçš„æ‰€æœ‰å†…容,因为 * 是贪婪型的。用了分行匹é…�模å¼�之å�Žï¼Œæ�¢è¡Œç¬¦è¢«å½“æˆ�是字符串分隔符,因此能正确匹é…�出两个注释内容。 + +**匹é…�结果** + +public void fun() { +    Â Â Â Â **// 注释 1** +    Â Â Â Â int a = 1; +    Â Â Â Â int b = 2; +    Â Â Â Â **// 注释 2** +    Â Â Â Â int c = a + b; +} + +# 第 7 章 使用å­�表达å¼� + +使用 **( )** 定义一个å­�表达å¼�。å­�表达å¼�的内容å�¯ä»¥å½“æˆ�一个独立元素,å�³å�¯ä»¥å°†å®ƒçœ‹æˆ�一个字符,并且使用 * 等元字符。 + +å­�表达å¼�å�¯ä»¥åµŒå¥—,但是嵌套层次过深会å�˜å¾—很难ç�†è§£ã€‚ + +**正则表达å¼�** + +``` +(ab) {2,} +``` + +**匹é…�结果** + +**ababab** + +**|** 是或元字符,它把左边和å�³è¾¹æ‰€æœ‰çš„部分都看æˆ�å�•独的两个部分,两个部分å�ªè¦�有一个匹é…�就行。 + +``` +(19|20)\d{2} +``` + +**匹é…�结果** + +**1900 +2010** +1020 + +**应用** + +匹é…� IP 地å�€ã€‚IP 地å�€ä¸­æ¯�部分都是 0-255 的数字,用正则表达å¼�匹é…�时以下情况是å�ˆæ³•的: + +① 一ä½�或者两ä½�的数字 +② 1 开头的三ä½�æ•° +③ 2 开头,第 2 ä½�是 0-4 的三ä½�æ•° +④ 25 开头,第 3 ä½�是 0-5 的三ä½�æ•° + +**正则表达å¼�** + +``` +(((\d{1, 2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.) {3}(((\d{1, 2})|(1\d{2})|(2[0-4]\d)|(25[0-5]))) +``` + +**匹é…�结果** + +**192.168.0.1** +555.555.555.555 + +# 第 8 章 回溯引用 + +回溯引用使用 **\n** æ�¥å¼•用æŸ�个å­�表达å¼�,其中 n 代表的是å­�表达å¼�çš„åº�å�·ï¼Œä»ŽÂ 1 开始。它和å­�表达å¼�匹é…�的内容一致,比如å­�表达å¼�匹é…�到 abc ,那么回溯引用部分也需è¦�匹é…� abc 。 + +**应用** + +匹é…� HTML 中å�ˆæ³•的标题元素。 + +**正则表达å¼�** + +\1 将回溯引用 å­�表达å¼� (h[1-6]) 匹é…�的内容,也就是说必须和å­�表达å¼�匹é…�的内容一致。 + +``` +<(h[1-6])>\w*? +``` + +**匹é…�结果** + +**<h1>x</h1> +<h2>x</h2>** +<h3>x</h1> + +## 替æ�¢ + +需è¦�用到两个正则表达å¼�。 + +**应用** + +修改电è¯�å�·ç �æ ¼å¼�。 + +**文本** + +313-555-1234 + +**查找正则表达å¼�** + +``` +(\d{3})(-)(\d{3})(-)(\d{4}) +``` + +**替æ�¢æ­£åˆ™è¡¨è¾¾å¼�** + +在第一个å­�表达å¼�查找的结果加上 () ,然å�ŽåŠ ä¸€ä¸ªç©ºæ ¼ï¼Œåœ¨ç¬¬ä¸‰ä¸ªå’Œç¬¬äº”ä¸ªå­—è¡¨è¾¾å¼�查找的结果中间加上 - 进行分隔。 + +``` +($1) $3-$5 +``` + +**结果** + +(313) 555-1234 + +## 大å°�写转æ�¢ + +|  元字符 | 说明  | +| ---| ---| +|  \l | 把下个字符转æ�¢ä¸ºå°�写  | +|   \u| 把下个字符转æ�¢ä¸ºå¤§å†™Â Â | +|  \L | 把\L 和\E 之间的字符全部转æ�¢ä¸ºå°�写  | +|  \U | 把\U 和\E 之间的字符全部转æ�¢ä¸ºå¤§å†™Â Â | +|  \E | 结æ�Ÿ\L 或者\U  | + +**应用** + +把文本的第二个和第三个字符转æ�¢ä¸ºå¤§å†™ã€‚ + +**文本** + +abcd + +**查找** + +``` +(\w)(\w{2})(\w) +``` + +**替æ�¢** + +``` +$1\U$2\E$3 +``` + +**结果** + +aBCd + +# 第 9 章 å‰�å�ŽæŸ¥æ‰¾ + +å‰�å�ŽæŸ¥æ‰¾è§„定了匹é…�的内容首尾应该匹é…�的内容,但是å�ˆä¸�包å�«é¦–尾匹é…�的内容。å�‘å‰�查找用 **?=** æ�¥å®šä¹‰ï¼Œå®ƒè§„定了尾部匹é…�的内容,这个匹é…�的内容在 ?= 之å�Žå®šä¹‰ã€‚所谓å�‘å‰�查找,就是规定了一个匹é…�的内容,然å�Žä»¥è¿™ä¸ªå†…容为尾部å�‘å‰�é�¢æŸ¥æ‰¾éœ€è¦�匹é…�的内容。å�‘å�ŽåŒ¹é…�用 ?<= 定义。 + +**应用** + +查找出邮件地å�€Â @ 字符å‰�é�¢çš„部分。 + +**正则表达å¼�** + +``` +\w+(?=@) +``` + +**结果** + +**abc**@qq.com + +对å�‘å‰�å’Œå�‘å�ŽæŸ¥æ‰¾å�–é�žï¼Œå�ªè¦�把 = 替æ�¢æˆ� ! å�³å�¯ï¼Œæ¯”如 (?=) 替æ�¢æˆ� (?!) 。å�–é�žæ“�作使得匹é…�那些首尾ä¸�符å�ˆè¦�求的内容。 + +# 第 10 章 嵌入æ�¡ä»¶ + +## 10.1 回溯引用æ�¡ä»¶ + +æ�¡ä»¶åˆ¤æ–­ä¸ºæŸ�个å­�表达å¼�是å�¦åŒ¹é…�,如果匹é…�则需è¦�继续匹é…�æ�¡ä»¶è¡¨è¾¾å¼�å�Žé�¢çš„内容。 + +**正则表达å¼�** + +å­�表达å¼� (\\() 匹é…�一个左括å�·ï¼Œå…¶å�Žçš„ ? 表示匹é…� 0 个或者 1 个。 ?(1) 为æ�¡ä»¶ï¼Œå½“å­�表达å¼� 1 匹é…�æ—¶æ�¡ä»¶æˆ�立,需è¦�执行 \) 匹é…�。 + +``` +(\()?abc(?(1)\)) +``` + +**结果** + +**(abc)** +**abc** +(abc + +## 10.2 å‰�å�ŽæŸ¥æ‰¾æ�¡ä»¶ + +æ�¡ä»¶ä¸ºå®šä¹‰çš„首尾是å�¦åŒ¹é…�,如果匹é…�,则继续执行å�Žé�¢çš„匹é…�。注æ„�,首尾ä¸�包å�«åœ¨åŒ¹é…�的内容中。 + +**正则表达å¼�** + + ?(?=-) 为å‰�å�‘查找æ�¡ä»¶ï¼Œå�ªæœ‰åœ¨ä»¥Â - 为å‰�å�‘查找的结尾能匹é…� \d{5} ,æ‰�继续匹é…� -\d{4} 。 + +``` +\d{5}(?(?=-)-\d{4}) +``` + +**结果** + +**11111** +22222- +**33333-4444** diff --git a/notes/笔记/程åº�员的è�Œä¸šç´ å…».md.txt b/notes/笔记/程åº�员的è�Œä¸šç´ å…».md.txt new file mode 100644 index 00000000..173aa834 --- /dev/null +++ b/notes/笔记/程åº�员的è�Œä¸šç´ å…».md.txt @@ -0,0 +1,120 @@ +[TOC] + +# 译者åº� + +作者 Bob 大å�”,著有《æ•�æ�·è½¯ä»¶å¼€å�‘:原则ã€�模å¼�与实践》《代ç �æ•´æ´�之é�“》《程åº�员的è�Œä¸šç´ å…»ã€‹ + +对于解决问题,é‡�è¦�çš„ä¸�是问题本身,而是解决问题的方å¼�ã€�步骤以å�Šå��æ€�的深度,这就是è�Œä¸šç´ å…»ã€‚ + +# å‰�言 + +由于管ç�†è€…é�¢ä¸´å¾ˆå¤§çš„财务和政治压力,他们无视技术人员å�‘出的å�±é™©è­¦å‘Šï¼ŒæŠ±ç�€ä¾¥å¹¸å¿ƒç�†å�‘射了“挑战者â€�航天飞机,最终导致航天飞机在高空爆炸。虽说技术人员已ç»�å�šå¾ˆå¤šäº‹æƒ…去阻止这次å�‘射,但是并ä¸�是说å�šäº†æ‰€æœ‰ä»–们能å�šçš„,例如他们就没有打电è¯�去新闻å�°æ�­éœ²æ­¤æ¬¡å�‘å°„çš„å�±é™©æ€§ã€‚ + +![](index_files/bccb799f-56e2-4356-95f0-a9ea05b0de2a.jpg) + + +# 专业主义 + +专业主义ä¸�ä»…æ„�味ç�€è�£èª‰å’Œéª„傲,也æ„�味ç�€è´£ä»»ã€‚ + +作者在自己开å�‘的一个电è¯�线路故障检测系统时,因为赶ç�€åœ¨åˆ°æœŸæ—¥äº¤ä»˜æ–°åŠŸèƒ½ï¼Œæ²¡æœ‰å¯¹æ•´ä¸ªç³»ç»Ÿè¿›è¡Œæµ‹è¯•ï¼Œå¯¼è‡´äº†ä¸€ä¸ªÂ bug 的出现。作者认为这是一ç§�ä¸�负责任的表现,也就是ä¸�专业的表现。 + +代ç �中难å…�有 bug,但是ä¸�æ„�味ç�€ä½ ä¸�用为 bug 负责。 + +有人把 QA 当æˆ�查 bug 的机器,等ç�€Â QA å�‘现 bug,而自己å�´ä¸�主动去å�‘现 bug,这是ä¸�对的。 + +为了ä¿�è¯�代ç �的正确性,需è¦�写一些éš�æ—¶å�¯ä»¥è¿�行的å�•元测试,并且ä¸�断地去è¿�行它们。 + +软件项目的根本原则 - 易于修改。为了让自己的软件易于修改,需è¦�ç»�常去修改它ï¼� + +å�•元测试å�¯ä»¥è®©ç¨‹åº�员更有自信去修改代ç �,因为它会让人确信修改地是å�¦æ­£ç¡®ã€‚ + +专业素养包括以下内容: + +1. å�šæŒ�学习 +2. æ¯�天练习一些简å�•的编程题目 +3. 与他们å�ˆä½œï¼Œä»Žå½¼æ­¤èº«ä¸Šå­¦åˆ°æ›´å¤šä¸œè¥¿ +4. 交æµ�。通过交æµ�表达自己的æ€�想,å�‘现自己的ä¸�足以å�Šä¸Žåˆ«äººæ€�想上的差异。 +5. 了解业务领域,找几本相关领域的书看。 +6. 与雇主 / 客户ä¿�æŒ�一致 +7. 谦逊,因为他们知é�“自己也å�¯èƒ½çŠ¯é”™ã€‚ + +# 说ä¸� + +对一些ä¸�å�ˆç�†çš„è¦�求,ä¸�能å�ªæ˜¯è¯´â€œè¯•试看â€�,这会被当æˆ�是接å�—了这个è¦�求。如果自己深知这ç§�ä¸�å�ˆç�†çš„è¦�求会导致严é‡�çš„å�Žæžœï¼Œå°±ä¸�能任由它å�‘展下去,对这一è¦�求说“ä¸�â€�。 + +说“ä¸�â€�æ—¶è¦�用最详细的细节æ�¥è¯´æ˜Žï¼Œè€Œä¸�是烦èº�地å��驳。 + +当è¦�求明显ä¸�å�ˆç�†æ—¶ï¼Œå�¯ä»¥å��商一些å�Œæ–¹éƒ½èƒ½æŽ¥å�—的方案。 + +"有å�¯èƒ½å†™å‡ºå¥½ä»£ç �å�—" 这篇å�šæ–‡ï¼Œè®²è¿°äº†ä¸€æ¬¡å¼€å�‘一家零售商为了在"黑色星期五"能够让顾客看到商å“�ä¿¡æ�¯å•†åº—ä¿¡æ�¯ä»¥å�Šå�‘布优惠ç �等功能的 ipone 应用,最开始零售商的ç»�ç�†æ‰¿è¯ºè¯´å�ªè¦�写个硬编ç �的应用就行了,但是客户所è¦�的任何一项功能,总比它最开始时所说的è¦�å¤�æ�‚许多。é�¢å¯¹æ—¶é—´çš„紧急,客户方的ä¸�é…�å�ˆï¼Œä»¥å�Šéœ€æ±‚çš„å�˜æ›´ï¼Œè®©å�šæ–‡ä½œè€…å†™äº†ä¸€å †å¾ˆçƒ‚çš„ä»£ç �,而他自己确实对那些设计模å¼�等高级开å�‘技术是é�žå¸¸çƒ­è¡·çš„。所以他认为在实际的开å�‘中因为客户的需求等因素,很难写作自己想写的代ç �。Bob 认为,上é�¢é‚£ç¯‡å�šæ–‡çš„ä½œè€…æ‰�是此次开å�‘过程碰到的那些问题的负责人,因为他没有对那些ä¸�å�ˆç�†çš„è¦�求说ä¸�。 + +# 说是 + +å�šå‡ºæ‰¿è¯ºçš„æ˜¯ä¸‰ä¸ªæ­¥éª¤ï¼šå�£å¤´ä¸Šç­”应,放在心里,付诸行动。 + +缺ä¹�承诺的è¯�语: + +1. 需è¦�:我需è¦�把这事å�šå®Œï¼› +2. 希望:希望今天我能完æˆ�任务; +3. 让我们:让我们把这件事å�šå®Œã€‚ + +缺ä¹�承诺的人ä¸�会把é‡�点放在自己身上,也ä¸�会明确说明一件事情的截止日期。真正的承诺是这样的“我会在...之å‰�...â€� + +对自己无法完全掌æ�¡çš„事,ä¸�è¦�轻易承诺。 + +å�‘现自己无法å�šåˆ°æ‰¿è¯ºï¼Œç«‹é©¬åŽ»è°ƒæ•´åˆ«äººå¯¹ä½ çš„é¢„æœŸã€‚ + +“试试看â€�说明自己对承诺的内容有点顾忌,因此ä¸�è¦�用试试看æ�¥ä½œä¸ºä¸€ç§�承诺。如果ä¸�能确信自己能达到承诺的内容而éš�便承诺,那么最å�Žå¾€å¾€ä¼šäº§ç”Ÿä¸¥é‡�çš„å�Žæžœã€‚ + +# 编程 + +è¦�精通一项技术,è¦�对该技术具备“信心â€�和“感知能力â€�。 + +状æ€�ä¸�好的时候最好别写代ç �。状æ€�ä¸�好分为:疲劳,比如熬夜;焦虑,因为外界的事情让自己ä¸�能安心下æ�¥ï¼Œè¿™ä¸ªæ—¶å€™åº”该下调整好å†�进行编程。 + +进入æµ�状æ€�的感觉很好,觉得å�¯ä»¥å�šå¾ˆå¤šäº‹ï¼Œä½†æ˜¯æµ�状æ€�其实是一ç§�浅层冥想,æ€�维能力会下é™�,因此è¦�é�¿å…�进入æµ�状æ€�。 + +![](index_files/f0321ed1-fa93-460e-951b-4239fef819f3.jpg) + +æµ�状æ€�的特点是隔ç»�沟通,而结对编程能够打破这ç§�éš”ç»�,因此结对编程能够防止进入æµ�状æ€�。 + +当自己没法继续编程时,结对编程是个好选择,结对编程时,大脑和身体会有化学å�˜åŒ–,也就是说æ€�ç»´æ–¹å¼�会改å�˜ï¼Œæœ‰åŠ©äºŽçª�破当å‰�çš„æ€�维阻塞状æ€�。 + +å�¬éŸ³ä¹�时音ä¹�会å� ç”¨ä¸€éƒ¨åˆ†è„‘力资æº�,因此会导致效率下é™�,但是这ä¸�是ç»�对。 + +多输入一些创造性的内容,比如科幻å°�说等,自己的创造力也会得到æ��å�‡ã€‚ + +调试时间也很å®�贵,测试驱动开å�‘能够é™�低调试的时间。 + +ç¼–ç �和跑马拉æ�¾ä¸€æ ·ï¼Œæ— æ³•全程以最快的速度冲刺,å�ªèƒ½é€šè¿‡ä¿�æŒ�体力和维æŒ�节å¥�æ�¥å�–得胜利。因此è¦�ä¿�æŒ�好自己的节å¥�,在疲劳的时候适当休æ�¯ã€‚ + +定期å�šè¿›åº¦è¡¡é‡�,用ä¹�观预估ã€�标准预估和悲观预估这三个时间点。 + +如果自己预估的进度赶ä¸�上截止时间,ä¸�è¦�答应在截止时间去完æˆ�,因为你知é�“æ ¹æ�®è‡ªå·±çš„预估这是ä¸�å�¯èƒ½çš„。 + +任务完æˆ�的标准通常用一个自动化的验收测试æ�¥å®šä¹‰ã€‚ + +帮助他人也会给自己带æ�¥å¥½å¤„,在帮助别人的时候ä¸�è¦�让自己看起æ�¥å¾ˆä»“促,就åƒ�是在éš�便应付。一般帮助别人ä¸�需è¦�特别多的时间。也è¦�学会请求别人的帮助,因为自己ä¸�å�¯èƒ½æ˜¯ä¸‡èƒ½çš„,通过别人的帮助能更好的解决问题。 + +# 测试驱动开å�‘ + +TDD 的è¿�行周期很短,å�¯èƒ½ä¸€ä¸¤åˆ†é’Ÿå°±å�¯ä»¥è¿�行一次程åº�,短周期å�¯ä»¥å¿«é€Ÿå¾—到å��馈,å��馈在开å�‘中特别é‡�è¦�,一方é�¢æ˜¯æ��高程åº�员编ç �的激情,å�¦ä¸€æ–¹é�¢æ˜¯èƒ½å¤Ÿå�Šæ—©å�‘现 bug,而 bug 越早å�‘现修改地代价也越低。 + +TDD 三法则: + +1. 先写测试; +2. 在一个å�•元测试失败的时候,ä¸�è¦�å†�写测试代ç �ï¼› +3. 产å“�代ç �能æ�°å¥½é€šè¿‡å½“å‰�失败的å�•元测试å�³å�¯ï¼Œä¸�è¦�多写。 + +TDD 优点 + +1. 确定性:确定当å‰�系统是å�¦æ­£ç¡®ï¼› +2. 信心:程åº�员更有信æ�¯åŽ»ä¿®æ”¹æ··ä¹±çš„ä»£ç �,因为通过å�•元测试å�¯ä»¥çŸ¥é�“是å�¦ä¿®æ”¹åœ°æ­£ç¡®ï¼› +3. 文档:å�•元测试是底层设计细节的文档,通过阅读å�•元测试能够知é�“程åº�çš„è¿�行方å¼�ï¼› + +# 练习 + +å�¡å¡”在武术里é�¢æ˜¯ä¸€å¥—设计好的招å¼�,该招å¼�模拟真实æ��斗场景,习武者ä¸�断训练æ�¥è®©èº«ä½“熟悉该招å¼�,从而å�šåˆ°çº¯ç†Ÿã€‚编程å�¡å¡”是一套编程过程敲击鼠标和键盘的动作,练习者ä¸�是为了解决真正的问题,因为已ç»�知é�“了解决方案,而是练习解决这个问题所需è¦�的动作和决策。 + +瓦è�¨å�³ä½¿ä¸¤äººå¯¹ç»ƒçš„å�¡å¡”。在编程领域,å�¯ä»¥æ˜¯ä¸€ä¸ªäººå†™å�•元测试,å�¦ä¸€ä¸ªäººå†™ç¨‹åº�通过å�•元测试。比如,一个人实现排åº�算法,写测试的人å�¯ä»¥å¾ˆå®¹æ˜“地é™�制速度和内存,给å�Œä¼´æ–½åŽ‹ã€‚ diff --git a/notes/笔记/算法.md.txt b/notes/笔记/算法.md.txt new file mode 100644 index 00000000..5692f709 --- /dev/null +++ b/notes/笔记/算法.md.txt @@ -0,0 +1,1539 @@ +[TOC] + +# 基础 + +## 栈 + +### 1. 数组实现 + + +```java +public class ResizeArrayStack implements Iterable { +    private Item[] a = (Item[]) new Object[1]; +    private int N = 0; + +    public void push(Item item) { +        if (N >= a.length) { +            resize(2 * a.length); +        } +        a[N++] = item; +    } + +    public Item pop() { +        Item item = a[--N]; +        if (N <= a.length / 4) { +            resize(a.length / 2); +        } +        return item; +    } + +    // 调整数组大å°�,使得栈具有伸缩性 +    private void resize(int size) { +        Item[] tmp = (Item[]) new Object[size]; +        for (int i = 0; i < N; i++) { +            tmp[i] = a[i]; +        } +        a = tmp; +    } + +    public boolean isEmpty() { +        return N == 0; +    } + +    public int size() { +        return N; +    } + +    @Override +    public Iterator iterator() { +        // 需è¦�返回逆åº�é��历的迭代器 +        return new ReverseArrayIterator(); +    } + +    private class ReverseArrayIterator implements Iterator { +        private int i = N; + +        @Override +        public boolean hasNext() { +            return i > 0; +        } + +        @Override +        public Item next() { +            return a[--i]; +        } +    } +} +``` + +上é�¢å®žçŽ°ä½¿ç”¨äº†æ³›åž‹ï¼ŒJava ä¸�能直接创建泛型数组,å�ªèƒ½ä½¿ç”¨è½¬åž‹æ�¥åˆ›å»ºã€‚ + +```java +Item[] arr = (Item[]) new Object[N]; +``` + +### 2. 链表实现 + +需è¦�使用链表的头æ�’法æ�¥å®žçŽ°ï¼Œå› ä¸ºå¤´æ�’法中最å�ŽåŽ‹å…¥æ ˆçš„å…ƒç´ åœ¨é“¾è¡¨çš„å¼€å¤´ï¼Œå®ƒçš„Â next 指针指å�‘å‰�一个压入栈的元素,在弹出元素使就å�¯ä»¥è®©å‰�一个压入栈的元素称为栈顶元素。 + +```java +public class Stack { +     +    private Node top = null; +    private int N = 0; + +    private class Node { +        Item item; +        Node next; +    } + +    public boolean isEmpty() { +        return N == 0; +    } + +    public int size() { +        return N; +    } + +    public void push(Item item) { +        Node newTop = new Node(); +        newTop.item = item; +        newTop.next = top; +        top = newTop; +        N++; +    } + +    public Item pop() { +        Item item = top.item; +        top = top.next; +        N--; +        return item; +    } +} +``` + +## 队列 + +下é�¢æ˜¯é˜Ÿåˆ—的链表实现,需è¦�维护 first 和 last 节点指针,分别指å�‘队首和队尾。 + +这里需è¦�考虑让哪个指针指针链表头部节点,哪个指针指å�‘链表尾部节点。因为出队列æ“�作需è¦�让队首元素的下一个元素æˆ�为队首,就需è¦�容易获å�–下一个元素,而链表的头部节点的 next 指针指å�‘下一个元素,因此让队首指针 first 指针链表的开头。 + +```java +public class Queue { +    private Node first; +    private Node last; +    int N = 0; +    private class Node{ +        Item item; +        Node next; +    } + +    public boolean isEmpty(){ +        return N == 0; +    } + +    public int size(){ +        return N; +    } + +    // 入队列 +    public void enqueue(Item item){ +        Node newNode = new Node(); +        newNode.item = item; +        newNode.next = null; +        if(isEmpty()){ +            last = newNode; +            first = newNode; +        } else{ +            last.next = newNode; +            last = newNode; +        } +        N++; +    } + +    // 出队列 +    public Item dequeue(){ +        Node node = first; +        first = first.next; +        N--; +        return node.item; +    } +} +``` + +## 算法分æž� + +### 1. 函数转æ�¢ + +指数函数å�¯ä»¥è½¬æ�¢ä¸ºçº¿æ€§å‡½æ•°ï¼Œä»Žè€Œåœ¨å‡½æ•°å›¾åƒ�上显示的更直观。 + +T(N)=aN3 转æ�¢ä¸ºÂ lg(T(N))=3lgN+lga + +![](index_files/5510045a-8f32-487f-a756-463e51a6dab0.png) + +### 2. 数学模型 + +**è¿‘ä¼¼** + +使用 ~f(N) æ�¥è¡¨ç¤ºæ‰€æœ‰éš�ç�€Â N 的增大除以 f(N) 的结果趋近于 1 的函数 , 例如 N3/6-N2/2+N/3 ~ N3/6。 + +![](index_files/ca3a793e-06e5-4ff3-b28e-a9c20540d164.png) + +**增长数é‡�级** + +增长数é‡�级将算法与它的实现隔离开æ�¥ï¼Œä¸€ä¸ªç®—法的增长数é‡�级为 N3 与它是å�¦ç”¨Â Java 实现,是å�¦è¿�行与特定计算机上无关。 + +![](index_files/1ea4dc9a-c4dd-46b5-bb11-49f98d57ded1.png) + +**内循环** + +执行最频ç¹�的指令决定了程åº�执行的总时间,把这些指令称为程åº�的内循环。 + +**æˆ�本模型** + +使用æˆ�本模型æ�¥è¯„估算法,例如数组的访问次数就是一ç§�æˆ�本模型。 + +### 3. ThreeSum + +ThreeSum 程åº�用于统计一个数组中三元组的和为 0 的数é‡�。 + +```java +public class ThreeSum { +    public static int count(int[] a) { +        int N = a.length; +        int cnt = 0; +        for (int i = 0; i < N; i++) { +            for (int j = i + 1; j < N; j++) { +                for (int k = j + 1; k < N; k++) { +                    if (a[i] + a[j] + a[k] == 0) { +                        cnt++; +                    } +                } +            } +        } +        return cnt; +    } +} +``` + +该程åº�的内循环为 if (a[i] + a[j] + a[k] == 0) 语å�¥ï¼Œæ€»å…±æ‰§è¡Œçš„æ¬¡æ•°ä¸ºÂ N3/6-N2/2+N/3,因此它的近似执行次数为 ~N3/6,增长数é‡�级为 N3。 + +**改进** + +通过将数组先排åº�,对两个元素求和,并用二分查找方法查找是å�¦å­˜åœ¨è¯¥å’Œçš„相å��数,如果存在,就说明存在三元组的和为 0。 + +该方法å�¯ä»¥å°†Â ThreeSum 算法增长数é‡�级é™�低为 N2logN。 + +```java +public class ThreeSumFast { +    public static int count(int[] a) { +        Arrays.sort(a); +        int N = a.length; +        int cnt = 0; +        for (int i = 0; i < N; i++) { +            for (int j = i + 1; j < N; j++) { +                for (int k = j + 1; k < N; k++) { +                    // rank() 方法返回元素在数组中的下标,如果元素ä¸�存在,这里会返回 -1。应该注æ„�这里的下标必须大于 j,这样就ä¸�会é‡�å¤�统计了。 +                    if (BinarySearch.rank(-a[i] - a[j], a) > j) { +                        cnt++; +                    } +                } +            } +        } +        return cnt; +    } +} +``` + +### 4. å€�率实验 + +如果 T(N) ~ aNblgN,那么 T(2N)/T(N) ~ 2b,例如对于暴力方法的 ThreeSum 算法,近似时间为 ~N3/6,对它进行å€�率实验得到如下结果: + +![](index_files/6f5ed46f-86d7-4852-a34f-c1cf1b6343a0.png) + +å�¯è§� T(2N)/T(N)~23,也就是 b 为 3。 + +### 5. 注æ„�事项 + +**大常数** + +在求近似时,如果低级项的常数系数很大,那么近似的结果就是错误的。 + +**缓存** + +计算机系统会使用缓存技术æ�¥ç»„织内存,访问数组相邻的元素会比访问ä¸�相邻的元素快很多。 + +**对最å��情况下的性能的ä¿�è¯�** + +在核å��应堆ã€�心è„�èµ·æ��器或者刹车控制器中的软件,最å��情况下的性能是å��分é‡�è¦�的。 + +**éš�机化算法** + +通过打乱输入,去除算法对输入的ä¾�赖。 + +**å�‡æ‘Šåˆ†æž�** + +将所有æ“�作的总æˆ�本所以æ“�作总数æ�¥å°†æˆ�本å�‡æ‘Šã€‚例如对一个空栈进行 N 次连续的 push() 调用需è¦�访问数组的元素为 N+4+8+16+...+2N=5N-4(N 是å�‘数组写入元素,其余的都是调整数组大å°�时进行å¤�制需è¦�的访问数组æ“�作),å�‡æ‘Šå�Žæ¯�次æ“�作访问数组的平å�‡æ¬¡æ•°ä¸ºå¸¸æ•°ã€‚ + +## union-find + +**概览** + +用于解决动æ€�连通性问题,能动æ€�连接两个点,并且判断两个点是å�¦è¿žæŽ¥ã€‚ + +![](index_files/5d387d02-6f96-44d6-b5d0-4538349f868e.png) + +**API** + +![](index_files/a9b91b7d-65d7-4aa3-8ef6-21876b05ad16.png) + +**基本数æ�®ç»“æž„** + +```java +public class UF { +    // 使用 id 数组æ�¥ä¿�存点的连通信æ�¯ +    private int[] id; + +    public UF(int N) { +        id = new int[N]; +        for (int i = 0; i < N; i++) { +            id[i] = i; +        } +    } + +    public boolean connected(int p, int q) { +        return find(p) == find(q); +    } +} +``` + +### 1. quick-find 算法 + +ä¿�è¯�在å�Œä¸€è¿žé€šåˆ†é‡�的所有触点的 id 值相等。 + +è¿™ç§�方法å�¯ä»¥å¿«é€Ÿå�–得一个触点的 id 值,并且判断两个触点是å�¦è¿žé€šï¼Œä½†æ˜¯Â union 的æ“�作代价å�´å¾ˆé«˜ï¼Œéœ€è¦�将其中一个连通分é‡�中的所有节点 id 值都修改为å�¦ä¸€ä¸ªèŠ‚ç‚¹çš„Â id 值。 + +```java +    public int find(int p) { +        return id[p]; +    } +    public void union(int p, int q) { +        int pID = find(p); +        int qID = find(q); + +        if (pID == qID) return; +        for (int i = 0; i < id.length; i++) { +            if (id[i] == pID) id[i] = qID; +        } +    } +``` + +### 2. quick-union 算法 + +在 union 时å�ªå°†è§¦ç‚¹çš„ id 值指å�‘å�¦ä¸€ä¸ªè§¦ç‚¹Â id 值,ä¸�直接用 id æ�¥å­˜å‚¨æ‰€å±žçš„连通分é‡�。这样就构æˆ�一个倒置的树形结构,根节点需è¦�指å�‘自己。在进行查找一个节点所属的连通分é‡�时,è¦�一直å�‘上查找直到根节点,并使用根节点的 id 值作为本连通分é‡�的 id值。 + +![](index_files/9192dc0a-a7cd-4030-8df6-e388600644cf.jpg) + +```java +    public int find(int p) { +        while (p != id[p]) p = id[p]; +        return p; +    } + +    public void union(int p, int q) { +        int pRoot = find(p); +        int qRoot = find(q); +        if (pRoot == qRoot) return; +        id[pRoot] = qRoot; +    } +``` + +è¿™ç§�方法å�¯ä»¥å¿«é€Ÿè¿›è¡ŒÂ union æ“�作,但是 find æ“�作和树高æˆ�正比,最å��的情况下树的高度为触点的数目。 + +![](index_files/d206d090-d911-4263-a1fe-d6f63f5d1776.png) + +### 3. 加æ�ƒÂ quick-union 算法 + +为了解决 quick-union 的树通常会很高的问题,加æ�ƒÂ quick-union 在 union æ“�作时会让较å°�的树连接较大的树上é�¢ã€‚ + +ç�†è®ºç ”ç©¶è¯�明,加æ�ƒÂ quick-union 算法构造的树深度最多ä¸�超过 lgN。 + +![](index_files/8d6af5ac-74eb-4e07-99aa-654b9f21f1d3.jpg) + +```java +public class WeightedQuickUnionUF { +    private int[] id; +    // ä¿�存节点的数é‡�ä¿¡æ�¯ +    private int[] sz; + +    public WeightedQuickUnionUF(int N) { +        id = new int[N]; +        sz = new int[N]; +        for (int i = 0; i < N; i++) { +            id[i] = i; +            sz[i] = 1; +        } +    } + +    public boolean connected(int p, int q) { +        return find(p) == find(q); +    } + +    public int find(int p) { +        while (p != id[p]) p = id[p]; +        return p; +    } + +    public void union(int p, int q) { +        int i = find(p); +        int j = find(q); +        if (i == j) return; +        if (sz[i] < sz[j]) { +            id[i] = j; +            sz[j] += sz[i]; +        } else { +            id[j] = i; +            sz[i] += sz[j]; +        } +    } +} +``` + +### 4. 路径压缩的加æ�ƒÂ quick-union 算法 + +在检查节点的å�Œæ—¶å°†å®ƒä»¬ç›´æŽ¥é“¾æŽ¥åˆ°æ ¹èŠ‚ç‚¹ï¼Œå�ªéœ€è¦�在 find 中添加一个循环å�³å�¯ã€‚ + +### 5. å�„ç§� union-find 算法的比较 + +![](index_files/e5baeb38-0ec9-4ad7-8374-1cdb0dba74a6.jpg) + +# 第二章 排åº� + +## åˆ�级排åº�算法 + +### 1. 约定 + +待排åº�的元素需è¦�实现 Java 的 Comparable 接å�£ï¼Œè¯¥æŽ¥å�£æœ‰Â compareTo() 方法。 + +研究排åº�算法的æˆ�本模型时,计算的是比较和交æ�¢çš„æ¬¡æ•°ã€‚ + +使用辅助函数 less() 和 exch() æ�¥è¿›è¡Œæ¯”较和交æ�¢çš„æ“�作,使得代ç �çš„å�¯è¯»æ€§å’Œå�¯ç§»æ¤�性更好。 + +```java +private static boolean less(Comparable v, Comparable w){ +    return v.compareTo(w) < 0; +} + +private void exch(Comparable[] a, int i, int j){ +    Comparable t = a[i]; +    a[i] = a[j]; +    a[j] = t; +} +``` + +### 2. 选择排åº� + +找到数组中的最å°�元素,然å�Žå°†å®ƒä¸Žæ•°ç»„的第一个元素交æ�¢ä½�置。然å�Žå†�从剩下的元素中找到最å°�的元素,将它与数组的第二个元素交æ�¢ä½�置。ä¸�断进行这样的æ“�作,直到将整个数组排åº�。 + +![](index_files/222768a7-914f-4d64-b874-d98f3b926fb6.jpg) + +```java +public class Selection { +    public static void sort(Comparable[] a) { +        int N = a.length; +        for (int i = 0; i < N; i++) { +            int min = i; +            for (int j = i + 1; j < N; j++) { +                if (less(a[j], a[min])) min = j; +            } +            exch(a, i, min); +        } +    } +} +``` + +选择排åº�需è¦� ~N2/2 次比较和 ~N 次交æ�¢ï¼Œå®ƒçš„è¿�行时间与输入无关,这个特点使得它对一个已ç»�排åº�的数组也需è¦�这么多的比较和交æ�¢æ“�作。 + +### 3. æ�’入排åº� + +将一个元素æ�’入到已排åº�的数组中,使得æ�’入之å�Žçš„æ•°ç»„也是有åº�的。æ�’入排åº�从左到å�³æ�’å…¥æ¯�个元素,æ¯�次æ�’入之å�Žå·¦éƒ¨çš„å­�数组是有åº�的。 + +![](index_files/065c3bbb-3ea0-4dbf-8f26-01d0e0ba7db7.png) + +```java +public class Insertion { +    public static void sort(Comparable[] a) { +        int N = a.length; +        for (int i = 1; i < N; i++) { +            for (int j = i; j > 0 && less(a[j], a[j - 1]); j--) { +                exch(a, j, j - 1); +            } +        } +    } +} +``` + +æ�’入排åº�çš„å¤�æ�‚度å�–决于数组的åˆ�始顺åº�,如果数组已ç»�部分有åº�了,那么æ�’入排åº�会很快。平å�‡æƒ…况下æ�’入排åº�需è¦� ~N2/4 比较以å�ŠÂ ~N2/4 次交æ�¢ï¼Œæœ€å��的情况下需è¦� ~N2/2 比较以å�ŠÂ ~N2/2 次交æ�¢ï¼Œæœ€å��的情况是数组是逆åº�的;而最好的情况下需è¦� N-1 次比较和 0 次交æ�¢ï¼Œæœ€å¥½çš„æƒ…况就是数组已ç»�有åº�了。 + +æ�’入排åº�对于部分有åº�数组和å°�规模数组特别高效。 + +### 4. 选择排åº�å’Œæ�’入排åº�的比较 + +对于éš�机排åº�的无é‡�å¤�主键的数组,æ�’入排åº�和选择排åº�çš„è¿�行时间是平方级别的,两者之比是一个较å°�的常数。 + +### 5. 希尔排åº� + +对于大规模的数组,æ�’入排åº�很慢,因为它å�ªèƒ½äº¤æ�¢ç›¸é‚»çš„元素,如果è¦�把元素从一端移到å�¦ä¸€ç«¯ï¼Œå°±éœ€è¦�很多次æ“�作。 + +希尔排åº�的出现就是为了改进æ�’入排åº�的这ç§�å±€é™�性,它通过交æ�¢ä¸�相邻的元素,使得元素更快的移到正确的ä½�置上。 + +希尔排åº�使用æ�’入排åº�对间隔 h 的åº�列进行排åº�,如果 h 很大,那么元素就能很快的移到很远的地方。通过ä¸�æ–­å‡�å°� h,最å�Žä»¤Â h=1,就å�¯ä»¥ä½¿å¾—整个数组是有åº�的。 + +![](index_files/8320bad6-3f91-4a15-8e3d-68e8f39649b5.png) + +```java +public class Shell { +    public static void sort(Comparable[] a) { +        int N = a.length; +        int h = 1; +        while (h < N / 3) { +            h = 3 * h + 1;// 1, 4, 13, 40, ... +        } +        while (h >= 1) { +            for (int i = h; i < N; i++) { +                for (int j = i; j >= h && less(a[j], a[j - h]); j -= h) { +                    exch(a, j, j - h); +                } +            } +            h = h / 3; +        } +    } +} +``` + +希尔排åº�çš„è¿�行时间达ä¸�到平方级别,使用递增åº�列 1, 4, 13, 40, ... 的希尔排åº�所需è¦�的比较次数ä¸�会超过 N 的若干å€�乘于递增åº�列的长度。å�Žé�¢ä»‹ç»�的高级排åº�算法å�ªä¼šæ¯”希尔排åº�快两å€�å·¦å�³ã€‚ + +## 归并排åº� + +归并排åº�çš„æ€�想是将数组分æˆ�两部分,分别进行排åº�,然å�Žå½’å¹¶èµ·æ�¥ã€‚ + +![](index_files/dcf265ad-fe35-424d-b4b7-d149cdf239f4.png) + +### 1. 归并方法 + +```java +public class MergeSort { +    private static Comparable[] aux; + +    private static void merge(Comparable[] a, int lo, int mid, int hi) { +        int i = lo, j = mid + 1; + +        for (int k = lo; k <= hi; k++) { +            aux[k] = a[k]; // 将数æ�®å¤�制到辅助数组 +        } + +        for (int k = lo; k <= hi; k++) { +            if (i > mid) a[k] = aux[j++]; +            else if (j > hi) a[k] = aux[i++]; +            else if (aux[i].compareTo(a[j]) < 0) a[k] = aux[i++]; // 先进行这一步,ä¿�è¯�稳定性 +            else a[k] = aux[j++]; +        } +    } +} +``` + +### 2. 自顶å�‘下归并排åº� + +```java +    public static void sort(Comparable[] a) { +        aux = new Comparable[a.length]; +        sort(a, 0, a.length - 1); +    } + +    private static void sort(Comparable[] a, int lo, int hi) { +        if (hi <= lo) return; +        int mid = lo + (hi - lo) / 2; +        sort(a, lo, mid); +        sort(a, mid + 1, hi); +        merge(a, lo, mid, hi); +    } +``` + +![](index_files/6468a541-3a9a-4008-82b6-03a0fe941d2a.png) + +![](index_files/c7665f73-c52f-4ce4-aed3-592bbd76265b.png) + +很容易看出该排åº�算法的时间å¤�æ�‚度为 O(NlgN)。 + +因为å°�数组的递归æ“�作会过于频ç¹�,因此使用æ�’入排åº�æ�¥å¤„ç�†å°�数组将会获得更高的性能。 + +### 3. 自底å�‘上归并排åº� + +先归并那些微型数组,然å�Žæˆ�对归并得到的å­�数组。 + +![](index_files/c7b9b4c8-83d1-4eb0-8408-ea6576a9ed90.png) + +```java +    public static void busort(Comparable[] a) { +        int N = a.length; +        aux = new Comparable[N]; +        for (int sz = 1; sz < N; sz += sz) { +            for (int lo = 0; lo < N - sz; lo += sz + sz) { +                merge(a, lo, lo + sz - 1, Math.min(lo + sz + sz - 1, N - 1)); +            } +        } +    } +``` + +## 快速排åº� + +### 1. 基本算法 + +归并排åº�将数组分为两个å­�数组分别排åº�,并将有åº�çš„å­�数组归并使得整个数组排åº�;快速排åº�通过一个切分元素将数组分为两个å­�数组,左å­�数组å°�于等于切分元素,å�³å­�数组大于等于切分元素,将这两个å­�数组排åº�也就将整个数组排åº�了。 + +![](index_files/61b4832d-71f3-413c-84b6-237e219b9fdc.png) + +```java +public class QuickSort { +    public static void sort(Comparable[] a) { +        shuffle(a); +        sort(a, 0, a.length - 1); +    } + +    private static void sort(Comparable[] a, int lo, int hi) { +        if (hi <= lo) return; +        int j = partition(a, lo, hi); +        sort(a, lo, j - 1); +        sort(a, j + 1, hi); +    } +} +``` + +### 2. 切分 + +å�– a[lo] 作为切分元素,然å�Žä»Žæ•°ç»„的左端å�‘å�³æ‰«æ��直到找到第一个大于等于它的元素,å†�从数组的å�³ç«¯å�‘左扫æ��找到第一个å°�于等于它的元素,交æ�¢è¿™ä¸¤ä¸ªå…ƒç´ ï¼Œå¹¶ä¸�断继续这个过程,就å�¯ä»¥ä¿�è¯�左指针的左侧元素都ä¸�大于切分元素,å�³æŒ‡é’ˆÂ j 的å�³ä¾§å…ƒç´ éƒ½ä¸�å°�于切分元素。当两个指针相é�‡æ—¶ï¼Œå°†åˆ‡åˆ†å…ƒç´ Â a[lo] 和左å­�数组最å�³ä¾§çš„元素 a[j] 交æ�¢ç„¶å�Žè¿”回 j å�³å�¯ã€‚ + +![](index_files/e198c201-f386-4491-8ad6-f7e433bf992d.png) + +```java +    private static int partition(Comparable[] a, int lo, int hi) { +        int i = lo, j = hi + 1; +        Comparable v = a[lo]; +        while (true) { +            while (less(a[++i], v)) if (i == hi) break; +            while (less(v, a[--j])) if (j == lo) break; +            if (i >= j) break; +            exch(a, i, j); +        } +        exch(a, lo, j); +        return j; +    } +``` + +### 3. 性能分æž� + +快速排åº�是原地排åº�,ä¸�需è¦�辅助数组,但是递归调用需è¦�辅助栈。 + +快速排åº�最好的情况下是æ¯�次都正好能将数组对å�Šåˆ†ï¼Œè¿™æ ·é€’归调用次数æ‰�是最少的。这ç§�情况下比较次数为 CN=2CN/2+N,也就是å¤�æ�‚度为 O(NlgN)。 + +最å��的情况下,第一次从最å°�的元素切分,第二次从第二å°�的元素切分,如此这般。因此最å��的情况下需è¦�比较 N2/2。为了防止数组最开始就是有åº�的,在进行快速排åº�时需è¦�éš�机打乱数组。 + +### 4. 算法改进 + +#### 4.1 切æ�¢åˆ°æ�’入排åº� + +因为快速排åº�在å°�数组中也会调用自己,对于å°�数组,æ�’入排åº�比快速排åº�的性能更好,因此在å°�数组中å�¯ä»¥åˆ‡æ�¢åˆ°æ�’入排åº�。 + +#### 4.2 三å�–æ · + +最好的情况下是æ¯�次都能å�–数组的中ä½�数作为切分元素,但是计算中ä½�数的代价很高。人们å�‘现å�– 3 个元素并将大å°�居中的元素作为切分元素的效果最好。 + +#### 4.3 三å�‘切分 + +对于有大é‡�é‡�å¤�元素的数组,å�¯ä»¥å°†æ•°ç»„切分为三部分,分别对应å°�于ã€�等于和大于切分元素。 + +三å�‘切分快速排åº�对于å�ªæœ‰è‹¥å¹²ä¸�å�Œä¸»é”®çš„éš�机数组å�¯ä»¥åœ¨çº¿æ€§æ—¶é—´å†…完æˆ�排åº�。 + +![](index_files/9d2226dc-c4a3-40ec-9b3e-a46bf86af499.png) + +```java +public class Quick3Way { +    public static void sort(Comparable[] a, int lo, int hi) { +        if (hi <= lo) return; +        int lt = lo, i = lo + 1, gt = hi; +        Comparable v = a[lo]; +        while (i <= gt) { +            int cmp = a[i].compareTo(v); +            if (cmp < 0) exch(a, lt++, i++); +            else if (cmp > 0) exch(a, i, gt--); +            else i++; +        } +        sort(a, lo, lt - 1); +        sort(a, gt + 1, hi); +    } +} +``` + +## 优先队列 + +优先队列主è¦�用于处ç�†æœ€å¤§å…ƒç´ ã€‚ + +### 1. 堆 + +定义:一颗二å�‰æ ‘çš„æ¯�个节点都大于等于它的两个å­�节点。 + +å †å�¯ä»¥ç”¨æ•°ç»„æ�¥è¡¨ç¤ºï¼Œå› ä¸ºå †æ˜¯ä¸€ç§�完全二å�‰æ ‘,而完全二å�‰æ ‘很容易就存储在数组中。ä½�置 k 的节点的父节点ä½�置为 k/2,而它的两个å­�节点的ä½�置分别为 2k 和 2k+1。这里我们ä¸�使用数组索引为 0 的ä½�置,是为了更清晰地ç�†è§£èŠ‚ç‚¹çš„å…³ç³»ã€‚ + +![](index_files/a9b6c1db-0f4a-4e91-8ac8-6b19bd106b51.png) + +```java +public class MaxPQ { +    private Key[] pq; +    private int N = 0; + +    public MaxPQ(int maxN) { +        pq = (Key[]) new Comparable[maxN + 1]; +    } + +    public boolean isEmpty() { +        return N == 0; +    } + +    public int size() { +        return N; +    } + +    private boolean less(int i, int j) { +        return pq[i].compareTo(pq[j]) < 0; +    } + +    private void exch(int i, int j) { +        Key t = pq[i]; +        pq[i] = pq[j]; +        pq[j] = t; +    } +} +``` + +### 2. 上浮和下沉 + +在堆中,当一个节点比父节点大,那么需è¦�交æ�¢è¿™ä¸ªä¸¤ä¸ªèŠ‚ç‚¹ã€‚äº¤æ�¢å�Žè¿˜å�¯èƒ½æ¯”它新的父节点大,因此需è¦�ä¸�断地进行比较和交æ�¢æ“�作。把这ç§�æ“�作称为上浮。 + +```java +private void swim(int k) { +    while (k > 1 && less(k / 2, k)) { +        exch(k / 2, k); +        k = k / 2; +    } +} +``` + +类似地,当一个节点比å­�节点æ�¥å¾—å°�,也需è¦�ä¸�æ–­çš„å�‘下比较和交æ�¢æ“�作,把这ç§�æ“�作称为下沉。一个节点有两个å­�节点,应当与两个å­�节点中最大那么节点进行交æ�¢ã€‚ + +```java +private void sink(int k) { +    while (2 * k <= N) { +        int j = 2 * k; +        if (j < N && less(j, j + 1)) j++; +        if (!less(k, j)) break; +        exch(k, j); +        k = j; +    } +} +``` + +### 3. æ�’入元素 + +将新元素放到数组末尾,然å�Žä¸Šæµ®åˆ°å�ˆé€‚çš„ä½�置。 + +```java +public void insert(Key v) { +    pq[++N] = v; +    swim(N); +} +``` + +### 4. 删除最大元素 + +从数组顶端删除最大的元素,并将数组的最å�Žä¸€ä¸ªå…ƒç´ æ”¾åˆ°é¡¶ç«¯ï¼Œå¹¶è®©è¿™ä¸ªå…ƒç´ ä¸‹æ²‰åˆ°å�ˆé€‚çš„ä½�置。 + +```java +public Key delMax() { +    Key max = pq[1]; +    exch(1, N--); +    pq[N + 1] = null; +    sink(1); +    return max; +} +``` + +### 5. 堆排åº� + +由于堆å�¯ä»¥å¾ˆå®¹æ˜“得到最大的元素并删除它,ä¸�断地进行这ç§�æ“�作å�¯ä»¥å¾—到一个递å‡�åº�列。如果把最大元素和当å‰�堆中数组的最å�Žä¸€ä¸ªå…ƒç´ äº¤æ�¢ä½�置,并且ä¸�删除它,那么就å�¯ä»¥å¾—到一个从尾到头的递å‡�åº�列,从正å�‘æ�¥çœ‹å°±æ˜¯ä¸€ä¸ªé€’增åº�列。因此很容易使用堆æ�¥è¿›è¡ŒæŽ’åº�,并且堆排åº�是原地排åº�,ä¸�å� ç”¨é¢�外空间。 + +堆排åº�è¦�分两个阶段,第一个阶段是把无åº�数组建立一个堆;第二个阶段是交æ�¢æœ€å¤§å…ƒç´ å’Œå½“å‰�堆的数组最å�Žä¸€ä¸ªå…ƒç´ ï¼Œå¹¶ä¸”进行下沉æ“�作维æŒ�堆的有åº�状æ€�。 + +æ— åº�数组建立堆最直接的方法是从左到å�³é��历数组,然å�Žè¿›è¡Œä¸Šæµ®æ“�作。一个更高效的方法是从å�³è‡³å·¦è¿›è¡Œä¸‹æ²‰æ“�作,如果一个节点的两个节点都已ç»�是堆有åº�,那么进行下沉æ“�作å�¯ä»¥ä½¿å¾—这个节点为根节点的堆有åº�。å�¶å­�节点ä¸�需è¦�进行下沉æ“�作,因此å�¯ä»¥å¿½ç•¥å�¶å­�节点的元素,因此å�ªéœ€è¦�é��历一å�Šçš„元素å�³å�¯ã€‚ + +![](index_files/a2670745-a7b1-497b-90a4-dbddc4e2006d.jpg) + +```java +public static void sort(Comparable[] a){ +    int N = a.length; +    for(int k = N/2; k >= 1; k--){ +        sink(a, k, N); +    } +    while(N > 1){ +        exch(a, 1, N--); +        sink(a, 1, N); +    } +} +``` + +### 6. 分æž� + +一个堆的高度为 lgN,因此在堆中æ�’入元素和删除最大元素的å¤�æ�‚度都为 lgN。 + +对于堆排åº�,由于è¦�对 N 个节点进行下沉æ“�作,因此å¤�æ�‚度为 NlgN。 + +堆排åº�时一ç§�原地排åº�,没有利用é¢�外的空间。 + +现代æ“�作系统很少使用堆排åº�,因为它无法利用缓存,也就是数组元素很少和相邻的元素进行比较。 + +## 应用 + +### 1. 排åº�算法的比较 + +![](index_files/be53c00b-2534-4dc6-ad03-c55995c47db9.jpg) + +快速排åº�时最快的通用排åº�算法,它的内循环的指令很少,而且它还能利用缓存,因为它总是顺åº�地访问数æ�®ã€‚它的è¿�行时间增长数é‡�级为 ~cNlgN,这里的 c 比其他线性对数级别的排åº�算法都è¦�å°�。使用三å�‘切分之å�Žï¼Œå®žé™…应用中å�¯èƒ½å‡ºçŽ°çš„æŸ�些分布的输入能够达到线性级别,而其它排åº�算法ä»�然需è¦�线性对数时间。 + +### 2. Java 的排åº�算法实现 + +Java 系统库中的主è¦�排åº�方法为 java.util.Arrays.sort(),对于原始数æ�®ç±»åž‹ä½¿ç”¨ä¸‰å�‘切分的快速排åº�,对于引用类型使用归并排åº�。 + +### 3. 基于切分的快速选择算法 + +快速排åº�的 partition() 方法,会将数组的 a[lo] 至 a[hi] é‡�新排åº�并返回一个整数 j 使得 a[lo..j-1] å°�于等于 a[j],且 a[j+1..hi] 大于等于 a[j]。那么如果 j=k,a[j] 就是第 k 个数。 + +该算法是线性级别的,因为æ¯�次正好将数组二分,那么比较的总次数为 (N+N/2+N/4+..),直到找到第 k 个元素,这个和显然å°�于 2N。 + +```java +    public static Comparable select(Comparable[] a, int k) { +        int lo = 0, hi = a.length - 1; +        while (hi > lo) { +            int j = partion(a, lo, hi); +            if (j == k) return a[k]; +            else if (j > k) hi = j - 1; +            else lo = j + 1; +        } +        return a[k]; +    } +``` + +# 第三章 查找 + +本章使用三ç§�ç»�典的数æ�®ç±»åž‹æ�¥å®žçŽ°é«˜æ•ˆçš„ç¬¦å�·è¡¨ï¼šäºŒå�‰æŸ¥æ‰¾æ ‘ã€�红黑树和散列表。 + +## 符å�·è¡¨ + +### 1. 无åº�符å�·è¡¨ + +![](index_files/b69d7184-ab62-4957-ba29-fb4fa25f9b65.jpg) + +### 2. 有åº�符å�·è¡¨ + +![](index_files/ba6ae411-82da-4d86-a434-6776d1731e8e.jpg) + +有åº�符å�·è¡¨çš„键需è¦�实现 Comparable 接å�£ã€‚ + +查找的æˆ�本模型:键的比较次数,在ä¸�进行比较时使用数组的访问次数。 + +### 3. 二分查找实现有åº�符å�·è¡¨ + +使用一对平行数组,一个存储键一个存储值。 + +需è¦�创建一个 Key 类型的 Comparable 对象数组和一个 Value 类型的 Object 对象数组。 + +rank() 方法至关é‡�è¦�,当键在表中时,它能够知é�“该键的ä½�置;当键ä¸�在表中时,它也能知é�“在何处æ�’入新键。 + +å¤�æ�‚度:二分查找最多需è¦� lgN+1 次比较,使用二分查找实现的符å�·è¡¨çš„æŸ¥æ‰¾æ“�作所需è¦�的时间最多是对数级别的。但是æ�’å…¥æ“�作需è¦�移动数组元素,是线性级别的。 + +```java +public class BinarySearchST, Value> { +    private Key[] keys; +    private Value[] values; +    private int N; + +    public BinarySearchST(int capacity) { +        keys = (Key[]) new Comparable[capacity]; +        values = (Value[]) new Object[capacity]; +    } + +    public int size() { +        return N; +    } + +    public Value get(Key key) { +        int i = rank(key); +        if (i < N && keys[i].compareTo(key) == 0) { +            return values[i]; +        } +        return null; +    } + +    public int rank(Key key) { +        int lo = 0, hi = N - 1; +        while (lo <= hi) { +            int mid = lo + (hi - lo) / 2; +            int cmp = key.compareTo(keys[mid]); +            if (cmp == 0) return mid; +            else if (cmp < 0) hi = mid - 1; +            else lo = mid + 1; +        } +        return lo; +    } + +    public void put(Key key, Value value) { +        int i = rank(key); +        if (i < N && keys[i].compareTo(key) == 0) { +            values[i] = value; +            return; +        } +        for (int j = N; j > i; j--) { +            keys[j] = keys[j - 1]; +            values[j] = values[j - 1]; +        } +        keys[i] = key; +        values[i] = value; +        N++; +    } + +    public Key ceiling(Key key){ +        int i = rank(key); +        return keys[i]; +    } +} +``` + + +## 二å�‰æŸ¥æ‰¾æ ‘ + +定义:二å�‰æ ‘定义为一个空链接,或者是一个有左å�³ä¸¤ä¸ªé“¾æŽ¥çš„节点,æ¯�个链接都指å�‘一颗å­�二å�‰æ ‘。二å�‰æŸ¥æ‰¾æ ‘(BST)是一颗二å�‰æ ‘,并且æ¯�个节点的键都大于其左å­�树中的任æ„�节点的键而å°�于å�³å­�树的任æ„�节点的键。 + +![](index_files/25226bb2-92cc-40cb-9e7f-c44e79fbb64a.jpg) + +二å�‰æŸ¥æ‰¾æ ‘的查找æ“�作æ¯�次迭代都会让区间å‡�少一å�Šï¼Œå’ŒäºŒåˆ†æŸ¥æ‰¾ç±»ä¼¼ã€‚ + +```java +public class BST, Value> { +    private Node root; + +    private class Node { +        private Key key; +        private Value val; +        private Node left, right; +        // 以该节点为根的å­�树中节点总数 +        private int N; + +        public Node(Key key, Value val, int N) { +            this.key = key; +            this.val = val; +            this.N = N; +        } +    } + +    public int size() { +        return size(root); +    } + +    private int size(Node x) { +        if (x == null) return 0; +        return x.N; +    } +} +``` + +### 1. get() + +如果树是空的,则查找未命中;如果被查找的键和根节点的键相等,查找命中,å�¦åˆ™é€’归地在å­�树中查找:如果被查找的键较å°�就在左å­�树中查找,较大就在å�³å­�树中查找。 + +```java +public Value get(Key key) { +    return get(root, key); +} +private Value get(Node x, Key key) { +    if (x == null) return null; +    int cmp = key.compareTo(x.key); +    if (cmp == 0) return x.val; +    else if (cmp < 0) return get(x.left, key); +    else return get(x.right, key); +} +``` + +### 2. put() + +当æ�’入的键ä¸�存在于树中,需è¦�创建一个新节点,并且更新上层节点的链接使得该节点正确链接到树中。 + +```java +public void put(Key key, Value val) { +    root = put(root, key, val); +} +private Node put(Node x, Key key, Value val) { +    if (x == null) return new Node(key, val, 1); +    int cmp = key.compareTo(x.key); +    if (cmp == 0) x.val = val; +    else if (cmp < 0) x.left = put(x.left, key, val); +    else x.right = put(x.right, key, val); +    x.N = size(x.left) + size(x.right) + 1; +    return x; +} +``` + +### 3. 分æž� + +二å�‰æŸ¥æ‰¾æ ‘的算法è¿�行时间å�–决于树的形状,而树的形状å�ˆå�–决于键被æ�’入的先å�Žé¡ºåº�。最好的情况下树是完全平衡的,æ¯�æ�¡ç©ºé“¾æŽ¥å’Œæ ¹èŠ‚ç‚¹çš„è·�离都为 lgN。在最å��的情况下,树的高度为 N。 + +![](index_files/73a3983d-dd18-4373-897e-64b706a7e370.jpg) + +å¤�æ�‚度:查找和æ�’å…¥æ“�作都为对数级别。 + +### 4. floor() + +如果 key å°�于根节点的 key,那么å°�于等于 key 的最大键节点一定在左å­�树中;如果 key 大于根节点的 key,å�ªæœ‰å½“根节点å�³å­�树中存在å°�于等于 key 的节点,å°�于等于 key 的最大键节点æ‰�在å�³å­�树中,å�¦åˆ™æ ¹èŠ‚ç‚¹å°±æ˜¯å°�于等于 key 的最大键节点。 + +```java +public Key floor(Key key) { +    Node x = floor(root, key); +    if (x == null) return null; +    return x.key; +} +private Node floor(Node x, Key key) { +    if (x == null) return null; +    int cmp = key.compareTo(x.key); +    if (cmp == 0) return x; +    if (cmp < 0) return floor(x.left, key); +    Node t = floor(x.right, key); +    if (t != null) { +        return t; +    } else { +        return x; +    } +} +``` + +### 5. rank() + +```java +public int rank(Key key) { +    return rank(key, root); +} +private int rank(Key key, Node x) { +    if (x == null) return 0; +    int cmp = key.compareTo(x.key); +    if (cmp == 0) return size(x.left); +    else if (cmp < 0) return rank(key, x.left); +    else return 1 + size(x.left) + rank(key, x.right); +} +``` + +### 6. min() + +```java +private Node min(Node x) { +    if (x.left == null) return x; +    return min(x.left); +} +``` + +### 7. deleteMin() + +令指å�‘最å°�节点的链接指å�‘最å°�节点的å�³å­�树。 + +![](index_files/6e2cb20a-8d2a-46fe-9ac7-68a2126b7bd5.jpg) + +```java +public void deleteMin() { +    root = deleteMin(root); +} +public Node deleteMin(Node x) { +    if (x.left == null) return x.right; +    x.left = deleteMin(x.left); +    x.N = size(x.left) + size(x.right) + 1; +    return x; +} +``` + +### 8. delete() + +如果待删除的节点å�ªæœ‰å­�树,那么å�ªéœ€è¦�让指å�‘节点的链接指å�‘唯一的å­�æ ‘å�³å�¯ï¼›å�¦åˆ™ï¼Œè®©å�³å­�树的最å°�节点替æ�¢è¯¥èŠ‚ç‚¹ã€‚ + +![](index_files/b488282d-bfe0-464f-9e91-1f5b83a975bd.jpg) + +```java +public void delete(Key key) { +    root = delete(root, key); +} +private Node delete(Node x, Key key) { +    if (x == null) return null; +    int cmp = key.compareTo(x.key); +    if (cmp < 0) x.left = delete(x.left, key); +    else if (cmp > 0) x.right = delete(x.right, key); +    else { +        if (x.right == null) return x.left; +        if (x.left == null) return x.right; +        Node t = x; +        x = min(t.right); +        x.right = deleteMin(t.right); +        x.left = t.left; +    } +    x.N = size(x.left) + size(x.right) + 1; +    return x; +} +``` + +### 9. keys() + +利用二å�‰æŸ¥æ‰¾æ ‘中åº�é��历的结果为有åº�åº�列的特点。 + +```java +public Iterable keys(Key lo, Key hi) { +    Queue queue = new LinkedList<>(); +    keys(root, queue, lo, hi); +    return queue; +} +private void keys(Node x, Queue queue, Key lo, Key hi) { +    if (x == null) return; +    int cmpLo = lo.compareTo(x.key); +    int cmpHi = hi.compareTo(x.key); +    if (cmpLo < 0) keys(x.left, queue, lo, hi); +    if (cmpLo <= 0 && cmpHi >= 0) queue.add(x.key); +    if (cmpHi > 0) keys(x.right, queue, lo, hi); +} +``` + +### 10. 性能分æž� + +å¤�æ�‚度:二å�‰æŸ¥æ‰¾æ ‘所有æ“�作在最å��的情况下所需è¦�的时间都和树的高度æˆ�正比。 + +## 平衡查找树 + +### 2-3 查找树 + +![](index_files/2548f2ec-7b00-4ec7-b286-20fc3022e084.jpg) + +一颗完美平衡的 2-3 查找树的所有空链接到根节点的è·�离应该是相å�Œçš„。 + +#### 1. æ�’å…¥æ“�作 + +当æ�’入之å�Žäº§ç”Ÿä¸€ä¸ªä¸´æ—¶Â 4- 节点时,需è¦�将 4- 节点分裂æˆ� 3 个 2- 节点,并将中间的 2- 节点移到上层节点中,如果上移æ“�作继续产生临时 4- 节点则一直进行分裂上移,直到ä¸�存在临时 4- 节点。 + +![](index_files/912174d8-0786-4222-b7ef-a611d36e5db9.jpg) + +#### 2. 性质 + +2-3 查找树æ�’å…¥æ“�作的å�˜æ�¢éƒ½æ˜¯å±€éƒ¨çš„,除了相关的节点和链接之外ä¸�必修改或者检查树的其它部分,而这些局部å�˜æ�¢ä¸�会影å“�树的全局有åº�性和平衡性。 + +2-3 查找树的查找和æ�’å…¥æ“�作å¤�æ�‚度和æ�’入顺åº�无关,在最å��的情况下查找和æ�’å…¥æ“�作访问的节点必然ä¸�超过 logN 个。å�«æœ‰Â 10 亿个节点的 2-3 查找树最多å�ªéœ€è¦�访问 30 个节点就能进行任æ„�的查找和æ�’å…¥æ“�作。 + +### 红黑二å�‰æŸ¥æ‰¾æ ‘ + +2-3 查找树需è¦�用到 2- 节点和 3- 节点,红黑树使用红链接æ�¥å®žçŽ°Â 3- 节点。指å�‘一个节点的链接颜色如果为红色,那么这个节点和上层节点表示的是一个 3- 节点,而黑色则是普通链接。 + +![](index_files/7080a928-06ba-4e10-9792-b8dd190dc8e2.jpg) + +红黑树具有以下性质: + +1. 红链接都为左链接; +2. 完美黑色平衡,å�³ä»»æ„�空链接到根节点的路径上的黑链接数é‡�相å�Œã€‚ + +画红黑树时å�¯ä»¥å°†çº¢é“¾æŽ¥ç”»å¹³ã€‚ + +![](index_files/62077f5d-a06d-4129-9b43-78715b82cb03.png) + +```java +public class RedBlackBST, Value> { +    private Node root; +    private static final boolean RED = true; +    private static final boolean BLACK = false; + +    private class Node { +        Key key; +        Value val; +        Node left, right; +        int N; +        boolean color; + +        Node(Key key, Value val, int n, boolean color) { +            this.key = key; +            this.val = val; +            N = n; +            this.color = color; +        } +    } + +    private boolean isRed(Node x) { +        if (x == null) return false; +        return x.color == RED; +    } +} +``` + +#### 1. 左旋转 + +因为å�ˆæ³•的红链接都为左链接,如果出现å�³é“¾æŽ¥ä¸ºçº¢é“¾æŽ¥ï¼Œé‚£ä¹ˆå°±éœ€è¦�进行左旋转æ“�作。 + +![](index_files/33a4e822-2dd0-481e-ac89-7f6161034402.jpg) + +![](index_files/5e0cef33-4087-4f21-a428-16d5fddda671.jpg) + +```java +public Node rotateLeft(Node h) { +    Node x = h.right; +    h.right = x.left; +    x.left = h; +    x.color = h.color; +    h.color = RED; +    x.N = h.N; +    h.N = 1 + size(h.left) + size(h.right); +    return x; +} +``` + +#### 2. å�³æ—‹è½¬ + +进行å�³æ—‹è½¬æ˜¯ä¸ºäº†è½¬æ�¢ä¸¤ä¸ªè¿žç»­çš„左红链接,这会在之å�Žçš„æ�’入过程中探讨。 + +![](index_files/dfd078b2-aa4f-4c50-8319-232922d822b8.jpg) + +![](index_files/3f8d8c9d-a9a9-4d7a-813c-2de05ee5a97e.jpg) + +```java +public Node rotateRight(Node h) { +    Node x = h.left; +    h.left = x.right; +    x.color = h.color; +    h.color = RED; +    x.N = h.N; +    h.N = 1 + size(h.left) + size(h.right); +    return x; +} +``` + +#### 3. 颜色转æ�¢ + +一个 4- 节点在红黑树中表现为一个节点的左å�³å­�节点都是红色的。分裂 4- 节点除了需è¦�å°†å­�节点的颜色由红å�˜é»‘之外,å�Œæ—¶éœ€è¦�将父节点的颜色由黑å�˜çº¢ï¼Œä»ŽÂ 2-3 树的角度看就是将中间节点移到上层节点。 + +![](index_files/de7c5a31-55f5-4e9d-92ec-4ed5b2ec3828.jpg) + +![](index_files/e5ad625e-729d-4a8d-923a-7c3df5773e1c.jpg) + +```java +void flipColors(Node h){ +    h.color = RED; +    h.left.color = BLACK; +    h.right.color = BLACK; +} +``` + +#### 4. æ�’å…¥ + +æ�’入算法: + +- 如果å�³å­�节点是红色的而左å­�节点是黑色的,进行左旋转; +- 如果左å­�节点是红色的且它的左å­�节点也是红色的,进行å�³æ—‹è½¬ï¼› +- 如果左å�³å­�节点å�‡ä¸ºçº¢è‰²çš„,进行颜色转æ�¢ã€‚ + +![](index_files/40639782-5df2-4e96-a4f3-f9dd664d0ca1.jpg) + +```java +public void put(Key key, Value val) { +    root = put(root, key, val); +    root.color = BLACK; +} + +private Node put(Node x, Key key, Value val) { +    if (x == null) return new Node(key, val, 1, RED); +    int cmp = key.compareTo(x.key); +    if (cmp == 0) x.val = val; +    else if (cmp < 0) x.left = put(x.left, key, val); +    else x.right = put(x.right, key, val); + +    if (isRed(x.right) && !isRed(x.left)) x = rotateLeft(x); +    if (isRed(x.left) && isRed(x.left.left)) x = rotateRight(x); +    if (isRed(x.left) && isRed(x.right)) flipColors(x); + +    x.N = size(x.left) + size(x.right) + 1; +    return x; +} +``` + +å�¯ä»¥çœ‹åˆ°è¯¥æ�’å…¥æ“�作和 BST 的æ�’å…¥æ“�作类似,å�ªæ˜¯åœ¨æœ€å�ŽåŠ å…¥äº†æ—‹è½¬å’Œé¢œè‰²å�˜æ�¢æ“�作å�³å�¯ã€‚ + +根节点一定为黑色,因为根节点没有上层节点,也就没有上层节点的左链接指å�‘根节点。flipColors() 有å�¯èƒ½ä¼šä½¿å¾—根节点的颜色å�˜ä¸ºçº¢è‰²ï¼Œæ¯�当根节点由红色å�˜æˆ�黑色时树的黑链接高度加 1. + +#### 5. 删除最å°�é”® + +如果最å°�键在一个 2- 节点中,那么删除该键会留下一个空链接,就破å��了平衡性,因此è¦�ç¡®ä¿�最å°�é”®ä¸�在 2- 节点中。将 2- 节点转æ�¢æˆ� 3- 节点或者 4- 节点有两ç§�方法,一ç§�是å�‘上层节点拿一个 key,或者å�‘兄弟节点拿一个 key。如果上层节点是 2- 节点,那么就没办法从上层节点拿 key 了,因此è¦�ä¿�è¯�删除路径上的所有节点都ä¸�是 2- 节点。在å�‘下删除的过程中,ä¿�è¯�以下情况之一å�‘生: + +1. 如果当å‰�节点的左å­�节点ä¸�是 2- 节点,完æˆ�ï¼› +2. 如果当å‰�节点的左å­�节点是 2- 节点而它的兄弟节点ä¸�是 2- 节点,å�‘兄弟节点拿一个 key 过æ�¥ï¼› +3. 如果当å‰�节点的左å­�节点和它的兄弟节点都是 2- 节点,将左å­�节点ã€�父节点中的最å°�键和最近的兄弟节点å�ˆå¹¶ä¸ºä¸€ä¸ªÂ 4- 节点。 + +![](index_files/b001fa64-307c-49af-b4b2-2043fc26154e.png) + +最å�Žå¾—到一个å�«æœ‰æœ€å°�键的 3- 节点或者 4- 节点,直接从中删除。然å�Žå†�从头分解所有临时的 4- 节点。 + +![](index_files/70b66757-755c-4e17-a7b7-5ce808023643.png) + +#### 6. 分æž� + +一颗大å°�为 N 的红黑树的高度ä¸�会超过 2lgN。最å��的情况下是它所对应的 2-3 树中构æˆ�最左边的路径节点全部都是 3- 节点而其余都是 2- 节点。 + +红黑树大多数的æ“�作所需è¦�的时间都是对数级别的。 + +## 散列表 + +散列表类似于数组,å�¯ä»¥æŠŠæ•£åˆ—表的散列值看æˆ�数组的索引值。访问散列表和访问数组元素一样快速,它å�¯ä»¥åœ¨å¸¸æ•°æ—¶é—´å†…实现查找和æ�’入的符å�·è¡¨ã€‚ + +由于无法通过散列值知é�“键的大å°�关系,因此散列表无法实现有åº�性æ“�作。 + +### 散列函数 + +对于一个大å°�为 M 的散列表,散列函数能够把任æ„�键转æ�¢ä¸ºÂ [0, M-1] 内的正整数,该正整数å�³ä¸ºÂ hash 值。 + +散列表有冲çª�的存在,也就是两个ä¸�å�Œçš„é”®å�¯èƒ½æœ‰ç›¸å�Œçš„ hash 值。 + +散列函数应该满足以下三个æ�¡ä»¶ï¼š + +1. 一致性:相等的键应当有相等的 hash 值。 +2. 高效性:计算应当简便,有必è¦�çš„è¯�å�¯ä»¥æŠŠÂ hash 值缓存起æ�¥ï¼Œåœ¨è°ƒç”¨Â hash 函数时直接返回。 +3. å�‡åŒ€æ€§ï¼šæ‰€æœ‰é”®çš„ hash 值应当å�‡åŒ€åœ°åˆ†å¸ƒåˆ°Â [0, M-1] 之间,这个æ�¡ä»¶è‡³å…³é‡�è¦�,直接影å“�到散列表的性能。 + +除留余数法å�¯ä»¥å°†æ•´æ•°æ•£åˆ—到 [0, M-1] 之间,例如一个正整数 k,计算 k%M 既å�¯å¾—到一个 [0, M-1] 之间的 hash 值。注æ„� M 必须是一个素数,å�¦åˆ™æ— æ³•利用键包å�«çš„æ‰€æœ‰ä¿¡æ�¯ã€‚例如 M 为 10k,那么å�ªèƒ½åˆ©ç”¨é”®çš„å�ŽÂ k ä½�。 + +对于其它数,å�¯ä»¥å°†å…¶è½¬æ�¢æˆ�整数的形å¼�,然å�Žåˆ©ç”¨é™¤ç•™ä½™æ•°æ³•。例如对于浮点数,å�¯ä»¥å°†å…¶è¡¨ç¤ºæˆ�二进制形å¼�,然å�Žä½¿ç”¨äºŒè¿›åˆ¶å½¢å¼�的整数值进行除留余数法。 + +对于有多部分组å�ˆçš„键,æ¯�部分都需è¦�计算 hash 值,并且最å�Žå�ˆå¹¶æ—¶éœ€è¦�让æ¯�部分 hash 值都具有å�Œç­‰é‡�è¦�的地ä½�。å�¯ä»¥å°†è¯¥é”®çœ‹æˆ� R 进制的整数,键中æ¯�部分都具有ä¸�å�Œçš„æ�ƒå€¼ã€‚ + +例如,字符串的散列函数实现如下 + +```java +int hash = 0; +for(int i = 0; i < s.length(); i++) +    hash = (R * hash + s.charAt(i)) % M; +``` + +å†�比如,拥有多个æˆ�员的自定义类的哈希函数如下 + +```java +int hash = (((day * R + month) % M) * R + year) % M; +``` + +R 的值ä¸�是很é‡�è¦�,通常å�– 31。 + +Java 中的 hashCode() 实现了 hash 函数,但是默认使用对象的内存地å�€å€¼ã€‚在使用 hashCode() 函数时,应当结å�ˆé™¤ç•™ä½™æ•°æ³•æ�¥ä½¿ç”¨ã€‚因为内存地å�€æ˜¯Â 32 ä½�整数,我们å�ªéœ€è¦� 31 ä½�çš„é�žè´Ÿæ•´æ•°ï¼Œå› æ­¤åº”当å±�蔽符å�·ä½�之å�Žå†�使用除留余数法。 + +```java +int hash = (x.hashCode() & 0x7fffffff) % M; +``` + +使用 Java 自带的 HashMap 等自带的哈希表实现时,å�ªéœ€è¦�去实现 Key 类型的 hashCode() 函数å�³å�¯ï¼Œå› æ­¤ä¹Ÿå°±ä¸�需è¦�考虑 M 的大å°�等。Java 规定 hashCode() 能够将键å�‡åŒ€åˆ†å¸ƒäºŽæ‰€æœ‰çš„ 32 ä½�整数,Java 中的 Stringã€�Integer 等对象的 hashCode() 都能实现这一点。以下展示了自定义类型如何实现 hashCode()。 + +```java +public class Transaction{ +    private final String who; +    private final Date when; +    private final double amount; + +    public int hashCode(){ +        int hash = 17; +        hash = 31 * hash + who.hashCode(); +        hash = 31 * hash + when.hashCode(); +        hash = 31 * hash + ((Double) amount).hashCode(); +        return hash; +    } +} +``` + +### 基于拉链法的散列表 + +拉链法使用链表æ�¥å­˜å‚¨Â hash 值相å�Œçš„键,从而解决冲çª�。此时查找需è¦�分两步,首先查找 Key 所在的链表,然å�Žåœ¨é“¾è¡¨ä¸­é¡ºåº�查找。 + +![](index_files/540133af-aaaf-4208-8f7f-33cb89ac9621.png) + +对于 N 个键,M æ�¡é“¾è¡¨Â (N>M),如果哈希函数能够满足å�‡åŒ€æ€§çš„æ�¡ä»¶ï¼Œæ¯�æ�¡é“¾è¡¨çš„大å°�è¶‹å�‘于 N/M,因此未命中的查找和æ�’å…¥æ“�作所需è¦�的比较次数为 ~N/M。 + +### 基于线性探测法的散列表 + +线性探测法使用空ä½�æ�¥è§£å†³å†²çª�,当冲çª�å�‘生时,å�‘å‰�探测一个空ä½�æ�¥å­˜å‚¨å†²çª�的键。使用线程探测法,数组的大å°� M 应当大于键的个数 N(M>N)。 + +![](index_files/2b3410f1-9559-4dd1-bc3d-e3e572247be2.png) + +```java +public class LinearProbingHashST { +    private int N; +    private int M = 16; +    private Key[] keys; +    private Value[] vals; + +    public LinearProbingHashST() { +        init(); +    } + +    public LinearProbingHashST(int M) { +        this.M = M; +        init(); +    } + +    private void init() { +        keys = (Key[]) new Object[M]; +        vals = (Value[]) new Object[M]; +    } + +    private int hash(Key key) { +        return (key.hashCode() & 0x7fffffff) % M; +    } +} +``` + +#### 查找 + +```java +public Value get(Key key) { +    for (int i = hash(key); keys[i] != null; i = (i + 1) % M) { +        if (keys[i].equals(key)) { +            return vals[i]; +        } +    } +    return null; +} +``` + +#### æ�’å…¥ + +```java +public void put(Key key, Value val) { +    int i; +    for (i = hash(key); keys[i] != null; i = (i + 1) % M) { +        if (keys[i].equals(key)) { +            vals[i] = val; +            return; +        } +    } +    keys[i] = key; +    vals[i] = val; +    N++; +    resize(); +} +``` + +#### 删除 + +删除æ“�作应当将å�³ä¾§æ‰€æœ‰ç›¸é‚»çš„键值é‡�æ–°æ�’入散列表中。 + +```java +public void delete(Key key) { +    if (!contains(key)) return; +    int i = hash(key); +    while (!key.equals(keys[i])) { +        i = (i + 1) % M; +    } +    keys[i] = null; +    vals[i] = null; +    i = (i + 1) % M; +    while (keys[i] != null) { +        Key keyToRedo = keys[i]; +        Value valToRedo = vals[i]; +        keys[i] = null; +        vals[i] = null; +        N--; +        put(keyToRedo, valToRedo); +        i = (i + 1) % M; +    } +    N--; +    resize(); +} +``` + +#### 调整数组大å°� + +线性探测法的æˆ�本å�–决于连续æ�¡ç›®çš„长度,连续æ�¡ç›®ä¹Ÿå�«è�šç°‡ã€‚当è�šç°‡å¾ˆé•¿æ—¶ï¼Œåœ¨æŸ¥æ‰¾å’Œæ�’入时也需è¦�进行很多次探测。 + +α = N/M,把 α 称为利用率。ç�†è®ºè¯�明,当 α å°�于 1/2 时探测的预计次数å�ªåœ¨Â 1.5 到 2.5 之间。 + +![](index_files/0ddebc5c-7c24-46b1-98db-4fa5e54db16b.png) + +为了ä¿�è¯�散列表的性能,应当调整数组的大å°�,使得 α 在 [1/4, 1/2] 之间。 + +```java +private void resize() { +    if (N >= M / 2) resize(2 * M); +    else if (N <= M / 8) resize(M / 2); +} + +private void resize(int cap) { +    LinearProbingHashST t = new LinearProbingHashST<>(cap); +    for (int i = 0; i < M; i++) { +        if (keys[i] != null) { +            t.put(keys[i], vals[i]); +        } +    } +    keys = t.keys; +    vals = t.vals; +    M = t.M; +} +``` + +虽然æ¯�次é‡�新调整数组都需è¦�é‡�新把æ¯�个键值对æ�’入到散列表,但是从摊还分æž�的角度æ�¥çœ‹ï¼Œæ‰€éœ€è¦�的代价å�´æ˜¯å¾ˆå°�的。从下图å�¯ä»¥çœ‹å‡ºï¼Œæ¯�次数组长度加å€�å�Žï¼Œç´¯è®¡å¹³å�‡å€¼éƒ½ä¼šå¢žåŠ Â 1,因为表中æ¯�个键都需è¦�é‡�新计算散列值,但是éš�å�Žå¹³å�‡å€¼ä¼šä¸‹é™�。 + +![](index_files/01658047-0d86-4a7a-a8ca-7ea20fa1fdde.png) + +## 应用 + +### å�„ç§�符å�·è¡¨å®žçŽ°çš„æ¯”è¾ƒ + +![](index_files/9ee83c8c-1165-476c-85a6-e6e434e5307a.jpg) + +应当优先考虑散列表,当需è¦�有åº�性æ“�作时使用红黑树。 + +### Java 的符å�·è¡¨å®žçް + +Java 的 java.util.TreeMap 和 java.util.HashMap 分别是基于红黑树和拉链法的散列表的符å�·è¡¨å®žçŽ°ã€‚ + +### 集å�ˆç±»åž‹ + +除了符å�·è¡¨ï¼Œé›†å�ˆç±»åž‹ä¹Ÿç»�常使用,它å�ªæœ‰é”®æ²¡æœ‰å€¼ï¼Œå�¯ä»¥ç”¨é›†å�ˆç±»åž‹æ�¥å­˜å‚¨ä¸€ç³»åˆ—的键然å�Žåˆ¤æ–­ä¸€ä¸ªé”®æ˜¯å�¦åœ¨é›†å�ˆä¸­ã€‚ + +### 稀ç–�å�‘é‡�乘法 + +å�‘é‡�è¿�算涉å�Šåˆ°Â N 次乘法,当å�‘é‡�为稀ç–�å�‘é‡�时,å�¯ä»¥ä½¿ç”¨ç¬¦å�·è¡¨æ�¥å­˜å‚¨å�‘é‡�中的é�žÂ 0 索引和值,使得乘法è¿�ç®—å�ªéœ€è¦�对那些é�žÂ 0 元素进行å�³å�¯ã€‚ + +```java +import java.util.HashMap; + +public class SparseVector { +    private HashMap hashMap; + +    public SparseVector(double[] vector) { +        hashMap = new HashMap<>(); +        for (int i = 0; i < vector.length; i++) { +            if (vector[i] != 0) { +                hashMap.put(i, vector[i]); +            } +        } +    } + +    public double get(int i) { +        return hashMap.getOrDefault(i, 0.0); +    } + +    public double dot(SparseVector other) { +        double sum = 0; +        for (int i : hashMap.keySet()) { +            sum += this.get(i) * other.get(i); +        } +        return sum; +    } +} +``` \ No newline at end of file diff --git a/notes/笔记/编写å�¯è¯»ä»£ç �的艺术.md.txt b/notes/笔记/编写å�¯è¯»ä»£ç �的艺术.md.txt new file mode 100644 index 00000000..aeddb05d --- /dev/null +++ b/notes/笔记/编写å�¯è¯»ä»£ç �的艺术.md.txt @@ -0,0 +1,328 @@ +[TOC] + +# 第 1 章 å�¯è¯»æ€§çš„é‡�è¦�性 + +编程有很大一部分时间是在阅读代ç �,ä¸�ä»…è¦�阅读自己的代ç �,而且è¦�阅读别人的代ç �。因此,å�¯è¯»æ€§è‰¯å¥½çš„代ç �能够大大æ��高编程效率。 + +å�¯è¯»æ€§è‰¯å¥½çš„代ç �往往会让代ç �架构更好,因为程åº�员更愿æ„�去修改这部分代ç �,而且也更容易修改。 + +å�ªæœ‰åœ¨æ ¸å¿ƒé¢†åŸŸä¸ºäº†æ•ˆçއæ‰�å�¯ä»¥æ”¾å¼ƒå�¯è¯»æ€§ï¼Œå�¦åˆ™å�¯è¯»æ€§æ˜¯ç¬¬ä¸€ä½�。 + +# 第 2 章 用å��字表达代ç �å�«ä¹‰ + +一些比较有表达力的å�•è¯�: + +|  å�•è¯� |  å�¯æ›¿ä»£å�•è¯� | +| --- | --- | +|  send | deliverã€�dispatchã€�announceã€�distributeã€�route  | +| find  |  searchã€�extractã€�locateã€�recover | +| start| launchã€�createã€�beginã€�open| +|make|createã€�set upã€�buildã€�generateã€�composeã€�addã€�new| + +使用 iã€�jã€�k 作为循环迭代器ä¸�总是好的,为迭代器添加更有表达力的å��字会更好,比如 user_iã€�member_i。因为循环层次越多,代ç �è¶Šéš¾ç�†è§£ï¼Œæœ‰è¡¨è¾¾åŠ›çš„è¿­ä»£å™¨å��å­—å�¯è¯»æ€§ä¼šæ›´é«˜ + +为å��字添加形容è¯�等信æ�¯èƒ½è®©å��字更具有表达力,但是å��字也会å�˜é•¿ã€‚å��字长短的准则是:作用域越大,å��字越长。因此å�ªæœ‰åœ¨çŸ­ä½œç”¨åŸŸæ‰�能使用一些简å�•å��字。 + +# 第 3 章 å��å­—ä¸�能带æ�¥æ­§ä¹‰ + +起完å��å­—è¦�æ€�考一下别人会对这个å��字有何解读,会ä¸�会误解了原本想表达的å�«ä¹‰ã€‚ + +用 minã€�max 表示数é‡�范围; + +用 firstã€�last 表示访问空间的包å�«èŒƒå›´ï¼Œbeginã€�end 表示访问空间的排除范围,å�³Â end ä¸�包å�«å°¾éƒ¨ã€‚ + +![](index_files/26772ecc-a3e3-4ab7-a46f-8b4656990c27.jpg) + +布尔相关的命å��加上 isã€�canã€�shouldã€�has 等å‰�缀。 + +# 第 4 章 良好的代ç �风格 + +适当的空行和缩进 + +排列整é½�的注释: + +``` +int a = 1;   // 注释 +int b = 11;  // 注释 +int c = 111; // 注释 +``` + +语å�¥é¡ºåº�ä¸�能éš�æ„�,比如与 html 表å�•相关è�”çš„å�˜é‡�的赋值应该和表å�•在 html 中的顺åº�一致; + +把相关的代ç �按å�—组织放在一起。 + +# 第 5 章 编写注释 + +阅读代ç �首先会注æ„�到注释,如果注释没太大作用,那么就会浪费代ç �阅读的时间。那些能直接看出å�«ä¹‰çš„代ç �ä¸�需è¦�写注释,特别是并ä¸�需è¦�为æ¯�个方法都加上注释,比如那些简å�•的 getter 和 setter 方法,为这些方法写注释å��而让代ç �å�¯è¯»æ€§æ›´å·®ã€‚ + +ä¸�能因为有注释就éš�便起个å��字,而是争å�–起个好å��字而ä¸�写注释。 + +å�¯ä»¥ç”¨æ³¨é‡Šæ�¥è®°å½•采用当å‰�解决办法的æ€�考过程,从而让读者更容易ç�†è§£ä»£ç �。 + +注释用æ�¥æ��醒一些特殊情况。 + +用 TODO 等å�šæ ‡è®°ï¼š + +| 标记 | 用法 | +|---|---| +|TODO| 待å�šÂ | +|FIXME| 待修å¤� | +|HACH| 粗糙的解决方案 | +|XXX| å�±é™©ï¼�这里有é‡�è¦�的问题 | + +# 第 6 章 如何编写注释 + +å°½é‡�简æ´�明了: + +``` +// The first String is student's name +// The Second Integer is student's score +Map scoreMap = new HashMap<>(); +``` + +``` +// Student' name -> Student's score +Map scoreMap = new HashMap<>(); +``` + +添加测试用例æ�¥è¯´æ˜Žï¼š + +``` +//... +// Example: add(1, 2), return 3 +int add(int x, int y) { +    return x + y; +} +``` + +在很å¤�æ�‚的函数调用中对æ¯�个å�‚数标上å��字: + +``` +int a = 1; +int b = 2; +int num = add(\* x = *\ a, \* y = *\ b); +``` + +使用专业å��è¯�æ�¥ç¼©çŸ­æ¦‚念上的解释,比如用设计模å¼�å��æ�¥è¯´æ˜Žä»£ç �。 + +# 第 7 章 æ��高控制æµ�çš„å�¯è¯»æ€§ + +æ�¡ä»¶è¡¨è¾¾å¼�中,左侧是å�˜é‡�,å�³ä¾§æ˜¯å¸¸æ•°ã€‚比如下é�¢ç¬¬ä¸€ä¸ªè¯­å�¥æ­£ç¡®ï¼š + +``` +if(len < 10) +if(10 > len) +``` + +if / else æ�¡ä»¶è¯­å�¥ï¼Œå…ˆå¤„ç�†ä»¥ä¸‹é€»è¾‘:① 正逻辑;② 关键逻辑;③:简å�•逻辑 +``` +if(a == b) { +    // 正逻辑 +} else{ +    // å��逻辑 +} +``` + +å�ªæœ‰åœ¨é€»è¾‘简å�•的情况下使用 ? : 三目è¿�算符æ�¥ä½¿ä»£ç �更紧凑,å�¦åˆ™åº”该拆分æˆ� if / elseï¼› + +do / while 的æ�¡ä»¶æ”¾åœ¨å�Žé�¢ï¼Œä¸�够简å�•明了,并且会有一些迷惑的地方,最好使用 while æ�¥ä»£æ›¿ã€‚ + +如果å�ªæœ‰ä¸€ä¸ªÂ goto 目标,那么 goto 尚且还能接å�—,但是过于å¤�æ�‚的 goto 会让代ç �å�¯è¯»æ€§ç‰¹åˆ«å·®ï¼Œåº”该é�¿å…�使用 goto。 + +在嵌套的循环中,用一些 return 语å�¥å¾€å¾€èƒ½å‡�少嵌套的层数。 + +# 第 8 章 拆分长表达å¼� + +长表达å¼�çš„å�¯è¯»æ€§å¾ˆå·®ï¼Œå�¯ä»¥å¼•入一些解释å�˜é‡�从而拆分表达å¼�: + +``` +if line.split(':')[0].strip() == "root": +    ... +``` +``` +username = line.split(':')[0].strip() +if username == "root": +    ... +``` + +使用摩根定ç�†ç®€åŒ–一些逻辑表达å¼�: + +``` +if(!a && !b) { +    ... +} +``` +``` +if(a || b) { +    ... +} +``` + +# 第 9 章 å�˜é‡�与å�¯è¯»æ€§ + +去除控制æµ�å�˜é‡�。在循环中通过 break 或者 return å�¯ä»¥å‡�少控制æµ�å�˜é‡�的使用。 + +``` +boolean done = false; +while(/* condition */ && !done) { +    ... +    if(...) { +        done = true; +        continue; +    } +} +``` +``` +while(/* condition */) { +    ... +    if(...) { +        break; +    } +} +``` + +å‡�å°�å�˜é‡�作用域。作用域越å°�,越容易定ä½�到å�˜é‡�所有使用的地方。 + +JavaScript å�¯ä»¥ç”¨é—­åŒ…å‡�å°�作用域。以下代ç �中 submit_form 是函数å�˜é‡�,submitted å�˜é‡�控制函数ä¸�会被æ��交两次。第一个实现中 submitted 是全局å�˜é‡�,第二个实现把 submitted 放到匿å��函数中,从而é™�制了起作用域范围。 + +``` +submitted = false; +var submit_form = function(form_name) { +    if(submitted) { +        return; +    } +    submitted = true; +}; +``` + +``` +var submit_form = (function() { +    var submitted = false; +    return function(form_name) { +        if(submitted) { +            return; +        } +        submitted = true; +    } +}());  // () 使得外层匿å��函数立å�³æ‰§è¡Œ +``` + +JavaScript 中没有用 var 声明的å�˜é‡�都是全局å�˜é‡�,而全局å�˜é‡�很容易造æˆ�迷惑,因此应当总是用 var æ�¥å£°æ˜Žå�˜é‡�。 + +å�˜é‡�定义的ä½�置应当离它使用的ä½�置最近。 + +**实例解æž�** + +在一个网页中有以下文本输入字段: + +``` + + + + +``` + +现在è¦�接å�—一个字符串并把它放到第一个空的 input 字段中,åˆ�始实现如下: + +``` +var setFirstEmptyInput = function(new_alue) { +    var found = false; +    var i = 1; +    var elem = document.getElementById('input' + i); +    while(elem != null) { +        if(elem.value === '') { +            found = true; +            break; +        } +        i++; +        elem = document.getElementById('input' + i); +    } +    if(found) elem.value = new_value; +    return elem; +} +``` + +以上实现有以下问题: + +- found å�¯ä»¥åŽ»é™¤ï¼› +- elem 作用域过大; +- å�¯ä»¥ç”¨Â for 循环代替 while 循环; + +``` +var setFirstEmptyInput = function(new_value) { +    for(var i = 1; true; i++) { +        var elem = document.getElementById('input' + i); +        if(elem === null) { +            return null; +        } +        if(elem.value === '') { +            elem.value = new_value; +            return elem; +        } +    } +}; +``` + +# 第 10 章 抽å�–函数 + +工程学就是把大问题拆分æˆ�å°�问题å†�把这些问题的解决方案放回一起。 + +首先应该明确一个函数的高层次目标,然å�Žå¯¹äºŽä¸�是直接为了这个目标工作的代ç �,抽å�–出æ�¥æ”¾åˆ°ç‹¬ç«‹çš„函数中。 + +介ç»�性的代ç �: + +``` +int findClostElement(int[] arr) { +    int clostIdx; +    int clostDist = Interger.MAX_VALUE; +    for(int i = 0; i < arr.length; i++) { +        int x = ...; +        int y = ...; +        int z = ...; +        int value = x * y * z; +        int dist = Math.sqrt(Math.pow(value, 2), Math.pow(arr[i], 2)); +        if(dist < clostDist) { +            clostIdx = i; +            clostDist = value; +        } +    } +    return clostIdx; +} +``` + +以上代ç �中循环部分主è¦�计算è·�离,这部分ä¸�属于代ç �高层次目标,高层次目标是寻找最å°�è·�离的值,因此å�¯ä»¥æŠŠè¿™éƒ¨åˆ†ä»£æ›¿æ��å�–到独立的函数中。这样å�šä¹Ÿå¸¦æ�¥ä¸€ä¸ªé¢�外的好处有:å�¯ä»¥å�•独进行测试ã€�å�¯ä»¥å¿«é€Ÿæ‰¾åˆ°ç¨‹åº�错误并修改。 + +``` +public int findClostElement(int[] arr) { +    int clostIdx; +    int clostDist = Interger.MAX_VALUE; +    for(int i = 0; i < arr.length; i++) { +        int dist = computDist(arr, i); +        if(dist < clostDist) { +            clostIdx = i; +            clostDist = value; +        } +    } +    return clostIdx; +} +``` + +å¹¶ä¸�是函数抽å�–的越多越好,如果抽å�–过多,在阅读代ç �的时候å�¯èƒ½éœ€è¦�ä¸�æ–­è·³æ�¥è·³åŽ»ã€‚å�ªæœ‰åœ¨å½“å‰�函数ä¸�需è¦�去了解æŸ�一å�—代ç �细节而能够表达其内容时,把这å�—代ç �抽å�–æˆ�å­�函数æ‰�是好的。 + +函数抽å�–也用于å‡�å°�代ç �的冗余。 + +# 第 11 章 一次å�ªå�šä¸€ä»¶äº‹ + +å�ªå�šä¸€ä»¶äº‹çš„代ç �很容易让人知é�“å…¶è¦�å�šçš„事; + +基本æµ�程:列出代ç �所å�šçš„æ‰€æœ‰ä»»åŠ¡ï¼›æŠŠæ¯�个任务拆分到ä¸�å�Œçš„函数,或者ä¸�å�Œçš„æ®µè�½ã€‚ + +# 第 12 章 用自然语言表述代ç � + +先用自然语言书写代ç �逻辑,也就是伪代ç �,然å�Žå†�写代ç �,这样代ç �逻辑会更清晰。 + +# 第 13 章 å‡�少代ç �é‡� + +ä¸�è¦�过度设计,编ç �过程会有很多å�˜åŒ–,过度设计的内容到最å�Žå¾€å¾€æ˜¯æ— ç”¨çš„。 + +多用标准库实现。 \ No newline at end of file diff --git a/notes/笔记/计算机æ“�作系统+.md.txt b/notes/笔记/计算机æ“�作系统+.md.txt new file mode 100644 index 00000000..6133ed8c --- /dev/null +++ b/notes/笔记/计算机æ“�作系统+.md.txt @@ -0,0 +1,10 @@ +[TOC] + +# 链接 + +# IO 多路å¤�用 + +http://www.hollischuang.com/archives/1830 + +http://www.cnblogs.com/Anker/p/3265058.html + diff --git a/notes/笔记/计算机æ“�作系统.md.txt b/notes/笔记/计算机æ“�作系统.md.txt new file mode 100644 index 00000000..0a3cc697 --- /dev/null +++ b/notes/笔记/计算机æ“�作系统.md.txt @@ -0,0 +1,657 @@ +[TOC] + +# 第一章 概述 + +## æ“�作系统基本特å¾� + +### 1. 并å�‘ + +å¹¶å�‘性是指å®�观上在一段时间内能å�Œæ—¶è¿�行多个程åº�,而并行性则指å�Œä¸€æ—¶åˆ»èƒ½è¿�行多个指令。 + +并行需è¦�硬件支æŒ�,如多æµ�水线或者多处ç�†å™¨ã€‚ + +æ“�作系统通过引入进程和线程,使得程åº�能够并å�‘è¿�行。 + +### 2. 共享 + +共享是指系统中的资æº�å�¯ä»¥ä¾›å¤šä¸ªå¹¶å�‘的进程共å�Œä½¿ç”¨ã€‚ + +有两ç§�共享方å¼�:互斥共享和å�Œæ—¶å…±äº«ã€‚ + +互斥共享的资æº�称为临界资æº�,例如打å�°æœºç­‰ï¼Œåœ¨å�Œä¸€æ—¶é—´å�ªå…�许一个进程访问,å�¦åˆ™ä¼šå‡ºçŽ°é”™è¯¯ï¼Œéœ€è¦�用å�Œæ­¥æœºåˆ¶æ�¥å®žçŽ°å¯¹ä¸´ç•Œèµ„æº�的访问。 + +### 3. 虚拟 + +虚拟技术把一个物ç�†å®žä½“转æ�¢ä¸ºå¤šä¸ªé€»è¾‘实体。主è¦�有两ç§�虚拟技术:时分å¤�用技术和空分å¤�用技术,例如多个进程能在å�Œä¸€ä¸ªå¤„ç�†å™¨ä¸Šå¹¶å�‘执行使用了时分å¤�用技术,让æ¯�个进程轮æµ�å� æœ‰å¤„ç�†å™¨ï¼Œæ¯�次å�ªæ‰§è¡Œä¸€å°�个时间片并快速切æ�¢ï¼Œè¿™æ ·å°±å¥½åƒ�有多个处ç�†å™¨è¿›è¡Œå¤„ç�†ã€‚ + +### 4. 异步 + +异步是指进程ä¸�是一次性执行完毕,而是走走å�œå�œï¼Œä»¥ä¸�å�¯çŸ¥çš„速度å�‘å‰�推进。 + +## 系统调用 + +如果一个进程在用户æ€�需è¦�用到æ“�作系统的一些功能,就需è¦�使用系统调用从而陷入内核,由æ“�作系统代为完æˆ�。 + +å�¯ä»¥ç”±ç³»ç»Ÿè°ƒç”¨è¯·æ±‚的功能有设备管ç�†ã€�文件管ç�†ã€�进程管ç�†ã€�进程通信ã€�存储器管ç�†ç­‰ã€‚ + +## 中断分类 + +### 1. 外中断 + +由 CPU 执行指令以外的事件引起,如 I/O 结æ�Ÿä¸­æ–­ï¼Œè¡¨ç¤ºè®¾å¤‡è¾“å…¥/输出处ç�†å·²ç»�完æˆ�,处ç�†å™¨èƒ½å¤Ÿå�‘é€�下一个输入/输出请求。此外还有时钟中断ã€�控制å�°ä¸­æ–­ç­‰ã€‚ + +### 2. 异常 + +由 CPU 执行指令的内部事件引起,如é�žæ³•æ“�作ç �ã€�地å�€è¶Šç•Œã€�算术溢出等。 + +### 3. 陷入 + +在用户程åº�中使用系统调用。 + +## 大内核和微内核 + +### 1. 大内核 + +大内核是将æ“�作系统功能作为一个紧密结å�ˆçš„æ•´ä½“放到内核,由于å�„模å�—共享信æ�¯ï¼Œå› æ­¤æœ‰å¾ˆé«˜çš„æ€§èƒ½ã€‚ + +### 2. 微内核 + +由于æ“�作系统ä¸�æ–­å¤�æ�‚,因此将一部分æ“�作系统功能移出内核,从而é™�低内核的å¤�æ�‚性。移出的部分根æ�®åˆ†å±‚的原则划分æˆ�若干æœ�务,相互独立。但是需è¦�频ç¹�地在用户æ€�和核心æ€�之间进行切æ�¢ï¼Œä¼šæœ‰ä¸€å®šçš„æ€§èƒ½æ�Ÿå¤±ã€‚ + +# 第二章 进程管ç�† + +## 进程与线程 + +### 1. 进程 + +进程是æ“�作系统进行资æº�分é…�的基本å�•ä½�。 + +进程控制å�— (Process Control Block, PCB) æ��述进程的基本信æ�¯å’Œè¿�行状æ€�,所谓的创建进程和撤销进程,都是指对 PCB 的æ“�作。 + +### 2. 线程 + +一个线程中å�¯ä»¥æœ‰å¤šä¸ªçº¿ç¨‹ï¼Œæ˜¯ç‹¬ç«‹è°ƒåº¦çš„基本å�•ä½�。å�Œä¸€ä¸ªè¿›ç¨‹ä¸­çš„多个线程之间å�¯ä»¥å¹¶å�‘执行,它们共享进程资æº�。 + +### 3. 区别 + +① 拥有资æº�:进程是资æº�分é…�的基本å�•ä½�,但是线程ä¸�拥有资æº�,线程å�¯ä»¥è®¿é—®çŽ‡å±žè¿›ç¨‹çš„èµ„æº�。 + +② 调度:线程是独立调度的基本å�•ä½�,在å�Œä¸€è¿›ç¨‹ä¸­ï¼Œçº¿ç¨‹çš„切æ�¢ä¸�会引起进程切æ�¢ï¼Œä»Žä¸€ä¸ªè¿›ç¨‹å†…的线程切æ�¢åˆ°å�¦ä¸€ä¸ªè¿›ç¨‹ä¸­çš„线程时,会引起进程切æ�¢ã€‚ + +③ 系统开销:由于创建或撤销进程时,系统都è¦�为之分é…�或回收资æº�,如内存空间ã€�I/O 设备等,因此æ“�作系统所付出的开销远大于创建或撤销线程时的开销。类似地,在进行进程切æ�¢æ—¶ï¼Œæ¶‰å�Šå½“å‰�执行进程 CPU 环境的ä¿�å­˜å�Šæ–°è°ƒåº¦è¿›ç¨‹Â CPU 环境的设置。而线程切æ�¢æ—¶å�ªéœ€ä¿�存和设置少é‡�寄存器内容,开销很å°�。此外,由于å�Œä¸€è¿›ç¨‹å†…的多个线程共享进程的地å�€ç©ºé—´ï¼Œå› æ­¤ï¼Œè¿™äº›çº¿ç¨‹ä¹‹é—´çš„å�Œæ­¥ä¸Žé€šä¿¡é�žå¸¸å®¹æ˜“实现,甚至无需æ“�作系统的干预。 + +④ 通信方é�¢ï¼šè¿›ç¨‹é—´é€šä¿¡Â (IPC) 需è¦�进程å�Œæ­¥å’Œäº’斥手段的辅助,以ä¿�è¯�æ•°æ�®çš„一致性,而线程间å�¯ä»¥é€šè¿‡ç›´æŽ¥è¯»/写进程数æ�®æ®µï¼ˆå¦‚全局å�˜é‡�)æ�¥è¿›è¡Œé€šä¿¡ã€‚ + +举例:QQ 和 æµ�览器是两个进程,æµ�览器进程里é�¢æœ‰å¾ˆå¤šçº¿ç¨‹ï¼Œä¾‹å¦‚ http 请求线程ã€�事件å“�应线程ã€�渲染线程等等,线程的并å�‘执行使得在æµ�览器中点击一个新链接从而å�‘起 http 请求时,æµ�览器还å�¯ä»¥å“�应用户的其它事件。 + +## 进程状æ€�的切æ�¢ + +![](index_files/1706ce58-a081-4fed-9b36-c3c0d7e22b3a.jpg) + +阻塞状æ€�是缺少需è¦�的资æº�从而由è¿�行状æ€�转æ�¢è€Œæ�¥ï¼Œä½†æ˜¯è¯¥èµ„æº�ä¸�包括 CPU,缺少 CPU 会让进程从è¿�行æ€�转æ�¢ä¸ºå°±ç»ªæ€�。 + +å�ªæœ‰å°±ç»ªæ€�å’Œè¿�行æ€�å�¯ä»¥ç›¸äº’转æ�¢ï¼Œå…¶å®ƒçš„都是å�•å�‘转æ�¢ã€‚就绪状æ€�的进程通过调度算法从而获得 CPU 时间,转为è¿�行状æ€�;而è¿�行状æ€�的进程,在分é…�给它的 CPU 时间片用完之å�Žå°±ä¼šè½¬ä¸ºå°±ç»ªçжæ€�,等待下一次调度。 + +## 调度算法 + +需è¦�针对ä¸�å�ŒçŽ¯å¢ƒæ�¥è®¨è®ºè°ƒåº¦ç®—法。 + +### 1. 批处ç�†ç³»ç»Ÿä¸­çš„调度 + +#### 1.1 先æ�¥å…ˆæœ�务(FCFS) + +first-come first-serverd。 + +调度最先进入就绪队列的作业。 + +有利于长作业,但ä¸�利于短作业,因为短作业必须一直等待å‰�é�¢çš„长作业执行完毕æ‰�能执行,而长作业å�ˆéœ€è¦�执行很长时间,造æˆ�了短作业等待时间过长。 + +#### 1.2 短作业优先(SJF) + +shortest job first。 + +调度估计è¿�行时间最短的作业。 + +长作业有å�¯èƒ½ä¼šé¥¿æ­»ï¼Œå¤„于一直等待短作业执行完毕的状æ€�。如果一直有短作业到æ�¥ï¼Œé‚£ä¹ˆé•¿ä½œä¸šæ°¸è¿œå¾—ä¸�到调度。 + +#### 1.3 最短剩余时间优先(SRTN) + +shortest remaining time next。 + +### 2. 交互å¼�系统中的调度 + +#### 2.1 优先æ�ƒä¼˜å…ˆ + +除了å�¯ä»¥æ‰‹åŠ¨èµ‹äºˆä¼˜å…ˆæ�ƒä¹‹å¤–,还å�¯ä»¥æŠŠå“�应比作为优先æ�ƒï¼Œè¿™ç§�调度方å¼�å�«å�šé«˜å“�应比优先调度算法。 + +å“�应比 = (等待时间 + è¦�求æœ�务时间) / è¦�求æœ�务时间 = å“�应时间 / è¦�求æœ�务时间 + +è¿™ç§�调度算法主è¦�是为了解决 SJF 中长作业å�¯èƒ½ä¼šé¥¿æ­»çš„问题,因为éš�ç�€ç­‰å¾…时间的增长,å“�应比也会越æ�¥è¶Šé«˜ã€‚ + +#### 2.2 时间片轮转 + +将所有就绪进程按 FCFS 的原则排æˆ�一个队列,æ¯�次调度时,把 CPU 分é…�给队首进程,该进程å�¯ä»¥æ‰§è¡Œä¸€ä¸ªæ—¶é—´ç‰‡ã€‚当时间片用完时,由计时器å�‘出时钟中断,调度程åº�便å�œæ­¢è¯¥è¿›ç¨‹çš„æ‰§è¡Œï¼Œå¹¶å°†å®ƒé€�往就绪队列的末尾,å�Œæ—¶ç»§ç»­æŠŠÂ CPU 分é…�给队首的进程。 + +时间片轮转算法的效率和时间片有很大关系。因为æ¯�次进程切æ�¢éƒ½è¦�ä¿�存进程的信æ�¯å¹¶ä¸”载入新进程的信æ�¯ï¼Œå¦‚果时间片太短,进程切æ�¢å¤ªé¢‘ç¹�,在进程切æ�¢ä¸Šå°±ä¼šèŠ±è¿‡å¤šæ—¶é—´ã€‚ + +#### 2.3 多级å��馈队列 + +![](index_files/042cf928-3c8e-4815-ae9c-f2780202c68f.png) + +① 设置多个就绪队列,并为å�„个队列赋予ä¸�å�Œçš„优先级。第一个队列的优先级最高,第二个队列次之,其余å�„队列的优先æ�ƒé€�个é™�低。该算法赋予å�„个队列中进程执行时间片的大å°�也å�„ä¸�相å�Œï¼Œåœ¨ä¼˜å…ˆæ�ƒè¶Šé«˜çš„队列中,为æ¯�个进程所规定的执行时间片就越å°�。 + +② 当一个新进程进入内存å�Žï¼Œé¦–先将它放入第一队列的末尾,按 FCFS 原则排队等待调度。当轮到该进程执行时,如它能在该时间片内完æˆ�,便å�¯å‡†å¤‡æ’¤ç¦»ç³»ç»Ÿï¼›å¦‚果它在一个时间片结æ�Ÿæ—¶å°šæœªå®Œæˆ�,调度程åº�便将该进程转入下一个队列的队尾。 + +③ 仅当å‰� i -1 个队列å�‡ç©ºæ—¶ï¼Œæ‰�会调度第 i 队列中的进程è¿�行。 + +优点:实时性好,也适å�ˆè¿�行短作业和长作业。 + +#### 2.4 短进程优先 + +### 3. 实时系统中的调度 + +实时系统è¦�一个æœ�务请求在一个确定时间内得到å“�应。 + +分为硬实时和软实时,å‰�者必须满足ç»�对的截止时间,å�Žè€…å�¯ä»¥å®¹å¿�一定的超时。 + +## 进程å�Œæ­¥ + +### 1. 临界区 + +对临界资æº�进行访问的那段代ç �称为临界区。 + +为了互斥访问临界资æº�,æ¯�个进程在进入临界区之å‰�,需è¦�先进行检查。 + +```html +// entry section +// critical section; +// exit section +``` + +### 2. å�Œæ­¥ä¸Žäº’æ–¥ + +å�Œæ­¥æŒ‡å¤šä¸ªè¿›ç¨‹æŒ‰ä¸€å®šé¡ºåº�执行;互斥指多个进程在å�Œä¸€æ—¶åˆ»å�ªæœ‰ä¸€ä¸ªè¿›ç¨‹èƒ½è¿›å…¥ä¸´ç•ŒåŒºã€‚ + +å�Œæ­¥æ˜¯åœ¨å¯¹ä¸´ç•ŒåŒºäº’斥访问的基础上,通过其它机制æ�¥å®žçŽ°æœ‰åº�访问的。 + +### 3. 信å�·é‡� + +**ä¿¡å�·é‡�(Samaphore)**是一个整型å�˜é‡�,å�¯ä»¥å¯¹å…¶æ‰§è¡ŒÂ down 和 up æ“�作,也就是常è§�的 P 和 V æ“�作。 + +- **down** : 如果信å�·é‡�大于 0 ,执行 - 1 æ“�作;如果信å�·é‡�等于 0,将进程ç�¡çœ ï¼Œç­‰å¾…ä¿¡å�·é‡�大于 0ï¼› +- **up**:对信å�·é‡�执行 + 1 æ“�作,并且唤醒ç�¡çœ çš„进程,让进程完æˆ� down æ“�作。 + +down 和 up æ“�作需è¦�被设计æˆ�原语,ä¸�å�¯åˆ†å‰²ï¼Œé€šå¸¸çš„å�šæ³•æ˜¯åœ¨æ‰§è¡Œè¿™äº›æ“�作的时候å±�蔽中断。 + +如果信å�·é‡�çš„å�–值å�ªèƒ½ä¸ºÂ 0 或者 1,那么就æˆ�为了**互斥é‡�(Mutex)**,0 表示临界区已ç»�加é”�,1 表示临界区解é”�。 + +```c +typedef int samaphore; +samaphore mutex = 1; +void P1() { +    down(mutex); +    // 临界区 +    up(mutex); +} + +void P2() { +    down(mutex); +    // 临界区 +    up(mutex); +} +``` + +**使用信å�·é‡�实现生产者-消费者问题** + +使用一个互斥é‡� mutex æ�¥å¯¹ä¸´ç•Œèµ„æº�进行访问;empty 记录空缓冲区的数é‡�,full 记录满缓冲区的数é‡�。 + +注æ„�,必须先执行 down æ“�作å†�用互斥é‡�对临界区加é”�,å�¦åˆ™ä¼šå‡ºçŽ°æ­»é”�。如果都先对临界区加é”�,然å�Žå†�执行 down æ“�作,考虑这ç§�情况:生产者对临界区加é”�å�Žï¼Œæ‰§è¡ŒÂ down(empty) æ“�作,å�‘现 empty = 0,此时生æˆ�者ç�¡çœ ã€‚消费者此时ä¸�能进入临界区,因为生产者对临界区加é”�了,也就无法对执行 up(empty) æ“�作,那么生产者和消费者就会一直等待下去。 + +```c +#define N 100 +typedef int samaphore; +samaphore mutex = 1; +samaphore empty = N; +samaphore full = 0; + +void producer() { +    while(TRUE){ +        int item = produce_item; +        down(empty); +        down(mutex); +        insert_item(item); +        up(mutex); +        up(full); +    } +} + +void consumer() { +    while(TRUE){ +        down(full); +        down(mutex); +        int item = remove_item(item); +        up(mutex); +        up(empty); +        consume_item(item); +    } +} +``` + +### 4. 管程 + +使用信å�·é‡�机制实现的生产者消费者问题需è¦�客户端代ç �å�šå¾ˆå¤šæŽ§åˆ¶ï¼Œè€Œç®¡ç¨‹æŠŠæŽ§åˆ¶çš„代ç �独立出æ�¥ï¼Œä¸�ä»…ä¸�容易出错,也使得客户端代ç �调用更容易。 + +c 语言ä¸�支æŒ�管程,下é�¢çš„示例代ç �使用了类 Pascal 语言æ�¥æ��述管程。示例代ç �中的管程æ��供了 insert() 和 remove() 方法,客户端代ç �通过调用这两个方法æ�¥è§£å†³ç”Ÿäº§è€…-消费者问题。 + +```html +monitor ProducerConsumer +    integer i; +    condition c; +     +    procedure insert(); +    begin +     +    end; +     +    procedure remove(); +    begin +     +    end; +end monitor; +``` + +管程有一个é‡�è¦�特性:在一个时刻å�ªèƒ½æœ‰ä¸€ä¸ªè¿›ç¨‹ä½¿ç”¨ç®¡ç¨‹ã€‚进程在无法继续执行的时候ä¸�能一直å� ç”¨ç®¡ç¨‹ï¼Œå¿…须将进程阻塞,å�¦è€…其它进程永远ä¸�能使用管程。 + +管程引入了 **æ�¡ä»¶å�˜é‡�** 以å�Šç›¸å…³çš„æ“�作:**wait()** 和 **signal()** æ�¥å®žçްå�Œæ­¥æ“�作。对æ�¡ä»¶å�˜é‡�执行 wait() æ“�作会导致调用进程阻塞,把管程让出æ�¥è®©å�¦ä¸€ä¸ªè¿›ç¨‹æŒ�有。signal() æ“�作用于唤醒被阻塞的进程。 + +**使用管程实现生æˆ�者-消费者问题** + +```html +monitor ProducerConsumer +    condition full, empty; +    integer count := 0; +    condition c; + +    procedure insert(item: integer); +    begin +        if count = N then wait(full); +        insert_item(item); +        count := count + 1; +        if count = 1 ten signal(empty); +    end; + +    function remove: integer; +    begin +        if count = 0 then wait(empty); +        remove = remove_item; +        count := count - 1; +        if count = N -1 then signal(full); +    end; +end monitor; + +procedure producer +begin +    while true do +    begin +        item = produce_item; +        ProducerConsumer.insert(item); +    end +end; + +procedure consumer +begin +    while true do +    begin +        item = ProducerConsumer.remove; +        consume_item(item); +    end +end; +``` + +## 进程通信 + +进程通信å�¯ä»¥çœ‹æˆ�是ä¸�å�Œè¿›ç¨‹é—´çš„线程通信,对于å�Œä¸€ä¸ªè¿›ç¨‹å†…线程的通信方å¼�,主è¦�使用信å�·é‡�ã€�æ�¡ä»¶å�˜é‡�ç­‰å�Œæ­¥æœºåˆ¶ã€‚ + +### 1. 管é�“ + +管é�“是å�•å�‘çš„ã€�先进先出的ã€�无结构的ã€�固定大å°�的字节æµ�,它把一个进程的标准输出和å�¦ä¸€ä¸ªè¿›ç¨‹çš„æ ‡å‡†è¾“入连接在一起。写进程在管é�“的尾端写入数æ�®ï¼Œè¯»è¿›ç¨‹åœ¨ç®¡é�“的首端读出数æ�®ã€‚æ•°æ�®è¯»å‡ºå�Žå°†ä»Žç®¡é�“中移走,其它读进程都ä¸�能å†�读到这些数æ�®ã€‚ + +管é�“æ��供了简å�•çš„æµ�控制机制,进程试图读空管é�“时,在有数æ�®å†™å…¥ç®¡é�“å‰�,进程将一直阻塞。å�Œæ ·åœ°ï¼Œç®¡é�“å·²ç»�满时,进程å†�试图写管é�“,在其它进程从管é�“中移走数æ�®ä¹‹å‰�,写进程将一直阻塞。 + +Linux 中管é�“是通过空文件æ�¥å®žçŽ°ã€‚ + +管é�“有三ç§�: + +① 普通管é�“:有两个é™�制:一是å�ªæ”¯æŒ�å�Šå�Œå·¥é€šä¿¡æ–¹å¼�,å�³å�ªèƒ½å�•å�‘传输;二是å�ªèƒ½åœ¨çˆ¶å­�进程之间使用; + +② æµ�管é�“:去除第一个é™�制,支æŒ�å�Œå�‘传输; + +③ 命å��管é�“:去除第二个é™�制,å�¯ä»¥åœ¨ä¸�相关进程之间进行通信。 + +### 2. 信å�·é‡� + +ä¿¡å�·é‡�是一个计数器,å�¯ä»¥ç”¨æ�¥æŽ§åˆ¶å¤šä¸ªè¿›ç¨‹å¯¹å…±äº«èµ„æº�的访问。它常作为一ç§�é”�机制,防止æŸ�进程正在访问共享资æº�时,其它进程也访问该资æº�。因此,主è¦�作为进程间以å�Šå�Œä¸€è¿›ç¨‹å†…ä¸�å�Œçº¿ç¨‹ä¹‹é—´çš„å�Œæ­¥æ‰‹æ®µã€‚ + +### 3. 消æ�¯é˜Ÿåˆ— + +消æ�¯é˜Ÿåˆ—å…‹æœ�了信å�·ä¼ é€’ä¿¡æ�¯å°‘ã€�管é�“å�ªèƒ½æ‰¿è½½æ— æ ¼å¼�字节æµ�以å�Šç¼“冲区大å°�å�—é™�等缺点。 + +### 4. 信å�· + +ä¿¡å�·æ˜¯ä¸€ç§�比较å¤�æ�‚的通信方å¼�,用于通知接收进程æŸ�个事件已ç»�å�‘生。 + +### 5. 共享内存 + +共享内存就是映射一段能被其它进程所访问的内存,这段共享内存由一个进程创建,但多个进程都å�¯ä»¥è®¿é—®ã€‚共享内存是最快的 IPC 方å¼�,它是针对其它进程间通信方å¼�è¿�行效率低而专门设计的。它往往与其它通信机制(如信å�·é‡�)é…�å�ˆä½¿ç”¨ï¼Œæ�¥å®žçŽ°è¿›ç¨‹é—´çš„å�Œæ­¥å’Œé€šä¿¡ã€‚ + +### 6. 套接字 + +套接字也是一ç§�进程间通信机制,与其它通信机制ä¸�å�Œçš„æ˜¯ï¼Œå®ƒå�¯ç”¨äºŽä¸�å�Œæœºå™¨é—´çš„进程通信。 + +## ç»�å…¸å�Œæ­¥é—®é¢˜ + +生产者和消费者问题å‰�é�¢å·²ç»�讨论过。 + +### 1. 读者-写者问题 + +å…�许多个进程å�Œæ—¶å¯¹æ•°æ�®è¿›è¡Œè¯»æ“�作,但是ä¸�å…�许读和写以å�Šå†™å’Œå†™æ“�作å�Œæ—¶å�‘生。 + +一个整型å�˜é‡� count 记录在对数æ�®è¿›è¡Œè¯»æ“�作的进程数é‡�,一个互斥é‡� count_mutex 用于对 count 加é”�,一个互斥é‡� data_mutex 用于对读写的数æ�®åŠ é”�。 + +```c +typedef int semaphore; +semaphore count_mutex = 1; +semaphore data_mutex = 1; +int count = 0; + +void reader() { +    while(TRUE) { +        down(count_mutex); +        count++; +        if(count == 1) down(data_mutex); // 第一个读者需è¦�对数æ�®è¿›è¡ŒåŠ é”�,防止写进程访问 +        up(count_mutex); +        read(); +        down(count_mutex); +        count--; +        if(count == 0) up(data_mutex); +        up(count_mutex); +    } +} + +void writer() { +    while(TRUE) { +        down(data_mutex); +        write(); +        up(data_mutex); +    } +} +``` + +### 2. 哲学家进é¤�问题 + +![](index_files/a9077f06-7584-4f2b-8c20-3a8e46928820.jpg) + +五个哲学家围ç�€ä¸€å¼ åœ†å‘¨ï¼Œæ¯�个哲学家é�¢å‰�放ç�€é¥­ã€‚哲学家的生活有两ç§�交替活动:å�ƒé¥­ä»¥å�Šæ€�考。当一个哲学家å�ƒé¥­æ—¶ï¼Œéœ€è¦�先一根一根拿起左å�³ä¸¤è¾¹çš„ç­·å­�。 + +下é�¢æ˜¯ä¸€ç§�错误的解法,考虑到如果æ¯�个哲学家å�Œæ—¶æ‹¿èµ·å·¦æ‰‹è¾¹çš„ç­·å­�,那么就无法拿起å�³æ‰‹è¾¹çš„ç­·å­�,造æˆ�æ­»é”�。 + +```c +#define N 5 +#define LEFT (i + N - 1) % N +#define RIGHT (i + N) % N +typedef int semaphore; +semaphore chopstick[N]; + +void philosopher(int i) { +    while(TURE){ +        think(); +        down(chopstick[LEFT[i]]); +        down(chopstick[RIGHT[i]]); +        eat(); +        up(chopstick[RIGHT[i]]); +        up(chopstick[LEFT[i]]); +    } +} +``` + +为了防止死é”�çš„å�‘生,å�¯ä»¥åŠ ä¸€ç‚¹é™�制,å�ªå…�许å�Œæ—¶æ‹¿èµ·å·¦å�³ä¸¤è¾¹çš„ç­·å­�,方法是引入一个互斥é‡�,对拿起两个筷å­�的那段代ç �加é”�。 + +```c +semaphore mutex = 1; + +void philosopher(int i) { +    while(TURE){ +        think(); +        down(mutex); +        down(chopstick[LEFT[i]]); +        down(chopstick[RIGHT[i]]); +        up(mutex); +        eat(); +        down(mutex); +        up(chopstick[RIGHT[i]]); +        up(chopstick[LEFT[i]]); +        up(mutex); +    } +} +``` + +# 第三章 死é”� + +## 死é”�çš„æ�¡ä»¶ + +![](index_files/c037c901-7eae-4e31-a1e4-9d41329e5c3e.png) + +1. 互斥 +2. 请求与ä¿�æŒ�:一个进程因请求资æº�而阻塞时,对已获得的资æº�ä¿�æŒ�ä¸�放。 +3. ä¸�å�¯æŠ¢å�  +4. 环路等待 + +## 死é”�的处ç�†æ–¹æ³• + +### 1. 鸵鸟策略 + +把头埋在沙å­�里,å�‡è£…根本没å�‘生问题。 + +è¿™ç§�ç­–ç•¥ä¸�å�¯å�–。 + +### 2. 死é”�预防 + +在程åº�è¿�行之å‰�预防å�‘生死é”�。 + +#### 2.1 破å��互斥æ�¡ä»¶ + +例如å�‡è„±æœºæ‰“å�°æœºæŠ€æœ¯å…�许若干个进程å�Œæ—¶è¾“出,唯一真正请求物ç�†æ‰“å�°æœºçš„进程是打å�°æœºå®ˆæŠ¤è¿›ç¨‹ã€‚ + +#### 2.2 破å��请求与ä¿�æŒ�æ�¡ä»¶ + +一ç§�实现方å¼�是规定所有进程在开始执行å‰�请求所需è¦�的全部资æº�。 + +#### 2.3 破å��ä¸�å�¯æŠ¢å� æ�¡ä»¶ + +#### 2.4 破å��环路等待 + +给资æº�统一编å�·ï¼Œè¿›ç¨‹å�ªèƒ½æŒ‰ç¼–å�·é¡ºåº�æ�¥è¯·æ±‚资æº�。 + +### 3. 死é”�é�¿å…� + +在程åº�è¿�行时é�¿å…�å�‘生死é”�。 + +#### 3.1 安全状æ€� + +![](index_files/ed523051-608f-4c3f-b343-383e2d194470.png) + +图 a 的第二列 has 表示已拥有的资æº�数,第三列 max 表示总共需è¦�的资æº�数,free 表示还有å�¯ä»¥ä½¿ç”¨çš„资æº�数。从图 a 开始出å�‘,先让 B 拥有所需的所有资æº�,è¿�行结æ�Ÿå�Žé‡Šæ”¾Â B,此时 free å�˜ä¸ºÂ 4;接ç�€ä»¥å�Œæ ·çš„æ–¹å¼�è¿�行 C 和 A,使得所有进程都能æˆ�功è¿�行,因此å�¯ä»¥ç§°å›¾Â a 所示的状æ€�时安全的。 + +定义:如果没有死é”�å�‘生,并且å�³ä½¿æ‰€æœ‰è¿›ç¨‹çª�然请求对资æº�的最大需求,也ä»�然存在æŸ�ç§�调度次åº�能够使得æ¯�一个进程è¿�行完毕,则称该状æ€�是安全的。 + +#### 3.2 å�•个资æº�的银行家算法 + +一个å°�城镇的银行家,他å�‘一群客户分别承诺了一定的贷款é¢�度,算法è¦�å�šçš„æ˜¯åˆ¤æ–­å¯¹è¯·æ±‚的满足是å�¦ä¼šè¿›å…¥ä¸�安全状æ€�,如果是,就拒ç»�请求;å�¦åˆ™äºˆä»¥åˆ†é…�。 + +![](index_files/d160ec2e-cfe2-4640-bda7-62f53e58b8c0.png) + +上图 c 为ä¸�安全状æ€�,因此算法会拒ç»�之å‰�的请求,从而é�¿å…�进入图 c 中的状æ€�。 + +#### 3.3 多个资æº�的银行家算法 + +![](index_files/62e0dd4f-44c3-43ee-bb6e-fedb9e068519.png) + +上图中有五个进程,四个资æº�。左边的图表示已ç»�分é…�的资æº�,å�³è¾¹çš„图表示还需è¦�分é…�的资æº�。最å�³è¾¹çš„ Eã€�P 以å�ŠÂ A 分别表示:总资æº�ã€�已分é…�资æº�以å�Šå�¯ç”¨èµ„æº�,注æ„�这三个为å�‘é‡�,而ä¸�是具体数值,例如 A=(1020),表示 4 个资æº�分别还剩下 1/0/2/0。 + +检查一个状æ€�是å�¦å®‰å…¨çš„算法如下: + +① 查找å�³è¾¹çš„矩阵是å�¦å­˜åœ¨ä¸€è¡Œå°�于等于å�‘é‡� A。如果ä¸�存在这样的行,那么系统将会å�‘生死é”�,状æ€�是ä¸�安全的。 + +② å�‡è‹¥æ‰¾åˆ°è¿™æ ·ä¸€è¡Œï¼Œå°†è¯¥è¿›ç¨‹æ ‡è®°ä¸ºç»ˆæ­¢ï¼Œå¹¶å°†å…¶å·²åˆ†é…�资æº�加到 A 中。 + +③ é‡�å¤�以上两步,直到所有进程都标记为终止,则状æ€�时安全的。 + +### 4. 死é”�检测与死é”�æ�¢å¤� + +ä¸�试图组织死é”�,而是当检测到死é”�å�‘生时,采å�–措施进行æ�¢å¤�。 + +#### 4.1 死é”�检测算法 + +æ­»é”�检测的基本æ€�想是,如果一个进程所请求的资æº�能够被满足,那么就让它执行,释放它拥有的所有资æº�,然å�Žè®©å…¶å®ƒèƒ½æ»¡è¶³æ�¡ä»¶çš„进程执行。 + +![](index_files/e1eda3d5-5ec8-4708-8e25-1a04c5e11f48.png) + +上图中,有三个进程四个资æº�,æ¯�个数æ�®ä»£è¡¨çš„å�«ä¹‰å¦‚下: + +E å�‘é‡�:资æº�总é‡� +A å�‘é‡�:资æº�剩余é‡� +C 矩阵:æ¯�个进程所拥有的资æº�æ•°é‡�,æ¯�一行都代表一个进程拥有资æº�的数é‡� +R 矩阵:æ¯�个进程请求的资æº�æ•°é‡� + +进程 P1 和 P2 所请求的资æº�都得ä¸�到满足,å�ªæœ‰è¿›ç¨‹Â P3 å�¯ä»¥ï¼Œè®©Â P3 执行,之å�Žé‡Šæ”¾Â P3 拥有的资æº�,此时 A = (2 2 2 0)。P1 å�¯ä»¥æ‰§è¡Œï¼Œæ‰§è¡Œå�Žé‡Šæ”¾Â P1 拥有的资æº�, A = (4 2 2 2) ,P2 也å�¯ä»¥æ‰§è¡Œã€‚所有进程都å�¯ä»¥é¡ºåˆ©æ‰§è¡Œï¼Œæ²¡æœ‰æ­»é”�。 + +算法总结如下: + +æ¯�个进程最开始时都ä¸�被标记,执行过程有å�¯èƒ½è¢«æ ‡è®°ã€‚当算法结æ�Ÿæ—¶ï¼Œä»»ä½•没有被标记的进程都是死é”�进程。 + +① 寻找一个没有标记的进程 Pi,它所请求的资æº�å°�于等于 A。 +② 如果找到了这样一个进程,那么将 C 矩阵的第 i 行å�‘é‡�加到 A 中,标记该进程,并转回 ①。 +③ 如果有没有这样一个进程,算法终止。 + +#### 4.2 死é”�æ�¢å¤� + +① 利用抢å� æ�¢å¤� +② æ�€æ­»è¿›ç¨‹ + +# 第四章 存储器管ç�† + +## 虚拟内存 + +æ¯�个程åº�拥有自己的地å�€ç©ºé—´ï¼Œè¿™ä¸ªåœ°å�€ç©ºé—´è¢«åˆ†å‰²æˆ�多个å�—,æ¯�一å�—称为一 页。这些页被映射到物ç�†å†…存,但ä¸�需è¦�映射到连续的物ç�†å†…存,也ä¸�需è¦�所有页都必须在物ç�†å†…存中。 + +当程åº�引用到一部分在物ç�†å†…存中的地å�€ç©ºé—´æ—¶ï¼Œç”±ç¡¬ä»¶ç«‹å�³æ‰§è¡Œå¿…è¦�的映射。当程åº�引用到一部分ä¸�在物ç�†å†…存中的地å�€ç©ºé—´æ—¶ï¼Œç”±æ“�作系统负责将缺失的部分装入物ç�†å†…存并é‡�新执行失败的指令。 + +## 分页与分段 + +### 1. 分页 + +用户程åº�的地å�€ç©ºé—´è¢«åˆ’分为若干固定大å°�的区域,称为“页â€�。相应地,内存空间分æˆ�若干个物ç�†å�—,页和å�—的大å°�相等。å�¯å°†ç”¨æˆ·ç¨‹åº�的任一页放在内存的任一å�—中,实现了离散分é…�,由一个页表æ�¥ç»´æŠ¤å®ƒä»¬ä¹‹é—´çš„æ˜ å°„关系。 + +### 2. 分段 + +![](index_files/22de0538-7c6e-4365-bd3b-8ce3c5900216.png) + +上图为一个编译器在编译过程中建立的多个表,有 4 个表是动æ€�增长的,如果使用分页系统的一维地å�€ç©ºé—´ï¼ŒåЍæ€�递增的特点会导致覆盖问题的出现。 + +![](index_files/e0900bb2-220a-43b7-9aa9-1d5cd55ff56e.png) + +分段的å�šæ³•æ˜¯æŠŠæ¯�个表分æˆ�段,一个段构æˆ�一个独立的地å�€ç©ºé—´ã€‚æ¯�个段的长度å�¯ä»¥ä¸�å�Œï¼Œå�¯ä»¥åЍæ€�改å�˜ã€‚ + +æ¯�个段都需è¦�程åº�员æ�¥åˆ’分。 + +### 3. 段页å¼� + +用分段方法æ�¥åˆ†é…�和管ç�†è™šæ‹Ÿå­˜å‚¨å™¨ã€‚程åº�的地å�€ç©ºé—´æŒ‰é€»è¾‘å�•ä½�分æˆ�基本独立的段,而æ¯�一段有自己的段å��,å†�把æ¯�段分æˆ�固定大å°�的若干页。 + +用分页方法æ�¥åˆ†é…�和管ç�†å®žå­˜ã€‚å�³æŠŠæ•´ä¸ªä¸»å­˜åˆ†æˆ�与上述页大å°�相等的存储å�—,å�¯è£…入作业的任何一页。程åº�对内存的调入或调出是按页进行的。但它å�ˆå�¯æŒ‰æ®µå®žçŽ°å…±äº«å’Œä¿�护。 + +### 4. 分页与分段区别 + +① 对程åº�员的é€�明性:分页é€�明,但是分段需è¦�程åº�员显示划分æ¯�个段。 + +② 地å�€ç©ºé—´çš„维度:分页是一维地å�€ç©ºé—´ï¼Œåˆ†æ®µæ˜¯äºŒç»´çš„。 + +③ 大å°�是å�¦å�¯ä»¥æ”¹å�˜ï¼šé¡µçš„大å°�ä¸�å�¯å�˜ï¼Œæ®µçš„大å°�å�¯ä»¥åЍæ€�改å�˜ã€‚ + +④ 出现的原因:分页主è¦�用于实现虚拟内存,从而获得更大的地å�€ç©ºé—´ï¼›åˆ†æ®µä¸»è¦�是为了使程åº�和数æ�®å�¯ä»¥è¢«åˆ’分为逻辑上独立的地å�€ç©ºé—´å¹¶ä¸”有助于共享和ä¿�护。 + +## 页é�¢ç½®æ�¢ç®—法 + +在程åº�è¿�行过程中,若其所è¦�访问的页é�¢ä¸�在内存而需è¦�把它们调入内存,但是内存已无空闲空间时,系统必须从内存中调出一个页é�¢åˆ°ç£�盘对æ�¢åŒºä¸­ï¼Œå¹¶ä¸”将程åº�所需è¦�的页é�¢è°ƒå…¥å†…存中。页é�¢ç½®æ�¢ç®—法的主è¦�目标是使页é�¢ç½®æ�¢é¢‘率最低(也å�¯ä»¥è¯´ç¼ºé¡µçŽ‡æœ€ä½Žï¼‰ã€‚ + +### 1. 最佳(Optimal) + +所选择的被æ�¢å‡ºçš„页é�¢å°†æ˜¯æœ€é•¿æ—¶é—´å†…ä¸�å†�被访问,通常å�¯ä»¥ä¿�è¯�获得最低的缺页率。 + +是一ç§�ç�†è®ºä¸Šçš„算法,因为无法知é�“一个页é�¢å¤šé•¿æ—¶é—´ä¼šè¢«å†�访问到。 + +举例:一个系统为æŸ�进程分é…�了三个物ç�†å�—,并有如下页é�¢å¼•用åº�列: + +7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1 + +进程è¿�行时,先将 7,0,1 三个页é�¢è£…入内存。当进程è¦�访问页é�¢Â 2 时,产生缺页中断,会将页é�¢Â 7 æ�¢å‡ºï¼Œå› ä¸ºé¡µé�¢Â 7 å†�次被访问的时间最长。 + +### 2. 先进先出(FIFO) + +所选择æ�¢å‡ºçš„页é�¢æ˜¯æœ€å…ˆè¿›å…¥çš„页é�¢ã€‚ + +该算法会将那些ç»�常被访问的页é�¢ä¹Ÿè¢«æ�¢å‡ºï¼Œä»Žè€Œä½¿ç¼ºé¡µçއå�‡é«˜ã€‚ + +### 3. 最近最久未使用(LRU,Least Recently Used) + +虽然无法知é�“å°†æ�¥è¦�使用的页é�¢æƒ…况,但是å�¯ä»¥çŸ¥é�“过去使用页é�¢çš„æƒ…况。LRU 将最近最久未使用的页é�¢æ�¢å‡ºã€‚ + +å�¯ä»¥ç”¨æ ˆæ�¥å®žçŽ°è¯¥ç®—æ³•ï¼Œæ ˆä¸­å­˜å‚¨é¡µé�¢çš„页é�¢å�·ã€‚当进程访问一个页é�¢æ—¶ï¼Œå°†è¯¥é¡µé�¢çš„页é�¢å�·ä»Žæ ˆç§»é™¤ï¼Œå¹¶å°†å®ƒåŽ‹å…¥æ ˆé¡¶ï¼Œè¿™æ ·ï¼Œæœ€è¿‘è¢«è®¿é—®çš„é¡µé�¢çš„页é�¢å�·æ€»æ˜¯åœ¨æ ˆé¡¶ï¼Œè€Œæœ€è¿‘最久未使用的页é�¢çš„页é�¢å�·æ€»æ˜¯åœ¨æ ˆåº•。 + +4,7,0,7,1,0,1,2,1,2,6 + +![](index_files/eb859228-c0f2-4bce-910d-d9f76929352b.png) + +### 4. 时钟(Clock) + +Clock 页é�¢ç½®æ�¢ç®—法需è¦�用到一个访问ä½�,当一个页é�¢è¢«è®¿é—®æ—¶ï¼Œå°†è®¿é—®ä¸ºç½®ä¸ºÂ 1。 + +首先,将内存中的所有页é�¢é“¾æŽ¥æˆ�一个循环队列,当缺页中断å�‘生时,检查当å‰�指针所指å�‘页é�¢çš„访问ä½�,如果访问ä½�为 0,就将该页é�¢æ�¢å‡ºï¼›å�¦åˆ™å°†è¯¥é¡µçš„访问ä½�设置为 0,给该页é�¢ç¬¬äºŒæ¬¡çš„æœºä¼šï¼Œç§»åŠ¨æŒ‡é’ˆç»§ç»­æ£€æŸ¥ã€‚ + +# 第五章 设备管ç�† + +## ç£�盘调度算法 + +当多个进程å�Œæ—¶è¯·æ±‚访问ç£�盘时,需è¦�进行ç£�盘调度æ�¥æŽ§åˆ¶å¯¹ç£�盘的访问。ç£�盘调度的主è¦�目标是使ç£�盘的平å�‡å¯»é�“时间最少。 + +### 1. 先æ�¥å…ˆæœ�务(FCFS,First Come First Serverd) + +æ ¹æ�®è¿›ç¨‹è¯·æ±‚访问ç£�盘的先å�Žæ¬¡åº�æ�¥è¿›è¡Œè°ƒåº¦ã€‚优点是公平和简å�•,缺点也很明显,因为未对寻é�“å�šä»»ä½•优化,使平å�‡å¯»é�“æ—¶é—´å�¯èƒ½è¾ƒé•¿ã€‚ + +### 2. 最短寻é�“时间优先(SSTF,Shortest Seek Time First) + +è¦�求访问的ç£�é�“与当å‰�ç£�头所在ç£�é�“è·�离最近的优先进行调度。这ç§�算法并ä¸�能ä¿�è¯�å¹³å�‡å¯»é�“时间最短,但是比 FCFS 好很多。 + +### 3. 扫æ��算法(SCAN) + +SSTF 会出现进行饥饿现象。考虑以下情况,新进程请求访问的ç£�é�“与ç£�头所在ç£�é�“çš„è·�离总是比一个在等待的进程æ�¥çš„近,那么等待的进程会一直等待下去。 + +SCAN 算法在 SSTF 算法之上考虑了ç£�头的移动方å�‘,è¦�求所请求访问的ç£�é�“在ç£�头当å‰�移动方å�‘上æ‰�能够得到调度。因为考虑了移动方å�‘,那么一个进程请求访问的ç£�é�“一定会得到调度。 + +当一个ç£�头自里å�‘外移动时,移到最外侧会改å�˜ç§»åŠ¨æ–¹å�‘为自外å�‘里,这ç§�移动的规律类似于电梯的è¿�行,因此å�ˆå¸¸ç§°Â SCAN 算法为电梯调度算法。 + +### 4. 循环扫æ��算法(CSCAN) + +CSCAN 对 SCAN 进行了改动,è¦�求ç£�头始终沿ç�€ä¸€ä¸ªæ–¹å�‘移动。 + +# å�‚考资料 + +- Tanenbaum A S, Bos H. Modern operating systems[M]. Prentice Hall Press, 2014. + +- 汤å­�瀛, 哲凤å±�, 汤å°�丹. 计算机æ“�作系统[M]. 西安电å­�科技大学出版社, 2001. + +- Bryant, R. E., & O’Hallaron, D. R. (2004). 深入ç�†è§£è®¡ç®—机系统. + +- [å°�土刀的é�¢è¯•刷题笔记](http://wdxtub.com/interview/index.html) + +- [进程间的几ç§�通信方å¼�](http://blog.csdn.net/yufaw/article/details/7409596) \ No newline at end of file diff --git a/notes/笔记/计算机网络+.md.txt b/notes/笔记/计算机网络+.md.txt new file mode 100644 index 00000000..6f5b71df --- /dev/null +++ b/notes/笔记/计算机网络+.md.txt @@ -0,0 +1,21 @@ +## Web 页é�¢è¯·æ±‚过程 + +1. å�‘ DNS æœ�务器å�‘é€� DNS 查询报文æ�¥è§£æž�域å��。 + +2. 在è¿�输层,DNS 查询报文会放入端å�£å�·ä¸ºÂ 53 的 UDP 数æ�®æŠ¥ä¸­ã€‚ + +3. 在网络层,UDP 数æ�®æŠ¥å°�装进 IP 分组中,路由器会执行路由选择算法æ�¥è½¬å�‘分组。 + +4. 在链路层,IP 分组会å°�装进链路层帧中,此时需è¦�使用 ARP æ�¥æŸ¥è¯¢Â MAC 地å�€ï¼Œé€šè¿‡Â ARP 得到 MAC 地å�€ä¹‹å�Žå°±å�¯ä»¥è¿›è¡Œé“¾è·¯å±‚传输了。 + +5. 在 DNS æœ�务器返回域å��的 IP 地å�€å�Žï¼Œå°±å�¯ä»¥å¼€å§‹è¿›è¡ŒÂ HTTP 会è¯�了。 + +6. è¦�进行 HTTP 会è¯�,需è¦�建立 TCP 连接。TCP 连接的建立需è¦�进行进行 TCP 的三次æ�¡æ‰‹ã€‚TCP 连接建立å�Žä¼šä¿�æŒ�æŒ�久连接。 + +7. 客户端å�‘é€� HTTP 请求报文,请求获å�–页é�¢ã€‚ + +8. 如果存在缓存æœ�务器,并且缓存æœ�务器上有该页é�¢ï¼Œé‚£ä¹ˆç¼“å­˜æœ�务器通过 HTTP å“�应报文å�‘客户端å�‘é€�缓存的页é�¢ã€‚å�¦åˆ™ï¼Œæœ�务器å�‘é€�该页é�¢ã€‚ + +9. æµ�览器得到页é�¢å†…容之å�Žï¼Œè§£æž�并渲染,å�‘用户展示页é�¢ã€‚ + +10. 当客户端ä¸�å†�需è¦�连接时,å�‘é€�的 HTTP 请求报文中包å�«Â Connection: close 字段,从而释放 TCP 连接,TCP 连接的释放需è¦�进行四次æ�¡æ‰‹è¿‡ç¨‹ã€‚ diff --git a/notes/笔记/计算机网络.md.txt b/notes/笔记/计算机网络.md.txt new file mode 100644 index 00000000..cf5e74cd --- /dev/null +++ b/notes/笔记/计算机网络.md.txt @@ -0,0 +1,760 @@ +[TOC] + +# 第一章 概述 + +## 网络的网络 + +网络把主机连接起æ�¥ï¼Œè€Œäº’è�”网是把多ç§�ä¸�å�Œçš„网络连接起æ�¥ï¼Œå› æ­¤äº’è�”网是网络的网络。 + +![](index_files/04ff7ae6-7bee-4cf8-82f8-dfe2ba1f3616.jpg) + +## ISP + +互è�”网æœ�务æ��供商 ISP å�¯ä»¥ä»Žäº’è�”网管ç�†æœºæž„获得许多 IP 地å�€ï¼Œå�Œæ—¶æ‹¥æœ‰é€šä¿¡çº¿è·¯ä»¥å�Šè·¯ç”±å™¨ç­‰è�”网设备,个人或机构å�‘ ISP 缴纳一定的费用就å�¯ä»¥æŽ¥å…¥äº’è�”网。 + +ç›®å‰�的互è�”网是一ç§�多层次 ISP 结构,ISP 根æ�®è¦†ç›–é�¢ç§¯çš„大å°�分为主干 ISPã€�地区 ISP 和本地 ISP。 + +互è�”网交æ�¢ç‚¹Â IXP å…�许两个网络直接相连而ä¸�用ç»�过第三个æ�¥è½¬å�‘分组。 + +![](index_files/17d807ef-03bf-4824-a97c-ea5fb58ec61d.jpg) + +## 互è�”网的组æˆ� + +1. 边缘部分:所有连接在互è�”网上的主机。用户å�¯ä»¥ç›´æŽ¥ä½¿ç”¨ï¼› +2. 核心部分:由大é‡�的网络和连接这些网络的路由器组æˆ�。为边缘部分的主机æ��ä¾›æœ�务。 + +![](index_files/005d83c2-e64a-41f0-bbdd-51c71d494a18.jpg) + +## 主机之间的通信方å¼� + +**1. 客户 - æœ�务器(C/S)** + +客户å�³æ˜¯æœ�务请求方,æœ�务器是æœ�务æ��供方。 + +**2. 对等(P2P)** + +ä¸�区分客户和æœ�务器。 + +## 电路交æ�¢ä¸Žåˆ†ç»„交æ�¢ + +![](index_files/b97958dd-3e43-45f7-97f5-3ec20f3f8b88.jpg) + +### 1. 电路交æ�¢ + +电路交æ�¢ç”¨äºŽç”µè¯�通信系统,两个用户è¦�通信之å‰�需è¦�建立一æ�¡ä¸“用的物ç�†é“¾è·¯ï¼Œå¹¶ä¸”在整个通信过程中始终å� ç”¨è¯¥é“¾è·¯ã€‚由于通信的过程中ä¸�å�¯èƒ½ä¸€ç›´åœ¨ä½¿ç”¨ä¼ è¾“线路,因此电路交æ�¢å¯¹çº¿è·¯çš„利用率很低,往往ä¸�到 10%。 + +### 2. 报文交æ�¢ + +报文交æ�¢ç”¨äºŽé‚®å±€é€šä¿¡ç³»ç»Ÿï¼Œé‚®å±€æŽ¥æ”¶åˆ°ä¸€ä»½æŠ¥æ–‡ä¹‹å�Žï¼Œå…ˆå­˜å‚¨ä¸‹æ�¥ï¼Œç„¶å�Žæ ¹æ�®ç›®çš„地选择性地把报文转å�‘到下一个目的地,这个过程就是存储转å�‘过程。 + +### 3. 分组交æ�¢ + +分组交æ�¢ä¹Ÿä½¿ç”¨äº†å­˜å‚¨è½¬å�‘,但是转å�‘的是分组而ä¸�是报文。把整å�—æ•°æ�®ç§°ä¸ºä¸€ä¸ªæŠ¥æ–‡ï¼Œç”±äºŽä¸€ä¸ªæŠ¥æ–‡å�¯èƒ½å¾ˆé•¿ï¼Œéœ€è¦�先进行切分,æ�¥æ»¡è¶³åˆ†ç»„能处ç�†çš„大å°�。在æ¯�个切分的数æ�®å‰�é�¢åŠ ä¸Šé¦–éƒ¨ä¹‹å�Žå°±æˆ�为了分组,首部包å�«äº†ç›®çš„地å�€å’Œæº�地å�€ç­‰æŽ§åˆ¶ä¿¡æ�¯ã€‚ + +![](index_files/6f4af159-8b03-4246-8d0e-222db65bb83c.jpg) + +存储转å�‘å…�许在一æ�¡ä¼ è¾“线路上传é€�多个主机的分组,也就是分组交æ�¢ä¸�需è¦�å� ç”¨ç«¯åˆ°ç«¯çš„线路资æº�。 + +相比于报文交æ�¢ï¼Œç”±äºŽåˆ†ç»„比报文更å°�,存储转å�‘的速度也就更快。 + +## 时延 + +总时延 = å�‘é€�时延 + 传播时延 + 处ç�†æ—¶å»¶Â + 排队时延 + +![](index_files/ceee91c2-da26-4169-94c3-e4608b46b9ac.png) + + +### 1. å�‘é€�æ—¶å»¶ + +主机或路由器å�‘é€�æ•°æ�®å¸§æ‰€éœ€è¦�的时间。 + +$$ delay = \frac{l(bit)}{v(bit/s)} $$ + +其中 l 表示数æ�®å¸§çš„长度,v 表示å�‘é€�速率。 + +### 2. 传播时延 + +电ç£�波在信é�“中传播一定的è·�离需è¦�花费的时间,电ç£�波传播速度接近光速。 + +$$ delay = \frac{l(m)}{v(m/s)} $$ + +其中 l 表示信é�“长度,v 表示电ç£�波在信é�“上的传播速率。 + +### 3. 处ç�†æ—¶å»¶ + +主机或路由器收到分组时进行处ç�†æ‰€éœ€è¦�的时间,例如分æž�首部,从分组中æ��å�–æ•°æ�®éƒ¨åˆ†ç­‰ã€‚ + +### 4. 排队时延 + +分组在路由器的输入队列和输出队列中排队等待的时间,å�–决于网络当å‰�的通信é‡�。 + +## 计算机网络体系结构* + +![](index_files/1005dc9d-9049-4b06-9524-6171e56ebd8c.png) + +### 1. 七层å��è®® + +如图 a 所示,其中表示层和会è¯�层用途如下: + +1. 表示层:信æ�¯çš„语法语义以å�Šå®ƒä»¬çš„å…³è�”,如加密解密ã€�转æ�¢ç¿»è¯‘ã€�压缩解压缩; +2. 会è¯�层:ä¸�å�Œæœºå™¨ä¸Šçš„用户之间建立å�Šç®¡ç�†ä¼šè¯�。 + +### 2. 五层å��è®® + +1. 应用层:为特定应用程åº�æ��供数æ�®ä¼ è¾“æœ�务,例如 HTTPã€�DNS 等。数æ�®å�•ä½�为报文。 + +2. è¿�输层:æ��供的是进程间的通用数æ�®ä¼ è¾“æœ�务。由于应用层å��议很多,定义通用的è¿�输层å��议就å�¯ä»¥æ”¯æŒ�ä¸�断增多的应用层å��议。è¿�输层包括两ç§�å��议:传输控制å��议 TCP,æ��ä¾›é�¢å�‘连接ã€�å�¯é� çš„æ•°æ�®ä¼ è¾“æœ�务,数æ�®å�•ä½�为报文段;用户数æ�®æŠ¥å��议 UDP,æ��供无连接ã€�尽最大努力的数æ�®ä¼ è¾“æœ�务,数æ�®å�•ä½�为用户数æ�®æŠ¥ã€‚ + +3. 网络层:为主机之间æ��ä¾›æœ�务,而ä¸�是åƒ�è¿�输层å��议那样是为主机中的进程æ��ä¾›æœ�务。网络层把è¿�输层产生的报文段或者用户数æ�®æŠ¥å°�装æˆ�分组æ�¥è¿›è¡Œä¼ è¾“。 + +4. 数æ�®é“¾è·¯å±‚:网络层针对的还是主机之间,而主机之间å�¯ä»¥æœ‰å¾ˆå¤šé“¾è·¯ï¼Œé“¾è·¯å±‚å��议就是为相邻结点之间æ��ä¾›æœ�务。数æ�®é“¾è·¯å±‚把网络层传æ�¥çš„分组å°�装æˆ�帧。 + +5. 物ç�†å±‚:考虑的是怎样在传输媒体上传输数æ�®æ¯”特æµ�,而ä¸�是指具体的传输媒体。物ç�†å±‚的作用是尽å�¯èƒ½å±�蔽传输媒体和通信手段的差异,使物ç�†å±‚上的数æ�®é“¾è·¯å±‚感觉ä¸�到这些差异。 + +### 3. 数æ�®åœ¨å�„层之间的传递过程 + +在å�‘下的过程中,需è¦�添加下层å��议所需è¦�的首部或者尾部,而在å�‘上的过程中ä¸�断拆开首部和尾部。 + +路由器å�ªæœ‰ä¸‹é�¢ä¸‰å±‚å��议,因为路由器ä½�于网络核心中,ä¸�需è¦�为进程或者应用程åº�æ��ä¾›æœ�务。 + +![](index_files/f7d5da89-2d75-4d8f-85e7-6b608865dc00.jpg) + +### 4. TCP/IP 体系结构 + +它å�ªæœ‰å››å±‚,相当于五层å��议中数æ�®é“¾è·¯å±‚和物ç�†å±‚å�ˆå¹¶ä¸ºç½‘络接å�£å±‚。 + +现在的 TCP/IP 体系结构ä¸�严格é�µå¾ªÂ OSI 分层概念,应用层å�¯èƒ½ä¼šç›´æŽ¥ä½¿ç”¨Â IP 层或者网络接å�£å±‚。 + +![](index_files/3e2200b3-1c18-4853-ae42-7788e8e1f939.png) + +TCP/IP å��è®®æ—�是一ç§�æ²™æ¼�形状,中间å°�两边大,IP å��议在其中å� ç”¨ä¸¾è¶³è½»é‡�的地ä½�。 + +![](index_files/9ecaebee-670e-4cb2-9cdb-3029c00f33bd.png) + +# 第二章 物ç�†å±‚ + +## 通信方å¼� + +1. å�•å�‘通信,å�ˆç§°ä¸ºå�•工通信; +2. å�Œå�‘交替通信,å�ˆç§°ä¸ºå�Šå�Œå·¥é€šä¿¡ï¼› +3. å�Œå�‘å�Œæ—¶é€šä¿¡ï¼Œå�ˆç§°ä¸ºå…¨å�Œå·¥é€šä¿¡ã€‚ + +## 带通调制 + +模拟信å�·æ˜¯è¿žç»­çš„ä¿¡å�·ï¼Œæ•°å­—ä¿¡å�·æ˜¯ç¦»æ•£çš„ä¿¡å�·ã€‚带通调制把数字信å�·è½¬æ�¢ä¸ºæ¨¡æ‹Ÿä¿¡å�·ã€‚ + +![](index_files/d2c55c84-aa1f-43c1-bd97-457bcb7816b3.png) + +## 信é�“å¤�用技术 + +### 1. 频分å¤�用ã€�时分å¤�用 + +频分å¤�用的所有用户在相å�Œçš„æ—¶é—´å� ç”¨ä¸�å�Œçš„频率带宽资æº�;时分å¤�用的所有用户在ä¸�å�Œçš„æ—¶é—´å� ç”¨ç›¸å�Œçš„频率带宽资æº�。 + +使用这两ç§�æ–¹å¼�进行通信,在通信的过程中用户会一直å� ç”¨ä¸€éƒ¨åˆ†ä¿¡é�“资æº�。但是由于计算机数æ�®çš„çª�å�‘性质,没必è¦�一直å� ç”¨ä¿¡é�“资æº�而ä¸�让出给其它用户使用,因此这两ç§�æ–¹å¼�对信é�“的利用率都ä¸�高。 + +![](index_files/543d47a1-f0dd-414f-b23c-0c142c814854.png) + +### 2. 统计时分å¤�用 + +是对时分å¤�用的一ç§�改进,ä¸�固定æ¯�个用户在时分å¤�用帧中的ä½�置,å�ªè¦�有数æ�®å°±é›†ä¸­èµ·æ�¥ç»„æˆ�时分å¤�用帧然å�Žå�‘é€�。 + +![](index_files/29058e09-bb72-4040-a73d-4c497895e9ce.jpg) + +### 3. 波分å¤�用 + +光的频分å¤�用。由于光的频率很高,因此习惯上用波长而ä¸�是频率æ�¥è¡¨ç¤ºæ‰€ä½¿ç”¨çš„光载波。 + +![](index_files/78534153-88d1-4f83-a6e0-59064dbdc43a.png) + +### 4. ç �分å¤�用 + +为æ¯�个用户分é…� m bit 的ç �片,并且所有的ç �片正交,对于任æ„�两个ç �片 $\vec{S}$ 和 $\vec{T}$ 有 + +$$ \vec{S} \cdot \vec{T} = 0 $$ + +为了方便,å�– m=8,设ç �片 $\vec{S}$ 为 00011011。在拥有该ç �片的用户å�‘é€�比特 1 时就å�‘é€�该ç �片,å�‘é€�比特 0 时就å�‘é€�该ç �片的å��ç � 11100100。 + +在计算时将 00011011 记作 (-1 -1 -1 +1 +1 -1 +1 +1),å�¯ä»¥å¾—到 + +$$ \frac{1}{m} \vec{S} \cdot \vec{S} = 1 $$ + +$$ \frac{1}{m} \vec{S} \cdot \vec{S'} = -1 $$ + +其中 $\vec{S'}$ 为 $\vec{S}$ 的å��ç �。 + +利用上é�¢çš„å¼�å­�我们知é�“,当接收端使用ç �片 $\vec{S}$ 对接收到的数æ�®è¿›è¡Œå†…积è¿�算时,结果为 0 的是其它用户å�‘é€�的数æ�®ï¼Œç»“果为 1 的是用户å�‘é€�的比特 1,结果为 -1 的是用户å�‘é€�的比特 0。 + +ç �分å¤�用å�‘é€�的数æ�®é‡�为原先的 m å€�。 + +![](index_files/0042edad-8e3b-4279-bd93-6906fcd1b640.jpg) + +# 第三章 数æ�®é“¾è·¯å±‚ + +## 三个基本问题 + +### 1. å°�装æˆ�帧 + +将网络层传下æ�¥çš„分组添加首部和尾部,用于标记帧的开始和结æ�Ÿã€‚ + +![](index_files/ea5ed9b2-6d9f-48fb-b890-0288caf9088a.jpg) + +### 2. é€�明传输 + +é€�明表示一个实际存在的事物看起æ�¥å¥½åƒ�ä¸�存在一样。 + +帧中有首部和尾部,如果帧的数æ�®éƒ¨åˆ†å�«æœ‰å’Œé¦–部尾部相å�Œçš„内容,那么帧的开始和结æ�Ÿä½�置就会被错误的判定。需è¦�在数æ�®ä¸­å‡ºçŽ°é¦–éƒ¨å°¾éƒ¨ç›¸å�Œçš„内容å‰�é�¢æ�’入转义字符,如果需è¦�传输的内容正好就是转义字符,那么就在转义字符å‰�é�¢å†�加个转义字符,在接收端进行处ç�†ä¹‹å�Žå�¯ä»¥è¿˜åŽŸå‡ºåŽŸå§‹æ•°æ�®ã€‚这个过程é€�明传输的内容是转义字符,用户很难察觉到转义字符的存在。 + +![](index_files/44e1d90e-3fe6-4dd6-8dce-6daab12e7663.jpg) + +### 3. 差错检测 + +ç›®å‰�æ•°æ�®é“¾è·¯å±‚广泛使用了循环冗余检验(CRC)æ�¥æ£€æŸ¥æ¯”特差错。 + +## 点对点信é�“ -PPP å��è®® + +互è�”网用户通常需è¦�连接到æŸ�个 ISP 之å�Žæ‰�能接入到互è�”网,PPP å��议就是用户计算机和 ISP 进行通信时所使用的数æ�®é“¾è·¯å±‚å��议。 + +![](index_files/8b5bd2c8-8425-4a8b-89db-235c95800de9.jpg) + +在 PPP 的帧中,F 字段为帧的定界符,A 和 C 暂时没有æ„�义。FCS 是使用 CRC 的检验åº�列。信æ�¯å­—段的长度ä¸�超过 1500。 + +![](index_files/a5fa89e7-54b9-4e2f-8c48-a35712d7b2f5.jpg) + +## 局域网的拓扑 + +![](index_files/8b15e36f-69b4-46b6-a07c-7234ac7c7927.jpg) + +## 广播信é�“ - CSMA/CD å��è®®* + +在广播信é�“上,å�Œä¸€æ—¶é—´å�ªèƒ½å…�许一å�°è®¡ç®—机å�‘é€�æ•°æ�®ã€‚ + +CSMA/CD 表示载波监å�¬å¤šç‚¹æŽ¥å…¥Â / 碰撞检测。 + +**多点接入**:说明这是总线型网络,许多计算机以多点的方å¼�连接到总线上。 +**载波监å�¬**:æ¯�个站都必须ä¸�å�œåœ°æ£€å�¬ä¿¡é�“。在å�‘é€�å‰�,如果检å�¬ä¿¡é�“正在使用,就必须等待。 +**碰撞检测**:在å�‘é€�中,如果检å�¬ä¿¡é�“已有其它站正在å�‘é€�æ•°æ�®ï¼Œå°±è¡¨ç¤ºå�‘生了碰撞。虽然æ¯�一个站在å�‘é€�æ•°æ�®ä¹‹å‰�都已ç»�检å�¬ä¿¡é�“为空闲,但是由于电ç£�波的传播时延的存在,还是有å�¯èƒ½ä¼šå�‘生碰撞。 + +![](index_files/f9ed4da5-0032-41e6-991a-36d995ec28fd.png) + +记端到端的传播时延为 τ,最先å�‘é€�的站点最多ç»�过 2τ 就å�¯ä»¥çŸ¥é�“是å�¦å�‘生了碰撞,称 2τ 为 **争用期**。å�ªæœ‰ç»�过争用期之å�Žè¿˜æ²¡æœ‰æ£€æµ‹åˆ°ç¢°æ’žï¼Œæ‰�能肯定这次å�‘é€�ä¸�会å�‘生碰撞。 + +当å�‘生碰撞时,站点è¦�å�œæ­¢å�‘é€�,等待一段时间å†�å�‘é€�。这个时间采用 **截断二进制指数退é�¿ç®—法** æ�¥ç¡®å®šï¼Œä»Žç¦»æ•£çš„æ•´æ•°é›†å�ˆÂ {0, 1, .., (2k-1)} 中éš�机å�–出一个数,记作 r,然å�Žå�– r å€�的争用期作为é‡�传等待时间。 + +## 集线器 + +从表é�¢ä¸Šçœ‹ï¼Œä½¿ç”¨é›†çº¿å™¨çš„局域网在物ç�†ä¸Šæ˜¯ä¸€ä¸ªæ˜Ÿåž‹ç½‘。但是集线器使用电å­�器件æ�¥æ¨¡æ‹Ÿå®žé™…缆线的工作,逻辑上ä»�是一个总线网,整个系统ä»�åƒ�一个传统以太网那样è¿�行。 + +![](index_files/897a4f4e-2683-44e1-a26a-c0d0234dc576.jpg) + +![](index_files/40c3f8e5-3a20-45b6-a60c-77b9b952e104.jpg) + +## MAC 层 + +MAC 地å�€æ˜¯Â 6 字节(48 ä½�)的地å�€ï¼Œç”¨äºŽå”¯ä¸€è¡¨ç¤ºé€‚é…�器,一å�°ä¸»æœºæ‹¥æœ‰å¤šä¸ªé€‚é…�器就有多个 MAC 地å�€ï¼Œä¾‹å¦‚笔记本电脑普é��存在无线网络适é…�器和有线网络适é…�器。 + +MAC 帧用类型字段æ�¥æ ‡è®°ä¸Šå±‚使用什么å��议;数æ�®å­—段长度在 46-1500 之间,如果太å°�则需è¦�å¡«å……ï¼›FCS 为帧检验åº�列,使用的是 CRC 检验方法;å‰�é�¢æ�’入的å‰�å�Œæ­¥ç �å�ªæ˜¯ä¸ºäº†è®¡ç®— FCS 临时加入的,计算结æ�Ÿä¹‹å�Žä¼šä¸¢å¼ƒã€‚ + +![](index_files/50d38e84-238f-4081-8876-14ef6d7938b5.jpg) + +## 虚拟局域网 + +虚拟局域网å�¯ä»¥å»ºç«‹ä¸Žç‰©ç�†ä½�置无关的逻辑组,å�ªæœ‰åœ¨å�Œä¸€ä¸ªè™šæ‹Ÿå±€åŸŸç½‘中的æˆ�员æ‰�会收到广播信æ�¯ï¼Œä¾‹å¦‚下图中 (A1, A2, A3, A4) 属于一个虚拟局域网,A1 å�‘é€�的广播会被 A2ã€�A3ã€�A4 收到,而其它站点收ä¸�到。 + +![](index_files/a74b70ac-323a-4b31-b4d5-90569b8a944b.png) + +# 第四章 网络层* + +## 网际å��议 IP 概述 + +因为网络层是整个互è�”网的核心,因此应当让网络层尽å�¯èƒ½ç®€å�•。网络层å�‘上å�ªæ��供简å�•ç�µæ´»çš„ã€�无连接的ã€�尽最大努力交互的数æ�®æŠ¥æœ�务。 + +使用 IP å��议,å�¯ä»¥æŠŠå¼‚构的物ç�†ç½‘络连接起æ�¥ï¼Œä½¿å¾—在网络层看起æ�¥å¥½åƒ�是一个统一的网络。 + +![](index_files/fe3d224c-8ffd-40f9-85b1-86ffe1393f6c.jpg) + +与 IP å��è®®é…�套使用的还有三个å��议: + +1. 地å�€è§£æž�å��议 ARP(Address Resolution Protocol) +2. 网际控制报文å��议 ICMP(Internet Control Message Protocol) +3. 网际组管ç�†å��议 IGMP(Internet Group Management Protocol) + +![](index_files/163cf8b4-5f30-46c9-af00-316a71b3c890.jpg) + +## IP 数æ�®æŠ¥æ ¼å¼� + +![](index_files/8681db55-0873-434b-aa98-83d07e8392ae.jpg) + +**版本** : 有 4(IPv4)和 6(IPv6)两个值; + +**首部长度** : å� Â 4 ä½�,因此最大值为 15。值为 1 表示的是 1 个 32 ä½�字的长度,也就是 4 字节。因为首部固定长度为 20 字节,因此该值最å°�为 5。如果å�¯é€‰éƒ¨åˆ†çš„长度ä¸�是 4 字节的整数å€�,就用尾部的填充部分æ�¥å¡«å……。 + +**区分æœ�务** : 用æ�¥èŽ·å¾—æ›´å¥½çš„æœ�务,一般情况下ä¸�适用。 + +**总长度** : 包括首部长度和数æ�®éƒ¨åˆ†é•¿åº¦ã€‚ + +**标识** : 在数æ�®æŠ¥é•¿åº¦è¿‡é•¿ä»Žè€Œå�‘生分片的情况下,相å�Œæ•°æ�®æŠ¥çš„ä¸�å�Œåˆ†ç‰‡å…·æœ‰ç›¸å�Œçš„æ ‡è¯†ç¬¦ã€‚ + +**片å��ç§»** : 和标识符一起,用于å�‘生分片的情况。片å��移的å�•ä½�为 8 字节。 + +![](index_files/45c86855-9b18-4cf4-a9a7-f8b6eb78d133.png) + +**生存时间** :TTL,它的存在为了防止无法交付的数æ�®æŠ¥åœ¨äº’è�”网中ä¸�断兜圈å­�。以路由器跳数为å�•ä½�,当 TTL 为 0 时就丢弃数æ�®æŠ¥ã€‚ + +**å��è®®**:指出æ�ºå¸¦çš„æ•°æ�®åº”该上交给哪个å��议进行处ç�†ï¼Œä¾‹å¦‚ ICMPã€�TCPã€�UDP 等。 + +**首部检验和**:因为数æ�®æŠ¥æ¯�ç»�过一个路由器,都è¦�é‡�新计算检验和,因此检验和ä¸�包å�«æ•°æ�®éƒ¨åˆ†å�¯ä»¥å‡�少计算的工作é‡�。 + +## IP 地å�€ç¼–å�€ + +IP 地å�€çš„ç¼–å�€æ–¹å¼�ç»�历了三个历å�²é˜¶æ®µï¼š + +1. 分类的 IP 地å�€ï¼› +2. å­�网的划分; +3. 构æˆ�超网。 + +### 1. 分类的 IP 地å�€ + +由两部分组æˆ�,网络å�·å’Œä¸»æœºå�·ï¼Œå…¶ä¸­ä¸�å�Œç±»åˆ«å…·æœ‰ä¸�å�Œçš„网络å�·é•¿åº¦ï¼Œå¹¶ä¸”是固定的。 + +IP 地å�€Â ::= {< 网络å�·Â >, < 主机å�·Â >} + +![](index_files/2ddd6132-60be-4a72-9daa-3d9756191f4a.png) + +### 2. 划分å­�网 + +通过在网络å�·å­—段中拿一部分作为å­�网å�·ï¼ŒæŠŠä¸¤çº§Â IP 地å�€åˆ’分为三级 IP 地å�€ã€‚注æ„�,外部网络看ä¸�到å­�网的存在。 + +IP 地å�€Â ::= {< 网络å�·Â >, < å­�网å�·Â >, < 主机å�·Â >} + +è¦�使用å­�网,必须é…�ç½®å­�网掩ç �。一个 B 类地å�€çš„默认å­�网掩ç �为 255.255.0.0,如果 B 类地å�€çš„å­�网å� ä¸¤ä¸ªæ¯”特,那么å­�网掩ç �为 11111111 11111111 11000000 000000,也就是 255.255.192.0。 + +### 3. 无分类编å�€Â CIDR(构æˆ�超网) + +CIDR 消除了传统 A 类ã€�B 类和 C 类地å�€ä»¥å�Šåˆ’分å­�网的概念,使用网络å‰�缀和主机å�·æ�¥å¯¹Â IP 地å�€è¿›è¡Œç¼–ç �,网络å‰�缀的长度å�¯ä»¥æ ¹æ�®éœ€è¦�å�˜åŒ–。 + +IP 地å�€Â ::= {< 网络å‰�ç¼€å�·Â >, < 主机å�·Â >} + +CIDR 的记法上采用在 IP 地å�€å�Žé�¢åŠ ä¸Šç½‘ç»œå‰�缀长度的方法,例如 128.14.35.7/20 表示å‰� 20 ä½�为网络å‰�缀。 + +CIDR 的地å�€æŽ©ç �å�¯ä»¥ç»§ç»­ç§°ä¸ºå­�网掩ç �,å­�网掩ç �首 1 长度为网络å‰�缀的长度。 + +一个 CIDR 地å�€å�—中有很多地å�€ï¼Œä¸€ä¸ªÂ CIDR 表示的网络就å�¯ä»¥è¡¨ç¤ºåŽŸæ�¥çš„很多个网络,并且在路由表中å�ªéœ€è¦�一个路由就å�¯ä»¥ä»£æ›¿åŽŸæ�¥çš„多个路由,å‡�少了路由表项的数é‡�。把这ç§�通过使用网络å‰�ç¼€æ�¥å‡�少路由表项的方å¼�称为路由è�šå�ˆï¼Œä¹Ÿç§°ä¸ºæž„æˆ�超网。 + +在路由表中æ¯�个项目由“网络å‰�ç¼€â€�和“下一跳地å�€â€�组æˆ�,在查找时å�¯èƒ½ä¼šå¾—到ä¸�止一个匹é…�结果,应当采用最长å‰�缀匹é…�。 + +## IP 地å�€å’ŒÂ MAC 地å�€ + +网络层实现主机之间的通信,而链路层实现具体æ¯�段链路之间的通信。因此在通信过程中,IP 数æ�®æŠ¥çš„æº�地å�€å’Œç›®çš„地å�€å§‹ç»ˆä¸�å�˜ï¼Œè€ŒÂ MAC 地å�€éš�ç�€é“¾è·¯çš„æ”¹å�˜è€Œæ”¹å�˜ã€‚ + +![](index_files/86b71296-0d1e-4a63-bcd9-54955b6b781b.jpg) + + +## 地å�€è§£æž�å��议 ARP + +实现由 IP 地å�€å¾—到 MAC 地å�€ã€‚ + +æ¯�个主机都有一个 ARP 高速缓存,存放映射表。如果一个 IP 地å�€Â åˆ°Â MAC 地å�€çš„æ˜ å°„ä¸�在该表中,主机通过广播的方å¼�å�‘é€� ARP 请求分组,匹é…� IP 地å�€çš„主机会å�‘é€� ARP å“�应分组告知 MAC 地å�€ã€‚ + +![](index_files/8bc6fc2c-d198-4759-b06c-18d94d851e97.png) + +## 路由器的结构 + +路由器å�¯ä»¥åˆ’分为两大部分:路由选择和分组转å�‘。 + +分组转å�‘部分由三部分组æˆ�:交æ�¢ç»“æž„ã€�一组输入端å�£å’Œä¸€ç»„输出端å�£ã€‚ + +![](index_files/3a676c54-b559-4466-9b21-eb10f1e25879.jpg) + +交æ�¢ç»“构的交æ�¢ç½‘络有以下三ç§�实现方å¼�: + +![](index_files/7f82fd18-7f16-4125-ada6-bb6b795b4fda.png) + +## 交æ�¢æœºä¸Žè·¯ç”±å™¨çš„区别 + +- 交æ�¢æœºå·¥ä½œäºŽæ•°æ�®é“¾è·¯å±‚,能识别 MAC 地å�€ï¼Œæ ¹æ�®Â MAC 地å�€è½¬å�‘链路层数æ�®å¸§ã€‚具有自学机制æ�¥ç»´æŠ¤Â IP 地å�€ä¸ŽÂ MAC 地å�€çš„æ˜ å°„。 + +- 路由器ä½�于网络层,能识别 IP 地å�€å¹¶æ ¹æ�®Â IP 地å�€è½¬å�‘分组。维护ç�€è·¯ç”±è¡¨ï¼Œæ ¹æ�®è·¯ç”±è¡¨é€‰æ‹©æœ€ä½³è·¯çº¿ã€‚ + +## 路由器分组转å�‘æµ�程 + +1. 从数æ�®æŠ¥çš„首部æ��å�–目的主机的 IP 地å�€Â D,得到目的网络地å�€Â N。(路由表项是网络å�·è€Œä¸�是 IP 地å�€ï¼Œè¿™æ ·å�šå¤§å¤§å‡�少了路由表æ�¡ç›®æ•°é‡�) +2. 若 N 就是与此路由器直接相连的æŸ�个网络地å�€ï¼Œåˆ™è¿›è¡Œç›´æŽ¥äº¤ä»˜ï¼› +3. 若路由表中有目的地å�€ä¸ºÂ D 的特定主机路由,则把数æ�®æŠ¥ä¼ é€�给表中所指明的下一跳路由器; +4. 若路由表中有到达网络 N 的路由,则把数æ�®æŠ¥ä¼ é€�给路由表中所指明的下一跳路由器; +5. 若路由表中有一个默认路由,则把数æ�®æŠ¥ä¼ é€�给路由表中所指明的默认路由器; +6. 报告转å�‘分组出错。 + +![](index_files/8d211911-0e62-4190-ab00-d8610adec4a0.jpg) + +## 路由选择å��è®® + +互è�”网使用的路由选择å��议都是自适应的,能éš�ç�€ç½‘络通信é‡�和拓扑å�˜åŒ–而自适应地进行调整。 + +互è�”网å�¯ä»¥åˆ’分为许多较å°�的自治系统 AS,一个 AS å�¯ä»¥ä½¿ç”¨ä¸€ç§�和别的 AS ä¸�å�Œçš„路由选择å��议。 + +å�¯ä»¥æŠŠè·¯ç”±é€‰æ‹©å��议划分为两大类: + +1. 内部网关å��议 IGP(Interior Gateway Protocol) 在自治系统内部使用,如 RIP 和 OSPF。 +2. 外部网关å��议 EGP(External Gateway Protocol) 在自治系统之间使用,如 BGP。 + +![](index_files/e0be6970-5b0e-44a2-bc71-df4d61c42b8f.jpg) + +### 1. 内部网关å��议 RIP + +RIP 是一ç§�分布å¼�的基于è·�离å�‘é‡�的路由选择å��议。è·�离是指跳数,直接相连的路由器跳数为 1,跳数最多为 15,超过 15 表示ä¸�å�¯è¾¾ã€‚ + +RIP 按固定的时间间隔仅和相邻路由器交æ�¢è‡ªå·±çš„路由表,ç»�过若干次交æ�¢ä¹‹å�Žï¼Œæ‰€æœ‰è·¯ç”±å™¨æœ€ç»ˆä¼šçŸ¥é�“到达本自治系统中任何一个网络的最短è·�离和下一跳路由器地å�€ã€‚ + +è·�离å�‘é‡�算法: + +1. 对地å�€ä¸ºÂ X 的相邻路由器å�‘æ�¥çš„ RIP 报文,先修改报文中的所有项目,把下一跳字段中的地å�€æ”¹ä¸ºÂ X,并把所有的è·�离字段加 1ï¼› +2. 对修改å�Žçš„ RIP 报文中的æ¯�一个项目,进行以下步骤: + - 若原æ�¥çš„路由表中没有目的网络 N,则把该项目添加到路由表中; + - å�¦åˆ™ï¼šè‹¥ä¸‹ä¸€è·³è·¯ç”±å™¨åœ°å�€æ˜¯Â X,则把收到的项目替æ�¢åŽŸæ�¥è·¯ç”±è¡¨ä¸­çš„项目;å�¦åˆ™ï¼šè‹¥æ”¶åˆ°çš„项目中的è·�离 d å°�于路由表中的è·�离,则进行更新(例如原始路由表项为 Net2, 5, P,新表项为 Net2, 4, X,则更新);å�¦åˆ™ä»€ä¹ˆä¹Ÿä¸�å�šã€‚ +3. 若 3 分钟还没有收到相邻路由器的更新路由表,则把该相邻路由器标为ä¸�å�¯è¾¾ï¼Œå�³æŠŠè·�离置为 16。 + +RIP å��议实现简å�•,开销å°�,但是 RIP 能使用的最大è·�离为 15,é™�制了网络的规模。并且当网络出现故障时,è¦�ç»�过比较长的时间æ‰�能将此消æ�¯ä¼ é€�到所有路由器。 + +### 2. 内部网关å��议 OSPF + +开放最短路径优先 OSPF,是为了克æœ� RIP 的缺点而开å�‘出æ�¥çš„。 + +开放表示 OSPF ä¸�å�—æŸ�一家厂商控制,而是公开å�‘表的;最短路径优先是因为使用了 Dijkstra æ��出的最短路径算法 SPF。 + +OSPF 具有以下特点: + +1. å�‘本自治系统中的所有路由器å�‘é€�ä¿¡æ�¯ï¼Œè¿™ç§�方法是洪泛法。 +2. å�‘é€�的信æ�¯å°±æ˜¯ä¸Žç›¸é‚»è·¯ç”±å™¨çš„链路状æ€�,链路状æ€�包括与哪些路由器相连以å�Šé“¾è·¯çš„度é‡�,度é‡�用费用ã€�è·�离ã€�æ—¶å»¶ã€�带宽等æ�¥è¡¨ç¤ºã€‚ +3. å�ªæœ‰å½“链路状æ€�å�‘生å�˜åŒ–时,路由器æ‰�会å�‘é€�ä¿¡æ�¯ã€‚ + +所有路由器都具有全网的拓扑结构图,并且是一致的。相比于 RIP,OSPF 的更新过程收敛的很快。 + +### 3. 外部网关å��议 BGP + +AS 之间的路由选择很困难,主è¦�是互è�”网规模很大。并且å�„个 AS 内部使用ä¸�å�Œçš„路由选择å��议,就无法准确定义路径的度é‡�。并且 AS 之间的路由选择必须考虑有关的策略,比如有些 AS ä¸�æ„¿æ„�让其它 AS ç»�过。 + +BGP å�ªèƒ½å¯»æ‰¾ä¸€æ�¡æ¯”较好的路由,而ä¸�是最佳路由。它采用路径å�‘é‡�路由选择å��议。 + +æ¯�个 AS 都必须é…�置 BGP å�‘言人,通过在两个相邻 BGP å�‘言人之间建立 TCP 连接æ�¥äº¤æ�¢è·¯ç”±ä¿¡æ�¯ã€‚ + +![](index_files/eb6271de-22c9-4f4b-8b31-eab1f560efac.png) + +## 网际控制报文å��议 ICMP + +ICMP 是为了更有效地转å�‘ IP 数æ�®æŠ¥å’Œæ��高交付æˆ�功的机会。它å°�装在 IP 数æ�®æŠ¥ä¸­ï¼Œä½†æ˜¯ä¸�属于高层å��议。 + +![](index_files/9b5e0fa0-9274-4219-a3a9-84fbb509c735.jpg) + +ICMP 报文分为差错报告报文和询问报文。 + +![](index_files/6e11b122-95ce-4869-bf7d-3b0d7591707e.jpg) + +## 分组网间探测 PING + +PING 是 ICMP 的一个é‡�è¦�应用,主è¦�用æ�¥æµ‹è¯•两å�°ä¸»æœºä¹‹é—´çš„连通性。 + +PING 的过程: + +1. PING å�Œä¸€ä¸ªç½‘段的主机,查找目的主机的 MAC 地å�€ï¼Œç„¶å�Žç›´æŽ¥äº¤ä»˜ã€‚如果无法查找到 MAC 地å�€ï¼Œå°±è¦�进行一次 ARP 请求。 +2. PING ä¸�å�Œç½‘段的主机,就å�‘é€�给网关让其进行转å�‘。å�Œæ ·è¦�å�‘é€�给网关也需è¦�通过查找网关的 MAC 地å�€ï¼Œæ ¹æ�®Â MAC 地å�€è¿›è¡Œè½¬å�‘。 + +## IP 多播 + +在一对多的通信中,多播ä¸�需è¦�将分组å¤�制多份,从而大大节约网络资æº�。 + +![](index_files/c77b6a18-dfac-42a2-ac89-7e99481275dc.jpg) + +## 虚拟专用网 VPN + +由于 IP 地å�€çš„紧缺,一个机构能申请到的 IP 地å�€æ•°å¾€å¾€è¿œå°�于本机构所拥有的主机数。并且一个机构并ä¸�需è¦�把所有的主机接入到外部的互è�”网中,机构内的计算机å�¯ä»¥ä½¿ç”¨ä»…在本机构有效的 IP 地å�€ï¼ˆä¸“用地å�€ï¼‰ã€‚ + +有三个专用地å�€å�—: + +1. 10.0.0.0 ~ 10.255.255.255 +2. 172.16.0.0 ~ 172.31.255.255 +3. 192.168.0.0 ~ 192.168.255.255 + +VPN 使用公用的互è�”网作为本机构å�„专用网之间的通信载体。专用指机构内的主机å�ªä¸Žæœ¬æœºæž„内的其它主机通信;虚拟指“好åƒ�是â€�,而实际上并ä¸�是,它有ç»�过公用的互è�”网。 + +下图中,场所 A 和 B 的通信部ç»�过互è�”网,如果场所 A 的主机 X è¦�å’Œå�¦ä¸€ä¸ªåœºæ‰€Â B 的主机 Y 通信,IP 数æ�®æŠ¥çš„æº�地å�€æ˜¯Â 10.1.0.1,目的地å�€æ˜¯Â 10.2.0.3。数æ�®æŠ¥å…ˆå�‘é€�到与互è�”网相连的路由器 R1,R1 对内部数æ�®è¿›è¡ŒåŠ å¯†ï¼Œç„¶å�Žé‡�新加上数æ�®æŠ¥çš„首部,æº�地å�€æ˜¯è·¯ç”±å™¨Â R1 的全ç�ƒåœ°å�€Â 125.1.2.3,目的地å�€æ˜¯è·¯ç”±å™¨Â R2 的全ç�ƒåœ°å�€Â 194.4.5.6。路由器 R2 收到数æ�®æŠ¥å�Žå°†æ•°æ�®éƒ¨åˆ†è¿›è¡Œè§£å¯†ï¼Œæ�¢å¤�原æ�¥çš„æ•°æ�®æŠ¥ï¼Œæ­¤æ—¶ç›®çš„地å�€ä¸ºÂ 10.2.0.3,就交付给 Y。 + +![](index_files/bf4ed077-d481-4db7-9e7a-85d841a5a8c3.jpg) + +## 网络地å�€è½¬æ�¢Â NAT + +专用网内部的主机使用本地 IP 地å�€å�ˆæƒ³å’Œäº’è�”网上的主机通信时,å�¯ä»¥ä½¿ç”¨Â NAT æ�¥å°†æœ¬åœ°Â IP 转æ�¢ä¸ºå…¨ç�ƒÂ IP。 + +在以å‰�,NAT 将本地 IP 和全ç�ƒÂ IP 一一对应,这ç§�æ–¹å¼�下拥有 n 个全ç�ƒÂ IP 地å�€çš„专用网内最多å�ªå�¯ä»¥å�Œæ—¶æœ‰Â n å�°ä¸»æœºæŽ¥å…¥äº’è�”网。为了更有效地利用全ç�ƒÂ IP 地å�€ï¼ŒçŽ°åœ¨å¸¸ç”¨çš„Â NAT 转æ�¢è¡¨æŠŠè¿�输层的端å�£å�·ä¹Ÿç”¨ä¸Šäº†ï¼Œè¿™æ ·å�¯ä»¥ä½¿å¾—多个专用网内部的主机共用一个全ç�ƒÂ IP 地å�€ã€‚使用端å�£å�·çš„ NAT 也å�«å�šç½‘络地å�€ä¸Žç«¯å�£è½¬æ�¢Â NAPT。 + +![](index_files/0f31bc7a-d60b-48a6-8e3f-597708369e52.png) + +# 第五章 è¿�输层* + +网络层å�ªæŠŠåˆ†ç»„å�‘é€�到目的主机,但是真正通信的并ä¸�是主机而是主机中的进程。 + +è¿�输层æ��供了应用进程间的逻辑通信。è¿�输层å�‘高层用户å±�蔽了下é�¢ç½‘络层的核心细节,使应用程åº�看è§�的好åƒ�在两个è¿�输层实体之间有一æ�¡ç«¯åˆ°ç«¯çš„逻辑通信信é�“。 + +## UDP 和 TCP 的特点 + +用户数æ�®åŒ…å��议 UDP(User Datagram Protocol) +传输控制å��议 TCP(Transmission Control Protocol) + +UDP 是无连接的,尽最大å�¯èƒ½äº¤ä»˜ï¼Œæ²¡æœ‰æ‹¥å¡žæŽ§åˆ¶ï¼Œé�¢å�‘报文(对于应用程åº�传下æ�¥çš„æŠ¥æ–‡ä¸�å�ˆå¹¶ä¹Ÿä¸�拆分,å�ªæ˜¯æ·»åŠ Â UDP 首部)。 + +TCP 是é�¢å�‘连接的,æ��ä¾›å�¯é� äº¤ä»˜ï¼Œæœ‰æµ�é‡�控制,拥塞控制,æ��供全å�Œå·¥é€šä¿¡ï¼Œé�¢å�‘字节æµ�(把应用层传下æ�¥çš„æŠ¥æ–‡çœ‹æˆ�字节æµ�,把字节æµ�组织æˆ�大å°�ä¸�等的数æ�®å�—) + +## UDP 首部格å¼� + +![](index_files/bd6c05f3-02ee-4c8a-b374-40c87154a898.jpg) + +首部字段å�ªæœ‰Â 8 个字节,包括æº�端å�£ã€�目的端å�£ã€�长度ã€�检验和。12 字节的伪首部是为了计算检验和而临时添加的。 + +## TCP 首部格å¼� + +![](index_files/21a00b02-c0a6-4bcd-9af0-5ec6bb66e34c.jpg) + +**åº�å�·** :用于对字节æµ�进行编å�·ï¼Œä¾‹å¦‚åº�å�·ä¸ºÂ 301,表示第一个字节的编å�·ä¸ºÂ 301,如果æ�ºå¸¦çš„æ•°æ�®é•¿åº¦ä¸ºÂ 100 字节,那么下一个报文段的åº�å�·åº”为 401。 + +**确认å�·** :期望收到的下一个报文段的åº�å�·ã€‚例如 B 正确收到 A å�‘é€�æ�¥çš„一个报文段,åº�å�·ä¸ºÂ 501,æ�ºå¸¦çš„æ•°æ�®é•¿åº¦ä¸ºÂ 200 字节,因此 B 期望下一个报文段的åº�å�·ä¸ºÂ 701,B å�‘é€�给 A 的确认报文段中确认å�·å°±ä¸ºÂ 701。 + +**æ•°æ�®å��ç§»** :指的是数æ�®éƒ¨åˆ†è·�离报文段起始处的å��ç§»é‡�,实际上指的是首部的长度。 + +**确认 ACK** :当 ACK=1 时确认å�·å­—段有效,å�¦åˆ™æ— æ•ˆã€‚TCP 规定,在连接建立å�Žæ‰€æœ‰ä¼ é€�的报文段都必须把 ACK 置 1。 + +**å�Œæ­¥Â SYN** :在连接建立时用æ�¥å�Œæ­¥åº�å�·ã€‚当 SYN=1,ACK=0 时表示这是一个连接请求报文段。若对方å�Œæ„�建立连接,则å“�应报文中 SYN=1,ACK=1。 + +**终止 FIN** :用æ�¥é‡Šæ”¾ä¸€ä¸ªè¿žæŽ¥ï¼Œå½“ FIN=1 时,表示此报文段的å�‘é€�方的数æ�®å·²å�‘é€�完毕,并è¦�求释放è¿�输连接。 + +**窗å�£** :窗å�£å€¼ä½œä¸ºæŽ¥æ”¶æ–¹è®©å�‘é€�方设置其å�‘é€�窗å�£çš„ä¾�æ�®ã€‚之所以è¦�有这个é™�制,是因为接收方的数æ�®ç¼“存空间是有é™�的。 + +## TCP 的三次æ�¡æ‰‹ + +![](index_files/086871db-5871-460f-97b7-126cd738bb0e.jpg) + +å�‡è®¾Â A 为客户端,B 为æœ�务器端。 + +1. 首先 B 处于 LISTEN(监å�¬ï¼‰çжæ€�,等待客户的连接请求。 +2. A å�‘ B å�‘é€�连接请求报文段,SYN=1,ACK=0,选择一个åˆ�å§‹çš„åº�å�·Â x。 +3. B 收到连接请求报文段,如果å�Œæ„�建立连接,则å�‘ A å�‘é€�连接确认报文段,SYN=1,ACK=1,确认å�·ä¸ºÂ x+1,å�Œæ—¶ä¹Ÿé€‰æ‹©ä¸€ä¸ªåˆ�å§‹çš„åº�å�·Â y。 +4. A 收到 B 的连接确认报文段å�Žï¼Œè¿˜è¦�å�‘ B å�‘出确认,确认å�·ä¸ºÂ y+1,åº�å�·ä¸ºÂ x+1。 +5. B 收到 A 的确认å�Žï¼Œè¿žæŽ¥å»ºç«‹ã€‚ + + +## TCP 的四次挥手 + +![](index_files/78f65456-666b-4044-b4ee-f7692dbbc0d3.jpg) + +以下æ��è¿°ä¸�讨论åº�å�·å’Œç¡®è®¤å�·ï¼Œå› ä¸ºåº�å�·å’Œç¡®è®¤å�·çš„规则比较简å�•。并且ä¸�讨论 ACK,因为 ACK 在连接建立之å�Žéƒ½ä¸ºÂ 1。 + +1. A å�‘é€�连接释放报文段,FIN=1ï¼› +2. B 收到之å�Žå�‘出确认,此时 TCP 属于å�Šå…³é—­çжæ€�,B 能å�‘ A å�‘é€�æ•°æ�®ä½†æ˜¯Â A ä¸�能å�‘ B å�‘é€�æ•°æ�®ï¼› +3. 当 B è¦�ä¸�å†�需è¦�连接时,å�‘é€�连接释放请求报文段,FIN=1ï¼› +4. A 收到å�Žå�‘出确认,此时连接释放。 + +**TIME_WAIT** + +客户端接收到æœ�务器端的 FIN 报文å�Žè¿›å…¥æ­¤çжæ€�,此时并ä¸�是直接进入 CLOSED 状æ€�,还需è¦�等待一个时间计时器设置的时间。这么å�šæœ‰ä¸¤ä¸ªç�†ç”±ï¼š + +1. 确ä¿�最å�Žä¸€ä¸ªç¡®è®¤æŠ¥æ–‡æ®µèƒ½å¤Ÿåˆ°è¾¾ã€‚如果 B 没收到 A å�‘é€�æ�¥çš„确认报文段,那么就会é‡�æ–°å�‘é€�连接释放请求报文段,A 等待一段时间就是为了处ç�†è¿™ç§�情况的å�‘生。 +2. 连接过程å�¯èƒ½â€œå·²å¤±æ•ˆçš„连接请求报文段â€�,为了防止这ç§�报文段出现在本次连接之外,需è¦�等待一段时间。 + +## TCP 滑动窗å�£ + +![](index_files/223fc26e-2fd6-484c-bcb7-443cac134f15.jpg) + +窗å�£æ˜¯ç¼“存的一部分,用æ�¥æš‚时存放字节æµ�。å�‘é€�方和接收方å�„有一个窗å�£ï¼ŒæŽ¥æ”¶æ–¹é€šè¿‡Â TCP 报文段中的窗å�£å­—段告诉å�‘é€�方自己的窗å�£å¤§å°�,å�‘é€�方根æ�®è¿™ä¸ªå€¼å’Œå…¶å®ƒä¿¡æ�¯è®¾ç½®è‡ªå·±çš„窗å�£å¤§å°�。 + +å�‘é€�窗å�£å†…的字节都å…�许被å�‘é€�,接收窗å�£å†…的字节都å…�许被接收。如果å�‘é€�窗å�£å·¦éƒ¨çš„字节已ç»�å�‘é€�并且收到了确认,那么就将å�‘é€�窗å�£å�‘å�³æ»‘动一定è·�离,直到左部第一个字节ä¸�是已å�‘é€�并且已确认的状æ€�;接收窗å�£çš„æ»‘动类似,接收窗å�£å·¦éƒ¨å­—节已ç»�å�‘é€�确认并交付主机,就å�‘å�³æ»‘动接收窗å�£ã€‚ + +接收窗å�£å�ªä¼šå¯¹çª—å�£å†…最å�Žä¸€ä¸ªæŒ‰åº�到达的字节进行确认,例如接收窗å�£å·²ç»�收到的字节为 {31, 32, 34, 35},其中 {31, 32} 按åº�到达,而 {34, 35} 就ä¸�是,因此å�ªå¯¹å­—节 32 进行确认。å�‘é€�方得到一个字节的确认之å�Žï¼Œå°±çŸ¥é�“这个字节之å‰�的所有字节都已ç»�被接收。 + +## TCP å�¯é� ä¼ è¾“ + +TCP 使用超时é‡�ä¼ æ�¥å®žçްå�¯é� ä¼ è¾“:如果一个已ç»�å�‘é€�的报文段在超时时间内没有收到确认,那么就é‡�传这个报文段。 + +一个报文段从å�‘é€�到接收到确认所ç»�过的时间称为往返时间 RTT,加æ�ƒå¹³å�‡å¾€è¿”时间 RTTs 计算如下: + +$$ RTTs = (1-a)*(RTTs) + a*RTT $$ + +å�¯ä»¥çŸ¥é�“,超时时间 RTO 应该略大于 RRTs,TCP 使用的超时时间计算如下: + +$$ RTO = RTTs + 4*RTT_d $$ + +其中 RTTd 为å��差,它与新的 RRT 和 RRTs 有关。 + +## TCP æµ�é‡�控制 + +æµ�é‡�控制是为了控制å�‘é€�æ–¹å�‘é€�速率,ä¿�è¯�接收方æ�¥å¾—å�ŠæŽ¥æ”¶ã€‚ + +接收方å�‘é€�的确认报文中的窗å�£å­—段å�¯ä»¥ç”¨æ�¥æŽ§åˆ¶å�‘é€�方窗å�£å¤§å°�,从而影å“�å�‘é€�方的å�‘é€�速率。例如将窗å�£å­—段设置为 0,则å�‘é€�æ–¹ä¸�能å�‘é€�æ•°æ�®ã€‚ + +## TCP 拥塞控制 + +如果网络出现拥塞,分组将会丢失,此时å�‘é€�方会继续é‡�传,从而导致网络拥塞程度更高。因此当出现拥塞时,应当控制å�‘é€�方的速率。这一点和æµ�é‡�控制很åƒ�,但是出å�‘点ä¸�å�Œã€‚æµ�é‡�控制是为了让接收方能æ�¥å¾—å�пޥå�—,而拥塞控制是为了é™�低整个网络的拥塞程度。 + +![](index_files/a69af9bb-b5ad-4896-862d-697e5ee4feb1.png) + +TCP 主è¦�通过四ç§�算法æ�¥è¿›è¡Œæ‹¥å¡žæŽ§åˆ¶ï¼šæ…¢å¼€å§‹ã€�拥塞é�¿å…�ã€�å¿«é‡�ä¼ ã€�å¿«æ�¢å¤�。å�‘é€�方需è¦�维护有一个å�«å�šæ‹¥å¡žçª—å�£ï¼ˆcwnd)的状æ€�å�˜é‡�。注æ„�拥塞窗å�£ä¸Žå�‘é€�方窗å�£çš„区别,拥塞窗å�£å�ªæ˜¯ä¸€ä¸ªçжæ€�å�˜é‡�,实际决定å�‘é€�方能å�‘é€�多少数æ�®çš„æ˜¯å�‘é€�方窗å�£ã€‚ + +为了便于讨论,å�šå¦‚下å�‡è®¾ï¼š + +1. 接收方有足够大的接收缓存,因此ä¸�会å�‘生æµ�é‡�控制; +2. 虽然 TCP 的窗å�£åŸºäºŽå­—节,但是这里设窗å�£çš„大å°�å�•ä½�为报文段。 + +![](index_files/346244ff-98c1-4f12-9a87-d0832e8c04cf.jpg) + +### 慢开始与拥塞é�¿å…� + +å�‘é€�的最åˆ�执行慢开始,令 cwnd=1,å�‘é€�æ–¹å�ªèƒ½å�‘é€� 1 个报文段;当收到确认å�Žï¼Œå°†Â cwnd 加å€�,因此之å�Žå�‘é€�方能够å�‘é€�的报文段为:2ã€�4ã€�8 ... + +注æ„�到慢开始æ¯�个轮次都将 cwnd 加å€�,这样会让 cwnd 增长速度é�žå¸¸å¿«ï¼Œä»Žè€Œä½¿å¾—å�‘é€�æ–¹å�‘é€�的速度增长速度过快,网络拥塞的å�¯èƒ½ä¹Ÿå°±æ›´é«˜ã€‚设置一个慢开始门é™� ssthresh,当 cwnd >= ssthresh 时,进入拥塞é�¿å…�,æ¯�个轮次å�ªå°†Â cwnd 加 1。 + +如果出现了超时,则令 ssthresh = cwnd / 2,然å�Žé‡�新执行慢开始。 + +### 快é‡�传与快æ�¢å¤� + +在接收方,è¦�求æ¯�次接收到报文段都应该å�‘é€�对已收到有åº�报文段的确认,例如已ç»�接收到 M1 和 M2,此时收到 M4,应当å�‘é€�对 M2 的确认。 + +在å�‘é€�方,如果收到三个é‡�å¤�确认,那么å�¯ä»¥ç¡®è®¤ä¸‹ä¸€ä¸ªæŠ¥æ–‡æ®µä¸¢å¤±ï¼Œä¾‹å¦‚收到三个 M2 ,则 M3 丢失。此时执行快é‡�传,立å�³é‡�传下一个报文段。 + +在这ç§�情况下,å�ªæ˜¯ä¸¢å¤±ä¸ªåˆ«æŠ¥æ–‡æ®µï¼Œè€Œä¸�是网络拥塞,因此执行快æ�¢å¤�,令 ssthresh = cwnd / 2 ,cwnd = ssthresh,注æ„�到此时直接进入拥塞é�¿å…�。 + +![](index_files/b18d679b-c8e2-4564-88ee-7600090e46da.jpg) + +# 第六章 应用层* + +## 域å��系统 DNS + +把主机å��è§£æž�为 IP 地å�€ã€‚ + +被设计æˆ�分布å¼�系统。 + +### 1. 层次结构 + +一个域å��由多个层次构æˆ�,从上层到下层分别为顶级域å��ã€�二级域å��ã€�三级域å��以å�Šå››çº§åŸŸå��。所有域å��å�¯ä»¥ç”»æˆ�一颗域å��树。 + +![](index_files/c2117f61-1177-4768-bf33-cf4f950d911c.png) + +![](index_files/a4b162e5-db2a-4a27-b213-1fe481c5a06a.png) + +域å��æœ�务器å�¯ä»¥åˆ†ä¸ºä»¥ä¸‹å››ç±»ï¼š + +**(1) 根域å��æœ�务器**:解æž�顶级域å��ï¼› + +**(2) 顶级域å��æœ�务器**:解æž�二级域å��ï¼› + +**(3) æ�ƒé™�域å��æœ�务器**:解æž�区内的域å��ï¼› + +区和域的概念ä¸�å�Œï¼Œå�¯ä»¥åœ¨ä¸€ä¸ªåŸŸä¸­åˆ’分多个区。图 b 在域 abc.com 中划分了两个区:abc.com 和 y.abc.com + +![](index_files/fc0c6b2d-68c7-4de8-aaaa-97355a4f0472.jpg) + +因此就需è¦�两个æ�ƒé™�域å��æœ�务器: + +![](index_files/8b335d94-c1ca-42e1-ad48-bb179d28a4f1.jpg) + +**(4) 本地域å��æœ�务器**:也称为默认域å��æœ�务器。å�¯ä»¥åœ¨å…¶ä¸­é…�置高速缓存。 + +### 2. 解æž�过程 + +主机å�‘本地域å��æœ�务器解æž�的过程采用递归,而本地域å��æœ�务器å�‘其它域å��æœ�务器解æž�å�¯ä»¥ä½¿ç”¨é€’归和迭代两ç§�æ–¹å¼�。 + +迭代的方å¼�下,本地域å��æœ�务器å�‘一个域å��æœ�务器解æž�请求解æž�之å�Žï¼Œç»“果返回到本地域å��æœ�务器,然å�Žæœ¬åœ°åŸŸå��æœ�务器继续å�‘其它域å��æœ�务器请求解æž�;而递归地方å¼�下,结果ä¸�是直接返回的,而是继续å�‘å‰�请求解æž�,最å�Žçš„结果æ‰�会返回。 + +![](index_files/6bc61bb8-3b1c-4dc8-ac25-cef925ace0eb.jpg) + +## 文件传输å��议 FTP + +FTP 在è¿�输层使用 TCP,并且需è¦�建立两个并行的 TCP 连接:控制连接和数æ�®è¿žæŽ¥ã€‚控制连接在整个会è¯�期间一直ä¿�æŒ�打开,而数æ�®è¿žæŽ¥åœ¨æ•°æ�®ä¼ é€�完毕之å�Žå°±å…³é—­ã€‚控制连接使用端å�£å�·Â 21,数æ�®è¿žæŽ¥ä½¿ç”¨ç«¯å�£å�·Â 20。 + +![](index_files/58633775-8584-4a01-ad3f-eee4d9a466e1.jpg) + +## 远程终端å��议 TELNET + +TELNET 用于登录到远程主机上,并且远程主机上的输出也会返回。 + +TELNET å�¯ä»¥é€‚应许多计算机和æ“�作系统的差异,例如ä¸�å�Œæ“�作系统系统的æ�¢è¡Œç¬¦å®šä¹‰ã€‚ + +## 万维网 WWW + +è§� HTTP 笔记。 + +## 电å­�邮件å��è®® + +一个电å­�邮件系统由三部分组æˆ�:用户代ç�†ã€�邮件æœ�务器以å�Šé‚®ä»¶å�‘é€�å��议和读å�–å��议。其中å�‘é€�å��议常用 SMTP,读å�–å��议常用 POP3 和 IMAP。 + +![](index_files/de1e46d2-748f-4da3-a29e-7de7bc840366.jpg) + +### POP3 + +POP3 的特点是å�ªè¦�用户从æœ�务器上读å�–了邮件,就把该邮件删除。 + +### IMAP + +IMAP å��议中客户端和æœ�务器上的邮件ä¿�æŒ�å�Œæ­¥ï¼Œå¦‚æžœä¸�去手动删除邮件,那么æœ�务器上的邮件也ä¸�会被删除。IMAP 这ç§�å�𿳕å�¯ä»¥è®©ç”¨æˆ·éš�æ—¶éš�地去访问æœ�务器上的邮件。IMAP å��议也支æŒ�创建自定义的文件夹。 + +### SMTP + +SMTP å�ªèƒ½å�‘é€� ASCII ç �,而互è�”网邮件扩充 MIME å�¯ä»¥å�‘é€�二进制文件。MIME 并没有改动或者å�–代 SMTP,而是增加邮件主题的结构,定义了é�žÂ ASCII ç �的编ç �规则。 + +![](index_files/ed5522bb-3a60-481c-8654-43e7195a48fe.png) + +## 动æ€�主机é…�ç½®å��议 DHCP + +DHCP æ��供了å�³æ�’å�³ç”¨çš„连网方å¼�,用户ä¸�å†�需è¦�去手动é…�置 IP 地å�€ç­‰ä¿¡æ�¯ã€‚ + +DHCP é…�置的内容ä¸�仅是 IP 地å�€ï¼Œè¿˜åŒ…括å­�网掩ç �ã€�默认路由器 IP 地å�€ã€�域å��æœ�务器的 IP 地å�€ã€‚ + +工作方å¼�如下:需è¦� IP 地å�€çš„主机广播å�‘é€� DHCP å�‘现报文(将目的地å�€ç½®ä¸ºå…¨Â 1,å�³Â 255.255.255.255:67,æº�地å�€è®¾ç½®ä¸ºå…¨Â 0,å�³Â 0.0.0.0:68),DHCP æœ�务器收到å�‘现报文之å�Žï¼Œåˆ™åœ¨Â IP 地å�€æ± ä¸­å�–一个地å�€ï¼Œå�‘é€� DHCP æ��供报文给该主机。 + +## 点对点传输 P2P + +把æŸ�个文件分å�‘的所有对等集å�ˆç§°ä¸ºä¸€ä¸ªæ´ªæµ�。文件的数æ�®å�•元称为文件å�—,它的大å°�是固定的。一个新的对等方加入æŸ�个洪æµ�,一开始并没有文件å�—,但是能够从其它对等方中é€�æ¸�地下载到一些文件å�—,与此å�Œæ—¶ï¼Œå®ƒä¹Ÿä¸ºåˆ«çš„对等方上传一些文件å�—。 + +æ¯�个洪æµ�都有一个基础设施,称为追踪器。当一个对等方加入洪æµ�时,必须å�‘追踪器登记,并周期性地通知追踪器它ä»�在洪æµ�中。å�¯ä»¥åœ¨ä»»ä½•时间加入和退出æŸ�个洪æµ�。 + +一个新的对等方加入洪æµ�时,追踪器会éš�机从洪æµ�中选择若干个对等方,并让新对等方与这些对等方建立连接,把这些对等方称为相邻对等方。接收和å�‘é€�文件å�—都是在相邻对等方中进行。 + +当一个对等方需è¦�很多文件å�—时,通过使用最稀有优先的策略æ�¥å�–得文件å�—,也就是一个文件å�—在相邻对等方中副本最少,那么就优先请求这个文件å�—。 + +当很多对等方å�‘å�Œä¸€ä¸ªå¯¹ç­‰æ–¹è¯·æ±‚文件å�—时,该对等方优先选择以最高速率å�‘å…¶å�‘é€�文件å�—的对等方。 + +P2P 是一个分布å¼�系统,任何时候都有对等方加入或者退出。使用分布å¼�散列表 DHT,å�¯ä»¥æŸ¥æ‰¾æ´ªæµ�中的资æº�和 IP 地å�€æ˜ å°„。 + +## Web 页é�¢è¯·æ±‚过程 + +1.  å�‘ DNS æœ�务器å�‘é€� DNS 查询报文æ�¥è§£æž�域å��。 + +2. 开始进行 HTTP 会è¯�,需è¦�先建立 TCP 连接。 + +3. 在è¿�输层的传输过程中,HTTP 报文被å°�装进 TCP 中。HTTP 请求报文使用端å�£å�·Â 80,因为æœ�务器监å�¬çš„æ˜¯Â 80 端å�£ã€‚连接建立之å�Žï¼Œæœ�务器会éš�机分é…�一个端å�£å�·ç»™ç‰¹å®šçš„客户端,之å�Žçš„ TCP 传输都是用这个分é…�的端å�£å�·ã€‚ + +4. 在网络层的传输过程中,TCP 报文段会被å°�装进 IP 分组中,IP 分组ç»�过路由选择,最å�Žåˆ°è¾¾ç›®çš„地。 + +5. 在链路层,IP 分组会被å°�装进 MAC 帧中,IP 地å�€è§£æž�æˆ� MAC 地å�€éœ€è¦�使用 ARP。 + +6. 客户端å�‘é€� HTTP 请求报文,请求获å�–页é�¢ã€‚ + +7. æœ�务器å�‘é€� HTTP 相应报文,客户端从而获å�–该页é�¢ã€‚ + +8. æµ�览器得到页é�¢å†…容之å�Žï¼Œè§£æž�并渲染,å�‘用户展示页é�¢ã€‚ + + +## 常用端å�£ + +| 应用层å��议 | 端å�£å�·Â | è¿�输层å��议 | +| -- | -- | -- | +| DNS | 53 | UDP | +| FTP | 控制连接 21,数æ�®è¿žæŽ¥Â 20 | TCP | +| TELNET | 23 | TCP | +| DHCP | 67 68 | UDP | +| HTTP | 80 | TCP | +| SMTP | 25 | TCP | +| POP3 | 110 | TCP | +| IMAP | 143 | TCP | + +# å�‚考资料 + +- 计算机网络 第七版 +- 自顶å�‘下计算机网络 \ No newline at end of file diff --git a/notes/笔记/设计模å¼�.md.txt b/notes/笔记/设计模å¼�.md.txt new file mode 100644 index 00000000..0e9602fc --- /dev/null +++ b/notes/笔记/设计模å¼�.md.txt @@ -0,0 +1,1703 @@ +[TOC] + +# 第 1 章 设计模å¼�入门 + +**1. 设计模å¼�概念** + +设计模å¼�ä¸�是代ç �,而是解决问题的方案,学习现有的设计模å¼�å�¯ä»¥å�šåˆ°ç»�验å¤�用。 + +拥有设计模å¼�è¯�汇,在沟通时就能用更少的è¯�汇æ�¥è®¨è®ºï¼Œå¹¶ä¸”ä¸�需è¦�了解底层细节。 + +**2. 问题æ��è¿°** + +设计ä¸�å�Œç§�类的鸭å­�拥有ä¸�å�Œçš„å�«å£°å’Œé£žè¡Œæ–¹å¼�。 + +**3. 简å�•实现方案** + +使用继承的解决方案如下,这ç§�方案代ç �无法å¤�用,如果两个鸭å­�类拥有å�Œæ ·çš„飞行方å¼�,就有两份é‡�å¤�的代ç �。 + +![](index_files/144d28a0-1dc5-4aba-8961-ced5bc88428a.jpg) + +**4. 设计原则** + +**å°�装å�˜åŒ–**在这里å�˜åŒ–的是鸭å­�å�«å’Œé£žè¡Œçš„行为方å¼�。 + +**针对接å�£ç¼–程,而ä¸�是针对实现编程** å�˜é‡�声明的类型为父类,而ä¸�是具体的æŸ�个å­�类。父类中的方法实现ä¸�在父类,而是在å�„个å­�类。程åº�在è¿�行时å�¯ä»¥åЍæ€�改å�˜å�˜é‡�所指å�‘çš„å­�类类型。 + +è¿�用这一原则,将å�«å’Œé£žè¡Œçš„行为抽象出æ�¥ï¼Œå®žçŽ°å¤šç§�ä¸�å�Œçš„å�«å’Œé£žè¡Œçš„å­�类,让å­�类去实现具体的å�«å’Œé£žè¡Œæ–¹å¼�。 + +![](index_files/1c8ccf5c-7ecd-4b8a-b160-3f72a510ce26.png) + +**多用组å�ˆï¼Œå°‘用继承** 组å�ˆä¹Ÿå°±æ˜¯Â has-a 关系,通过组å�ˆï¼Œå�¯ä»¥åœ¨è¿�行时动æ€�改å�˜å®žçŽ°ï¼Œå�ªè¦�通过改å�˜çˆ¶ç±»å¯¹è±¡å…·ä½“指å�‘哪个å­�ç±»å�³å�¯ã€‚而继承就ä¸�能å�šåˆ°è¿™äº›ï¼Œç»§æ‰¿ä½“系在创建类时就已ç»�确定。 + +è¿�用这一原则,在 Duck 类中组å�ˆÂ FlyBehavior 和 QuackBehavior 类,performQuack() 和 performFly() 方法委托给这两个类去处ç�†ã€‚通过这ç§�æ–¹å¼�,一个 Duck å­�ç±»å�¯ä»¥æ ¹æ�®éœ€è¦�去实例化 FlyBehavior 和 QuackBehavior 的å­�类对象,并且也å�¯ä»¥åЍæ€�地进行改å�˜ã€‚ + +![](index_files/29574e6f-295c-444e-83c7-b162e8a73a83.jpg) + +**5. 整体设计图** + +![](index_files/e13833c8-e215-462e-855c-1d362bb8d4a0.jpg) + +**6. 模å¼�定义** + +**策略模å¼�** :定义了算法æ—�,分别å°�装起æ�¥ï¼Œè®©å®ƒä»¬ä¹‹é—´å�¯ä»¥äº’相替æ�¢ï¼Œæ­¤æ¨¡å¼�让算法的å�˜åŒ–独立于使用算法的客户。 + +**7. 实现代ç �** + +```java +public abstract class Duck { +    FlyBehavior flyBehavior; +    QuackBehavior quackBehavior; + +    public Duck(){ +    } + +    public void performFly(){ +        flyBehavior.fly(); +    } + +    public void setFlyBehavior(FlyBehavior fb){ +        flyBehavior = fb; +    } + +    public void performQuack(){ +        quackBehavior.quack(); +    } + +    public void setQuackBehavior(QuackBehavior qb){ +        quackBehavior = qb; +    } +} +``` +```java +public class MallarDuck extends Duck{ +    public MallarDuck(){ +        flyBehavior = new FlyWithWings(); +        quackBehavior = new Quack(); +    } +} +``` +```java +public interface FlyBehavior { +    void fly(); +} +``` +```java +public class FlyNoWay implements FlyBehavior{ +    @Override +    public void fly() { +        System.out.println("FlyBehavior.FlyNoWay"); +    } +} +``` +```java +public class FlyWithWings implements FlyBehavior{ +    @Override +    public void fly() { +        System.out.println("FlyBehavior.FlyWithWings"); +    } +} +``` +```java +public interface QuackBehavior { +    void quack(); +} +``` +```java +public class Quack implements QuackBehavior{ +    @Override +    public void quack() { +        System.out.println("QuackBehavior.Quack"); +    } +} +``` +```java +public class MuteQuack implements QuackBehavior{ +    @Override +    public void quack() { +        System.out.println("QuackBehavior.MuteQuack"); +    } +} +``` +```java +public class Squeak implements QuackBehavior{ +    @Override +    public void quack() { +        System.out.println("QuackBehavior.Squeak"); +    } +} +``` +```java +public class MiniDuckSimulator { +    public static void main(String[] args) { +        Duck mallarDuck = new MallarDuck(); +        mallarDuck.performQuack(); +        mallarDuck.performFly(); +        mallarDuck.setFlyBehavior(new FlyNoWay()); +        mallarDuck.performFly(); +    } +} +``` +执行结果 +```html +QuackBehavior.Quack +FlyBehavior.FlyWithWings +FlyBehavior.FlyNoWay +``` + +# 第 2 章 观察者模å¼� + +**1. 模å¼�定义** + +定义了对象之间的一对多ä¾�赖,当一个对象改å�˜çжæ€�时,它的所有ä¾�赖者都会å�—到通知并自动更新。主题(Subject)是被观察的对象,而其所有ä¾�赖者(Observer)æˆ�为观察者。 + +![](index_files/26cb5e7e-6fa3-44ad-854e-fe24d1a5278c.jpg) + +**2. 模å¼�类图** + +主题中具有注册和移除观察者,并通知所有注册者的功能,主题是通过维护一张观察者列表æ�¥å®žçŽ°è¿™äº›æ“�作的。 + +观察者拥有一个主题对象的引用,因为注册ã€�移除还有数æ�®éƒ½åœ¨ä¸»é¢˜å½“中,必须通过æ“�作主题æ‰�能完æˆ�相应功能。 + +![](index_files/5c558190-fccd-4b5e-98ed-1896653fc97f.jpg) + +**3. 问题æ��è¿°** + +天气数æ�®å¸ƒå‘Šæ�¿ä¼šåœ¨å¤©æ°”ä¿¡æ�¯å�‘生改å�˜æ—¶æ›´æ–°å…¶å†…容,布告æ�¿æœ‰å¤šä¸ªï¼Œå¹¶ä¸”在将æ�¥ä¼šç»§ç»­å¢žåŠ ã€‚ + +**4. 解决方案类图** + +![](index_files/760a5d63-d96d-4dd9-bf9a-c3d126b2f401.jpg) + +**5. 设计原则** + +**为交互对象之间的æ�¾è€¦å�ˆè®¾è®¡è€ŒåŠªåŠ›** 当两个对象之间æ�¾è€¦å�ˆï¼Œå®ƒä»¬ä¾�ç„¶å�¯ä»¥äº¤äº’,但是ä¸�太清楚彼此的细节。由于æ�¾è€¦å�ˆçš„两个对象之间互相ä¾�赖程度很低,因此系统具有弹性,能够应对å�˜åŒ–。 + +**6. 实现代ç �** + +```java +public interface Subject { +    public void resisterObserver(Observer o); +    public void removeObserver(Observer o); +    public void notifyObserver(); +} +``` +```java +import java.util.ArrayList; +import java.util.List; + +public class WeatherData implements Subject { +    private List observers; +    private float temperature; +    private float humidity; +    private float pressure; + +    public WeatherData() { +        observers = new ArrayList<>(); +    } + +    @Override +    public void resisterObserver(Observer o) { +        observers.add(o); +    } + +    @Override +    public void removeObserver(Observer o) { +        int i = observers.indexOf(o); +        if (i >= 0) { +            observers.remove(i); +        } +    } + +    @Override +    public void notifyObserver() { +        for (Observer o : observers) { +            o.update(temperature, humidity, pressure); +        } +    } + +    public void setMeasurements(float temperature, float humidity, float pressure) { +        this.temperature = temperature; +        this.humidity = humidity; +        this.pressure = pressure; +        notifyObserver(); +    } +} +``` +```java +public interface Observer { +    public void update(float temp, float humidity, float pressure); +} +``` +```java +public class CurrentConditionsDisplay implements Observer { +    private Subject weatherData; + +    public CurrentConditionsDisplay(Subject weatherData) { +        this.weatherData = weatherData; +        weatherData.resisterObserver(this); +    } + +    @Override +    public void update(float temp, float humidity, float pressure) { +        System.out.println("CurrentConditionsDisplay.update:" + temp + " " + humidity + " " + pressure); +    } +} +``` +```java +public class StatisticsDisplay implements Observer { +    private Subject weatherData; + +    public StatisticsDisplay(Subject weatherData) { +        this.weatherData = weatherData; +        weatherData.resisterObserver(this); +    } + +    @Override +    public void update(float temp, float humidity, float pressure) { +        System.out.println("StatisticsDisplay.update:" + temp + " " + humidity + " " + pressure); +    } +} +``` +```java +public class WeatherStation { +    public static void main(String[] args) { +        WeatherData weatherData = new WeatherData(); +        CurrentConditionsDisplay currentConditionsDisplay = new CurrentConditionsDisplay(weatherData); +        StatisticsDisplay statisticsDisplay = new StatisticsDisplay(weatherData); + +        weatherData.setMeasurements(0, 0, 0); +        weatherData.setMeasurements(1, 1, 1); +    } +} +``` +执行结果 +```html +CurrentConditionsDisplay.update:0.0 0.0 0.0 +StatisticsDisplay.update:0.0 0.0 0.0 +CurrentConditionsDisplay.update:1.0 1.0 1.0 +StatisticsDisplay.update:1.0 1.0 1.0 +``` + +# 第 3 章 装饰模å¼� + +**1. 问题æ��è¿°** + +设计ä¸�å�Œç§�类的饮料,并且æ¯�ç§�饮料å�¯ä»¥åЍæ€�添加新的æ��料,比如å�¯ä»¥æ·»åŠ ç‰›å¥¶ã€‚è®¡ç®—ä¸€ç§�饮料的价格。 + +**2. 模å¼�定义** + +动æ€�地将责任附加到对象上。在扩展功能上,装饰者æ��供了比继承更有弹性的替代方案。 + +下图中 DarkRoast 对象被 Mocha 包裹,Mocha 对象å�ˆè¢«Â Whip 包裹,并且他们都继承自相å�Œçˆ¶ç±»ï¼Œéƒ½æœ‰Â cost() 方法,但是外层对象的 cost() 方法实现调用了内层对象的 cost() 方法。因此,如果è¦�在 DarkRoast 上添加 Mocha,那么å�ªéœ€è¦�用 Mocha 包裹 DarkRoast,如果还需è¦� Whip ,就用 Whip 包裹 Mocha,最å�Žè°ƒç”¨Â cost() 方法能把三ç§�对象的价格都包å�«è¿›åŽ»ã€‚ + +![](index_files/41a4cb30-f393-4b3b-abe4-9941ccf8fa1f.jpg) + +**3. 模å¼�类图** + +装饰者和具体组件都继承自组件类型,其中具体组件的方法实现ä¸�需è¦�ä¾�赖于其它对象,而装饰者拥有一个组件类型对象,这样它å�¯ä»¥è£…饰其它装饰者或者具体组件。所谓装饰,就是把这个装饰者套在被装饰的对象之外,从而动æ€�扩展被装饰者的功能。装饰者的方法有一部分是自己的,这属于它的功能,然å�Žè°ƒç”¨è¢«è£…饰者的方法实现,从而也ä¿�留了被装饰者的功能。å�¯ä»¥çœ‹åˆ°ï¼Œå…·ä½“组件应当是装饰层次的最低层,因为å�ªæœ‰å…·ä½“组件有直接实现而ä¸�需è¦�委托给其它对象去处ç�†ã€‚ + +![](index_files/3dc454fb-efd4-4eb8-afde-785b2182caeb.jpg) + +**4. 问题解决方案的类图** + +![](index_files/9c997ac5-c8a7-44fe-bf45-2c10eb773e53.jpg) + +**5. 设计原则** + +**类应该对扩展开放,对修改关闭。**也就是添加新功能时ä¸�需è¦�修改代ç �。在本章问题中该原则体现在,在饮料中添加新的æ��料,而ä¸�需è¦�去修改饮料的代ç �。观察则模å¼�也符å�ˆè¿™ä¸ªåŽŸåˆ™ã€‚ä¸�å�¯èƒ½æ‰€æœ‰ç±»éƒ½èƒ½å®žçŽ°è¿™ä¸ªåŽŸåˆ™ï¼Œåº”å½“æŠŠè¯¥åŽŸåˆ™åº”ç”¨äºŽè®¾è®¡ä¸­æœ€æœ‰å�¯èƒ½æ”¹å�˜çš„地方。 + +**6. Java I/O 中的装饰者模å¼�** + +![](index_files/2a40042a-03c8-4556-ad1f-72d89f8c555c.jpg) + +**7. 代ç �实现** + +```java +public interface Beverage { +    public double cost(); +} +``` +```java +public class HouseBlend implements Beverage{ +    @Override +    public double cost() { +        return 1; +    } +} +``` +```java +public class DarkRoast implements Beverage{ +    @Override +    public double cost() { +        return 1; +    } +} +``` +```java +public abstract class CondimentDecorator implements Beverage{ +    protected Beverage beverage; +} +``` +```java +public class Mocha extends CondimentDecorator { + +    public Mocha(Beverage beverage) { +        this.beverage = beverage; +    } + +    @Override +    public double cost() { +        return 1 + beverage.cost(); +    } +} +``` +```java +public class Milk extends CondimentDecorator { + +    public Milk(Beverage beverage) { +        this.beverage = beverage; +    } + +    @Override +    public double cost() { +        return 1 + beverage.cost(); +    } +} +``` +```java +public class StartbuzzCoffee { +    public static void main(String[] args) { +        Beverage beverage = new HouseBlend(); +        beverage = new Mocha(beverage); +        beverage = new Milk(beverage); +        System.out.println(beverage.cost()); +    } +} +``` + +输出 + +```html +3.0 +``` + +# 第 4 章 工厂模å¼� + +## 4.1 简å�•工厂 + +**1. 问题æ��è¿°** + +有ä¸�å�Œçš„ Pizza,根æ�®ä¸�å�Œçš„æƒ…况用ä¸�å�Œçš„å­�类实例化一个 Pizza 对象。 + +**2. 定义** + +简å�•工厂ä¸�是设计模å¼�,更åƒ�是一ç§�编程习惯。在实例化一个超类的对象时,å�¯ä»¥ç”¨å®ƒçš„æ‰€æœ‰å­�ç±»æ�¥è¿›è¡Œå®žä¾‹åŒ–,è¦�æ ¹æ�®å…·ä½“需求æ�¥å†³å®šä½¿ç”¨å“ªä¸ªå­�类。在这ç§�情况下,把实例化的æ“�作放到工厂æ�¥ä¸­ï¼Œè®©å·¥åŽ‚ç±»æ�¥å†³å®šåº”该用哪个å­�ç±»æ�¥å®žä¾‹åŒ–。这样å�šæŠŠå®¢æˆ·å¯¹è±¡å’Œå…·ä½“å­�类的实现解耦,客户对象ä¸�å†�需è¦�知é�“有哪些å­�类以å�Šå®žä¾‹åŒ–哪个å­�类。因为客户类往往有多个,如果ä¸�使用简å�•工厂,那么所有的客户类都è¦�知é�“所有å­�类的细节,一旦å­�ç±»å�‘生改å�˜ï¼Œä¾‹å¦‚增加å­�类,那么所有的客户类都è¦�å�‘生改å�˜ã€‚ + +![](index_files/c470eb9b-fb05-45c5-8bb7-1057dc3c16de.jpg) + +**3. 解决方案类图** + +![](index_files/dc3e704c-7c57-42b8-93ea-ddd068665964.jpg) + + +**4. 代ç �实现** + +```java +public interface Pizza { +    public void make(); +} +``` +```java +public class CheesePizza implements Pizza{ +    @Override +    public void make() { +        System.out.println("CheesePizza"); +    } +} +``` +```java +public class GreekPizza implements Pizza{ +    @Override +    public void make() { +        System.out.println("GreekPizza"); +    } +} +``` +```java +public class SimplePizzaFactory { +    public Pizza createPizza(String type) { +        if (type.equals("cheese")) { +            return new CheesePizza(); +        } else if (type.equals("greek")) { +            return new GreekPizza(); +        } else { +            throw new UnsupportedOperationException(); +        } +    } +} +``` +```java +public class PizzaStore { +    public static void main(String[] args) { +        SimplePizzaFactory simplePizzaFactory = new SimplePizzaFactory(); +        Pizza pizza = simplePizzaFactory.createPizza("cheese"); +        pizza.make(); +    } +} +``` + +è¿�行结果 + +```java +CheesePizza +``` + +## 4.2 工厂方法模å¼� + +**1. 问题æ��è¿°** + +æ¯�个地区的 Pizza 店虽然ç§�类相å�Œï¼Œä½†æ˜¯éƒ½æœ‰è‡ªå·±çš„风味,需è¦�å�•独区分。例如,一个客户点了纽约的 cheese ç§�类的 Pizza 和在èŠ�加哥点的相å�Œç§�类的 Pizza 是ä¸�å�Œçš„。 + +**2. 模å¼�定义** + +定义了一个创建对象的接å�£ï¼Œä½†ç”±å­�类决定è¦�实例化的类是哪一个。工厂方法让类把实例化推迟到å­�类。 + +**3. 模å¼�类图** + +在简å�•工厂中,创建对象的是å�¦ä¸€ä¸ªç±»ï¼Œè€Œåœ¨å·¥åŽ‚æ–¹æ³•ä¸­ï¼Œæ˜¯ç”±å­�ç±»æ�¥åˆ›å»ºå¯¹è±¡ã€‚工厂方法常用在在æ¯�个å­�类都有自己的一组产å“�类。å�¯ä»¥ä¸ºæ¯�个å­�类创建å�•独的简å�•工厂,但是把简å�•工厂中创建对象的代ç �放到å­�类中æ�¥å�¯ä»¥å‡�少类的数目,因为å­�ç±»ä¸�算是产å“�类,因此完全å�¯ä»¥è¿™ä¹ˆå�šã€‚ + +![](index_files/903093ec-acc8-4f9b-bf2c-b990b9a5390c.jpg) + +**4. 解决方案类图** + +![](index_files/664f8901-5dc7-4644-a072-dad88cc5133a.jpg) + +**5. 代ç �实现** + +```java +public interface Pizza { +    public void make(); +} +``` +```java +public interface PizzaStore { +    public Pizza orderPizza(String item); +} +``` +```java +public class NYStyleCheesePizza implements Pizza{ +    @Override +    public void make() { +        System.out.println("NYStyleCheesePizza is making.."); +    } +} +``` +```java +public class NYStyleVeggiePizza implements Pizza { +    @Override +    public void make() { +        System.out.println("NYStyleVeggiePizza is making.."); +    } +} +``` +```java +public class ChicagoStyleCheesePizza implements Pizza{ +    @Override +    public void make() { +        System.out.println("ChicagoStyleCheesePizza is making.."); +    } +} +``` +```java +public class ChicagoStyleVeggiePizza implements Pizza{ +    @Override +    public void make() { +        System.out.println("ChicagoStyleVeggiePizza is making.."); +    } +} +``` +```java +public class NYPizzaStore implements PizzaStore { +    @Override +    public Pizza orderPizza(String item) { +        Pizza pizza = null; +        if (item.equals("cheese")) { +            pizza = new NYStyleCheesePizza(); +        } else if (item.equals("veggie")) { +            pizza = new NYStyleVeggiePizza(); +        } else { +            throw new UnsupportedOperationException(); +        } +        pizza.make(); +        return pizza; +    } +} +``` +```java +public class ChicagoPizzaStore implements PizzaStore { +    @Override +    public Pizza orderPizza(String item) { +        Pizza pizza = null; +        if (item.equals("cheese")) { +            pizza = new ChicagoStyleCheesePizza(); +        } else if (item.equals("veggie")) { +            pizza = new ChicagoStyleVeggiePizza(); +        } else { +            throw new UnsupportedOperationException(); +        } +        pizza.make(); +        return pizza; +    } +} +``` +```java +public class PizzaTestDrive { +    public static void main(String[] args) { +        PizzaStore nyStore = new NYPizzaStore(); +        nyStore.orderPizza("cheese"); +        PizzaStore chicagoStore = new ChicagoPizzaStore(); +        chicagoStore.orderPizza("cheese"); +    } +} +``` + +è¿�行结果 + +```html +NYStyleCheesePizza is making.. +ChicagoStyleCheesePizza is making.. +``` + +## 4.3 抽象工厂模å¼� + +**1. 设计原则** + +**ä¾�赖倒置原则**:è¦�ä¾�赖抽象,ä¸�è¦�ä¾�赖具体类。å�¬èµ·æ�¥åƒ�是针对接å�£ç¼–程,ä¸�针对实现编程,但是这个原则说明了:ä¸�能让高层组件ä¾�赖底层组件,而且,ä¸�管高层或底层组件,两者都应该ä¾�赖于抽象。例如,下图中 PizzaStore 属于高层组件,但是它ä¾�赖于底层组件 Pizza 的具体类。如果ä¾�赖的是 Pizza 的抽象类,那么就å�¯ä»¥ä¸�用关心 Pizza 的具体实现细节。 + +![](index_files/ddf72ca9-c0be-49d7-ab81-57a99a974c8e.jpg) + +**2. 模å¼�定义** + +æ��供一个接å�£ï¼Œç”¨äºŽåˆ›å»ºç›¸å…³æˆ–ä¾�赖对象的家æ—�,而ä¸�需è¦�明确指定具体类。 + +**3. 模å¼�类图** + +抽象工厂模å¼�创建的是对象家æ—�,也就是很多对象而ä¸�是一个对象,并且这些对象是相关的,也就是说必须一起创建出æ�¥ã€‚而工厂模å¼�å�ªæ˜¯ç”¨äºŽåˆ›å»ºä¸€ä¸ªå¯¹è±¡ï¼Œè¿™å’ŒæŠ½è±¡å·¥åŽ‚æ¨¡å¼�有很大ä¸�å�Œã€‚并且,抽象工厂模å¼�也用到了工厂模å¼�æ�¥åˆ›å»ºå�•一对象,在类图左部,AbstractFactory 中的 CreateProductA 和 CreateProductB 方法都是让å­�ç±»æ�¥å®žçŽ°ï¼Œè¿™ä¸¤ä¸ªæ–¹æ³•å�•独æ�¥çœ‹å°±æ˜¯åœ¨åˆ›å»ºä¸€ä¸ªå¯¹è±¡ï¼Œè¿™ç¬¦å�ˆå·¥åŽ‚æ¨¡å¼�的定义。至于创建对象的家æ—�这一概念是在 Client 体现,Client è¦�通过 AbstractFactory å�Œæ—¶è°ƒç”¨ä¸¤ä¸ªæ–¹æ³•æ�¥åˆ›å»ºå‡ºä¸¤ä¸ªå¯¹è±¡ï¼Œåœ¨è¿™é‡Œè¿™ä¸¤ä¸ªå¯¹è±¡å°±æœ‰å¾ˆå¤§çš„相关性,Client 需è¦�这两个对象的å��作æ‰�能完æˆ�任务。从高层次æ�¥çœ‹ï¼ŒæŠ½è±¡å·¥åŽ‚ä½¿ç”¨äº†ç»„å�ˆï¼Œå�³Â Cilent 组å�ˆäº†Â AbstractFactory ,而工厂模å¼�使用了继承。 + +![](index_files/d301774f-e0d2-41f3-95f4-bfe39859b52e.jpg) + +**4. 解决方案类图** + +![](index_files/8785dabd-1285-4bd0-b3aa-b05cc060a24a.jpg) + +**5. 代ç �实现** + +```java +public interface Dough { +    public String doughType(); +} +``` +```java +public class ThickCrustDough implements Dough{ + +    @Override +    public String doughType() { +        return "ThickCrustDough"; +    } +} +``` +```java +public class ThinCrustDough implements Dough { +    @Override +    public String doughType() { +        return "ThinCrustDough"; +    } +} +``` +```java +public interface Sauce { +    public String sauceType(); +} +``` +```java +public class MarinaraSauce implements Sauce { +    @Override +    public String sauceType() { +        return "MarinaraSauce"; +    } +} +``` +```java +public class PlumTomatoSauce implements Sauce { +    @Override +    public String sauceType() { +        return "PlumTomatoSauce"; +    } +} +``` +```java +public interface PizzaIngredientFactory { +    public Dough createDough(); +    public Sauce createSauce(); +} +``` +```java +public class NYPizzaIngredientFactory implements PizzaIngredientFactory{ +    @Override +    public Dough createDough() { +        return new ThickCrustDough(); +    } + +    @Override +    public Sauce createSauce() { +        return new MarinaraSauce(); +    } +} +``` +```java +public class ChicagoPizzaIngredientFactory implements PizzaIngredientFactory{ +    @Override +    public Dough createDough() { +        return new ThinCrustDough(); +    } + +    @Override +    public Sauce createSauce() { +        return new PlumTomatoSauce(); +    } +} +``` +```java +public class NYPizzaStore { +    private PizzaIngredientFactory ingredientFactory; + +    public NYPizzaStore() { +        ingredientFactory = new NYPizzaIngredientFactory(); +    } + +    public void makePizza() { +        Dough dough = ingredientFactory.createDough(); +        Sauce sauce = ingredientFactory.createSauce(); +        System.out.println(dough.doughType()); +        System.out.println(sauce.sauceType()); +    } +} +``` +```java +public class NYPizzaStoreTestDrive { +    public static void main(String[] args) { +        NYPizzaStore nyPizzaStore = new NYPizzaStore(); +        nyPizzaStore.makePizza(); +    } +} +``` + +è¿�行结果 + +```html +ThickCrustDough +MarinaraSauce +``` + +# 第 5 章 å�•件模å¼� + +**1. 模å¼�定义** + +ç¡®ä¿�一个类å�ªæœ‰ä¸€ä¸ªå®žä¾‹ï¼Œå¹¶æ��供了一个全局访问点。 + +**2. 模å¼�类图** + +å�•件模å¼�的 Java 实现用一个ç§�有构造器ã€�一个ç§�有é�™æ€�å�˜é‡�以å�Šä¸€ä¸ªå…¬æœ‰é�™æ€�函数,该函数返回ç§�有å�˜é‡�,使得所有通过该函数获å�–的对象都指å�‘这个唯一的ç§�有é�™æ€�å�˜é‡�。 + +![](index_files/59aff6c1-8bc5-48e4-9e9c-082baeb2f274.jpg) + +**3. ç»�典实现** + +以下实现中,ç§�有é�™æ€�å�˜é‡�被延迟化实例化,这样å�šçš„好处是,如果没有用到该类,那么就ä¸�会创建该ç§�有é�™æ€�å�˜é‡�,从而节约资æº�。这个实现在多线程环境下是ä¸�安全的,因为多个线程能够å�Œæ—¶è¿›å…¥Â if(uniqueInstance == null) 内的语å�¥å�—,那么就会多次实例化 uniqueInstance ç§�有é�™æ€�å�˜é‡�。 + +```java +public class Singleton { + +    private static Singleton uniqueInstance; + +    private Singleton() { +    } + +    public static Singleton getUniqueInstance() { +        if (uniqueInstance == null) { +            uniqueInstance = new Singleton(); +        } +        return uniqueInstance; +    } +} +``` + +**4. 线程ä¸�安全问题的解决方案一** + +å�ªéœ€è¦�对 getUniqueInstance() 方法加é”�,就能让该方法一次å�ªèƒ½ä¸€ä¸ªçº¿ç¨‹è®¿é—®ï¼Œä»Žè€Œé�¿å…�了对 uniqueInstance å�˜é‡�进行多次实例化的问题。但是这样有一个问题是一次å�ªèƒ½ä¸€ä¸ªçº¿ç¨‹è¿›å…¥ï¼Œæ€§èƒ½ä¸Šä¼šæœ‰ä¸€å®šçš„æµªè´¹ã€‚ + +```java +    public static synchronized Singleton getUniqueInstance() { +        if (uniqueInstance == null) { +            uniqueInstance = new Singleton(); +        } +        return uniqueInstance; +    } +``` + +**5. 线程ä¸�安全问题的解决方案二** + +ä¸�用延迟实例化,采用直接实例化。 + +```java +private static Singleton uniqueInstance = new Singleton(); +``` + +**6. 线程ä¸�安全问题的解决方案三** + +考虑第一个解决方案,它是直接对 getUniqueInstance() 方法进行加é”�,而实际上å�ªéœ€è¦�对 uniqueInstance = new Singleton(); 这æ�¡è¯­å�¥åŠ é”�å�³å�¯ã€‚使用两个æ�¡ä»¶è¯­å�¥æ�¥åˆ¤æ–­Â uniqueInstance 是å�¦å·²ç»�实例化,如果没有实例化æ‰�需è¦�加é”�。 + +```java +public class Singleton { + +    private volatile static Singleton uniqueInstance; + +    private Singleton() { +    } + +    public static synchronized Singleton getUniqueInstance() { +        if (uniqueInstance == null) { +            synchronized (Singleton.class) { +                if (uniqueInstance == null) { +                    uniqueInstance = new Singleton(); +                } +            } +        } +        return uniqueInstance; +    } +} +``` + +# 第 6 章 命令模å¼� + +**1. 问题æ��è¿°** + +设计一个é�¥æŽ§å™¨ï¼Œå®ƒæœ‰å¾ˆå¤šæŒ‰é’®ï¼Œæ¯�个按钮å�¯ä»¥å�‘起一个命令,让一个家电完æˆ�相应æ“�作。有é�žå¸¸å¤šçš„家电,并且也会增加家电。 + +![](index_files/7b8f0d8e-a4fa-4c9d-b9a0-3e6a11cb3e33.jpg) + +![](index_files/c3ca36b2-8459-4cf1-98b0-cc95a0e94f20.jpg) + +**2. 模å¼�定义** + +将命令å°�装æˆ�对象,以便使用ä¸�å�Œçš„命令æ�¥å�‚数化其它对象。 + +**3. 模å¼�类图** + +![](index_files/1e09d75f-6268-4425-acf8-8ecd1b4a0ef3.jpg) + +**4. 解决方案类图** + +Invoker 是é�¥æŽ§å™¨ï¼Œå®ƒå�¯ä»¥è®¾ç½®å‘½ä»¤ï¼Œå¹¶ä¸”调用命令对象的 execute() 方法。Receiver 是电ç�¯ï¼Œæ˜¯å‘½ä»¤çœŸæ­£çš„æ‰§è¡Œè€…。ConcreteCommand 类组å�ˆäº†ä¸€ä¸ªÂ Receiver 对象,命令的执行委托给 Receiver 对象æ�¥å¤„ç�†ï¼Œä¹Ÿå°±æ˜¯Â LightOnCommand 命令的 excute 方法委托给 Light 对象æ�¥å¤„ç�†ï¼ŒLight 对象通过调用 on() 方法æ�¥å®Œæˆ�æ“�作。Invoker ä¸�是 Client 对象,是因为命令的创建ä¸�是在 Invoker 中完æˆ�的,因此需è¦�é¢�外的 Client 对象æ�¥å¤„ç�†è¿™äº›æ“�作。 + +![](index_files/5ef94f62-98ce-464d-a646-842d9c72c8b8.jpg) + +**5. 代ç �实现** + +```java +public interface Command { +    public void execute(); +} +``` +```java +public class Light { + +    public void on() { +        System.out.println("Light is on!"); +    } + +    public void off() { +        System.out.println("Light is off!"); +    } +} +``` +```java +public class LightOnCommand implements Command{ +    Light light; + +    public LightOnCommand(Light light) { +        this.light = light; +    } + +    @Override +    public void execute() { +        light.on(); +    } +} +``` +```java +/** + * é�¥æŽ§å™¨ç±» + */ +public class SimpleRemoteControl { +    Command slot; + +    public SimpleRemoteControl() { + +    } + +    public void setCommand(Command command) { +        this.slot = command; +    } + +    public void buttonWasPressed() { +        slot.execute(); +    } + +} +``` +```java +public class RemoteLoader { +    public static void main(String[] args) { +        SimpleRemoteControl remote = new SimpleRemoteControl(); +        Light light = new Light(); +        LightOnCommand lightOnCommand = new LightOnCommand(light); +        remote.setCommand(lightOnCommand); +        remote.buttonWasPressed(); +    } +} +``` + +输出 + +```html +Light is on! +``` + +# 第 7 章 适é…�器模å¼�与外观模å¼� + +## 7.1 适é…�器模å¼� + +**1. 模å¼�定义** + +将一个类的接å�£ï¼Œè½¬æ�¢ä¸ºå®¢æˆ·æœŸæœ›çš„å�¦ä¸€ä¸ªæŽ¥å�£ã€‚适é…�器让原本ä¸�兼容的类å�¯ä»¥å�ˆä½œæ— é—´ã€‚ + +![](index_files/8e8ba824-7a9e-4934-a212-e6a41dcc1602.jpg) + +**2. 模å¼�类图** + +有两ç§�适é…�器模å¼�的实现,一ç§�是对象方å¼�,一ç§�是类方å¼�。对象方å¼�是通过组å�ˆçš„æ–¹æ³•,让适é…�器类(Adapter)拥有一个待适é…�的对象(Adaptee),从而把相应的处ç�†å§”托给待适é…�的对象。类方å¼�用到多é‡�继承,Adapter å�¯ä»¥çœ‹æˆ� Target 和 Adaptee 类型,先把它当æˆ� Adaptee 类型然å�Žå®žä¾‹åŒ–一个 Adapter 对象,å†�把它当æˆ� Target 类型的,这样 Client 就å�¯ä»¥æŠŠè¿™ä¸ªå¯¹è±¡å½“æˆ� Target 的对象æ�¥å¤„ç�†ã€‚ + +![](index_files/253bd869-ea48-4092-9aed-6906ccb2f3b0.jpg) + +![](index_files/a797959a-0ed5-475b-8d97-df157c672019.jpg) + +**3. 问题æ��è¿°** + +让鸭å­�(Duck)适é…�ç�«é¸¡ï¼ˆTurkey),Duck 有 quack() 方法,而 Turkey å�ªæœ‰Â gobble() 方法。也就是è¦�让 Turkey 也有 Duck 的 quack() 方法。 + +**4. 解决方案类图** + +![](index_files/1a511c76-bb6b-40ab-b8aa-39eeb619d673.jpg) + +**5. 代ç �实现** + +```java +public interface Duck { +    public void quack(); +    public void fly(); +} +``` +```java +public interface Turkey { +    public void gobble(); +    public void fly(); +} +``` +```java +public class WildTurkey implements Turkey{ +    @Override +    public void gobble() { +        System.out.println("gobble!"); +    } + +    @Override +    public void fly() { +        System.out.println("fly!"); +    } +} +``` +```java +public class TurkeyAdapter implements Duck{ +    Turkey turkey; + +    public TurkeyAdapter(Turkey turkey) { +        this.turkey = turkey; +    } + +    @Override +    public void quack() { +        turkey.gobble(); +    } + +    @Override +    public void fly() { +        turkey.fly(); +    } +} +``` +```java +public class DuckTestDrive { +    public static void main(String[] args) { +        Turkey turkey = new WildTurkey(); +        Duck duck = new TurkeyAdapter(turkey); +        duck.quack(); +        duck.fly(); +    } +} +``` + +è¿�行结果 +```html +gobble! +fly! +``` + +## 7.2 外观模å¼� + +**1. 模å¼�定义** + +æ��供了一个统一的接å�£ï¼Œç”¨æ�¥è®¿é—®å­�系统中的一群接å�£ã€‚外观定义了一个高层接å�£ï¼Œè®©å­�系统更容易使用。 + +**2. 模å¼�类图** + +![](index_files/78f2314e-2643-41df-8f3d-b7e28294094b.jpg) + +**3. 问题æ��è¿°** + +家庭影院中有众多电器,当è¦�进行观看电影时需è¦�对很多电器进行æ“�作。è¦�求简化这些æ“�作,使得家庭影院类å�ªæ��供一个简化的接å�£ï¼Œä¾‹å¦‚æ��供一个看电影的接å�£è€Œä¸�用具体æ“�作众多电器。 + +![](index_files/106f5585-b2e7-4718-be5d-3b322d1ef42a.jpg) + +**4. 解决方案类图** + +![](index_files/25387681-89f8-4365-a2fa-83b86449ee84.jpg) + +**5. 设计原则** + +**最少知识原则**:å�ªå’Œä½ çš„密å�‹è°ˆè¯�。也就是应当使得客户对象所需è¦�交互的对象应当尽å�¯èƒ½å°‘。 + +# 第 8 章 模æ�¿æ–¹æ³•模å¼� + +**1. 模å¼�定义** + +在一个方法中定义一个算法的骨架,而将一些步骤延迟到å­�类中。 + +模æ�¿æ–¹æ³•使得å­�ç±»å�¯ä»¥åœ¨ä¸�改å�˜ç®—法结构的情况下,é‡�新定义算法中的æŸ�些步骤。 + +**2. 模å¼�类图** + +模æ�¿æ–¹æ³• templateMethod() 定义了算法的骨架,确定了 primitiveOperation1() 和 primitiveOperation2() 方法执行的顺åº�,而 primitiveOperation1() 和 primitiveOperation2() 让å­�类去具体实现。 + +![](index_files/ed62f400-192c-4185-899b-187958201f0c.jpg) + +**3. 问题æ��è¿°** + +冲咖啡和冲茶都有类似的æµ�程,但是æŸ�些步骤会有点ä¸�一样。 + +![](index_files/d8f873fc-00bc-41ee-a87c-c1b4c0172844.png) + +**4. 解决方案类图** + +![](index_files/aa20c123-b6b5-432a-83d3-45dc39172192.jpg) + +**5. 设计原则** + +**好莱å�žåŽŸåˆ™**:别调用(打电è¯�给)我们,我们会调用(打电è¯�给)你。这一原则å�¯ä»¥é˜²æ­¢ä¾�èµ–è…�败,å�³é˜²æ­¢é«˜å±‚组件ä¾�赖底层组件,底层组件å�ˆä¾�赖高层组件。该原则在模æ�¿æ–¹æ³•的体现为,å�ªæœ‰çˆ¶ç±»ä¼šè°ƒç”¨å­�类,å­�ç±»ä¸�会调用父类。 + +**6. 钩å­�** + +é’©å­�(hock):æŸ�些步骤在ä¸�å�Œå®žçް䏭å�¯æœ‰å�¯æ— ï¼Œå�¯ä»¥å…ˆå®šä¹‰ä¸€ä¸ªä»€ä¹ˆéƒ½ä¸�å�šçš„æ–¹æ³•,把它加到模æ�¿æ–¹æ³• templteMethod() 中,如果å­�类需è¦�它就覆盖默认实现并加上自己的实现。 + +**7. 代ç �实现** + +```java +public abstract class CaffeineBeverage { + +    final void prepareRecipe(){ +        boilWater(); +        brew(); +        pourInCup(); +        addCondiments(); +    } + +    abstract void brew(); + +    abstract void addCondiments(); + +    void boilWater(){ +        System.out.println("boilWater"); +    } + +    void pourInCup(){ +        System.out.println("pourInCup"); +    } +} +``` +```java +public class Coffee extends CaffeineBeverage{ +    @Override +    void brew() { +        System.out.println("Coffee.brew"); +    } + +    @Override +    void addCondiments() { +        System.out.println("Coffee.addCondiments"); +    } +} +``` +```java +public class Tea extends CaffeineBeverage{ +    @Override +    void brew() { +        System.out.println("Tea.brew"); +    } + +    @Override +    void addCondiments() { +        System.out.println("Tea.addCondiments"); +    } +} +``` +```java +public class CaffeineBeverageTestDrive { +    public static void main(String[] args) { +        CaffeineBeverage caffeineBeverage = new Coffee(); +        caffeineBeverage.prepareRecipe(); +        System.out.println("-----------"); +        caffeineBeverage = new Tea(); +        caffeineBeverage.prepareRecipe(); +    } +} +``` + +è¿�行结果 + +```html +boilWater +Coffee.brew +pourInCup +Coffee.addCondiments +----------- +boilWater +Tea.brew +pourInCup +Tea.addCondiments +``` + +# 第 9 章 迭代器和组å�ˆæ¨¡å¼� + +## 9.1 迭代器模å¼� + +**1. 模å¼�定义** + +æ��供一ç§�顺åº�访问一个è�šå�ˆå¯¹è±¡ä¸­çš„å�„个元素的方法,而å�ˆä¸�暴露其内部的表示。 + +**2. 模å¼�类图** + +客户类拥有一个è�šå�ˆå¯¹è±¡å’Œè¿­ä»£å™¨å¯¹è±¡ï¼Œè¿­ä»£å™¨å¯¹è±¡æ˜¯è�šå�ˆå¯¹è±¡ç”Ÿæˆ�的。å�ªéœ€è¦�迭代器定义好移动的æ“�作,就å�¯ä»¥è®©è�šå�ˆå¯¹è±¡èƒ½å¤Ÿé¡ºåº�é��历。 + +![](index_files/439deca7-fed0-4c89-87e5-7088d10f1fdb.jpg) + +**3. 代ç �实现** + +```java +public class Aggregate { + +    private int[] items; + +    public Aggregate() { +        items = new int[10]; +        for (int i = 0; i < items.length; i++) { +            items[i] = i; +        } +    } + +    public Iterator createIterator() { +        return new ConcreteIterator(items); +    } + +} +``` +```java +public interface Iterator { +    boolean hasNext(); +    int next(); +} +``` +```java +public class ConcreteIterator implements Iterator { + +    private int[] items; +    private int position = 0; + +    public ConcreteIterator(int[] items) { +        this.items = items; +    } + +    @Override +    public boolean hasNext() { +        return position < items.length; +    } + +    @Override +    public int next() { +        return items[position++]; +    } +} +``` +```java +public class Client { +    public static void main(String[] args) { +        Aggregate aggregate = new Aggregate(); +        Iterator iterator = aggregate.createIterator(); +        while(iterator.hasNext()){ +            System.out.println(iterator.next()); +        } +    } +} +``` +è¿�行结果 +```html +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +``` + +## 9.2 Java 内置的迭代器 + +**1. 实现接å�£** + +Java 中已ç»�有了 Iterator 接å�£ï¼Œåœ¨ä½¿ç”¨Â Java 实现时,需è¦�让è�šå�ˆå¯¹è±¡å®žçŽ°Â Iterable 接å�£ï¼Œè¯¥æŽ¥å�£æœ‰ä¸€ä¸ªÂ iterator() 方法会返回一个 Iterator 对象。使用 Java 内置的迭代器实现,客户对象å�¯ä»¥ä½¿ç”¨Â foreach 循环æ�¥é��历è�šå�ˆå¯¹è±¡ä¸­çš„æ¯�个元素。 + +**2. 代ç �实现** + +```java +import java.util.Iterator; + +public class Aggregate implements Iterable{ + +    private int[] items; + +    public Aggregate() { +        items = new int[10]; +        for (int i = 0; i < items.length; i++) { +            items[i] = i; +        } +    } + +    @Override +    public Iterator iterator() { +        return new ConcreteIterator(items); +    } +} +``` +```java +import java.util.Iterator; + +public class ConcreteIterator implements Iterator { + +    private int[] items; +    private int position = 0; + +    public ConcreteIterator(int[] items) { +        this.items = items; +    } + +    @Override +    public boolean hasNext() { +        return position < items.length; +    } + +    @Override +    public Integer next() { +        return items[position++]; +    } +} +``` +```java +public class Client { +    public static void main(String[] args) { +        Aggregate aggregate = new Aggregate(); +        for (int item : aggregate) { +            System.out.println(item); +        } +    } +} +``` + +## 9.3 组å�ˆæ¨¡å¼� + +**1. 设计原则** + +一个类应该å�ªæœ‰ä¸€ä¸ªå¼•起改å�˜çš„原因。 + +**2. 模å¼�定义** + +å…�许将对象组å�ˆæˆ�树形结构æ�¥è¡¨çŽ°â€œæ•´ä½“Â / 部分â€�层次结构。 + +组å�ˆèƒ½è®©å®¢æˆ·ä»¥ä¸€è‡´çš„æ–¹å¼�处ç�†ä¸ªåˆ«å¯¹è±¡ä»¥å�Šå¯¹è±¡ç»„å�ˆã€‚ + +**3. 模å¼�类图** + +由于组å�ˆï¼ˆComposite)类拥有一个组件(Component)对象,因此组å�ˆå¯¹è±¡ä½�于树形结构的中间,它还å�¯ä»¥ç»§ç»­æ“�作这个组件对象,并忽略组件对象的具体类型。 + +![](index_files/f99c019e-7e91-4c2e-b94d-b031c402dcb5.jpg) + +**4. 代ç �实现** + +```java +public abstract class Component { +    protected String name; + +    public Component(String name) { +        this.name = name; +    } + +    abstract public void addChild(Component component); + +    public void print() { +        print(0); +    } + +    abstract protected void print(int level); +} +``` +```java +public class Leaf extends Component { +    public Leaf(String name) { +        super(name); +    } + +    @Override +    public void addChild(Component component) { +        throw new UnsupportedOperationException(); // 牺牲é€�明性æ�¢å�–å�•一è�Œè´£åŽŸåˆ™Â , 这样就ä¸�用考虑是å�¶å­�节点还是组å�ˆèŠ‚ç‚¹ +    } + +    @Override +    protected void print(int level) { +        for (int i = 0; i < level; i++) { +            System.out.print("--"); +        } +        System.out.println("left:" + name); +    } +} +``` +```java +import java.util.ArrayList; +import java.util.List; + +public class Composite extends Component { + +    private List childs; + +    public Composite(String name) { +        super(name); +        childs = new ArrayList<>(); +    } + +    @Override +    public void addChild(Component component) { +        childs.add(component); +    } + +    @Override +    protected void print(int level) { +        for (int i = 0; i < level; i++) { +            System.out.print("--"); +        } +        System.out.println("Composite:" + name); +        for (Component component : childs) { +            component.print(level + 1); +        } +    } +} +``` +```java +public class Client { +    public static void main(String[] args) { +        Composite root = new Composite("root"); +        Component node1 = new Leaf("1"); +        Component node2 = new Composite("2"); +        Component node3 = new Leaf("3"); +        root.addChild(node1); +        root.addChild(node2); +        root.addChild(node3); +        Component node21 = new Leaf("21"); +        Component node22 = new Composite("22"); +        node2.addChild(node21); +        node2.addChild(node22); +        Component node221 = new Leaf("221"); +        node22.addChild(node221); +        root.print(); +    } +} +``` +è¿�行结果 + +```html +Composite:root +--left:1 +--Composite:2 +----left:21 +----Composite:22 +------left:221 +--left:3 +``` + +# 第 10 章 状æ€�模å¼� + +**1. 模å¼�定义** + +å…�许对象在内部状æ€�改å�˜æ—¶æ”¹å�˜å®ƒçš„行为,对象看起æ�¥å¥½åƒ�修改了它的类。 + +状æ€�模å¼�的类图和策略模å¼�一样,并且都是能够动æ€�改å�˜å¯¹è±¡çš„行为。但是状æ€�模å¼�是通过状æ€�对象的状æ€�转移æ�¥æ”¹å�˜å®¢æˆ·å¯¹è±¡ç»„å�ˆçš„状æ€�对象,而策略模å¼�是通过客户对象本身的决策æ�¥æ”¹å�˜ç»„å�ˆçš„策略对象。例如,状æ€�模å¼�下,客户对象委托状æ€�对象进行一个处ç�†æ“�作,那么状æ€�对象有å�¯èƒ½å�‘生状æ€�转移,使得客户对象拥有的状æ€�对象å�‘生改å�˜ã€‚状æ€�对象组å�ˆäº†å®¢æˆ·å¯¹è±¡ï¼Œçжæ€�转移是状æ€�对象通过改å�˜å®¢æˆ·å¯¹è±¡æ‰€ç»„å�ˆçš„状æ€�对象实现的。 + +**2. 模å¼�类图** + +![](index_files/c28fd93a-0d55-4a19-810f-72652feee00d.jpg) + +**3. 问题æ��è¿°** + +糖果销售机有多ç§�状æ€�,æ¯�ç§�状æ€�下销售机有ä¸�å�Œçš„行为,状æ€�å�¯ä»¥å�‘生转移,使得销售机的行为也å�‘生改å�˜ã€‚ + +![](index_files/f7d880c9-740a-4a16-ac6d-be502281b4b2.jpg) + +**4. 直接解决方案** + +在糖果机的æ¯�个æ“�作函数里é�¢ï¼Œåˆ¤æ–­å½“å‰�的状æ€�,根æ�®ä¸�å�Œçš„状æ€�进行ä¸�å�Œçš„处ç�†ï¼Œå¹¶ä¸”å�‘生ä¸�å�Œçš„状æ€�转移。这ç§�解决方案把所有的实现细节都放到客户类,这样在新增状æ€�的时候就è¦�去修改客户类的代ç �。 + +![](index_files/62ebbb63-8fd7-4488-a866-76a9dc911662.png) + +**5. 使用状æ€�模å¼�的解决方案** + +状æ€�的转移被移到状æ€�类里é�¢ï¼Œå®¢æˆ·ç±»çš„æ¯�个æ“�作å�ªéœ€è¦�委托给状æ€�ç±»å�³å�¯ï¼Œè€Œä¸�需è¦�知é�“当å‰�是什么状æ€�以å�Šçжæ€�时如何进行转移的。 + + +**6. 代ç �实现** + +```java +public interface State { +    /** +     * 投入25 分钱 +     */ +    void insertQuarter(); + +    /** +     * 退回25 分钱 +     */ +    void ejectQuarter(); + +    /** +     * 转动曲柄 +     */ +    void turnCrank(); + +    /** +     * å�‘放糖果 +     */ +    void dispense(); +} +``` +```java +public class HasQuarterState implements State{ +    private GumballMachine gumballMachine; + +    public HasQuarterState(GumballMachine gumballMachine){ +        this.gumballMachine = gumballMachine; +    } + +    @Override +    public void insertQuarter() { +        System.out.println("You can't insert another quarter"); +    } + +    @Override +    public void ejectQuarter() { +        System.out.println("Quarter returned"); +        gumballMachine.setState(gumballMachine.getNoQuarterState()); +    } + +    @Override +    public void turnCrank() { +        System.out.println("You turned..."); +        gumballMachine.setState(gumballMachine.getSoldState()); +    } + +    @Override +    public void dispense() { +        System.out.println("No gumball dispensed"); +    } +} +``` +```java +public class NoQuarterState implements State { +    GumballMachine gumballMachine; + +    public NoQuarterState(GumballMachine gumballMachine) { +        this.gumballMachine = gumballMachine; +    } + +    @Override +    public void insertQuarter() { +        System.out.println("You insert a quarter"); +        gumballMachine.setState(gumballMachine.getHasQuarterState()); +    } + +    @Override +    public void ejectQuarter() { +        System.out.println("You haven't insert a quarter"); +    } + +    @Override +    public void turnCrank() { +        System.out.println("You turned, but there's no quarter"); +    } + +    @Override +    public void dispense() { +        System.out.println("You need to pay first"); +    } +} +``` +```java +public class SoldOutState implements State { + +    GumballMachine gumballMachine; + +    public SoldOutState(GumballMachine gumballMachine) { +        this.gumballMachine = gumballMachine; +    } + +    @Override +    public void insertQuarter() { +        System.out.println("You can't insert a quarter, the machine is sold out"); +    } + +    @Override +    public void ejectQuarter() { +        System.out.println("You can't eject, you haven't inserted a quarter yet"); +    } + +    @Override +    public void turnCrank() { +        System.out.println("You turned, but there are no gumballs"); +    } + +    @Override +    public void dispense() { +        System.out.println("No gumball dispensed"); +    } +} +``` +```java +public class SoldState implements State { +    GumballMachine gumballMachine; + +    public SoldState(GumballMachine gumballMachine) { +        this.gumballMachine = gumballMachine; +    } + +    @Override +    public void insertQuarter() { +        System.out.println("Please wait, we're already giving you a gumball"); +    } + +    @Override +    public void ejectQuarter() { +        System.out.println("Sorry, you already turned the crank"); +    } + +    @Override +    public void turnCrank() { +        System.out.println("Turning twice doesn't get you another gumball!"); +    } + +    @Override +    public void dispense() { +        gumballMachine.releaseBall(); +        if(gumballMachine.getCount()>0){ +            gumballMachine.setState(gumballMachine.getNoQuarterState()); +        } else{ +            System.out.println("Oops, out of gumballs"); +            gumballMachine.setState(gumballMachine.getSoldOutState()); +        } +    } +} +``` +```java +public class GumballMachine { +    private State soldOutState; +    private State noQuarterState; +    private State hasQuarterState; +    private State soldState; + +    private State state; +    private int count = 0; + +    public GumballMachine(int numberGumballs) { +        count = numberGumballs; +        soldOutState = new SoldOutState(this); +        noQuarterState = new NoQuarterState(this); +        hasQuarterState = new HasQuarterState(this); +        soldState = new SoldState(this); + +        if (numberGumballs > 0) { +            state = noQuarterState; +        } else { +            state = soldOutState; +        } +    } + +    public void insertQuarter() { +        state.insertQuarter(); +    } + +    public void ejectQuarter() { +        state.ejectQuarter(); +    } + +    public void turnCrank() { +        state.turnCrank(); +        state.dispense(); +    } + +    public void setState(State state) { +        this.state = state; +    } + +    public void releaseBall() { +        System.out.println("A gumball comes rolling out the slot..."); +        if (count != 0) { +            count -= 1; +        } +    } + +    public State getSoldOutState() { +        return soldOutState; +    } + +    public State getNoQuarterState() { +        return noQuarterState; +    } + +    public State getHasQuarterState() { +        return hasQuarterState; +    } + +    public State getSoldState() { +        return soldState; +    } + +    public int getCount() { +        return count; +    } +} +``` +```java +public class GumballMachineTestDrive { +    public static void main(String[] args) { +        GumballMachine gumballMachine = new GumballMachine(5); + +        gumballMachine.insertQuarter(); +        gumballMachine.turnCrank(); + +        gumballMachine.insertQuarter(); +        gumballMachine.ejectQuarter(); +        gumballMachine.turnCrank(); + +        gumballMachine.insertQuarter(); +        gumballMachine.turnCrank(); +        gumballMachine.insertQuarter(); +        gumballMachine.turnCrank(); +        gumballMachine.ejectQuarter(); + +        gumballMachine.insertQuarter(); +        gumballMachine.insertQuarter(); +        gumballMachine.turnCrank(); +        gumballMachine.insertQuarter(); +        gumballMachine.turnCrank(); +        gumballMachine.insertQuarter(); +        gumballMachine.turnCrank(); +    } +} +``` +è¿�行结果 +```html +You insert a quarter +You turned... +A gumball comes rolling out the slot... +You insert a quarter +Quarter returned +You turned, but there's no quarter +You need to pay first +You insert a quarter +You turned... +A gumball comes rolling out the slot... +You insert a quarter +You turned... +A gumball comes rolling out the slot... +You haven't insert a quarter +You insert a quarter +You can't insert another quarter +You turned... +A gumball comes rolling out the slot... +You insert a quarter +You turned... +A gumball comes rolling out the slot... +Oops, out of gumballs +You can't insert a quarter, the machine is sold out +You turned, but there are no gumballs +No gumball dispensed +``` + +# 第 11 章 代ç�†æ¨¡å¼� // TODO + +# 第 12 章 å¤�å�ˆæ¨¡å¼� + +## 12.1 MVC + +### 12.1.1 传统 MVC + +视图使用组å�ˆæ¨¡å¼�,模型使用了观察者模å¼�,控制器使用了策略模å¼�。 + +![](index_files/4f67611d-492f-4958-9fa0-4948010e345f.jpg) + +### 12.1.2 Web 中的 MVC + +模å¼�ä¸�å†�使用观察者模å¼�。 + +![](index_files/1dd56e61-2970-4d27-97c2-6e81cee86978.jpg) + +# 第 13 章 与设计模å¼�相处 + +定义:在æŸ� **情境** 下,针对æŸ� **问题** 的æŸ�ç§� **解决方案**。 + +过度使用设计模å¼�å�¯èƒ½å¯¼è‡´ä»£ç �被过度工程化,应该总是用最简å�•的解决方案完æˆ�工作,并在真正需è¦�模å¼�的地方æ‰�使用它。 + +å��模å¼�:ä¸�好的解决方案æ�¥è§£å†³ä¸€ä¸ªé—®é¢˜ã€‚主è¦�作用是为了警告ä¸�è¦�使用这些解决方案。 + +模å¼�分类: + +![](index_files/524a237c-ffd7-426f-99c2-929a6bf4c847.jpg) + +# 第 14 章 剩下的模å¼� // TODO \ No newline at end of file diff --git a/notes/笔记/é‡�æž„.md.txt b/notes/笔记/é‡�æž„.md.txt new file mode 100644 index 00000000..2b9ebafc --- /dev/null +++ b/notes/笔记/é‡�æž„.md.txt @@ -0,0 +1,877 @@ +[TOC] + +# 第一章 第一个案例 + +如果你å�‘现自己需è¦�为程åº�添加一个特性,而代ç �结构使你无法很方便地达æˆ�目的,那就先é‡�构这个程åº�。 + +在é‡�æž„å‰�,需è¦�先构建好å�¯é� çš„æµ‹è¯•环境,确ä¿�安全地é‡�构。 + +é‡�构是以微å°�的步ä¼�修改程åº�,如果犯下错误,很容易便å�¯ä»¥å�‘现它。 + +**案例分æž�** + +影片出租店应用程åº�,包括三个类:Movieã€�Rental 和 Customer,Rental 包å�«ç§Ÿèµ�的 Movie 以å�Šå¤©æ•°ã€‚ + +![](index_files/a758c8b2-0ac7-438f-90c2-3923ffad6328.png) + +最开始的实现是把所有的计费代ç �都放在 Customer 类中,在å�˜åŒ–å�‘生时,需è¦�对这部分代ç �进行更改。本案例中å�¯èƒ½å�‘生的å�˜åŒ–有:一ç§�类别的计费方å¼�å�‘生改å�˜ï¼›æ·»åŠ æ–°çš„ç”µå½±ç±»åˆ«ã€‚è€ƒè™‘åˆ°è®¡è´¹ä»£ç �å�¯èƒ½å­˜åœ¨äºŽå¤šå¤„,一旦å�‘生改å�˜æ—¶ï¼Œå°±éœ€è¦�对所有计费代ç �进行修改。 + +![](index_files/9e5e3cc6-3107-4051-b584-8ff077638fe6.png) + +以下是继承 Movie 的多æ€�方案。但是由于一部 Movie 的类别会动æ€�改å�˜ï¼Œå› æ­¤è¿™ç§�方案ä¸�å�¯è¡Œã€‚ + +![](index_files/2a502516-5d34-4eef-8f39-916298a60035.png) + +引入 Price æ�¥å��应类别信æ�¯ï¼Œé€šè¿‡ç»„å�ˆçš„æ–¹å¼�在 Movie 中加入 Price 对象,这样æ¯�ç§�类别的计费方å¼�都å°�装在ä¸�å�Œçš„ Price å­�类中,并且 Movie 对象也å�¯ä»¥åЍæ€�改å�˜ç±»åˆ«ã€‚è¿™ç§�æ–¹å¼�å�¯ä»¥å¾ˆå¥½åœ°é€‚应上述æ��到的å�˜åŒ–。 + +![](index_files/c02a83b8-a6b9-4d00-a509-6f0516beaf5e.png) + +é‡�æž„å�Žçš„æ—¶åº�图和类图: + +![](index_files/95f4559c-3d2a-4176-b365-4fbc46c76cf1.png) + +![](index_files/293b9326-02fc-4ad8-8c79-b4a7b5ba60d3.png) + +# 第二章 é‡�构原则 + +é‡�构是对软件内部结构的一ç§�调整,目的是在ä¸�改å�˜è½¯ä»¶å�¯è§‚察行为的å‰�æ��下,æ��高其å�¯ç�†è§£æ€§ï¼Œé™�低其修改æˆ�本。 + +é‡�构的好处:改进软件设计;使软件更容易ç�†è§£ï¼›å¸®åŠ©æ‰¾åˆ°Â bugï¼›æ��高编程速度。 + +三次法则:第一次å�šæŸ�件事时å�ªç®¡åŽ»å�šï¼›ç¬¬äºŒæ¬¡å�šç±»ä¼¼äº‹æƒ…æ—¶å�¯ä»¥åŽ»å�šï¼›ç¬¬ä¸‰æ¬¡å†�å�šç±»ä¼¼çš„事,就应该é‡�构。 + +间接层与é‡�构:计算机科学中的很多问题å�¯ä»¥é€šè¿‡å¢žåŠ ä¸€ä¸ªé—´æŽ¥å±‚æ�¥è§£å†³ï¼Œé—´æŽ¥å±‚具有以下价值:å…�许逻辑共享;分开解释æ„�图和实现;隔离å�˜åŒ–ï¼›å°�装æ�¡ä»¶é€»è¾‘。é‡�æž„å�¯ä»¥ç�†è§£ä¸ºåœ¨é€‚当的ä½�ç½®æ�’入间接层以å�Šåœ¨ä¸�需è¦�时移除间接层。 + +修改接å�£ï¼šå�¯ä»¥ä¿�留旧接å�£ï¼Œè®©æ—§æŽ¥å�£åŽ»è°ƒç”¨æ–°æŽ¥å�£ï¼Œå¹¶ä¸”使用 Java æ��供的 @deprecation 将旧接å�£æ ‡è®°ä¸ºå¼ƒç”¨ã€‚除é�žçœŸæœ‰å¿…è¦�,ä¸�è¦�å�‘布接å�£ï¼Œå¹¶ä¸”ä¸�è¦�过早å�‘布接å�£ã€‚ + +当现有代ç �过于混乱时,应当é‡�写而ä¸�是é‡�构。一个折中的办法是,将代ç �å°�装æˆ�一个个组件,然å�Žå¯¹å�„个组件å�šé‡�写或者é‡�构的决定。 + +软件开å�‘无法预先设计,因为开å�‘过程有很多å�˜åŒ–å�‘生,在最开始ä¸�å�¯èƒ½éƒ½æŠŠæ‰€æœ‰æƒ…况考虑进去。é‡�æž„å�¯ä»¥ç®€åŒ–设计,é‡�构在一个简å�•的设计上进行修修改改,当å�˜åŒ–å�‘生时,以一ç§�ç�µæ´»çš„æ–¹å¼�去应对å�˜åŒ–,进而带æ�¥æ›´å¥½çš„设计。 + +为了软代ç �更容易ç�†è§£ï¼Œé‡�æž„å�¯èƒ½ä¼šå¯¼è‡´æ€§èƒ½å‡�低。在编写代ç �时,ä¸�用对性能过多关注,å�ªæœ‰åœ¨æœ€å�Žæ€§èƒ½ä¼˜åŒ–阶段å†�考虑性能问题。应当å�ªå…³æ³¨å…³é”®ä»£ç �的性能,因为å�ªæœ‰ä¸€å°�部分的代ç �是关键代ç �。 + +# 第三章 代ç �çš„å��味é�“ + +## 1. Duplicated Code(é‡�å¤�代ç �) + +å�Œä¸€ä¸ªç±»çš„两个函数有相å�Œè¡¨è¾¾å¼�,则用 Extract Method æ��å�–出é‡�å¤�代ç �ï¼› + +两个互为兄弟的å­�ç±»å�«æœ‰ç›¸å�Œçš„表达å¼�,先使用 Extract Method,然å�ŽæŠŠæ��å�–出æ�¥çš„函数 Pull Up Method 推入超类。 + +如果å�ªæ˜¯éƒ¨åˆ†ç›¸å�Œï¼Œç”¨Â Extract Method 分离出相似部分和差异部分,然å�Žä½¿ç”¨Â Form Template Method 这ç§�模æ�¿æ–¹æ³•设计模å¼�。 + +如果两个毫ä¸�相关的类出现é‡�å¤�代ç �,则使用 Extract Class 方法将é‡�å¤�代ç �æ��å�–到一个独立类中。 + +## 2. Long Method(过长函数) + +间接层的价值:解释能力ã€�共享能力ã€�选择能力; + +分解函数的原则:当需è¦�用注释æ�¥è¯´æ˜Žä¸€æ®µä»£ç �时,就需è¦�把这部分代ç �写入一个独立的函数中。 + +Extract Method 会把很多å�‚数和临时å�˜é‡�都当å�šå�‚数,å�¯ä»¥ç”¨Â Replace Temp with Query 消除临时å�˜é‡�,Introduce Parameter Object 和 Preserve Whole Object å�¯ä»¥å°†è¿‡é•¿çš„å�‚数列å�˜å¾—更简æ´�。 + +æ�¡ä»¶å’Œå¾ªçŽ¯å¾€å¾€ä¹Ÿéœ€è¦�æ��å�–到新的函数中。 + +## 3. Large Class(过大的类) + +过大的类å�šäº†è¿‡å¤šäº‹æƒ…,需è¦�使用 Extract Class 或 Extract Subclass。 + +先确定客户端如何使用它们,然å�Žè¿�用 Extract Interface 为æ¯�一ç§�使用方å¼�æ��å�–出一个接å�£ã€‚ + +## 4. Long Parameter List(过长的å�‚数列) + +## 5. Divergent Change(å�‘æ•£å¼�å�˜åŒ–) + +一个类å�—到多ç§�å�˜åŒ–的影å“�ï¼› + +针对æŸ�ç§�原因的å�˜åŒ–,使用 Extract Class 将它æ��炼到一个类中。 + +## 6. Shotgun Surgery(散弹å¼�修改) + +一个å�˜åŒ–引起多个类修改; + +使用 Move Method 和 Move Field 把所有需è¦�修改地代ç �放到å�Œä¸€ä¸ªç±»ä¸­ã€‚ + +## 7. Feature Envy(ä¾�æ�‹æƒ…结) + +一个函数对æŸ�个类的兴趣高于对自己所处类的兴趣,通常是过多访问其它类的数æ�®ã€‚ + +使用 Move Method 将它移到该去的地方,如果对多个类都有 Feature Envy,先用 Extract Method æ��å�–出多个函数。 + +## 8. Data Clumps(数æ�®æ³¥å›¢ï¼‰ + +有些数æ�®ç»�常一起出现,比如两个类具有相å�Œçš„字段ã€�许多函数有相å�Œçš„å�‚数。使用 Extract Class 将它们放在一起。 + +## 9. Primitive Obsession(基本类型å��执) + +使用类往往比使用基本类型更好,使用 Replace Data Value with Object 将数æ�®å€¼æ›¿æ�¢ä¸ºå¯¹è±¡ã€‚ + +## 10. Switch Statements(switch 惊悚现身) + +## 11. Parallel Inheritance Hierarchies(平行继承体系) + +æ¯�当为æŸ�个类增加一个å­�类,必须也为å�¦ä¸€ä¸ªç±»ç›¸åº”增加一个å­�类。 + +è¿™ç§�结果会带æ�¥ä¸€äº›é‡�å¤�性,消除é‡�å¤�性的一般策略:让一个继承体系的实例引用å�¦ä¸€ä¸ªç»§æ‰¿ä½“系的实例。 + +## 12. Lazy Class(冗余类) + +如果一个类没有å�šè¶³å¤Ÿå¤šçš„工作,就应该消失。 + +## 13. Speculative Generality(夸夸其谈未æ�¥æ€§ï¼‰ + +有些内容是用æ�¥å¤„ç�†æœªæ�¥å�¯èƒ½å�‘生的å�˜åŒ–,但是往往会造æˆ�系统难以ç�†è§£å’Œç»´æŠ¤ï¼Œå¹¶ä¸”预测未æ�¥å�¯èƒ½å�‘生的改å�˜å¾ˆå�¯èƒ½å’Œæœ€å¼€å§‹çš„设想相å��。因此,如果ä¸�是必è¦�,就ä¸�è¦�这么å�šã€‚ + +## 14. Temporary Field(令人迷惑的暂时字段) + +æŸ�个字段仅为æŸ�ç§�特定情况而设,这样的代ç �ä¸�易ç�†è§£ï¼Œå› ä¸ºé€šå¸¸è®¤ä¸ºå¯¹è±¡åœ¨æ‰€æœ‰æ—¶å€™éƒ½éœ€è¦�它的所有字段。 + +把这ç§�字段和特定情况的处ç�†æ“�作使用 Extract Class æ��炼到一个独立类中。 + +## 15. Message Chains(过度耦å�ˆçš„æ¶ˆæ�¯é“¾ï¼‰ + +一个对象请求å�¦ä¸€ä¸ªå¯¹è±¡ï¼Œç„¶å�Žå†�å�‘å�Žè€…请求å�¦ä¸€ä¸ªå¯¹è±¡ï¼Œç„¶å�Ž...,这就是消æ�¯é“¾ã€‚采用这ç§�æ–¹å¼�,æ„�味ç�€å®¢æˆ·ä»£ç �将与对象间的关系紧密耦å�ˆã€‚ + +改用函数链,用函数委托å�¦ä¸€ä¸ªå¯¹è±¡æ�¥å¤„ç�†ã€‚ + +## 16. Middle Man(中间人) + +中间人负责处ç�†å§”托给它的æ“�作,如果一个类中有过多的函数都委托给其它类,那就是过度è¿�用委托,应当 Remove Middle Man,直接与负责的对象打交é�“。 + +## 17. Inappropriate Intimacy(狎昵关系) + +两个类多于亲密,花费太多时间去探讨彼此的 private æˆ�分。 + +## 18. Alernative Classes with Different Interfaces(异曲å�Œå·¥çš„类) + +## 19. Incomplete Library Class(ä¸�完美的类库) + +类库的设计者ä¸�å�¯èƒ½è®¾è®¡å‡ºå®Œç¾Žçš„类库,当我们需è¦�对类库进行一些修改时,å�¯ä»¥ä½¿ç”¨ä»¥ä¸‹ä¸¤ç§�方法:如果å�ªæ˜¯ä¿®æ”¹ä¸€ä¸¤ä¸ªå‡½æ•°ï¼Œä½¿ç”¨Â Introduce Foreign Method;如果è¦�添加一大堆é¢�外行为,使用 Introduce Local Extension。 + +## 20. Data Class(幼稚的数æ�®ç±»ï¼‰ + +它å�ªæ‹¥æœ‰ä¸€äº›æ•°æ�®å­—段。 + +找出字段使用的地方,然å�ŽæŠŠç›¸åº”çš„æ“�作移到 Data Class 中。 + +## 21. Refused Bequest(被拒ç»�的馈赠) + +å­�类继承超类的所有函数和数æ�®ï¼Œä½†æ˜¯å®ƒå�ªæƒ³è¦�一部分。 + +为å­�类新建一个兄弟类,ä¸�需è¦�的函数或数æ�®ä½¿ç”¨Â Push Down Method 和 Push Down Field 下推给那个兄弟。 + +## 22. Comments(过多的注释) + +使用 Extract Method æ��炼出需è¦�注释的部分,然å�Žç”¨å‡½æ•°å��æ�¥è§£é‡Šå‡½æ•°çš„行为。 + +# 第四章 构筑测试体系 + +Java å�¯ä»¥ä½¿ç”¨Â Junit 进行å�•元测试。 + +å�•元测试的对象是类的方法,而功能测以客户的角度ä¿�è¯�软件正常è¿�行。 + +应当集中测试å�¯èƒ½å‡ºé”™çš„边界æ�¡ä»¶ã€‚ + +# 第五章 é‡�构列表 + +å°�æ­¥å‰�进,频ç¹�测试。 + +# 第六章 é‡�新组织函数 + +## 1. Extract Method(æ��炼函数) + +将这段代ç �放进一个独立函数中,并让函数å��称解释该函数的用途。 + +## 2. Inline Method(内è�”函数) + +一个函数的本体与å��ç§°å�Œæ ·æ¸…楚易懂。 + +在函数调用点æ�’入函数本体,然å�Žç§»é™¤è¯¥å‡½æ•°ã€‚ + +## 3. Inline Temp(内è�”临时å�˜é‡�) + +一个临时å�˜é‡�,å�ªè¢«ç®€å�•表达å¼�赋值一次,而它妨ç¢�了其它é‡�构手法。 + +将所有对该å�˜é‡�的引用替æ�¢ä¸ºå¯¹å®ƒèµ‹å€¼çš„那个表达å¼�自身。 + +```java +double basePrice = anOrder.basePrice(); +return basePrice > 1000; +``` + +```java +return anOrder.basePrice() > 1000; +``` + +## 4. Replace Temp with Query(以查询å�–代临时å�˜é‡�) + +以临时å�˜é‡�ä¿�å­˜æŸ�一表达å¼�çš„è¿�算结果,将这个表达å¼�æ��炼到一个独立函数中,将所有对临时å�˜é‡�的引用点替æ�¢ä¸ºå¯¹æ–°å‡½æ•°çš„调用。Replace Temp with Query 往往是 Extract Method 之å‰�å¿…ä¸�å�¯å°‘的一个步骤,因为局部å�˜é‡�会使代ç �难以æ��炼。 + +```java +double basePrice = quantity * itemPrice; +if(basePrice > 1000) +    return basePrice * 0.95; +else +    return basePrice * 0.98; +``` + +```java +if(basePrice() > 1000) +    return basePrice() * 0.95; +else +    return basePrice() * 0.98; + +// ... +double basePrice(){ +    return quantity * itemPrice; +} +``` + +## 5. Introduce Explaining Variable(引起解释å�˜é‡�) + +å°†å¤�æ�‚表达å¼�(或其中一部分)的结果放进一个临时å�˜é‡�,以此å�˜é‡�å��ç§°æ�¥è§£é‡Šè¡¨è¾¾å¼�用途。 + +```java +if((platform.toUpperCase().indexOf("MAC") > -1) && +  (browser.toUpperCase().indexOf("IE") > -1) && +  wasInitialized() && resize > 0) { +    // do something +} +``` + +```java +final boolean isMacOS = platform.toUpperCase().indexOf("MAC") > -1; +final boolean isIEBrower = browser.toUpperCase().indexOf("IE") > -1; +final boolean wasResized = resize > 0; + +if(isMacOS && isIEBrower && wasInitialized() && wasResized) { +    // do something +} +``` + +## 6. Split Temporary Variable(分解临时å�˜é‡�) + +æŸ�个临时å�˜é‡�被赋值超过一次,它既ä¸�是循环å�˜é‡�,也ä¸�是用于收集计算结果。 + +针对æ¯�次赋值,创造一个独立ã€�对应的临时å�˜é‡�,æ¯�个临时å�˜é‡�å�ªæ‰¿æ‹…一个责任。 + +## 7. Remove Assigments to Parameters(移除对å�‚数的赋值) + +以一个临时å�˜é‡�å�–代对该å�‚数的赋值。 + +```java +int discount (int inputVal, int quentity, int yearToDate){ +    if (inputVal > 50) inputVal -= 2; +``` + +```java +int discount (int inputVal, int quentity, int yearToDate){ +    int result = inputVal; +    if (inputVal > 50) result -= 2; +``` + +## 8. Replace Method with Method Object(以函数对象å�–代函数) + +当对一个大型函数采用 Extract Method 时,由于包å�«äº†å±€éƒ¨å�˜é‡�使得很难进行该æ“�作。 + +将这个函数放进一个å�•独对象中,如此一æ�¥å±€éƒ¨å�˜é‡�å°±æˆ�了对象内的字段。然å�Žå�¯ä»¥åœ¨å�Œä¸€ä¸ªå¯¹è±¡ä¸­å°†è¿™ä¸ªå¤§åž‹å‡½æ•°åˆ†è§£ä¸ºå¤šä¸ªå°�型函数。 + +## 9. Subsititute Algorithn(替æ�¢ç®—法) + +# 第七章 在对象之间æ�¬ç§»ç‰¹æ€§ + +## 1. Move Method(æ�¬ç§»å‡½æ•°ï¼‰ + +类中的æŸ�个函数与å�¦ä¸€ä¸ªç±»è¿›è¡Œæ›´å¤šäº¤æµ�:调用å�Žè€…或者被å�Žè€…调用。 + +将这个函数æ�¬ç§»åˆ°å�¦ä¸€ä¸ªç±»ä¸­ã€‚ + +## 2. Move Field(æ�¬ç§»å­—段) + +类中的æŸ�个字段被å�¦ä¸€ä¸ªç±»æ›´å¤šåœ°ç”¨åˆ°ï¼Œè¿™é‡Œçš„用到是指调用å�–值设值函数,应当把该字段移到å�¦ä¸€ä¸ªç±»ä¸­ã€‚ + +## 3. Extract Class(æ��炼类) + +æŸ�个类å�šäº†åº”当由两个类å�šçš„事。 + +应当建立一个新类,将相关的字段和函数从旧类æ�¬ç§»åˆ°æ–°ç±»ã€‚ + +## 4. Inline Class(将类内è�”化) + +与 Extract Class 相å��。 + +## 5. Hide Delegate(éš�è—�“委托关系â€�) + +建立所需的函数,éš�è—�委托关系。 + +```java +class Person{ +    Department department; + +    public Department getDepartment(){ +        return department; +    } +} + +class Department{ +    private Person manager; + +    public Person getManager(){ +        return manager; +    } +} +``` + +如果客户希望知é�“æŸ�人的ç»�ç�†æ˜¯è°�,必须获得 Department 对象,这样就对客户æ�­éœ²äº†Â Department 的工作原ç�†ã€‚ + +```java +Person manager = john.getDepartment().getManager(); +``` + +通过为 Peron 建立一个函数æ�¥éš�è—�è¿™ç§�委托关系。 + +```java +public Person getManager(){ +    return department.getManager(); +} +``` + +## 6. Remove Middle Man(移除中间人) + +与 Hide Delegate 相å��,本方法需è¦�移除委托函数,让客户直接调用委托类。 + +Hide Delegate 有很大好处,但是它的代价是:æ¯�当客户è¦�使用å�—托类的新特性时,就必须在æœ�务器端添加一个简å�•的委托函数。éš�ç�€å�—委托的特性越æ�¥è¶Šå¤šï¼Œæœ�务器类完全å�˜æˆ�了一个“中间人â€�。 + +## 7. Introduce Foreign Method(引入外加函数) + +需è¦�为æ��ä¾›æœ�务的类添加一个函数,但是无法修改这个类。 + +å�¯ä»¥åœ¨å®¢æˆ·ç±»ä¸­å»ºç«‹ä¸€ä¸ªå‡½æ•°ï¼Œå¹¶ä»¥ç¬¬ä¸€å�‚æ•°å½¢å¼�传入一个æœ�务类的实例,让客户类组å�ˆæœ�务器实例。 + +## 8. Introduce Local Extension(引入本地扩展) + +和 Introduce Foreign Method 目的一样,但是 Introduce Local Extension 通过建立新的类æ�¥å®žçŽ°ã€‚æœ‰ä¸¤ç§�æ–¹å¼�:å­�类或者包装类,å­�类就是通过继承实现,包装类就是通过组å�ˆå®žçŽ°ã€‚ + +# 第八章 é‡�新组织数æ�® + +## 1. Self Encapsulate Field(自å°�装字段) + +为字段建立å�–值/设值函数,并用这些函数æ�¥è®¿é—®å­—段。å�ªæœ‰å½“å­�类想访问超类的一个字段,å�ˆæƒ³åœ¨å­�类中将对这个字段访问改为一个计算å�Žçš„值,æ‰�使用这ç§�æ–¹å¼�,å�¦åˆ™ç›´æŽ¥è®¿é—®å­—段的方å¼�简æ´�明了。 + +## 2. Replace Data Value with Object(以对象å�–代数æ�®å€¼ï¼‰ + +在开å�‘åˆ�期,往往会用简å�•的数æ�®é¡¹è¡¨ç¤ºç®€å�•的情况,但是éš�ç�€å¼€å�‘的进行,一些简å�•æ•°æ�®é¡¹ä¼šå…·æœ‰ä¸€äº›ç‰¹æ®Šè¡Œä¸ºã€‚比如一开始会把电è¯�å�·ç �å­˜æˆ�字符串,但是éš�å�Žå�‘现电è¯�å�·ç �需è¦�“格å¼�化â€�ã€�“抽å�–区å�·â€�之类的特殊行为。 + +## 3. Change Value to Reference(将值对象改æˆ�引用对象) + +将彼此相等的实例替æ�¢ä¸ºå�Œä¸€ä¸ªå¯¹è±¡ã€‚这就è¦�用一个工厂æ�¥åˆ›å»ºè¿™ç§�唯一对象,工厂类中需è¦�ä¿�留一份已ç»�创建对象的列表,当è¦�创建一个对象时,先查找这份列表中是å�¦å·²ç»�存在该对象,如果存在,则返回列表中的这个对象;å�¦åˆ™ï¼Œæ–°å»ºä¸€ä¸ªå¯¹è±¡ï¼Œæ·»åŠ åˆ°åˆ—è¡¨ä¸­ï¼Œå¹¶è¿”å›žè¯¥å¯¹è±¡ã€‚ + +## 4. Change Reference to value(将引用对象改为值对象) + +以 Change Value to Reference 相å��。值对象有个é�žå¸¸é‡�è¦�的特性:它是ä¸�å�¯å�˜çš„,ä¸�å�¯å�˜è¡¨ç¤ºå¦‚æžœè¦�改å�˜è¿™ä¸ªå¯¹è±¡ï¼Œå¿…须用一个新的对象æ�¥æ›¿æ�¢æ—§å¯¹è±¡ï¼Œè€Œä¸�是修改旧对象。 + +需è¦�为值对象实现 equals() 和 hashCode() 方法 + +## 5. Replace Array with Object(以对象å�–代数组) + +有一个数组,其中的元素å�„自代表ä¸�å�Œçš„东西。 + +以对象替æ�¢æ•°ç»„,对于数组中的æ¯�个元素,以一个字段æ�¥è¡¨ç¤ºï¼Œè¿™æ ·æ–¹ä¾¿æ“�作,也更容易ç�†è§£ã€‚ + +## 6. Duplicate Observed Data(赋值“被监视数æ�®â€�) + +一些领域数æ�®ç½®èº«äºŽÂ GUI 控件中,而领域函数需è¦�访问这些数æ�®ã€‚ + +将该数æ�®èµ‹å€¼åˆ°ä¸€ä¸ªé¢†åŸŸå¯¹è±¡ä¸­ï¼Œå»ºç«‹ä¸€ä¸ªÂ Oberver 模å¼�,用以å�Œæ­¥é¢†åŸŸå¯¹è±¡å’ŒÂ GUI 对象内的é‡�å¤�æ•°æ�®ã€‚ + +![](index_files/e024bd7e-fb4e-4239-9451-9a6227f50b00.jpg) + +## 7. Change Unidirectional Association to Bidirectional(将å�•å�‘å…³è�”改为å�Œå�‘å…³è�”) + +当两个类都需è¦�对方的特性时,å�¯ä»¥ä½¿ç”¨å�Œå�‘å…³è�”。 + +有两个类,分别为订å�• Order 和客户 Customer,Order 引用了 Customer,Customer 也需è¦�引用 Order æ�¥æŸ¥çœ‹å…¶æ‰€æœ‰è®¢å�•详情。 + +```java +class Order{ +    private Customer customer; +    public void setCustomer(Customer customer){ +        if(this.customer != null) +            this.customer.removeOrder(this); +        this.customer = customer; +        this.customer.add(this); +    } +} +``` +```java +class Curstomer{ +    private Set orders = new HashSet<>(); +    public void removeOrder(Order order){ +        orders.remove(order); +    } +    public void addOrder(Order order){ +        orders.add(order); +    } +} +``` + +注æ„�到,这里让 Curstomer 类æ�¥æŽ§åˆ¶å…³è�”关系。有以下原则æ�¥å†³å®šå“ªä¸ªç±»æ�¥æŽ§åˆ¶å…³è�”关系:如果æŸ�个对象是组æˆ�å�¦ä¸€ä¸ªå¯¹è±¡çš„部件,那么由å�Žè€…负责控制关è�”关系;如果是一对多关系,则由å�•一引用那一方æ�¥æŽ§åˆ¶å…³è�”关系。 + +## 8. Change Bidirectional Association to Unidirectional(将å�Œå�‘å…³è�”改为å�•å�‘å…³è�”) + +和 Change Unidirectional Association to Bidirectiona 为å��æ“�作。 + +å�Œå�‘å…³è�”维护æˆ�本高,并且也ä¸�易于ç�†è§£ã€‚大é‡�çš„å�Œå�‘连接很容易造æˆ�“僵尸对象â€�:æŸ�个对象本身已ç»�死亡了,å�´ä¿�留在系统中,因为它的引用还没有全部完全清除。 + +## 9. Replace Magic Number with Symbolic Constant(以字é�¢å¸¸é‡�å�–代魔法数) + +创建一个常é‡�,根æ�®å…¶æ„�义为它命å��,并将字é�¢å¸¸é‡�æ�¢ä½�这个常é‡�。 + +## 10. Encapsulate Field(å°�装字段) + +public 字段应当改为 private,并æ��供相应的访问函数。 + +## 11. Encapsulate Collection(å°�装集å�ˆï¼‰ + +函数返回集å�ˆçš„一个å�ªè¯»å‰¯æœ¬ï¼Œå¹¶åœ¨è¿™ä¸ªç±»ä¸­æ��供添加/移除集å�ˆå…ƒç´ çš„函数。如果函数返回集å�ˆè‡ªèº«ï¼Œä¼šè®©ç”¨æˆ·å¾—以修改集å�ˆå†…容而集å�ˆæ‹¥æœ‰è€…å�´ä¸€æ— æ‰€çŸ¥ã€‚ + +## 12. Replace Record with Data Class(以数æ�®ç±»å�–代记录) + +## 13. Replace Type Code with Class(以类å�–代类型ç �) + +类中有一个数值类型ç �,但它并ä¸�å½±å“�类的行为,就用一个新类替æ�¢è¯¥æ•°å€¼ç±»åž‹ç �。如果类型ç �出现在 switch 语å�¥ä¸­ï¼Œéœ€è¦�使用 Replace Conditional with Polymorphism 去掉 switch,首先必须è¿�用 Replace Type Code with Subcalss 或 Replace Type Code with State/Strategy 去掉类型ç �。 + +![](index_files/27c2e0b3-8f95-453d-bedc-6398a8566ce9.jpg) + +## 14. Replace Type Code with Subcalsses(以å­�ç±»å�–代类型ç �) + +有一个ä¸�å�¯å�˜çš„类型ç �,它会影å“�类的行为,以å­�ç±»å�–代这个类型ç �。 + +![](index_files/c41d3977-e0e7-4ee4-93e1-d84f1ae3e20e.jpg) + +## 15. Replace Type Code with State/Strategy (以 State/Strategy å�–代类型ç �) + +有一个å�¯å�˜çš„类型ç �,它会影å“�类的行为,以状æ€�对象å�–代类型ç �。 + +和 Replace Type Code with Subcalsses 的区别是 Replace Type Code with State/Strategy 的类型ç �是动æ€�å�¯å�˜çš„,å‰�者通过继承的方å¼�æ�¥å®žçŽ°ï¼Œå�Žè€…通过组å�ˆçš„æ–¹å¼�æ�¥å®žçŽ°ã€‚å› ä¸ºç±»åž‹ç �å�¯å�˜ï¼Œå¦‚果通过继承的方å¼�,一旦一个对象的类型ç �改å�˜ï¼Œé‚£ä¹ˆå°±è¦�改å�˜ç”¨æ–°çš„对象æ�¥å�–代旧对象,而客户端难以改å�˜æ–°çš„对象。但是通过组å�ˆçš„æ–¹å¼�,改å�˜å¼•用的状æ€�类是很容易的。 + +![](index_files/81fd1d6f-a3b2-4160-9a0a-1f7cb50ba440.jpg) + +## 16. Replace Subclass with Fields(以字段å�–代å­�类) + +å�„个å­�类的唯一差别å�ªåœ¨â€œè¿”回常é‡�æ•°æ�®â€�的函数上。 + +![](index_files/f2e0cee9-ecdc-4a96-853f-d9f6a1ad6ad1.jpg) + +# 第ä¹�章 简化æ�¡ä»¶è¡¨è¾¾å¼� + +## 1. Decompose Conditional(分解æ�¡ä»¶è¡¨è¾¾å¼�) + +对于一个å¤�æ�‚çš„æ�¡ä»¶è¯­å�¥ï¼Œå�¯ä»¥ä»ŽÂ ifã€�thenã€�else 三个段è�½ä¸­åˆ†åˆ«æ��炼出独立函数。 + +```java +if(data.befor(SUMMER_START) || data.after(SUMMER_END)) +    charge = quantity * winterRate + winterServiceCharge; +else charge = quantity * summerRate; +``` + +```java +if(notSummer(date)) +    charge = winterCharge(quantity); +else charge = summerCharge(quantity); +``` + +## 2. Consolidate Conditional Expression(å�ˆå¹¶æ�¡ä»¶è¡¨è¾¾å¼�) + +有一系列æ�¡ä»¶æµ‹è¯•,都得到相å�Œç»“果。 + +将这些测试å�ˆå¹¶ä¸ºä¸€ä¸ªæ�¡ä»¶è¡¨è¾¾å¼�,并将这个æ�¡ä»¶è¡¨è¾¾å¼�æ��炼æˆ�为一个独立函数。 + +```java +double disabilityAmount(){ +    if (seniority < 2) return 0; +    if (monthsDisabled > 12 ) return 0; +    if (isPartTime) return 0; +    // ... +} +``` +```java +double disabilityAmount(){ +    if (isNotEligibleForDisability()) return 0; +    // ... +} +``` + +## 3. Consolidate Duplicate Conditional Fragments (å�ˆå¹¶é‡�å¤�çš„æ�¡ä»¶ç‰‡æ®µï¼‰ + +在æ�¡ä»¶è¡¨è¾¾å¼�çš„æ¯�个分支上有ç�€ç›¸å�Œçš„一段代ç �。 + +将这段é‡�å¤�代ç �æ�¬ç§»åˆ°æ�¡ä»¶è¡¨è¾¾å¼�之外。 + +```java +if (isSpecialDeal()){ +    total = price * 0.95; +    send(); +} else { +    total = price * 0.98; +    send(); +} +``` + +```java +if (isSpecialDeal()) { +    total = price * 0.95; +} else { +    total = price * 0.98; +} +send(); +``` + +## 4. Remove Control Flag(移除控制标记) + +在一系列布尔表达å¼�中,æŸ�个å�˜é‡�带有“控制标记â€�的作用。 + +用 break语 å�¥æˆ– return 语å�¥æ�¥å�–代控制标记。 + +## 5. Replace Nested Conditional with Guard Clauses (以å�«è¯­å�¥å�–代嵌套æ�¡ä»¶è¡¨è¾¾å¼�) + +如果æŸ�个æ�¡ä»¶æž�其罕è§�,就应该å�•独检查该æ�¡ä»¶ï¼Œå¹¶åœ¨è¯¥æ�¡ä»¶ä¸ºçœŸæ—¶ç«‹åˆ»ä»Žå‡½æ•°ä¸­è¿”回,这样的å�•独检查常常被称为“å�«è¯­å�¥â€�(guard clauses)。 + +æ�¡ä»¶è¡¨è¾¾å¼�通常有两ç§�表现形å¼�。第一ç§�å½¢å¼�是:所有分支都属于正常行为。第二ç§�å½¢å¼�则是:æ�¡ä»¶è¡¨è¾¾å¼�æ��供的答案中å�ªæœ‰ä¸€ç§�是正常行为,其他都是ä¸�常è§�的情况,å�¯ä»¥ä½¿ç”¨å�«è¯­å�¥è¡¨çŽ°æ‰€æœ‰ç‰¹æ®Šæƒ…å†µã€‚ + +```java +double getPayAmount() { +    double result; +    if (isDead) result = deadAmount(); +    else { +        if (isSeparated) result = separatedAmount(); +        else { +            if (isRetired) result = retiredAmount(); +            else result = normalPayAmount(); +        }; +    } +    return result; +}; +``` + +```java +double getPayAmount() { +    if (isDead) return deadAmount(); +    if (isSeparated) return separatedAmount(); +    if (isRetired) return retiredAmount(); +    return normalPayAmount(); +}; +``` + +## 6. Replace Conditional with Polymorphism (以多æ€�å�–代æ�¡ä»¶è¡¨è¾¾å¼�) + +将这个æ�¡ä»¶è¡¨è¾¾å¼�çš„æ¯�个分支放进一个å­�类内的覆写函数中,然å�Žå°†åŽŸå§‹å‡½æ•°å£°æ˜Žä¸ºæŠ½è±¡å‡½æ•°ã€‚éœ€è¦�先使用 Replace Type Code with Subclass 或 Replace Type Code with State/Strategy æ�¥å»ºç«‹ç»§æ‰¿ç»“果。 + +```java +double getSpeed() { +    switch (type) { +        case EUROPEAN: +            return getBaseSpeed(); +        case AFRICAN: +            return getBaseSpeed()- getLoadFactor()* numberOfCoconuts; +        case NORWEGIAN_BLUE: +            return isNailed ? 0 : getBaseSpeed(voltage); +    } +    throw new RuntimeException("Should be unreachable"); +} +``` + +![](index_files/1c8432c8-2552-457f-b117-1da36c697221.jpg) + +## 7. Introduce Null Object(引入Null对象) + +将 null 值替æ�¢ä¸ºÂ null 对象。这样å�šçš„好处在于,ä¸�需è¦�询问对象是å�¦ä¸ºç©ºï¼Œç›´æŽ¥è°ƒç”¨å°±è¡Œã€‚ + +```java +if (customer == null) plan = BillingPlan.basic(); +else plan = customer.getPlan(); +``` + +## 8. Introduce Assertion(引入断言) + +以断言明确表现æŸ�ç§�å�‡è®¾ã€‚断言å�ªèƒ½ç”¨äºŽå¼€å�‘过程中,产å“�代ç �中ä¸�会有断言。 + +```java +double getExpenseLimit() { +    // should have either expense limit or a primary project +    return (expenseLimit != NULL_EXPENSE) ? expenseLimit :  primaryProject.getMemberExpenseLimit(); +} +``` + +```java +double getExpenseLimit() { +    Assert.isTrue (expenseLimit != NULL_EXPENSE || primaryProject != null); +    return (expenseLimit != NULL_EXPENSE) ? expenseLimit :  primaryProject.getMemberExpenseLimit(); +} +``` + +# 第å��章 简化函数调用 + +## 1. Rename Method(函数改å��) + +使函数å��能解释函数的用途。 + +## 2. Add Parameter(添加å�‚数) + +使函数ä¸�需è¦�通过调用获得æŸ�个信æ�¯ã€‚ + +## 3. Remove Parameter(移除å�‚数) + +与 Add Parameter 相å��,改用调用的方å¼�æ�¥èŽ·å¾—æŸ�个信æ�¯ã€‚ + +## 4. Separate Query from Modifier(将查询函数和修改函数分离) + +æŸ�个函数å�³è¿”回对象状æ€�值,å�ˆä¿®æ”¹å¯¹è±¡çжæ€�。 + +应当建立两个ä¸�å�Œçš„函数,其中一个负责查询,å�¦ä¸€ä¸ªè´Ÿè´£ä¿®æ”¹ã€‚任何有返回值的函数,都ä¸�应该有看得到的副作用。 + +```java +getTotalOutstandingAndSetReadyForSummaries(); +``` + +```java +getTotalOutstanding(); +setReadyForSummaries(); +``` + +## 5. Parameterize Method(令函数æ�ºå¸¦å�‚数) + +若干函数å�šäº†ç±»ä¼¼çš„工作,但在函数本体中å�´åŒ…å�«äº†ä¸�å�Œçš„值。 + +建立å�•一函数,以å�‚数表达那些ä¸�å�Œçš„值。 + +```java +fivePercentRaise(); +tenPercentRaise(); +``` +```java +raise(percentage); +``` + +## 6. Replace Parameter with Explicit Methods(以明确函数å�–代å�‚数) + +有一个函数,完全å�–决于å�‚数值而采å�–ä¸�å�Œè¡Œä¸ºã€‚ + +针对该å�‚æ•°çš„æ¯�一个å�¯èƒ½å€¼ï¼Œå»ºç«‹ä¸€ä¸ªç‹¬ç«‹å‡½æ•°ã€‚ + +```java +void setValue(String name, int value){ +    if (name.equals("height")){ +        height = value; +        return; +    } +    if (name.equals("width")){ +        width = value; +        return; +    } +    Assert.shouldNeverReachHere(); +} +``` + +```java +void setHeight(int arg){ +    height = arg; +} +void setWidth(int arg){ +    width = arg; +} +``` + +## 7. Preserve Whole Object(ä¿�æŒ�对象完整) + +从æŸ�个对象中å�–出若干值,将它们作为æŸ�一次函数调用时的å�‚数。 + +改为传递整个对象。 + +```java +int low = daysTempRange().getLow(); +int high = daysTempRange().getHigh(); +withinPlan = plan.withinRange(low,high); +``` + +```java +withinPlan = plan.withinRange(daysTempRange()); +``` + +## 8. Replace Parameter with Methods(以函数å�–代å�‚数) + +对象调用æŸ�个函数,并将所得结果作为å�‚数,传递给å�¦ä¸€ä¸ªå‡½æ•°ã€‚而接å�—该å�‚数的函数本身也能够调用å‰�一个函数。 + +让å�‚数接收者去除该项å�‚数,而是直接调用å‰�一个函数。 + +```java +int basePrice = _quantity * _itemPrice; +discountLevel = getDiscountLevel(); +double finalPrice = discountedPrice (basePrice, discountLevel); +``` + +```java +int basePrice = _quantity * _itemPrice; +double finalPrice = discountedPrice (basePrice); +``` + +## 9. Introduce Parameter Object(引入å�‚数对象) + +æŸ�些å�‚数总是很自然地å�Œæ—¶å‡ºçŽ°ï¼Œè¿™äº›å�‚数就是 Data Clumps。 + +以一个对象å�–代这些å�‚数。 + +![](index_files/08738dd0-ae8e-404a-ba78-a6b1b7d225b3.jpg) + +## 10. Remove Setting Method(移除设值函数) + +类中的æŸ�个字段应该在对象创建时被设值,然å�Žå°±ä¸�å†�改å�˜ã€‚ + +去掉该字段的所有设值函数,并将该字段设为 final。 + +## 11. Hide Method(éš�è—�函数) + +有一个函数,从æ�¥æ²¡æœ‰è¢«å…¶ä»–任何类用到。 + +将这个函数修改为 private。 + +## 12. Replace Constructor with Factory Method (以工厂函数å�–代构造函数) + +希望在创建对象时ä¸�仅仅是å�šç®€å�•的建构动作。 + +将构造函数替æ�¢ä¸ºå·¥åŽ‚å‡½æ•°ã€‚ + +## 13. Encapsulate Downcast(å°�装å�‘下转型) + +æŸ�个函数返回的对象,需è¦�由函数调用者执行å�‘下转型(downcast)。 + +å°†å�‘下转型动作移到函数中。 + +```java +Object lastReading(){ +    return readings.lastElement(); +} +``` +```java +Reading lastReading(){ +    return (Reading)readings.lastElement(); +} +``` + +## 14. Replace Error Code with Exception (以异常å�–代错误ç �) + +æŸ�个函数返回一个特定的代ç �,用以表示æŸ�ç§�错误情况。 + +改用异常,异常将普通程åº�和错误处ç�†åˆ†å¼€ï¼Œä½¿ä»£ç �更容易ç�†è§£ã€‚ + +## 15. Replace Exception with Test(以测试å�–代异常) + +é�¢å¯¹ä¸€ä¸ªè°ƒç”¨è€…å�¯ä»¥é¢„先检查的æ�¡ä»¶ï¼Œä½ æŠ›å‡ºäº†ä¸€ä¸ªå¼‚常。 + +修改调用者,使它在调用函数之å‰�å…ˆå�šæ£€æŸ¥ã€‚ + +```java +double getValueForPeriod(int periodNumber) { +    try { +        return values[periodNumber]; +    } catch (ArrayIndexOutOfBoundsException e) { +        return 0; +    } +} +``` +```java +double getValueForPeriod(int periodNumber) { +    if (periodNumber >= values.length) return 0; +    return values[periodNumber]; +``` + +# 第å��一章 处ç�†æ¦‚括关系 + +## 1. Pull Up Field(字段上移) + +两个å­�类拥有相å�Œçš„字段。 + +将该字段移至超类。 + +## 2. Pull Up Method(函数上移) + +有些函数,在å�„个å­�类中产生完全相å�Œçš„结果。 + +将该函数移至超类。 + +## 3. Pull Up Constructor Body(构造函数本体上移) + +你在å�„个å­�类中拥有一些构造函数,它们的本体几乎完全一致。 + +在超类中新建一个构造函数,并在å­�类构造函数中调用它。 + +```java +class Manager extends Employee... + +public Manager(String name, String id, int grade) { +    this.name = name; +    this.id = id; +    this.grade = grade; +} +``` + +```java +public Manager(String name, String id, int grade) { +    super(name, id); +    this.grade = grade; +} +``` + +## 4. Push Down Method(函数下移) + +超类中的æŸ�个函数å�ªä¸Žéƒ¨åˆ†å­�类有关。 + +将这个函数移到相关的那些å­�类去。 + +## 5. Push Down Field(字段下移) + +超类中的æŸ�个字段å�ªè¢«éƒ¨åˆ†å­�类用到。 + +将这个字段移到需è¦�它的那些å­�类去。 + +## 6. Extract Subclass(æ��炼å­�类) + +类中的æŸ�些特性å�ªè¢«æŸ�些实例用到。 + +新建一个å­�类,将上é�¢æ‰€è¯´çš„那一部分特性移到å­�类中。 + +## 7. Extract Superclass(æ��炼超类) + +两个类有相似特性。 + +为这两个类建立一个超类,将相å�Œç‰¹æ€§ç§»è‡³è¶…类。 + +## 8. Extract Interface(æ��炼接å�£ï¼‰ + +若干客户使用类接å�£ä¸­çš„å�Œä¸€å­�集,或者两个类的接å�£æœ‰éƒ¨åˆ†ç›¸å�Œã€‚ + +将相å�Œçš„å­�集æ��炼到一个独立接å�£ä¸­ã€‚ + +## 9. Collapse Hierarchy(折å� ç»§æ‰¿ä½“系) + +超类和å­�类之间无太大区别。 + +将它们å�ˆä¸ºä¸€ä½“。 + +## 10. Form Template Method(塑造模æ�¿å‡½æ•°ï¼‰ + +你有一些å­�类,其中相应的æŸ�些函数以相å�Œé¡ºåº�执行类似的æ“�作,但å�„个æ“�作的细节上有所ä¸�å�Œã€‚ + +将这些æ“�作分别放进独立函数中,并ä¿�æŒ�它们都有相å�Œçš„ç­¾å��,于是原函数也就å�˜å¾—相å�Œäº†ã€‚ç„¶å�Žå°†åŽŸå‡½æ•°ä¸Šç§»è‡³è¶…ç±»ã€‚(模æ�¿æ–¹æ³•模å¼�) + +## 11. Replace Inheritance with Delegation (以委托å�–代继承) + +æŸ�个å­�ç±»å�ªä½¿ç”¨è¶…类接å�£ä¸­çš„一部分,或是根本ä¸�需è¦�继承而æ�¥çš„æ•°æ�®ã€‚ + +在å­�类中新建一个字段用以ä¿�存超类,调整å­�类函数,令它改而委托超类,然å�ŽåŽ»æŽ‰ä¸¤è€…ä¹‹é—´çš„ç»§æ‰¿å…³ç³»ã€‚ + +## 12. Replace Delegation with Inheritance (以继承å�–代委托) + +你在两个类之间使用委托关系,并ç»�常为整个接å�£ç¼–写许多æž�简å�•的委托函数。 + +让委托类继承å�—托类。 \ No newline at end of file diff --git a/notes/笔记/é�¢å�‘对象æ€�想.md.txt b/notes/笔记/é�¢å�‘对象æ€�想.md.txt new file mode 100644 index 00000000..058ef539 --- /dev/null +++ b/notes/笔记/é�¢å�‘对象æ€�想.md.txt @@ -0,0 +1,292 @@ +[TOC] + +# S.O.L.I.D + +S.O.L.I.D是é�¢å�‘对象设计和编程(OOD&OOP)中几个é‡�è¦�ç¼–ç �原则(Programming Priciple)的首字æ¯�缩写。 + +|简写    |全拼    |中文翻译| +| -- | -- | -- | +|SRP|    The Single Responsibility Principle    |å�•一责任原则| +|OCP|    The Open Closed Principle            | 开放å°�闭原则| +|LSP|    The Liskov Substitution Principle    |里æ°�替æ�¢åŽŸåˆ™| +|ISP|    The Interface Segregation Principle    |接å�£åˆ†ç¦»åŽŸåˆ™| +|DIP|    The Dependency Inversion Principle    |ä¾�赖倒置原则| + + +## 1. å�•一责任原则 + +当需è¦�修改æŸ�个类的时候原因有且å�ªæœ‰ä¸€ä¸ªã€‚æ�¢å�¥è¯�说就是让一个类å�ªå�šä¸€ç§�类型责任,当这个类需è¦�承当其他类型的责任的时候,就需è¦�分解这个类。 + +## 2. 开放å°�闭原则 + +软件实体应该是å�¯æ‰©å±•,而ä¸�å�¯ä¿®æ”¹çš„。也就是说,对扩展是开放的,而对修改是å°�闭的。 + +## 3. 里æ°�替æ�¢åŽŸåˆ™ + +当一个å­�类的实例应该能够替æ�¢ä»»ä½•其超类的实例时,它们之间æ‰�具有 is-a 关系。 + +## 4. 接å�£åˆ†ç¦»åŽŸåˆ™ + +ä¸�能强迫用户去ä¾�赖那些他们ä¸�使用的接å�£ã€‚æ�¢å�¥è¯�说,使用多个专门的接å�£æ¯”使用å�•一的总接å�£æ€»è¦�好。 + +## 5. ä¾�赖倒置原则 + +1.  高层模å�—ä¸�应该ä¾�赖于低层模å�—,二者都应该ä¾�赖于抽象 +2.  抽象ä¸�应该ä¾�赖于细节,细节应该ä¾�赖于抽象 + +# å°�装ã€�继承ã€�多æ€� + +å°�装ã€�继承ã€�多æ€�是é�¢å�‘对象的三大特性。 + +## 1. å°�装 + +利用抽象数æ�®ç±»åž‹å°†æ•°æ�®å’ŒåŸºäºŽæ•°æ�®çš„æ“�作å°�装在一起,使其构æˆ�一个ä¸�å�¯åˆ†å‰²çš„独立实体,数æ�®è¢«ä¿�护在抽象数æ�®ç±»åž‹çš„内部,尽å�¯èƒ½åœ°éš�è—�内部的细节,å�ªä¿�留一些对外接å�£ä½¿ä¹‹ä¸Žå¤–部å�‘生è�”系。用户是无需知é�“对象内部的细节,但å�¯ä»¥é€šè¿‡è¯¥å¯¹è±¡å¯¹å¤–çš„æ��供的接å�£æ�¥è®¿é—®è¯¥å¯¹è±¡ã€‚ + +å°�装有三大好处: + +1. 良好的å°�装能够å‡�少耦å�ˆã€‚ + +2. 类内部的结构å�¯ä»¥è‡ªç”±ä¿®æ”¹ã€‚ + +3. å�¯ä»¥å¯¹æˆ�员进行更精确的控制。 + +4. éš�è—�ä¿¡æ�¯ï¼Œå®žçŽ°ç»†èŠ‚ã€‚ + +以下 Person 类å°�装 nameã€�genderã€�age 等属性,外界å�ªèƒ½é€šè¿‡Â get() 方法获å�–一个 Person 对象的 name 属性和 gender 属性,而无法获å�– age 属性,但是 age 属性å�¯ä»¥ä¾›Â work() 方法使用。 + +注æ„�到 gender 属性使用 int 数æ�®ç±»åž‹è¿›è¡Œå­˜å‚¨ï¼Œå°�装使得用户注æ„�ä¸�到这ç§�实现细节。并且在需è¦�修改使用的数æ�®ç±»åž‹æ—¶ï¼Œä¹Ÿå�¯ä»¥åœ¨ä¸�å½±å“�客户端代ç �的情况下进行。 + +```java +public class Person { +    private String name; +    private int gender; +    private int age; + +    public String getName() { +        return name; +    } + +    public String getGender() { +        return gender == 0 ? "man" : "woman"; +    } + +    public void work() { +        if(18 <= age && age <= 50) { +            System.out.println(name + " is working very hard!"); +        } else { +            System.out.println(name + " can't work!"); +        } +    } +} +``` + +## 2. 继承 + +继承实现了 **is-a** 关系,例如 Cat 和 Animal 就是一ç§� is-a 关系,因此å�¯ä»¥å°†Â Cat 继承自 Animal,从而获得 Animal é�žÂ private 的属性和方法。 + +Cat å�¯ä»¥å½“å�šÂ Animal æ�¥ä½¿ç”¨ï¼Œä¹Ÿå°±æ˜¯å�¯ä»¥ä½¿ç”¨Â Animal 引用 Cat 对象,这ç§�å­�类转æ�¢ä¸ºçˆ¶ç±»ç§°ä¸ºÂ **å�‘上转型**。 + +继承应该é�µå¾ªé‡Œæ°�替æ�¢åŽŸåˆ™ï¼šå½“ä¸€ä¸ªå­�类的实例应该能够替æ�¢ä»»ä½•其超类的实例时,它们之间æ‰�具有 is-a 关系。 + +```java +Animal animal = new Cat(); +``` + +## 3. 多æ€� + +多æ€�分为编译时多æ€�å’Œè¿�行时多æ€�。编译时多æ€�主è¦�指方法的é‡�装,è¿�行时多æ€�指程åº�中定义的对象引用所指å�‘的具体类型在è¿�行期间æ‰�确定。 + +多æ€�有三个æ�¡ä»¶ï¼š1. 继承;2. 覆盖父类方法;3. å�‘上转型。 + +下é�¢çš„代ç �中,ä¹�器类(Instrument)有两个å­�类:Wind 和 Percussion,它们都覆盖了 play() 方法,并且在 main() 方法中使用父类 Instrument æ�¥å¼•用 Wind 和 Percussion 对象。在 Instrument 引用调用 play() 方法时,会执行实际引用对象所在类的 play() 方法,而ä¸�是 Instrument 类的方法。 + +```java +public class Instrument { +    public void play() { +        System.out.println("Instument is playing..."); +    } +} + +public class Wind extends Instrument { +    public void play() { +        System.out.println("Wind is playing..."); +    } +} + +public class Percussion extends Instrument { +    public void play() { +        System.out.println("Percussion is playing..."); +    } +} + +public class Music { +    public static void main(String[] args){ +        List instruments = new ArrayList<>(); +        instruments.add(new Wind()); +        instruments.add(new Percussion()); +        for(Instrument instrument : instruments){ +            instrument.play(); +        } +    } +} + +``` + + + +# UML + +## 1. 类图 + +**1.1 继承相关** + +继承有两ç§�å½¢å¼�: 泛化(generalize)和实现(realize),表现为 is-a 关系。 + +① 泛化关系(generalization) + +从具体类中继承 + +![](index_files/29badd92-109f-4f29-abb9-9857f5973928.png) + +② 实现关系(realize) + +从抽象类或者接å�£ä¸­ç»§æ‰¿ + +![](index_files/4b16e1d3-3a60-472c-9756-2f31b1c48abe.png) + +**1.2 整体和部分** + +① è�šå�ˆå…³ç³»(aggregation) + +表示整体由部分组æˆ�,但是整体和部分ä¸�是强ä¾�赖的,整体ä¸�存在了部分还是会存在。以下表示 B 由 A 组æˆ�: + +![](index_files/34259bb8-ca3a-4872-8771-9e946782d9c3.png) + + +② 组å�ˆå…³ç³»(composition) + +å’Œè�šå�ˆä¸�å�Œï¼Œç»„å�ˆä¸­æ•´ä½“和部分是强ä¾�赖的,整体ä¸�存在了部分也ä¸�存在了。比如公å�¸å’Œéƒ¨é—¨ï¼Œå…¬å�¸æ²¡äº†éƒ¨é—¨å°±ä¸�存在了。但是公å�¸å’Œå‘˜å·¥å°±å±žäºŽè�šå�ˆå…³ç³»äº†ï¼Œå› ä¸ºå…¬å�¸æ²¡äº†å‘˜å·¥è¿˜åœ¨ã€‚ + +![](index_files/7dda050d-ac35-4f47-9f51-18f18ed6fa9a.png) + +**1.3 相互è�”ç³»** + +① 关è�”关系(association) + +表示ä¸�å�Œç±»å¯¹è±¡ä¹‹é—´æœ‰å…³è�”,这是一ç§�é�™æ€�关系,与è¿�行过程的状æ€�无关,在最开始就å�¯ä»¥ç¡®å®šã€‚因此也å�¯ä»¥ç”¨Â 1 对 1ã€�多对 1ã€�多对多这ç§�å…³è�”关系æ�¥è¡¨ç¤ºã€‚比如学生和学校就是一ç§�å…³è�”关系,一个学校å�¯ä»¥æœ‰å¾ˆå¤šå­¦ç”Ÿï¼Œä½†æ˜¯ä¸€ä¸ªå­¦ç”Ÿå�ªå±žäºŽä¸€ä¸ªå­¦æ ¡ï¼Œå› æ­¤è¿™æ˜¯ä¸€ç§�多对一的关系,在è¿�行开始之å‰�å°±å�¯ä»¥ç¡®å®šã€‚ + +![](index_files/4ccd294c-d6b2-421b-839e-d88336ff5fb7.png) + +② ä¾�赖关系(dependency) + +和关è�”关系ä¸�å�Œçš„æ˜¯, ä¾�赖关系是在è¿�行过程中起作用的。一般ä¾�赖作为类的构造器或者方法的å�‚数传入。å�Œå�‘ä¾�赖时一ç§�ä¸�好的设计。 + +![](index_files/47ca2614-509f-476e-98fc-50ec9f9d43c0.png) + + +## 2. 时åº�图 + +**2.1 定义** + +æ—¶åº�图æ��述了对象之间传递消æ�¯çš„æ—¶é—´é¡ºåº�,它用æ�¥è¡¨ç¤ºç”¨ä¾‹çš„行为顺åº�。它的主è¦�作用是通过对象间的交互æ�¥æ��述用例(注æ„�是对象),从而寻找类的æ“�作。 + +**2.2 赤å£�之战时åº�图** + +从虚线从上往下表示时间的推进。 + +![](index_files/80c5aff8-fc46-4810-aeaa-215b5c60a003.png) + +å�¯è§�,通过时åº�图å�¯ä»¥çŸ¥é�“æ¯�个类具有以下æ“�作: + +```java +publc class 刘备 { +   public void 应战(); +} + +publc class  孔明 { +  public void  拟定策略(); +  public void  è�”å�ˆå­™æ�ƒ(); +  private void 借东风ç�«æ”»(); +} + +public class 关羽 { +    public void  防守è�Šå·ž(); +} + +public class 张飞 { +   public void  防守è�†å·žå‰�线(); +} + +public class 孙æ�ƒÂ { +   public void  领兵相助(); +} +``` + +**2.3 活动图ã€�æ—¶åº�图之间的关系** + +活动图示从用户的角度æ�¥æ��述用例; + +æ—¶åº�图是从计算机的角度(对象间的交互)æ��述用例。 + +**2.4 类图与时åº�图的关系** + +类图æ��述系统的é�™æ€�结构,时åº�图æ��述系统的动æ€�行为。 + +**2.5 时åº�图的组æˆ�** + +① 对象 + +有三ç§�表现形å¼� + +![](index_files/25b8adad-2ef6-4f30-9012-c306b4e49897.png) + +在画图时,应该é�µå¾ªä»¥ä¸‹åŽŸåˆ™ï¼š + +1. 把交互频ç¹�的对象尽å�¯èƒ½åœ°é� æ‹¢ã€‚ + +2. 把åˆ�始化整个交互活动的对象(有时是一个å�‚与者)放置在最左边。 + +② 生命线 + +生命线从对象的创建开始到对象销æ¯�时终止 + +![](index_files/b7b0eac6-e7ea-4fb6-8bfb-95fec6f235e2.png) + +③ 消æ�¯ + +对象之间的交互å¼�通过å�‘é€�消æ�¯æ�¥å®žçŽ°çš„ã€‚ + +消æ�¯æœ‰4ç§�类型: + +1\. 简å�•消æ�¯ï¼Œä¸�区分å�Œæ­¥å¼‚步。 + +![](index_files/a13b62da-0fa8-4224-a615-4cadacc08871.png) + +2\. å�Œæ­¥æ¶ˆæ�¯ï¼Œå�‘é€�消æ�¯ä¹‹å�Žéœ€è¦�æš‚å�œæ´»åЍæ�¥ç­‰å¾…回应。 + +![](index_files/33821037-dc40-4266-901c-e5b38e618426.png) + +3\. 异步消æ�¯ï¼Œå�‘é€�消æ�¯ä¹‹å�Žä¸�需è¦�等待。 + +![](index_files/dec6c6cc-1b5f-44ed-b8fd-464fcf849dac.png) + +4\. 返回消æ�¯ï¼Œå�¯é€‰ã€‚ + +④ 激活 + +生命线上的方框表示激活状æ€�,其它时间处于休眠状æ€�。 + +![](index_files/6ab5de9b-1c1e-4118-b2c3-fb6c7ed7de6f.png) + + +# å�‚考资料 + +- Java 编程æ€�想 + +- [é�¢å�‘对象设计的SOLID原则](http://www.cnblogs.com/shanyou/archive/2009/09/21/1570716.html) + +- [看懂UML类图和时åº�图](http://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html#generalization) + +- [UML系列——时åº�图(顺åº�图)sequence diagram](http://www.cnblogs.com/wolf-sun/p/UML-Sequence-diagram.html) + +- [é�¢å�‘对象编程三大特性------å°�装ã€�继承ã€�多æ€�](http://blog.csdn.net/jianyuerensheng/article/details/51602015) \ No newline at end of file diff --git a/notes/笔记/é�¢å�‘对象程åº�设计.md.txt b/notes/笔记/é�¢å�‘对象程åº�设计.md.txt new file mode 100644 index 00000000..16988cfb --- /dev/null +++ b/notes/笔记/é�¢å�‘对象程åº�设计.md.txt @@ -0,0 +1,403 @@ +[TOC] + +# 解决æ€�è·¯ + +é�¢å�‘对象设计问题è¦�求求è�Œè€…设计出类和方法,以实现技术问题或æ��述真实生活中的对象。å�¯ä»¥æŒ‰ç…§ä»¥ä¸‹æ­¥éª¤æ�¥è¿›è¡Œè§£å†³ï¼š + +## 1. 处ç�†ä¸�明确的地方 + +é�¢å�‘对象设计问题往往会故æ„�放些烟幕弹,æ„�在检验你是武断臆测,还是æ��出问题以厘清问题。毕竟,开å�‘人员è¦�是没弄清楚自己è¦�å¼€å�‘什么,就直接挽起袖å­�开始编ç �,å�ªä¼šæµªè´¹å…¬å�¸çš„财力物力,还å�¯èƒ½é€ æˆ�更严é‡�çš„å�Žæžœã€‚ + +碰到é�¢å�‘对象设计问题时,你应该先问清楚,è°�是使用者ã€�他们将如何使用。对æŸ�些问题,你甚至还è¦�问清楚“5W1Hâ€�,也就是 Who(è°�)ã€�What(什么)ã€�Where(哪里)ã€�When(何时)Why(为什么)ã€�How(如何)。举个例å­�,å�‡è®¾é�¢è¯•官让你æ��述咖啡机的é�¢å�‘对象设计。这个问题看似简å�•明了,其实ä¸�然。这å�°å’–啡机å�¯èƒ½æ˜¯ä¸€æ¬¾å·¥ä¸šåž‹æœºå™¨ï¼Œè®¾è®¡ç”¨æ�¥æ”¾åœ¨å¤§é¤�厅里,æ¯�å°�æ—¶è¦�æœ�务几百ä½�顾客,还è¦�能制作 10 ç§�ä¸�å�Œå�£å‘³çš„咖啡。å�ˆæˆ–者,它å�¯èƒ½æ˜¯è®¾è®¡ç»™è€�年人使用的简易咖啡机,å�ªè¦�能制作简å�•的黑咖啡就行。这些用例将大大影å“�你的设计。 + +## 2. 定义核心对象 + +比如,å�‡è®¾è¦�为一家é¤�馆进行é�¢å�‘对象设计。那么,核心对象å�¯èƒ½åŒ…括员工ã€�æœ�务员ã€�厨师ã€�é¤�桌ã€�顾客ã€�订å�•ã€�è�œã€‚ + +## 3. 分æž�对象关系 + +å�¯ä»¥åˆ©ç”¨Â UML 类图æ�¥åˆ†æž�。其中, + +- æœ�务员和厨师都继承自员工类; +- 一个æœ�务员è¦�为多个é¤�桌的顾客æ��ä¾›æœ�务; +- 一个é¤�桌å�¯ä»¥æœ‰å¾ˆå¤šé¡¾å®¢ï¼› +- 一个é¤�桌å�¯ä»¥æœ‰ä¸€ä¸ªè®¢å�•ï¼› +- 一个订å�•有多个è�œã€‚ +- 一个厨师è¦�处ç�†å¤šä¸ªè®¢å�•ï¼› + +![](index_files/97c1d566-ae3a-4ddd-ba86-e8378e26d49b.png) + +## 4. 研究对象的动作 + +å�¯ä»¥ç”¨æ—¶åº�图æ�¥æ‰¾å‡ºå¯¹è±¡çš„动作。 + +多个顾客å��到一个é¤�桌,æœ�务员æ�¥åˆ°é¤�桌å‰�æ��ä¾›æœ�务,并等待顾客填写订å�•。订å�•填写完æˆ�å�Žï¼Œäº¤ç»™åŽ¨å¸ˆå¤„ç�†è®¢å�•,并等待厨师处ç�†å®Œæˆ�,完æˆ�之å�Žæœ�务员将上è�œã€‚ + +![](index_files/4f901988-481c-48bf-a313-35778e2211bc.png) + +# 示例 + +## 1. è�Šå¤©æœ�务器 + +题目æ��述:请æ��述该如何设计一个è�Šå¤©æœ�务器。è¦�求给出å�„ç§�å�Žå�°ç»„ä»¶ã€�类和方法的细节,并说明其中最难解决的问题会是什么。 + +设计è�Šå¤©æœ�务器是项大工程,ç»�é�žä¸€æ¬¡é�¢è¯•就能完æˆ�。毕竟,就算一整个团队,也è¦�花费数月乃至好几年æ‰�能打造出一个è�Šå¤©æœ�务器。作为求è�Œè€…,你的工作是专注解决该问题的æŸ�个方é�¢ï¼Œæ¶‰å�ŠèŒƒå›´è¦�够广,å�ˆè¦�够集中,这样æ‰�能在一轮é�¢è¯•中æ�žå®šã€‚它ä¸�一定è¦�与真实情况一模一样,但也应该忠实å��映出实际的实现。 + +这里我们会把注æ„�力放在用户管ç�†å’Œå¯¹è¯�等核心功能:添加用户ã€�创建对è¯�ã€�更新状æ€�,等等。考虑到时间和空间有é™�,我们ä¸�会探讨这个问题的è�”网部分,也ä¸�æ��è¿°æ•°æ�®æ˜¯æ€Žä¹ˆçœŸæ­£æŽ¨é€�到客户端的。 + +å�¦å¤–,我们å�‡è®¾â€œå¥½å�‹å…³ç³»â€�是å�Œå�‘的,如果你是我的è�”系人之一,那就表示我也是你的è�”系人之一。我们的è�Šå¤©ç³»ç»Ÿå°†æ”¯æŒ�群组è�Šå¤©å’Œä¸€å¯¹ä¸€ï¼ˆç§�密)è�Šå¤©ï¼Œä½†å¹¶ä¸�考虑语音è�Šå¤©ã€�视频è�Šå¤©æˆ–文件传输。 + +### 1.1 需è¦�支æŒ�的特定动作 + +这也有待你跟é�¢è¯•官探讨,下é�¢åˆ—出几点想法。 + +- 显示在线和离线状æ€�。 +- 添加请求(å�‘é€�ã€�接å�—ã€�æ‹’ç»�)。 +- 更新状æ€�ä¿¡æ�¯ã€‚ +- å�‘èµ·ç§�è�Šå’Œç¾¤è�Šã€‚ +- 在ç§�è�Šå’Œç¾¤è�Šä¸­æ·»åŠ æ–°ä¿¡æ�¯ã€‚ + +è¿™å�ªæ˜¯ä¸€éƒ¨åˆ†åˆ—表,如果时间有富余,还å�¯ä»¥å¤šåŠ ä¸€äº›åŠ¨ä½œã€‚ + +### 1.2 核心组件 + +这个系统å�¯èƒ½ç”±ä¸€ä¸ªæ•°æ�®åº“ã€�一组客户端和一组æœ�务器组æˆ�。我们的é�¢å�‘对象设计ä¸�会包å�«è¿™äº›éƒ¨åˆ†ï¼Œä¸�过å�¯ä»¥è®¨è®ºä¸€ä¸‹ç³»ç»Ÿçš„æ•´ä½“概览。 + +æ•°æ�®åº“将用æ�¥å­˜æ”¾æ›´æŒ�久的数æ�®ï¼Œæ¯”如用户列表或è�Šå¤©å¯¹è¯�的备份。 SQL 数æ�®åº“应该是ä¸�错的选择,或者,如果å�¯æ‰©å±•性è¦�求更高,å�¯ä»¥é€‰ç”¨Â BigTable 或其他类似的系统。 + +对于客户端和æœ�务器之间的通信,使用 XML 应该也ä¸�错。尽管这ç§�æ ¼å¼�ä¸�是最紧凑的(你也应该å�‘é�¢è¯•官指出这一点),它ä»�是很ä¸�错的选择,因为ä¸�管是计算机还是人类都容易辨识。使用 XML å�¯ä»¥è®©ç¨‹åº�调试起æ�¥æ›´è½»æ�¾ï¼Œè¿™ä¸€ç‚¹é�žå¸¸é‡�è¦�。 + +æœ�务器由一组机器组æˆ�,数æ�®ä¼šåˆ†æ•£åˆ°å�„å�°æœºå™¨ä¸Šï¼Œè¿™æ ·ä¸€æ�¥ï¼Œæˆ‘们å�¯èƒ½å°±å¿…须从一å�°æœºå™¨è·³åˆ°å�¦ä¸€å�°æœºå™¨ã€‚如果å�¯èƒ½çš„è¯�,我们会尽é‡�在所有机器上å¤�制部分数æ�®ï¼Œä»¥å‡�少查询æ“�作的次数。在此,设计上有个é‡�è¦�çš„é™�制æ�¡ä»¶ï¼Œå°±æ˜¯å¿…须防止出现å�•点故障。例如,如果一å�°æœºå™¨æŽ§åˆ¶æ‰€æœ‰ç”¨æˆ·çš„登录,那么,å�ªè¦�这一å�°æœºå™¨æ–­ç½‘,就会造æˆ�数以百万计的用户无法登录。 + +### 1.3 关键对象和方法 + +代ç �å�‚考:[Github](https://github.com/careercup/ctci/tree/master/java/Chapter%208/Question8_7) + +系统的关键对象包括用户ã€�对è¯�和状æ€�消æ�¯ç­‰ï¼Œæˆ‘们已ç»�实现了 UserManagement 类。è¦�是更关注这个问题的è�”网方é�¢æˆ–其他组件,我们就å�¯èƒ½è½¬è€Œæ·±å…¥æŽ¢ç©¶é‚£äº›å¯¹è±¡ã€‚ + +```java +public class UserManager { + private static UserManager instance; + private HashMap usersById = new HashMap(); + private HashMap usersByAccountName = new HashMap(); + private HashMap onlineUsers = new HashMap(); + + public static UserManager getInstance() { + if (instance == null) { + instance = new UserManager(); + } + return instance; + } + + public void addUser(User fromUser, String toAccountName) { + User toUser = usersByAccountName.get(toAccountName); + AddRequest req = new AddRequest(fromUser, toUser, new Date()); + toUser.receivedAddRequest(req); + fromUser.sentAddRequest(req); + } + + public void approveAddRequest(AddRequest req) { + req.status = RequestStatus.Accepted; + User from = req.getFromUser(); + User to = req.getToUser(); + from.addContact(to); + to.addContact(from); + } + + public void rejectAddRequest(AddRequest req) { + req.status = RequestStatus.Rejected; + User from = req.getFromUser(); + User to = req.getToUser(); + from.removeAddRequest(req); + to.removeAddRequest(req); + } + + public void userSignedOn(String accountName) { + User user = usersByAccountName.get(accountName); + if (user != null) { + user.setStatus(new UserStatus(UserStatusType.Available, "")); + onlineUsers.put(user.getId(), user); + } + } + + public void userSignedOff(String accountName) { + User user = usersByAccountName.get(accountName); + if (user != null) { + user.setStatus(new UserStatus(UserStatusType.Offline, "")); + onlineUsers.remove(user.getId()); + } + } +} +``` + +在 User 类中, receivedAddRequest 方法会通知用户 B(User B),用户 A(User A)请求加他 为 好 å�‹Â ã€‚ 用 户 B 会 接 å�— 或 拒 ç»� 该 请 求 ( 通 过 UserManager.approveAddRequest 或 rejectAddRequest), UserManager 则负责将用户互相添加到对方的通讯录中。 + +当 UserManager è¦�将 AddRequest 加入用户 A 的请求列表时,会调用 User 类的 sentAddRequest 方法。综上,整个æµ�程如下。 + +1. 用户 A 点击客户端软件上的“添加用户â€�,å�‘é€�ç»™æœ�务器。 +2. 用户 A 调用 requestAddUser(User B)。 +3. 步骤 2 的方法会调用 UserManager.addUser。 +4. UserManager 会调用 User A.sentAddRequest 和 User B.receivedAddRequest。 + +```java +public class User { + private int id; + private UserStatus status = null; + private HashMap privateChats = new HashMap(); + private ArrayList groupChats = new ArrayList(); + private HashMap receivedAddRequests = new HashMap(); + private HashMap sentAddRequests = new HashMap(); + + private HashMap contacts = new HashMap(); + private String accountName; + private String fullName; + + public User(int id, String accountName, String fullName) { + this.accountName = accountName; + this.fullName = fullName; + this.id = id; + } + + public boolean sendMessageToUser(User toUser, String content) { + PrivateChat chat = privateChats.get(toUser.getId()); + if (chat == null) { + chat = new PrivateChat(this, toUser); + privateChats.put(toUser.getId(), chat); + } + Message message = new Message(content, new Date()); + return chat.addMessage(message); + } + + public boolean sendMessageToGroupChat(int groupId, String content) { + GroupChat chat = groupChats.get(groupId); + if (chat != null) { + Message message = new Message(content, new Date()); + return chat.addMessage(message); + } + return false; + } + + public void setStatus(UserStatus status) { + this.status = status; + } + + public UserStatus getStatus() { + return status; + } + + public boolean addContact(User user) { + if (contacts.containsKey(user.getId())) { + return false; + } else { + contacts.put(user.getId(), user); + return true; + } + } + + public void receivedAddRequest(AddRequest req) { + int senderId = req.getFromUser().getId(); + if (!receivedAddRequests.containsKey(senderId)) { + receivedAddRequests.put(senderId, req); + } + } + + public void sentAddRequest(AddRequest req) { + int receiverId = req.getFromUser().getId(); + if (!sentAddRequests.containsKey(receiverId)) { + sentAddRequests.put(receiverId, req); + } + } + + public void removeAddRequest(AddRequest req) { + if (req.getToUser() == this) { + receivedAddRequests.remove(req); + } else if (req.getFromUser() == this) { + sentAddRequests.remove(req); + } + } + + public void requestAddUser(String accountName) { + UserManager.getInstance().addUser(this, accountName); + } + + public void addConversation(PrivateChat conversation) { + User otherUser = conversation.getOtherParticipant(this); + privateChats.put(otherUser.getId(), conversation); + } + + public void addConversation(GroupChat conversation) { + groupChats.add(conversation); + } + + public int getId() { + return id; + } + + public String getAccountName() { + return accountName; + } + + public String getFullName() { + return fullName; + } +} +``` + +Conversation 类实现为一个抽象类,因为所有 Conversation ä¸�是 GroupChat 就是 PrivateChat,å�Œæ—¶æ¯�个类å�„有自己的功能。 + +```java +public abstract class Conversation { + protected ArrayList participants = new ArrayList(); + protected int id; + protected ArrayList messages = new ArrayList(); + + public ArrayList getMessages() { + return messages; + } + + public boolean addMessage(Message m) { + messages.add(m); + return true; + } + + public int getId() { + return id; + } +} +``` + +```java +public class GroupChat extends Conversation { + public void removeParticipant(User user) { + participants.remove(user); + } + + public void addParticipant(User user) { + participants.add(user); + } +} +``` + +```java +public class PrivateChat extends Conversation { + public PrivateChat(User user1, User user2) { + participants.add(user1); + participants.add(user2); + } + + public User getOtherParticipant(User primary) { + if (participants.get(0) == primary) { + return participants.get(1); + } else if (participants.get(1) == primary) { + return participants.get(0); + } + return null; + } +} +``` + +```java +public class Message { + private String content; + private Date date; + public Message(String content, Date date) { + this.content = content; + this.date = date; + } + + public String getContent() { + return content; + } + + public Date getDate() { + return date; + } +} +``` + +AddRequest 和 UserStatus 两个类比较简å�•,功能ä¸�多,主è¦�用æ�¥å°†æ•°æ�®è�šå�ˆåœ¨ä¸€èµ·ï¼Œæ–¹ä¾¿å…¶ä»–类使用。 + +```java +public class AddRequest { + private User fromUser; + private User toUser; + private Date date; + RequestStatus status; + + public AddRequest(User from, User to, Date date) { + fromUser = from; + toUser = to; + this.date = date; + status = RequestStatus.Unread; + } + + public RequestStatus getStatus() { + return status; + } + + public User getFromUser() { + return fromUser; + } + + public User getToUser() { + return toUser; + } + + public Date getDate() { + return date; + } +} +``` + +```java +public class UserStatus { +  private String message; +  private UserStatusType type; +  public UserStatus(UserStatusType type, String message) { +  this.type = type; +  this.message = message; +  } +   +  public UserStatusType getStatusType() { +  return type; +  } +   +  public String getMessage() { +  return message; +  } +} +``` + +```java +public enum UserStatusType { + Offline, Away, Idle, Available, Busy +} +``` + +```java +public enum RequestStatus { + Unread, Read, Accepted, Rejected +} +``` + +### 4. 最难解决或最有æ„�æ€�的问题 + +**问题 1:如何确定æŸ�人在线** + +虽然希望用户在退出时通知我们,但å�³ä¾¿å¦‚此也无法确切知é�“状æ€�。例如,用户的网络连接å�¯èƒ½æ–­å¼€äº†ã€‚为了确定用户何时退出,或许å�¯ä»¥è¯•ç�€å®šæœŸè¯¢é—®å®¢æˆ·ç«¯ï¼Œä»¥ç¡®ä¿�它ä»�然在线。 + +**问题 2:如何处ç�†å†²çª�的信æ�¯** + +部分信æ�¯å­˜å‚¨åœ¨è®¡ç®—机内存中,部分则存储在数æ�®åº“里。如果两者ä¸�å�Œæ­¥æœ‰å†²çª�,那会出什么问题?哪一部分是“正确的â€�? + +**问题 3:如何æ‰�能让æœ�务器在任何负载下都能应付自如** + +å‰�é�¢æˆ‘们设计è�Šå¤©æœ�务器时并没怎么考虑å�¯æ‰©å±•性,但在实际场景中必须予以关注。我们需è¦�将数æ�®åˆ†æ•£åˆ°å¤šå�°æœ�务器上,而这å�ˆè¦�求我们更关注数æ�®çš„ä¸�å�Œæ­¥ã€‚ + +**问题 4:如何预防拒ç»�æœ�务攻击** + +客户端å�¯ä»¥å�‘我们推é€�æ•°æ�®â€”—若它们试图å�‘æœ�务器å�‘èµ·æ‹’ç»�æœ�务(DOS)攻击,怎么办?该如何预防? + +# å�‚考资料 + +- GAYLELEAKMANNMCDOWELL. 程åº�员é�¢è¯•金典 [M]. 人民邮电出版社 , 2013. \ No newline at end of file diff --git a/notes/笔记/黑客与画家.md.txt b/notes/笔记/黑客与画家.md.txt new file mode 100644 index 00000000..4802509d --- /dev/null +++ b/notes/笔记/黑客与画家.md.txt @@ -0,0 +1,128 @@ +[TOC] + +# 译者åº� + +作者:美国互è�”网创业之父 + +最开始 hack 指的是难题的解决办法,那些最能干的人被æˆ�为 hacker。黑客包å�«ä»¥ä¸‹ä¸‰ä¸ªç‰¹ç‚¹ï¼šå¥½çŽ©ã€�高智商ã€�探索精神。黑客的核心价值观:分享ã€�开放ã€�民主ã€�计算机的自由使用ã€�进步。因此黑客指的是那些专家级程åº�员。 + +由于黑客常常入侵系统,因此被与那些破å��计算机系统的人è�”系起æ�¥ã€‚然而破å��计算机系统的人称为骇客,真正的黑客ä¸�这么å�šï¼Œå��而是让世界å�˜å¾—更好。 + +# 为什么书呆å­�ä¸�å�—欢迎 + +作者认为,“书呆å­�â€�和“高智商â€�正相关,而“书呆å­�â€�和“å�—欢迎â€�负相关。 + +æ��出问题:既然书呆å­�智商高,那么为什么ä¸�想出å�—欢迎的方法?因为è¦�想å�—欢迎,需è¦�投入很大的时间精力去塑造个人魅力。而书呆å­�没有那么多的时间和精力,相比于å�—欢迎,他们更在乎其它更有趣的事,比如设计奇妙的ç�«ç®­ç­‰ã€‚ + +欺负书呆å­�的原因: + +- é�’少年的孩å­�更加残å¿�,书呆å­�ä¸�å�—欢迎æ„�味ç�€è¢«æ­§è§†å’Œå�—欺负。 + > 11 å²�以å‰�,å°�孩的生活由家长主导,其他孩å­�的影å“�有é™�。 孩å­�们ä¸�是ä¸�关心å°�学里其他å�Œå­¦çš„æƒ³æ³•,但是å�Žè€…ä¸�具有决定性影å“�。å°�学毕业以å�Žï¼Œè¿™ç§�情形开始å�‘生å�˜åŒ–。到了 11 å²�å·¦å�³ï¼Œå­©å­�们é€�æ¸�把家庭生活当作寻常事了。 他们在å�Œä¼´ä¸­å¼€è¾Ÿäº†ä¸€ä¸ªæ–°çš„世界,并认为那个世界æ‰�是é‡�è¦�的,比家里的世界更é‡�è¦�。实际上,如果他们在家里与父æ¯�å�‘生冲çª�, å��而能在那个新的世界中挣得é�¢å­�,而他们也确实更在乎那个世界。但是,问题在于,孩å­�们自己创造出æ�¥çš„世界是一个é�žå¸¸åŽŸå§‹çš„ä¸–ç•Œã€‚é�’少年在心ç�†ä¸Šè¿˜æ²¡æœ‰æ‘†è„±å„¿ç«¥çжæ€�, 许多人都会残å¿�地对待他人。他们折磨书呆å­�的原因就åƒ�拔掉一æ�¡èœ˜è››è…¿ä¸€æ ·ï¼Œè§‰å¾—很好玩。在一个人产生良知之å‰�,折磨就是一ç§�娱ä¹�。 + +- 为了凸显自己。 + > 在任何社会等级制度中,那些对自己没自信的人就会通过è™�待他们眼中的下等人æ�¥çª�显自己的身份。我已ç»�æ„�识到,正是因为这个原因,在美国社会中底层白人是对待黑人最残酷的群体。最å�—欢迎的孩å­�å¹¶ä¸�欺负书呆å­�,他们ä¸�需è¦�é� è¸©åœ¨ä¹¦å‘†å­�身上æ�¥åž«é«˜è‡ªå·±ã€‚大部分的欺负æ�¥è‡ªå¤„于下一等级的学生,那些焦虑的中间层。 + +- 为了和å�—欢迎的人结æˆ�å�Œç›Ÿã€‚ + > 没有什么比一个共å�Œçš„æ•Œäººæ›´èƒ½ä½¿å¾—人们团结起æ�¥äº†ã€‚这就好比一个政客,他想让选民忘记糟糕的国内局势,方法就是为国家找出一个敌人,哪怕敌人并ä¸�真的存在,他也å�¯ä»¥åˆ›é€ ä¸€ä¸ªå‡ºæ�¥ã€‚一群人在一起,挑出一个书呆å­�,居高临下地欺负他,就会把彼此è�”系起æ�¥ã€‚一起攻击一个外人,所有人因此就都æˆ�了自己人。这就是为什么最æ�¶åŠ£çš„ä»¥å¼ºå‡Œå¼±çš„äº‹ä»¶éƒ½ä¸Žå›¢ä½“æœ‰å…³çš„åŽŸå› ã€‚éš�便找一个书呆å­�,他都会告诉你,一群人的è™�待比一个人的è™�待残酷得多。 + +学校è€�师的å�ªæ˜¯æŠŠæ•™ä¹¦å½“æˆ�工作。 +> 公立学校的è€�师很åƒ�监狱的狱å�’。看管监狱的人主è¦�关心的是犯人都待在自己应该待的ä½�置。然å�Žï¼Œè®©çŠ¯äººæœ‰ä¸œè¥¿å�ƒï¼Œå°½å�¯èƒ½ä¸�è¦�å�‘生斗殴和伤害事件,这就å�¯ä»¥äº†ã€‚ + +到社会之å�Žï¼Œä¹¦å‘†å­�会被å�‹å¥½å¯¹å¾…,因为他们å�šçš„事能够产生更多的影å“�,而社会正需è¦�这些影å“�。 + +æˆ�年人把孩å­�在学校å�—苦å�—难归结为é�’春期的激素影å“�,但是实际上这是学校这ç§�体制的问题,学校å�ªæ˜¯æŠŠå­©å­�圈养起æ�¥ï¼Œä¸�让他们到处乱跑,然而学校内部存在ç�€å¾ˆå¤šæ®‹å¿�。 + +过去的孩å­�更早投入社会,也更能够真正学会本领。 +> 过去的社会中,é�’少年扮演ç�€ä¸€ä¸ªæ›´ç§¯æž�的角色。工业化时代到æ�¥å‰�,é�’少年都是æŸ�ç§�å½¢å¼�的学徒,ä¸�是在æŸ�个作å�Šï¼Œå°±æ˜¯åœ¨æŸ�个农庄,甚至在æŸ�艘军舰上。他们ä¸�会被扔到一æ—�,创造自己的å°�社会。他们是æˆ�年人社会的低级æˆ�员。以å‰�çš„é�’少年似乎也更尊敬æˆ�年人,因为æˆ�年人都是看得è§�的专家,会传授他们所è¦�学习的技能。如今的大多数é�’少年,对他们的家长在é�¥è¿œçš„办公室所从事的工作几乎一无所知。他们看ä¸�到学校作业与未æ�¥èµ°ä¸Šç¤¾ä¼šå�Žä»Žäº‹çš„工作有何è�”系。 + +学校的使命是教书育人,而并没有外界的压力去监ç�£ä»–们这么å�šï¼Œæ‰€ä»¥è€�师和学生å�Œæ–¹å¾€å¾€éƒ½æ˜¯æ•·è¡�了事。 + +没有外在的对手,孩å­�们就互相把对方当作对手。 + +æˆ�年人贬低了很多美好的东西,比如“人格â€�。 +> 许多书呆å­�å�¯èƒ½éƒ½ä¸Žæˆ‘一样,直到高中毕业多年å�Žï¼Œæ‰�去读中学里的指定读物。但是,我错过的ç»�ä¸�ä»…ä»…å�ªæ˜¯å‡ æœ¬ä¹¦è€Œå·²ã€‚我对许多美好的字眼都嗤之以鼻,比如“人格â€�ã€�“正直â€�,因为æˆ�年人贬低了这些è¯�。在他们嘴里,这些è¯�似乎都是å�Œä¸€ä¸ªæ„�æ€�——“å�¬è¯�â€�。一些孩å­�因为具备所谓的“人格â€�和“正直â€�,而å�—到夸奖,å�¯æ˜¯ä»–们ä¸�是呆得åƒ�一头大笨牛,就是轻浮得åƒ�一个ä¸�动脑筋的å�¹ç‰›è€…。如果“人格â€�和“正直â€�就是这ç§�æ ·å­�,我å®�æ„¿ä¸�è¦�它们。 + +# 黑客与画家 + +黑客和画家一样,都是艺术家,都在进行创作。 + +黑客比较喜欢脚本语言那ç§�å�¯ä»¥åЍæ€�扩展,并且å�¯ä»¥åƒ�铅笔画画一样修修改改。 +> 编程语言首è¦�的特性应该是å…�许动æ€�扩展(malleable)。编程语言是用æ�¥å¸®åŠ©æ€�考程åº�的,而ä¸�是用æ�¥è¡¨è¾¾ä½ å·²ç»�想好的程åº�。它应该是一支铅笔,而ä¸�是一支钢笔。如果大家都åƒ�学校教的那样编程,那么é�™æ€�类型(static typing)是一个ä¸�错的概念。但是,我认识的黑客,没有一个人喜欢用é�™æ€�类型语言编程。我们需è¦�的是一ç§�å�¯ä»¥éš�æ„�涂抹ã€�擦擦改改的语言,我们ä¸�想正襟å�±å��,把一个盛满å�„ç§�å�˜é‡�类型的茶æ�¯ï¼Œå°�心翼翼放在自己的è†�盖上,为了与一ä¸�ä¸�苟的编译器大婶交谈,努力地挑选è¯�语,确ä¿�å�˜é‡�类型匹é…�,好让自己显得礼貌å�ˆå‘¨åˆ°ã€‚ + +ç¼–ç �å¹¶ä¸�是科学研究,因此数学家ä¸�一定写一手好代ç �。 +> 创作者ä¸�å�ŒäºŽç§‘学家,明白这一点有很多好处。除了ä¸�用为é�™æ€�类型烦æ�¼ä»¥å¤–,还å�¯ä»¥å…�去å�¦ä¸€ä¸ªæŠ˜ç£¨ç§‘学家的难题,那就是“对数学的妒忌â€�。科学界的æ¯�一个人,暗地里都相信数学家比自己è�ªæ˜Žã€‚我觉得,数学家自己也相信这一点。最å�Žçš„结果就是科学家往往会把自己的工作尽å�¯èƒ½å¼„得看上去åƒ�数学。对于物ç�†å­¦è¿™æ ·çš„领域,这å�¯èƒ½ä¸�会有太大ä¸�良影å“�。但是,你越往自然科学的方å�‘å�‘展,它就越æˆ�为一个严é‡�的问题。 + +黑客为了能å�šè‡ªå·±å–œæ¬¢å�šçš„事并且å�¯ä»¥å…»æ´»è‡ªå·±ï¼Œå¾€å¾€ç™½å¤©å·¥ä½œæ™šä¸Šå�šè‡ªå·±çš„事。 + +热爱编程的人ä¸�å�¯é�¿å…�的会开å�‘自己的项目。 +> 我们é�¢è¯•程åº�员的时候,主è¦�关注的事情就是业余时间他们写了什么软件。因为如果你ä¸�爱一件事,你ä¸�å�¯èƒ½æŠŠå®ƒå�šå¾—真正优秀,è¦�是你很热爱编程,你就ä¸�å�¯é�¿å…�地会开å�‘你自己的项目。 + +黑客ä¸�是机械工作的技术工人,而是一ä½�创作者。 +> 如果黑客å�ªæ˜¯ä¸€ä¸ªè´Ÿè´£å®žçް领坼æ„�志的技术工人,è�Œè´£å°±æ˜¯æ ¹æ�®è§„格说明书写出代ç �,那么他其实与一个挖水沟的工人是一样的,从这头挖到那头,仅此而已。但是,如果黑客是一个创作者,他从事的就ä¸�是机械性的工作,他必须具备ç�µæ„Ÿã€‚ + +# ä¸�能说的è¯� + +æµ�行的é�“德观念虽然在å�Žä¸–看æ�¥ä¼šæ˜¯è�’诞的,但是如果在现今去è¿�背这些é�“德观念,说一些ä¸�å�ˆé€‚的言论,会让自己处于麻烦之中。 + +自己会深深赞å�Œè‡ªå·±çš„观点,并且确信会得到别人的认å�Œï¼Œå¾ˆå�¯èƒ½æ˜¯ï¼Œè¿™äº›è§‚点是别人给自己ç�Œè¾“的,别人说什么,自己就相信什么。 + +ä¸�能说的è¯�往往是正确的è¯�,因为具有争议性,会让æŸ�些人暴跳如雷。 + +那些ä¸�一定正确,æž�富争议性的言论被æˆ�为“异端邪说“,人们常常会给它们加上标签,目的是为了å°�æ�€å®ƒä»¬ã€‚ +> 亵渎神明ã€�冒犯圣ç�µã€�异端都是西方历å�²ä¸Šå¸¸è§�的标签,当代的标签则是有伤风化ã€�ä¸�得体ã€�ç ´å��国家利益等。 + +ç¦�忌的推崇者是那些处于中等阶层的人,他们ä¸�åƒ�高等阶层那样有足够自信ä¿�护自己的利益,å�ˆä¸�å�ŒäºŽä½Žç­‰é˜¶å±‚,他们有实力去推行。 + +æµ�行观点的第一批追é€�者是为了让自己与众ä¸�å�Œï¼Œè€Œç¬¬äºŒæ‰¹åˆ™æ˜¯æ€•自己与众ä¸�å�Œã€‚ + +科学家往往需è¦�打破æµ�行观点,从而å�–å¾—çª�破。 + +如果因为说了æŸ�些è¯�而让干扰了自己的生活,最好还是别说。 +> 这时你è¦�明白,自由æ€�考比畅所欲言更é‡�è¦�。如果你感到一定è¦�跟那些人辩个明白,ç»�ä¸�咽下这å�£æ°”,一定è¦�把è¯�说清楚,结果很å�¯èƒ½æ˜¯ä»Žæ­¤ä½ å†�也无法自由ç�†æ€§åœ°æ€�考了。我认为这样å�šä¸�å�¯å�–,更好的方法是在æ€�想和言论之间划一æ�¡æ˜Žç¡®çš„界线。在心里无所ä¸�想,但是ä¸�一定è¦�说出æ�¥ã€‚我就鼓励自己在心里默默æ€�考那些最无法无天的想法。你的æ€�想是一个地下组织,ç»�ä¸�è¦�把那里å�‘生的事情一股脑说给外人å�¬ã€‚“格斗俱ä¹�部â€�的第一æ�¡è§„则,就是ä¸�è¦�æ��到格斗俱ä¹�部。 + +当狂热分å­�质问你的观点时,最好是说自己还没想好。 + +人们会误认为自己æ€�想开放,但是他们心里早就有一根界é™�,认为什么是正确的什么是错误的。 + +更深入的认识自己。 +> 儿童精疲力竭时,å�¯èƒ½ä¼šå¤§å�‘脾气,因为他ä¸�知é�“为了什么;æˆ�年人则会了解是个人的身体状况问题,与外界无关,说一å�¥â€œæ²¡å…³ç³»ï¼Œæˆ‘å�ªæ˜¯ç´¯äº†â€�。 + +# å�¦ä¸€æ�¡è·¯ + +互è�”网软件的优点 + +1. ä¸�需è¦�用户æ�¥ç®¡ç�†ç³»ç»Ÿï¼Œå› æ­¤ä¸�需è¦�专门的计算机知识,使用æµ�览器å�³å�¯ä½¿ç”¨ï¼› +2. 需è¦�的硬件资æº�很少,å�ªéœ€è¦�能è¿�行æµ�览器并且è�”网的设备就行; +3. 更方便,éš�æ—¶éš�地就å�¯ä»¥ä½¿ç”¨ï¼› +4. ä¸�用担心数æ�®ä¸¢å¤±ï¼Œå› ä¸ºæ•°æ�®ä¿�存在云端; +5. 易于对软件进行å�‡çº§ï¼Œè€Œç”¨æˆ·å�¯ä»¥åœ¨å®Œå…¨ä¸�知情的情况下继续使用; +6. 更容易的 bug å�‘现,更快的 bug 修改; +7. 有专门的技术人员管ç�†æœ�务器,因为更加安全; + + +bug 越快å�‘现越好,而互è�”网软件因为å�‘布周期短,用户å��馈快,因此 bug 的å�‘现也更快。 + +高级用户很ä¹�æ„�帮助寻找 bug。 +> 因为软件å�‘布以å�Žï¼Œå¤§å¤šæ•°Â bug 都是罕è§�情况下æ‰�会å�‘生的个案,å�—到影å“�的用户往往都是高级使用者,他们喜欢试验那些ä¸�常用的ã€�难度大的æ“�作。高级使用者对 bug 的容å¿�度比较高,尤其如果这些 bug 是在开å�‘新功能的过程中引入的,而这些新功能å�ˆæ­£æ˜¯ä»–们所需è¦�的,他们就更能ç�†è§£äº†ã€‚事实上,因为 bug ä¸�多,你å�ªæœ‰ç»�过一些å¤�æ�‚的过程以å�Žæ‰�会é�‡åˆ°å®ƒä»¬ï¼Œæ‰€ä»¥é«˜çº§ä½¿ç”¨è€…往往因为å�‘现了 bug 感到很得æ„�。他们打电è¯�给客æœ�时,多å�Šæ˜¯ä¸€å‰¯èƒœåˆ©è€…çš„å�£å�»ï¼Œè€Œä¸�是怒气冲冲的样å­�,好åƒ�他们击败我们得分了一样。 + +好的技术支æŒ�是:客æœ�人员和技术人员离得很近,并且当场修å¤� bug。 + +一个好的想法在实现过程中能引起更多想法,因此尽早去实现它比将它æ�Ÿä¹‹é«˜é˜�能够带æ�¥æ›´å¤šå¥½å¤„。 + +ä¸�会购买软件的用户使用了盗版软件能够让软件更具有市场影å“�力。 +> 一定数é‡�的盗版对软件公å�¸æ˜¯æœ‰å¥½å¤„的。ä¸�管你的软件定价多少,有些用户永远都ä¸�会购买。如果这样的用户使用盗版,你并没有任何æ�Ÿå¤±ã€‚事实上,你å��而赚到了,因为你的软件现在多了一个用户,市场影å“�力就更大了一些,而这个用户å�¯èƒ½æ¯•业以å�Žå°±ä¼šå‡ºé’±è´­ä¹°ä½ çš„软件。 + +# 设计与研究 + +设计追求的是好,而研究追求的是新。 + +用户è¦�求和用户需求有区别,用户å�¯èƒ½å¹¶ä¸�了解自己è¦�什么,所以用户è¦�求的内容往往ä¸�是用户真正需求的东西。 + +艺术设计与人为本,而科学研究追求简æ´�正确。比如数学家ä¸�会为了让读者更容易懂而采用一ç§�更麻烦的è¯�明,而是会选择最直接简æ´�çš„è¯�明。编程语言也是与人为本的,因此编程语言也是通过设计产生的。 + +大ç�†çŸ³å�šå‡ºçš„东西漂亮,但是制作过程å�´å¾ˆéš¾ï¼Œæ— æ³•ä¸�断的进行雕ç�¢ã€‚编程语言也需è¦�è¿™ç§�雕ç�¢è¿‡ç¨‹ï¼Œå¦‚果一ç§�编程语言åƒ�大ç�†çŸ³ä¸€æ ·ï¼Œå�ªæ˜¯ç»“果好看,那么它就ä¸�是一ç§�好的编程语言。 + +设计软件应当尽快拿出原型æ�¥ã€‚å°±åƒ�画画一样,是先用几根线画出一个大致准确的轮廓,然å�Žå†�é€�步加工。 +> 还有å�¦ä¸€ç§�软件设计æ€�想,也许å�¯ä»¥è¢«ç§°ä¸ºâ€œåœ£æ¯�玛丽亚â€�模å¼�。它ä¸�è¦�求尽快拿出原型,然å�Žå†�é€�步优化,它的观点是你应该等到完整的æˆ�å“�出æ�¥ä»¥å�Žå†�一下å­�隆é‡�地推å�‘市场,就åƒ�圣æ¯�玛丽亚é™�临一样,哪怕整个过程漫长得åƒ�橄榄ç�ƒè¿�动员长途奔袭也没有关系。在互è�”网泡沫时期,无数创业公å�¸å› ä¸ºç›¸ä¿¡äº†è¿™ç§�模å¼�而自æ¯�å‰�程。 + +如果觉得å�šæŸ�件事很ä¹�味,那么å�šå‡ºæ�¥çš„东西就会很ä¹�味。快速的原型能够让程åº�员有更高的士气,从而让他们更有兴趣去实现。也å�¯ä»¥ç�†è§£ä¸ºå¿«é€Ÿå��馈很é‡�è¦�。 diff --git a/notes/算法.md b/notes/算法.md index f738b9c8..a69d2ddb 100644 --- a/notes/算法.md +++ b/notes/算法.md @@ -1,100 +1,100 @@ -* [»ù´¡](#»ù´¡) - * [Õ»](#Õ») - * [1. Êý×éʵÏÖ](#1-Êý×éʵÏÖ) - * [2. Á´±íʵÏÖ](#2-Á´±íʵÏÖ) - * [¶ÓÁÐ](#¶ÓÁÐ) - * [Ëã·¨·ÖÎö](#Ëã·¨·ÖÎö) - * [1. º¯Êýת»»](#1-º¯Êýת»») - * [2. ÊýѧģÐÍ](#2-ÊýѧģÐÍ) +* [????](#????) + * [?](#?) + * [1. ???????](#1-???????) + * [2. ???????](#2-???????) + * [????](#????) + * [??????](#??????) + * [1. ???????](#1-???????) + * [2. ??????](#2-??????) * [3. ThreeSum](#3-threesum) - * [4. ±¶ÂÊʵÑé](#4-±¶ÂÊʵÑé) - * [5. ×¢ÒâÊÂÏî](#5-×¢ÒâÊÂÏî) + * [4. ???????](#4-???????) + * [5. ???????](#5-???????) * [union-find](#union-find) - * [1. quick-find Ëã·¨](#1-quick-find-Ëã·¨) - * [2. quick-union Ëã·¨](#2-quick-union-Ëã·¨) - * [3. ¼ÓȨ quick-union Ëã·¨](#3-¼ÓȨ-quick-union-Ëã·¨) - * [4. ·¾¶Ñ¹ËõµÄ¼ÓȨ quick-union Ëã·¨](#4-·¾¶Ñ¹ËõµÄ¼ÓȨ-quick-union-Ëã·¨) - * [5. ¸÷ÖÖ union-find Ëã·¨µÄ±È½Ï](#5-¸÷ÖÖ-union-find-Ëã·¨µÄ±È½Ï) -* [µÚ¶þÕ ÅÅÐò](#µÚ¶þÕÂ-ÅÅÐò) - * [³õ¼¶ÅÅÐòËã·¨](#³õ¼¶ÅÅÐòËã·¨) - * [1. Ô¼¶¨](#1-Ô¼¶¨) - * [2. Ñ¡ÔñÅÅÐò](#2-Ñ¡ÔñÅÅÐò) - * [3. ²åÈëÅÅÐò](#3-²åÈëÅÅÐò) - * [4. Ñ¡ÔñÅÅÐòºÍ²åÈëÅÅÐòµÄ±È½Ï](#4-Ñ¡ÔñÅÅÐòºÍ²åÈëÅÅÐòµÄ±È½Ï) - * [5. Ï£¶ûÅÅÐò](#5-Ï£¶ûÅÅÐò) - * [¹é²¢ÅÅÐò](#¹é²¢ÅÅÐò) - * [1. ¹é²¢·½·¨](#1-¹é²¢·½·¨) - * [2. ×Ô¶¥ÏòϹ鲢ÅÅÐò](#2-×Ô¶¥ÏòϹ鲢ÅÅÐò) - * [3. ×Ôµ×ÏòÉϹ鲢ÅÅÐò](#3-×Ôµ×ÏòÉϹ鲢ÅÅÐò) - * [¿ìËÙÅÅÐò](#¿ìËÙÅÅÐò) - * [1. »ù±¾Ëã·¨](#1-»ù±¾Ëã·¨) - * [2. ÇзÖ](#2-ÇзÖ) - * [3. ÐÔÄÜ·ÖÎö](#3-ÐÔÄÜ·ÖÎö) - * [4. Ëã·¨¸Ä½ø](#4-Ëã·¨¸Ä½ø) - * [4.1 Çл»µ½²åÈëÅÅÐò](#41-Çл»µ½²åÈëÅÅÐò) - * [4.2 ÈýÈ¡Ñù](#42-ÈýÈ¡Ñù) - * [4.3 ÈýÏòÇзÖ](#43-ÈýÏòÇзÖ) - * [ÓÅÏȶÓÁÐ](#ÓÅÏȶÓÁÐ) - * [1. ¶Ñ](#1-¶Ñ) - * [2. Éϸ¡ºÍϳÁ](#2-Éϸ¡ºÍϳÁ) - * [3. ²åÈëÔªËØ](#3-²åÈëÔªËØ) - * [4. ɾ³ý×î´óÔªËØ](#4-ɾ³ý×î´óÔªËØ) - * [5. ¶ÑÅÅÐò](#5-¶ÑÅÅÐò) - * [6. ·ÖÎö](#6-·ÖÎö) - * [Ó¦ÓÃ](#Ó¦ÓÃ) - * [1. ÅÅÐòËã·¨µÄ±È½Ï](#1-ÅÅÐòËã·¨µÄ±È½Ï) - * [2. Java µÄÅÅÐòË㷨ʵÏÖ](#2-java-µÄÅÅÐòË㷨ʵÏÖ) - * [3. »ùÓÚÇзֵĿìËÙÑ¡ÔñËã·¨](#3-»ùÓÚÇзֵĿìËÙÑ¡ÔñËã·¨) -* [µÚÈýÕ ²éÕÒ](#µÚÈýÕÂ-²éÕÒ) - * [·ûºÅ±í](#·ûºÅ±í) + * [1. quick-find ??](#1-quick-find-??) + * [2. quick-union ??](#2-quick-union-??) + * [3. ??? quick-union ??](#3-???-quick-union-??) + * [4. ¡¤????????? quick-union ??](#4-¡¤?????????-quick-union-??) + * [5. ???? union-find ??????](#5-????-union-find-??????) +* [????? ????](#?????-????) + * [??????????](#??????????) + * [1. ???](#1-???) + * [2. ???????](#2-???????) + * [3. ????????](#3-????????) + * [4. ??????????????????](#4-??????????????????) + * [5. ???????](#5-???????) + * [?öã????](#?öã????) + * [1. ?öã????](#1-?öã????) + * [2. ???????öã????](#2-???????öã????) + * [3. ???????öã????](#3-???????öã????) + * [????????](#????????) + * [1. ??????](#1-??????) + * [2. ?§Ù?](#2-?§Ù?) + * [3. ???????](#3-???????) + * [4. ?????](#4-?????) + * [4.1 ?§Ý???????????](#41-?§Ý???????????) + * [4.2 ?????](#42-?????) + * [4.3 ?????§Ù?](#43-?????§Ù?) + * [???????](#???????) + * [1. ??](#1-??) + * [2. ????????](#2-????????) + * [3. ???????](#3-???????) + * [4. ?????????](#4-?????????) + * [5. ??????](#5-??????) + * [6. ????](#6-????) + * [???](#???) + * [1. ??????????](#1-??????????) + * [2. Java ???????????](#2-java-???????????) + * [3. ?????§Ù??????????](#3-?????§Ù??????????) +* [?????? ????](#??????-????) + * [?????](#?????) * [1. API](#1-api) - * [2. ÓÐÐò·ûºÅ±í](#2-ÓÐÐò·ûºÅ±í) - * [3. ÎÞÐòÁ´±íʵÏÖ](#3-ÎÞÐòÁ´±íʵÏÖ) - * [4. ÓÐÐòÊý×éµÄ¶þ·Ö²éÕÒ](#4-ÓÐÐòÊý×éµÄ¶þ·Ö²éÕÒ) - * [5. ¶Ô¶þ·Ö²éÕҵķÖÎö](#5-¶Ô¶þ·Ö²éÕҵķÖÎö) - * [¶þ²æ²éÕÒÊ÷](#¶þ²æ²éÕÒÊ÷) + * [2. ????????](#2-????????) + * [3. ???????????](#3-???????????) + * [4. ???????????????](#4-???????????????) + * [5. ????????????](#5-????????????) + * [?????????](#?????????) * [1. get()](#1-get) * [2. put()](#2-put) - * [3. ·ÖÎö](#3-·ÖÎö) + * [3. ????](#3-????) * [4. floor()](#4-floor) * [5. rank()](#5-rank) * [6. min()](#6-min) * [7. deleteMin()](#7-deletemin) * [8. delete()](#8-delete) * [9. keys()](#9-keys) - * [10. ÐÔÄÜ·ÖÎö](#10-ÐÔÄÜ·ÖÎö) - * [ƽºâ²éÕÒÊ÷](#ƽºâ²éÕÒÊ÷) - * [2-3 ²éÕÒÊ÷](#2-3-²éÕÒÊ÷) - * [1. ²åÈë²Ù×÷](#1-²åÈë²Ù×÷) - * [2. ÐÔÖÊ](#2-ÐÔÖÊ) - * [ºìºÚ¶þ²æ²éÕÒÊ÷](#ºìºÚ¶þ²æ²éÕÒÊ÷) - * [1. ×óÐýת](#1-×óÐýת) - * [2. ÓÒÐýת](#2-ÓÒÐýת) - * [3. ÑÕɫת»»](#3-ÑÕɫת»») - * [4. ²åÈë](#4-²åÈë) - * [5. ɾ³ý×îС¼ü](#5-ɾ³ý×îС¼ü) - * [6. ·ÖÎö](#6-·ÖÎö) - * [É¢Áбí](#É¢Áбí) - * [É¢Áк¯Êý](#É¢Áк¯Êý) - * [»ùÓÚÀ­Á´·¨µÄÉ¢Áбí](#»ùÓÚÀ­Á´·¨µÄÉ¢Áбí) - * [»ùÓÚÏßÐÔ̽²â·¨µÄÉ¢Áбí](#»ùÓÚÏßÐÔ̽²â·¨µÄÉ¢Áбí) - * [²éÕÒ](#²éÕÒ) - * [²åÈë](#²åÈë) - * [ɾ³ý](#ɾ³ý) - * [µ÷ÕûÊý×é´óС](#µ÷ÕûÊý×é´óС) - * [Ó¦ÓÃ](#Ó¦ÓÃ) - * [¸÷ÖÖ·ûºÅ±íʵÏֵıȽÏ](#¸÷ÖÖ·ûºÅ±íʵÏֵıȽÏ) - * [Java µÄ·ûºÅ±íʵÏÖ](#java-µÄ·ûºÅ±íʵÏÖ) - * [¼¯ºÏÀàÐÍ](#¼¯ºÏÀàÐÍ) - * [Ï¡ÊèÏòÁ¿³Ë·¨](#Ï¡ÊèÏòÁ¿³Ë·¨) + * [10. ???????](#10-???????) + * [????????](#????????) + * [2-3 ??????](#2-3-??????) + * [1. ???????](#1-???????) + * [2. ????](#2-????) + * [???????????](#???????????) + * [1. ?????](#1-?????) + * [2. ?????](#2-?????) + * [3. ??????](#3-??????) + * [4. ????](#4-????) + * [5. ?????§³??](#5-?????§ã??) + * [6. ????](#6-????) + * [??§Ò?](#??§Ò?) + * [??§Ü???](#??§Ü???) + * [??????????????§Ò?](#??????????????§Ò?) + * [???????????????§Ò?](#???????????????§Ò?) + * [????](#????) + * [????](#????) + * [???](#???) + * [?????????§³](#?????????§ã) + * [???](#???) + * [??????????????](#??????????????) + * [Java ?????????](#java-?????????) + * [????????](#????????) + * [??????????](#??????????) -# »ù´¡ +# ???? -## Õ» +## ? -### 1. Êý×éʵÏÖ +### 1. ??????? ```java @@ -117,7 +117,7 @@ public class ResizeArrayStack implements Iterable { return item; } - // µ÷ÕûÊý×é´óС£¬Ê¹µÃÕ»¾ßÓÐÉìËõÐÔ + // ?????????§³???????????????? private void resize(int size) { Item[] tmp = (Item[]) new Object[size]; for (int i = 0; i < N; i++) { @@ -136,7 +136,7 @@ public class ResizeArrayStack implements Iterable { @Override public Iterator iterator() { - // ÐèÒª·µ»ØÄæÐò±éÀúµÄµü´úÆ÷ + // ????????????????????? return new ReverseArrayIterator(); } @@ -156,15 +156,15 @@ public class ResizeArrayStack implements Iterable { } ``` -ÉÏÃæÊµÏÖʹÓÃÁË·ºÐÍ£¬Java ²»ÄÜÖ±½Ó´´½¨·ºÐÍÊý×飬ֻÄÜʹÓÃתÐÍÀ´´´½¨¡£ +????????????????Java ?????????????????ï…????????????????? ```java Item[] arr = (Item[]) new Object[N]; ``` -### 2. Á´±íʵÏÖ +### 2. ??????? -ÐèҪʹÓÃÁ´±íµÄÍ·²å·¨À´ÊµÏÖ£¬ÒòΪͷ²å·¨ÖÐ×îºóѹÈëÕ»µÄÔªËØÔÚÁ´±íµÄ¿ªÍ·£¬ËüµÄ next Ö¸ÕëÖ¸Ïòǰһ¸öѹÈëÕ»µÄÔªËØ£¬ÔÚµ¯³öÔªËØÊ¹¾Í¿ÉÒÔÈÃǰһ¸öѹÈëÕ»µÄÔªËØ³ÆÎªÕ»¶¥ÔªËØ¡£ +?????????????¾Þ???????????¾Þ????????????????????????????? next ?????????????????????????????????????????????????????????? ```java public class Stack { @@ -202,11 +202,11 @@ public class Stack { } ``` -## ¶ÓÁÐ +## ???? -ÏÂÃæÊǶÓÁеÄÁ´±íʵÏÖ£¬ÐèҪά»¤ first ºÍ last ½ÚµãÖ¸Õ룬·Ö±ðÖ¸Ïò¶ÓÊ׺ͶÓβ¡£ +????????§Ö??????????????? first ?? last ?????????????????¦Â?? -ÕâÀïÐèÒª¿¼ÂÇÈÃÄĸöÖ¸ÕëÖ¸ÕëÁ´±íÍ·²¿½Úµã£¬ÄĸöÖ¸ÕëÖ¸ÏòÁ´±íβ²¿½Úµã¡£ÒòΪ³ö¶ÓÁвÙ×÷ÐèÒªÈöÓÊ×ÔªËØµÄÏÂÒ»¸öÔªËØ³ÉΪ¶ÓÊ×£¬¾ÍÐèÒªÈÝÒ×»ñÈ¡ÏÂÒ»¸öÔªËØ£¬¶øÁ´±íµÄÍ·²¿½ÚµãµÄ next Ö¸ÕëÖ¸ÏòÏÂÒ»¸öÔªËØ£¬Òò´ËÈöÓÊ×Ö¸Õë first Ö¸ÕëÁ´±íµÄ¿ªÍ·¡£ +?????????????????????????????????????????????¦Â?????????????§Ó???????????????????????????????????????????????????????????????? next ?????????????????????????? first ???????????? ```java public class Queue { @@ -226,7 +226,7 @@ public class Queue { return N; } - // Èë¶ÓÁÐ + // ????? public void enqueue(Item item){ Node newNode = new Node(); newNode.item = item; @@ -241,7 +241,7 @@ public class Queue { N++; } - // ³ö¶ÓÁÐ + // ?????? public Item dequeue(){ Node node = first; first = first.next; @@ -251,41 +251,41 @@ public class Queue { } ``` -## Ëã·¨·ÖÎö +## ?????? -### 1. º¯Êýת»» +### 1. ??????? -Ö¸Êýº¯Êý¿ÉÒÔת»»ÎªÏßÐÔº¯Êý£¬´Ó¶øÔÚº¯ÊýͼÏñÉÏÏÔʾµÄ¸üÖ±¹Û¡£ +??????????????????????????????????????????????? -T(N)=aN3 ת»»Îª lg(T(N))=3lgN+lga +T(N)=aN3 ???? lg(T(N))=3lgN+lga ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/5510045a-8f32-487f-a756-463e51a6dab0.png) -### 2. ÊýѧģÐÍ +### 2. ?????? -**½üËÆ** +**????** -ʹÓà \~f(N) À´±íʾËùÓÐËæ×Å N µÄÔö´ó³ýÒÔ f(N) µÄ½á¹ûÇ÷½üÓÚ 1 µÄº¯Êý , ÀýÈç N3/6-N2/2+N/3 \~ N3/6¡£ +??? \~f(N) ????????????? N ????????? f(N) ?????????? 1 ????? , ???? N3/6-N2/2+N/3 \~ N3/6?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ca3a793e-06e5-4ff3-b28e-a9c20540d164.png) -**Ôö³¤ÊýÁ¿¼¶** +**??????????** -Ôö³¤ÊýÁ¿¼¶½«Ëã·¨ÓëËüµÄʵÏÖ¸ôÀ뿪À´£¬Ò»¸öËã·¨µÄÔö³¤ÊýÁ¿¼¶Îª N3 ÓëËüÊÇ·ñÓà Java ʵÏÖ£¬ÊÇ·ñÔËÐÐÓëÌØ¶¨¼ÆËã»úÉÏÎ޹ء£ +???????????????????????????????????????????????? N3 ????????? Java ??????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1ea4dc9a-c4dd-46b5-bb11-49f98d57ded1.png) -**ÄÚÑ­»·** +**?????** -Ö´ÐÐ×îÆµ·±µÄÖ¸Áî¾ö¶¨Á˳ÌÐòÖ´ÐеÄ×Üʱ¼ä£¬°ÑÕâЩָÁî³ÆÎª³ÌÐòµÄÄÚÑ­»·¡£ +???????????????????????§Ö??????????§»????????????????? -**³É±¾Ä£ÐÍ** +**??????** -ʹÓóɱ¾Ä£ÐÍÀ´ÆÀ¹ÀËã·¨£¬ÀýÈçÊý×éµÄ·ÃÎÊ´ÎÊý¾ÍÊÇÒ»Öֳɱ¾Ä£ÐÍ¡£ +??¨®??????????????????????????????????????????? ### 3. ThreeSum -ThreeSum ³ÌÐòÓÃÓÚͳ¼ÆÒ»¸öÊý×éÖÐÈýÔª×éµÄºÍΪ 0 µÄÊýÁ¿¡£ +ThreeSum ???????????????????????????? 0 ???????? ```java public class ThreeSum { @@ -306,13 +306,13 @@ public class ThreeSum { } ``` -¸Ã³ÌÐòµÄÄÚÑ­»·Îª if (a[i] + a[j] + a[k] == 0) Óï¾ä£¬×ܹ²Ö´ÐеĴÎÊýΪ N3/6-N2/2+N/3£¬Òò´ËËüµÄ½üËÆÖ´ÐдÎÊýΪ \~N3/6£¬Ôö³¤ÊýÁ¿¼¶Îª N3¡£ +?¨®?????????? if (a[i] + a[j] + a[k] == 0) ????????§Ö????? N3/6-N2/2+N/3??????????????§Õ???? \~N3/6????????????? N3?? -**¸Ä½ø** +**???** -ͨ¹ý½«Êý×éÏÈÅÅÐò£¬¶ÔÁ½¸öÔªËØÇóºÍ£¬²¢Óöþ·Ö²éÕÒ·½·¨²éÕÒÊÇ·ñ´æÔڸú͵ÄÏà·´Êý£¬Èç¹û´æÔÚ£¬¾Í˵Ã÷´æÔÚÈýÔª×éµÄºÍΪ 0¡£ +??????????????????????????????????????????????????¨²????????????????????????????????? 0?? -¸Ã·½·¨¿ÉÒÔ½« ThreeSum Ëã·¨Ôö³¤ÊýÁ¿¼¶½µµÍΪ N2logN¡£ +?¡Â???????? ThreeSum ????????????????? N2logN?? ```java public class ThreeSumFast { @@ -323,7 +323,7 @@ public class ThreeSumFast { for (int i = 0; i < N; i++) { for (int j = i + 1; j < N; j++) { for (int k = j + 1; k < N; k++) { - // rank() ·½·¨·µ»ØÔªËØÔÚÊý×éÖеÄϱ꣬Èç¹ûÔªËØ²»´æÔÚ£¬ÕâÀï»á·µ»Ø -1¡£Ó¦¸Ã×¢ÒâÕâÀïµÄÏÂ±ê±ØÐë´óÓÚ j£¬ÕâÑù¾Í²»»áÖØ¸´Í³¼ÆÁË¡£ + // rank() ??????????????????§Ö??¡À???????????????????? -1??????????????¡À??????? j???????????????????? if (BinarySearch.rank(-a[i] - a[j], a) > j) { cnt++; } @@ -335,41 +335,41 @@ public class ThreeSumFast { } ``` -### 4. ±¶ÂÊʵÑé +### 4. ??????? -Èç¹û T(N) \~ aNblgN£¬ÄÇô T(2N)/T(N) \~ 2b£¬ÀýÈç¶ÔÓÚ±©Á¦·½·¨µÄ ThreeSum Ëã·¨£¬½üËÆÊ±¼äΪ \~N3/6£¬¶ÔËü½øÐб¶ÂÊʵÑéµÃµ½ÈçϽá¹û£º +??? T(N) \~ aNblgN????? T(2N)/T(N) \~ 2b?????????????????? ThreeSum ???????????? \~N3/6?????????§Ò???????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/6f5ed46f-86d7-4852-a34f-c1cf1b6343a0.png) -¿É¼û T(2N)/T(N)\~23£¬Ò²¾ÍÊÇ b Ϊ 3¡£ +??? T(2N)/T(N)\~23??????? b ? 3?? -### 5. ×¢ÒâÊÂÏî +### 5. ??????? -**´ó³£Êý** +**????** -ÔÚÇó½üËÆÊ±£¬Èç¹ûµÍ¼¶ÏîµÄ³£ÊýϵÊýºÜ´ó£¬ÄÇô½üËÆµÄ½á¹û¾ÍÊÇ´íÎóµÄ¡£ +??????????????????????????????????????????????? -**»º´æ** +**????** -¼ÆËã»úϵͳ»áʹÓûº´æ¼¼ÊõÀ´×éÖ¯Äڴ棬·ÃÎÊÊý×éÏàÁÚµÄÔªËØ»á±È·ÃÎʲ»ÏàÁÚµÄÔªËØ¿ìºÜ¶à¡£ +??????????????�y?????????—¨????????????????????????????????? -**¶Ô×Çé¿öϵÄÐÔÄܵı£Ö¤** +**?????????????????** -Ôں˷´Ó¦¶Ñ¡¢ÐÄÔàÆð²«Æ÷»òÕßɲ³µ¿ØÖÆÆ÷ÖеÄÈí¼þ£¬×Çé¿öϵÄÐÔÄÜÊÇÊ®·ÖÖØÒªµÄ¡£ +??????????????????????????????§Ö????????????????????????????? -**Ëæ»ú»¯Ëã·¨** +**???????** -ͨ¹ý´òÂÒÊäÈ룬ȥ³ýËã·¨¶ÔÊäÈëµÄÒÀÀµ¡£ +????????????????????????????? -**¾ù̯·ÖÎö** +**???????** -½«ËùÓвÙ×÷µÄ×ܳɱ¾ËùÒÔ²Ù×÷×ÜÊýÀ´½«³É±¾¾ù̯¡£ÀýÈç¶ÔÒ»¸ö¿ÕÕ»½øÐÐ N ´ÎÁ¬ÐøµÄ push() µ÷ÓÃÐèÒª·ÃÎÊÊý×éµÄÔªËØÎª N+4+8+16+...+2N=5N-4£¨N ÊÇÏòÊý×éдÈëÔªËØ£¬ÆäÓàµÄ¶¼Êǵ÷ÕûÊý×é´óСʱ½øÐи´ÖÆÐèÒªµÄ·ÃÎÊÊý×é²Ù×÷£©£¬¾ù̯ºóÿ´Î²Ù×÷·ÃÎÊÊý×éµÄƽ¾ù´ÎÊýΪ³£Êý¡£ +?????§Ó??????????????????????????????????????????????? N ???????? push() ???????????????????? N+4+8+16+...+2N=5N-4??N ????????§Õ??????????????????????§³????§Ú?????????????????????????????¦Â?????????????????????????? ## union-find -**¸ÅÀÀ** +**????** -ÓÃÓÚ½â¾ö¶¯Ì¬Á¬Í¨ÐÔÎÊÌ⣬Äܶ¯Ì¬Á¬½ÓÁ½¸öµã£¬²¢ÇÒÅжÏÁ½¸öµãÊÇ·ñÁ¬½Ó¡£ +?????????????????????????????????????§Ø??????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/5d387d02-6f96-44d6-b5d0-4538349f868e.png) @@ -377,11 +377,11 @@ public class ThreeSumFast { ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a9b91b7d-65d7-4aa3-8ef6-21876b05ad16.png) -**»ù±¾Êý¾Ý½á¹¹** +**?????????** ```java public class UF { - // ʹÓà id Êý×éÀ´±£´æµãµÄÁ¬Í¨ÐÅÏ¢ + // ??? id ?????????????????? private int[] id; public UF(int N) { @@ -397,11 +397,11 @@ public class UF { } ``` -### 1. quick-find Ëã·¨ +### 1. quick-find ?? -±£Ö¤ÔÚͬһÁ¬Í¨·ÖÁ¿µÄËùÓд¥µãµÄ id ÖµÏàµÈ¡£ +???????????????????§Õ???? id ????? -ÕâÖÖ·½·¨¿ÉÒÔ¿ìËÙÈ¡µÃÒ»¸ö´¥µãµÄ id Öµ£¬²¢ÇÒÅжÏÁ½¸ö´¥µãÊÇ·ñÁ¬Í¨£¬µ«ÊÇ union µÄ²Ù×÷´ú¼ÛÈ´ºÜ¸ß£¬ÐèÒª½«ÆäÖÐÒ»¸öÁ¬Í¨·ÖÁ¿ÖеÄËùÓнڵã id Öµ¶¼ÐÞ¸ÄΪÁíÒ»¸ö½ÚµãµÄ id Öµ¡£ +????????????????????????? id ????????§Ø????????????????????? union ??????????????????????????????????§Ö????§ß?? id ???????????????? id ??? ```java public int find(int p) { @@ -418,9 +418,9 @@ public class UF { } ``` -### 2. quick-union Ëã·¨ +### 2. quick-union ?? -ÔÚ union ʱֻ½«´¥µãµÄ id ÖµÖ¸ÏòÁíÒ»¸ö´¥µã id Öµ£¬²»Ö±½ÓÓà id À´´æ´¢ËùÊôµÄÁ¬Í¨·ÖÁ¿¡£ÕâÑù¾Í¹¹³ÉÒ»¸öµ¹ÖõÄÊ÷Ðνṹ£¬¸ù½ÚµãÐèÒªÖ¸Ïò×Ô¼º¡£ÔÚ½øÐвéÕÒÒ»¸ö½ÚµãËùÊôµÄÁ¬Í¨·ÖÁ¿Ê±£¬ÒªÒ»Ö±ÏòÉϲéÕÒÖ±µ½¸ù½Úµã£¬²¢Ê¹Óøù½ÚµãµÄ id Öµ×÷Ϊ±¾Á¬Í¨·ÖÁ¿µÄ idÖµ¡£ +?? union ????????? id ????????????? id ?????????? id ???›¥???????????????????????????????????¦Í???????????????????????§Ó????????????????????????????????????????????????????? id ??????????????? id??? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/9192dc0a-a7cd-4030-8df6-e388600644cf.jpg) @@ -438,22 +438,22 @@ public class UF { } ``` -ÕâÖÖ·½·¨¿ÉÒÔ¿ìËÙ½øÐÐ union ²Ù×÷£¬µ«ÊÇ find ²Ù×÷ºÍÊ÷¸ß³ÉÕý±È£¬×µÄÇé¿öÏÂÊ÷µÄ¸ß¶ÈΪ´¥µãµÄÊýÄ¿¡£ +????????????????? union ?????????? find ?????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/d206d090-d911-4263-a1fe-d6f63f5d1776.png) -### 3. ¼ÓȨ quick-union Ëã·¨ +### 3. ??? quick-union ?? -ΪÁ˽â¾ö quick-union µÄÊ÷ͨ³£»áºÜ¸ßµÄÎÊÌ⣬¼ÓȨ quick-union ÔÚ union ²Ù×÷ʱ»áÈýÏСµÄÊ÷Á¬½Ó½Ï´óµÄÊ÷ÉÏÃæ¡£ +????? quick-union ??????????????????? quick-union ?? union ??????????§³????????????????µµ -ÀíÂÛÑо¿Ö¤Ã÷£¬¼ÓȨ quick-union Ëã·¨¹¹ÔìµÄÊ÷Éî¶È×î¶à²»³¬¹ý lgN¡£ +?????§à????????? quick-union ??????????????????? lgN?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8d6af5ac-74eb-4e07-99aa-654b9f21f1d3.jpg) ```java public class WeightedQuickUnionUF { private int[] id; - // ±£´æ½ÚµãµÄÊýÁ¿ÐÅÏ¢ + // ?????????????? private int[] sz; public WeightedQuickUnionUF(int N) { @@ -489,25 +489,25 @@ public class WeightedQuickUnionUF { } ``` -### 4. ·¾¶Ñ¹ËõµÄ¼ÓȨ quick-union Ëã·¨ +### 4. ¡¤????????? quick-union ?? -ÔÚ¼ì²é½ÚµãµÄͬʱ½«ËüÃÇÖ±½ÓÁ´½Óµ½¸ù½Úµã£¬Ö»ÐèÒªÔÚ find ÖÐÌí¼ÓÒ»¸öÑ­»·¼´¿É¡£ +?????????????????????????????????? find ??????????????¨À? -### 5. ¸÷ÖÖ union-find Ëã·¨µÄ±È½Ï +### 5. ???? union-find ?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/e5baeb38-0ec9-4ad7-8374-1cdb0dba74a6.jpg) -# µÚ¶þÕ ÅÅÐò +# ????? ???? -## ³õ¼¶ÅÅÐòËã·¨ +## ?????????? -### 1. Ô¼¶¨ +### 1. ??? -´ýÅÅÐòµÄÔªËØÐèҪʵÏÖ Java µÄ Comparable ½Ó¿Ú£¬¸Ã½Ó¿ÚÓÐ compareTo() ·½·¨¡£ +???????????????? Java ?? Comparable ?????????? compareTo() ?????? -Ñо¿ÅÅÐòËã·¨µÄ³É±¾Ä£ÐÍʱ£¬¼ÆËãµÄÊDZȽϺͽ»»»µÄ´ÎÊý¡£ +?§à????????????????????????????????????? -ʹÓø¨Öúº¯Êý less() ºÍ exch() À´½øÐбȽϺͽ»»»µÄ²Ù×÷£¬Ê¹µÃ´úÂëµÄ¿É¶ÁÐԺͿÉÒÆÖ²ÐÔ¸üºÃ¡£ +?????????? less() ?? exch() ?????§Ò?????????????????????????????????¨¢? ```java private static boolean less(Comparable v, Comparable w){ @@ -521,9 +521,9 @@ private void exch(Comparable[] a, int i, int j){ } ``` -### 2. Ñ¡ÔñÅÅÐò +### 2. ??????? -ÕÒµ½Êý×éÖеÄ×îÐ¡ÔªËØ£¬È»ºó½«ËüÓëÊý×éµÄµÚÒ»¸öÔªËØ½»»»Î»Öá£È»ºóÔÙ´ÓʣϵÄÔªËØÖÐÕÒµ½×îСµÄÔªËØ£¬½«ËüÓëÊý×éµÄµÚ¶þ¸öÔªËØ½»»»Î»Öᣲ»¶Ï½øÐÐÕâÑùµÄ²Ù×÷£¬Ö±µ½½«Õû¸öÊý×éÅÅÐò¡£ +????????§Ö???§³??????????????????????????¦Ë?¨¢?????????????????????§³???????????????????????????¦Ë?¨¢???????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/222768a7-914f-4d64-b874-d98f3b926fb6.jpg) @@ -542,11 +542,11 @@ public class Selection { } ``` -Ñ¡ÔñÅÅÐòÐèÒª \~N2/2 ´Î±È½ÏºÍ \~N ´Î½»»»£¬ËüµÄÔËÐÐʱ¼äÓëÊäÈëÎ޹أ¬Õâ¸öÌØµãʹµÃËü¶ÔÒ»¸öÒѾ­ÅÅÐòµÄÊý×éÒ²ÐèÒªÕâô¶àµÄ±È½ÏºÍ½»»»²Ù×÷¡£ +?????????? \~N2/2 ?¦Á??? \~N ?¦Í???????????????????????????????????????????????????????????????????????????? -### 3. ²åÈëÅÅÐò +### 3. ???????? -½«Ò»¸öÔªËØ²åÈëµ½ÒÑÅÅÐòµÄÊý×éÖУ¬Ê¹µÃ²åÈëÖ®ºóµÄÊý×éÒ²ÊÇÓÐÐòµÄ¡£²åÈëÅÅÐò´Ó×óµ½ÓÒ²åÈëÿ¸öÔªËØ£¬Ã¿´Î²åÈëÖ®ºó×󲿵Ä×ÓÊý×éÊÇÓÐÐòµÄ¡£ +???????????????????????§µ???¨°?????????????????????????????????????????????¦Â??????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/065c3bbb-3ea0-4dbf-8f26-01d0e0ba7db7.png) @@ -563,21 +563,21 @@ public class Insertion { } ``` -²åÈëÅÅÐòµÄ¸´ÔÓ¶ÈÈ¡¾öÓÚÊý×éµÄ³õʼ˳Ðò£¬Èç¹ûÊý×éÒѾ­²¿·ÖÓÐÐòÁË£¬ÄÇô²åÈëÅÅÐò»áºÜ¿ì¡£Æ½¾ùÇé¿öϲåÈëÅÅÐòÐèÒª \~N2/4 ±È½ÏÒÔ¼° \~N2/4 ´Î½»»»£¬×µÄÇé¿öÏÂÐèÒª \~N2/2 ±È½ÏÒÔ¼° \~N2/2 ´Î½»»»£¬×µÄÇé¿öÊÇÊý×éÊÇÄæÐòµÄ£»¶ø×îºÃµÄÇé¿öÏÂÐèÒª N-1 ´Î±È½ÏºÍ 0 ´Î½»»»£¬×îºÃµÄÇé¿ö¾ÍÊÇÊý×éÒѾ­ÓÐÐòÁË¡£ +????????????????????????????????????????????????????????????????????????????????? \~N2/4 ?????? \~N2/4 ?¦Í????????????????? \~N2/2 ?????? \~N2/2 ?¦Í???????????????????????????????????????? N-1 ?¦Á??? 0 ?¦Í?????????????????????????????? -²åÈëÅÅÐò¶ÔÓÚ²¿·ÖÓÐÐòÊý×éºÍС¹æÄ£Êý×éÌØ±ð¸ßЧ¡£ +???????????????????????§³???????????§¹?? -### 4. Ñ¡ÔñÅÅÐòºÍ²åÈëÅÅÐòµÄ±È½Ï +### 4. ?????????????????? -¶ÔÓÚËæ»úÅÅÐòµÄÎÞÖØ¸´Ö÷¼üµÄÊý×飬²åÈëÅÅÐòºÍÑ¡ÔñÅÅÐòµÄÔËÐÐʱ¼äÊÇÆ½·½¼¶±ðµÄ£¬Á½ÕßÖ®±ÈÊÇÒ»¸ö½ÏСµÄ³£Êý¡£ +??????????????????????????ï…?????????????????????????????????????????????????§³??????? -### 5. Ï£¶ûÅÅÐò +### 5. ??????? -¶ÔÓÚ´ó¹æÄ£µÄÊý×飬²åÈëÅÅÐòºÜÂý£¬ÒòΪËüÖ»Äܽ»»»ÏàÁÚµÄÔªËØ£¬Èç¹ûÒª°ÑÔªËØ´ÓÒ»¶ËÒÆµ½ÁíÒ»¶Ë£¬¾ÍÐèÒªºÜ¶à´Î²Ù×÷¡£ +????????????ï…???????????????????????????????????????????????????????????????¦Â????? -Ï£¶ûÅÅÐòµÄ³öÏÖ¾ÍÊÇΪÁ˸Ľø²åÈëÅÅÐòµÄÕâÖÖ¾ÖÏÞÐÔ£¬Ëüͨ¹ý½»»»²»ÏàÁÚµÄÔªËØ£¬Ê¹µÃÔªËØ¸ü¿ìµÄÒÆµ½ÕýÈ·µÄλÖÃÉÏ¡£ +????????????????????????????????????????????????????????????????????????????¦Ë????? -Ï£¶ûÅÅÐòʹÓòåÈëÅÅÐò¶Ô¼ä¸ô h µÄÐòÁнøÐÐÅÅÐò£¬Èç¹û h ºÜ´ó£¬ÄÇÃ´ÔªËØ¾ÍÄܺܿìµÄÒÆµ½ºÜÔ¶µÄµØ·½¡£Í¨¹ý²»¶Ï¼õС h£¬×îºóÁî h=1£¬¾Í¿ÉÒÔʹµÃÕû¸öÊý×éÊÇÓÐÐòµÄ¡£ +?????????¨°?????????? h ?????§ß?????????? h ???????????????????????????????????§³ h??????? h=1?????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8320bad6-3f91-4a15-8e3d-68e8f39649b5.png) @@ -601,15 +601,15 @@ public class Shell { } ``` -Ï£¶ûÅÅÐòµÄÔËÐÐʱ¼ä´ï²»µ½Æ½·½¼¶±ð£¬Ê¹ÓõÝÔöÐòÁÐ 1, 4, 13, 40, ... µÄÏ£¶ûÅÅÐòËùÐèÒªµÄ±È½Ï´ÎÊý²»»á³¬¹ý N µÄÈô¸É±¶³ËÓÚµÝÔöÐòÁеij¤¶È¡£ºóÃæ½éÉܵĸ߼¶ÅÅÐòËã·¨Ö»»á±ÈÏ£¶ûÅÅÐò¿ìÁ½±¶×óÓÒ¡£ +??????????????????????????????????? 1, 4, 13, 40, ... ??????????????????????????? N ?????????????????§Ö?????????????????????????????????????????? -## ¹é²¢ÅÅÐò +## ?öã???? -¹é²¢ÅÅÐòµÄ˼ÏëÊǽ«Êý×é·Ö³ÉÁ½²¿·Ö£¬·Ö±ð½øÐÐÅÅÐò£¬È»ºó¹é²¢ÆðÀ´¡£ +?öã?????????????????????????????????????öã?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/dcf265ad-fe35-424d-b4b7-d149cdf239f4.png) -### 1. ¹é²¢·½·¨ +### 1. ?öã???? ```java public class MergeSort { @@ -619,20 +619,20 @@ public class MergeSort { int i = lo, j = mid + 1; for (int k = lo; k <= hi; k++) { - aux[k] = a[k]; // ½«Êý¾Ý¸´ÖƵ½¸¨ÖúÊý×é + aux[k] = a[k]; // ?????????????????? } for (int k = lo; k <= hi; k++) { if (i > mid) a[k] = aux[j++]; else if (j > hi) a[k] = aux[i++]; - else if (aux[i].compareTo(a[j]) < 0) a[k] = aux[i++]; // ÏȽøÐÐÕâÒ»²½£¬±£Ö¤Îȶ¨ÐÔ + else if (aux[i].compareTo(a[j]) < 0) a[k] = aux[i++]; // ???????????????????? else a[k] = aux[j++]; } } } ``` -### 2. ×Ô¶¥ÏòϹ鲢ÅÅÐò +### 2. ???????öã???? ```java public static void sort(Comparable[] a) { @@ -653,13 +653,13 @@ public class MergeSort { ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c7665f73-c52f-4ce4-aed3-592bbd76265b.png) -ºÜÈÝÒ׿´³ö¸ÃÅÅÐòËã·¨µÄʱ¼ä¸´ÔÓ¶ÈΪ O(NlgN)¡£ +?????????????????????ÁÙ???? O(NlgN)?? -ÒòΪСÊý×éµÄµÝ¹é²Ù×÷»á¹ýÓÚÆµ·±£¬Òò´ËʹÓòåÈëÅÅÐòÀ´´¦ÀíСÊý×齫»á»ñµÃ¸ü¸ßµÄÐÔÄÜ¡£ +???§³?????????????????????????¨°?????????????§³???ýq????????????? -### 3. ×Ôµ×ÏòÉϹ鲢ÅÅÐò +### 3. ???????öã???? -Ïȹ鲢ÄÇЩ΢ÐÍÊý×飬Ȼºó³É¶Ô¹é²¢µÃµ½µÄ×ÓÊý×é¡£ +??öã??§»??????ï…?????öã??????????î• ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c7b9b4c8-83d1-4eb0-8408-ea6576a9ed90.png) @@ -675,11 +675,11 @@ public class MergeSort { } ``` -## ¿ìËÙÅÅÐò +## ???????? -### 1. »ù±¾Ëã·¨ +### 1. ?????? -¹é²¢ÅÅÐò½«Êý×é·ÖΪÁ½¸ö×ÓÊý×é·Ö±ðÅÅÐò£¬²¢½«ÓÐÐòµÄ×ÓÊý×é¹é²¢Ê¹µÃÕû¸öÊý×éÅÅÐò£»¿ìËÙÅÅÐòͨ¹ýÒ»¸öÇзÖÔªËØ½«Êý×é·ÖΪÁ½¸ö×ÓÊý×飬×ó×ÓÊý×éСÓÚµÈÓÚÇзÖÔªËØ£¬ÓÒ×ÓÊý×é´óÓÚµÈÓÚÇзÖÔªËØ£¬½«ÕâÁ½¸ö×ÓÊý×éÅÅÐòÒ²¾Í½«Õû¸öÊý×éÅÅÐòÁË¡£ +?öã????????????????????????????????????????öã?????????????????????????????§Ù????????????????????ï…????????§³??????§Ù????????????????????§Ù?????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/61b4832d-71f3-413c-84b6-237e219b9fdc.png) @@ -699,9 +699,9 @@ public class QuickSort { } ``` -### 2. ÇÐ·Ö +### 2. ?§Ù? -È¡ a[lo] ×÷ΪÇзÖÔªËØ£¬È»ºó´ÓÊý×éµÄ×ó¶ËÏòÓÒɨÃèÖ±µ½ÕÒµ½µÚÒ»¸ö´óÓÚµÈÓÚËüµÄÔªËØ£¬ÔÙ´ÓÊý×éµÄÓÒ¶ËÏò×óɨÃèÕÒµ½µÚÒ»¸öСÓÚµÈÓÚËüµÄÔªËØ£¬½»»»ÕâÁ½¸öÔªËØ£¬²¢²»¶Ï¼ÌÐøÕâ¸ö¹ý³Ì£¬¾Í¿ÉÒÔ±£Ö¤×óÖ¸ÕëµÄ×ó²àÔªËØ¶¼²»´óÓÚÇзÖÔªËØ£¬ÓÒÖ¸Õë j µÄÓÒ²àÔªËØ¶¼²»Ð¡ÓÚÇзÖÔªËØ¡£µ±Á½¸öÖ¸ÕëÏàÓöʱ£¬½«ÇзÖÔªËØ a[lo] ºÍ×ó×ÓÊý×é×îÓÒ²àµÄÔªËØ a[j] ½»»»È»ºó·µ»Ø j ¼´¿É¡£ +? a[lo] ????§Ù????????????????????????????????????????????????????????????????????????????§³???????????????????????????????????????????????????????????????????????§Ù?????????? j ???????????§³???§Ù????????????????????????§Ù???? a[lo] ??????????????????? a[j] ???????? j ???¨À? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/e198c201-f386-4491-8ad6-f7e433bf992d.png) @@ -720,29 +720,29 @@ public class QuickSort { } ``` -### 3. ÐÔÄÜ·ÖÎö +### 3. ??????? -¿ìËÙÅÅÐòÊÇÔ­µØÅÅÐò£¬²»ÐèÒª¸¨ÖúÊý×飬µ«Êǵݹéµ÷ÓÃÐèÒª¸¨ÖúÕ»¡£ +????????????????????????????ï…??????????????????? -¿ìËÙÅÅÐò×îºÃµÄÇé¿öÏÂÊÇÿ´Î¶¼ÕýºÃÄܽ«Êý×é¶Ô°ë·Ö£¬ÕâÑùµÝ¹éµ÷ÓôÎÊý²ÅÊÇ×îÉٵġ£ÕâÖÖÇé¿öϱȽϴÎÊýΪ CN=2CN/2+N£¬Ò²¾ÍÊǸ´ÔÓ¶ÈΪ O(NlgN)¡£ +?????????????????????¦Æ???????????????????????????????????????????????¡À?????? CN=2CN/2+N???????????? O(NlgN)?? -×µÄÇé¿öÏ£¬µÚÒ»´Î´Ó×îСµÄÔªËØÇз֣¬µÚ¶þ´Î´ÓµÚ¶þСµÄÔªËØÇз֣¬Èç´ËÕâ°ã¡£Òò´Ë×µÄÇé¿öÏÂÐèÒª±È½Ï N2/2¡£ÎªÁË·ÀÖ¹Êý×é×ʼ¾ÍÊÇÓÐÐòµÄ£¬ÔÚ½øÐпìËÙÅÅÐòʱÐèÒªËæ»ú´òÂÒÊý×é¡£ +??????????????¦Ä???§³??????§Ù??????¦Ä???§³??????§Ù?????????????????????????? N2/2????????????????????????????§á?????????????????????î• -### 4. Ëã·¨¸Ä½ø +### 4. ????? -#### 4.1 Çл»µ½²åÈëÅÅÐò +#### 4.1 ?§Ý??????????? -ÒòΪ¿ìËÙÅÅÐòÔÚСÊý×éÖÐÒ²»áµ÷ÓÃ×Ô¼º£¬¶ÔÓÚСÊý×飬²åÈëÅÅÐò±È¿ìËÙÅÅÐòµÄÐÔÄܸüºÃ£¬Òò´ËÔÚСÊý×éÖпÉÒÔÇл»µ½²åÈëÅÅÐò¡£ +?????????????§³?????????????????????§³???ï…??????????????????????????????§³?????§á????§Ý??????????? -#### 4.2 ÈýÈ¡Ñù +#### 4.2 ????? -×îºÃµÄÇé¿öÏÂÊÇÿ´Î¶¼ÄÜÈ¡Êý×éµÄÖÐλÊý×÷ΪÇзÖÔªËØ£¬µ«ÊǼÆËãÖÐλÊýµÄ´ú¼ÛºÜ¸ß¡£ÈËÃÇ·¢ÏÖÈ¡ 3 ¸öÔªËØ²¢½«´óС¾ÓÖеÄÔªËØ×÷ΪÇзÖÔªËØµÄЧ¹û×îºÃ¡£ +?????????????¦Æ???????????¦Ë??????§Ù??????????????¦Ë?????????????????? 3 ??????????§³???§Ö????????§Ù?????§¹????¨¢? -#### 4.3 ÈýÏòÇÐ·Ö +#### 4.3 ?????§Ù? -¶ÔÓÚÓдóÁ¿Öظ´ÔªËصÄÊý×飬¿ÉÒÔ½«Êý×éÇзÖΪÈý²¿·Ö£¬·Ö±ð¶ÔӦСÓÚ¡¢µÈÓںʹóÓÚÇзÖÔªËØ¡£ +?????§Õ?????????????ï…??????????§Ù??????????????§³????????????§Ù????? -ÈýÏòÇзֿìËÙÅÅÐò¶ÔÓÚÖ»ÓÐÈô¸É²»Í¬Ö÷¼üµÄËæ»úÊý×é¿ÉÒÔÔÚÏßÐÔʱ¼äÄÚÍê³ÉÅÅÐò¡£ +?????§Ù?????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/9d2226dc-c4a3-40ec-9b3e-a46bf86af499.png) @@ -764,15 +764,15 @@ public class Quick3Way { } ``` -## ÓÅÏȶÓÁÐ +## ??????? -ÓÅÏȶÓÁÐÖ÷ÒªÓÃÓÚ´¦Àí×î´óÔªËØ¡£ +???????????????????????? -### 1. ¶Ñ +### 1. ?? -¶¨Ò壺һ¿Å¶þ²æÊ÷µÄÿ¸ö½Úµã¶¼´óÓÚµÈÓÚËüµÄÁ½¸ö×ӽڵ㡣 +???‰Ø??????????????????????????????????? -¶Ñ¿ÉÒÔÓÃÊý×éÀ´±íʾ£¬ÒòΪ¶ÑÊÇÒ»ÖÖÍêÈ«¶þ²æÊ÷£¬¶øÍêÈ«¶þ²æÊ÷ºÜÈÝÒ׾ʹ洢ÔÚÊý×éÖС£Î»Öà k µÄ½ÚµãµÄ¸¸½ÚµãλÖÃΪ k/2£¬¶øËüµÄÁ½¸ö×Ó½ÚµãµÄλÖ÷ֱðΪ 2k ºÍ 2k+1¡£ÕâÀïÎÒÃDz»Ê¹ÓÃÊý×éË÷ÒýΪ 0 µÄλÖã¬ÊÇΪÁ˸üÇåÎúµØÀí½â½ÚµãµÄ¹ØÏµ¡£ +?????????????????????????????????????????????????????????›¥???????§³?¦Ë?? k ?????????¦Ë??? k/2?????????????????¦Ë?¡Â??? 2k ?? 2k+1??????????????????????? 0 ??¦Ë????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a9b6c1db-0f4a-4e91-8ac8-6b19bd106b51.png) @@ -805,9 +805,9 @@ public class MaxPQ { } ``` -### 2. Éϸ¡ºÍϳÁ +### 2. ???????? -ÔÚ¶ÑÖУ¬µ±Ò»¸ö½Úµã±È¸¸½Úµã´ó£¬ÄÇôÐèÒª½»»»Õâ¸öÁ½¸ö½Úµã¡£½»»»ºó»¹¿ÉÄܱÈËüеĸ¸½Úµã´ó£¬Òò´ËÐèÒª²»¶ÏµØ½øÐбȽϺͽ»»»²Ù×÷¡£°ÑÕâÖÖ²Ù×÷³ÆÎªÉϸ¡¡£ +????§µ????????????????????????????????????????????????????????????????????§Ò????????????????????????????? ```java private void swim(int k) { @@ -818,7 +818,7 @@ private void swim(int k) { } ``` -ÀàËÆµØ£¬µ±Ò»¸ö½Úµã±È×Ó½ÚµãÀ´µÃС£¬Ò²ÐèÒª²»¶ÏµÄÏòϱȽϺͽ»»»²Ù×÷£¬°ÑÕâÖÖ²Ù×÷³ÆÎªÏ³Á¡£Ò»¸ö½ÚµãÓÐÁ½¸ö×ӽڵ㣬Ӧµ±ÓëÁ½¸ö×Ó½ÚµãÖÐ×î´óÄÇô½Úµã½øÐн»»»¡£ +???????????????????????§³??????????????¡À???????????????????????????????????????????????????????????????????????§ß????? ```java private void sink(int k) { @@ -832,9 +832,9 @@ private void sink(int k) { } ``` -### 3. ²åÈëÔªËØ +### 3. ??????? -½«ÐÂÔªËØ·Åµ½Êý×éĩβ£¬È»ºóÉϸ¡µ½ºÏÊʵÄλÖᣠ+??????????????¦Â???????????????¦Ë?¨¢? ```java public void insert(Key v) { @@ -843,9 +843,9 @@ public void insert(Key v) { } ``` -### 4. ɾ³ý×î´óÔªËØ +### 4. ????????? -´ÓÊý×é¶¥¶Ëɾ³ý×î´óµÄÔªËØ£¬²¢½«Êý×éµÄ×îºóÒ»¸öÔªËØ·Åµ½¶¥¶Ë£¬²¢ÈÃÕâ¸öÔªËØÏ³Áµ½ºÏÊʵÄλÖᣠ+?????úB??????????????????????????????????????????????????????????¦Ë?¨¢? ```java public Key delMax() { @@ -857,13 +857,13 @@ public Key delMax() { } ``` -### 5. ¶ÑÅÅÐò +### 5. ?????? -ÓÉÓÚ¶Ñ¿ÉÒÔºÜÈÝÒ׵õ½×î´óµÄÔªËØ²¢É¾³ýËü£¬²»¶ÏµØ½øÐÐÕâÖÖ²Ù×÷¿ÉÒԵõ½Ò»¸öµÝ¼õÐòÁС£Èç¹û°Ñ×î´óÔªËØºÍµ±Ç°¶ÑÖÐÊý×éµÄ×îºóÒ»¸öÔªËØ½»»»Î»Ö㬲¢ÇÒ²»É¾³ýËü£¬ÄÇô¾Í¿ÉÒԵõ½Ò»¸ö´Óβµ½Í·µÄµÝ¼õÐòÁУ¬´ÓÕýÏòÀ´¿´¾ÍÊÇÒ»¸öµÝÔöÐòÁС£Òò´ËºÜÈÝÒ×ʹÓöÑÀ´½øÐÐÅÅÐò£¬²¢ÇÒ¶ÑÅÅÐòÊÇÔ­µØÅÅÐò£¬²»Õ¼ÓöîÍâ¿Õ¼ä¡£ +????????????????????????????????????????????????????????????§³????????????????????????????????????¦Ë??????????????????????????????¦Â??????????§µ?????????????????????????§³????????????????????????????????????????????????? -¶ÑÅÅÐòÒª·ÖÁ½¸ö½×¶Î£¬µÚÒ»¸ö½×¶ÎÊǰÑÎÞÐòÊý×齨Á¢Ò»¸ö¶Ñ£»µÚ¶þ¸ö½×¶ÎÊǽ»»»×î´óÔªËØºÍµ±Ç°¶ÑµÄÊý×é×îºóÒ»¸öÔªËØ£¬²¢ÇÒ½øÐÐϳÁ²Ù×÷ά³Ö¶ÑµÄÓÐÐò״̬¡£ +???????????????¦²???????????????????ýn?????????????????????????????????????????????????????????????????????????? -ÎÞÐòÊý×齨Á¢¶Ñ×îÖ±½ÓµÄ·½·¨ÊÇ´Ó×óµ½ÓÒ±éÀúÊý×飬Ȼºó½øÐÐÉϸ¡²Ù×÷¡£Ò»¸ö¸ü¸ßЧµÄ·½·¨ÊÇ´ÓÓÒÖÁ×ó½øÐÐϳÁ²Ù×÷£¬Èç¹ûÒ»¸ö½ÚµãµÄÁ½¸ö½Úµã¶¼ÒѾ­ÊǶÑÓÐÐò£¬ÄÇô½øÐÐϳÁ²Ù×÷¿ÉÒÔʹµÃÕâ¸ö½ÚµãΪ¸ù½ÚµãµÄ¶ÑÓÐÐò¡£Ò¶×ӽڵ㲻ÐèÒª½øÐÐϳÁ²Ù×÷£¬Òò´Ë¿ÉÒÔºöÂÔÒ¶×Ó½ÚµãµÄÔªËØ£¬Òò´ËÖ»ÐèÒª±éÀúÒ»°ëµÄÔªËØ¼´¿É¡£ +???????ýn??????????????????????????ï…??????????????????????§¹????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????¨À? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a2670745-a7b1-497b-90a4-dbddc4e2006d.jpg) @@ -880,33 +880,33 @@ public static void sort(Comparable[] a){ } ``` -### 6. ·ÖÎö +### 6. ???? -Ò»¸ö¶ÑµÄ¸ß¶ÈΪ lgN£¬Òò´ËÔÚ¶ÑÖвåÈëÔªËØºÍɾ³ý×î´óÔªËØµÄ¸´ÔӶȶ¼Îª lgN¡£ +????????? lgN?????????§Ó??????????????????????? lgN?? -¶ÔÓÚ¶ÑÅÅÐò£¬ÓÉÓÚÒª¶Ô N ¸ö½Úµã½øÐÐϳÁ²Ù×÷£¬Òò´Ë¸´ÔÓ¶ÈΪ NlgN¡£ +???????????????? N ????????????????????????? NlgN?? -¶ÑÅÅÐòʱһÖÖÔ­µØÅÅÐò£¬Ã»ÓÐÀûÓöîÍâµÄ¿Õ¼ä¡£ +?????????????????????????????? -ÏÖ´ú²Ù×÷ϵͳºÜÉÙʹÓöÑÅÅÐò£¬ÒòΪËüÎÞ·¨ÀûÓûº´æ£¬Ò²¾ÍÊÇÊý×éÔªËØºÜÉÙºÍÏàÁÚµÄÔªËØ½øÐбȽϡ£ +???????????????????????????????????—¨??????????????????????????§Ò??? -## Ó¦Óà +## ??? -### 1. ÅÅÐòËã·¨µÄ±È½Ï +### 1. ?????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/be53c00b-2534-4dc6-ad03-c55995c47db9.jpg) -¿ìËÙÅÅÐòʱ×î¿ìµÄͨÓÃÅÅÐòËã·¨£¬ËüµÄÄÚÑ­»·µÄÖ¸ÁîºÜÉÙ£¬¶øÇÒËü»¹ÄÜÀûÓûº´æ£¬ÒòΪËü×ÜÊÇ˳ÐòµØ·ÃÎÊÊý¾Ý¡£ËüµÄÔËÐÐʱ¼äÔö³¤ÊýÁ¿¼¶Îª \~cNlgN£¬ÕâÀïµÄ c ±ÈÆäËûÏßÐÔ¶ÔÊý¼¶±ðµÄÅÅÐòËã·¨¶¼ÒªÐ¡¡£Ê¹ÓÃÈýÏòÇзÖÖ®ºó£¬Êµ¼ÊÓ¦ÓÃÖпÉÄܳöÏÖµÄijЩ·Ö²¼µÄÊäÈëÄܹ»´ïµ½ÏßÐÔ¼¶±ð£¬¶øÆäËüÅÅÐòËã·¨ÈÔÈ»ÐèÒªÏßÐÔ¶ÔÊýʱ¼ä¡£ +??????????????????????????????????????????????????????????—¨??????????????????????????????????????????? \~cNlgN??????? c ???????????????????????????§³??????????§Ù???????????§á????????§»???????????????????????????????????????????????? -### 2. Java µÄÅÅÐòË㷨ʵÏÖ +### 2. Java ??????????? -Java ϵͳ¿âÖеÄÖ÷ÒªÅÅÐò·½·¨Îª java.util.Arrays.sort()£¬¶ÔÓÚԭʼÊý¾ÝÀàÐÍʹÓÃÈýÏòÇзֵĿìËÙÅÅÐò£¬¶ÔÓÚÒýÓÃÀàÐÍʹÓù鲢ÅÅÐò¡£ +Java ?????§Ö?????????? java.util.Arrays.sort()????????????????????????§Ù??????????????????????¨´öã???? -### 3. »ùÓÚÇзֵĿìËÙÑ¡ÔñËã·¨ +### 3. ?????§Ù?????????? -¿ìËÙÅÅÐòµÄ partition() ·½·¨£¬»á½«Êý×éµÄ a[lo] ÖÁ a[hi] ÖØÐÂÅÅÐò²¢·µ»ØÒ»¸öÕûÊý j ʹµÃ a[lo..j-1] СÓÚµÈÓÚ a[j]£¬ÇÒ a[j+1..hi] ´óÓÚµÈÓÚ a[j]¡£ÄÇôÈç¹û j=k£¬a[j] ¾ÍÊÇµÚ k ¸öÊý¡£ +????????? partition() ????????????? a[lo] ?? a[hi] ?????????????????? j ??? a[lo..j-1] §³????? a[j]???? a[j+1..hi] ??????? a[j]???????? j=k??a[j] ????? k ?????? -¸ÃËã·¨ÊÇÏßÐÔ¼¶±ðµÄ£¬ÒòΪÿ´ÎÕýºÃ½«Êý×é¶þ·Ö£¬ÄÇô±È½ÏµÄ×Ü´ÎÊýΪ (N+N/2+N/4+..)£¬Ö±µ½ÕÒµ½µÚ k ¸öÔªËØ£¬Õâ¸öºÍÏÔȻСÓÚ 2N¡£ +??????????????????????????????????????????????? (N+N/2+N/4+..)?????????? k ??????????????§³?? 2N?? ```java public static Comparable select(Comparable[] a, int k) { @@ -921,37 +921,37 @@ Java ϵͳ } ``` -# µÚÈýÕ ²éÕÒ +# ?????? ???? -±¾ÕÂʹÓÃÈýÖÖ¾­µäµÄÊý¾ÝÀàÐÍÀ´ÊµÏÖ¸ßЧµÄ·ûºÅ±í£º¶þ²æ²éÕÒÊ÷¡¢ºìºÚÊ÷ºÍÉ¢ÁÐ±í¡£ +?????????????????????????????§¹??????????????????????????§Ò? -## ·ûºÅ±í +## ????? ### 1. API ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/b69d7184-ab62-4957-ba29-fb4fa25f9b65.jpg) -µ±Ò»¸ö¼üµÄֵΪ null ʱ£¬±íʾ²»´æÔÚÕâ¸ö¼ü£¬Òò´Ë¿ÉÒÔʹÓà put(key, null) ×÷Ϊ delete(key) µÄÒ»ÖÖÑÓ³ÙʵÏÖ¡£ +??????????? null ???????????????????????????? put(key, null) ??? delete(key) ???????????? -### 2. ÓÐÐò·ûºÅ±í +### 2. ???????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ba6ae411-82da-4d86-a434-6776d1731e8e.jpg) -ÓÐÐò·ûºÅ±íµÄ¼üÐèҪʵÏÖ Comparable ½Ó¿Ú¡£ +???????????????? Comparable ???? -²éÕҵijɱ¾Ä£ÐÍ£º¼üµÄ±È½Ï´ÎÊý£¬ÔÚ²»½øÐбȽÏʱʹÓÃÊý×éµÄ·ÃÎÊ´ÎÊý¡£ +????????????????????????????§Ò??????????????????? -### 3. ÎÞÐòÁ´±íʵÏÖ +### 3. ??????????? -¸´ÔÓ¶È£ºÏòÒ»¸ö¿Õ±íÖвåÈë N ¸ö²»Í¬µÄ¼üÐèÒª \~N2/2 ´Î±È½Ï¡£ +???????????????§Ó??? N ??????????? \~N2/2 ?¦Á??? -### 4. ÓÐÐòÊý×éµÄ¶þ·Ö²éÕÒ +### 4. ??????????????? -ʹÓÃÒ»¶ÔƽÐÐÊý×飬һ¸ö´æ´¢¼üÒ»¸ö´æ´¢Öµ¡£ +????????????ï…????›¥??????›¥??? -ÐèÒª´´½¨Ò»¸ö Key ÀàÐ굀 Comparable ¶ÔÏóÊý×éºÍÒ»¸ö Value ÀàÐ굀 Object ¶ÔÏóÊý×é¡£ +?????????? Key ????? Comparable ???????????? Value ????? Object ???????î• -rank() ·½·¨ÖÁ¹ØÖØÒª£¬µ±¼üÔÚ±íÖÐʱ£¬ËüÄܹ»ÖªµÀ¸Ã¼üµÄλÖ㻵±¼ü²»ÔÚ±íÖÐʱ£¬ËüÒ²ÄÜÖªµÀÔں䦲åÈëмü¡£ +rank() ??????????????????????????????????¨¹???¦Ë???????????????????????????¦Ä?????????? ```java public class BinarySearchST, Value> { @@ -1010,17 +1010,17 @@ public class BinarySearchST, Value> { } ``` -### 5. ¶Ô¶þ·Ö²éÕҵķÖÎö +### 5. ???????????? -¸´ÔÓ¶È£º¶þ·Ö²éÕÒ×î¶àÐèÒª lgN+1 ´Î±È½Ï£¬Ê¹Óöþ·Ö²éÕÒʵÏֵķûºÅ±íµÄ²éÕÒ²Ù×÷ËùÐèÒªµÄʱ¼ä×î¶àÊǶÔÊý¼¶±ðµÄ¡£µ«ÊDzåÈë²Ù×÷ÐèÒªÒÆ¶¯Êý×éÔªËØ£¬ÊÇÏßÐÔ¼¶±ðµÄ¡£ +??????????????????? lgN+1 ?¦Á?????????????????????????????????????????????????????????????????????????????????????? -## ¶þ²æ²éÕÒÊ÷ +## ????????? -¶¨Ò壺¶þ²æÊ÷¶¨ÒåΪһ¸ö¿ÕÁ´½Ó£¬»òÕßÊÇÒ»¸öÓÐ×óÓÒÁ½¸öÁ´½ÓµÄ½Úµã£¬Ã¿¸öÁ´½Ó¶¼Ö¸ÏòÒ»¿Å×Ó¶þ²æÊ÷¡£¶þ²æ²éÕÒÊ÷£¨BST£©ÊÇÒ»¿Å¶þ²æÊ÷£¬²¢ÇÒÿ¸ö½ÚµãµÄ¼ü¶¼´óÓÚÆä×ó×ÓÊ÷ÖеÄÈÎÒâ½ÚµãµÄ¼ü¶øÐ¡ÓÚÓÒ×ÓÊ÷µÄÈÎÒâ½ÚµãµÄ¼ü¡£ +???‰Ø?????????????????????????????????????????????????????????????????????????????????BST?????????????????????????????????????????§Ö???????????§³???????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/25226bb2-92cc-40cb-9e7f-c44e79fbb64a.jpg) -¶þ²æ²éÕÒÊ÷µÄ²éÕÒ²Ù×÷ÿ´Îµü´ú¶¼»áÈÃÇø¼ä¼õÉÙÒ»°ë£¬ºÍ¶þ·Ö²éÕÒÀàËÆ¡£ +???????????????????¦Å???????????????????????????????? ```java public class BST, Value> { @@ -1030,7 +1030,7 @@ public class BST, Value> { private Key key; private Value val; private Node left, right; - // ÒԸýڵãΪ¸ùµÄ×ÓÊ÷Öнڵã×ÜÊý + // ???????????????§ß?????? private int N; public Node(Key key, Value val, int N) { @@ -1053,7 +1053,7 @@ public class BST, Value> { ### 1. get() -Èç¹ûÊ÷Êǿյģ¬Ôò²éÕÒδÃüÖУ»Èç¹û±»²éÕҵļüºÍ¸ù½ÚµãµÄ¼üÏàµÈ£¬²éÕÒÃüÖУ¬·ñÔòµÝ¹éµØÔÚ×ÓÊ÷ÖвéÕÒ£ºÈç¹û±»²éÕҵļü½ÏС¾ÍÔÚ×ó×ÓÊ÷ÖвéÕÒ£¬½Ï´ó¾ÍÔÚÓÒ×ÓÊ÷ÖвéÕÒ¡£ +???????????????¦Ä???§µ???????????????????????????????§µ???????????????§Ó?????????????????§³???????????§Ó?????????????????§Ó???? ```java public Value get(Key key) { @@ -1070,7 +1070,7 @@ private Value get(Node x, Key key) { ### 2. put() -µ±²åÈëµÄ¼ü²»´æÔÚÓÚÊ÷ÖУ¬ÐèÒª´´½¨Ò»¸öнڵ㣬²¢ÇÒ¸üÐÂÉϲã½ÚµãµÄÁ´½ÓʹµÃ¸Ã½ÚµãÕýÈ·Á´½Óµ½Ê÷ÖС£ +???????????????????§µ?????????????????????????????????????????????????§³? ```java public void put(Key key, Value val) { @@ -1087,17 +1087,17 @@ private Node put(Node x, Key key, Value val) { } ``` -### 3. ·ÖÎö +### 3. ???? -¶þ²æ²éÕÒÊ÷µÄËã·¨ÔËÐÐʱ¼äÈ¡¾öÓÚÊ÷µÄÐÎ×´£¬¶øÊ÷µÄÐÎ×´ÓÖÈ¡¾öÓÚ¼ü±»²åÈëµÄÏȺó˳Ðò¡£×îºÃµÄÇé¿öÏÂÊ÷ÊÇÍêȫƽºâµÄ£¬Ã¿Ìõ¿ÕÁ´½ÓºÍ¸ù½ÚµãµÄ¾àÀ붼Ϊ lgN¡£ÔÚ×µÄÇé¿öÏ£¬Ê÷µÄ¸ß¶ÈΪ N¡£ +???????????????????????????????????????????????????????????????????????????????????????????????????????? lgN????????????????????? N?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/73a3983d-dd18-4373-897e-64b706a7e370.jpg) -¸´ÔÓ¶È£º²éÕҺͲåÈë²Ù×÷¶¼Îª¶ÔÊý¼¶±ð¡£ +???????????????????????????? ### 4. floor() -Èç¹û key СÓÚ¸ù½ÚµãµÄ key£¬ÄÇôСÓÚµÈÓÚ key µÄ×î´ó¼ü½ÚµãÒ»¶¨ÔÚ×ó×ÓÊ÷ÖУ»Èç¹û key ´óÓÚ¸ù½ÚµãµÄ key£¬Ö»Óе±¸ù½ÚµãÓÒ×ÓÊ÷ÖдæÔÚСÓÚµÈÓÚ key µÄ½Úµã£¬Ð¡ÓÚµÈÓÚ key µÄ×î´ó¼ü½Úµã²ÅÔÚÓÒ×ÓÊ÷ÖУ¬·ñÔò¸ù½Úµã¾ÍÊÇСÓÚµÈÓÚ key µÄ×î´ó¼ü½Úµã¡£ +??? key §³??????? key?????§³????? key ?????????????????????§µ???? key ????????? key????§Ö?????????????§Õ???§³????? key ????§³????? key ???????????????????§µ????????????§³????? key ????????? ```java public Key floor(Key key) { @@ -1145,7 +1145,7 @@ private Node min(Node x) { ### 7. deleteMin() -ÁîÖ¸Ïò×îС½ÚµãµÄÁ´½ÓÖ¸Ïò×îС½ÚµãµÄÓÒ×ÓÊ÷¡£ +???????§³?????????????§³???????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/6e2cb20a-8d2a-46fe-9ac7-68a2126b7bd5.jpg) @@ -1163,7 +1163,7 @@ public Node deleteMin(Node x) { ### 8. delete() -Èç¹û´ýɾ³ýµÄ½ÚµãÖ»ÓÐ×ÓÊ÷£¬ÄÇôֻÐèÒªÈÃÖ¸Ïò½ÚµãµÄÁ´½ÓÖ¸ÏòΨһµÄ×ÓÊ÷¼´¿É£»·ñÔò£¬ÈÃÓÒ×ÓÊ÷µÄ×îС½ÚµãÌæ»»¸Ã½Úµã¡£ +???????????????????????????????????????????¦·????????????????????????????§³????�I???? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/b488282d-bfe0-464f-9e91-1f5b83a975bd.jpg) @@ -1191,7 +1191,7 @@ private Node delete(Node x, Key key) { ### 9. keys() -ÀûÓöþ²æ²éÕÒÊ÷ÖÐÐò±éÀúµÄ½á¹ûΪÓÐÐòÐòÁеÄÌØµã¡£ +???????????????????????????????§Ö???? ```java public Iterable keys(Key lo, Key hi) { @@ -1209,42 +1209,42 @@ private void keys(Node x, Queue queue, Key lo, Key hi) { } ``` -### 10. ÐÔÄÜ·ÖÎö +### 10. ??????? -¸´ÔÓ¶È£º¶þ²æ²éÕÒÊ÷ËùÓвÙ×÷ÔÚ×µÄÇé¿öÏÂËùÐèÒªµÄʱ¼ä¶¼ºÍÊ÷µÄ¸ß¶È³ÉÕý±È¡£ +??????????????????§Ó?????????????????????????????????????? -## ƽºâ²éÕÒÊ÷ +## ???????? -### 2-3 ²éÕÒÊ÷ +### 2-3 ?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/2548f2ec-7b00-4ec7-b286-20fc3022e084.jpg) -Ò»¿ÅÍêÃÀƽºâµÄ 2-3 ²éÕÒÊ÷µÄËùÓпÕÁ´½Óµ½¸ù½ÚµãµÄ¾àÀëÓ¦¸ÃÊÇÏàͬµÄ¡£ +??????????? 2-3 ???????????§á?????????????????????????? -#### 1. ²åÈë²Ù×÷ +#### 1. ??????? -µ±²åÈëÖ®ºó²úÉúÒ»¸öÁÙʱ 4- ½Úµãʱ£¬ÐèÒª½« 4- ½Úµã·ÖÁÑ³É 3 ¸ö 2- ½Úµã£¬²¢½«ÖмäµÄ 2- ½ÚµãÒÆµ½Éϲã½ÚµãÖУ¬Èç¹ûÉÏÒÆ²Ù×÷¼ÌÐø²úÉúÁÙʱ 4- ½ÚµãÔòÒ»Ö±½øÐзÖÁÑÉÏÒÆ£¬Ö±µ½²»´æÔÚÁÙʱ 4- ½Úµã¡£ +?????????????????? 4- ??????????? 4- ??????? 3 ?? 2- ????????§Þ?? 2- ????????????§µ?????????????????????? 4- ??????????§Ù???????????????????? 4- ??? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/912174d8-0786-4222-b7ef-a611d36e5db9.jpg) -#### 2. ÐÔÖÊ +#### 2. ???? -2-3 ²éÕÒÊ÷²åÈë²Ù×÷µÄ±ä»»¶¼ÊǾֲ¿µÄ£¬³ýÁËÏà¹ØµÄ½ÚµãºÍÁ´½ÓÖ®Íâ²»±ØÐ޸ĻòÕß¼ì²éÊ÷µÄÆäËü²¿·Ö£¬¶øÕâЩ¾Ö²¿±ä»»²»»áÓ°ÏìÊ÷µÄÈ«¾ÖÓÐÐòÐÔºÍÆ½ºâÐÔ¡£ +2-3 ???????????????ÈÎ??????????????????????????????????????????????????????§»????ÈÎ??????????????????????????? -2-3 ²éÕÒÊ÷µÄ²éÕҺͲåÈë²Ù×÷¸´ÔӶȺͲåÈë˳ÐòÎ޹أ¬ÔÚ×µÄÇé¿öϲéÕҺͲåÈë²Ù×÷·ÃÎÊµÄ½Úµã±ØÈ»²»³¬¹ý logN ¸ö¡£º¬ÓÐ 10 ÒÚ¸ö½ÚµãµÄ 2-3 ²éÕÒÊ÷×î¶àÖ»ÐèÒª·ÃÎÊ 30 ¸ö½Úµã¾ÍÄܽøÐÐÈÎÒâµÄ²éÕҺͲåÈë²Ù×÷¡£ +2-3 ?????????????????????????????????????????????????????????????????????? logN ???????? 10 ??????? 2-3 ????????????????? 30 ???????????????????????????? -### ºìºÚ¶þ²æ²éÕÒÊ÷ +### ??????????? -2-3 ²éÕÒÊ÷ÐèÒªÓõ½ 2- ½ÚµãºÍ 3- ½Úµã£¬ºìºÚÊ÷ʹÓúìÁ´½ÓÀ´ÊµÏÖ 3- ½Úµã¡£Ö¸ÏòÒ»¸ö½ÚµãµÄÁ´½ÓÑÕÉ«Èç¹ûΪºìÉ«£¬ÄÇôÕâ¸ö½ÚµãºÍÉϲã½Úµã±íʾµÄÊÇÒ»¸ö 3- ½Úµã£¬¶øºÚÉ«ÔòÊÇÆÕͨÁ´½Ó¡£ +2-3 ???????????? 2- ???? 3- ??????????¨²?????????? 3- ????????????????????????????????????????????????????? 3- ???????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/7080a928-06ba-4e10-9792-b8dd190dc8e2.jpg) -ºìºÚÊ÷¾ßÓÐÒÔÏÂÐÔÖÊ£º +?????????????????? -1. ºìÁ´½Ó¶¼Îª×óÁ´½Ó£» -2. ÍêÃÀºÚɫƽºâ£¬¼´ÈÎÒâ¿ÕÁ´½Óµ½¸ù½ÚµãµÄ·¾¶ÉϵĺÚÁ´½ÓÊýÁ¿Ïàͬ¡£ +1. ??????????????? +2. ????????????????????????????¡¤??????????????????? -»­ºìºÚÊ÷ʱ¿ÉÒÔ½«ºìÁ´½Ó»­Æ½¡£ +??????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/62077f5d-a06d-4129-9b43-78715b82cb03.png) @@ -1276,9 +1276,9 @@ public class RedBlackBST, Value> { } ``` -#### 1. ×óÐýת +#### 1. ????? -ÒòΪºÏ·¨µÄºìÁ´½Ó¶¼Îª×óÁ´½Ó£¬Èç¹û³öÏÖÓÒÁ´½ÓΪºìÁ´½Ó£¬ÄÇô¾ÍÐèÒª½øÐÐ×óÐýת²Ù×÷¡£ +?????????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/33a4e822-2dd0-481e-ac89-7f6161034402.jpg) @@ -1297,9 +1297,9 @@ public Node rotateLeft(Node h) { } ``` -#### 2. ÓÒÐýת +#### 2. ????? -½øÐÐÓÒÐýתÊÇΪÁËת»»Á½¸öÁ¬ÐøµÄ×óºìÁ´½Ó£¬Õâ»áÔÚÖ®ºóµÄ²åÈë¹ý³ÌÖÐ̽ÌÖ¡£ +???????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/dfd078b2-aa4f-4c50-8319-232922d822b8.jpg) @@ -1317,9 +1317,9 @@ public Node rotateRight(Node h) { } ``` -#### 3. ÑÕɫת»» +#### 3. ?????? -Ò»¸ö 4- ½ÚµãÔÚºìºÚÊ÷ÖбíÏÖΪһ¸ö½ÚµãµÄ×óÓÒ×ӽڵ㶼ÊǺìÉ«µÄ¡£·ÖÁÑ 4- ½Úµã³ýÁËÐèÒª½«×Ó½ÚµãµÄÑÕÉ«Óɺì±äºÚÖ®Í⣬ͬʱÐèÒª½«¸¸½ÚµãµÄÑÕÉ«Óɺڱäºì£¬´Ó 2-3 Ê÷µÄ½Ç¶È¿´¾ÍÊǽ«Öмä½ÚµãÒÆµ½Éϲã½Úµã¡£ +??? 4- ??????????§Ò?????????????????????????????? 4- ?????????????????????????????????????????????????? 2-3 ?????????????§Þ??????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/de7c5a31-55f5-4e9d-92ec-4ed5b2ec3828.jpg) @@ -1333,13 +1333,13 @@ void flipColors(Node h){ } ``` -#### 4. ²åÈë +#### 4. ???? -²åÈëËã·¨£º +???????? -- Èç¹ûÓÒ×Ó½ÚµãÊǺìÉ«µÄ¶ø×ó×Ó½ÚµãÊǺÚÉ«µÄ£¬½øÐÐ×óÐýת£» -- Èç¹û×ó×Ó½ÚµãÊǺìÉ«µÄÇÒËüµÄ×ó×Ó½ÚµãÒ²ÊǺìÉ«µÄ£¬½øÐÐÓÒÐýת£» -- Èç¹û×óÓÒ×Ó½Úµã¾ùΪºìÉ«µÄ£¬½øÐÐÑÕɫת»»¡£ +- ???????????????????????????????????????? +- ?????????????????????????????????????????????? +- ??????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/40639782-5df2-4e96-a4f3-f9dd664d0ca1.jpg) @@ -1365,55 +1365,55 @@ private Node put(Node x, Key key, Value val) { } ``` -¿ÉÒÔ¿´µ½¸Ã²åÈë²Ù×÷ºÍ BST µÄ²åÈë²Ù×÷ÀàËÆ£¬Ö»ÊÇÔÚ×îºó¼ÓÈëÁËÐýתºÍÑÕÉ«±ä»»²Ù×÷¼´¿É¡£ +????????¨°???????? BST ???????????????????????????????????ÈÎ???????¨À? -¸ù½ÚµãÒ»¶¨ÎªºÚÉ«£¬ÒòΪ¸ù½ÚµãûÓÐÉϲã½Úµã£¬Ò²¾ÍûÓÐÉϲã½ÚµãµÄ×óÁ´½ÓÖ¸Ïò¸ù½Úµã¡£flipColors() ÓпÉÄÜ»áʹµÃ¸ù½ÚµãµÄÑÕÉ«±äΪºìÉ«£¬Ã¿µ±¸ù½ÚµãÓɺìÉ«±ä³ÉºÚɫʱÊ÷µÄºÚÁ´½Ó¸ß¶È¼Ó 1. +???????????????????????????????????????????????????????flipColors() ?§á????????????????????????????????????????????????????? 1. -#### 5. ɾ³ý×îС¼ü +#### 5. ?????§³?? -Èç¹û×îС¼üÔÚÒ»¸ö 2- ½ÚµãÖУ¬ÄÇôɾ³ý¸Ã¼ü»áÁôÏÂÒ»¸ö¿ÕÁ´½Ó£¬¾ÍÆÆ»µÁËÆ½ºâÐÔ£¬Òò´ËҪȷ±£×îС¼ü²»ÔÚ 2- ½ÚµãÖС£½« 2- ½Úµãת»»³É 3- ½Úµã»òÕß 4- ½ÚµãÓÐÁ½ÖÖ·½·¨£¬Ò»ÖÖÊÇÏòÉϲã½ÚµãÄÃÒ»¸ö key£¬»òÕßÏòÐֵܽڵãÄÃÒ»¸ö key¡£Èç¹ûÉϲã½ÚµãÊÇ 2- ½Úµã£¬ÄÇô¾Íû°ì·¨´ÓÉϲã½ÚµãÄà key ÁË£¬Òò´ËÒª±£Ö¤É¾³ý·¾¶ÉϵÄËùÓнڵ㶼²»ÊÇ 2- ½Úµã¡£ÔÚÏòÏÂɾ³ýµÄ¹ý³ÌÖУ¬±£Ö¤ÒÔÏÂÇé¿öÖ®Ò»·¢Éú£º +?????§³??????? 2- ????§µ????????¨¹???????????????????????????????????????§³?????? 2- ????§³??? 2- ???????? 3- ?????? 4- ??????????????????????????????? key?????????????????? key???????????? 2- ???????????????????? key ?????????????¡¤????????§ß?????? 2- ??????????????????§µ??????????????????? -1. Èç¹ûµ±Ç°½ÚµãµÄ×ó×ӽڵ㲻ÊÇ 2- ½Úµã£¬Íê³É£» -2. Èç¹ûµ±Ç°½ÚµãµÄ×ó×Ó½ÚµãÊÇ 2- ½Úµã¶øËüµÄÐֵܽڵ㲻ÊÇ 2- ½Úµã£¬ÏòÐֵܽڵãÄÃÒ»¸ö key ¹ýÀ´£» -3. Èç¹ûµ±Ç°½ÚµãµÄ×ó×Ó½ÚµãºÍËüµÄÐֵܽڵ㶼ÊÇ 2- ½Úµã£¬½«×ó×ӽڵ㡢¸¸½ÚµãÖеÄ×îС¼üºÍ×î½üµÄÐֵܽڵãºÏ²¢ÎªÒ»¸ö 4- ½Úµã¡£ +1. ?????????????????? 2- ??????? +2. ?????????????????? 2- ??????????????? 2- ??????????????? key ?????? +3. ???????????????????????????? 2- ?????????????????§Ö???§³???????????????????? 4- ??? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/b001fa64-307c-49af-b4b2-2043fc26154e.png) -×îºóµÃµ½Ò»¸öº¬ÓÐ×îС¼üµÄ 3- ½Úµã»òÕß 4- ½Úµã£¬Ö±½Ó´ÓÖÐɾ³ý¡£È»ºóÔÙ´ÓÍ··Ö½âËùÓÐÁÙʱµÄ 4- ½Úµã¡£ +??????????????§³???? 3- ?????? 4- ????????????????????????????????? 4- ??? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/70b66757-755c-4e17-a7b7-5ce808023643.png) -#### 6. ·ÖÎö +#### 6. ???? -Ò»¿Å´óСΪ N µÄºìºÚÊ÷µÄ¸ß¶È²»»á³¬¹ý 2lgN¡£×µÄÇé¿öÏÂÊÇËüËù¶ÔÓ¦µÄ 2-3 Ê÷Öй¹³É×î×ó±ßµÄ·¾¶½ÚµãÈ«²¿¶¼ÊÇ 3- ½Úµã¶øÆäÓà¶¼ÊÇ 2- ½Úµã¡£ +????§³? N ??????????????? 2lgN?????????????????????? 2-3 ???§Û?????????¡¤???????????? 3- ?????????? 2- ??? -ºìºÚÊ÷´ó¶àÊýµÄ²Ù×÷ËùÐèÒªµÄʱ¼ä¶¼ÊǶÔÊý¼¶±ðµÄ¡£ +???????????????????????????????????? -## É¢Áбí +## ??§Ò? -É¢ÁбíÀàËÆÓÚÊý×飬¿ÉÒÔ°ÑÉ¢ÁбíµÄÉ¢ÁÐÖµ¿´³ÉÊý×éµÄË÷ÒýÖµ¡£·ÃÎÊÉ¢ÁбíºÍ·ÃÎÊÊý×éÔªËØÒ»Ñù¿ìËÙ£¬Ëü¿ÉÒÔÔÚ³£Êýʱ¼äÄÚʵÏÖ²éÕҺͲåÈëµÄ·ûºÅ±í¡£ +??§Ò??????????ï…???????§Ò????????????????????????????§Ò??????????????????????????????????????????????????? -ÓÉÓÚÎÞ·¨Í¨¹ýÉ¢ÁÐÖµÖªµÀ¼üµÄ´óС¹ØÏµ£¬Òò´ËÉ¢ÁбíÎÞ·¨ÊµÏÖÓÐÐòÐÔ²Ù×÷¡£ +??????????????????????§³??????????§Ò?????????????????? -### É¢Áк¯Êý +### ??§Ü??? -¶ÔÓÚÒ»¸ö´óСΪ M µÄÉ¢ÁÐ±í£¬É¢Áк¯ÊýÄܹ»°ÑÈÎÒâ¼üת»»Îª [0, M-1] ÄÚµÄÕýÕûÊý£¬¸ÃÕýÕûÊý¼´Îª hash Öµ¡£ +?????????§³? M ????§Ò???§Ü????????????????? [0, M-1] ?????????????????????? hash ??? -É¢ÁбíÓгåÍ»µÄ´æÔÚ£¬Ò²¾ÍÊÇÁ½¸ö²»Í¬µÄ¼ü¿ÉÄÜÓÐÏàͬµÄ hash Öµ¡£ +??§Ò??§Ô?????????????????????????????????? hash ??? -É¢Áк¯ÊýÓ¦¸ÃÂú×ãÒÔÏÂÈý¸öÌõ¼þ£º +??§Ü???????????????????????? -1. Ò»ÖÂÐÔ£ºÏàµÈµÄ¼üÓ¦µ±ÓÐÏàµÈµÄ hash Öµ¡£ -2. ¸ßЧÐÔ£º¼ÆËãÓ¦µ±¼ò±ã£¬ÓбØÒªµÄ»°¿ÉÒÔ°Ñ hash Öµ»º´æÆðÀ´£¬ÔÚµ÷Óà hash º¯Êýʱֱ½Ó·µ»Ø¡£ -3. ¾ùÔÈÐÔ£ºËùÓмüµÄ hash ÖµÓ¦µ±¾ùÔȵطֲ¼µ½ [0, M-1] Ö®¼ä£¬Õâ¸öÌõ¼þÖÁ¹ØÖØÒª£¬Ö±½ÓÓ°Ï쵽ɢÁбíµÄÐÔÄÜ¡£ +1. ???????????????????? hash ??? +2. ??§¹??????????????§Ò?????????? hash ???????????????? hash ???????????? +3. ??????????§Þ??? hash ????????????? [0, M-1] ???????????????????????????§Ò??????? -³ýÁôÓàÊý·¨¿ÉÒÔ½«ÕûÊýÉ¢Áе½ [0, M-1] Ö®¼ä£¬ÀýÈçÒ»¸öÕýÕûÊý k£¬¼ÆËã k%M ¼È¿ÉµÃµ½Ò»¸ö [0, M-1] Ö®¼äµÄ hash Öµ¡£×¢Òâ M ±ØÐëÊÇÒ»¸öËØÊý£¬·ñÔòÎÞ·¨ÀûÓüü°üº¬µÄËùÓÐÐÅÏ¢¡£ÀýÈç M Ϊ 10k£¬ÄÇôֻÄÜÀûÓüüµÄºó k λ¡£ +?????????????????????§Ö? [0, M-1] ???????????????? k?????? k%M ???????? [0, M-1] ???? hash ?????? M ?????????????????????????¨¹???????????????????? M ? 10k???????????¨¹???? k ¦Ë?? -¶ÔÓÚÆäËüÊý£¬¿ÉÒÔ½«Æäת»»³ÉÕûÊýµÄÐÎʽ£¬È»ºóÀûÓóýÁôÓàÊý·¨¡£ÀýÈç¶ÔÓÚ¸¡µãÊý£¬¿ÉÒÔ½«Æä±íʾ³É¶þ½øÖÆÐÎʽ£¬È»ºóʹÓöþ½øÖÆÐÎʽµÄÕûÊýÖµ½øÐгýÁôÓàÊý·¨¡£ +?????????????????????????????????????????¨®??????????????????????????????????????????????????????????????????????§Ô??????????? -¶ÔÓÚÓжಿ·Ö×éºÏµÄ¼ü£¬Ã¿²¿·Ö¶¼ÐèÒª¼ÆËã hash Öµ£¬²¢ÇÒ×îºóºÏ²¢Ê±ÐèÒªÈÃÿ²¿·Ö hash Öµ¶¼¾ßÓÐͬµÈÖØÒªµÄµØÎ»¡£¿ÉÒÔ½«¸Ã¼ü¿´³É R ½øÖƵÄÕûÊý£¬¼üÖÐÿ²¿·Ö¶¼¾ßÓв»Í¬µÄȨֵ¡£ +?????§Ø??????????????????????? hash ??????????????????????? hash ????????????????¦Ë????????¨¹????? R ????????????????????????§Ó???????? -ÀýÈ磬×Ö·û´®µÄÉ¢Áк¯ÊýʵÏÖÈçÏ +???íà?????????§Ü?????????? ```java int hash = 0; @@ -1421,21 +1421,21 @@ for(int i = 0; i < s.length(); i++) hash = (R * hash + s.charAt(i)) % M; ``` -ÔÙ±ÈÈ磬ӵÓжà¸ö³ÉÔ±µÄ×Ô¶¨ÒåÀàµÄ¹þÏ£º¯ÊýÈçÏ +????íà??§Ø????????????????????????? ```java int hash = (((day * R + month) % M) * R + year) % M; ``` -R µÄÖµ²»ÊǺÜÖØÒª£¬Í¨³£È¡ 31¡£ +R ????????????????? 31?? -Java ÖÐµÄ hashCode() ʵÏÖÁË hash º¯Êý£¬µ«ÊÇĬÈÏʹÓöÔÏóµÄÄÚ´æµØÖ·Öµ¡£ÔÚʹÓà hashCode() º¯Êýʱ£¬Ó¦µ±½áºÏ³ýÁôÓàÊý·¨À´Ê¹Óá£ÒòΪÄÚ´æµØÖ·ÊÇ 32 λÕûÊý£¬ÎÒÃÇÖ»ÐèÒª 31 λµÄ·Ç¸ºÕûÊý£¬Òò´ËÓ¦µ±ÆÁ±Î·ûºÅλ֮ºóÔÙʹÓóýÁôÓàÊý·¨¡£ +Java ?§Ö? hashCode() ????? hash ????????????????????????????????? hashCode() ??????????????????????????¨¢??????????? 32 ¦Ë?????????????? 31 ¦Ë???????????????????¦Ç???¦Ë???????¨®??????????? ```java int hash = (x.hashCode() & 0x7fffffff) % M; ``` -ʹÓà Java ×Ô´øµÄ HashMap µÈ×Ô´øµÄ¹þÏ£±íʵÏÖʱ£¬Ö»ÐèҪȥʵÏÖ Key ÀàÐ굀 hashCode() º¯Êý¼´¿É£¬Òò´ËÒ²¾Í²»ÐèÒª¿¼ÂÇ M µÄ´óСµÈ¡£Java ¹æ¶¨ hashCode() Äܹ»½«¼ü¾ùÔÈ·Ö²¼ÓÚËùÓÐµÄ 32 λÕûÊý£¬Java ÖÐµÄ String¡¢Integer µÈ¶ÔÏóµÄ hashCode() ¶¼ÄÜʵÏÖÕâÒ»µã¡£ÒÔÏÂչʾÁË×Ô¶¨ÒåÀàÐÍÈçºÎʵÏÖ hashCode()¡£ +??? Java ????? HashMap ????????????????????????? Key ????? hashCode() ??????????????????????? M ???§³???Java ?ÕÇ hashCode() ??????????????????§Ö? 32 ¦Ë??????Java ?§Ö? String??Integer ?????? hashCode() ??????????????????????????????????? hashCode()?? ```java public class Transaction{ @@ -1453,17 +1453,17 @@ public class Transaction{ } ``` -### »ùÓÚÀ­Á´·¨µÄÉ¢Áбí +### ??????????????§Ò? -À­Á´·¨Ê¹ÓÃÁ´±íÀ´´æ´¢ hash ÖµÏàͬµÄ¼ü£¬´Ó¶ø½â¾ö³åÍ»¡£´Ëʱ²éÕÒÐèÒª·ÖÁ½²½£¬Ê×ÏȲéÕÒ Key ËùÔÚµÄÁ´±í£¬È»ºóÔÚÁ´±íÖÐ˳Ðò²éÕÒ¡£ +????????????????›¥ hash ????????????????????????????????????????????? Key ??????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/540133af-aaaf-4208-8f7f-33cb89ac9621.png) -¶ÔÓÚ N ¸ö¼ü£¬M ÌõÁ´±í (N>M)£¬Èç¹û¹þÏ£º¯ÊýÄܹ»Âú×ã¾ùÔÈÐÔµÄÌõ¼þ£¬Ã¿ÌõÁ´±íµÄ´óСÇ÷ÏòÓÚ N/M£¬Òò´ËδÃüÖеIJéÕҺͲåÈë²Ù×÷ËùÐèÒªµÄ±È½Ï´ÎÊýΪ \~N/M¡£ +???? N ??????M ?????? (N>M)????????????????????????????????????????§³?????? N/M?????¦Ä???§Ö???????????????????????? \~N/M?? -### »ùÓÚÏßÐÔ̽²â·¨µÄÉ¢Áбí +### ???????????????§Ò? -ÏßÐÔ̽²â·¨Ê¹ÓÿÕλÀ´½â¾ö³åÍ»£¬µ±³åÍ»·¢Éúʱ£¬Ïòǰ̽²âÒ»¸ö¿ÕλÀ´´æ´¢³åÍ»µÄ¼ü¡£Ê¹ÓÃÏß³Ì̽²â·¨£¬Êý×éµÄ´óС M Ó¦µ±´óÓÚ¼üµÄ¸öÊý N£¨M>N)¡£ +???????????¦Ë?????????????????????????????????¦Ë???›¥?????????????????????????§³ M ????????????? N??M>N)?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/2b3410f1-9559-4dd1-bc3d-e3e572247be2.png) @@ -1494,7 +1494,7 @@ public class LinearProbingHashST { } ``` -#### ²éÕÒ +#### ???? ```java public Value get(Key key) { @@ -1507,7 +1507,7 @@ public Value get(Key key) { } ``` -#### ²åÈë +#### ???? ```java public void put(Key key, Value val) { @@ -1525,9 +1525,9 @@ public void put(Key key, Value val) { } ``` -#### ɾ³ý +#### ??? -ɾ³ý²Ù×÷Ó¦µ±½«ÓÒ²àËùÓÐÏàÁڵļüÖµÖØÐ²åÈëÉ¢ÁбíÖС£ +???????????????????????????????????§Ò??§³? ```java public void delete(Key key) { @@ -1553,15 +1553,15 @@ public void delete(Key key) { } ``` -#### µ÷ÕûÊý×é´óС +#### ?????????§³ -ÏßÐÔ̽²â·¨µÄ³É±¾È¡¾öÓÚÁ¬ÐøÌõÄ¿µÄ³¤¶È£¬Á¬ÐøÌõĿҲ½Ð¾Û´Ø¡£µ±¾Û´ØºÜ³¤Ê±£¬ÔÚ²éÕҺͲåÈëʱҲÐèÒª½øÐкܶà´Î̽²â¡£ +??????????????????????????????????????§à??????????????????????????????§Ü?????? -¦Á = N/M£¬°Ñ ¦Á ³ÆÎªÀûÓÃÂÊ¡£ÀíÂÛÖ¤Ã÷£¬µ± ¦Á СÓÚ 1/2 ʱ̽²âµÄÔ¤¼Æ´ÎÊýÖ»ÔÚ 1.5 µ½ 2.5 Ö®¼ä¡£ +?? = N/M???? ?? ????????????????????? ?? §³?? 1/2 ?????????????? 1.5 ?? 2.5 ??? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/0ddebc5c-7c24-46b1-98db-4fa5e54db16b.png) -ΪÁ˱£Ö¤É¢ÁбíµÄÐÔÄÜ£¬Ó¦µ±µ÷ÕûÊý×éµÄ´óС£¬Ê¹µÃ ¦Á ÔÚ [1/4, 1/2] Ö®¼ä¡£ +???????§Ò????????????????????§³????? ?? ?? [1/4, 1/2] ??? ```java private void resize() { @@ -1582,29 +1582,29 @@ private void resize(int cap) { } ``` -ËäȻÿ´ÎÖØÐµ÷ÕûÊý×é¶¼ÐèÒªÖØÐ°Ñÿ¸ö¼üÖµ¶Ô²åÈ뵽ɢÁÐ±í£¬µ«ÊÇ´Ó̯»¹·ÖÎöµÄ½Ç¶ÈÀ´¿´£¬ËùÐèÒªµÄ´ú¼ÛÈ´ÊǺÜСµÄ¡£´ÓÏÂͼ¿ÉÒÔ¿´³ö£¬Ã¿´ÎÊý×鳤¶È¼Ó±¶ºó£¬ÀÛ¼ÆÆ½¾ùÖµ¶¼»áÔö¼Ó 1£¬ÒòΪ±íÖÐÿ¸ö¼ü¶¼ÐèÒªÖØÐ¼ÆËãÉ¢ÁÐÖµ£¬µ«ÊÇËæºóƽ¾ùÖµ»áϽµ¡£ +????????????????úY??????¡ã??????????????§Ò?????????????????????????????????????§³???????????????????????øA????????????????????? 1?????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/01658047-0d86-4a7a-a8ca-7ea20fa1fdde.png) -## Ó¦Óà +## ??? -### ¸÷ÖÖ·ûºÅ±íʵÏÖµÄ±È½Ï +### ?????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/9ee83c8c-1165-476c-85a6-e6e434e5307a.jpg) -Ó¦µ±ÓÅÏÈ¿¼ÂÇÉ¢ÁÐ±í£¬µ±ÐèÒªÓÐÐòÐÔ²Ù×÷ʱʹÓúìºÚÊ÷¡£ +????????????§Ò??????????????????¨²?????? -### Java µÄ·ûºÅ±íʵÏÖ +### Java ????????? -Java µÄ java.util.TreeMap ºÍ java.util.HashMap ·Ö±ðÊÇ»ùÓÚºìºÚÊ÷ºÍÀ­Á´·¨µÄÉ¢ÁбíµÄ·ûºÅ±íʵÏÖ¡£ +Java ?? java.util.TreeMap ?? java.util.HashMap ????????????????????????§Ò?????????? -### ¼¯ºÏÀàÐÍ +### ???????? -³ýÁË·ûºÅ±í£¬¼¯ºÏÀàÐÍÒ²¾­³£Ê¹Óã¬ËüÖ»ÓмüûÓÐÖµ£¬¿ÉÒÔÓü¯ºÏÀàÐÍÀ´´æ´¢Ò»ÏµÁеļüÈ»ºóÅжÏÒ»¸ö¼üÊÇ·ñÔÚ¼¯ºÏÖС£ +?????????????????????????????§Þ????????????¨¹??????????›¥???§Ö??????§Ø???????????????§³? -### Ï¡ÊèÏòÁ¿³Ë·¨ +### ?????????? -ÏòÁ¿ÔËËãÉæ¼°µ½ N ´Î³Ë·¨£¬µ±ÏòÁ¿ÎªÏ¡ÊèÏòÁ¿Ê±£¬¿ÉÒÔʹÓ÷ûºÅ±íÀ´´æ´¢ÏòÁ¿ÖÐµÄ·Ç 0 Ë÷ÒýºÍÖµ£¬Ê¹µÃ³Ë·¨ÔËËãÖ»ÐèÒª¶ÔÄÇЩ·Ç 0 ÔªËØ½øÐм´¿É¡£ +?????????�p?? N ?¦Ã???????????????????????????¡Â???????›¥?????§Ö?? 0 ???????????¨®??????????????§»?? 0 ?????§Þ??¨À? ```java import java.util.HashMap; diff --git a/notes/编写å�¯è¯»ä»£ç �的艺术.md b/notes/编写å�¯è¯»ä»£ç �的艺术.md index 5f14f947..81b55de5 100644 --- a/notes/编写å�¯è¯»ä»£ç �的艺术.md +++ b/notes/编写å�¯è¯»ä»£ç �的艺术.md @@ -1,92 +1,92 @@ -* [µÚ 1 Õ ¿É¶ÁÐÔµÄÖØÒªÐÔ](#µÚ-1-ÕÂ-¿É¶ÁÐÔµÄÖØÒªÐÔ) -* [µÚ 2 Õ ÓÃÃû×Ö±í´ï´úÂ뺬Òå](#µÚ-2-ÕÂ-ÓÃÃû×Ö±í´ï´úÂ뺬Òå) -* [µÚ 3 Õ Ãû×Ö²»ÄÜ´øÀ´ÆçÒå](#µÚ-3-ÕÂ-Ãû×Ö²»ÄÜ´øÀ´ÆçÒå) -* [µÚ 4 Õ Á¼ºÃµÄ´úÂë·ç¸ñ](#µÚ-4-ÕÂ-Á¼ºÃµÄ´úÂë·ç¸ñ) -* [µÚ 5 Õ ±àдעÊÍ](#µÚ-5-ÕÂ-±àдעÊÍ) -* [µÚ 6 Õ ÈçºÎ±àдעÊÍ](#µÚ-6-ÕÂ-ÈçºÎ±àдעÊÍ) -* [µÚ 7 Õ Ìá¸ß¿ØÖÆÁ÷µÄ¿É¶ÁÐÔ](#µÚ-7-ÕÂ-Ìá¸ß¿ØÖÆÁ÷µÄ¿É¶ÁÐÔ) -* [µÚ 8 Õ ²ð·Ö³¤±í´ïʽ](#µÚ-8-ÕÂ-²ð·Ö³¤±í´ïʽ) -* [µÚ 9 Õ ±äÁ¿Óë¿É¶ÁÐÔ](#µÚ-9-ÕÂ-±äÁ¿Óë¿É¶ÁÐÔ) -* [µÚ 10 Õ ³éÈ¡º¯Êý](#µÚ-10-ÕÂ-³éÈ¡º¯Êý) -* [µÚ 11 Õ һ´ÎÖ»×öÒ»¼þÊÂ](#µÚ-11-ÕÂ-Ò»´ÎÖ»×öÒ»¼þÊÂ) -* [µÚ 12 Õ ÓÃ×ÔÈ»ÓïÑÔ±íÊö´úÂë](#µÚ-12-ÕÂ-ÓÃ×ÔÈ»ÓïÑÔ±íÊö´úÂë) -* [µÚ 13 Õ ¼õÉÙ´úÂëÁ¿](#µÚ-13-ÕÂ-¼õÉÙ´úÂëÁ¿) +* [?? 1 ?? ???????????](#??-1-??-???????????) +* [?? 2 ?? ?????????????](#??-2-??-?????????????) +* [?? 3 ?? ??????????????](#??-3-??-??????????????) +* [?? 4 ?? ??????????](#??-4-??-??????????) +* [?? 5 ?? ??§Õ???](#??-5-??-??§Õ???) +* [?? 6 ?? ??¦Á?§Õ???](#??-6-??-??¦Á?§Õ???) +* [?? 7 ?? ??????????????](#??-7-??-??????????????) +* [?? 8 ?? ????????](#??-8-??-????????) +* [?? 9 ?? ??????????](#??-9-??-??????????) +* [?? 10 ?? ???????](#??-10-??-???????) +* [?? 11 ?? ???????????](#??-11-??-???????????) +* [?? 12 ?? ????????????????](#??-12-??-????????????????) +* [?? 13 ?? ?????????](#??-13-??-?????????) -# µÚ 1 Õ ¿É¶ÁÐÔµÄÖØÒªÐÔ +# ?? 1 ?? ??????????? -±à³ÌÓкܴóÒ»²¿·Öʱ¼äÊÇÔÚÔĶÁ´úÂ룬²»½öÒªÔĶÁ×Ô¼ºµÄ´úÂ룬¶øÇÒÒªÔĶÁ±ðÈ˵ĴúÂë¡£Òò´Ë£¬¿É¶ÁÐÔÁ¼ºÃµÄ´úÂëÄܹ»´ó´óÌá¸ß±à³ÌЧÂÊ¡£ +????§Ü?????????????????????????????????????????????????????????????????????????????????§¹??? -¿É¶ÁÐÔÁ¼ºÃµÄ´úÂëÍùÍù»áÈôúÂë¼Ü¹¹¸üºÃ£¬ÒòΪ³ÌÐòÔ±¸üÔ¸ÒâÈ¥ÐÞ¸ÄÕⲿ·Ö´úÂ룬¶øÇÒÒ²¸üÈÝÒ×Ð޸ġ£ +?????????????????????????????????????????????????????????????????????? -Ö»ÓÐÔÚºËÐÄÁìÓòΪÁËЧÂʲſÉÒÔ·ÅÆú¿É¶ÁÐÔ£¬·ñÔò¿É¶ÁÐÔÊǵÚһλ¡£ +???????????????§¹???????????????????????????¦Ë?? -# µÚ 2 Õ ÓÃÃû×Ö±í´ï´úÂ뺬Òå +# ?? 2 ?? ????????????? -һЩ±È½ÏÓбí´ïÁ¦µÄµ¥´Ê£º +?§»????§Ò?????????? -| µ¥´Ê | ¿ÉÌæ´úµ¥´Ê | +| ???? | ????????? | | --- | --- | -| send | deliver¡¢dispatch¡¢announce¡¢distribute¡¢route | -| find | search¡¢extract¡¢locate¡¢recover | -| start| launch¡¢create¡¢begin¡¢open| -|make|create¡¢set up¡¢build¡¢generate¡¢compose¡¢add¡¢new| +| send | deliver??dispatch??announce??distribute??route | +| find | search??extract??locate??recover | +| start| launch??create??begin??open| +|make|create??set up??build??generate??compose??add??new| -ʹÓà i¡¢j¡¢k ×÷Ϊѭ»·µü´úÆ÷²»×ÜÊǺõģ¬Îªµü´úÆ÷Ìí¼Ó¸üÓбí´ïÁ¦µÄÃû×Ö»á¸üºÃ£¬±ÈÈç user_i¡¢member_i¡£ÒòΪѭ»·²ã´ÎÔ½¶à£¬´úÂëÔ½ÄÑÀí½â£¬Óбí´ïÁ¦µÄµü´úÆ÷Ãû×ֿɶÁÐÔ»á¸ü¸ß +??? i??j??k ?????????????????????????????????§Ò??????????????????? user_i??member_i?????????????????????????§Ò??????????????????????? -ΪÃû×ÖÌí¼ÓÐÎÈݴʵÈÐÅÏ¢ÄÜÈÃÃû×Ö¸ü¾ßÓбí´ïÁ¦£¬µ«ÊÇÃû×ÖÒ²»á±ä³¤¡£Ãû×Ö³¤¶ÌµÄ×¼ÔòÊÇ£º×÷ÓÃÓòÔ½´ó£¬Ãû×ÖÔ½³¤¡£Òò´ËÖ»ÓÐÔÚ¶Ì×÷ÓÃÓò²ÅÄÜʹÓÃһЩ¼òµ¥Ãû×Ö¡£ +?????????????????????????????§Ò??????????????????????????????????????????????????????????????????????????§»??????? -# µÚ 3 Õ Ãû×Ö²»ÄÜ´øÀ´ÆçÒå +# ?? 3 ?? ?????????????? -ÆðÍêÃû×ÖҪ˼¿¼Ò»Ï±ðÈË»á¶ÔÕâ¸öÃû×ÖÓкνâ¶Á£¬»á²»»áÎó½âÁËÔ­±¾Ïë±í´ïµÄº¬Òå¡£ +??????????????¡À?????????????§Ü¦Í???????????????????????‰^ -Óà min¡¢max ±íʾÊýÁ¿·¶Î§£» +?? min??max ?????????¦¶?? -Óà first¡¢last ±íʾ·ÃÎʿռäµÄ°üº¬·¶Î§£¬begin¡¢end ±íʾ·ÃÎʿռäµÄÅųý·¶Î§£¬¼´ end ²»°üº¬Î²²¿¡£ +?? first??last ???????????????¦¶??begin??end ???????????????¦¶???? end ??????¦Â???? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/26772ecc-a3e3-4ab7-a46f-8b4656990c27.jpg) -²¼¶ûÏà¹ØµÄÃüÃû¼ÓÉÏ is¡¢can¡¢should¡¢has µÈǰ׺¡£ +???????????????? is??can??should??has ?????? -# µÚ 4 Õ Á¼ºÃµÄ´úÂë·ç¸ñ +# ?? 4 ?? ?????????? -Êʵ±µÄ¿ÕÐкÍËõ½ø +???????§Ü????? -ÅÅÁÐÕûÆëµÄ×¢ÊÍ£º +????????????? ``` -int a = 1; // ×¢ÊÍ -int b = 11; // ×¢ÊÍ -int c = 111; // ×¢ÊÍ +int a = 1; // ??? +int b = 11; // ??? +int c = 111; // ??? ``` -Óï¾ä˳Ðò²»ÄÜËæÒ⣬±ÈÈçÓë html ±íµ¥Ïà¹ØÁªµÄ±äÁ¿µÄ¸³ÖµÓ¦¸ÃºÍ±íµ¥ÔÚ html ÖеÄ˳ÐòÒ»Ö£» +?????????????????? html ??????????????????¨²???? html ?§Ö???????? -°ÑÏà¹ØµÄ´úÂë°´¿é×éÖ¯·ÅÔÚÒ»Æð¡£ +????????????????????? -# µÚ 5 Õ ±àдעÊÍ +# ?? 5 ?? ??§Õ??? -ÔĶÁ´úÂëÊ×ÏÈ»á×¢Òâµ½×¢ÊÍ£¬Èç¹û×¢ÊÍû̫´ó×÷Óã¬ÄÇô¾Í»áÀË·Ñ´úÂëÔĶÁµÄʱ¼ä¡£ÄÇЩÄÜÖ±½Ó¿´³öº¬ÒåµÄ´úÂë²»ÐèҪдעÊÍ£¬ÌرðÊDz¢²»ÐèҪΪÿ¸ö·½·¨¶¼¼ÓÉÏ×¢ÊÍ£¬±ÈÈçÄÇЩ¼òµ¥µÄ getter ºÍ setter ·½·¨£¬ÎªÕâЩ·½·¨Ð´×¢ÊÍ·´¶øÈôúÂë¿É¶ÁÐÔ¸ü²î¡£ +????????????????????????????????????????????????????????§»???????????????????§Õ???????????????????????????????????????§»??? getter ?? setter ?????????§»????§Õ?????????????????þŸ -²»ÄÜÒòΪÓÐ×¢Ê;ÍËæ±ãÆð¸öÃû×Ö£¬¶øÊÇÕùÈ¡Æð¸öºÃÃû×Ö¶ø²»Ð´×¢ÊÍ¡£ +???????????????????????????????????????????§Õ???? -¿ÉÒÔÓÃ×¢ÊÍÀ´¼Ç¼²ÉÓõ±Ç°½â¾ö°ì·¨µÄ˼¿¼¹ý³Ì£¬´Ó¶øÈöÁÕ߸üÈÝÒ×Àí½â´úÂë¡£ +?????????????????????????????????????????????????????? -×¢ÊÍÓÃÀ´ÌáÐÑÒ»Ð©ÌØÊâÇé¿ö¡£ +????????????§»????????? -Óà TODO µÈ×ö±ê¼Ç£º +?? TODO ???????? -| ±ê¼Ç | Ó÷¨ | +| ??? | ?¡Â? | |---|---| -|TODO| ´ý×ö | -|FIXME| ´ýÐÞ¸´ | -|HACH| ´Ö²ÚµÄ½â¾ö·½°¸ | -|XXX| ΣÏÕ£¡ÕâÀïÓÐÖØÒªµÄÎÊÌâ | +|TODO| ???? | +|FIXME| ????? | +|HACH| ?????????? | +|XXX| ¦²?????????????????? | -# µÚ 6 Õ ÈçºÎ±àдעÊÍ +# ?? 6 ?? ??¦Á?§Õ??? -¾¡Á¿¼ò½àÃ÷ÁË£º +???????????? ``` // The first String is student's name @@ -99,7 +99,7 @@ Map scoreMap = new HashMap<>(); Map scoreMap = new HashMap<>(); ``` -Ìí¼Ó²âÊÔÓÃÀýÀ´ËµÃ÷£º +????????????????? ``` //... @@ -109,7 +109,7 @@ int add(int x, int y) { } ``` -Ôںܸ´Ôӵĺ¯Êýµ÷ÓÃÖжÔÿ¸ö²ÎÊý±êÉÏÃû×Ö£º +???????????????§Ø????????????????? ``` int a = 1; @@ -117,37 +117,37 @@ int b = 2; int num = add(\* x = *\ a, \* y = *\ b); ``` -ʹÓÃרҵÃû´ÊÀ´Ëõ¶Ì¸ÅÄîÉϵĽâÊÍ£¬±ÈÈçÓÃÉè¼ÆÄ£Ê½ÃûÀ´ËµÃ÷´úÂë¡£ +??????????????????????????????????????????????? -# µÚ 7 Õ Ìá¸ß¿ØÖÆÁ÷µÄ¿É¶ÁÐÔ +# ?? 7 ?? ?????????????? -Ìõ¼þ±í´ïʽÖУ¬×ó²àÊDZäÁ¿£¬ÓÒ²àÊdz£Êý¡£±ÈÈçÏÂÃæµÚÒ»¸öÓï¾äÕýÈ·£º +?????????§µ????????????????????????????????????????? ``` if(len < 10) if(10 > len) ``` -if / else Ìõ¼þÓï¾ä£¬ÏÈ´¦ÀíÒÔÏÂÂß¼­£º¢Ù ÕýÂß¼­£»¢Ú ¹Ø¼üÂß¼­£»¢Û£º¼òµ¥Âß¼­ +if / else ??????????????????????? ????????? ???????????????? ``` if(a == b) { - // ÕýÂß¼­ + // ????? } else{ - // ·´Âß¼­ + // ????? } ``` -Ö»ÓÐÔÚÂß¼­¼òµ¥µÄÇé¿öÏÂʹÓà ? : ÈýÄ¿ÔËËã·ûÀ´Ê¹´úÂë¸ü½ô´Õ£¬·ñÔòÓ¦¸Ã²ð·Ö³É if / else£» +??????????????????? ? : ???????????????????????????¨°??? if / else?? -do / while µÄÌõ¼þ·ÅÔÚºóÃæ£¬²»¹»¼òµ¥Ã÷ÁË£¬²¢ÇÒ»áÓÐһЩÃÔ»óµÄµØ·½£¬×îºÃʹÓà while À´´úÌæ¡£ +do / while ????????????—¨???????????????????§»?????????????? while ?????µµ -Èç¹ûÖ»ÓÐÒ»¸ö goto Ä¿±ê£¬ÄÇô goto ÉÐÇÒ»¹ÄܽÓÊÜ£¬µ«ÊǹýÓÚ¸´Ô goto »áÈôúÂë¿É¶ÁÐÔÌØ±ð²î£¬Ó¦¸Ã±ÜÃâʹÓà goto¡£ +????????? goto ?????? goto ?????????????????????? goto ???????????????????????? goto?? -ÔÚǶÌ×µÄÑ­»·ÖУ¬ÓÃһЩ return Óï¾äÍùÍùÄܼõÉÙǶÌ׵IJãÊý¡£ +??????????§µ????§» return ????????????????????? -# µÚ 8 Õ ²ð·Ö³¤±í´ïʽ +# ?? 8 ?? ???????? -³¤±í´ïʽµÄ¿É¶ÁÐԺܲ¿ÉÒÔÒýÈëһЩ½âÊͱäÁ¿´Ó¶ø²ð·Ö±í´ïʽ£º +???????????????????????§»?????????????????? ``` if line.split(':')[0].strip() == "root": @@ -159,7 +159,7 @@ if username == "root": ... ``` -ʹÓÃĦ¸ù¶¨Àí¼ò»¯Ò»Ð©Âß¼­±í´ïʽ£º +????????????§»????????? ``` if(!a && !b) { @@ -172,9 +172,9 @@ if(a || b) { } ``` -# µÚ 9 Õ ±äÁ¿Óë¿É¶ÁÐÔ +# ?? 9 ?? ?????????? -È¥³ý¿ØÖÆÁ÷±äÁ¿¡£ÔÚÑ­»·ÖÐͨ¹ý break »òÕß return ¿ÉÒÔ¼õÉÙ¿ØÖÆÁ÷±äÁ¿µÄʹÓᣠ+????????????????????????? break ???? return ????????????????????¨¢? ``` boolean done = false; @@ -195,9 +195,9 @@ while(/* condition */) { } ``` -¼õС±äÁ¿×÷ÓÃÓò¡£×÷ÓÃÓòԽС£¬Ô½ÈÝÒ×¶¨Î»µ½±äÁ¿ËùÓÐʹÓõĵط½¡£ +??§³?????????????????§³????????¦Ë?????????????????? -JavaScript ¿ÉÒÔÓñհü¼õС×÷ÓÃÓò¡£ÒÔÏ´úÂëÖÐ submit_form ÊǺ¯Êý±äÁ¿£¬submitted ±äÁ¿¿ØÖƺ¯Êý²»»á±»Ìá½»Á½´Î¡£µÚÒ»¸öʵÏÖÖÐ submitted ÊÇÈ«¾Ö±äÁ¿£¬µÚ¶þ¸öʵÏÖ°Ñ submitted ·Åµ½ÄäÃûº¯ÊýÖУ¬´Ó¶øÏÞÖÆÁËÆð×÷ÓÃÓò·¶Î§¡£ +JavaScript ??????????§³??????????????? submit_form ???????????submitted ????????????????????¦±??????????? submitted ??????????????????? submitted ????????????§µ??????????????????¦¶?? ``` submitted = false; @@ -218,16 +218,16 @@ var submit_form = (function() { } submitted = true; } -}()); // () ʹµÃÍâ²ãÄäÃûº¯ÊýÁ¢¼´Ö´ÐÐ +}()); // () ????????????????????? ``` -JavaScript ÖÐûÓÐÓà var ÉùÃ÷µÄ±äÁ¿¶¼ÊÇÈ«¾Ö±äÁ¿£¬¶øÈ«¾Ö±äÁ¿ºÜÈÝÒ×Ôì³ÉÃÔ»ó£¬Òò´ËÓ¦µ±×ÜÊÇÓà var À´ÉùÃ÷±äÁ¿¡£ +JavaScript ??????? var ????????????????????????????????????????????????????? var ???????????? -±äÁ¿¶¨ÒåµÄλÖÃÓ¦µ±ÀëËüʹÓõÄλÖÃ×î½ü¡£ +?????????¦Ë?????????????¦Ë??????? -**ʵÀý½âÎö** +**???????** -ÔÚÒ»¸öÍøÒ³ÖÐÓÐÒÔÏÂÎı¾ÊäÈë×ֶΣº +?????????????????????????¦²? ``` @@ -236,7 +236,7 @@ JavaScript ``` -ÏÖÔÚÒª½ÓÊÜÒ»¸ö×Ö·û´®²¢°ÑËü·Åµ½µÚÒ»¸ö¿ÕµÄ input ×Ö¶ÎÖУ¬³õʼʵÏÖÈçÏ£º +?????????????????????????????????? input ????§µ???????????? ``` var setFirstEmptyInput = function(new_alue) { @@ -256,11 +256,11 @@ var setFirstEmptyInput = function(new_alue) { } ``` -ÒÔÉÏʵÏÖÓÐÒÔÏÂÎÊÌ⣺ +????????????????? -- found ¿ÉÒÔÈ¥³ý£» -- elem ×÷ÓÃÓò¹ý´ó£» -- ¿ÉÒÔÓà for Ñ­»·´úÌæ while Ñ­»·£» +- found ????????? +- elem ????????? +- ?????? for ??????? while ????? ``` var setFirstEmptyInput = function(new_value) { @@ -277,13 +277,13 @@ var setFirstEmptyInput = function(new_value) { }; ``` -# µÚ 10 Õ ³éÈ¡º¯Êý +# ?? 10 ?? ??????? -¹¤³Ìѧ¾ÍÊǰѴóÎÊÌâ²ð·Ö³ÉСÎÊÌâÔÙ°ÑÕâЩÎÊÌâµÄ½â¾ö·½°¸·Å»ØÒ»Æð¡£ +??????????????????§³?????????§»????????????????? -Ê×ÏÈÓ¦¸ÃÃ÷È·Ò»¸öº¯ÊýµÄ¸ß²ã´ÎÄ¿±ê£¬È»ºó¶ÔÓÚ²»ÊÇÖ±½ÓΪÁËÕâ¸öÄ¿±ê¹¤×÷µÄ´úÂ룬³éÈ¡³öÀ´·Åµ½¶ÀÁ¢µÄº¯ÊýÖС£ +?????????????????????????????????????????????????????????????????????????§³? -½éÉÜÐԵĴúÂ룺 +?????????? ``` int findClostElement(int[] arr) { @@ -304,7 +304,7 @@ int findClostElement(int[] arr) { } ``` -ÒÔÉÏ´úÂëÖÐÑ­»·²¿·ÖÖ÷Òª¼ÆËã¾àÀ룬Õⲿ·Ö²»ÊôÓÚ´úÂë¸ß²ã´ÎÄ¿±ê£¬¸ß²ã´ÎÄ¿±êÊÇѰÕÒ×îС¾àÀëµÄÖµ£¬Òò´Ë¿ÉÒÔ°ÑÕⲿ·Ö´úÌæÌáÈ¡µ½¶ÀÁ¢µÄº¯ÊýÖС£ÕâÑù×öÒ²´øÀ´Ò»¸ö¶îÍâµÄºÃ´¦ÓУº¿ÉÒÔµ¥¶À½øÐвâÊÔ¡¢¿ÉÒÔ¿ìËÙÕÒµ½³ÌÐò´íÎó²¢Ð޸ġ£ +??????????????????????????????????????????????????????????§³?????????????????????????????????????§³???????????????????????§µ???????????§Ó????????????????????????? ``` public int findClostElement(int[] arr) { @@ -321,22 +321,22 @@ public int findClostElement(int[] arr) { } ``` -²¢²»ÊǺ¯Êý³éÈ¡µÄÔ½¶àÔ½ºÃ£¬Èç¹û³éÈ¡¹ý¶à£¬ÔÚÔĶÁ´úÂëµÄʱºò¿ÉÄÜÐèÒª²»¶ÏÌøÀ´ÌøÈ¥¡£Ö»ÓÐÔÚµ±Ç°º¯Êý²»ÐèҪȥÁ˽âijһ¿é´úÂëϸ½Ú¶øÄܹ»±í´ïÆäÄÚÈÝʱ£¬°ÑÕâ¿é´úÂë³éÈ¡³É×Óº¯Êý²ÅÊǺõġ£ +????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -º¯Êý³éȡҲÓÃÓÚ¼õС´úÂëµÄÈßÓà¡£ +?????????????§³????????? -# µÚ 11 Õ һ´ÎÖ»×öÒ»¼þÊ +# ?? 11 ?? ??????????? -Ö»×öÒ»¼þʵĴúÂëºÜÈÝÒ×ÈÃÈËÖªµÀÆäÒª×öµÄÊ£» +?????????????????????????????????? -»ù±¾Á÷³Ì£ºÁгö´úÂëËù×öµÄËùÓÐÈÎÎñ£»°Ñÿ¸öÈÎÎñ²ð·Öµ½²»Í¬µÄº¯Êý£¬»òÕß²»Í¬µÄ¶ÎÂä¡£ +??????????§Ô??????????????????????????????????????????????????? -# µÚ 12 Õ ÓÃ×ÔÈ»ÓïÑÔ±íÊö´úÂë +# ?? 12 ?? ???????????????? -ÏÈÓÃ×ÔÈ»ÓïÑÔÊéд´úÂëÂß¼­£¬Ò²¾ÍÊÇα´úÂ룬ȻºóÔÙд´úÂ룬ÕâÑù´úÂëÂß¼­»á¸üÇåÎú¡£ +?????????????§Õ??????????????¦Á?????????§Õ???????????????????????? -# µÚ 13 Õ ¼õÉÙ´úÂëÁ¿ +# ?? 13 ?? ????????? -²»Òª¹ý¶ÈÉè¼Æ£¬±àÂë¹ý³Ì»áÓкܶà±ä»¯£¬¹ý¶ÈÉè¼ÆµÄÄÚÈݵ½×îºóÍùÍùÊÇÎÞÓõġ£ +????????????????????§Ü??�£?????????????????????????????? -¶àÓñê×¼¿âʵÏÖ¡£ +???????????? diff --git a/notes/计算机æ“�作系统.md b/notes/计算机æ“�作系统.md index 8656dac4..ebbc03c5 100644 --- a/notes/计算机æ“�作系统.md +++ b/notes/计算机æ“�作系统.md @@ -1,248 +1,248 @@ -* [µÚÒ»Õ ¸ÅÊö](#µÚÒ»ÕÂ-¸ÅÊö) - * [²Ù×÷ϵͳ»ù±¾ÌØÕ÷](#²Ù×÷ϵͳ»ù±¾ÌØÕ÷) - * [1. ²¢·¢](#1-²¢·¢) - * [2. ¹²Ïí](#2-¹²Ïí) - * [3. ÐéÄâ](#3-ÐéÄâ) - * [4. Òì²½](#4-Òì²½) - * [ϵͳµ÷ÓÃ](#ϵͳµ÷ÓÃ) - * [ÖжϷÖÀà](#ÖжϷÖÀà) - * [1. ÍâÖжÏ](#1-ÍâÖжÏ) - * [2. Òì³£](#2-Òì³£) - * [3. ÏÝÈë](#3-ÏÝÈë) - * [´óÄں˺Í΢ÄÚºË](#´óÄں˺Í΢ÄÚºË) - * [1. ´óÄÚºË](#1-´óÄÚºË) - * [2. ΢ÄÚºË](#2-΢ÄÚºË) -* [µÚ¶þÕ ½ø³Ì¹ÜÀí](#µÚ¶þÕÂ-½ø³Ì¹ÜÀí) - * [½ø³ÌÓëÏß³Ì](#½ø³ÌÓëÏß³Ì) - * [1. ½ø³Ì](#1-½ø³Ì) - * [2. Ïß³Ì](#2-Ïß³Ì) - * [3. Çø±ð](#3-Çø±ð) - * [½ø³Ì״̬µÄÇл»](#½ø³Ì״̬µÄÇл») - * [µ÷¶ÈËã·¨](#µ÷¶ÈËã·¨) - * [1. Åú´¦ÀíϵͳÖеĵ÷¶È](#1-Åú´¦ÀíϵͳÖеĵ÷¶È) - * [1.1 ÏÈÀ´ÏÈ·þÎñ£¨FCFS£©](#11-ÏÈÀ´ÏÈ·þÎñfcfs) - * [1.2 ¶Ì×÷ÒµÓÅÏÈ£¨SJF£©](#12-¶Ì×÷ÒµÓÅÏÈsjf) - * [1.3 ×î¶ÌÊ£Óàʱ¼äÓÅÏÈ£¨SRTN£©](#13-×î¶ÌÊ£Óàʱ¼äÓÅÏÈsrtn) - * [2. ½»»¥Ê½ÏµÍ³Öеĵ÷¶È](#2-½»»¥Ê½ÏµÍ³Öеĵ÷¶È) - * [2.1 ÓÅÏÈȨÓÅÏÈ](#21-ÓÅÏÈȨÓÅÏÈ) - * [2.2 ʱ¼äƬÂÖת](#22-ʱ¼äƬÂÖת) - * [2.3 ¶à¼¶·´À¡¶ÓÁÐ](#23-¶à¼¶·´À¡¶ÓÁÐ) - * [2.4 ¶Ì½ø³ÌÓÅÏÈ](#24-¶Ì½ø³ÌÓÅÏÈ) - * [3. ʵʱϵͳÖеĵ÷¶È](#3-ʵʱϵͳÖеĵ÷¶È) - * [½ø³Ìͬ²½](#½ø³Ìͬ²½) - * [1. ÁÙ½çÇø](#1-ÁÙ½çÇø) - * [2. ͬ²½Ó뻥³â](#2-ͬ²½Ó뻥³â) - * [3. ÐźÅÁ¿](#3-ÐźÅÁ¿) - * [4. ¹Ü³Ì](#4-¹Ü³Ì) - * [½ø³ÌͨÐÅ](#½ø³ÌͨÐÅ) - * [1. ¹ÜµÀ](#1-¹ÜµÀ) - * [2. ÐźÅÁ¿](#2-ÐźÅÁ¿) - * [3. ÏûÏ¢¶ÓÁÐ](#3-ÏûÏ¢¶ÓÁÐ) - * [4. ÐźÅ](#4-ÐźÅ) - * [5. ¹²ÏíÄÚ´æ](#5-¹²ÏíÄÚ´æ) - * [6. Ì×½Ó×Ö](#6-Ì×½Ó×Ö) - * [¾­µäͬ²½ÎÊÌâ](#¾­µäͬ²½ÎÊÌâ) - * [1. ¶ÁÕß-дÕßÎÊÌâ](#1-¶ÁÕß-дÕßÎÊÌâ) - * [2. ÕÜѧ¼Ò½ø²ÍÎÊÌâ](#2-ÕÜѧ¼Ò½ø²ÍÎÊÌâ) -* [µÚÈýÕ ËÀËø](#µÚÈýÕÂ-ËÀËø) - * [ËÀËøµÄÌõ¼þ](#ËÀËøµÄÌõ¼þ) - * [ËÀËøµÄ´¦Àí·½·¨](#ËÀËøµÄ´¦Àí·½·¨) - * [1. ÍÒÄñ²ßÂÔ](#1-ÍÒÄñ²ßÂÔ) - * [2. ËÀËøÔ¤·À](#2-ËÀËøÔ¤·À) - * [2.1 ÆÆ»µ»¥³âÌõ¼þ](#21-ÆÆ»µ»¥³âÌõ¼þ) - * [2.2 ÆÆ»µÇëÇóÓë±£³ÖÌõ¼þ](#22-ÆÆ»µÇëÇóÓë±£³ÖÌõ¼þ) - * [2.3 ÆÆ»µ²»¿ÉÇÀÕ¼Ìõ¼þ](#23-ÆÆ»µ²»¿ÉÇÀÕ¼Ìõ¼þ) - * [2.4 ÆÆ»µ»·Â·µÈ´ý](#24-ÆÆ»µ»·Â·µÈ´ý) - * [3. ËÀËø±ÜÃâ](#3-ËÀËø±ÜÃâ) - * [3.1 °²È«×´Ì¬](#31-°²È«×´Ì¬) - * [3.2 µ¥¸ö×ÊÔ´µÄÒøÐмÒËã·¨](#32-µ¥¸ö×ÊÔ´µÄÒøÐмÒËã·¨) - * [3.3 ¶à¸ö×ÊÔ´µÄÒøÐмÒËã·¨](#33-¶à¸ö×ÊÔ´µÄÒøÐмÒËã·¨) - * [4. ËÀËø¼ì²âÓëËÀËø»Ö¸´](#4-ËÀËø¼ì²âÓëËÀËø»Ö¸´) - * [4.1 ËÀËø¼ì²âËã·¨](#41-ËÀËø¼ì²âËã·¨) - * [4.2 ËÀËø»Ö¸´](#42-ËÀËø»Ö¸´) -* [µÚËÄÕ ´æ´¢Æ÷¹ÜÀí](#µÚËÄÕÂ-´æ´¢Æ÷¹ÜÀí) - * [ÐéÄâÄÚ´æ](#ÐéÄâÄÚ´æ) - * [·ÖÒ³Óë·Ö¶Î](#·ÖÒ³Óë·Ö¶Î) - * [1. ·ÖÒ³](#1-·ÖÒ³) - * [2. ·Ö¶Î](#2-·Ö¶Î) - * [3. ¶Îҳʽ](#3-¶Îҳʽ) - * [4. ·ÖÒ³Óë·Ö¶ÎÇø±ð](#4-·ÖÒ³Óë·Ö¶ÎÇø±ð) - * [Ò³ÃæÖû»Ëã·¨](#Ò³ÃæÖû»Ëã·¨) - * [1. ×î¼Ñ£¨Optimal£©](#1-×î¼Ñoptimal) - * [2. ÏȽøÏȳö£¨FIFO£©](#2-ÏȽøÏȳöfifo) - * [3. ×î½ü×î¾ÃδʹÓã¨LRU£¬Least Recently Used£©](#3-×î½ü×î¾ÃδʹÓÃlru£¬least-recently-used) - * [4. ʱÖÓ£¨Clock£©](#4-ʱÖÓclock) -* [µÚÎåÕ É豸¹ÜÀí](#µÚÎåÕÂ-É豸¹ÜÀí) - * [´ÅÅ̵÷¶ÈËã·¨](#´ÅÅ̵÷¶ÈËã·¨) - * [1. ÏÈÀ´ÏÈ·þÎñ£¨FCFS£¬First Come First Serverd£©](#1-ÏÈÀ´ÏÈ·þÎñfcfs£¬first-come-first-serverd) - * [2. ×î¶ÌѰµÀʱ¼äÓÅÏÈ£¨SSTF£¬Shortest Seek Time First£©](#2-×î¶ÌѰµÀʱ¼äÓÅÏÈsstf£¬shortest-seek-time-first) - * [3. ɨÃèËã·¨£¨SCAN£©](#3-ɨÃèËã·¨scan) - * [4. Ñ­»·É¨ÃèËã·¨£¨CSCAN£©](#4-Ñ­»·É¨ÃèËã·¨cscan) -* [²Î¿¼×ÊÁÏ](#²Î¿¼×ÊÁÏ) +* [????? ????](#?????-????) + * [??????????????](#??????????????) + * [1. ????](#1-????) + * [2. ????](#2-????) + * [3. ????](#3-????) + * [4. ??](#4-??) + * [??????](#??????) + * [?§Ø????](#?§Ø????) + * [1. ???§Ø?](#1-???§Ø?) + * [2. ??](#2-??) + * [3. ????](#3-????) + * [??????????](#??????????) + * [1. ?????](#1-?????) + * [2. ????](#2-????) +* [????? ???????](#?????-???????) + * [?????????](#?????????) + * [1. ????](#1-????) + * [2. ???](#2-???) + * [3. ????](#3-????) + * [?????????§Ý?](#?????????§Ý?) + * [??????](#??????) + * [1. ?????????§Ö????](#1-?????????§Ö????) + * [1.1 ?????????FCFS??](#11-?????????fcfs??) + * [1.2 ??????????SJF??](#12-??????????sjf??) + * [1.3 ??????????????SRTN??](#13-??????????????srtn??) + * [2. ????????§Ö????](#2-????????§Ö????) + * [2.1 ?????????](#21-?????????) + * [2.2 ???????](#22-???????) + * [2.3 ??????????](#23-??????????) + * [2.4 ?????????](#24-?????????) + * [3. ?????§Ö????](#3-?????§Ö????) + * [???????](#???????) + * [1. ?????](#1-?????) + * [2. ???????](#2-???????) + * [3. ?????](#3-?????) + * [4. ???](#4-???) + * [???????](#???????) + * [1. ???](#1-???) + * [2. ?????](#2-?????) + * [3. ???????](#3-???????) + * [4. ???](#4-???) + * [5. ???????](#5-???????) + * [6. ?????](#6-?????) + * [???????????](#???????????) + * [1. ????-§Õ??????](#1-????-§Õ??????) + * [2. ????????????](#2-????????????) +* [?????? ????](#??????-????) + * [??????????](#??????????) + * [???????????](#???????????) + * [1. ???????](#1-???????) + * [2. ???????](#2-???????) + * [2.1 ???????????](#21-???????????) + * [2.2 ???????????????](#22-???????????????) + * [2.3 ??????????????](#23-??????????????) + * [2.4 ?????¡¤???](#24-?????¡¤???) + * [3. ????????](#3-????????) + * [3.1 ?????](#31-?????) + * [3.2 ????????????§Þ???](#32-????????????§Þ???) + * [3.3 ???????????§Þ???](#33-???????????§Þ???) + * [4. ????????????????](#4-????????????????) + * [4.1 ?????????](#41-?????????) + * [4.2 ???????](#42-???????) +* [?????? ?›¥??????](#??????-?›¥??????) + * [???????](#???????) + * [???????](#???????) + * [1. ???](#1-???) + * [2. ???](#2-???) + * [3. ????](#3-????) + * [4. ???????????](#4-???????????) + * [????????](#????????) + * [1. ????Optimal??](#1-????optimal??) + * [2. ????????FIFO??](#2-????????fifo??) + * [3. ??????¦Ä????LRU??Least Recently Used??](#3-??????¦Ä????lru??least-recently-used??) + * [4. ????Clock??](#4-????clock??) +* [?????? ?õô????](#??????-?õô????) + * [?????????](#?????????) + * [1. ?????????FCFS??First Come First Serverd??](#1-?????????fcfs??first-come-first-serverd??) + * [2. ??????????????SSTF??Shortest Seek Time First??](#2-??????????????sstf??shortest-seek-time-first??) + * [3. ???????SCAN??](#3-???????scan??) + * [4. ??????????CSCAN??](#4-??????????cscan??) +* [?¦Ï?????](#?¦Ï?????) -# µÚÒ»Õ ¸ÅÊö +# ????? ???? -## ²Ù×÷ϵͳ»ù±¾ÌØÕ÷ +## ?????????????? -### 1. ²¢·¢ +### 1. ???? -²¢·¢ÐÔÊÇÖ¸ºê¹ÛÉÏÔÚÒ»¶Îʱ¼äÄÚÄÜͬʱÔËÐжà¸ö³ÌÐò£¬¶ø²¢ÐÐÐÔÔòָͬһʱ¿ÌÄÜÔËÐжà¸öÖ¸Áî¡£ +???????????????????????????????§Ø??????????????????????????§Ø????þŸ -²¢ÐÐÐèÒªÓ²¼þÖ§³Ö£¬Èç¶àÁ÷Ë®Ïß»òÕß¶à´¦ÀíÆ÷¡£ +???????????????????????????????? -²Ù×÷ϵͳͨ¹ýÒýÈë½ø³ÌºÍỊ̈߳¬Ê¹µÃ³ÌÐòÄܹ»²¢·¢ÔËÐС£ +???????????????????????¨®?????????????§³? -### 2. ¹²Ïí +### 2. ???? -¹²ÏíÊÇָϵͳÖеÄ×ÊÔ´¿ÉÒÔ¹©¶à¸ö²¢·¢µÄ½ø³Ì¹²Í¬Ê¹Óᣠ+??????????§Ö?????????????????????????¨¢? -ÓÐÁ½ÖÖ¹²Ïí·½Ê½£º»¥³â¹²ÏíºÍͬʱ¹²Ïí¡£ +????????????????????????? -»¥³â¹²ÏíµÄ×ÊÔ´³ÆÎªÁÙ½ç×ÊÔ´£¬ÀýÈç´òÓ¡»úµÈ£¬ÔÚͬһʱ¼äÖ»ÔÊÐíÒ»¸ö½ø³Ì·ÃÎÊ£¬·ñÔò»á³öÏÖ´íÎó£¬ÐèÒªÓÃͬ²½»úÖÆÀ´ÊµÏÖ¶ÔÁÙ½ç×ÊÔ´µÄ·ÃÎÊ¡£ +???????????????????????????????????????????????????????????????????????????????????????????????? -### 3. ÐéÄâ +### 3. ???? -ÐéÄâ¼¼Êõ°ÑÒ»¸öÎïÀíʵÌåת»»Îª¶à¸öÂß¼­ÊµÌå¡£Ö÷ÒªÓÐÁ½ÖÖÐéÄâ¼¼Êõ£ºÊ±·Ö¸´Óü¼ÊõºÍ¿Õ·Ö¸´Óü¼Êõ£¬ÀýÈç¶à¸ö½ø³ÌÄÜÔÚͬһ¸ö´¦ÀíÆ÷Éϲ¢·¢Ö´ÐÐʹÓÃÁËʱ·Ö¸´Óü¼Êõ£¬ÈÃÿ¸ö½ø³ÌÂÖÁ÷Õ¼Óд¦ÀíÆ÷£¬Ã¿´ÎÖ»Ö´ÐÐһС¸öʱ¼äƬ²¢¿ìËÙÇл»£¬ÕâÑù¾ÍºÃÏñÓжà¸ö´¦ÀíÆ÷½øÐд¦Àí¡£ +??????????????????????????????‰^??????????????????????¨¹?????????¨¹???????????????????????????????????????????????¨¹????????????????????§Õ???????????????§³?????????????§Ý?????????????§Ø???????????§Õ??? -### 4. Òì²½ +### 4. ?? -Òì²½ÊÇÖ¸½ø³Ì²»ÊÇÒ»´ÎÐÔÖ´ÐÐÍê±Ï£¬¶øÊÇ×ß×ßͣͣ£¬ÒÔ²»¿ÉÖªµÄËÙ¶ÈÏòÇ°ÍÆ½ø¡£ +??????????????????????????????????????????????????????? -## ϵͳµ÷Óà +## ?????? -Èç¹ûÒ»¸ö½ø³ÌÔÚÓû§Ì¬ÐèÒªÓõ½²Ù×÷ϵͳµÄһЩ¹¦ÄÜ£¬¾ÍÐèҪʹÓÃϵͳµ÷ÓôӶøÏÝÈëÄںˣ¬ÓɲÙ×÷ϵͳ´úΪÍê³É¡£ +???????????????????????????????§»?????????????????????????????????????????¨À? -¿ÉÒÔÓÉϵͳµ÷ÓÃÇëÇóµÄ¹¦ÄÜÓÐÉ豸¹ÜÀí¡¢Îļþ¹ÜÀí¡¢½ø³Ì¹ÜÀí¡¢½ø³ÌͨÐÅ¡¢´æ´¢Æ÷¹ÜÀíµÈ¡£ +???????????????????????õô???????????????????????????›¥???????? -## ÖжϷÖÀà +## ?§Ø???? -### 1. ÍâÖÐ¶Ï +### 1. ???§Ø? -ÓÉ CPU Ö´ÐÐÖ¸ÁîÒÔÍâµÄʼþÒýÆð£¬Èç I/O ½áÊøÖжϣ¬±íʾÉ豸ÊäÈë/Êä³ö´¦ÀíÒѾ­Íê³É£¬´¦ÀíÆ÷Äܹ»·¢ËÍÏÂÒ»¸öÊäÈë/Êä³öÇëÇó¡£´ËÍ⻹ÓÐʱÖÓÖжϡ¢¿ØÖÆÌ¨Öжϵȡ£ +?? CPU ???????????????????? I/O ?????§Ø??????õô????/????????????????????????????????????/????????????????§Ø????????§Ø??? -### 2. Òì³£ +### 2. ?? -ÓÉ CPU Ö´ÐÐÖ¸ÁîµÄÄÚ²¿Ê¼þÒýÆð£¬Èç·Ç·¨²Ù×÷Âë¡¢µØÖ·Ô½½ç¡¢ËãÊõÒç³öµÈ¡£ +?? CPU ????????????????????????????????³†?????????? -### 3. ÏÝÈë +### 3. ???? -ÔÚÓû§³ÌÐòÖÐʹÓÃϵͳµ÷Óᣠ+???????????????????¨¢? -## ´óÄں˺Í΢ÄÚºË +## ?????????? -### 1. ´óÄÚºË +### 1. ????? -´óÄÚºËÊǽ«²Ù×÷ϵͳ¹¦ÄÜ×÷Ϊһ¸ö½ôÃܽáºÏµÄÕûÌå·Åµ½Äںˣ¬ÓÉÓÚ¸÷Ä£¿é¹²ÏíÐÅÏ¢£¬Òò´ËÓкܸߵÄÐÔÄÜ¡£ +????????????????????????????????????????????????ûs???????????§Ü???????? -### 2. ΢ÄÚºË +### 2. ???? -ÓÉÓÚ²Ù×÷ϵͳ²»¶Ï¸´ÔÓ£¬Òò´Ë½«Ò»²¿·Ö²Ù×÷ϵͳ¹¦ÄÜÒÆ³öÄںˣ¬´Ó¶ø½µµÍÄں˵ĸ´ÔÓÐÔ¡£ÒƳöµÄ²¿·Ö¸ù¾Ý·Ö²ãµÄÔ­Ôò»®·Ö³ÉÈô¸É·þÎñ£¬Ï໥¶ÀÁ¢¡£µ«ÊÇÐèҪƵ·±µØÔÚÓû§Ì¬ºÍºËÐÄ̬֮¼ä½øÐÐÇл»£¬»áÓÐÒ»¶¨µÄÐÔÄÜËðʧ¡£ +????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????§Ý????????????????????? -# µÚ¶þÕ ½ø³Ì¹ÜÀí +# ????? ??????? -## ½ø³ÌÓëÏß³Ì +## ????????? -### 1. ½ø³Ì +### 1. ???? -½ø³ÌÊDzÙ×÷ϵͳ½øÐÐ×ÊÔ´·ÖÅäµÄ»ù±¾µ¥Î»¡£ +????????????????????????????¦Ë?? -½ø³Ì¿ØÖÆ¿é (Process Control Block, PCB) ÃèÊö½ø³ÌµÄ»ù±¾ÐÅÏ¢ºÍÔËÐÐ״̬£¬ËùνµÄ´´½¨½ø³ÌºÍ³·Ïú½ø³Ì£¬¶¼ÊÇÖ¸¶Ô PCB µÄ²Ù×÷¡£ +???????? (Process Control Block, PCB) ???????????????????????????¦Í????????????????????????? PCB ??????? -### 2. Ïß³Ì +### 2. ??? -Ò»¸öÏß³ÌÖпÉÒÔÓжà¸öỊ̈߳¬ÊǶÀÁ¢µ÷¶ÈµÄ»ù±¾µ¥Î»¡£Í¬Ò»¸ö½ø³ÌÖеĶà¸öÏß³ÌÖ®¼ä¿ÉÒÔ²¢·¢Ö´ÐУ¬ËüÃǹ²Ïí½ø³Ì×ÊÔ´¡£ +???????§á????§Ø?????????????????????¦Ë???????????§Ö?????????????????§µ???????????????? -### 3. Çø±ð +### 3. ???? -¢Ù ÓµÓÐ×ÊÔ´£º½ø³ÌÊÇ×ÊÔ´·ÖÅäµÄ»ù±¾µ¥Î»£¬µ«ÊÇÏ̲߳»ÓµÓÐ×ÊÔ´£¬Ï߳̿ÉÒÔ·ÃÎÊÂÊÊô½ø³ÌµÄ×ÊÔ´¡£ +?? ???????????????????????????¦Ë????????????????????????????????????????? -¢Ú µ÷¶È£ºÏß³ÌÊǶÀÁ¢µ÷¶ÈµÄ»ù±¾µ¥Î»£¬ÔÚͬһ½ø³ÌÖУ¬Ï̵߳ÄÇл»²»»áÒýÆð½ø³ÌÇл»£¬´ÓÒ»¸ö½ø³ÌÄÚµÄÏß³ÌÇл»µ½ÁíÒ»¸ö½ø³ÌÖеÄÏß³Ìʱ£¬»áÒýÆð½ø³ÌÇл»¡£ +?? ???????????????????????¦Ë???????????§µ??????§Ý?????????????§Ý???????????????????§Ý?????????????§Ö?????????????????§Ý??? -¢Û ϵͳ¿ªÏú£ºÓÉÓÚ´´½¨»ò³·Ïú½ø³Ìʱ£¬ÏµÍ³¶¼ÒªÎªÖ®·ÖÅä»ò»ØÊÕ×ÊÔ´£¬ÈçÄÚ´æ¿Õ¼ä¡¢I/O É豸µÈ£¬Òò´Ë²Ù×÷ϵͳËù¸¶³öµÄ¿ªÏúÔ¶´óÓÚ´´½¨»ò³·ÏúÏß³ÌʱµÄ¿ªÏú¡£ÀàËÆµØ£¬ÔÚ½øÐнø³ÌÇл»Ê±£¬Éæ¼°µ±Ç°Ö´Ðнø³Ì CPU »·¾³µÄ±£´æ¼°Ðµ÷¶È½ø³Ì CPU »·¾³µÄÉèÖ᣶øÏß³ÌÇл»Ê±Ö»Ðè±£´æºÍÉèÖÃÉÙÁ¿¼Ä´æÆ÷ÄÚÈÝ£¬¿ªÏúºÜС¡£´ËÍ⣬ÓÉÓÚͬһ½ø³ÌÄڵĶà¸öÏ̹߳²Ïí½ø³ÌµÄµØÖ·¿Õ¼ä£¬Òò´Ë£¬ÕâЩÏß³ÌÖ®¼äµÄͬ²½ÓëͨÐŷdz£ÈÝÒ×ʵÏÖ£¬ÉõÖÁÎÞÐè²Ù×÷ϵͳµÄ¸ÉÔ¤¡£ +?? ?????????????????????????????????????????????????????I/O ?õô???????????????????????????????????????????????????????§ß????§Ý?????�p?????§ß??? CPU ????????�p???????? CPU ?????????¨¢???????§Ý????Øb???????????????????????????§³??????????????????????????????????????????§»???????????????????????????????????????????? -¢Ü ͨÐÅ·½Ã棺½ø³Ì¼äͨÐÅ (IPC) ÐèÒª½ø³Ìͬ²½ºÍ»¥³âÊֶεĸ¨Öú£¬ÒÔ±£Ö¤Êý¾ÝµÄÒ»ÖÂÐÔ£¬¶øÏ̼߳ä¿ÉÒÔͨ¹ýÖ±½Ó¶Á/д½ø³ÌÊý¾Ý¶Î£¨ÈçÈ«¾Ö±äÁ¿£©À´½øÐÐͨÐÅ¡£ +?? ?????¹×???????? (IPC) ?????????????????¦Å?????????????????????????????????????/§Õ????????¦²????????????????????? -¾ÙÀý£ºQQ ºÍ ä¯ÀÀÆ÷ÊÇÁ½¸ö½ø³Ì£¬ä¯ÀÀÆ÷½ø³ÌÀïÃæÓкܶàỊ̈߳¬ÀýÈç http ÇëÇóÏ̡߳¢Ê¼þÏìÓ¦Ï̡߳¢äÖȾÏ̵߳ȵȣ¬Ï̵߳IJ¢·¢Ö´ÐÐʹµÃÔÚä¯ÀÀÆ÷Öеã»÷Ò»¸öÐÂÁ´½Ó´Ó¶ø·¢Æð http ÇëÇóʱ£¬ä¯ÀÀÆ÷»¹¿ÉÒÔÏìÓ¦Óû§µÄÆäËüʼþ¡£ +??????QQ ?? ??????????????????????????????§Ü?????????? http ????????????????????????????????????????????????§Ö????????????????? http ??????????????????????????????????? -## ½ø³Ì״̬µÄÇл» +## ?????????§Ý? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1706ce58-a081-4fed-9b36-c3c0d7e22b3a.jpg) -×èÈû״̬ÊÇȱÉÙÐèÒªµÄ×ÊÔ´´Ó¶øÓÉÔËÐÐ״̬ת»»¶øÀ´£¬µ«ÊǸÃ×ÊÔ´²»°üÀ¨ CPU£¬È±ÉÙ CPU »áÈýø³Ì´ÓÔËÐÐ̬ת»»Îª¾ÍÐ÷̬¡£ +????????????????????????????????????????????????????? CPU????? CPU ???????????????????????? -Ö»ÓоÍÐ÷̬ºÍÔËÐÐ̬¿ÉÒÔÏ໥ת»»£¬ÆäËüµÄ¶¼Êǵ¥Ïòת»»¡£¾ÍÐ÷״̬µÄ½ø³Ìͨ¹ýµ÷¶ÈËã·¨´Ó¶ø»ñµÃ CPU ʱ¼ä£¬×ªÎªÔËÐÐ״̬£»¶øÔËÐÐ״̬µÄ½ø³Ì£¬ÔÚ·ÖÅ䏸ËüµÄ CPU ʱ¼äƬÓÃÍêÖ®ºó¾Í»áתΪ¾ÍÐ÷״̬£¬µÈ´ýÏÂÒ»´Îµ÷¶È¡£ +??§à????????????????????????????????????????????????????????????????? CPU ????????????????????????????????????? CPU ??????????????????????????????¦Å???? -## µ÷¶ÈËã·¨ +## ?????? -ÐèÒªÕë¶Ô²»Í¬»·¾³À´ÌÖÂÛµ÷¶ÈËã·¨¡£ +????????????????????????? -### 1. Åú´¦ÀíϵͳÖеĵ÷¶È +### 1. ?????????§Ö???? -#### 1.1 ÏÈÀ´ÏÈ·þÎñ£¨FCFS£© +#### 1.1 ?????????FCFS?? -first-come first-serverd¡£ +first-come first-serverd?? -µ÷¶È×îÏȽøÈë¾ÍÐ÷¶ÓÁеÄ×÷Òµ¡£ +?????????????????§Ö?????? -ÓÐÀûÓÚ³¤×÷Òµ£¬µ«²»ÀûÓÚ¶Ì×÷Òµ£¬ÒòΪ¶Ì×÷Òµ±ØÐëÒ»Ö±µÈ´ýÇ°ÃæµÄ³¤×÷ÒµÖ´ÐÐÍê±Ï²ÅÄÜÖ´ÐУ¬¶ø³¤×÷ÒµÓÖÐèÒªÖ´Ðкܳ¤Ê±¼ä£¬Ôì³ÉÁ˶Ì×÷ÒµµÈ´ýʱ¼ä¹ý³¤¡£ +??????????????????????????????????????????????????????????????§µ???????????????§Ü????????????????????????? -#### 1.2 ¶Ì×÷ÒµÓÅÏÈ£¨SJF£© +#### 1.2 ??????????SJF?? -shortest job first¡£ +shortest job first?? -µ÷¶È¹À¼ÆÔËÐÐʱ¼ä×î¶ÌµÄ×÷Òµ¡£ +??????????????????????? -³¤×÷ÒµÓпÉÄÜ»á¶öËÀ£¬´¦ÓÚÒ»Ö±µÈ´ý¶Ì×÷ÒµÖ´ÐÐÍê±ÏµÄ״̬¡£Èç¹ûÒ»Ö±ÓжÌ×÷Òµµ½À´£¬ÄÇô³¤×÷ÒµÓÀÔ¶µÃ²»µ½µ÷¶È¡£ +??????§á????????????????????????????????????????§Ø??????????????????????¨°???????? -#### 1.3 ×î¶ÌÊ£Óàʱ¼äÓÅÏÈ£¨SRTN£© +#### 1.3 ??????????????SRTN?? -shortest remaining time next¡£ +shortest remaining time next?? -### 2. ½»»¥Ê½ÏµÍ³Öеĵ÷¶È +### 2. ????????§Ö???? -#### 2.1 ÓÅÏÈȨÓÅÏÈ +#### 2.1 ????????? -³ýÁË¿ÉÒÔÊÖ¶¯¸³ÓèÓÅÏÈȨ֮Í⣬»¹¿ÉÒÔ°ÑÏìÓ¦±È×÷ΪÓÅÏÈȨ£¬ÕâÖÖµ÷¶È·½Ê½½Ð×ö¸ßÏìÓ¦±ÈÓÅÏȵ÷¶ÈËã·¨¡£ +??????????????????????????????????????????????????????????????????????????? -ÏìÓ¦±È = (µÈ´ýʱ¼ä + ÒªÇó·þÎñʱ¼ä) / ÒªÇó·þÎñʱ¼ä = ÏìӦʱ¼ä / ÒªÇó·þÎñʱ¼ä +????? = (?????? + ?????????) / ????????? = ?????? / ????????? -ÕâÖÖµ÷¶ÈËã·¨Ö÷ÒªÊÇΪÁ˽â¾ö SJF Öг¤×÷Òµ¿ÉÄÜ»á¶öËÀµÄÎÊÌ⣬ÒòÎªËæ×ŵȴýʱ¼äµÄÔö³¤£¬ÏìÓ¦±ÈÒ²»áÔ½À´Ô½¸ß¡£ +??????????????????? SJF ?§Ô???????????????????????????????????????????????????? -#### 2.2 ʱ¼äƬÂÖת +#### 2.2 ??????? -½«ËùÓоÍÐ÷½ø³Ì°´ FCFS µÄÔ­ÔòÅųÉÒ»¸ö¶ÓÁУ¬Ã¿´Îµ÷¶Èʱ£¬°Ñ CPU ·ÖÅ䏸¶ÓÊ×½ø³Ì£¬¸Ã½ø³Ì¿ÉÒÔÖ´ÐÐÒ»¸öʱ¼äƬ¡£µ±Ê±¼äƬÓÃÍêʱ£¬ÓɼÆÊ±Æ÷·¢³öʱÖÓÖжϣ¬µ÷¶È³ÌÐò±ãÍ£Ö¹¸Ã½ø³ÌµÄÖ´ÐУ¬²¢½«ËüËÍÍù¾ÍÐ÷¶ÓÁеÄĩβ£¬Í¬Ê±¼ÌÐø°Ñ CPU ·ÖÅ䏸¶ÓÊ׵Ľø³Ì¡£ +?????§à???????? FCFS ??????????????§µ???¦Å???????? CPU ????????????????????????????????????????????????????????????§Ø????????????????????§µ??????????????????§Ö??¦Â?????????? CPU ?????????????? -ʱ¼äƬÂÖתËã·¨µÄЧÂʺÍʱ¼äƬÓкܴó¹ØÏµ¡£ÒòΪÿ´Î½ø³ÌÇл»¶¼Òª±£´æ½ø³ÌµÄÐÅÏ¢²¢ÇÒÔØÈëнø³ÌµÄÐÅÏ¢£¬Èç¹ûʱ¼äƬ̫¶Ì£¬½ø³ÌÇл»Ì«Æµ·±£¬ÔÚ½ø³ÌÇл»ÉϾͻỨ¹ý¶àʱ¼ä¡£ +???????????§¹????????§Ü???????????¦Í????§Ý??????????????????????????????????????????????????§Ý?????????????§Ý???????????? -#### 2.3 ¶à¼¶·´À¡¶ÓÁÐ +#### 2.3 ?????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/042cf928-3c8e-4815-ae9c-f2780202c68f.png) -¢Ù ÉèÖöà¸ö¾ÍÐ÷¶ÓÁУ¬²¢Îª¸÷¸ö¶ÓÁи³Ó費ͬµÄÓÅÏȼ¶¡£µÚÒ»¸ö¶ÓÁеÄÓÅÏȼ¶×î¸ß£¬µÚ¶þ¸ö¶ÓÁдÎÖ®£¬ÆäÓà¸÷¶ÓÁеÄÓÅÏÈȨÖð¸ö½µµÍ¡£¸ÃËã·¨¸³Óè¸÷¸ö¶ÓÁÐÖнø³ÌÖ´ÐÐʱ¼äƬµÄ´óСҲ¸÷²»Ïàͬ£¬ÔÚÓÅÏÈȨԽ¸ßµÄ¶ÓÁÐÖУ¬ÎªÃ¿¸ö½ø³ÌËù¹æ¶¨µÄÖ´ÐÐʱ¼äƬ¾ÍԽС¡£ +?? ?????????????§µ???????????§Ú??ÙM??????????????????§Ö??????????????????§Õ????????????§Ö??????????????????????????????§ß?????????????§³?????????????????????????§µ????????????ÕÇ????????????§³?? -¢Ú µ±Ò»¸öнø³Ì½øÈëÄÚ´æºó£¬Ê×ÏȽ«Ëü·ÅÈëµÚÒ»¶ÓÁеÄĩ⣬°´ FCFS Ô­ÔòÅŶӵȴýµ÷¶È¡£µ±ÂÖµ½¸Ã½ø³ÌÖ´ÐÐʱ£¬ÈçËüÄÜÔÚ¸Ãʱ¼äƬÄÚÍê³É£¬±ã¿É×¼±¸³·Àëϵͳ£»Èç¹ûËüÔÚÒ»¸öʱ¼äƬ½áÊøÊ±ÉÐδÍê³É£¬µ÷¶È³ÌÐò±ã½«¸Ã½ø³ÌתÈëÏÂÒ»¸ö¶ÓÁеĶÓβ¡£ +?? ?????????????????????????????????§Ö??¦Â???? FCFS ???????????????????????????????????????????????????????????????????????????????????¦Ä????????????????????????????§Ö??¦Â?? -¢Û ½öµ±Ç° i -1 ¸ö¶ÓÁоù¿Õʱ£¬²Å»áµ÷¶ÈµÚ i ¶ÓÁÐÖеĽø³ÌÔËÐС£ +?? ????? i -1 ?????§à????????????? i ?????§Ö???????§³? -Óŵ㣺ʵʱÐԺã¬Ò²ÊʺÏÔËÐжÌ×÷ÒµºÍ³¤×÷Òµ¡£ +????????????????§Ø???????????? -#### 2.4 ¶Ì½ø³ÌÓÅÏÈ +#### 2.4 ????????? -### 3. ʵʱϵͳÖеĵ÷¶È +### 3. ?????§Ö???? -ʵʱϵͳҪһ¸ö·þÎñÇëÇóÔÚÒ»¸öÈ·¶¨Ê±¼äÄڵõ½ÏìÓ¦¡£ +???????????????????????????????????? -·ÖΪӲʵʱºÍÈíʵʱ£¬Ç°Õß±ØÐëÂú×ã¾ø¶ÔµÄ½ØÖ¹Ê±¼ä£¬ºóÕß¿ÉÒÔÈÝÈÌÒ»¶¨µÄ³¬Ê±¡£ +????????????????????????????????????????????????????? -## ½ø³Ìͬ²½ +## ??????? -### 1. ÁÙ½çÇø +### 1. ????? -¶ÔÁÙ½ç×ÊÔ´½øÐзÃÎʵÄÄǶδúÂë³ÆÎªÁÙ½çÇø¡£ +???????????§Ù??????¦Ä???????????? -ΪÁË»¥³â·ÃÎÊÁÙ½ç×ÊÔ´£¬Ã¿¸ö½ø³ÌÔÚ½øÈëÁÙ½çÇøÖ®Ç°£¬ÐèÒªÏȽøÐмì²é¡£ +?????????????????????????????????????????????§Þ?î• ```html // entry section @@ -250,44 +250,44 @@ shortest remaining time next // exit section ``` -### 2. ͬ²½Ó뻥³â +### 2. ??????? -ͬ²½Ö¸¶à¸ö½ø³Ì°´Ò»¶¨Ë³ÐòÖ´ÐУ»»¥³âÖ¸¶à¸ö½ø³ÌÔÚͬһʱ¿ÌÖ»ÓÐÒ»¸ö½ø³ÌÄܽøÈëÁÙ½çÇø¡£ +????????????????????§µ?????????????????????????????????????????? -ͬ²½ÊÇÔÚ¶ÔÁÙ½çÇø»¥³â·ÃÎʵĻù´¡ÉÏ£¬Í¨¹ýÆäËü»úÖÆÀ´ÊµÏÖÓÐÐò·ÃÎʵġ£ +???????????????????????????????????????????????????? -### 3. ÐźÅÁ¿ +### 3. ????? -**ÐźÅÁ¿£¨Samaphore£©**ÊÇÒ»¸öÕûÐͱäÁ¿£¬¿ÉÒÔ¶ÔÆäÖ´ÐÐ down ºÍ up ²Ù×÷£¬Ò²¾ÍÊdz£¼ûµÄ P ºÍ V ²Ù×÷¡£ +**???????Samaphore??**???????????????????????? down ?? up ???????????????? P ?? V ?????? -- **down** : Èç¹ûÐźÅÁ¿´óÓÚ 0 £¬Ö´ÐÐ - 1 ²Ù×÷£»Èç¹ûÐźÅÁ¿µÈÓÚ 0£¬½«½ø³Ì˯Ãߣ¬µÈ´ýÐźÅÁ¿´óÓÚ 0£» -- **up**£º¶ÔÐźÅÁ¿Ö´ÐÐ + 1 ²Ù×÷£¬²¢ÇÒ»½ÐÑ˯ÃߵĽø³Ì£¬Èýø³ÌÍê³É down ²Ù×÷¡£ +- **down** : ???????????? 0 ????? - 1 ?????????????????? 0???????????????????????? 0?? +- **up**???????????? + 1 ????????????????????????????? down ?????? -down ºÍ up ²Ù×÷ÐèÒª±»Éè¼Æ³ÉÔ­Ó²»¿É·Ö¸î£¬Í¨³£µÄ×ö·¨ÊÇÔÚÖ´ÐÐÕâЩ²Ù×÷µÄʱºòÆÁ±ÎÖжϡ£ +down ?? up ????????????????????????????????????????§»??????????????§Ø?? -Èç¹ûÐźÅÁ¿µÄȡֵֻÄÜΪ 0 »òÕß 1£¬ÄÇô¾Í³ÉΪÁË**»¥³âÁ¿£¨Mutex£©**£¬0 ±íʾÁÙ½çÇøÒѾ­¼ÓËø£¬1 ±íʾÁÙ½çÇø½âËø¡£ +???????????????? 0 ???? 1???????????**????????Mutex??**??0 ?????????????????1 ?????????????? ```c typedef int samaphore; samaphore mutex = 1; void P1() { down(mutex); - // ÁÙ½çÇø + // ????? up(mutex); } void P2() { down(mutex); - // ÁÙ½çÇø + // ????? up(mutex); } ``` -**ʹÓÃÐźÅÁ¿ÊµÏÖÉú²úÕß-Ïû·ÑÕßÎÊÌâ** +**?????????????????-??????????** -ʹÓÃÒ»¸ö»¥³âÁ¿ mutex À´¶ÔÁÙ½ç×ÊÔ´½øÐзÃÎÊ£»empty ¼Ç¼¿Õ»º³åÇøµÄÊýÁ¿£¬full ¼Ç¼Âú»º³åÇøµÄÊýÁ¿¡£ +???????????? mutex ?????????????§Ù????empty ??????????????????full ??????????????????? -×¢Ò⣬±ØÐëÏÈÖ´ÐÐ down ²Ù×÷ÔÙÓû¥³âÁ¿¶ÔÁÙ½çÇø¼ÓËø£¬·ñÔò»á³öÏÖËÀËø¡£Èç¹û¶¼ÏȶÔÁÙ½çÇø¼ÓËø£¬È»ºóÔÙÖ´ÐÐ down ²Ù×÷£¬¿¼ÂÇÕâÖÖÇé¿ö£ºÉú²úÕß¶ÔÁÙ½çÇø¼ÓËøºó£¬Ö´ÐÐ down(empty) ²Ù×÷£¬·¢ÏÖ empty = 0£¬´ËʱÉú³ÉÕß˯Ãß¡£Ïû·ÑÕß´Ëʱ²»ÄܽøÈëÁÙ½çÇø£¬ÒòΪÉú²úÕß¶ÔÁÙ½çÇø¼ÓËøÁË£¬Ò²¾ÍÎÞ·¨¶ÔÖ´ÐÐ up(empty) ²Ù×÷£¬ÄÇôÉú²úÕߺÍÏû·ÑÕ߾ͻáÒ»Ö±µÈ´ýÏÂÈ¥¡£ +???????????? down ??????????????????????????????????????????????????????????????????? down ???????????????????????????????????????? down(empty) ?????????? empty = 0?????????????????????????????????????????????????????????????????????? up(empty) ?????????????????????????????????? ```c #define N 100 @@ -319,11 +319,11 @@ void consumer() { } ``` -### 4. ¹Ü³Ì +### 4. ??? -ʹÓÃÐźÅÁ¿»úÖÆÊµÏÖµÄÉú²úÕßÏû·ÑÕßÎÊÌâÐèÒª¿Í»§¶Ë´úÂë×öºÜ¶à¿ØÖÆ£¬¶ø¹Ü³Ì°Ñ¿ØÖƵĴúÂë¶ÀÁ¢³öÀ´£¬²»½ö²»ÈÝÒ׳ö´í£¬Ò²Ê¹µÃ¿Í»§¶Ë´úÂëµ÷ÓøüÈÝÒס£ +??????????????????????????????????????????????????????????????????????????????????????????????????????????? -c ÓïÑÔ²»Ö§³Ö¹Ü³Ì£¬ÏÂÃæµÄʾÀý´úÂëʹÓÃÁËÀà Pascal ÓïÑÔÀ´ÃèÊö¹Ü³Ì¡£Ê¾Àý´úÂëÖеĹܳÌÌṩÁË insert() ºÍ remove() ·½·¨£¬¿Í»§¶Ë´úÂëͨ¹ýµ÷ÓÃÕâÁ½¸ö·½·¨À´½â¾öÉú²úÕß-Ïû·ÑÕßÎÊÌâ¡£ +c ?????????????????????????????? Pascal ??????????????????????§Ö??????? insert() ?? remove() ??????????????????????????????????????????-?????????? ```html monitor ProducerConsumer @@ -342,11 +342,11 @@ monitor ProducerConsumer end monitor; ``` -¹Ü³ÌÓÐÒ»¸öÖØÒªÌØÐÔ£ºÔÚÒ»¸öʱ¿ÌÖ»ÄÜÓÐÒ»¸ö½ø³ÌʹÓù̡ܳ£½ø³ÌÔÚÎÞ·¨¼ÌÐøÖ´ÐеÄʱºò²»ÄÜÒ»Ö±Õ¼Óụ̀ܳ¬±ØÐ뽫½ø³Ì×èÈû£¬·ñÕ߯äËü½ø³ÌÓÀÔ¶²»ÄÜʹÓù̡ܳ£ +??????????????????????????????????????¨´??????????????????§Ö??????????¨´??????????????????????????????????????¨´??? -¹Ü³ÌÒýÈëÁË **Ìõ¼þ±äÁ¿** ÒÔ¼°Ïà¹ØµÄ²Ù×÷£º**wait()** ºÍ **signal()** À´ÊµÏÖͬ²½²Ù×÷¡£¶ÔÌõ¼þ±äÁ¿Ö´ÐÐ wait() ²Ù×÷»áµ¼Öµ÷Óýø³Ì×èÈû£¬°Ñ¹Ü³ÌÈóöÀ´ÈÃÁíÒ»¸ö½ø³Ì³ÖÓС£signal() ²Ù×÷ÓÃÓÚ»½Ðѱ»×èÈûµÄ½ø³Ì¡£ +????????? **????????** ????????????**wait()** ?? **signal()** ??????????????????????????? wait() ?????????????????????????¨®????????????????§³?signal() ?????????????????????? -**ʹÓùܳÌʵÏÖÉú³ÉÕß-Ïû·ÑÕßÎÊÌâ** +**??¨´???????????-??????????** ```html monitor ProducerConsumer @@ -390,55 +390,55 @@ begin end; ``` -## ½ø³ÌͨÐÅ +## ??????? -½ø³ÌͨÐÅ¿ÉÒÔ¿´³ÉÊDz»Í¬½ø³Ì¼äµÄÏß³ÌͨÐÅ£¬¶ÔÓÚͬһ¸ö½ø³ÌÄÚÏ̵߳ÄͨÐÅ·½Ê½£¬Ö÷ҪʹÓÃÐźÅÁ¿¡¢Ìõ¼þ±äÁ¿µÈͬ²½»úÖÆ¡£ +?????????????????????????????????????????????????????????????????????????????????????? -### 1. ¹ÜµÀ +### 1. ??? -¹ÜµÀÊǵ¥ÏòµÄ¡¢ÏȽøÏȳöµÄ¡¢Î޽ṹµÄ¡¢¹Ì¶¨´óСµÄ×Ö½ÚÁ÷£¬Ëü°ÑÒ»¸ö½ø³ÌµÄ±ê×¼Êä³öºÍÁíÒ»¸ö½ø³ÌµÄ±ê×¼ÊäÈëÁ¬½ÓÔÚÒ»Æð¡£Ð´½ø³ÌÔڹܵÀµÄβ¶ËдÈëÊý¾Ý£¬¶Á½ø³ÌÔڹܵÀµÄÊ׶˶Á³öÊý¾Ý¡£Êý¾Ý¶Á³öºó½«´Ó¹ÜµÀÖÐÒÆ×ߣ¬ÆäËü¶Á½ø³Ì¶¼²»ÄÜÔÙ¶Áµ½ÕâЩÊý¾Ý¡£ +??????????????????????????????§³?????????????????????????????????????????????????????§Õ??????????¦Â??§Õ???????????????????????????????????????????????????????????????????????§»????? -¹ÜµÀÌṩÁ˼òµ¥µÄÁ÷¿ØÖÆ»úÖÆ£¬½ø³ÌÊÔͼ¶Á¿Õ¹ÜµÀʱ£¬ÔÚÓÐÊý¾ÝдÈë¹ÜµÀǰ£¬½ø³Ì½«Ò»Ö±×èÈû¡£Í¬ÑùµØ£¬¹ÜµÀÒѾ­Âúʱ£¬½ø³ÌÔÙÊÔͼд¹ÜµÀ£¬ÔÚÆäËü½ø³Ì´Ó¹ÜµÀÖÐÒÆ×ßÊý¾Ý֮ǰ£¬Ð´½ø³Ì½«Ò»Ö±×èÈû¡£ +???????????????????????????????????????????§Õ??????????????????????????????????????????????§Õ????????????????????????????????§Õ????????????? -Linux ÖйܵÀÊÇͨ¹ý¿ÕÎļþÀ´ÊµÏÖ¡£ +Linux ?§Û?????????????????? -¹ÜµÀÓÐÈýÖÖ£º +?????????? -¢Ù ÆÕͨ¹ÜµÀ£ºÓÐÁ½¸öÏÞÖÆ£ºÒ»ÊÇÖ»Ö§³Ö°ëË«¹¤Í¨ÐÅ·½Ê½£¬¼´Ö»Äܵ¥Ïò´«Ê䣻¶þÊÇÖ»ÄÜÔÚ¸¸×Ó½ø³ÌÖ®¼äʹÓã» +?? ????????????????????????????????????????????????????????????????????? -¢Ú Á÷¹ÜµÀ£ºÈ¥³ýµÚÒ»¸öÏÞÖÆ£¬Ö§³ÖË«Ïò´«Ê䣻 +?? ???????????????????????????? -¢Û ÃüÃû¹ÜµÀ£ºÈ¥³ýµÚ¶þ¸öÏÞÖÆ£¬¿ÉÒÔÔÚ²»Ïà¹Ø½ø³ÌÖ®¼ä½øÐÐͨÐÅ¡£ +?? ????????????????????????????????????????????? -### 2. ÐźÅÁ¿ +### 2. ????? -ÐźÅÁ¿ÊÇÒ»¸ö¼ÆÊýÆ÷£¬¿ÉÒÔÓÃÀ´¿ØÖƶà¸ö½ø³Ì¶Ô¹²Ïí×ÊÔ´µÄ·ÃÎÊ¡£Ëü³£×÷ΪһÖÖËø»úÖÆ£¬·Àֹij½ø³ÌÕýÔÚ·ÃÎʹ²Ïí×ÊԴʱ£¬ÆäËü½ø³ÌÒ²·ÃÎʸÃ×ÊÔ´¡£Òò´Ë£¬Ö÷Òª×÷Ϊ½ø³Ì¼äÒÔ¼°Í¬Ò»½ø³ÌÄÚ²»Í¬Ïß³ÌÖ®¼äµÄͬ²½ÊֶΡ£ +?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????¦±? -### 3. ÏûÏ¢¶ÓÁÐ +### 3. ??????? -ÏûÏ¢¶ÓÁп˷þÁËÐźŴ«µÝÐÅÏ¢ÉÙ¡¢¹ÜµÀÖ»ÄܳÐÔØÎÞ¸ñʽ×Ö½ÚÁ÷ÒÔ¼°»º³åÇø´óСÊÜÏÞµÈȱµã¡£ +??????§á?????????????????????????????????????????????§³???????? -### 4. ÐźŠ+### 4. ??? -ÐźÅÊÇÒ»ÖֱȽϸ´ÔÓµÄͨÐÅ·½Ê½£¬ÓÃÓÚ֪ͨ½ÓÊÕ½ø³Ìij¸öʼþÒѾ­·¢Éú¡£ +????????????????????????????????????????????????? -### 5. ¹²ÏíÄÚ´æ +### 5. ??????? -¹²ÏíÄÚ´æ¾ÍÊÇÓ³ÉäÒ»¶ÎÄܱ»ÆäËü½ø³ÌËù·ÃÎʵÄÄڴ棬Õâ¶Î¹²ÏíÄÚ´æÓÉÒ»¸ö½ø³Ì´´½¨£¬µ«¶à¸ö½ø³Ì¶¼¿ÉÒÔ·ÃÎÊ¡£¹²ÏíÄÚ´æÊÇ×î¿ìµÄ IPC ·½Ê½£¬ËüÊÇÕë¶ÔÆäËü½ø³Ì¼äͨÐÅ·½Ê½ÔËÐÐЧÂʵͶø×¨ÃÅÉè¼ÆµÄ¡£ËüÍùÍùÓëÆäËüͨÐÅ»úÖÆ£¨ÈçÐźÅÁ¿£©ÅäºÏʹÓã¬À´ÊµÏÖ½ø³Ì¼äµÄͬ²½ºÍͨÐÅ¡£ +????????????????????????????????????—¨??¦É??????????????????????????????????????????????????? IPC ??????????????????????????????§¹?????????????????????????????????????????????????????????????????? -### 6. Ì×½Ó×Ö +### 6. ????? -Ì×½Ó×ÖÒ²ÊÇÒ»ÖÖ½ø³Ì¼äͨÐÅ»úÖÆ£¬ÓëÆäËüͨÐÅ»úÖÆ²»Í¬µÄÊÇ£¬Ëü¿ÉÓÃÓÚ²»Í¬»úÆ÷¼äµÄ½ø³ÌͨÐÅ¡£ +????????????????????????????????????????????????????????????????? -## ¾­µäͬ²½ÎÊÌâ +## ??????????? -Éú²úÕߺÍÏû·ÑÕßÎÊÌâÇ°ÃæÒѾ­ÌÖÂÛ¹ý¡£ +?????????????????????????????? -### 1. ¶ÁÕß-дÕßÎÊÌâ +### 1. ????-§Õ?????? -ÔÊÐí¶à¸ö½ø³Ìͬʱ¶ÔÊý¾Ý½øÐжÁ²Ù×÷£¬µ«ÊDz»ÔÊÐí¶ÁºÍдÒÔ¼°Ð´ºÍд²Ù×÷ͬʱ·¢Éú¡£ +????????????????????§Ø???????????????????§Õ???§Õ??§Õ???????????? -Ò»¸öÕûÐͱäÁ¿ count ¼Ç¼ÔÚ¶ÔÊý¾Ý½øÐжÁ²Ù×÷µÄ½ø³ÌÊýÁ¿£¬Ò»¸ö»¥³âÁ¿ count_mutex ÓÃÓÚ¶Ô count ¼ÓËø£¬Ò»¸ö»¥³âÁ¿ data_mutex ÓÃÓÚ¶Ô¶ÁдµÄÊý¾Ý¼ÓËø¡£ +?????????? count ????????????§Ø????????????????????????? count_mutex ????? count ??????????????? data_mutex ??????§Õ??????????? ```c typedef int semaphore; @@ -450,7 +450,7 @@ void reader() { while(TRUE) { down(count_mutex); count++; - if(count == 1) down(data_mutex); // µÚÒ»¸ö¶ÁÕßÐèÒª¶ÔÊý¾Ý½øÐмÓËø£¬·Àֹд½ø³Ì·ÃÎÊ + if(count == 1) down(data_mutex); // ????????????????????§Þ????????§Õ??????? up(count_mutex); read(); down(count_mutex); @@ -469,13 +469,13 @@ void writer() { } ``` -### 2. ÕÜѧ¼Ò½ø²ÍÎÊÌâ +### 2. ???????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a9077f06-7584-4f2b-8c20-3a8e46928820.jpg) -Îå¸öÕÜѧ¼ÒΧ×ÅÒ»ÕÅÔ²ÖÜ£¬Ã¿¸öÕÜѧ¼ÒÃæÇ°·Å×Å·¹¡£ÕÜѧ¼ÒµÄÉú»îÓÐÁ½ÖÖ½»Ìæ»î¶¯£º³Ô·¹ÒÔ¼°Ë¼¿¼¡£µ±Ò»¸öÕÜѧ¼Ò³Ô·¹Ê±£¬ÐèÒªÏÈÒ»¸ùÒ»¸ùÄÃÆð×óÓÒÁ½±ßµÄ¿ê×Ó¡£ +????????¦¶??????????????????????????????????????????????????????????????????????????????????????????????????????? -ÏÂÃæÊÇÒ»ÖÖ´íÎóµÄ½â·¨£¬¿¼Âǵ½Èç¹ûÿ¸öÕÜѧ¼ÒͬʱÄÃÆð×óÊֱߵĿê×Ó£¬ÄÇô¾ÍÎÞ·¨ÄÃÆðÓÒÊֱߵĿê×Ó£¬Ôì³ÉËÀËø¡£ +??????????????????????????????????????????????????????????????????????????????? ```c #define N 5 @@ -496,7 +496,7 @@ void philosopher(int i) { } ``` -ΪÁË·ÀÖ¹ËÀËøµÄ·¢Éú£¬¿ÉÒÔ¼ÓÒ»µãÏÞÖÆ£¬Ö»ÔÊÐíͬʱÄÃÆð×óÓÒÁ½±ßµÄ¿ê×Ó£¬·½·¨ÊÇÒýÈëÒ»¸ö»¥³âÁ¿£¬¶ÔÄÃÆðÁ½¸ö¿ê×ÓµÄÄǶδúÂë¼ÓËø¡£ +???????????????????????????????????????????????????????????????????????????????????????????¦Ä???????? ```c semaphore mutex = 1; @@ -517,223 +517,223 @@ void philosopher(int i) { } ``` -# µÚÈýÕ ËÀËø +# ?????? ???? -## ËÀËøµÄÌõ¼þ +## ?????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c037c901-7eae-4e31-a1e4-9d41329e5c3e.png) -1. »¥³â -2. ÇëÇóÓë±£³Ö£ºÒ»¸ö½ø³ÌÒòÇëÇó×ÊÔ´¶ø×èÈûʱ£¬¶ÔÒÑ»ñµÃµÄ×ÊÔ´±£³Ö²»·Å¡£ -3. ²»¿ÉÇÀÕ¼ -4. »·Â·µÈ´ý +1. ???? +2. ???????????????????????????????????????????????????? +3. ??????? +4. ??¡¤??? -## ËÀËøµÄ´¦Àí·½·¨ +## ??????????? -### 1. ÍÒÄñ²ßÂÔ +### 1. ??????? -°ÑÍ·ÂñÔÚɳ×ÓÀ¼Ù×°¸ù±¾Ã»·¢ÉúÎÊÌâ¡£ +???????????????????????????? -ÕâÖÖ²ßÂÔ²»¿ÉÈ¡¡£ +????????????? -### 2. ËÀËøÔ¤·À +### 2. ??????? -ÔÚ³ÌÐòÔËÐÐ֮ǰԤ·À·¢ÉúËÀËø¡£ +???????????????????????? -#### 2.1 ÆÆ»µ»¥³âÌõ¼þ +#### 2.1 ??????????? -ÀýÈç¼ÙÍÑ»ú´òÓ¡»ú¼¼ÊõÔÊÐíÈô¸É¸ö½ø³ÌͬʱÊä³ö£¬Î¨Ò»ÕæÕýÇëÇóÎïÀí´òÓ¡»úµÄ½ø³ÌÊÇ´òÓ¡»úÊØ»¤½ø³Ì¡£ +?????????????????????????????????????¦·???????????????????????????????????? -#### 2.2 ÆÆ»µÇëÇóÓë±£³ÖÌõ¼þ +#### 2.2 ??????????????? -Ò»ÖÖʵÏÖ·½Ê½Êǹ涨ËùÓнø³ÌÔÚ¿ªÊ¼Ö´ÐÐǰÇëÇóËùÐèÒªµÄÈ«²¿×ÊÔ´¡£ +??????????ÕÇ???§ß?????????????????????????????? -#### 2.3 ÆÆ»µ²»¿ÉÇÀÕ¼Ìõ¼þ +#### 2.3 ?????????????? -#### 2.4 ÆÆ»µ»·Â·µÈ´ý +#### 2.4 ?????¡¤??? -¸ø×ÊԴͳһ±àºÅ£¬½ø³ÌÖ»Äܰ´±àºÅ˳ÐòÀ´ÇëÇó×ÊÔ´¡£ +???????????????????????????????????? -### 3. ËÀËø±ÜÃâ +### 3. ???????? -ÔÚ³ÌÐòÔËÐÐʱ±ÜÃâ·¢ÉúËÀËø¡£ +?????????????????????? -#### 3.1 °²È«×´Ì¬ +#### 3.1 ????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ed523051-608f-4c3f-b343-383e2d194470.png) -ͼ a µÄµÚ¶þÁÐ has ±íʾÒÑÓµÓеÄ×ÊÔ´Êý£¬µÚÈýÁÐ max ±íʾ×ܹ²ÐèÒªµÄ×ÊÔ´Êý£¬free ±íʾ»¹ÓпÉÒÔʹÓõÄ×ÊÔ´Êý¡£´Óͼ a ¿ªÊ¼³ö·¢£¬ÏÈÈà B ÓµÓÐËùÐèµÄËùÓÐ×ÊÔ´£¬ÔËÐнáÊøºóÊÍ·Å B£¬´Ëʱ free ±äΪ 4£»½Ó×ÅÒÔͬÑùµÄ·½Ê½ÔËÐÐ C ºÍ A£¬Ê¹µÃËùÓнø³Ì¶¼Äܳɹ¦ÔËÐУ¬Òò´Ë¿ÉÒÔ³ÆÍ¼ a ËùʾµÄ״̬ʱ°²È«µÄ¡£ +? a ?????? has ???????§Ö?????????????? max ??????????????????free ??????§á????????????????? a ????????????? B ????????????????????§ß???????? B????? free ??? 4??????????????????? C ?? A????????§ß???????????§µ????????? a ?????????????? -¶¨Ò壺Èç¹ûûÓÐËÀËø·¢Éú£¬²¢ÇÒ¼´Ê¹ËùÓнø³ÌͻȻÇëÇó¶Ô×ÊÔ´µÄ×î´óÐèÇó£¬Ò²ÈÔÈ»´æÔÚijÖÖµ÷¶È´ÎÐòÄܹ»Ê¹µÃÿһ¸ö½ø³ÌÔËÐÐÍê±Ï£¬Ôò³Æ¸Ã״̬Êǰ²È«µÄ¡£ +???‰Ø?????????????????????????§ß?????????????????????????????????????????????????????????????????????????? -#### 3.2 µ¥¸ö×ÊÔ´µÄÒøÐмÒËã·¨ +#### 3.2 ????????????§Þ??? -Ò»¸öС³ÇÕòµÄÒøÐмң¬ËûÏòһȺ¿Í»§·Ö±ð³ÐŵÁËÒ»¶¨µÄ´û¿î¶î¶È£¬Ëã·¨Òª×öµÄÊÇÅж϶ÔÇëÇóµÄÂú×ãÊÇ·ñ»á½øÈë²»°²È«×´Ì¬£¬Èç¹ûÊÇ£¬¾Í¾Ü¾øÇëÇó£»·ñÔòÓèÒÔ·ÖÅä¡£ +???§³????????§Þ???????????????????????????????????????§Ø????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/d160ec2e-cfe2-4640-bda7-62f53e58b8c0.png) -ÉÏͼ c Ϊ²»°²È«×´Ì¬£¬Òò´ËËã·¨»á¾Ü¾øÖ®Ç°µÄÇëÇ󣬴Ӷø±ÜÃâ½øÈëͼ c ÖеÄ״̬¡£ +??? c ????????????????????????????????????? c ?§Ö????? -#### 3.3 ¶à¸ö×ÊÔ´µÄÒøÐмÒËã·¨ +#### 3.3 ???????????§Þ??? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/62e0dd4f-44c3-43ee-bb6e-fedb9e068519.png) -ÉÏͼÖÐÓÐÎå¸ö½ø³Ì£¬Ëĸö×ÊÔ´¡£×ó±ßµÄͼ±íʾÒѾ­·ÖÅäµÄ×ÊÔ´£¬ÓұߵÄͼ±íʾ»¹ÐèÒª·ÖÅäµÄ×ÊÔ´¡£×îÓÒ±ßµÄ E¡¢P ÒÔ¼° A ·Ö±ð±íʾ£º×Ü×ÊÔ´¡¢ÒÑ·ÖÅä×ÊÔ´ÒÔ¼°¿ÉÓÃ×ÊÔ´£¬×¢ÒâÕâÈý¸öΪÏòÁ¿£¬¶ø²»ÊǾßÌåÊýÖµ£¬ÀýÈç A=(1020)£¬±íʾ 4 ¸ö×ÊÔ´·Ö±ð»¹Ê£Ï 1/0/2/0¡£ +????????????????????????????????????????????????????????????????????????? E??P ??? A ???????????????????????????????????????????????????????????????????? A=(1020)????? 4 ??????????? 1/0/2/0?? -¼ì²éÒ»¸ö״̬ÊÇ·ñ°²È«µÄËã·¨ÈçÏ£º +????????????????????? -¢Ù ²éÕÒÓұߵľØÕóÊÇ·ñ´æÔÚÒ»ÐÐСÓÚµÈÓÚÏòÁ¿ A¡£Èç¹û²»´æÔÚÕâÑùµÄÐУ¬ÄÇôϵͳ½«»á·¢ÉúËÀËø£¬×´Ì¬ÊDz»°²È«µÄ¡£ +?? ????????????????????§³????????? A??????????????????§µ????????????????????????????? -¢Ú ¼ÙÈôÕÒµ½ÕâÑùÒ»ÐУ¬½«¸Ã½ø³Ì±ê¼ÇΪÖÕÖ¹£¬²¢½«ÆäÒÑ·ÖÅä×ÊÔ´¼Óµ½ A ÖС£ +?? ?????????????§µ????????????????????????????????? A ?§³? -¢Û ÖØ¸´ÒÔÉÏÁ½²½£¬Ö±µ½ËùÓнø³Ì¶¼±ê¼ÇΪÖÕÖ¹£¬Ôò״̬ʱ°²È«µÄ¡£ +?? ???????????????????§ß???????????????????????? -### 4. ËÀËø¼ì²âÓëËÀËø»Ö¸´ +### 4. ???????????????? -²»ÊÔͼ×éÖ¯ËÀËø£¬¶øÊǵ±¼ì²âµ½ËÀËø·¢Éúʱ£¬²ÉÈ¡´ëÊ©½øÐлָ´¡£ +??????????????????????????????????????????§Ý???? -#### 4.1 ËÀËø¼ì²âËã·¨ +#### 4.1 ????????? -ËÀËø¼ì²âµÄ»ù±¾Ë¼ÏëÊÇ£¬Èç¹ûÒ»¸ö½ø³ÌËùÇëÇóµÄ×ÊÔ´Äܹ»±»Âú×㣬ÄÇô¾ÍÈÃËüÖ´ÐУ¬ÊÍ·ÅËüÓµÓеÄËùÓÐ×ÊÔ´£¬È»ºóÈÃÆäËüÄÜÂú×ãÌõ¼þµÄ½ø³ÌÖ´ÐС£ +?????????????????????????????????????????????????????????§µ????????§Ö????????????????????????????????????§³? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/e1eda3d5-5ec8-4708-8e25-1a04c5e11f48.png) -ÉÏͼÖУ¬ÓÐÈý¸ö½ø³ÌËĸö×ÊÔ´£¬Ã¿¸öÊý¾Ý´ú±íµÄº¬ÒåÈçÏ£º +????§µ?????????????????????????????????????? -E ÏòÁ¿£º×ÊÔ´×ÜÁ¿ -A ÏòÁ¿£º×ÊÔ´Ê£ÓàÁ¿ -C ¾ØÕó£ºÃ¿¸ö½ø³ÌËùÓµÓеÄ×ÊÔ´ÊýÁ¿£¬Ã¿Ò»Ðж¼´ú±íÒ»¸ö½ø³ÌÓµÓÐ×ÊÔ´µÄÊýÁ¿ -R ¾ØÕó£ºÃ¿¸ö½ø³ÌÇëÇóµÄ×ÊÔ´ÊýÁ¿ +E ????????????? +A ?????????????? +C ???????????????§Ö?????????????§Ø???????????????????????? +R ??????????????????????? -½ø³Ì P1 ºÍ P2 ËùÇëÇóµÄ×ÊÔ´¶¼µÃ²»µ½Âú×㣬ֻÓнø³Ì P3 ¿ÉÒÔ£¬Èà P3 Ö´ÐУ¬Ö®ºóÊÍ·Å P3 ÓµÓеÄ×ÊÔ´£¬´Ëʱ A = (2 2 2 0)¡£P1 ¿ÉÒÔÖ´ÐУ¬Ö´ÐкóÊÍ·Å P1 ÓµÓеÄ×ÊÔ´£¬ A = (4 2 2 2) £¬P2 Ò²¿ÉÒÔÖ´ÐС£ËùÓнø³Ì¶¼¿ÉÒÔ˳ÀûÖ´ÐУ¬Ã»ÓÐËÀËø¡£ +???? P1 ?? P2 ?????????????¨°?????????§ß??? P3 ??????? P3 ??§µ??????? P3 ??§Ö????????? A = (2 2 2 0)??P1 ??????§µ???§Ü???? P1 ??§Ö?????? A = (4 2 2 2) ??P2 ???????§³????§ß?????????????§µ?????????? -Ëã·¨×ܽáÈçÏ£º +?????????? -ÿ¸ö½ø³Ì×ʼʱ¶¼²»±»±ê¼Ç£¬Ö´Ðйý³ÌÓпÉÄܱ»±ê¼Ç¡£µ±Ëã·¨½áÊøÊ±£¬ÈκÎûÓб»±ê¼ÇµÄ½ø³Ì¶¼ÊÇËÀËø½ø³Ì¡£ +???????????????????????§Û????§á????????????????????¦Ê???§Ò???????????????????? -¢Ù ѰÕÒÒ»¸öûÓбê¼ÇµÄ½ø³Ì Pi£¬ËüËùÇëÇóµÄ×ÊԴСÓÚµÈÓÚ A¡£ -¢Ú Èç¹ûÕÒµ½ÁËÕâÑùÒ»¸ö½ø³Ì£¬ÄÇô½« C ¾ØÕóµÄµÚ i ÐÐÏòÁ¿¼Óµ½ A ÖУ¬±ê¼Ç¸Ã½ø³Ì£¬²¢×ª»Ø ¢Ù¡£ -¢Û Èç¹ûÓÐûÓÐÕâÑùÒ»¸ö½ø³Ì£¬Ëã·¨ÖÕÖ¹¡£ +?? ????????§Ò?????? Pi??????????????§³????? A?? +?? ????????????????????????? C ?????? i ????????? A ?§µ?????????????? ??? +?? ??????????????????????????? -#### 4.2 ËÀËø»Ö¸´ +#### 4.2 ??????? -¢Ù ÀûÓÃÇÀÕ¼»Ö¸´ -¢Ú ɱËÀ½ø³Ì +?? ?????????? +?? ??????? -# µÚËÄÕ ´æ´¢Æ÷¹ÜÀí +# ?????? ?›¥?????? -## ÐéÄâÄÚ´æ +## ??????? -ÿ¸ö³ÌÐòÓµÓÐ×Ô¼ºµÄµØÖ·¿Õ¼ä£¬Õâ¸öµØÖ·¿Õ¼ä±»·Ö¸î³É¶à¸ö¿é£¬Ã¿Ò»¿é³ÆÎªÒ» Ò³¡£ÕâЩҳ±»Ó³Éäµ½ÎïÀíÄڴ棬µ«²»ÐèÒªÓ³Éäµ½Á¬ÐøµÄÎïÀíÄڴ棬Ҳ²»ÐèÒªËùÓÐÒ³¶¼±ØÐëÔÚÎïÀíÄÚ´æÖС£ +????????????????????????????????????ï…??????? ?????§»????????????—¨??????????????????????—¨???????????????????????????§³? -µ±³ÌÐòÒýÓõ½Ò»²¿·ÖÔÚÎïÀíÄÚ´æÖеĵØÖ·¿Õ¼äʱ£¬ÓÉÓ²¼þÁ¢¼´Ö´ÐбØÒªµÄÓ³Éä¡£µ±³ÌÐòÒýÓõ½Ò»²¿·Ö²»ÔÚÎïÀíÄÚ´æÖеĵØÖ·¿Õ¼äʱ£¬ÓɲÙ×÷ϵͳ¸ºÔð½«È±Ê§µÄ²¿·Ö×°ÈëÎïÀíÄÚ´æ²¢ÖØÐÂÖ´ÐÐʧ°ÜµÄÖ¸Áî¡£ +??????????????????????????§Ö????????????????????§Ò??????????????????????????????????§Ö????????????????????????????????????›g?????????????þŸ -## ·ÖÒ³Óë·Ö¶Î +## ??????? -### 1. ·ÖÒ³ +### 1. ??? -Óû§³ÌÐòµÄµØÖ·¿Õ¼ä±»»®·ÖΪÈô¸É¹Ì¶¨´óСµÄÇøÓò£¬³ÆÎª¡°Ò³¡±¡£ÏàÓ¦µØ£¬ÄÚ´æ¿Õ¼ä·Ö³ÉÈô¸É¸öÎïÀí¿é£¬Ò³ºÍ¿éµÄ´óСÏàµÈ¡£¿É½«Óû§³ÌÐòµÄÈÎÒ»Ò³·ÅÔÚÄÚ´æµÄÈÎÒ»¿éÖУ¬ÊµÏÖÁËÀëÉ¢·ÖÅ䣬ÓÉÒ»¸öÒ³±íÀ´Î¬»¤ËüÃÇÖ®¼äµÄÓ³Éä¹ØÏµ¡£ +??????????????????????????§³?????????????????????????????????????ï…??????§³?????????????????????????????????§µ????????????????????????????????????????? -### 2. ·Ö¶Î +### 2. ??? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/22de0538-7c6e-4365-bd3b-8ce3c5900216.png) -ÉÏͼΪһ¸ö±àÒëÆ÷ÔÚ±àÒë¹ý³ÌÖн¨Á¢µÄ¶à¸ö±í£¬ÓÐ 4 ¸ö±íÊǶ¯Ì¬Ôö³¤µÄ£¬Èç¹ûʹÓ÷ÖҳϵͳµÄһάµØÖ·¿Õ¼ä£¬¶¯Ì¬µÝÔöµÄÌØµã»áµ¼Ö¸²¸ÇÎÊÌâµÄ³öÏÖ¡£ +??????????????????????§ß??????????? 4 ????????????????????¡Â????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/e0900bb2-220a-43b7-9aa9-1d5cd55ff56e.png) -·Ö¶ÎµÄ×ö·¨ÊǰÑÿ¸ö±í·Ö³É¶Î£¬Ò»¸ö¶Î¹¹³ÉÒ»¸ö¶ÀÁ¢µÄµØÖ·¿Õ¼ä¡£Ã¿¸ö¶ÎµÄ³¤¶È¿ÉÒÔ²»Í¬£¬¿ÉÒÔ¶¯Ì¬¸Ä±ä¡£ +??¦Å???????????????¦²?????¦É?????????????????????¦Å???????????????????? -ÿ¸ö¶Î¶¼ÐèÒª³ÌÐòÔ±À´»®·Ö¡£ +????¦Æ???????????????? -### 3. ¶Îҳʽ +### 3. ???? -Ó÷ֶη½·¨À´·ÖÅäºÍ¹ÜÀíÐéÄâ´æ´¢Æ÷¡£³ÌÐòµÄµØÖ·¿Õ¼ä°´Âß¼­µ¥Î»·Ö³É»ù±¾¶ÀÁ¢µÄ¶Î£¬¶øÃ¿Ò»¶ÎÓÐ×Ô¼ºµÄ¶ÎÃû£¬ÔÙ°Ñÿ¶Î·Ö³É¹Ì¶¨´óСµÄÈô¸ÉÒ³¡£ +?¡Â?¦Ç?????????????????›¥???????????????????¦Ë????????????¦²????????????????????????¦Ç??????§³????????? -Ó÷ÖÒ³·½·¨À´·ÖÅäºÍ¹ÜÀíʵ´æ¡£¼´°ÑÕû¸öÖ÷´æ·Ö³ÉÓëÉÏÊöÒ³´óСÏàµÈµÄ´æ´¢¿é£¬¿É×°Èë×÷ÒµµÄÈκÎÒ»Ò³¡£³ÌÐò¶ÔÄÚ´æµÄµ÷Èë»òµ÷³öÊǰ´Ò³½øÐеġ£µ«ËüÓֿɰ´¶ÎʵÏÖ¹²ÏíºÍ±£»¤¡£ +?¡Â??????????????????µµ???????????????????????§³????›¥?ï…???????????¦Ê????????????????????????????§Ö???????????????????????? -### 4. ·ÖÒ³Óë·Ö¶ÎÇø±ð +### 4. ??????????? -¢Ù ¶Ô³ÌÐòÔ±µÄ͸Ã÷ÐÔ£º·Öҳ͸Ã÷£¬µ«ÊÇ·Ö¶ÎÐèÒª³ÌÐòÔ±ÏÔʾ»®·Öÿ¸ö¶Î¡£ +?? ???????????????????????????????????????????????¦±? -¢Ú µØÖ·¿Õ¼äµÄά¶È£º·ÖÒ³ÊÇһάµØÖ·¿Õ¼ä£¬·Ö¶ÎÊǶþάµÄ¡£ +?? ?????????????????????????????????? -¢Û ´óСÊÇ·ñ¿ÉÒԸı䣺ҳµÄ´óС²»¿É±ä£¬¶ÎµÄ´óС¿ÉÒÔ¶¯Ì¬¸Ä±ä¡£ +?? ??§³????????????§³??????¦Å??§³????????? -¢Ü ³öÏÖµÄÔ­Òò£º·ÖÒ³Ö÷ÒªÓÃÓÚʵÏÖÐéÄâÄڴ棬´Ó¶ø»ñµÃ¸ü´óµÄµØÖ·¿Õ¼ä£»·Ö¶ÎÖ÷ÒªÊÇΪÁËʹ³ÌÐòºÍÊý¾Ý¿ÉÒÔ±»»®·ÖΪÂß¼­É϶ÀÁ¢µÄµØÖ·¿Õ¼ä²¢ÇÒÓÐÖúÓÚ¹²ÏíºÍ±£»¤¡£ +?? ??????????????????????????—¨????????????????????????????????????????????????????????????????????????????? -## Ò³ÃæÖû»Ëã·¨ +## ???????? -ÔÚ³ÌÐòÔËÐйý³ÌÖУ¬ÈôÆäËùÒª·ÃÎʵÄÒ³Ãæ²»ÔÚÄÚ´æ¶øÐèÒª°ÑËüÃǵ÷ÈëÄڴ棬µ«ÊÇÄÚ´æÒÑÎÞ¿ÕÏпռäʱ£¬ÏµÍ³±ØÐë´ÓÄÚ´æÖе÷³öÒ»¸öÒ³Ãæµ½´ÅÅ̶Ի»ÇøÖУ¬²¢ÇÒ½«³ÌÐòËùÐèÒªµÄÒ³Ãæµ÷ÈëÄÚ´æÖС£Ò³ÃæÖû»Ëã·¨µÄÖ÷ҪĿ±êÊÇÊ¹Ò³ÃæÖû»ÆµÂÊ×îµÍ£¨Ò²¿ÉÒÔ˵ȱҳÂÊ×îµÍ£©¡£ +????????§Û????§µ???????????????ÖÎ????????????????????—¨?????????????§á????????????????§Ö????????›Ô?????????§µ???????????????????????????§³????????????????????????????????????????????????? -### 1. ×î¼Ñ£¨Optimal£© +### 1. ????Optimal?? -ËùÑ¡ÔñµÄ±»»»³öµÄÒ³Ãæ½«ÊÇ×ʱ¼äÄÚ²»ÔÙ±»·ÃÎÊ£¬Í¨³£¿ÉÒÔ±£Ö¤»ñµÃ×îµÍµÄȱҳÂÊ¡£ +???????????????�Ÿ??????????????????????????????????????? -ÊÇÒ»ÖÖÀíÂÛÉϵÄËã·¨£¬ÒòΪÎÞ·¨ÖªµÀÒ»¸öÒ³Ãæ¶à³¤Ê±¼ä»á±»ÔÙ·ÃÎʵ½¡£ +???????????????????????????????????????????? -¾ÙÀý£ºÒ»¸öϵͳΪij½ø³Ì·ÖÅäÁËÈý¸öÎïÀí¿é£¬²¢ÓÐÈçÏÂÒ³ÃæÒýÓÃÐòÁУº +??????????????????????????????ï…??????????????????§µ? -7£¬0£¬1£¬2£¬0£¬3£¬0£¬4£¬2£¬3£¬0£¬3£¬2£¬1£¬2£¬0£¬1£¬7£¬0£¬1 +7??0??1??2??0??3??0??4??2??3??0??3??2??1??2??0??1??7??0??1 -½ø³ÌÔËÐÐʱ£¬ÏȽ« 7,0,1 Èý¸öÒ³Ãæ×°ÈëÄÚ´æ¡£µ±½ø³ÌÒª·ÃÎÊÒ³Ãæ 2 ʱ£¬²úÉúȱҳÖжϣ¬»á½«Ò³Ãæ 7 »»³ö£¬ÒòÎªÒ³Ãæ 7 Ôٴα»·ÃÎʵÄʱ¼ä×¡£ +?????????????? 7,0,1 ????????????µµ?????????????? 2 ??????????§Ø??????? 7 ???????????? 7 ??¦Á????????????? -### 2. ÏȽøÏȳö£¨FIFO£© +### 2. ????????FIFO?? -ËùÑ¡Ôñ»»³öµÄÒ³ÃæÊÇ×îÏȽøÈëµÄÒ³Ãæ¡£ +???????????????????????µµ -¸ÃËã·¨»á½«ÄÇЩ¾­³£±»·ÃÎʵÄÒ³ÃæÒ²±»»»³ö£¬´Ó¶øÊ¹È±Ò³ÂÊÉý¸ß¡£ +????????§»???????????????????????????????????? -### 3. ×î½ü×î¾ÃδʹÓã¨LRU£¬Least Recently Used£© +### 3. ??????¦Ä????LRU??Least Recently Used?? -ËäÈ»ÎÞ·¨ÖªµÀ½«À´ÒªÊ¹ÓõÄÒ³ÃæÇé¿ö£¬µ«ÊÇ¿ÉÒÔÖªµÀ¹ýȥʹÓÃÒ³ÃæµÄÇé¿ö¡£LRU ½«×î½ü×î¾ÃδʹÓõÄÒ³Ãæ»»³ö¡£ +???????????????????????????????????????????????????LRU ????????¦Ä??????�I???? -¿ÉÒÔÓÃÕ»À´ÊµÏÖ¸ÃËã·¨£¬Õ»ÖÐ´æ´¢Ò³ÃæµÄÒ³ÃæºÅ¡£µ±½ø³Ì·ÃÎÊÒ»¸öÒ³ÃæÊ±£¬½«¸ÃÒ³ÃæµÄÒ³ÃæºÅ´ÓÕ»ÒÆ³ý£¬²¢½«ËüѹÈëÕ»¶¥£¬ÕâÑù£¬×î½ü±»·ÃÎʵÄÒ³ÃæµÄÒ³ÃæºÅ×ÜÊÇÔÚÕ»¶¥£¬¶ø×î½ü×î¾ÃδʹÓõÄÒ³ÃæµÄÒ³ÃæºÅ×ÜÊÇÔÚÕ»µ×¡£ +???????????????????§Õ›¥???????????????????????????????????????????????????????????????????????????????????????????????????????¦Ä?????????????????????? -4£¬7£¬0£¬7£¬1£¬0£¬1£¬2£¬1£¬2£¬6 +4??7??0??7??1??0??1??2??1??2??6 ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/eb859228-c0f2-4bce-910d-d9f76929352b.png) -### 4. ʱÖÓ£¨Clock£© +### 4. ????Clock?? -Clock Ò³ÃæÖû»Ëã·¨ÐèÒªÓõ½Ò»¸ö·ÃÎÊ룬µ±Ò»¸öÒ³Ãæ±»·ÃÎÊʱ£¬½«·ÃÎÊΪÖÃΪ 1¡£ +Clock ?????????????????????¦Ë?????????›R????????????????? 1?? -Ê×ÏÈ£¬½«ÄÚ´æÖеÄËùÓÐÒ³ÃæÁ´½Ó³ÉÒ»¸öÑ­»·¶ÓÁУ¬µ±È±Ò³ÖжϷ¢Éúʱ£¬¼ì²éµ±Ç°Ö¸ÕëËùÖ¸ÏòÒ³ÃæµÄ·ÃÎÊ룬Èç¹û·ÃÎÊλΪ 0£¬¾Í½«¸ÃÒ³Ãæ»»³ö£»·ñÔò½«¸ÃÒ³µÄ·ÃÎÊλÉèÖÃΪ 0£¬¸ø¸ÃÒ³ÃæµÚ¶þ´ÎµÄ»ú»á£¬Òƶ¯Ö¸Õë¼ÌÐø¼ì²é¡£ +???????????§Ö??????????????????????§µ??????§Ø?????????ùn????????????????¦Ë?????????¦Ë? 0?????????�I???????????????¦Ë????? 0????????????¦Å???????????????î• -# µÚÎåÕ É豸¹ÜÀí +# ?????? ?õô???? -## ´ÅÅ̵÷¶ÈËã·¨ +## ????????? -µ±¶à¸ö½ø³ÌͬʱÇëÇó·ÃÎÊ´ÅÅÌʱ£¬ÐèÒª½øÐдÅÅ̵÷¶ÈÀ´¿ØÖƶԴÅÅ̵ķÃÎÊ¡£´ÅÅ̵÷¶ÈµÄÖ÷ҪĿ±êÊÇʹ´ÅÅÌµÄÆ½¾ùѰµÀʱ¼ä×îÉÙ¡£ +??????????????????????????????§Õ????????????????????????????????????????????????????????? -### 1. ÏÈÀ´ÏÈ·þÎñ£¨FCFS£¬First Come First Serverd£© +### 1. ?????????FCFS??First Come First Serverd?? -¸ù¾Ý½ø³ÌÇëÇó·ÃÎÊ´ÅÅ̵ÄÏȺó´ÎÐòÀ´½øÐе÷¶È¡£ÓŵãÊǹ«Æ½ºÍ¼òµ¥£¬È±µãÒ²ºÜÃ÷ÏÔ£¬ÒòΪδ¶ÔѰµÀ×öÈκÎÓÅ»¯£¬Ê¹Æ½¾ùѰµÀʱ¼ä¿ÉÄܽϳ¤¡£ +?????????????????????????????§Ö?????????????????????????????¦Ä????????¦Ê??????????????????????? -### 2. ×î¶ÌѰµÀʱ¼äÓÅÏÈ£¨SSTF£¬Shortest Seek Time First£© +### 2. ??????????????SSTF??Shortest Seek Time First?? -ÒªÇó·ÃÎʵĴŵÀÓ뵱ǰ´ÅÍ·ËùÔڴŵÀ¾àÀë×î½üµÄÓÅÏȽøÐе÷¶È¡£ÕâÖÖËã·¨²¢²»Äܱ£Ö¤Æ½¾ùѰµÀʱ¼ä×î¶Ì£¬µ«ÊÇ±È FCFS ºÃºÜ¶à¡£ +????????????????????????????????????§Ö???????????????????????????????????? FCFS ?¨²?? -### 3. ɨÃèËã·¨£¨SCAN£© +### 3. ???????SCAN?? -SSTF »á³öÏÖ½øÐм¢¶öÏÖÏ󡣿¼ÂÇÒÔÏÂÇé¿ö£¬Ð½ø³ÌÇëÇó·ÃÎʵĴŵÀÓë´ÅÍ·ËùÔڴŵÀµÄ¾àÀë×ÜÊDZÈÒ»¸öÔڵȴýµÄ½ø³ÌÀ´µÄ½ü£¬ÄÇôµÈ´ýµÄ½ø³Ì»áÒ»Ö±µÈ´ýÏÂÈ¥¡£ +SSTF ???????§Þ??????????????????????????????????????????????????????????????????????????????????????????????? -SCAN Ëã·¨ÔÚ SSTF Ëã·¨Ö®ÉÏ¿¼ÂÇÁË´ÅÍ·µÄÒÆ¶¯·½Ïò£¬ÒªÇóËùÇëÇó·ÃÎʵĴŵÀÔÚ´ÅÍ·µ±Ç°Òƶ¯·½ÏòÉϲÅÄܹ»µÃµ½µ÷¶È¡£ÒòΪ¿¼ÂÇÁËÒÆ¶¯·½Ïò£¬ÄÇôһ¸ö½ø³ÌÇëÇó·ÃÎʵĴŵÀÒ»¶¨»áµÃµ½µ÷¶È¡£ +SCAN ???? SSTF ???????????????????????????????????????????????????????????????????????????????????????????????????????????????? -µ±Ò»¸ö´ÅÍ·×ÔÀïÏòÍâÒÆ¶¯Ê±£¬ÒƵ½×îÍâ²à»á¸Ä±äÒÆ¶¯·½ÏòΪ×ÔÍâÏòÀÕâÖÖÒÆ¶¯µÄ¹æÂÉÀàËÆÓÚµçÌݵÄÔËÐУ¬Òò´ËÓÖ³£³Æ SCAN Ë㷨ΪµçÌݵ÷¶ÈËã·¨¡£ +??????????????????????????????????????????????????????????????????????????§µ????????? SCAN ?????????????? -### 4. Ñ­»·É¨ÃèËã·¨£¨CSCAN£© +### 4. ??????????CSCAN?? -CSCAN ¶Ô SCAN ½øÐÐÁ˸͝£¬ÒªÇó´ÅͷʼÖÕÑØ×ÅÒ»¸ö·½ÏòÒÆ¶¯¡£ +CSCAN ?? SCAN ?????????????????????????????????? -# ²Î¿¼×ÊÁÏ +# ?¦Ï????? - Tanenbaum A S, Bos H. Modern operating systems[M]. Prentice Hall Press, 2014. -- ÌÀ×Óå­, ÕÜ·ïÆÁ, ÌÀСµ¤. ¼ÆËã»ú²Ù×÷ϵͳ[M]. Î÷°²µç×ӿƼ¼´óѧ³ö°æÉç, 2001. +- ?????, ?????, ??§³??. ???????????[M]. ???????????????????, 2001. -- Bryant, R. E., & O¡¯Hallaron, D. R. (2004). ÉîÈëÀí½â¼ÆËã»úϵͳ. +- Bryant, R. E., & O??Hallaron, D. R. (2004). ?????????????. -- [СÍÁµ¶µÄÃæÊÔË¢Ìâ±Ê¼Ç](http://wdxtub.com/interview/index.html) +- [§³???????????????](http://wdxtub.com/interview/index.html) -- [½ø³Ì¼äµÄ¼¸ÖÖͨÐÅ·½Ê½](http://blog.csdn.net/yufaw/article/details/7409596) +- [??????????????](http://blog.csdn.net/yufaw/article/details/7409596) diff --git a/notes/计算机网络.md b/notes/计算机网络.md index b4581956..a202625f 100644 --- a/notes/计算机网络.md +++ b/notes/计算机网络.md @@ -1,840 +1,840 @@ -* [µÚÒ»Õ ¸ÅÊö](#µÚÒ»ÕÂ-¸ÅÊö) - * [ÍøÂçµÄÍøÂç](#ÍøÂçµÄÍøÂç) +* [????? ????](#?????-????) + * [?????????](#?????????) * [ISP](#isp) - * [»¥ÁªÍøµÄ×é³É](#»¥ÁªÍøµÄ×é³É) - * [Ö÷»úÖ®¼äµÄͨÐÅ·½Ê½](#Ö÷»úÖ®¼äµÄͨÐÅ·½Ê½) - * [µç·½»»»Óë·Ö×é½»»»](#µç·½»»»Óë·Ö×é½»»») - * [1. µç·½»»»](#1-µç·½»»») - * [2. ±¨ÎĽ»»»](#2-±¨ÎĽ»»») - * [3. ·Ö×é½»»»](#3-·Ö×é½»»») - * [ʱÑÓ](#ʱÑÓ) - * [1. ·¢ËÍʱÑÓ](#1-·¢ËÍʱÑÓ) - * [2. ´«²¥Ê±ÑÓ](#2-´«²¥Ê±ÑÓ) - * [3. ´¦ÀíʱÑÓ](#3-´¦ÀíʱÑÓ) - * [4. ÅŶÓʱÑÓ](#4-ÅŶÓʱÑÓ) - * [¼ÆËã»úÍøÂçÌåϵ½á¹¹*](#¼ÆËã»úÍøÂçÌåϵ½á¹¹) - * [1. Æß²ãЭÒé](#1-Æß²ãЭÒé) - * [2. Îå²ãЭÒé](#2-Îå²ãЭÒé) - * [3. Êý¾ÝÔÚ¸÷²ãÖ®¼äµÄ´«µÝ¹ý³Ì](#3-Êý¾ÝÔÚ¸÷²ãÖ®¼äµÄ´«µÝ¹ý³Ì) - * [4. TCP/IP Ìåϵ½á¹¹](#4-tcpip-Ìåϵ½á¹¹) -* [µÚ¶þÕ ÎïÀí²ã](#µÚ¶þÕÂ-ÎïÀí²ã) - * [ͨÐÅ·½Ê½](#ͨÐÅ·½Ê½) - * [´øÍ¨µ÷ÖÆ](#´øÍ¨µ÷ÖÆ) - * [ÐŵÀ¸´Óü¼Êõ](#ÐŵÀ¸´Óü¼Êõ) - * [1. Ƶ·Ö¸´Óá¢Ê±·Ö¸´ÓÃ](#1-Ƶ·Ö¸´ÓÃʱ·Ö¸´ÓÃ) - * [2. ͳ¼ÆÊ±·Ö¸´ÓÃ](#2-ͳ¼ÆÊ±·Ö¸´ÓÃ) - * [3. ²¨·Ö¸´ÓÃ](#3-²¨·Ö¸´ÓÃ) - * [4. Âë·Ö¸´ÓÃ](#4-Âë·Ö¸´ÓÃ) -* [µÚÈýÕ Êý¾ÝÁ´Â·²ã](#µÚÈýÕÂ-Êý¾ÝÁ´Â·²ã) - * [Èý¸ö»ù±¾ÎÊÌâ](#Èý¸ö»ù±¾ÎÊÌâ) - * [1. ·â×°³ÉÖ¡](#1-·â×°³ÉÖ¡) - * [2. ͸Ã÷´«Êä](#2-͸Ã÷´«Êä) - * [3. ²î´í¼ì²â](#3-²î´í¼ì²â) - * [µã¶ÔµãÐŵÀ -PPP ЭÒé](#µã¶ÔµãÐŵÀ--ppp-ЭÒé) - * [¾ÖÓòÍøµÄÍØÆË](#¾ÖÓòÍøµÄÍØÆË) - * [¹ã²¥ÐŵÀ - CSMA/CD ЭÒé*](#¹ã²¥ÐŵÀ---csmacd-ЭÒé) - * [¼¯Ï߯÷](#¼¯Ï߯÷) - * [MAC ²ã](#mac-²ã) - * [ÐéÄâ¾ÖÓòÍø](#ÐéÄâ¾ÖÓòÍø) -* [µÚËÄÕÂ ÍøÂç²ã*](#µÚËÄÕÂ-ÍøÂç²ã) - * [Íø¼ÊЭÒé IP ¸ÅÊö](#Íø¼ÊЭÒé-ip-¸ÅÊö) - * [IP Êý¾Ý±¨¸ñʽ](#ip-Êý¾Ý±¨¸ñʽ) - * [IP µØÖ·±àÖ·](#ip-µØÖ·±àÖ·) - * [1. ·ÖÀàµÄ IP µØÖ·](#1-·ÖÀàµÄ-ip-µØÖ·) - * [2. »®·Ö×ÓÍø](#2-»®·Ö×ÓÍø) - * [3. ÎÞ·ÖÀà±àÖ· CIDR£¨¹¹³É³¬Íø£©](#3-ÎÞ·ÖÀà±àÖ·-cidr¹¹³É³¬Íø) - * [IP µØÖ·ºÍ MAC µØÖ·](#ip-µØÖ·ºÍ-mac-µØÖ·) - * [µØÖ·½âÎöЭÒé ARP](#µØÖ·½âÎöЭÒé-arp) - * [·ÓÉÆ÷µÄ½á¹¹](#·ÓÉÆ÷µÄ½á¹¹) - * [½»»»»úÓë·ÓÉÆ÷µÄÇø±ð](#½»»»»úÓë·ÓÉÆ÷µÄÇø±ð) - * [·ÓÉÆ÷·Ö×éת·¢Á÷³Ì](#·ÓÉÆ÷·Ö×éת·¢Á÷³Ì) - * [·ÓÉÑ¡ÔñЭÒé](#·ÓÉÑ¡ÔñЭÒé) - * [1. ÄÚ²¿Íø¹ØÐ­Òé RIP](#1-ÄÚ²¿Íø¹ØÐ­Òé-rip) - * [2. ÄÚ²¿Íø¹ØÐ­Òé OSPF](#2-ÄÚ²¿Íø¹ØÐ­Òé-ospf) - * [3. Íâ²¿Íø¹ØÐ­Òé BGP](#3-Íâ²¿Íø¹ØÐ­Òé-bgp) - * [Íø¼Ê¿ØÖƱ¨ÎÄЭÒé ICMP](#Íø¼Ê¿ØÖƱ¨ÎÄЭÒé-icmp) - * [·Ö×éÍø¼ä̽²â PING](#·Ö×éÍø¼ä̽²â-ping) - * [IP ¶à²¥](#ip-¶à²¥) - * [ÐéÄâרÓÃÍø VPN](#ÐéÄâרÓÃÍø-vpn) - * [ÍøÂçµØÖ·×ª»» NAT](#ÍøÂçµØÖ·×ª»»-nat) -* [µÚÎåÕ ÔËÊä²ã*](#µÚÎåÕÂ-ÔËÊä²ã) - * [UDP ºÍ TCP µÄÌØµã](#udp-ºÍ-tcp-µÄÌØµã) - * [UDP Êײ¿¸ñʽ](#udp-Êײ¿¸ñʽ) - * [TCP Êײ¿¸ñʽ](#tcp-Êײ¿¸ñʽ) - * [TCP µÄÈý´ÎÎÕÊÖ](#tcp-µÄÈý´ÎÎÕÊÖ) - * [TCP µÄËĴλÓÊÖ](#tcp-µÄËĴλÓÊÖ) - * [TCP »¬¶¯´°¿Ú](#tcp-»¬¶¯´°¿Ú) - * [TCP ¿É¿¿´«Êä](#tcp-¿É¿¿´«Êä) - * [TCP Á÷Á¿¿ØÖÆ](#tcp-Á÷Á¿¿ØÖÆ) - * [TCP ÓµÈû¿ØÖÆ](#tcp-ÓµÈû¿ØÖÆ) - * [Âý¿ªÊ¼ÓëÓµÈû±ÜÃâ](#Âý¿ªÊ¼ÓëÓµÈû±ÜÃâ) - * [¿ìÖØ´«Óë¿ì»Ö¸´](#¿ìÖØ´«Óë¿ì»Ö¸´) -* [µÚÁùÕ ӦÓòã*](#µÚÁùÕÂ-Ó¦Óòã) - * [ÓòÃûϵͳ DNS](#ÓòÃûϵͳ-dns) - * [1. ²ã´Î½á¹¹](#1-²ã´Î½á¹¹) - * [2. ½âÎö¹ý³Ì](#2-½âÎö¹ý³Ì) - * [Îļþ´«ÊäЭÒé FTP](#Îļþ´«ÊäЭÒé-ftp) - * [Ô¶³ÌÖÕ¶ËЭÒé TELNET](#Ô¶³ÌÖÕ¶ËЭÒé-telnet) - * [ÍòÎ¬Íø WWW](#ÍòÎ¬Íø-www) - * [µç×ÓÓʼþЭÒé](#µç×ÓÓʼþЭÒé) + * [???????????](#???????????) + * [?????????????](#?????????????) + * [??¡¤????????ý‚??](#??¡¤????????ý‚??) + * [1. ??¡¤????](#1-??¡¤????) + * [2. ???????](#2-???????) + * [3. ???ý‚??](#3-???ý‚??) + * [???](#???) + * [1. ???????](#1-???????) + * [2. ???????](#2-???????) + * [3. ???????](#3-???????) + * [4. ??????](#4-??????) + * [??????????????*](#??????????????) + * [1. ???§¿??](#1-???§ï??) + * [2. ???§¿??](#2-???§ï??) + * [3. ???????????????????](#3-???????????????????) + * [4. TCP/IP ?????](#4-tcpip-?????) +* [????? ?????](#?????-?????) + * [?????](#?????) + * [???????](#???????) + * [??????¨¹???](#??????¨¹???) + * [1. ?????¨¢???????](#1-?????¨¢???????) + * [2. ?????????](#2-?????????) + * [3. ???????](#3-???????) + * [4. ??????](#4-??????) +* [?????? ??????¡¤??](#??????-??????¡¤??) + * [????????????](#????????????) + * [1. ??????](#1-??????) + * [2. ???????](#2-???????) + * [3. ?????](#3-?????) + * [??????? -PPP §¿??](#???????--ppp-§ï??) + * [????????????](#????????????) + * [????? - CSMA/CD §¿??*](#?????---csmacd-§ï??) + * [??????](#??????) + * [MAC ??](#mac-??) + * [?????????](#?????????) +* [?????? ?????*](#??????-?????) + * [????§¿?? IP ????](#????§ï??-ip-????) + * [IP ????????](#ip-????????) + * [IP ??????](#ip-??????) + * [1. ????? IP ???](#1-?????-ip-???) + * [2. ????????](#2-????????) + * [3. ??????? CIDR???????????](#3-???????-cidr???????????) + * [IP ????? MAC ???](#ip-?????-mac-???) + * [???????§¿?? ARP](#???????§ï??-arp) + * [¡¤???????](#¡¤???????) + * [????????¡¤??????????](#????????¡¤??????????) + * [¡¤???????????????](#¡¤???????????????) + * [¡¤?????§¿??](#¡¤?????§ï??) + * [1. ???????§¿?? RIP](#1-???????§ï??-rip) + * [2. ???????§¿?? OSPF](#2-???????§ï??-ospf) + * [3. ??????§¿?? BGP](#3-??????§ï??-bgp) + * [??????????§¿?? ICMP](#??????????§ï??-icmp) + * [??????????? PING](#???????????-ping) + * [IP ??](#ip-??) + * [????????? VPN](#?????????-vpn) + * [????????? NAT](#?????????-nat) +* [?????? ?????*](#??????-?????) + * [UDP ?? TCP ?????](#udp-??-tcp-?????) + * [UDP ??????](#udp-??????) + * [TCP ??????](#tcp-??????) + * [TCP ??????????](#tcp-??????????) + * [TCP ????¦Ë???](#tcp-????¦Ë???) + * [TCP ????????](#tcp-????????) + * [TCP ???????](#tcp-???????) + * [TCP ????????](#tcp-????????) + * [TCP ???????](#tcp-???????) + * [??????????????](#??????????????) + * [??????????](#??????????) +* [?????? ??¨°?*](#??????-??¨°?) + * [?????? DNS](#??????-dns) + * [1. ??¦Í?](#1-??¦Í?) + * [2. ????????](#2-????????) + * [???????§¿?? FTP](#???????§ï??-ftp) + * [??????§¿?? TELNET](#??????§ï??-telnet) + * [????? WWW](#?????-www) + * [???????§¿??](#???????§ï??) * [POP3](#pop3) * [IMAP](#imap) * [SMTP](#smtp) - * [¶¯Ì¬Ö÷»úÅäÖÃЭÒé DHCP](#¶¯Ì¬Ö÷»úÅäÖÃЭÒé-dhcp) - * [µã¶Ôµã´«Êä P2P](#µã¶Ôµã´«Êä-p2p) - * [Web Ò³ÃæÇëÇó¹ý³Ì](#web-Ò³ÃæÇëÇó¹ý³Ì) - * [³£Óö˿Ú](#³£Óö˿Ú) -* [²Î¿¼×ÊÁÏ](#²Î¿¼×ÊÁÏ) + * [???????????§¿?? DHCP](#???????????§ï??-dhcp) + * [?????? P2P](#??????-p2p) + * [Web ??????????](#web-??????????) + * [??????](#??????) +* [?¦Ï?????](#?¦Ï?????) -# µÚÒ»Õ ¸ÅÊö +# ????? ???? -## ÍøÂçµÄÍøÂç +## ????????? -ÍøÂç°ÑÖ÷»úÁ¬½ÓÆðÀ´£¬¶ø»¥ÁªÍøÊǰѶàÖÖ²»Í¬µÄÍøÂçÁ¬½ÓÆðÀ´£¬Òò´Ë»¥ÁªÍøÊÇÍøÂçµÄÍøÂç¡£ +?????????????????????????????????????????????????????????????????????³‡ ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/04ff7ae6-7bee-4cf8-82f8-dfe2ba1f3616.jpg) ## ISP -»¥ÁªÍø·þÎñÌṩÉÌ ISP ¿ÉÒÔ´Ó»¥ÁªÍø¹ÜÀí»ú¹¹»ñµÃÐí¶à IP µØÖ·£¬Í¬Ê±ÓµÓÐͨÐÅÏß·ÒÔ¼°Â·ÓÉÆ÷µÈÁªÍøÉ豸£¬¸öÈË»ò»ú¹¹Ïò ISP ½ÉÄÉÒ»¶¨µÄ·ÑÓþͿÉÒÔ½ÓÈ뻥ÁªÍø¡£ +?????????????? ISP ??????????????????????? IP ???????????????¡¤???¡¤???????????õô???????????? ISP ????????????????????????? -ĿǰµÄ»¥ÁªÍøÊÇÒ»ÖÖ¶à²ã´Î ISP ½á¹¹£¬ISP ¸ù¾Ý¸²¸ÇÃæ»ýµÄ´óС·ÖΪÖ÷¸É ISP¡¢µØÇø ISP ºÍ±¾µØ ISP¡£ +????????????????? ISP ????ISP ?????????????§³??????? ISP?????? ISP ????? ISP?? -»¥ÁªÍø½»»»µã IXP ÔÊÐíÁ½¸öÍøÂçÖ±½ÓÏàÁ¬¶ø²»Óþ­¹ýµÚÈý¸öÀ´×ª·¢·Ö×é¡£ +???????????? IXP ??????????????????????????????????????????î• ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/17d807ef-03bf-4824-a97c-ea5fb58ec61d.jpg) -## »¥ÁªÍøµÄ×é³É +## ??????????? -1. ±ßÔµ²¿·Ö£ºËùÓÐÁ¬½ÓÔÚ»¥ÁªÍøÉϵÄÖ÷»ú¡£Óû§¿ÉÒÔÖ±½ÓʹÓã» -2. ºËÐIJ¿·Ö£ºÓÉ´óÁ¿µÄÍøÂçºÍÁ¬½ÓÕâÐ©ÍøÂçµÄ·ÓÉÆ÷×é³É¡£Îª±ßÔµ²¿·ÖµÄÖ÷»úÌṩ·þÎñ¡£ +1. ?????????????????????????????????????????????? +2. ??????????????????????????§»?????¡¤??????¨À???????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/005d83c2-e64a-41f0-bbdd-51c71d494a18.jpg) -## Ö÷»úÖ®¼äµÄͨÐÅ·½Ê½ +## ????????????? -**1. ¿Í»§ - ·þÎñÆ÷£¨C/S£©** +**1. ??? - ????????C/S??** -¿Í»§¼´ÊÇ·þÎñÇëÇó·½£¬·þÎñÆ÷ÊÇ·þÎñÌṩ·½¡£ +???????????????????????????????? -**2. ¶ÔµÈ£¨P2P£©** +**2. ????P2P??** -²»Çø·Ö¿Í»§ºÍ·þÎñÆ÷¡£ +????????????????? -## µç·½»»»Óë·Ö×é½»»» +## ??¡¤????????ý‚?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/b97958dd-3e43-45f7-97f5-3ec20f3f8b88.jpg) -### 1. µç·½»»» +### 1. ??¡¤???? -µç·½»»»ÓÃÓڵ绰ͨÐÅϵͳ£¬Á½¸öÓû§ÒªÍ¨ÐÅ֮ǰÐèÒª½¨Á¢Ò»ÌõרÓõÄÎïÀíÁ´Â·£¬²¢ÇÒÔÚÕû¸öͨÐŹý³ÌÖÐʼÖÕÕ¼ÓøÃÁ´Â·¡£ÓÉÓÚͨÐŵĹý³ÌÖв»¿ÉÄÜÒ»Ö±ÔÚʹÓô«ÊäÏß·£¬Òò´Ëµç·½»»»¶ÔÏß·µÄÀûÓÃÂʺܵͣ¬ÍùÍù²»µ½ 10%¡£ +??¡¤????????´Â????????????????????????????????????????¡¤?????????????????????????????¡¤??????????????§Ó?????????????????¡¤??????¡¤????????¡¤??????????????????? 10%?? -### 2. ±¨ÎĽ»»» +### 2. ??????? -±¨ÎĽ»»»ÓÃÓÚÓʾÖͨÐÅϵͳ£¬ÓʾֽÓÊÕµ½Ò»·Ý±¨ÎÄÖ®ºó£¬ÏÈ´æ´¢ÏÂÀ´£¬È»ºó¸ù¾ÝÄ¿µÄµØÑ¡ÔñÐԵذѱ¨ÎÄת·¢µ½ÏÂÒ»¸öÄ¿µÄµØ£¬Õâ¸ö¹ý³Ì¾ÍÊǴ洢ת·¢¹ý³Ì¡£ +???????????????????????????????????????›¥???????????????????????????????????????????????????›¥???????? -### 3. ·Ö×é½»»» +### 3. ???ý‚?? -·Ö×é½»»»Ò²Ê¹ÓÃÁ˴洢ת·¢£¬µ«ÊÇת·¢µÄÊÇ·Ö×é¶ø²»ÊDZ¨ÎÄ¡£°ÑÕû¿éÊý¾Ý³ÆÎªÒ»¸ö±¨ÎÄ£¬ÓÉÓÚÒ»¸ö±¨ÎÄ¿ÉÄܺܳ¤£¬ÐèÒªÏȽøÐÐÇз֣¬À´Âú×ã·Ö×éÄÜ´¦ÀíµÄ´óС¡£ÔÚÿ¸öÇзֵÄÊý¾ÝÇ°Ãæ¼ÓÉÏÊײ¿Ö®ºó¾Í³ÉΪÁË·Ö×飬Êײ¿°üº¬ÁËÄ¿µÄµØÖ·ºÍÔ´µØÖ·µÈ¿ØÖÆÐÅÏ¢¡£ +???ý‚????????›¥???????????????????????????????????????????????????????????????????????????§Ù??????????????????§³????????§Ù?????????????????????????ï…?????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/6f4af159-8b03-4246-8d0e-222db65bb83c.jpg) -´æ´¢×ª·¢ÔÊÐíÔÚÒ»Ìõ´«ÊäÏß·ÉÏ´«ËͶà¸öÖ÷»úµÄ·Ö×飬Ҳ¾ÍÊÇ·Ö×é½»»»²»ÐèÒªÕ¼Óö˵½¶ËµÄÏß·×ÊÔ´¡£ +?›¥??????????????????¡¤???????????????ï…???????ý‚?????????????????¡¤????? -Ïà±ÈÓÚ±¨ÎĽ»»»£¬ÓÉÓÚ·Ö×é±È±¨ÎĸüС£¬´æ´¢×ª·¢µÄËÙ¶ÈÒ²¾Í¸ü¿ì¡£ +?????????????????????????§³???›¥?????????????? -## ʱÑÓ +## ??? -×ÜʱÑÓ = ·¢ËÍʱÑÓ + ´«²¥Ê±ÑÓ + ´¦ÀíʱÑÓ + ÅŶÓʱÑÓ +????? = ??????? + ??????? + ??????? + ?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ceee91c2-da26-4169-94c3-e4608b46b9ac.png) -### 1. ·¢ËÍʱÑÓ +### 1. ??????? -Ö÷»ú»ò·ÓÉÆ÷·¢ËÍÊý¾ÝÖ¡ËùÐèÒªµÄʱ¼ä¡£ +??????¡¤??????????????????????? ![](http://latex.codecogs.com/gif.latex?\\\\delay=\frac{l(bit)}{v(bit/s)}) -ÆäÖÐ l ±íʾÊý¾ÝÖ¡µÄ³¤¶È£¬v ±íʾ·¢ËÍËÙÂÊ¡£ +???? l ??????????????v ???????????? -### 2. ´«²¥Ê±ÑÓ +### 2. ??????? -µç´Å²¨ÔÚÐŵÀÖд«²¥Ò»¶¨µÄ¾àÀëÐèÒª»¨·ÑµÄʱ¼ä£¬µç´Å²¨´«²¥ËٶȽӽü¹âËÙ¡£ +??????????§Õ???????????????????????????????????????? ![](http://latex.codecogs.com/gif.latex?\\\\delay=\frac{l(m)}{v(m/s)}) -ÆäÖÐ l ±íʾÐŵÀ³¤¶È£¬v ±íʾµç´Å²¨ÔÚÐŵÀÉϵĴ«²¥ËÙÂÊ¡£ +???? l ???????????v ??????????????????????? -### 3. ´¦ÀíʱÑÓ +### 3. ??????? -Ö÷»ú»ò·ÓÉÆ÷ÊÕµ½·Ö×éʱ½øÐд¦ÀíËùÐèÒªµÄʱ¼ä£¬ÀýÈç·ÖÎöÊײ¿£¬´Ó·Ö×éÖÐÌáÈ¡Êý¾Ý²¿·ÖµÈ¡£ +??????¡¤???????????????§Õ???????????????????????????????????????????? -### 4. ÅŶÓʱÑÓ +### 4. ?????? -·Ö×éÔÚ·ÓÉÆ÷µÄÊäÈë¶ÓÁкÍÊä³ö¶ÓÁÐÖÐÅŶӵȴýµÄʱ¼ä£¬È¡¾öÓÚÍøÂ統ǰµÄͨÐÅÁ¿¡£ +??????¡¤????????????§Ü????????????????????????????½y?????????? -## ¼ÆËã»úÍøÂçÌåϵ½á¹¹* +## ??????????????* ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1005dc9d-9049-4b06-9524-6171e56ebd8c.png) -### 1. Æß²ãЭÒé +### 1. ???§¿?? -Èçͼ a Ëùʾ£¬ÆäÖбíʾ²ãºÍ»á»°²ãÓÃ;ÈçÏ£º +??? a ????????§Ò???????????????? -1. ±íʾ²ã£ºÐÅÏ¢µÄÓï·¨ÓïÒåÒÔ¼°ËüÃǵĹØÁª£¬Èç¼ÓÃܽâÃÜ¡¢×ª»»·­Ò롢ѹËõ½âѹËõ£» -2. »á»°²ã£º²»Í¬»úÆ÷ÉϵÄÓû§Ö®¼ä½¨Á¢¼°¹ÜÀí»á»°¡£ +1. ??????????????????????????????????????????????????????? +2. ???????????????????�Ü??????????? -### 2. Îå²ãЭÒé +### 2. ???§¿?? -1. Ó¦ÓÃ²ã£ºÎªÌØ¶¨Ó¦ÓóÌÐòÌṩÊý¾Ý´«Êä·þÎñ£¬ÀýÈç HTTP¡¢DNS µÈ¡£Êý¾Ýµ¥Î»Îª±¨ÎÄ¡£ +1. ??¨°???????¨®??????????????????? HTTP??DNS ????????¦Ë?????? -2. ÔËÊä²ã£ºÌṩµÄÊǽø³Ì¼äµÄͨÓÃÊý¾Ý´«Êä·þÎñ¡£ÓÉÓÚÓ¦ÓòãЭÒéºÜ¶à£¬¶¨ÒåͨÓõÄÔËÊä²ãЭÒé¾Í¿ÉÒÔÖ§³Ö²»¶ÏÔö¶àµÄÓ¦ÓòãЭÒé¡£ÔËÊä²ã°üÀ¨Á½ÖÖЭÒ飺´«Êä¿ØÖÆÐ­Òé TCP£¬Ìá¹©ÃæÏòÁ¬½Ó¡¢¿É¿¿µÄÊý¾Ý´«Êä·þÎñ£¬Êý¾Ýµ¥Î»Îª±¨ÎĶΣ»Óû§Êý¾Ý±¨Ð­Òé UDP£¬ÌṩÎÞÁ¬½Ó¡¢¾¡×î´óŬÁ¦µÄÊý¾Ý´«Êä·þÎñ£¬Êý¾Ýµ¥Î»ÎªÓû§Êý¾Ý±¨¡£ +2. ???????????????????????????????????¨°?§¿?????????????????§¿???????????????????¨°?§¿?î•????????????§¿?ï“???????§¿?? TCP?????????????????????????????????¦Ë?????¦²?????????§¿?? UDP????????????????????????????????????¦Ë??????????? -3. ÍøÂç²ã£ºÎªÖ÷»úÖ®¼äÌṩ·þÎñ£¬¶ø²»ÊÇÏñÔËÊä²ãЭÒéÄÇÑùÊÇΪÖ÷»úÖеĽø³ÌÌṩ·þÎñ¡£ÍøÂç²ã°ÑÔËÊä²ã²úÉúµÄ±¨ÎĶλòÕßÓû§Êý¾Ý±¨·â×°³É·Ö×éÀ´½øÐд«Êä¡£ +3. ???????????????????????????????§¿??????????????§Ö?????????????????????????????¦Ë????????????????????????§Õ??? -4. Êý¾ÝÁ´Â·²ã£ºÍøÂç²ãÕë¶ÔµÄ»¹ÊÇÖ÷»úÖ®¼ä£¬¶øÖ÷»úÖ®¼ä¿ÉÒÔÓкܶàÁ´Â·£¬Á´Â·²ãЭÒé¾ÍÊÇΪÏàÁÚ½áµãÖ®¼äÌṩ·þÎñ¡£Êý¾ÝÁ´Â·²ã°ÑÍøÂç²ã´«À´µÄ·Ö×é·â×°³ÉÖ¡¡£ +4. ??????¡¤??????????????????????????????????§Ü????¡¤????¡¤??§¿???????????????????????????¡¤?????????????????????? -5. ÎïÀí²ã£º¿¼ÂǵÄÊÇÔõÑùÔÚ´«ÊäýÌåÉÏ´«ÊäÊý¾Ý±ÈÌØÁ÷£¬¶ø²»ÊÇÖ¸¾ßÌåµÄ´«ÊäýÌå¡£ÎïÀí²ãµÄ×÷ÓÃÊǾ¡¿ÉÄÜÆÁ±Î´«ÊäýÌåºÍͨÐÅÊֶεIJîÒ죬ʹÎïÀí²ãÉϵÄÊý¾ÝÁ´Â·²ã¸Ð¾õ²»µ½ÕâЩ²îÒì¡£ +5. ?????????????????????????????????????????????????????????‰^????????????????????¦Ä????????????¦Å???????????????????¡¤??§à???????§»???? -### 3. Êý¾ÝÔÚ¸÷²ãÖ®¼äµÄ´«µÝ¹ý³Ì +### 3. ??????????????????? -ÔÚÏòϵĹý³ÌÖУ¬ÐèÒªÌí¼ÓϲãЭÒéËùÐèÒªµÄÊײ¿»òÕßβ²¿£¬¶øÔÚÏòÉϵĹý³ÌÖв»¶Ï²ð¿ªÊײ¿ºÍβ²¿¡£ +???????????§µ??????????§¿????????????????¦Â?????????????????§Ó?????????¦Â???? -·ÓÉÆ÷Ö»ÓÐÏÂÃæÈý²ãЭÒ飬ÒòΪ·ÓÉÆ÷λÓÚÍøÂçºËÐÄÖУ¬²»ÐèҪΪ½ø³Ì»òÕßÓ¦ÓóÌÐòÌṩ·þÎñ¡£ +¡¤???????????????§¿?ï…???¡¤????¦Ë??????????§µ????????????????¨®????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/f7d5da89-2d75-4d8f-85e7-6b608865dc00.jpg) -### 4. TCP/IP Ìåϵ½á¹¹ +### 4. TCP/IP ????? -ËüÖ»ÓÐËIJ㣬Ï൱ÓÚÎå²ãЭÒéÖÐÊý¾ÝÁ´Â·²ãºÍÎïÀí²ãºÏ²¢ÎªÍøÂç½Ó¿Ú²ã¡£ +???????????????§¿??????????¡¤?????????????????? -ÏÖÔÚµÄ TCP/IP Ìåϵ½á¹¹²»Ñϸñ×ñÑ­ OSI ·Ö²ã¸ÅÄӦÓòã¿ÉÄÜ»áÖ±½ÓʹÓà IP ²ã»òÕßÍøÂç½Ó¿Ú²ã¡£ +????? TCP/IP ????????????? OSI ????????¨°??????????? IP ???????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/3e2200b3-1c18-4853-ae42-7788e8e1f939.png) -TCP/IP ЭÒé×åÊÇÒ»ÖÖɳ©ÐÎ×´£¬ÖмäСÁ½±ß´ó£¬IP ЭÒéÔÚÆäÖÐÕ¼ÓþÙ×ãÇáÖØµÄµØÎ»¡£ +TCP/IP §¿?????????????????§Þ?§³?????IP §¿????????????????????¦Ë?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/9ecaebee-670e-4cb2-9cdb-3029c00f33bd.png) -# µÚ¶þÕ ÎïÀí²ã +# ????? ????? -## ͨÐÅ·½Ê½ +## ????? -1. µ¥ÏòͨÐÅ£¬ÓÖ³ÆÎªµ¥¹¤Í¨ÐÅ£» -2. Ë«Ïò½»ÌæÍ¨ÐÅ£¬ÓÖ³ÆÎª°ëË«¹¤Í¨ÐÅ£» -3. Ë«ÏòͬʱͨÐÅ£¬ÓÖ³ÆÎªÈ«Ë«¹¤Í¨ÐÅ¡£ +1. ???????????????????? +2. ?????????????????????? +3. ????????????????????? -## ´øÍ¨µ÷ÖÆ +## ??????? -Ä£ÄâÐźÅÊÇÁ¬ÐøµÄÐźţ¬Êý×ÖÐźÅÊÇÀëÉ¢µÄÐźš£´øÍ¨µ÷ÖÆ°ÑÊý×ÖÐźÅת»»ÎªÄ£ÄâÐźš£ +?????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/d2c55c84-aa1f-43c1-bd97-457bcb7816b3.png) -## ÐŵÀ¸´Óü¼Êõ +## ??????¨¹??? -### 1. Ƶ·Ö¸´Óá¢Ê±·Ö¸´Óà +### 1. ?????¨¢??????? -Ƶ·Ö¸´ÓõÄËùÓÐÓû§ÔÚÏàͬµÄʱ¼äÕ¼Óò»Í¬µÄƵÂÊ´ø¿í×ÊÔ´£»Ê±·Ö¸´ÓõÄËùÓÐÓû§ÔÚ²»Í¬µÄʱ¼äÕ¼ÓÃÏàͬµÄƵÂÊ´ø¿í×ÊÔ´¡£ +??????????????????????????¨°????????????????????????????????????????????????????????? -ʹÓÃÕâÁ½ÖÖ·½Ê½½øÐÐͨÐÅ£¬ÔÚͨÐŵĹý³ÌÖÐÓû§»áÒ»Ö±Õ¼ÓÃÒ»²¿·ÖÐŵÀ×ÊÔ´¡£µ«ÊÇÓÉÓÚ¼ÆËã»úÊý¾ÝµÄÍ»·¢ÐÔÖÊ£¬Ã»±ØÒªÒ»Ö±Õ¼ÓÃÐŵÀ×ÊÔ´¶ø²»Èóö¸øÆäËüÓû§Ê¹Óã¬Òò´ËÕâÁ½ÖÖ·½Ê½¶ÔÐŵÀµÄÀûÓÃÂʶ¼²»¸ß¡£ +??????????????????????????????????????????????????????????????????????????????????????????????????¨®???????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/543d47a1-f0dd-414f-b23c-0c142c814854.png) -### 2. ͳ¼ÆÊ±·Ö¸´Óà +### 2. ????????? -ÊǶÔʱ·Ö¸´ÓõÄÒ»ÖָĽø£¬²»¹Ì¶¨Ã¿¸öÓû§ÔÚʱ·Ö¸´ÓÃÖ¡ÖеÄλÖã¬Ö»ÒªÓÐÊý¾Ý¾Í¼¯ÖÐÆðÀ´×é³Éʱ·Ö¸´ÓÃÖ¡È»ºó·¢ËÍ¡£ +??????????????????????????????????????§Ö?¦Ë??????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/29058e09-bb72-4040-a73d-4c497895e9ce.jpg) -### 3. ²¨·Ö¸´Óà +### 3. ??????? -¹âµÄƵ·Ö¸´Óá£ÓÉÓÚ¹âµÄƵÂʺܸߣ¬Òò´Ëϰ¹ßÉÏÓò¨³¤¶ø²»ÊÇÆµÂÊÀ´±íʾËùʹÓõĹâÔØ²¨¡£ +????????¨¢??????????????????????¨°????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/78534153-88d1-4f83-a6e0-59064dbdc43a.png) -### 4. Âë·Ö¸´Óà +### 4. ?????? -Ϊÿ¸öÓû§·ÖÅä m bit µÄÂëÆ¬£¬²¢ÇÒËùÓеÄÂëÆ¬Õý½»£¬¶ÔÓÚÈÎÒâÁ½¸öÂëÆ¬ $\vec{S}$ ºÍ $\vec{T}$ ÓÐ +??????????? m bit ??????????????§Ö????????????????????????? $\vec{S}$ ?? $\vec{T}$ ?? ![](http://latex.codecogs.com/gif.latex?\\\\\vec{S}\cdot\vec{T}=0) -ΪÁË·½±ã£¬È¡ m=8£¬ÉèÂëÆ¬ $\vec{S}$ Ϊ 00011011¡£ÔÚÓµÓиÃÂëÆ¬µÄÓû§·¢ËͱÈÌØ 1 ʱ¾Í·¢Ë͸ÃÂëÆ¬£¬·¢ËͱÈÌØ 0 ʱ¾Í·¢Ë͸ÃÂëÆ¬µÄ·´Âë 11100100¡£ +??????? m=8??????? $\vec{S}$ ? 00011011??????§Ú???????????????? 1 ??????????????????? 0 ??????????????? 11100100?? -ÔÚ¼ÆËãʱ½« 00011011 ¼Ç×÷ (-1 -1 -1 +1 +1 -1 +1 +1)£¬¿ÉÒԵõ½ +???????? 00011011 ???? (-1 -1 -1 +1 +1 -1 +1 +1)???????? ![](http://latex.codecogs.com/gif.latex?\\\\\frac{1}{m}\vec{S}\cdot\vec{S}=1) ![](http://latex.codecogs.com/gif.latex?\\\\\frac{1}{m}\vec{S}\cdot\vec{S'}=-1) -ÆäÖÐ $\vec{S'}$ Ϊ $\vec{S}$ µÄ·´Âë¡£ +???? $\vec{S'}$ ? $\vec{S}$ ????? -ÀûÓÃÉÏÃæµÄʽ×ÓÎÒÃÇÖªµÀ£¬µ±½ÓÊÕ¶ËʹÓÃÂëÆ¬ $\vec{S}$ ¶Ô½ÓÊÕµ½µÄÊý¾Ý½øÐÐÄÚ»ýÔËËãʱ£¬½á¹ûΪ 0 µÄÊÇÆäËüÓû§·¢Ë͵ÄÊý¾Ý£¬½á¹ûΪ 1 µÄÊÇÓû§·¢Ë͵ıÈÌØ 1£¬½á¹ûΪ -1 µÄÊÇÓû§·¢Ë͵ıÈÌØ 0¡£ +?????????????????????????????????? $\vec{S}$ ????????????????????????????? 0 ????????????????????????? 1 ??????????????? 1?????? -1 ??????????????? 0?? -Âë·Ö¸´Ó÷¢Ë͵ÄÊý¾ÝÁ¿ÎªÔ­Ï鵀 m ±¶¡£ +?????¡Â??????????????? m ???? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/0042edad-8e3b-4279-bd93-6906fcd1b640.jpg) -# µÚÈýÕ Êý¾ÝÁ´Â·²ã +# ?????? ??????¡¤?? -## Èý¸ö»ù±¾ÎÊÌâ +## ???????????? -### 1. ·â×°³ÉÖ¡ +### 1. ?????? -½«ÍøÂç²ã´«ÏÂÀ´µÄ·Ö×éÌí¼ÓÊײ¿ºÍβ²¿£¬ÓÃÓÚ±ê¼ÇÖ¡µÄ¿ªÊ¼ºÍ½áÊø¡£ +????????????????????????¦Â?????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ea5ed9b2-6d9f-48fb-b890-0288caf9088a.jpg) -### 2. ͸Ã÷´«Êä +### 2. ??????? -͸Ã÷±íʾһ¸öʵ¼Ê´æÔÚµÄÊÂÎï¿´ÆðÀ´ºÃÏñ²»´æÔÚÒ»Ñù¡£ +???????????????????????????????????? -Ö¡ÖÐÓÐÊײ¿ºÍβ²¿£¬Èç¹ûÖ¡µÄÊý¾Ý²¿·Öº¬ÓкÍÊײ¿Î²²¿ÏàͬµÄÄÚÈÝ£¬ÄÇô֡µÄ¿ªÊ¼ºÍ½áÊøÎ»Öþͻᱻ´íÎóµÄÅж¨¡£ÐèÒªÔÚÊý¾ÝÖгöÏÖÊײ¿Î²²¿ÏàͬµÄÄÚÈÝÇ°Ãæ²åÈëתÒå×Ö·û£¬Èç¹ûÐèÒª´«ÊäµÄÄÚÈÝÕýºÃ¾ÍÊÇתÒå×Ö·û£¬ÄÇô¾ÍÔÚתÒå×Ö·ûÇ°ÃæÔÙ¼Ó¸öתÒå×Ö·û£¬ÔÚ½ÓÊն˽øÐд¦ÀíÖ®ºó¿ÉÒÔ»¹Ô­³öԭʼÊý¾Ý¡£Õâ¸ö¹ý³Ì͸Ã÷´«ÊäµÄÄÚÈÝÊÇתÒå×Ö·û£¬Óû§ºÜÄѲì¾õµ½×ªÒå×Ö·ûµÄ´æÔÚ¡£ +??????????¦Â???????????????????§Ü????¦Â?????????????????????????¦Ë??????????§Ø?????????????§Ô??????¦Â???????????????????????????????????????????????????????????????????????????????????????????§Õ???????????????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/44e1d90e-3fe6-4dd6-8dce-6daab12e7663.jpg) -### 3. ²î´í¼ì²â +### 3. ????? -ĿǰÊý¾ÝÁ´Â·²ã¹ã·ºÊ¹ÓÃÁËÑ­»·ÈßÓà¼ìÑ飨CRC£©À´¼ì²é±ÈÌØ²î´í¡£ +????????¡¤?????????????????÷ÏCRC???????????? -## µã¶ÔµãÐŵÀ -PPP ЭÒé +## ??????? -PPP §¿?? -»¥ÁªÍøÓû§Í¨³£ÐèÒªÁ¬½Óµ½Ä³¸ö ISP Ö®ºó²ÅÄܽÓÈëµ½»¥ÁªÍø£¬PPP ЭÒé¾ÍÊÇÓû§¼ÆËã»úºÍ ISP ½øÐÐͨÐÅʱËùʹÓõÄÊý¾ÝÁ´Â·²ãЭÒé¡£ +??????????????????????? ISP ?????????????????PPP §¿??????????????? ISP ????????????????????¡¤??§¿?î• ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8b5bd2c8-8425-4a8b-89db-235c95800de9.jpg) -ÔÚ PPP µÄÖ¡ÖУ¬F ×Ö¶ÎΪ֡µÄ¶¨½ç·û£¬A ºÍ C ÔÝʱûÓÐÒâÒå¡£FCS ÊÇʹÓà CRC µÄ¼ìÑéÐòÁС£ÐÅÏ¢×ֶεij¤¶È²»³¬¹ý 1500¡£ +?? PPP ????§µ?F ?????????????A ?? C ?????????‰^FCS ????? CRC ????????§³??????¦Å????????? 1500?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a5fa89e7-54b9-4e2f-8c48-a35712d7b2f5.jpg) -## ¾ÖÓòÍøµÄÍØÆË +## ???????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8b15e36f-69b4-46b6-a07c-7234ac7c7927.jpg) -## ¹ã²¥ÐŵÀ - CSMA/CD ЭÒé* +## ????? - CSMA/CD §¿??* -Ôڹ㲥ÐŵÀÉÏ£¬Í¬Ò»Ê±¼äÖ»ÄÜÔÊÐíһ̨¼ÆËã»ú·¢ËÍÊý¾Ý¡£ +????????????????????????????????????? -CSMA/CD ±íÊ¾ÔØ²¨¼àÌý¶àµã½ÓÈë / Åöײ¼ì²â¡£ +CSMA/CD ???????????????? / ?????? -**¶àµã½ÓÈë**£ºËµÃ÷ÕâÊÇ×ÜÏßÐÍÍøÂ磬Ðí¶à¼ÆËã»úÒÔ¶àµãµÄ·½Ê½Á¬½Óµ½×ÜÏßÉÏ¡£ -**ÔØ²¨¼àÌý**£ºÃ¿¸öÕ¾¶¼±ØÐ벻ͣµØ¼ìÌýÐŵÀ¡£ÔÚ·¢ËÍǰ£¬Èç¹û¼ìÌýÐŵÀÕýÔÚʹÓ㬾ͱØÐëµÈ´ý¡£ -**Åöײ¼ì²â**£ºÔÚ·¢ËÍÖУ¬Èç¹û¼ìÌýÐŵÀÒÑÓÐÆäËüÕ¾ÕýÔÚ·¢ËÍÊý¾Ý£¬¾Í±íʾ·¢ÉúÁËÅöײ¡£ËäȻÿһ¸öÕ¾ÔÚ·¢ËÍÊý¾Ý֮ǰ¶¼ÒѾ­¼ìÌýÐŵÀΪ¿ÕÏУ¬µ«ÊÇÓÉÓÚµç´Å²¨µÄ´«²¥Ê±ÑӵĴæÔÚ£¬»¹ÊÇÓпÉÄܻᷢÉúÅöײ¡£ +**??????**??????????????????íà?????????????????????????? +**???????**?????????????????????????????????????????????????????????? +**??????**????????§µ??????????????????????????????????????????????????????????????????????????????????§µ??????????????????????????????§á??????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/f9ed4da5-0032-41e6-991a-36d995ec28fd.png) -¼Ç¶Ëµ½¶ËµÄ´«²¥Ê±ÑÓΪ ¦Ó£¬×îÏÈ·¢Ë͵ÄÕ¾µã×î¶à¾­¹ý 2¦Ó ¾Í¿ÉÒÔÖªµÀÊÇ·ñ·¢ÉúÁËÅöײ£¬³Æ 2¦Ó Ϊ **ÕùÓÃÆÚ**¡£Ö»Óо­¹ýÕùÓÃÆÚÖ®ºó»¹Ã»Óмì²âµ½Åöײ£¬²ÅÄܿ϶¨Õâ´Î·¢ËͲ»»á·¢ÉúÅöײ¡£ +?????????????? ??????????????????? 2?? ?????????????????????? 2?? ? **??????**????§à??????????????§Þ???????????????¦Ç????????????? -µ±·¢ÉúÅöײʱ£¬Õ¾µãҪֹͣ·¢ËÍ£¬µÈ´ýÒ»¶Îʱ¼äÔÙ·¢ËÍ¡£Õâ¸öʱ¼ä²ÉÓà **½Ø¶Ï¶þ½øÖÆÖ¸ÊýÍ˱ÜËã·¨** À´È·¶¨£¬´ÓÀëÉ¢µÄÕûÊý¼¯ºÏ {0, 1, .., (2k-1)} ÖÐËæ»úÈ¡³öÒ»¸öÊý£¬¼Ç×÷ r£¬È»ºóÈ¡ r ±¶µÄÕùÓÃÆÚ×÷ÎªÖØ´«µÈ´ýʱ¼ä¡£ +??????????????????????????????????????????????? **????????????????** ?????????????????????? {0, 1, .., (2k-1)} ??????????????????? r?????? r ?????????????????????? -## ¼¯Ï߯÷ +## ?????? -´Ó±íÃæÉÏ¿´£¬Ê¹Óü¯Ï߯÷µÄ¾ÖÓòÍøÔÚÎïÀíÉÏÊÇÒ»¸öÐÇÐÍÍø¡£µ«ÊǼ¯Ï߯÷ʹÓõç×ÓÆ÷¼þÀ´Ä£Äâʵ¼ÊÀÂÏߵŤ×÷£¬Âß¼­ÉÏÈÔÊÇÒ»¸ö×ÜÏßÍø£¬Õû¸öϵͳÈÔÏñÒ»¸ö´«Í³ÒÔÌ«ÍøÄÇÑùÔËÐС£ +????????????¨¹??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????§³? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/897a4f4e-2683-44e1-a26a-c0d0234dc576.jpg) ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/40c3f8e5-3a20-45b6-a60c-77b9b952e104.jpg) -## MAC ²ã +## MAC ?? -MAC µØÖ·ÊÇ 6 ×Ö½Ú£¨48 룩µÄµØÖ·£¬ÓÃÓÚΨһ±íʾÊÊÅäÆ÷£¬Ò»Ì¨Ö÷»úÓµÓжà¸öÊÊÅäÆ÷¾ÍÓжà¸ö MAC µØÖ·£¬ÀýÈç±Ê¼Ç±¾µçÄÔÆÕ±é´æÔÚÎÞÏßÍøÂçÊÊÅäÆ÷ºÍÓÐÏßÍøÂçÊÊÅäÆ÷¡£ +MAC ????? 6 ????48 ¦Ë????????????¦·????????????????????§Ø???????????§Ø?? MAC ?????????????????????????????????????????????????????? -MAC Ö¡ÓÃÀàÐÍ×Ö¶ÎÀ´±ê¼ÇÉϲãʹÓÃʲôЭÒ飻Êý¾Ý×ֶ㤶ÈÔÚ 46-1500 Ö®¼ä£¬Èç¹û̫СÔòÐèÒªÌî³ä£»FCS Ϊ֡¼ìÑéÐòÁУ¬Ê¹ÓõÄÊÇ CRC ¼ìÑé·½·¨£»Ç°Ãæ²åÈëµÄǰͬ²½ÂëÖ»ÊÇΪÁ˼ÆËã FCS ÁÙʱ¼ÓÈëµÄ£¬¼ÆËã½áÊøÖ®ºó»á¶ªÆú¡£ +MAC ???????????????????????§¿?ï”??????¦Ã????? 46-1500 ???????§³????????FCS ?????????§µ??????? CRC ???ú›?????????????????????????? FCS ???????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/50d38e84-238f-4081-8876-14ef6d7938b5.jpg) -## ÐéÄâ¾ÖÓòÍø +## ????????? -ÐéÄâ¾ÖÓòÍø¿ÉÒÔ½¨Á¢ÓëÎïÀíλÖÃÎ޹صÄÂß¼­×飬ֻÓÐÔÚͬһ¸öÐéÄâ¾ÖÓòÍøÖеijÉÔ±²Å»áÊÕµ½¹ã²¥ÐÅÏ¢£¬ÀýÈçÏÂͼÖÐ (A1, A2, A3, A4) ÊôÓÚÒ»¸öÐéÄâ¾ÖÓòÍø£¬A1 ·¢Ë͵Ĺ㲥»á±» A2¡¢A3¡¢A4 ÊÕµ½£¬¶øÆäËüÕ¾µãÊÕ²»µ½¡£ +??????????????????????¦Ë??????????ï…???????????????????§Ö????????????????????????? (A1, A2, A3, A4) ??????????????????A1 ???????? A2??A3??A4 ????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a74b70ac-323a-4b31-b4d5-90569b8a944b.png) -# µÚËÄÕÂ ÍøÂç²ã* +# ?????? ?????* -## Íø¼ÊЭÒé IP ¸ÅÊö +## ????§¿?? IP ???? -ÒòÎªÍøÂç²ãÊÇÕû¸ö»¥ÁªÍøµÄºËÐÄ£¬Òò´ËÓ¦µ±ÈÃÍøÂç²ã¾¡¿ÉÄܼòµ¥¡£ÍøÂç²ãÏòÉÏÖ»Ìṩ¼òµ¥Áé»îµÄ¡¢ÎÞÁ¬½ÓµÄ¡¢¾¡×î´óŬÁ¦½»»¥µÄÊý¾Ý±¨·þÎñ¡£ +??????????????????????????????????????????????????????????????????????????????????????????????? -ʹÓà IP ЭÒ飬¿ÉÒÔ°ÑÒì¹¹µÄÎïÀíÍøÂçÁ¬½ÓÆðÀ´£¬Ê¹µÃÔÚÍøÂç²ã¿´ÆðÀ´ºÃÏñÊÇÒ»¸öͳһµÄÍøÂç¡£ +??? IP §¿?ï…?????????????????????????????????????????????????????????³‡ ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/fe3d224c-8ffd-40f9-85b1-86ffe1393f6c.jpg) -Óë IP ЭÒéÅäÌ×ʹÓõϹÓÐÈý¸öЭÒ飺 +?? IP §¿?????????????????§¿?ï“ -1. µØÖ·½âÎöЭÒé ARP£¨Address Resolution Protocol£© -2. Íø¼Ê¿ØÖƱ¨ÎÄЭÒé ICMP£¨Internet Control Message Protocol£© -3. Íø¼Ê×é¹ÜÀíЭÒé IGMP£¨Internet Group Management Protocol£© +1. ???????§¿?? ARP??Address Resolution Protocol?? +2. ??????????§¿?? ICMP??Internet Control Message Protocol?? +3. ?????????§¿?? IGMP??Internet Group Management Protocol?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/163cf8b4-5f30-46c9-af00-316a71b3c890.jpg) -## IP Êý¾Ý±¨¸ñʽ +## IP ???????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8681db55-0873-434b-aa98-83d07e8392ae.jpg) -**°æ±¾** : ÓÐ 4£¨IPv4£©ºÍ 6£¨IPv6£©Á½¸öÖµ£» +**?·Ú** : ?? 4??IPv4???? 6??IPv6????????? -**Êײ¿³¤¶È** : Õ¼ 4 룬Òò´Ë×î´óֵΪ 15¡£ÖµÎª 1 ±íʾµÄÊÇ 1 ¸ö 32 λ×ֵij¤¶È£¬Ò²¾ÍÊÇ 4 ×Ö½Ú¡£ÒòΪÊײ¿¹Ì¶¨³¤¶ÈΪ 20 ×Ö½Ú£¬Òò´Ë¸ÃÖµ×îСΪ 5¡£Èç¹û¿ÉÑ¡²¿·ÖµÄ³¤¶È²»ÊÇ 4 ×Ö½ÚµÄÕûÊý±¶£¬¾ÍÓÃβ²¿µÄÌî³ä²¿·ÖÀ´Ìî³ä¡£ +**???????** : ? 4 ¦Ë?????????? 15???? 1 ??????? 1 ?? 32 ¦Ë???????????? 4 ?????????????????? 20 ???????????§³? 5??????????????????? 4 ????????????????¦Â?????????????? -**Çø·Ö·þÎñ** : ÓÃÀ´»ñµÃ¸üºÃµÄ·þÎñ£¬Ò»°ãÇé¿öϲ»ÊÊÓᣠ+**???????** : ??????????????????????????¨¢? -**×ܳ¤¶È** : °üÀ¨Êײ¿³¤¶ÈºÍÊý¾Ý²¿·Ö³¤¶È¡£ +**?????** : ??????????????????????? -**±êʶ** : ÔÚÊý¾Ý±¨³¤¶È¹ý³¤´Ó¶ø·¢Éú·ÖƬµÄÇé¿öÏ£¬ÏàͬÊý¾Ý±¨µÄ²»Í¬·ÖƬ¾ßÓÐÏàͬµÄ±êʶ·û¡£ +**???** : ?????????????????????????????????????????????????????????????? -**Æ¬Æ«ÒÆ** : ºÍ±êʶ·ûÒ»Æð£¬ÓÃÓÚ·¢Éú·ÖƬµÄÇé¿ö¡£Æ¬Æ«ÒƵĵ¥Î»Îª 8 ×Ö½Ú¡£ +**????** : ????????????????????????????????¦Ë? 8 ???? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/45c86855-9b18-4cf4-a9a7-f8b6eb78d133.png) -**Éú´æÊ±¼ä** £ºTTL£¬ËüµÄ´æÔÚΪÁË·ÀÖ¹ÎÞ·¨½»¸¶µÄÊý¾Ý±¨ÔÚ»¥ÁªÍøÖв»¶Ï¶µÈ¦×Ó¡£ÒÔ·ÓÉÆ÷ÌøÊýΪµ¥Î»£¬µ± TTL Ϊ 0 ʱ¾Í¶ªÆúÊý¾Ý±¨¡£ +**???????** ??TTL????????????????????????????????????§Ó??????????¡¤???????????¦Ë???? TTL ? 0 ????????????? -**ЭÒé**£ºÖ¸³öЯ´øµÄÊý¾ÝÓ¦¸ÃÉϽ»¸øÄĸöЭÒé½øÐд¦Àí£¬ÀýÈç ICMP¡¢TCP¡¢UDP µÈ¡£ +**§¿??**?????§Á???????????????????§¿????§Õ??????? ICMP??TCP??UDP ??? -**Êײ¿¼ìÑéºÍ**£ºÒòΪÊý¾Ý±¨Ã¿¾­¹ýÒ»¸ö·ÓÉÆ÷£¬¶¼ÒªÖØÐ¼ÆËã¼ìÑéºÍ£¬Òò´Ë¼ìÑéºÍ²»°üº¬Êý¾Ý²¿·Ö¿ÉÒÔ¼õÉÙ¼ÆËãµÄ¹¤×÷Á¿¡£ +**????????**??????????????????¡¤????????????????????????????????????????????????????????? -## IP µØÖ·±àÖ· +## IP ?????? -IP µØÖ·µÄ±àÖ··½Ê½¾­ÀúÁËÈý¸öÀúÊ·½×¶Î£º +IP ?????????????????????????¦²? -1. ·ÖÀàµÄ IP µØÖ·£» -2. ×ÓÍøµÄ»®·Ö£» -3. ¹¹³É³¬Íø¡£ +1. ????? IP ????? +2. ?????????? +3. ????????? -### 1. ·ÖÀàµÄ IP µØÖ· +### 1. ????? IP ??? -ÓÉÁ½²¿·Ö×é³É£¬ÍøÂçºÅºÍÖ÷»úºÅ£¬ÆäÖв»Í¬Àà±ð¾ßÓв»Í¬µÄÍøÂçºÅ³¤¶È£¬²¢ÇÒÊǹ̶¨µÄ¡£ +????????????????????????????§Ó???????§Ó???????????????????????? -IP µØÖ· ::= {< ÍøÂçºÅ >, < Ö÷»úºÅ >} +IP ??? ::= {< ????? >, < ?????? >} ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/2ddd6132-60be-4a72-9daa-3d9756191f4a.png) -### 2. »®·Ö×ÓÍø +### 2. ???????? -ͨ¹ýÔÚÍøÂçºÅ×Ö¶ÎÖÐÄÃÒ»²¿·Ö×÷Ϊ×ÓÍøºÅ£¬°ÑÁ½¼¶ IP µØÖ·»®·ÖΪÈý¼¶ IP µØÖ·¡£×¢Ò⣬Íâ²¿ÍøÂç¿´²»µ½×ÓÍøµÄ´æÔÚ¡£ +?????????????????????????????????????? IP ???????????? IP ?????????????ÂI?????????????? -IP µØÖ· ::= {< ÍøÂçºÅ >, < ×ÓÍøºÅ >, < Ö÷»úºÅ >} +IP ??? ::= {< ????? >, < ?????? >, < ?????? >} -ҪʹÓÃ×ÓÍø£¬±ØÐëÅäÖÃ×ÓÍøÑÚÂë¡£Ò»¸ö B ÀàµØÖ·µÄĬÈÏ×ÓÍøÑÚÂëΪ 255.255.0.0£¬Èç¹û B ÀàµØÖ·µÄ×ÓÍøÕ¼Á½¸ö±ÈÌØ£¬ÄÇô×ÓÍøÑÚÂëΪ 11111111 11111111 11000000 000000£¬Ò²¾ÍÊÇ 255.255.192.0¡£ +????????????????????????????? B ?????????????????? 255.255.0.0????? B ???????????????????????????????? 11111111 11111111 11000000 000000??????? 255.255.192.0?? -### 3. ÎÞ·ÖÀà±àÖ· CIDR£¨¹¹³É³¬Íø£© +### 3. ??????? CIDR??????????? -CIDR Ïû³ýÁË´«Í³ A Àà¡¢B ÀàºÍ C ÀàµØÖ·ÒÔ¼°»®·Ö×ÓÍøµÄ¸ÅÄʹÓÃÍøÂçǰ׺ºÍÖ÷»úºÅÀ´¶Ô IP µØÖ·½øÐбàÂë£¬ÍøÂçǰ׺µÄ³¤¶È¿ÉÒÔ¸ù¾ÝÐèÒª±ä»¯¡£ +CIDR ???????? A ??B ??? C ????????????????????????????????????????? IP ??????§Ò????????????????????????�£?? -IP µØÖ· ::= {< ÍøÂçǰ׺ºÅ >, < Ö÷»úºÅ >} +IP ??? ::= {< ???????? >, < ?????? >} -CIDR µÄ¼Ç·¨ÉϲÉÓÃÔÚ IP µØÖ·ºóÃæ¼ÓÉÏÍøÂçǰ׺³¤¶ÈµÄ·½·¨£¬ÀýÈç 128.14.35.7/20 ±íʾǰ 20 Î»ÎªÍøÂçǰ׺¡£ +CIDR ??????????? IP ?????????????????????????????? 128.14.35.7/20 ???? 20 ¦Ë????????? -CIDR µÄµØÖ·ÑÚÂë¿ÉÒÔ¼ÌÐø³ÆÎª×ÓÍøÑÚÂ룬×ÓÍøÑÚÂëÊ× 1 ³¤¶ÈÎªÍøÂçǰ׺µÄ³¤¶È¡£ +CIDR ??????????????????????????????????? 1 ????????????????? -Ò»¸ö CIDR µØÖ·¿éÖÐÓÐºÜ¶àµØÖ·£¬Ò»¸ö CIDR ±íʾµÄÍøÂç¾Í¿ÉÒÔ±íʾԭÀ´µÄºÜ¶à¸öÍøÂ磬²¢ÇÒÔÚ·ÓɱíÖÐÖ»ÐèÒªÒ»¸ö·ÓɾͿÉÒÔ´úÌæÔ­À´µÄ¶à¸ö·ÓÉ£¬¼õÉÙÁË·ÓɱíÏîµÄÊýÁ¿¡£°ÑÕâÖÖͨ¹ýʹÓÃÍøÂçǰ׺À´¼õÉÙ·ÓɱíÏîµÄ·½Ê½³ÆÎªÂ·Óɾۺϣ¬Ò²³ÆÎª¹¹³É³¬Íø¡£ +??? CIDR ????????§Ü????????? CIDR ??????????????????????????íà??????¡¤????????????¡¤????????????????¡¤?????????¡¤????????????????????????????????????¡¤???????????¡¤?????????????????? -ÔÚ·ÓɱíÖÐÿ¸öÏîÄ¿ÓÉ¡°ÍøÂçǰ׺¡±ºÍ¡°ÏÂÒ»ÌøµØÖ·¡±×é³É£¬ÔÚ²éÕÒʱ¿ÉÄÜ»áµÃµ½²»Ö¹Ò»¸öÆ¥Åä½á¹û£¬Ó¦µ±²ÉÓÃ×ǰ׺ƥÅä¡£ +??¡¤????????????¨À?????????????????????????????????????????????????????????????????? -## IP µØÖ·ºÍ MAC µØÖ· +## IP ????? MAC ??? -ÍøÂç²ãʵÏÖÖ÷»úÖ®¼äµÄͨÐÅ£¬¶øÁ´Â·²ãʵÏÖ¾ßÌåÿ¶ÎÁ´Â·Ö®¼äµÄͨÐÅ¡£Òò´ËÔÚͨÐŹý³ÌÖУ¬IP Êý¾Ý±¨µÄÔ´µØÖ·ºÍÄ¿µÄµØÖ·Ê¼ÖÕ²»±ä£¬¶ø MAC µØÖ·Ëæ×ÅÁ´Â·µÄ¸Ä±ä¶ø¸Ä±ä¡£ +????????????????????????¡¤?????????????¡¤????????????????????§µ?IP ?????????????????????????? MAC ?????????¡¤???????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/86b71296-0d1e-4a63-bcd9-54955b6b781b.jpg) -## µØÖ·½âÎöЭÒé ARP +## ???????§¿?? ARP -ʵÏÖÓÉ IP µØÖ·µÃµ½ MAC µØÖ·¡£ +????? IP ?????? MAC ????? -ÿ¸öÖ÷»ú¶¼ÓÐÒ»¸ö ARP ¸ßËÙ»º´æ£¬´æ·ÅÓ³Éä±í¡£Èç¹ûÒ»¸ö IP µØÖ· µ½ MAC µØÖ·µÄÓ³Éä²»ÔڸñíÖУ¬Ö÷»úͨ¹ý¹ã²¥µÄ·½Ê½·¢ËÍ ARP ÇëÇó·Ö×飬ƥÅä IP µØÖ·µÄÖ÷»ú»á·¢ËÍ ARP ÏìÓ¦·Ö×é¸æÖª MAC µØÖ·¡£ +?????????????? ARP ??????—¨????????????? IP ??? ?? MAC ?????????????§µ?????????????????? ARP ??????ï…??? IP ????????????? ARP ????????? MAC ????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8bc6fc2c-d198-4759-b06c-18d94d851e97.png) -## ·ÓÉÆ÷µÄ½á¹¹ +## ¡¤??????? -·ÓÉÆ÷¿ÉÒÔ»®·ÖΪÁ½´ó²¿·Ö£ºÂ·ÓÉÑ¡ÔñºÍ·Ö×éת·¢¡£ +¡¤??????????????????¡¤?????????????? -·Ö×éת·¢²¿·ÖÓÉÈý²¿·Ö×é³É£º½»»»½á¹¹¡¢Ò»×éÊäÈë¶Ë¿ÚºÍÒ»×éÊä³ö¶Ë¿Ú¡£ +??????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/3a676c54-b559-4466-9b21-eb10f1e25879.jpg) -½»»»½á¹¹µÄ½»»»ÍøÂçÓÐÒÔÏÂÈýÖÖʵÏÖ·½Ê½£º +???????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/7f82fd18-7f16-4125-ada6-bb6b795b4fda.png) -## ½»»»»úÓë·ÓÉÆ÷µÄÇø±ð +## ????????¡¤?????????? -- ½»»»»ú¹¤×÷ÓÚÊý¾ÝÁ´Â·²ã£¬ÄÜʶ±ð MAC µØÖ·£¬¸ù¾Ý MAC µØÖ·×ª·¢Á´Â·²ãÊý¾ÝÖ¡¡£¾ßÓÐ×Ôѧ»úÖÆÀ´Î¬»¤ IP µØÖ·Óë MAC µØÖ·µÄÓ³Éä¡£ +- ??????????????????¡¤??????? MAC ????????? MAC ????????¡¤????????????????????????? IP ????? MAC ???????? -- ·ÓÉÆ÷λÓÚÍøÂç²ã£¬ÄÜʶ±ð IP µØÖ·²¢¸ù¾Ý IP µØÖ·×ª·¢·Ö×顣ά»¤×Å·ÓÉ±í£¬¸ù¾Ý·ÓɱíÑ¡Ôñ×î¼Ñ·Ïß¡£ +- ¡¤????¦Ë???????????? IP ????????? IP ?????????î•?????¡¤???????¡¤?????????¡¤??? -## ·ÓÉÆ÷·Ö×éת·¢Á÷³Ì +## ¡¤??????????????? -1. ´ÓÊý¾Ý±¨µÄÊײ¿ÌáȡĿµÄÖ÷»úµÄ IP µØÖ· D£¬µÃµ½Ä¿µÄÍøÂçµØÖ· N¡££¨Â·ÓɱíÏîÊÇÍøÂçºÅ¶ø²»ÊÇ IP µØÖ·£¬ÕâÑù×ö´ó´ó¼õÉÙÁË·ÓɱíÌõÄ¿ÊýÁ¿£© -2. Èô N ¾ÍÊÇÓë´Ë·ÓÉÆ÷Ö±½ÓÏàÁ¬µÄij¸öÍøÂçµØÖ·£¬Ôò½øÐÐÖ±½Ó½»¸¶£» -3. Èô·ÓɱíÖÐÓÐÄ¿µÄµØÖ·Îª D µÄÌØ¶¨Ö÷»ú·ÓÉ£¬Ôò°ÑÊý¾Ý±¨´«Ë͸ø±íÖÐËùÖ¸Ã÷µÄÏÂÒ»ÌøÂ·ÓÉÆ÷£» -4. Èô·ÓɱíÖÐÓе½´ïÍøÂç N µÄ·ÓÉ£¬Ôò°ÑÊý¾Ý±¨´«Ë͸øÂ·ÓɱíÖÐËùÖ¸Ã÷µÄÏÂÒ»ÌøÂ·ÓÉÆ÷£» -5. Èô·ÓɱíÖÐÓÐÒ»¸öĬÈÏ·ÓÉ£¬Ôò°ÑÊý¾Ý±¨´«Ë͸øÂ·ÓɱíÖÐËùÖ¸Ã÷µÄĬÈÏ·ÓÉÆ÷£» -6. ±¨¸æ×ª·¢·Ö×é³ö´í¡£ +1. ???????????????????????? IP ??? D?????????????? N????¡¤????????????????? IP ???????????????????¡¤???????????? +2. ?? N ???????¡¤????????????????????????????????????? +3. ??¡¤????????????? D ?????????¡¤????????????????????????????????¡¤?????? +4. ??¡¤??????§Ö??????? N ??¡¤????????????????¡¤?????????????????¡¤?????? +5. ??¡¤?????????????¡¤????????????????¡¤???????????????¡¤?????? +6. ?????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8d211911-0e62-4190-ab00-d8610adec4a0.jpg) -## ·ÓÉÑ¡ÔñЭÒé +## ¡¤?????§¿?? -»¥ÁªÍøÊ¹ÓõÄ·ÓÉÑ¡ÔñЭÒé¶¼ÊÇ×ÔÊÊÓ¦µÄ£¬ÄÜËæ×ÅÍøÂçͨÐÅÁ¿ºÍÍØÆË±ä»¯¶ø×ÔÊÊÓ¦µØ½øÐе÷Õû¡£ +??????????¡¤?????§¿?úY???????????????????????????????�£???????????§Ö????? -»¥ÁªÍø¿ÉÒÔ»®·ÖΪÐí¶à½ÏСµÄ×ÔÖÎϵͳ AS£¬Ò»¸ö AS ¿ÉÒÔʹÓÃÒ»ÖֺͱðµÄ AS ²»Í¬µÄ·ÓÉÑ¡ÔñЭÒé¡£ +??????????????????§³???????? AS????? AS ????????????? AS ?????¡¤?????§¿?î• -¿ÉÒÔ°Ñ·ÓÉÑ¡ÔñЭÒé»®·ÖΪÁ½´óÀࣺ +?????¡¤?????§¿?ül????????? -1. ÄÚ²¿Íø¹ØÐ­Òé IGP£¨Interior Gateway Protocol£© ÔÚ×ÔÖÎϵͳÄÚ²¿Ê¹Óã¬Èç RIP ºÍ OSPF¡£ -2. Íâ²¿Íø¹ØÐ­Òé EGP£¨External Gateway Protocol£© ÔÚ×ÔÖÎϵͳ֮¼äʹÓã¬Èç BGP¡£ +1. ???????§¿?? IGP??Interior Gateway Protocol?? ????????????????? RIP ?? OSPF?? +2. ??????§¿?? EGP??External Gateway Protocol?? ????????????????? BGP?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/e0be6970-5b0e-44a2-bc71-df4d61c42b8f.jpg) -### 1. ÄÚ²¿Íø¹ØÐ­Òé RIP +### 1. ???????§¿?? RIP -RIP ÊÇÒ»ÖÖ·Ö²¼Ê½µÄ»ùÓÚ¾àÀëÏòÁ¿µÄ·ÓÉÑ¡ÔñЭÒé¡£¾àÀëÊÇÖ¸ÌøÊý£¬Ö±½ÓÏàÁ¬µÄ·ÓÉÆ÷ÌøÊýΪ 1£¬ÌøÊý×î¶àΪ 15£¬³¬¹ý 15 ±íʾ²»¿É´ï¡£ +RIP ??????????????????????¡¤?????§¿?î•??????????????????????¡¤????????? 1?????????? 15?????? 15 ???????? -RIP °´¹Ì¶¨µÄʱ¼ä¼ä¸ô½öºÍÏàÁÚ·ÓÉÆ÷½»»»×Ô¼ºµÄ·ÓÉ±í£¬¾­¹ýÈô¸É´Î½»»»Ö®ºó£¬ËùÓзÓÉÆ÷×îÖÕ»áÖªµÀµ½´ï±¾×ÔÖÎϵͳÖÐÈκÎÒ»¸öÍøÂçµÄ×î¶Ì¾àÀëºÍÏÂÒ»ÌøÂ·ÓÉÆ÷µØÖ·¡£ +RIP ????????????????????¡¤?????????????¡¤???????????¦Í??????????¡¤?????????????????????????¦Ê?????????????????????¡¤????????? -¾àÀëÏòÁ¿Ëã·¨£º +???????????? -1. ¶ÔµØÖ·Îª X µÄÏàÁÚ·ÓÉÆ÷·¢À´µÄ RIP ±¨ÎÄ£¬ÏÈÐ޸ı¨ÎÄÖеÄËùÓÐÏîÄ¿£¬°ÑÏÂÒ»Ìø×Ö¶ÎÖеĵØÖ·¸ÄΪ X£¬²¢°ÑËùÓеľàÀë×Ö¶Î¼Ó 1£» -2. ¶ÔÐ޸ĺóµÄ RIP ±¨ÎÄÖеÄÿһ¸öÏîÄ¿£¬½øÐÐÒÔϲ½Ö裺 - - ÈôÔ­À´µÄ·ÓɱíÖÐûÓÐÄ¿µÄÍøÂç N£¬Ôò°Ñ¸ÃÏîÄ¿Ìí¼Óµ½Â·ÓɱíÖУ» - - ·ñÔò£ºÈôÏÂÒ»ÌøÂ·ÓÉÆ÷µØÖ·ÊÇ X£¬Ôò°ÑÊÕµ½µÄÏîÄ¿Ìæ»»Ô­À´Â·ÓɱíÖеÄÏîÄ¿£»·ñÔò£ºÈôÊÕµ½µÄÏîÄ¿ÖеľàÀë d СÓÚ·ÓɱíÖеľàÀ룬Ôò½øÐиüУ¨ÀýÈçԭʼ·ÓɱíÏîΪ Net2, 5, P£¬Ð±íÏîΪ Net2, 4, X£¬Ôò¸üУ©£»·ñÔòʲôҲ²»×ö¡£ -3. Èô 3 ·ÖÖÓ»¹Ã»ÓÐÊÕµ½ÏàÁÚ·ÓÉÆ÷µÄ¸üзÓÉ±í£¬Ôò°Ñ¸ÃÏàÁÚ·ÓÉÆ÷±êΪ²»¿É´ï£¬¼´°Ñ¾àÀëÖÃΪ 16¡£ +1. ????? X ??????¡¤?????????? RIP ??????????????§Ö?????????????????????§Ö?????? X?????????§Ö??????¦Ì? 1?? +2. ??????? RIP ?????§Ö????????????????????Ñs + - ???????¡¤??????????????? N?????????????¡¤????§µ? + - ???????????¡¤????????? X??????????????�I???¡¤????§Ö?????????????????????§Ö???? d §³??¡¤????§Ö????????§Ú??????????¡¤?????? Net2, 5, P???¡À???? Net2, 4, X??????????????????????? +3. ?? 3 ???????????????¡¤?????????¡¤???????????¡¤?????????????????????? 16?? -RIP ЭÒéʵÏÖ¼òµ¥£¬¿ªÏúС£¬µ«ÊÇ RIP ÄÜʹÓõÄ×î´ó¾àÀëΪ 15£¬ÏÞÖÆÁËÍøÂçµÄ¹æÄ£¡£²¢ÇÒµ±ÍøÂç³öÏÖ¹ÊÕÏʱ£¬Òª¾­¹ý±È½Ï³¤µÄʱ¼ä²ÅÄܽ«´ËÏûÏ¢´«Ë͵½ËùÓзÓÉÆ÷¡£ +RIP §¿???????????§³?????? RIP ????????????? 15???????????????????????????????????????????????????????????????????¡¤?????? -### 2. ÄÚ²¿Íø¹ØÐ­Òé OSPF +### 2. ???????§¿?? OSPF -¿ª·Å×î¶Ì·¾¶ÓÅÏÈ OSPF£¬ÊÇΪÁ˿˷þ RIP µÄȱµã¶ø¿ª·¢³öÀ´µÄ¡£ +???????¡¤?????? OSPF????????? RIP ????????????????? -¿ª·Å±íʾ OSPF ²»ÊÜijһ¼Ò³§ÉÌ¿ØÖÆ£¬¶øÊǹ«¿ª·¢±íµÄ£»×î¶Ì·¾¶ÓÅÏÈÊÇÒòΪʹÓÃÁË Dijkstra Ìá³öµÄ×î¶Ì·¾¶Ëã·¨ SPF¡£ +?????? OSPF ???????????????????????????????¡¤???????????????? Dijkstra ????????¡¤???? SPF?? -OSPF ¾ßÓÐÒÔÏÂÌØµã£º +OSPF ??????????? -1. Ïò±¾×ÔÖÎϵͳÖеÄËùÓзÓÉÆ÷·¢ËÍÐÅÏ¢£¬ÕâÖÖ·½·¨ÊǺ鷺·¨¡£ -2. ·¢Ë͵ÄÐÅÏ¢¾ÍÊÇÓëÏàÁÚ·ÓÉÆ÷µÄÁ´Â·×´Ì¬£¬Á´Â·×´Ì¬°üÀ¨ÓëÄÄЩ·ÓÉÆ÷ÏàÁ¬ÒÔ¼°Á´Â·µÄ¶ÈÁ¿£¬¶ÈÁ¿Ó÷ÑÓᢾàÀ롢ʱÑÓ¡¢´ø¿íµÈÀ´±íʾ¡£ -3. Ö»Óе±Á´Â·×´Ì¬·¢Éú±ä»¯Ê±£¬Â·ÓÉÆ÷²Å»á·¢ËÍÐÅÏ¢¡£ +1. ?????????§Ö?????¡¤??????????????????????ú˜???? +2. ??????????????????¡¤????????¡¤??????¡¤??????????§»¡¤?????????????¡¤????????????¡Â??¨¢????????????????????? +3. ??§Ö???¡¤???????�£???¡¤?????????????? -ËùÓзÓÉÆ÷¶¼¾ßÓÐÈ«ÍøµÄÍØÆË½á¹¹Í¼£¬²¢ÇÒÊÇÒ»Öµġ£Ïà±ÈÓÚ RIP£¬OSPF µÄ¸üйý³ÌÊÕÁ²µÄºÜ¿ì¡£ +????¡¤??????????????????????????????????????? RIP??OSPF ???????????????? -### 3. Íâ²¿Íø¹ØÐ­Òé BGP +### 3. ??????§¿?? BGP -AS Ö®¼äµÄ·ÓÉÑ¡ÔñºÜÀ§ÄÑ£¬Ö÷ÒªÊÇ»¥ÁªÍø¹æÄ£ºÜ´ó¡£²¢ÇÒ¸÷¸ö AS ÄÚ²¿Ê¹Óò»Í¬µÄ·ÓÉÑ¡ÔñЭÒ飬¾ÍÎÞ·¨×¼È·¶¨Òå·¾¶µÄ¶ÈÁ¿¡£²¢ÇÒ AS Ö®¼äµÄ·ÓÉÑ¡Ôñ±ØÐ뿼ÂÇÓйصIJßÂÔ£¬±ÈÈçÓÐЩ AS ²»Ô¸ÒâÈÃÆäËü AS ¾­¹ý¡£ +AS ????¡¤????????????????????????????????? AS ?????¨°????¡¤?????§¿?ï…???????????¡¤????????????? AS ????¡¤???????????§Û????????????§» AS ??????????? AS ?????? -BGP Ö»ÄÜѰÕÒÒ»Ìõ±È½ÏºÃµÄ·ÓÉ£¬¶ø²»ÊÇ×î¼Ñ·ÓÉ¡£Ëü²ÉÓ÷¾¶ÏòÁ¿Â·ÓÉÑ¡ÔñЭÒé¡£ +BGP ??????????????¡¤????????????¡¤?¨À???????¡¤??????¡¤?????§¿?î• -ÿ¸ö AS ¶¼±ØÐëÅäÖà BGP ·¢ÑÔÈË£¬Í¨¹ýÔÚÁ½¸öÏàÁÚ BGP ·¢ÑÔÈËÖ®¼ä½¨Á¢ TCP Á¬½ÓÀ´½»»»Â·ÓÉÐÅÏ¢¡£ +??? AS ?????????? BGP ???????????????????? BGP ????????�Ü?? TCP ??????????¡¤??????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/eb6271de-22c9-4f4b-8b31-eab1f560efac.png) -## Íø¼Ê¿ØÖƱ¨ÎÄЭÒé ICMP +## ??????????§¿?? ICMP -ICMP ÊÇΪÁ˸üÓÐЧµØ×ª·¢ IP Êý¾Ý±¨ºÍÌá¸ß½»¸¶³É¹¦µÄ»ú»á¡£Ëü·â×°ÔÚ IP Êý¾Ý±¨ÖУ¬µ«ÊDz»ÊôÓڸ߲ãЭÒé¡£ +ICMP ????????§¹????? IP ???????????????????????????? IP ??????§µ????????????§¿?î• ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/9b5e0fa0-9274-4219-a3a9-84fbb509c735.jpg) -ICMP ±¨ÎÄ·ÖΪ²î´í±¨¸æ±¨ÎĺÍѯÎʱ¨ÎÄ¡£ +ICMP ??????????ãè?????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/6e11b122-95ce-4869-bf7d-3b0d7591707e.jpg) -## ·Ö×éÍø¼ä̽²â PING +## ??????????? PING -PING ÊÇ ICMP µÄÒ»¸öÖØÒªÓ¦Óã¬Ö÷ÒªÓÃÀ´²âÊÔÁ½Ì¨Ö÷»úÖ®¼äµÄÁ¬Í¨ÐÔ¡£ +PING ?? ICMP ???????????????????????????????????????? -PING µÄ¹ý³Ì£º +PING ?????? -1. PING ͬһ¸öÍø¶ÎµÄÖ÷»ú£¬²éÕÒÄ¿µÄÖ÷»úµÄ MAC µØÖ·£¬È»ºóÖ±½Ó½»¸¶¡£Èç¹ûÎÞ·¨²éÕÒµ½ MAC µØÖ·£¬¾ÍÒª½øÐÐÒ»´Î ARP ÇëÇó¡£ -2. PING ²»Í¬Íø¶ÎµÄÖ÷»ú£¬¾Í·¢Ë͸øÍø¹ØÈÃÆä½øÐÐת·¢¡£Í¬ÑùÒª·¢Ë͸øÍø¹ØÒ²ÐèҪͨ¹ý²éÕÒÍø¹ØµÄ MAC µØÖ·£¬¸ù¾Ý MAC µØÖ·½øÐÐת·¢¡£ +1. PING ???????¦Å???????????????????? MAC ??????????????????????????? MAC ??????????????? ARP ???? +2. PING ??????¦Å?????????????????????????????????????????????????????????? MAC ????????? MAC ???????????? -## IP ¶à²¥ +## IP ?? -ÔÚÒ»¶Ô¶àµÄͨÐÅÖУ¬¶à²¥²»ÐèÒª½«·Ö×鏴֯¶à·Ý£¬´Ó¶ø´ó´ó½ÚÔ¼ÍøÂç×ÊÔ´¡£ +???????????§µ?????????????û`?????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c77b6a18-dfac-42a2-ac89-7e99481275dc.jpg) -## ÐéÄâרÓÃÍø VPN +## ????????? VPN -ÓÉÓÚ IP µØÖ·µÄ½ôȱ£¬Ò»¸ö»ú¹¹ÄÜÉêÇëµ½µÄ IP µØÖ·ÊýÍùÍùԶСÓÚ±¾»ú¹¹ËùÓµÓеÄÖ÷»úÊý¡£²¢ÇÒÒ»¸ö»ú¹¹²¢²»ÐèÒª°ÑËùÓеÄÖ÷»ú½ÓÈëµ½ÍⲿµÄ»¥ÁªÍøÖУ¬»ú¹¹ÄڵļÆËã»ú¿ÉÒÔʹÓýöÔÚ±¾»ú¹¹ÓÐЧµÄ IP µØÖ·£¨×¨ÓõØÖ·£©¡£ +???? IP ???????????????????????? IP ??????????§³???????????§Ö????????????????????????????????§Ö???????????????????§µ?????????????????????????????§¹?? IP ?????????????? -ÓÐÈý¸öרÓõØÖ·¿é£º +????????????ï“ 1. 10.0.0.0 \~ 10.255.255.255 2. 172.16.0.0 \~ 172.31.255.255 3. 192.168.0.0 \~ 192.168.255.255 -VPN ʹÓù«ÓõĻ¥ÁªÍø×÷Ϊ±¾»ú¹¹¸÷רÓÃÍøÖ®¼äµÄͨÐÅÔØÌ塣רÓÃÖ¸»ú¹¹ÄÚµÄÖ÷»úÖ»Óë±¾»ú¹¹Ä򵀮äËüÖ÷»úͨÐÅ£»ÐéÄâÖ¸¡°ºÃÏñÊÇ¡±£¬¶øÊµ¼ÊÉϲ¢²»ÊÇ£¬ËüÓо­¹ý¹«ÓõĻ¥ÁªÍø¡£ +VPN ??¨´???????????????????????????????????‰^?????????????????????????????????????????????????????????????????????§à??????????????? -ÏÂͼÖУ¬³¡Ëù A ºÍ B µÄͨÐŲ¿¾­¹ý»¥ÁªÍø£¬Èç¹û³¡Ëù A µÄÖ÷»ú X ÒªºÍÁíÒ»¸ö³¡Ëù B µÄÖ÷»ú Y ͨÐÅ£¬IP Êý¾Ý±¨µÄÔ´µØÖ·ÊÇ 10.1.0.1£¬Ä¿µÄµØÖ·ÊÇ 10.2.0.3¡£Êý¾Ý±¨ÏÈ·¢Ë͵½Ó뻥ÁªÍøÏàÁ¬µÄ·ÓÉÆ÷ R1£¬R1 ¶ÔÄÚ²¿Êý¾Ý½øÐмÓÃÜ£¬È»ºóÖØÐ¼ÓÉÏÊý¾Ý±¨µÄÊײ¿£¬Ô´µØÖ·ÊÇ·ÓÉÆ÷ R1 µÄÈ«ÇòµØÖ· 125.1.2.3£¬Ä¿µÄµØÖ·ÊÇ·ÓÉÆ÷ R2 µÄÈ«ÇòµØÖ· 194.4.5.6¡£Â·ÓÉÆ÷ R2 ÊÕµ½Êý¾Ý±¨ºó½«Êý¾Ý²¿·Ö½øÐнâÃÜ£¬»Ö¸´Ô­À´µÄÊý¾Ý±¨£¬´ËʱĿµÄµØÖ·Îª 10.2.0.3£¬¾Í½»¸¶¸ø Y¡£ +????§µ????? A ?? B ????????????????????????? A ?????? X ???????????? B ?????? Y ????IP ????????????? 10.1.0.1????????? 10.2.0.3?????????????????????????¡¤???? R1??R1 ???????????§Þ????????????????????????????????¡¤???? R1 ??????? 125.1.2.3?????????¡¤???? R2 ??????? 194.4.5.6??¡¤???? R2 ???????????????????§ß???????????????????????????? 10.2.0.3????????? Y?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/bf4ed077-d481-4db7-9e7a-85d841a5a8c3.jpg) -## ÍøÂçµØÖ·×ª»» NAT +## ????????? NAT -רÓÃÍøÄÚ²¿µÄÖ÷»úʹÓñ¾µØ IP µØÖ·ÓÖÏëºÍ»¥ÁªÍøÉϵÄÖ÷»úͨÐÅʱ£¬¿ÉÒÔʹÓà NAT À´½«±¾µØ IP ת»»ÎªÈ«Çò IP¡£ +???????????????????? IP ????????????????????????????????? NAT ???????? IP ??????? IP?? -ÔÚÒÔǰ£¬NAT ½«±¾µØ IP ºÍÈ«Çò IP Ò»Ò»¶ÔÓ¦£¬ÕâÖÖ·½Ê½ÏÂÓµÓÐ n ¸öÈ«Çò IP µØÖ·µÄרÓÃÍøÄÚ×î¶àÖ»¿ÉÒÔͬʱÓÐ n ̨Ö÷»ú½ÓÈ뻥ÁªÍø¡£ÎªÁ˸üÓÐЧµØÀûÓÃÈ«Çò IP µØÖ·£¬ÏÖÔÚ³£ÓÃµÄ NAT ת»»±í°ÑÔËÊä²ãµÄ¶Ë¿ÚºÅÒ²ÓÃÉÏÁË£¬ÕâÑù¿ÉÒÔʹµÃ¶à¸öרÓÃÍøÄÚ²¿µÄÖ÷»ú¹²ÓÃÒ»¸öÈ«Çò IP µØÖ·¡£Ê¹ÓÃ¶Ë¿ÚºÅµÄ NAT Ò²½Ð×öÍøÂçµØÖ·Óë¶Ë¿Úת»» NAPT¡£ +???????NAT ?????? IP ????? IP ?????????????????? n ????? IP ???????????????????????? n ?????????????????????§¹????????? IP ????????????? NAT ???????????????????????????????????????????????????????????? IP ???????????? NAT ?????????????????? NAPT?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/0f31bc7a-d60b-48a6-8e3f-597708369e52.png) -# µÚÎåÕ ÔËÊä²ã* +# ?????? ?????* -ÍøÂç²ãÖ»°Ñ·Ö×é·¢Ë͵½Ä¿µÄÖ÷»ú£¬µ«ÊÇÕæÕýͨÐŵIJ¢²»ÊÇÖ÷»ú¶øÊÇÖ÷»úÖеĽø³Ì¡£ +??????????ú€??????????????????????????????????????????§Ö????? -ÔËÊä²ãÌṩÁËÓ¦Óýø³Ì¼äµÄÂß¼­Í¨ÐÅ¡£ÔËÊä²ãÏò¸ß²ãÓû§ÆÁ±ÎÁËÏÂÃæÍøÂç²ãµÄºËÐÄϸ½Ú£¬Ê¹Ó¦ÓóÌÐò¿´¼ûµÄºÃÏñÔÚÁ½¸öÔËÊä²ãʵÌåÖ®¼äÓÐÒ»Ìõ¶Ëµ½¶ËµÄÂß¼­Í¨ÐÅÐŵÀ¡£ +??????????????????????????????????????????????????????????????¨®???????????????????????????????????????????????? -## UDP ºÍ TCP µÄÌØµã +## UDP ?? TCP ????? -Óû§Êý¾Ý°üЭÒé UDP£¨User Datagram Protocol£© -´«Êä¿ØÖÆÐ­Òé TCP£¨Transmission Control Protocol£© +????????§¿?? UDP??User Datagram Protocol?? +???????§¿?? TCP??Transmission Control Protocol?? -UDP ÊÇÎÞÁ¬½ÓµÄ£¬¾¡×î´ó¿ÉÄܽ»¸¶£¬Ã»ÓÐÓµÈû¿ØÖÆ£¬ÃæÏò±¨ÎÄ£¨¶ÔÓÚÓ¦ÓóÌÐò´«ÏÂÀ´µÄ±¨ÎIJ»ºÏ²¢Ò²²»²ð·Ö£¬Ö»ÊÇÌí¼Ó UDP Êײ¿£©¡£ +UDP ???????????????????????????????????????????????¨®????????????????????????????? UDP ??????? -TCP ÊÇÃæÏòÁ¬½ÓµÄ£¬Ìṩ¿É¿¿½»¸¶£¬ÓÐÁ÷Á¿¿ØÖÆ£¬ÓµÈû¿ØÖÆ£¬Ìṩȫ˫¹¤Í¨ÐÅ£¬ÃæÏò×Ö½ÚÁ÷£¨°ÑÓ¦Óò㴫ÏÂÀ´µÄ±¨ÎÄ¿´³É×Ö½ÚÁ÷£¬°Ñ×Ö½ÚÁ÷×éÖ¯³É´óС²»µÈµÄÊý¾Ý¿é£© +TCP ???????????????????????????????????????????????????????????????????¨°?????????????????????????????????§³?????????ï‚ -## UDP Êײ¿¸ñʽ +## UDP ?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/bd6c05f3-02ee-4c8a-b374-40c87154a898.jpg) -Êײ¿×Ö¶ÎÖ»ÓÐ 8 ¸ö×Ö½Ú£¬°üÀ¨Ô´¶Ë¿Ú¡¢Ä¿µÄ¶Ë¿Ú¡¢³¤¶È¡¢¼ìÑéºÍ¡£12 ×Ö½ÚµÄαÊײ¿ÊÇΪÁ˼ÆËã¼ìÑéºÍ¶øÁÙʱÌí¼ÓµÄ¡£ +????????? 8 ????????????????????????????????12 ????¦Á???????????????????????? -## TCP Êײ¿¸ñʽ +## TCP ?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/21a00b02-c0a6-4bcd-9af0-5ec6bb66e34c.jpg) -**ÐòºÅ** £ºÓÃÓÚ¶Ô×Ö½ÚÁ÷½øÐбàºÅ£¬ÀýÈçÐòºÅΪ 301£¬±íʾµÚÒ»¸ö×ֽڵıàºÅΪ 301£¬Èç¹ûЯ´øµÄÊý¾Ý³¤¶ÈΪ 100 ×Ö½Ú£¬ÄÇôÏÂÒ»¸ö±¨ÎĶεÄÐòºÅӦΪ 401¡£ +**???** ???????????????§Ò??????????? 301????????????????? 301?????§Á???????????? 100 ????????????????¦Å?????? 401?? -**È·ÈϺÅ** £ºÆÚÍûÊÕµ½µÄÏÂÒ»¸ö±¨ÎĶεÄÐòºÅ¡£ÀýÈç B ÕýÈ·ÊÕµ½ A ·¢ËÍÀ´µÄÒ»¸ö±¨ÎĶΣ¬ÐòºÅΪ 501£¬Ð¯´øµÄÊý¾Ý³¤¶ÈΪ 200 ×Ö½Ú£¬Òò´Ë B ÆÚÍûÏÂÒ»¸ö±¨ÎĶεÄÐòºÅΪ 701£¬B ·¢Ë͸ø A µÄÈ·Èϱ¨ÎĶÎÖÐÈ·ÈϺžÍΪ 701¡£ +**????** ????????????????????¦Å????????? B ?????? A ???????????????¦²????? 501??§Á???????????? 200 ??????? B ?????????????¦Å????? 701??B ????? A ????????????????? 701?? -**Êý¾ÝÆ«ÒÆ** £ºÖ¸µÄÊÇÊý¾Ý²¿·Ö¾àÀ뱨ÎÄ¶ÎÆðʼ´¦µÄÆ«ÒÆÁ¿£¬Êµ¼ÊÉÏÖ¸µÄÊÇÊײ¿µÄ³¤¶È¡£ +**???????** ????????????????????????????????????????????????????? -**È·ÈÏ ACK** £ºµ± ACK=1 ʱȷÈϺÅ×Ö¶ÎÓÐЧ£¬·ñÔòÎÞЧ¡£TCP ¹æ¶¨£¬ÔÚÁ¬½Ó½¨Á¢ºóËùÓд«Ë͵ı¨ÎĶζ¼±ØÐë°Ñ ACK Öà 1¡£ +**??? ACK** ???? ACK=1 ??????????§¹????????§¹??TCP ?ÕÇ????????????????§Õ???????¦Æ?????? ACK ?? 1?? -**ͬ²½ SYN** £ºÔÚÁ¬½Ó½¨Á¢Ê±ÓÃÀ´Í¬²½ÐòºÅ¡£µ± SYN=1£¬ACK=0 ʱ±íʾÕâÊÇÒ»¸öÁ¬½ÓÇëÇó±¨ÎĶΡ£Èô¶Ô·½Í¬Ò⽨Á¢Á¬½Ó£¬ÔòÏìÓ¦±¨ÎÄÖÐ SYN=1£¬ACK=1¡£ +**??? SYN** ????????????????????????? SYN=1??ACK=0 ?????????????????????¦±??????????????????????????? SYN=1??ACK=1?? -**ÖÕÖ¹ FIN** £ºÓÃÀ´ÊÍ·ÅÒ»¸öÁ¬½Ó£¬µ± FIN=1 ʱ£¬±íʾ´Ë±¨ÎĶεķ¢ËÍ·½µÄÊý¾ÝÒÑ·¢ËÍÍê±Ï£¬²¢ÒªÇóÊÍ·ÅÔËÊäÁ¬½Ó¡£ +**??? FIN** ??????????????????? FIN=1 ???????????¦Å????????????????????????????????????? -**´°¿Ú** £º´°¿ÚÖµ×÷Ϊ½ÓÊÕ·½È÷¢ËÍ·½ÉèÖÃÆä·¢ËÍ´°¿ÚµÄÒÀ¾Ý¡£Ö®ËùÒÔÒªÓÐÕâ¸öÏÞÖÆ£¬ÊÇÒòΪ½ÓÊÕ·½µÄÊý¾Ý»º´æ¿Õ¼äÊÇÓÐÏ޵ġ£ +**????** ????????????????¡Â?????????????????????????????????????????????????????????????????? -## TCP µÄÈý´ÎÎÕÊÖ +## TCP ?????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/086871db-5871-460f-97b7-126cd738bb0e.jpg) -¼ÙÉè A Ϊ¿Í»§¶Ë£¬B Ϊ·þÎñÆ÷¶Ë¡£ +???? A ???????B ?????????? -1. Ê×ÏÈ B ´¦ÓÚ LISTEN£¨¼àÌý£©×´Ì¬£¬µÈ´ý¿Í»§µÄÁ¬½ÓÇëÇó¡£ -2. A Ïò B ·¢ËÍÁ¬½ÓÇëÇó±¨ÎĶΣ¬SYN=1£¬ACK=0£¬Ñ¡ÔñÒ»¸ö³õʼµÄÐòºÅ x¡£ -3. B ÊÕµ½Á¬½ÓÇëÇó±¨ÎĶΣ¬Èç¹ûͬÒ⽨Á¢Á¬½Ó£¬ÔòÏò A ·¢ËÍÁ¬½ÓÈ·Èϱ¨ÎĶΣ¬SYN=1£¬ACK=1£¬È·ÈϺÅΪ x+1£¬Í¬Ê±Ò²Ñ¡ÔñÒ»¸ö³õʼµÄÐòºÅ y¡£ -4. A ÊÕµ½ B µÄÁ¬½ÓÈ·Èϱ¨ÎĶκ󣬻¹ÒªÏò B ·¢³öÈ·ÈÏ£¬È·ÈϺÅΪ y+1£¬ÐòºÅΪ x+1¡£ -5. B ÊÕµ½ A µÄÈ·ÈϺó£¬Á¬½Ó½¨Á¢¡£ +1. ???? B ???? LISTEN???????????????????????????? +2. A ?? B ??????????????¦²?SYN=1??ACK=0???????????????? x?? +3. B ?????????????¦²?????????????????? A ??????????????¦²?SYN=1??ACK=1??????? x+1??????????????????? y?? +4. A ??? B ????????????¦Ê????? B ????????????? y+1?????? x+1?? +5. B ??? A ??????????????? -## TCP µÄËĴλÓÊÖ +## TCP ????¦Ë??? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/78f65456-666b-4044-b4ee-f7692dbbc0d3.jpg) -ÒÔÏÂÃèÊö²»ÌÖÂÛÐòºÅºÍÈ·ÈϺţ¬ÒòΪÐòºÅºÍÈ·ÈϺŵĹæÔò±È½Ï¼òµ¥¡£²¢ÇÒ²»ÌÖÂÛ ACK£¬ÒòΪ ACK ÔÚÁ¬½Ó½¨Á¢Ö®ºó¶¼Îª 1¡£ +??????????????????????????????????????????????????? ACK????? ACK ????????????? 1?? -1. A ·¢ËÍÁ¬½ÓÊͷű¨ÎĶΣ¬FIN=1£» -2. B ÊÕµ½Ö®ºó·¢³öÈ·ÈÏ£¬´Ëʱ TCP ÊôÓÚ°ë¹Ø±Õ״̬£¬B ÄÜÏò A ·¢ËÍÊý¾Ýµ«ÊÇ A ²»ÄÜÏò B ·¢ËÍÊý¾Ý£» -3. µ± B Òª²»ÔÙÐèÒªÁ¬½Óʱ£¬·¢ËÍÁ¬½ÓÊÍ·ÅÇëÇó±¨ÎĶΣ¬FIN=1£» -4. A ÊÕµ½ºó·¢³öÈ·ÈÏ£¬´ËʱÁ¬½ÓÊÍ·Å¡£ +1. A ??????????????¦²?FIN=1?? +2. B ?????????????? TCP ???????????B ???? A ??????????? A ?????? B ????????? +3. ?? B ????????????????????????????????¦²?FIN=1?? +4. A ????????????????????? **TIME_WAIT** -¿Í»§¶Ë½ÓÊÕµ½·þÎñÆ÷¶ËµÄ FIN ±¨Îĺó½øÈë´Ë״̬£¬´Ëʱ²¢²»ÊÇÖ±½Ó½øÈë CLOSED ״̬£¬»¹ÐèÒªµÈ´ýÒ»¸öʱ¼ä¼ÆÊ±Æ÷ÉèÖõÄʱ¼ä¡£Õâô×öÓÐÁ½¸öÀíÓÉ£º +?????????????????? FIN ???????????????????????????? CLOSED ?????????????????????????????????????????????? -1. È·±£×îºóÒ»¸öÈ·Èϱ¨ÎĶÎÄܹ»µ½´ï¡£Èç¹û B ûÊÕµ½ A ·¢ËÍÀ´µÄÈ·Èϱ¨ÎĶΣ¬ÄÇô¾Í»áÖØÐ·¢ËÍÁ¬½ÓÊÍ·ÅÇëÇó±¨ÎĶΣ¬A µÈ´ýÒ»¶Îʱ¼ä¾ÍÊÇΪÁË´¦ÀíÕâÖÖÇé¿öµÄ·¢Éú¡£ -2. Á¬½Ó¹ý³Ì¿ÉÄÜ¡°ÒÑʧЧµÄÁ¬½ÓÇëÇó±¨ÎĶΡ±£¬ÎªÁË·ÀÖ¹ÕâÖÖ±¨ÎĶγöÏÖÔÚ±¾´ÎÁ¬½ÓÖ®Í⣬ÐèÒªµÈ´ýÒ»¶Îʱ¼ä¡£ +1. ?????????????????????????? B ???? A ??????????????¦²??????????¡¤????????????????¦²?A ???????????????????????????????? +2. ??????????????§¹????????????¦±???????????????¦Ã??????????????????????????? -## TCP »¬¶¯´°¿Ú +## TCP ???????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/223fc26e-2fd6-484c-bcb7-443cac134f15.jpg) -´°¿ÚÊÇ»º´æµÄÒ»²¿·Ö£¬ÓÃÀ´ÔÝʱ´æ·Å×Ö½ÚÁ÷¡£·¢ËÍ·½ºÍ½ÓÊÕ·½¸÷ÓÐÒ»¸ö´°¿Ú£¬½ÓÊÕ·½Í¨¹ý TCP ±¨ÎĶÎÖеĴ°¿Ú×ֶθæËß·¢ËÍ·½×Ô¼ºµÄ´°¿Ú´óС£¬·¢ËÍ·½¸ù¾ÝÕâ¸öÖµºÍÆäËüÐÅÏ¢ÉèÖÃ×Ô¼ºµÄ´°¿Ú´óС¡£ +???????????????????????????????????????????????????????????????? TCP ??????§Ö??????¦È????????????????§³?????????????????????????????????????§³?? -·¢ËÍ´°¿ÚÄÚµÄ×Ö½Ú¶¼ÔÊÐí±»·¢ËÍ£¬½ÓÊÕ´°¿ÚÄÚµÄ×Ö½Ú¶¼ÔÊÐí±»½ÓÊÕ¡£Èç¹û·¢ËÍ´°¿Ú×󲿵Ä×Ö½ÚÒѾ­·¢ËͲ¢ÇÒÊÕµ½ÁËÈ·ÈÏ£¬ÄÇô¾Í½«·¢ËÍ´°¿ÚÏòÓÒ»¬¶¯Ò»¶¨¾àÀ룬ֱµ½×󲿵ÚÒ»¸ö×Ö½Ú²»ÊÇÒÑ·¢ËͲ¢ÇÒÒÑÈ·ÈϵÄ״̬£»½ÓÊÕ´°¿ÚµÄ»¬¶¯ÀàËÆ£¬½ÓÊÕ´°¿Ú×ó²¿×Ö½ÚÒѾ­·¢ËÍÈ·Èϲ¢½»¸¶Ö÷»ú£¬¾ÍÏòÓÒ»¬¶¯½ÓÊÕ´°¿Ú¡£ +??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -½ÓÊÕ´°¿ÚÖ»»á¶Ô´°¿ÚÄÚ×îºóÒ»¸ö°´Ðòµ½´ïµÄ×Ö½Ú½øÐÐÈ·ÈÏ£¬ÀýÈç½ÓÊÕ´°¿ÚÒѾ­ÊÕµ½µÄ×Ö½ÚΪ {31, 32, 34, 35}£¬ÆäÖÐ {31, 32} °´Ðòµ½´ï£¬¶ø {34, 35} ¾Í²»ÊÇ£¬Òò´ËÖ»¶Ô×Ö½Ú 32 ½øÐÐÈ·ÈÏ¡£·¢ËÍ·½µÃµ½Ò»¸ö×Ö½ÚµÄÈ·ÈÏÖ®ºó£¬¾ÍÖªµÀÕâ¸ö×Ö½Ú֮ǰµÄËùÓÐ×Ö½Ú¶¼ÒѾ­±»½ÓÊÕ¡£ +???????????????????????????????????????????????????????????? {31, 32, 34, 35}?????? {31, 32} ??????? {34, 35} ??????????????? 32 ????????????????????????????????????????????????????????????? -## TCP ¿É¿¿´«Êä +## TCP ??????? -TCP ʹÓó¬Ê±ÖØ´«À´ÊµÏÖ¿É¿¿´«Ê䣺Èç¹ûÒ»¸öÒѾ­·¢Ë͵ı¨ÎĶÎÔÚ³¬Ê±Ê±¼äÄÚûÓÐÊÕµ½È·ÈÏ£¬ÄÇô¾ÍÖØ´«Õâ¸ö±¨ÎĶΡ£ +TCP ??¨®????????????????????????????????????????????????????????????????????¦±? -Ò»¸ö±¨ÎĶδӷ¢Ë͵½½ÓÊÕµ½È·ÈÏËù¾­¹ýµÄʱ¼ä³ÆÎªÍù·µÊ±¼ä RTT£¬¼ÓȨƽ¾ùÍù·µÊ±¼ä RTTs ¼ÆËãÈçÏ£º +???????¦Ä????????????????????????????????? RTT??????????????? RTTs ????????? ![](http://latex.codecogs.com/gif.latex?\\\\RTTs=(1-a)*(RTTs)+a*RTT) -¿ÉÒÔÖªµÀ£¬³¬Ê±Ê±¼ä RTO Ó¦¸ÃÂÔ´óÓÚ RRTs£¬TCP ʹÓõij¬Ê±Ê±¼ä¼ÆËãÈçÏ£º +??????????????? RTO ???????? RRTs??TCP ????????????????? ![](http://latex.codecogs.com/gif.latex?\\\\RTO=RTTs+4*RTT_d) -ÆäÖÐ RTTd Ϊƫ²î£¬ËüÓëÐ嵀 RRT ºÍ RRTs Óйء£ +???? RTTd ??????????? RRT ?? RRTs ?§Û?? -## TCP Á÷Á¿¿ØÖÆ +## TCP ???????? -Á÷Á¿¿ØÖÆÊÇΪÁË¿ØÖÆ·¢ËÍ·½·¢ËÍËÙÂÊ£¬±£Ö¤½ÓÊÕ·½À´µÃ¼°½ÓÊÕ¡£ +????????????????????????????????????????¨¹?????? -½ÓÊÕ·½·¢Ë͵ÄÈ·Èϱ¨ÎÄÖеĴ°¿Ú×ֶοÉÒÔÓÃÀ´¿ØÖÆ·¢ËÍ·½´°¿Ú´óС£¬´Ó¶øÓ°Ïì·¢ËÍ·½µÄ·¢ËÍËÙÂÊ¡£ÀýÈ罫´°¿Ú×Ö¶ÎÉèÖÃΪ 0£¬Ôò·¢ËÍ·½²»ÄÜ·¢ËÍÊý¾Ý¡£ +?????????????????§Ö??????¦Ï????????????????????§³????????????????????????ÁL???????????? 0??????????????????? -## TCP ÓµÈû¿ØÖÆ +## TCP ??????? -Èç¹ûÍøÂç³öÏÖÓµÈû£¬·Ö×齫»á¶ªÊ§£¬´Ëʱ·¢ËÍ·½»á¼ÌÐøÖØ´«£¬´Ó¶øµ¼ÖÂÍøÂçÓµÈû³Ì¶È¸ü¸ß¡£Òò´Ëµ±³öÏÖÓµÈûʱ£¬Ó¦µ±¿ØÖÆ·¢ËÍ·½µÄËÙÂÊ¡£ÕâÒ»µãºÍÁ÷Á¿¿ØÖƺÜÏñ£¬µ«Êdzö·¢µã²»Í¬¡£Á÷Á¿¿ØÖÆÊÇΪÁËÈýÓÊÕ·½ÄÜÀ´µÃ¼°½ÓÊÜ£¬¶øÓµÈû¿ØÖÆÊÇΪÁ˽µµÍÕû¸öÍøÂçµÄÓµÈû³Ì¶È¡£ +??????????????????ýq????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????¨¹??????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a69af9bb-b5ad-4896-862d-697e5ee4feb1.png) -TCP Ö÷Ҫͨ¹ýËÄÖÖËã·¨À´½øÐÐÓµÈû¿ØÖÆ£ºÂý¿ªÊ¼¡¢ÓµÈû±ÜÃâ¡¢¿ìÖØ´«¡¢¿ì»Ö¸´¡£·¢ËÍ·½ÐèҪά»¤ÓÐÒ»¸ö½Ð×öÓµÈû´°¿Ú£¨cwnd£©µÄ״̬±äÁ¿¡£×¢ÒâÓµÈû´°¿ÚÓë·¢ËÍ·½´°¿ÚµÄÇø±ð£¬ÓµÈû´°¿ÚÖ»ÊÇÒ»¸ö״̬±äÁ¿£¬Êµ¼Ê¾ö¶¨·¢ËÍ·½ÄÜ·¢ËͶàÉÙÊý¾ÝµÄÊÇ·¢ËÍ·½´°¿Ú¡£ +TCP ?????????????????????????????????????????????????????????????????????????????????cwnd???????????????????????????????????????????????????????????????????????????????????????????? -ΪÁ˱ãÓÚÌÖÂÛ£¬×öÈçϼÙÉ裺 +???????????????????Ñs -1. ½ÓÊÕ·½ÓÐ×ã¹»´óµÄ½ÓÊÕ»º´æ£¬Òò´Ë²»»á·¢ÉúÁ÷Á¿¿ØÖÆ£» -2. ËäÈ» TCP µÄ´°¿Ú»ùÓÚ×Ö½Ú£¬µ«ÊÇÕâÀïÉè´°¿ÚµÄ´óСµ¥Î»Îª±¨ÎĶΡ£ +1. ?????????????????—¨????????????????? +2. ??? TCP ?????????????????????·¡????§³??¦Ë?????¦±? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/346244ff-98c1-4f12-9a87-d0832e8c04cf.jpg) -### Âý¿ªÊ¼ÓëÓµÈû±ÜÃâ +### ?????????????? -·¢Ë͵Ä×î³õÖ´ÐÐÂý¿ªÊ¼£¬Áî cwnd=1£¬·¢ËÍ·½Ö»ÄÜ·¢ËÍ 1 ¸ö±¨ÎĶΣ»µ±ÊÕµ½È·ÈϺ󣬽« cwnd ¼Ó±¶£¬Òò´ËÖ®ºó·¢ËÍ·½Äܹ»·¢Ë͵ı¨ÎĶÎΪ£º2¡¢4¡¢8 ... +???????????????????? cwnd=1????????????? 1 ??????¦²??????????? cwnd ?????????????????????????????2??4??8 ... -×¢Òâµ½Âý¿ªÊ¼Ã¿¸öÂִζ¼½« cwnd ¼Ó±¶£¬ÕâÑù»áÈà cwnd Ôö³¤Ëٶȷdz£¿ì£¬´Ó¶øÊ¹µÃ·¢ËÍ·½·¢Ë͵ÄËÙ¶ÈÔö³¤Ëٶȹý¿ì£¬ÍøÂçÓµÈûµÄ¿ÉÄÜÒ²¾Í¸ü¸ß¡£ÉèÖÃÒ»¸öÂý¿ªÊ¼ÃÅÏÞ ssthresh£¬µ± cwnd >= ssthresh ʱ£¬½øÈëÓµÈû±ÜÃ⣬ÿ¸öÂÖ´ÎÖ»½« cwnd ¼Ó 1¡£ +?????????????¦Æ??? cwnd ????????????? cwnd ????????????????¡Â????????????????????????????????????????????????????????? ssthresh???? cwnd >= ssthresh ??????????????????????? cwnd ?? 1?? -Èç¹û³öÏÖÁ˳¬Ê±£¬ÔòÁî ssthresh = cwnd / 2£¬È»ºóÖØÐÂÖ´ÐÐÂý¿ªÊ¼¡£ +????????????????? ssthresh = cwnd / 2??????????????????? -### ¿ìÖØ´«Óë¿ì»Ö¸´ +### ?????????? -ÔÚ½ÓÊÕ·½£¬ÒªÇóÿ´Î½ÓÊÕµ½±¨ÎĶζ¼Ó¦¸Ã·¢ËͶÔÒÑÊÕµ½ÓÐÐò±¨ÎĶεÄÈ·ÈÏ£¬ÀýÈçÒѾ­½ÓÊÕµ½ M1 ºÍ M2£¬´ËʱÊÕµ½ M4£¬Ó¦µ±·¢ËÍ¶Ô M2 µÄÈ·ÈÏ¡£ +?????????????¦Í????????¦Æ???¡Â???????????????¦Å????????????????? M1 ?? M2???????? M4?????????? M2 ?????? -ÔÚ·¢ËÍ·½£¬Èç¹ûÊÕµ½Èý¸öÖØ¸´È·ÈÏ£¬ÄÇô¿ÉÒÔÈ·ÈÏÏÂÒ»¸ö±¨ÎĶζªÊ§£¬ÀýÈçÊÕµ½Èý¸ö M2 £¬Ôò M3 ¶ªÊ§¡£´ËʱִÐпìÖØ´«£¬Á¢¼´ÖØ´«ÏÂÒ»¸ö±¨ÎĶΡ£ +????????????????????????????????????????????¦Æ??????????????? M2 ???? M3 ??????????§á??????????????????????¦±? -ÔÚÕâÖÖÇé¿öÏ£¬Ö»ÊǶªÊ§¸ö±ð±¨ÎĶΣ¬¶ø²»ÊÇÍøÂçÓµÈû£¬Òò´ËÖ´Ðпì»Ö¸´£¬Áî ssthresh = cwnd / 2 £¬cwnd = ssthresh£¬×¢Òâµ½´Ëʱֱ½Ó½øÈëÓµÈû±ÜÃâ¡£ +???????????????????????¦²?????????????????????§á??????? ssthresh = cwnd / 2 ??cwnd = ssthresh????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/b18d679b-c8e2-4564-88ee-7600090e46da.jpg) -# µÚÁùÕ ӦÓòã* +# ?????? ??¨°?* -## ÓòÃûϵͳ DNS +## ?????? DNS -°ÑÖ÷»úÃû½âÎöΪ IP µØÖ·¡£ +????????????? IP ????? -±»Éè¼Æ³É·Ö²¼Ê½ÏµÍ³¡£ +????????????? -### 1. ²ã´Î½á¹¹ +### 1. ??¦Í? -Ò»¸öÓòÃûÓɶà¸ö²ã´Î¹¹³É£¬´ÓÉϲ㵽ϲã·Ö±ðΪ¶¥¼¶ÓòÃû¡¢¶þ¼¶ÓòÃû¡¢Èý¼¶ÓòÃûÒÔ¼°Ëļ¶ÓòÃû¡£ËùÓÐÓòÃû¿ÉÒÔ»­³ÉÒ»¿ÅÓòÃûÊ÷¡£ +?????????????¦É????????????????????????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c2117f61-1177-4768-bf33-cf4f950d911c.png) ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a4b162e5-db2a-4a27-b213-1fe481c5a06a.png) -ÓòÃû·þÎñÆ÷¿ÉÒÔ·ÖΪÒÔÏÂËÄÀࣺ +???????????????????????? -**(1) ¸ùÓòÃû·þÎñÆ÷**£º½âÎö¶¥¼¶ÓòÃû£» +**(1) ????????????**???????????????? -**(2) ¶¥¼¶ÓòÃû·þÎñÆ÷**£º½âÎö¶þ¼¶ÓòÃû£» +**(2) ??????????????**???????????????? -**(3) ȨÏÞÓòÃû·þÎñÆ÷**£º½âÎöÇøÄÚµÄÓòÃû£» +**(3) ?????????????**????????????????? -ÇøºÍÓòµÄ¸ÅÄͬ£¬¿ÉÒÔÔÚÒ»¸öÓòÖл®·Ö¶à¸öÇø¡£Í¼ b ÔÚÓò abc.com Öл®·ÖÁËÁ½¸öÇø£ºabc.com ºÍ y.abc.com +?????????????????????????§Ý?????????? b ???? abc.com ?§Ý?????????????abc.com ?? y.abc.com ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/fc0c6b2d-68c7-4de8-aaaa-97355a4f0472.jpg) -Òò´Ë¾ÍÐèÒªÁ½¸öȨÏÞÓòÃû·þÎñÆ÷£º +?????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8b335d94-c1ca-42e1-ad48-bb179d28a4f1.jpg) -**(4) ±¾µØÓòÃû·þÎñÆ÷**£ºÒ²³ÆÎªÄ¬ÈÏÓòÃû·þÎñÆ÷¡£¿ÉÒÔÔÚÆäÖÐÅäÖøßËÙ»º´æ¡£ +**(4) ??????????????**????????????????????????????????????????µµ -### 2. ½âÎö¹ý³Ì +### 2. ???????? -Ö÷»úÏò±¾µØÓòÃû·þÎñÆ÷½âÎöµÄ¹ý³Ì²ÉÓõݹ飬¶ø±¾µØÓòÃû·þÎñÆ÷ÏòÆäËüÓòÃû·þÎñÆ÷½âÎö¿ÉÒÔʹÓõݹéºÍµü´úÁ½ÖÖ·½Ê½¡£ +??????????????????????????????ï…????????????????????????????????????????????????????????? -µü´úµÄ·½Ê½Ï£¬±¾µØÓòÃû·þÎñÆ÷ÏòÒ»¸öÓòÃû·þÎñÆ÷½âÎöÇëÇó½âÎöÖ®ºó£¬½á¹û·µ»Øµ½±¾µØÓòÃû·þÎñÆ÷£¬È»ºó±¾µØÓòÃû·þÎñÆ÷¼ÌÐøÏòÆäËüÓòÃû·þÎñÆ÷ÇëÇó½âÎö£»¶øµÝ¹éµØ·½Ê½Ï£¬½á¹û²»ÊÇÖ±½Ó·µ»ØµÄ£¬¶øÊǼÌÐøÏòǰÇëÇó½âÎö£¬×îºóµÄ½á¹û²Å»á·µ»Ø¡£ +????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/6bc61bb8-3b1c-4dc8-ac25-cef925ace0eb.jpg) -## Îļþ´«ÊäЭÒé FTP +## ???????§¿?? FTP -FTP ÔÚÔËÊä²ãʹÓà TCP£¬²¢ÇÒÐèÒª½¨Á¢Á½¸ö²¢ÐÐµÄ TCP Á¬½Ó£º¿ØÖÆÁ¬½ÓºÍÊý¾ÝÁ¬½Ó¡£¿ØÖÆÁ¬½ÓÔÚÕû¸ö»á»°ÆÚ¼äÒ»Ö±±£³Ö´ò¿ª£¬¶øÊý¾ÝÁ¬½ÓÔÚÊý¾Ý´«ËÍÍê±ÏÖ®ºó¾Í¹Ø±Õ¡£¿ØÖÆÁ¬½ÓʹÓö˿ںŠ21£¬Êý¾ÝÁ¬½ÓʹÓö˿ںŠ20¡£ +FTP ?????????? TCP????????????????????§Ö? TCP ????????????????????????????????????????????????????????????????????????????????????????????? 21???????????????? 20?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/58633775-8584-4a01-ad3f-eee4d9a466e1.jpg) -## Ô¶³ÌÖÕ¶ËЭÒé TELNET +## ??????§¿?? TELNET -TELNET ÓÃÓڵǼµ½Ô¶³ÌÖ÷»úÉÏ£¬²¢ÇÒÔ¶³ÌÖ÷»úÉϵÄÊä³öÒ²»á·µ»Ø¡£ +TELNET ????????????????????????????????????????? -TELNET ¿ÉÒÔÊÊÓ¦Ðí¶à¼ÆËã»úºÍ²Ù×÷ϵͳµÄ²îÒ죬ÀýÈ粻ͬ²Ù×÷ϵͳϵͳµÄ»»Ðзû¶¨Òå¡£ +TELNET ?????????????????????????????» ?????????????§Ù????‰^ -## ÍòÎ¬Íø WWW +## ????? WWW -¼û HTTP ±Ê¼Ç¡£ +?? HTTP ???? -## µç×ÓÓʼþЭÒé +## ???????§¿?? -Ò»¸öµç×ÓÓʼþϵͳÓÉÈý²¿·Ö×é³É£ºÓû§´úÀí¡¢Óʼþ·þÎñÆ÷ÒÔ¼°Óʼþ·¢ËÍЭÒéºÍ¶ÁȡЭÒé¡£ÆäÖз¢ËÍЭÒé³£Óà SMTP£¬¶ÁȡЭÒé³£Óà POP3 ºÍ IMAP¡£ +??????????????????????????????????????????????????§¿?????§¿?î•???§Ù???§¿?ø@?? SMTP?????§¿?ø@?? POP3 ?? IMAP?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/de1e46d2-748f-4da3-a29e-7de7bc840366.jpg) ### POP3 -POP3 µÄÌØµãÊÇÖ»ÒªÓû§´Ó·þÎñÆ÷É϶ÁÈ¡ÁËÓʼþ£¬¾Í°Ñ¸ÃÓʼþɾ³ý¡£ +POP3 ?????????????????????????????????????????? ### IMAP -IMAP ЭÒéÖпͻ§¶ËºÍ·þÎñÆ÷ÉϵÄÓʼþ±£³Öͬ²½£¬Èç¹û²»È¥ÊÖ¶¯É¾³ýÓʼþ£¬ÄÇô·þÎñÆ÷ÉϵÄÓʼþÒ²²»»á±»É¾³ý¡£IMAP ÕâÖÖ×ö·¨¿ÉÒÔÈÃÓû§ËæÊ±ËæµØÈ¥·ÃÎÊ·þÎñÆ÷ÉϵÄÓʼþ¡£IMAP ЭÒéÒ²Ö§³Ö´´½¨×Ô¶¨ÒåµÄÎļþ¼Ð¡£ +IMAP §¿???§á???????????????????????????????????????????????????????????????????IMAP ?????????????????????????????????????????IMAP §¿???????????????????§³? ### SMTP -SMTP Ö»ÄÜ·¢ËÍ ASCII Â룬¶ø»¥ÁªÍøÓʼþÀ©³ä MIME ¿ÉÒÔ·¢ËͶþ½øÖÆÎļþ¡£MIME ²¢Ã»Óи͝»òÕßÈ¡´ú SMTP£¬¶øÊÇÔö¼ÓÓʼþÖ÷ÌâµÄ½á¹¹£¬¶¨ÒåÁË·Ç ASCII ÂëµÄ±àÂë¹æÔò¡£ +SMTP ?????? ASCII ????????????????? MIME ?????????????????MIME ????§Ú????????? SMTP???????????????????????????? ASCII ????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ed5522bb-3a60-481c-8654-43e7195a48fe.png) -## ¶¯Ì¬Ö÷»úÅäÖÃЭÒé DHCP +## ???????????§¿?? DHCP -DHCP ÌṩÁ˼´²å¼´ÓõÄÁ¬Íø·½Ê½£¬Óû§²»ÔÙÐèҪȥÊÖ¶¯ÅäÖà IP µØÖ·µÈÐÅÏ¢¡£ +DHCP ??????�‡?????????????????????????????? IP ?????????? -DHCP ÅäÖõÄÄÚÈݲ»½öÊÇ IP µØÖ·£¬»¹°üÀ¨×ÓÍøÑÚÂ롢ĬÈÏ·ÓÉÆ÷ IP µØÖ·¡¢ÓòÃû·þÎñÆ÷µÄ IP µØÖ·¡£ +DHCP ?????????????? IP ??????????????????????¡¤???? IP ????????????????? IP ????? -¹¤×÷·½Ê½ÈçÏ£ºÐèÒª IP µØÖ·µÄÖ÷»ú¹ã²¥·¢ËÍ DHCP ·¢ÏÖ±¨ÎÄ£¨½«Ä¿µÄµØÖ·ÖÃΪȫ 1£¬¼´ 255.255.255.255:67£¬Ô´µØÖ·ÉèÖÃΪȫ 0£¬¼´ 0.0.0.0:68£©£¬DHCP ·þÎñÆ÷ÊÕµ½·¢ÏÖ±¨ÎÄÖ®ºó£¬ÔòÔÚ IP µØÖ·³ØÖÐȡһ¸öµØÖ·£¬·¢ËÍ DHCP Ìṩ±¨Îĸø¸ÃÖ÷»ú¡£ +??????????????? IP ??????????????? DHCP ??????????????????? 1???? 255.255.255.255:67???????????? 0???? 0.0.0.0:68????DHCP ??????????????????????? IP ???????????????????? DHCP ??????????????? -## µã¶Ôµã´«Êä P2P +## ?????? P2P -°Ñij¸öÎļþ·Ö·¢µÄËùÓжԵȼ¯ºÏ³ÆÎªÒ»¸öºéÁ÷¡£ÎļþµÄÊý¾Ýµ¥Ôª³ÆÎªÎļþ¿é£¬ËüµÄ´óСÊǹ̶¨µÄ¡£Ò»¸öеĶԵȷ½¼ÓÈëij¸öºéÁ÷£¬Ò»¿ªÊ¼²¢Ã»ÓÐÎļþ¿é£¬µ«ÊÇÄܹ»´ÓÆäËü¶ÔµÈ·½ÖÐÖð½¥µØÏÂÔØµ½Ò»Ð©Îļþ¿é£¬Óë´Ëͬʱ£¬ËüҲΪ±ðµÄ¶ÔµÈ·½ÉÏ´«Ò»Ð©Îļþ¿é¡£ +????????????????§Ø??????????????????????????????????ï…?????§³??????????????????????????????????????????ï…????????????????????????????§»????ï…?????????????????????§»????î• -ÿ¸öºéÁ÷¶¼ÓÐÒ»¸ö»ù´¡ÉèÊ©£¬³ÆÎª×·×ÙÆ÷¡£µ±Ò»¸ö¶ÔµÈ·½¼ÓÈëºéÁ÷ʱ£¬±ØÐëÏò×·×ÙÆ÷µÇ¼Ç£¬²¢ÖÜÆÚÐÔµØÍ¨Öª×·×ÙÆ÷ËüÈÔÔÚºéÁ÷ÖС£¿ÉÒÔÔÚÈκÎʱ¼ä¼ÓÈëºÍÍ˳öij¸öºéÁ÷¡£ +?????????????????????????????????????????????????????????????????????????????????????????????§³????????¦Ê???????????????????? -Ò»¸öеĶԵȷ½¼ÓÈëºéÁ÷ʱ£¬×·×ÙÆ÷»áËæ»ú´ÓºéÁ÷ÖÐÑ¡ÔñÈô¸É¸ö¶ÔµÈ·½£¬²¢ÈÃжԵȷ½ÓëÕâЩ¶ÔµÈ·½½¨Á¢Á¬½Ó£¬°ÑÕâЩ¶ÔµÈ·½³ÆÎªÏàÁڶԵȷ½¡£½ÓÊպͷ¢ËÍÎļþ¿é¶¼ÊÇÔÚÏàÁڶԵȷ½ÖнøÐС£ +???????????????????????????????????????????????????????????????§»?????????????????§»????????????????????????????úY????????????§ß??§³? -µ±Ò»¸ö¶ÔµÈ·½ÐèÒªºÜ¶àÎļþ¿éʱ£¬Í¨¹ýʹÓÃ×îÏ¡ÓÐÓÅÏȵIJßÂÔÀ´È¡µÃÎļþ¿é£¬Ò²¾ÍÊÇÒ»¸öÎļþ¿éÔÚÏàÁڶԵȷ½Öи±±¾×îÉÙ£¬ÄÇô¾ÍÓÅÏÈÇëÇóÕâ¸öÎļþ¿é¡£ +???????????????????????????????????????????????????ï…???????????????????????§Ú????????????????????????????î• -µ±ºÜ¶à¶ÔµÈ·½Ïòͬһ¸ö¶ÔµÈ·½ÇëÇóÎļþ¿éʱ£¬¸Ã¶ÔµÈ·½ÓÅÏÈÑ¡ÔñÒÔ×î¸ßËÙÂÊÏòÆä·¢ËÍÎļþ¿éµÄ¶ÔµÈ·½¡£ +???????????????????????????????????????????????????????????????????? -P2P ÊÇÒ»¸ö·Ö²¼Ê½ÏµÍ³£¬ÈκÎʱºò¶¼ÓжԵȷ½¼ÓÈë»òÕßÍ˳ö¡£Ê¹Ó÷ֲ¼Ê½É¢Áбí DHT£¬¿ÉÒÔ²éÕÒºéÁ÷ÖеÄ×ÊÔ´ºÍ IP µØÖ·Ó³Éä¡£ +P2P ??????????????¦Ê?????§Ø?????????????????¡Â?????§Ò? DHT?????????????§Ö?????? IP ?????? -## Web Ò³ÃæÇëÇó¹ý³Ì +## Web ?????????? -1. Ïò DNS ·þÎñÆ÷·¢ËÍ DNS ²éѯ±¨ÎÄÀ´½âÎöÓòÃû¡£ +1. ?? DNS ?????????? DNS ??????????????????? -2. ¿ªÊ¼½øÐÐ HTTP »á»°£¬ÐèÒªÏȽ¨Á¢ TCP Á¬½Ó¡£ +2. ??????? HTTP ???????????? TCP ????? -3. ÔÚÔËÊä²ãµÄ´«Êä¹ý³ÌÖУ¬HTTP ±¨Îı»·â×°½ø TCP ÖС£HTTP ÇëÇó±¨ÎÄʹÓö˿ںŠ80£¬ÒòΪ·þÎñÆ÷¼àÌýµÄÊÇ 80 ¶Ë¿Ú¡£Á¬½Ó½¨Á¢Ö®ºó£¬·þÎñÆ÷»áËæ»ú·ÖÅäÒ»¸ö¶Ë¿ÚºÅ¸øÌض¨µÄ¿Í»§¶Ë£¬Ö®ºóµÄ TCP ´«Êä¶¼ÊÇÓÃÕâ¸ö·ÖÅäµÄ¶Ë¿ÚºÅ¡£ +3. ???????????????§µ?HTTP ?????????? TCP ?§³?HTTP ???????????? 80??????????????????? 80 ?????????????????????????????????????????????????? TCP ???????????????????? -4. ÔÚÍøÂç²ãµÄ´«Êä¹ý³ÌÖУ¬TCP ±¨ÎĶλᱻ·â×°½ø IP ·Ö×éÖУ¬IP ·Ö×é¾­¹ý·ÓÉÑ¡Ôñ£¬×îºóµ½´ïÄ¿µÄµØ¡£ +4. ???????????????§µ?TCP ????¦Ë?????? IP ?????§µ?IP ??????¡¤?????????????? -5. ÔÚÁ´Â·²ã£¬IP ·Ö×é»á±»·â×°½ø MAC Ö¡ÖУ¬IP µØÖ·½âÎö³É MAC µØÖ·ÐèҪʹÓà ARP¡£ +5. ????¡¤??IP ?????????? MAC ??§µ?IP ????????? MAC ????????? ARP?? -6. ¿Í»§¶Ë·¢ËÍ HTTP ÇëÇó±¨ÎÄ£¬ÇëÇó»ñÈ¡Ò³Ãæ¡£ +6. ???????? HTTP ???????????????µµ -7. ·þÎñÆ÷·¢ËÍ HTTP ÏàÓ¦±¨ÎÄ£¬¿Í»§¶Ë´Ó¶ø»ñÈ¡¸ÃÒ³Ãæ¡£ +7. ?????????? HTTP ??????????????????????µµ -8. ä¯ÀÀÆ÷µÃµ½Ò³ÃæÄÚÈÝÖ®ºó£¬½âÎö²¢äÖȾ£¬ÏòÓû§Õ¹Ê¾Ò³Ãæ¡£ +8. ?????????????????????????????????????µµ -## ³£ÓÃ¶Ë¿Ú +## ?????? -| Ó¦ÓòãЭÒé | ¶Ë¿ÚºÅ | ÔËÊä²ãЭÒé | +| ??¨°?§¿?? | ???? | ?????§¿?? | | -- | -- | -- | | DNS | 53 | UDP | -| FTP | ¿ØÖÆÁ¬½Ó 21£¬Êý¾ÝÁ¬½Ó 20 | TCP | +| FTP | ???????? 21?????????? 20 | TCP | | TELNET | 23 | TCP | | DHCP | 67 68 | UDP | | HTTP | 80 | TCP | @@ -842,7 +842,7 @@ P2P | POP3 | 110 | TCP | | IMAP | 143 | TCP | -# ²Î¿¼×ÊÁÏ +# ?¦Ï????? -- ¼ÆËã»úÍøÂç µÚÆß°æ -- ×Ô¶¥ÏòϼÆËã»úÍøÂç +- ????????? ????? +- ??????????????? diff --git a/notes/设计模å¼�.md b/notes/设计模å¼�.md index c4e44538..27aae434 100644 --- a/notes/设计模å¼�.md +++ b/notes/设计模å¼�.md @@ -1,74 +1,74 @@ -* [µÚ 1 Õ Éè¼ÆÄ£Ê½ÈëÃÅ](#µÚ-1-ÕÂ-Éè¼ÆÄ£Ê½ÈëÃÅ) -* [µÚ 2 Õ ¹Û²ìÕßģʽ](#µÚ-2-ÕÂ-¹Û²ìÕßģʽ) -* [µÚ 3 Õ װÊÎģʽ](#µÚ-3-ÕÂ-×°ÊÎģʽ) -* [µÚ 4 Õ ¹¤³§Ä£Ê½](#µÚ-4-ÕÂ-¹¤³§Ä£Ê½) - * [4.1 ¼òµ¥¹¤³§](#41-¼òµ¥¹¤³§) - * [4.2 ¹¤³§·½·¨Ä£Ê½](#42-¹¤³§·½·¨Ä£Ê½) - * [4.3 ³éÏ󹤳§Ä£Ê½](#43-³éÏ󹤳§Ä£Ê½) -* [µÚ 5 Õ µ¥¼þģʽ](#µÚ-5-ÕÂ-µ¥¼þģʽ) -* [µÚ 6 Õ ÃüÁîģʽ](#µÚ-6-ÕÂ-ÃüÁîģʽ) -* [µÚ 7 Õ ÊÊÅäÆ÷ģʽÓëÍâ¹Ûģʽ](#µÚ-7-ÕÂ-ÊÊÅäÆ÷ģʽÓëÍâ¹Ûģʽ) - * [7.1 ÊÊÅäÆ÷ģʽ](#71-ÊÊÅäÆ÷ģʽ) - * [7.2 Íâ¹Ûģʽ](#72-Íâ¹Ûģʽ) -* [µÚ 8 Õ ģ°å·½·¨Ä£Ê½](#µÚ-8-ÕÂ-Ä£°å·½·¨Ä£Ê½) -* [µÚ 9 Õ µü´úÆ÷ºÍ×éºÏģʽ](#µÚ-9-ÕÂ-µü´úÆ÷ºÍ×éºÏģʽ) - * [9.1 µü´úÆ÷ģʽ](#91-µü´úÆ÷ģʽ) - * [9.2 Java ÄÚÖõĵü´úÆ÷](#92-java-ÄÚÖõĵü´úÆ÷) - * [9.3 ×éºÏģʽ](#93-×éºÏģʽ) -* [µÚ 10 Õ ״̬ģʽ](#µÚ-10-ÕÂ-״̬ģʽ) -* [µÚ 11 Õ ´úÀíģʽ // TODO](#µÚ-11-ÕÂ-´úÀíģʽ--todo) -* [µÚ 12 Õ ¸´ºÏģʽ](#µÚ-12-ÕÂ-¸´ºÏģʽ) +* [?? 1 ?? ?????????](#??-1-??-?????????) +* [?? 2 ?? ???????](#??-2-??-???????) +* [?? 3 ?? ?????](#??-3-??-?????) +* [?? 4 ?? ??????](#??-4-??-??????) + * [4.1 ?????](#41-?????) + * [4.2 ??????????](#42-??????????) + * [4.3 ???????](#43-???????) +* [?? 5 ?? ??????](#??-5-??-??????) +* [?? 6 ?? ??????](#??-6-??-??????) +* [?? 7 ?? ???????????????](#??-7-??-???????????????) + * [7.1 ????????](#71-????????) + * [7.2 ?????](#72-?????) +* [?? 8 ?? ??Ùã????](#??-8-??-??Ùã????) +* [?? 9 ?? ?????????????](#??-9-??-?????????????) + * [9.1 ????????](#91-????????) + * [9.2 Java ??????????](#92-java-??????????) + * [9.3 ?????](#93-?????) +* [?? 10 ?? ????](#??-10-??-????) +* [?? 11 ?? ?????? // TODO](#??-11-??-??????--todo) +* [?? 12 ?? ??????](#??-12-??-??????) * [12.1 MVC](#121-mvc) - * [12.1.1 ´«Í³ MVC](#1211-´«Í³-mvc) - * [12.1.2 Web ÖÐµÄ MVC](#1212-web-ÖеÄ-mvc) -* [µÚ 13 Õ ÓëÉè¼ÆÄ£Ê½Ïà´¦](#µÚ-13-ÕÂ-ÓëÉè¼ÆÄ£Ê½Ïà´¦) -* [µÚ 14 Õ ʣϵÄģʽ // TODO](#µÚ-14-ÕÂ-ʣϵÄģʽ--todo) + * [12.1.1 ??? MVC](#1211-???-mvc) + * [12.1.2 Web ?§Ö? MVC](#1212-web-?§Ö?-mvc) +* [?? 13 ?? ?????????](#??-13-??-?????????) +* [?? 14 ?? ?????? // TODO](#??-14-??-??????--todo) -# µÚ 1 Õ Éè¼ÆÄ£Ê½ÈëÃÅ +# ?? 1 ?? ????????? -**1. Éè¼ÆÄ£Ê½¸ÅÄî** +**1. ?????????** -Éè¼ÆÄ£Ê½²»ÊÇ´úÂ룬¶øÊǽâ¾öÎÊÌâµÄ·½°¸£¬Ñ§Ï°ÏÖÓеÄÉè¼ÆÄ£Ê½¿ÉÒÔ×öµ½¾­Ñ鸴Óᣠ+?????????????????????????????????§Ö?????????????????û`?¨¢? -ÓµÓÐÉè¼ÆÄ£Ê½´Ê»ã£¬ÔÚ¹µÍ¨Ê±¾ÍÄÜÓøüÉٵĴʻãÀ´ÌÖÂÛ£¬²¢ÇÒ²»ÐèÒªÁ˽âµ×²ãϸ½Ú¡£ +???????????????????????????????????????????????????? -**2. ÎÊÌâÃèÊö** +**2. ????????** -Éè¼Æ²»Í¬ÖÖÀàµÄѼ×ÓÓµÓв»Í¬µÄ½ÐÉùºÍ·ÉÐз½Ê½¡£ +???????????????§Ó???????????§Ù???? -**3. ¼òµ¥ÊµÏÖ·½°¸** +**3. ????????** -ʹÓü̳еĽâ¾ö·½°¸ÈçÏ£¬ÕâÖÖ·½°¸´úÂëÎÞ·¨¸´Óã¬Èç¹ûÁ½¸öѼ×ÓÀàÓµÓÐͬÑùµÄ·ÉÐз½Ê½£¬¾ÍÓÐÁ½·ÝÖØ¸´µÄ´úÂë¡£ +??¨¹?§Ö?????????????????????????????????????????????????????§Ù???????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/144d28a0-1dc5-4aba-8961-ced5bc88428a.jpg) -**4. Éè¼ÆÔ­Ôò** +**4. ??????** -**·â×°±ä»¯**ÔÚÕâÀï±ä»¯µÄÊÇѼ×ӽкͷÉÐеÄÐÐΪ·½Ê½¡£ +**????�£**??????�£???????§Ü???§Ö????????? -**Õë¶Ô½Ó¿Ú±à³Ì£¬¶ø²»ÊÇÕë¶ÔʵÏÖ±à³Ì** ±äÁ¿ÉùÃ÷µÄÀàÐÍΪ¸¸À࣬¶ø²»ÊǾßÌåµÄij¸ö×ÓÀà¡£¸¸ÀàÖеķ½·¨ÊµÏÖ²»ÔÚ¸¸À࣬¶øÊÇÔÚ¸÷¸ö×ÓÀà¡£³ÌÐòÔÚÔËÐÐʱ¿ÉÒÔ¶¯Ì¬¸Ä±ä±äÁ¿ËùÖ¸ÏòµÄ×ÓÀàÀàÐÍ¡£ +**??????????????????????** ?????????????????????????????????????????§Ö???????????????????????????????????????????????????????????????? -ÔËÓÃÕâÒ»Ô­Ôò£¬½«½ÐºÍ·ÉÐеÄÐÐΪ³éÏó³öÀ´£¬ÊµÏÖ¶àÖÖ²»Í¬µÄ½ÐºÍ·ÉÐеÄ×ÓÀ࣬ÈÃ×ÓÀàȥʵÏÖ¾ßÌåµÄ½ÐºÍ·ÉÐз½Ê½¡£ +????????????§Ü???§Ö???????????????????????§Ü???§Ö???????????????????§Ü???§Ù???? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1c8ccf5c-7ecd-4b8a-b160-3f72a510ce26.png) -**¶àÓÃ×éºÏ£¬ÉÙÓü̳Ð** ×éºÏÒ²¾ÍÊÇ has-a ¹ØÏµ£¬Í¨¹ý×éºÏ£¬¿ÉÒÔÔÚÔËÐÐʱ¶¯Ì¬¸Ä±äʵÏÖ£¬Ö»ÒªÍ¨¹ý¸Ä±ä¸¸Àà¶ÔÏó¾ßÌåÖ¸ÏòÄĸö×ÓÀ༴¿É¡£¶ø¼Ì³Ð¾Í²»ÄÜ×öµ½ÕâЩ£¬¼Ì³ÐÌåϵÔÚ´´½¨Ààʱ¾ÍÒѾ­È·¶¨¡£ +**???????????¨¹??** ???????? has-a ????????????????????????????????????????Íè???????????????????¨À?????§à??????????§»?????????????????????????? -ÔËÓÃÕâÒ»Ô­Ôò£¬ÔÚ Duck ÀàÖÐ×éºÏ FlyBehavior ºÍ QuackBehavior À࣬performQuack() ºÍ performFly() ·½·¨Î¯ÍиøÕâÁ½¸öÀàÈ¥´¦Àí¡£Í¨¹ýÕâÖÖ·½Ê½£¬Ò»¸ö Duck ×ÓÀà¿ÉÒÔ¸ù¾ÝÐèҪȥʵÀý»¯ FlyBehavior ºÍ QuackBehavior µÄ×ÓÀà¶ÔÏ󣬲¢ÇÒÒ²¿ÉÒÔ¶¯Ì¬µØ½øÐиı䡣 +???????????? Duck ??????? FlyBehavior ?? QuackBehavior ??performQuack() ?? performFly() ??????§Ú???????????????????????????? Duck ??????????????????? FlyBehavior ?? QuackBehavior ???????????????????????§Ú?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/29574e6f-295c-444e-83c7-b162e8a73a83.jpg) -**5. ÕûÌåÉè¼ÆÍ¼** +**5. ????????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/e13833c8-e215-462e-855c-1d362bb8d4a0.jpg) -**6. ģʽ¶¨Òå** +**6. ??????** -**²ßÂÔģʽ** £º¶¨ÒåÁËËã·¨×壬·Ö±ð·â×°ÆðÀ´£¬ÈÃËüÃÇÖ®¼ä¿ÉÒÔ»¥ÏàÌæ»»£¬´ËģʽÈÃËã·¨µÄ±ä»¯¶ÀÁ¢ÓÚʹÓÃËã·¨µÄ¿Í»§¡£ +**??????** ???????????ÈÉ???????????????????????????�I????????????�£????????????????? -**7. ʵÏÖ´úÂë** +**7. ??????** ```java public abstract class Duck { @@ -164,42 +164,42 @@ public class MiniDuckSimulator { } } ``` -Ö´Ðнá¹û +??§ß?? ```html QuackBehavior.Quack FlyBehavior.FlyWithWings FlyBehavior.FlyNoWay ``` -# µÚ 2 Õ ¹Û²ìÕßģʽ +# ?? 2 ?? ??????? -**1. ģʽ¶¨Òå** +**1. ??????** -¶¨ÒåÁ˶ÔÏóÖ®¼äµÄÒ»¶Ô¶àÒÀÀµ£¬µ±Ò»¸ö¶ÔÏó¸Ä±ä״̬ʱ£¬ËüµÄËùÓÐÒÀÀµÕß¶¼»áÊܵ½Í¨Öª²¢×Ô¶¯¸üС£Ö÷Ì⣨Subject£©ÊDZ»¹Û²ìµÄ¶ÔÏ󣬶øÆäËùÓÐÒÀÀµÕߣ¨Observer£©³ÉΪ¹Û²ìÕß¡£ +???????????????????????????????????????????????????????????????????????????Subject??????????????????????????Observer??????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/26cb5e7e-6fa3-44ad-854e-fe24d1a5278c.jpg) -**2. ģʽÀàͼ** +**2. ?????** -Ö÷ÌâÖоßÓÐ×¢²áºÍÒÆ³ý¹Û²ìÕߣ¬²¢Í¨ÖªËùÓÐ×¢²áÕߵŦÄÜ£¬Ö÷ÌâÊÇͨ¹ýά»¤Ò»ÕŹ۲ìÕßÁбíÀ´ÊµÏÖÕâЩ²Ù×÷µÄ¡£ +?????§à??????????????????????????????????????????????????????§Ò????????§»??????? -¹Û²ìÕßÓµÓÐÒ»¸öÖ÷Ìâ¶ÔÏóµÄÒýÓã¬ÒòΪע²á¡¢ÒƳý»¹ÓÐÊý¾Ý¶¼ÔÚÖ÷Ìâµ±ÖУ¬±ØÐëͨ¹ý²Ù×÷Ö÷Ìâ²ÅÄÜÍê³ÉÏàÓ¦¹¦ÄÜ¡£ +?????????????????????????????????????????????????§µ?????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/5c558190-fccd-4b5e-98ed-1896653fc97f.jpg) -**3. ÎÊÌâÃèÊö** +**3. ????????** -ÌìÆøÊý¾Ý²¼¸æ°å»áÔÚÌìÆøÐÅÏ¢·¢Éú¸Ä±äʱ¸üÐÂÆäÄÚÈÝ£¬²¼¸æ°åÓжà¸ö£¬²¢ÇÒÔÚ½«À´»á¼ÌÐøÔö¼Ó¡£ +???????????????????????????????????????????????§Ø??????????????????????? -**4. ½â¾ö·½°¸Ààͼ** +**4. ??????????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/760a5d63-d96d-4dd9-bf9a-c3d126b2f401.jpg) -**5. Éè¼ÆÔ­Ôò** +**5. ??????** -**Ϊ½»»¥¶ÔÏóÖ®¼äµÄËÉñîºÏÉè¼Æ¶øÅ¬Á¦** µ±Á½¸ö¶ÔÏóÖ®¼äËÉñîºÏ£¬ËüÃÇÒÀÈ»¿ÉÒÔ½»»¥£¬µ«ÊDz»Ì«Çå³þ±Ë´ËµÄϸ½Ú¡£ÓÉÓÚËÉñîºÏµÄÁ½¸ö¶ÔÏóÖ®¼ä»¥ÏàÒÀÀµ³Ì¶ÈºÜµÍ£¬Òò´Ëϵͳ¾ßÓе¯ÐÔ£¬Äܹ»Ó¦¶Ô±ä»¯¡£ +**?????????????????????????** ????????????????????????????????????????????????????????????????????????ÒÔ????????????????????§Ö??????????�£?? -**6. ʵÏÖ´úÂë** +**6. ??????** ```java public interface Subject { @@ -297,7 +297,7 @@ public class WeatherStation { } } ``` -Ö´Ðнá¹û +??§ß?? ```html CurrentConditionsDisplay.update:0.0 0.0 0.0 StatisticsDisplay.update:0.0 0.0 0.0 @@ -305,39 +305,39 @@ CurrentConditionsDisplay.update:1.0 1.0 1.0 StatisticsDisplay.update:1.0 1.0 1.0 ``` -# µÚ 3 Õ װÊÎģʽ +# ?? 3 ?? ????? -**1. ÎÊÌâÃèÊö** +**1. ????????** -Éè¼Æ²»Í¬ÖÖÀàµÄÒûÁÏ£¬²¢ÇÒÿÖÖÒûÁÏ¿ÉÒÔ¶¯Ì¬Ìí¼ÓеIJÄÁÏ£¬±ÈÈç¿ÉÒÔÌí¼ÓÅ£ÄÌ¡£¼ÆËãÒ»ÖÖÒûÁϵļ۸ñ¡£ +????????????????????????????????????????????????????????????????????? -**2. ģʽ¶¨Òå** +**2. ??????** -¶¯Ì¬µØ½«ÔðÈθ½¼Óµ½¶ÔÏóÉÏ¡£ÔÚÀ©Õ¹¹¦ÄÜÉÏ£¬×°ÊÎÕßÌṩÁ˱ȼ̳иüÓе¯ÐÔµÄÌæ´ú·½°¸¡£ +?????????¦È??????????????????????????????????§Ú??§Ö????????????? -ÏÂͼÖÐ DarkRoast ¶ÔÏó±» Mocha °ü¹ü£¬Mocha ¶ÔÏóÓÖ±» Whip °ü¹ü£¬²¢ÇÒËûÃǶ¼¼Ì³Ð×ÔÏàͬ¸¸À࣬¶¼ÓÐ cost() ·½·¨£¬µ«ÊÇÍâ²ã¶ÔÏóµÄ cost() ·½·¨ÊµÏÖµ÷ÓÃÁËÄÚ²ã¶ÔÏóµÄ cost() ·½·¨¡£Òò´Ë£¬Èç¹ûÒªÔÚ DarkRoast ÉÏÌí¼Ó Mocha£¬ÄÇôֻÐèÒªÓà Mocha °ü¹ü DarkRoast£¬Èç¹û»¹ÐèÒª Whip £¬¾ÍÓà Whip °ü¹ü Mocha£¬×îºóµ÷Óà cost() ·½·¨ÄܰÑÈýÖÖ¶ÔÏóµÄ¼Û¸ñ¶¼°üº¬½øÈ¥¡£ +????? DarkRoast ???? Mocha ??????Mocha ??????? Whip ??????????????????????????????? cost() ????????????????? cost() ??????????????????? cost() ???????????????? DarkRoast ????? Mocha??????????? Mocha ???? DarkRoast?????????? Whip ?????? Whip ???? Mocha???????? cost() ????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/41a4cb30-f393-4b3b-abe4-9941ccf8fa1f.jpg) -**3. ģʽÀàͼ** +**3. ?????** -×°ÊÎÕߺ;ßÌå×é¼þ¶¼¼Ì³Ð×Ô×é¼þÀàÐÍ£¬ÆäÖоßÌå×é¼þµÄ·½·¨ÊµÏÖ²»ÐèÒªÒÀÀµÓÚÆäËü¶ÔÏ󣬶ø×°ÊÎÕßÓµÓÐÒ»¸ö×é¼þÀàÐͶÔÏó£¬ÕâÑùËü¿ÉÒÔ×°ÊÎÆäËü×°ÊÎÕß»òÕß¾ßÌå×é¼þ¡£ËùνװÊΣ¬¾ÍÊǰÑÕâ¸ö×°ÊÎÕßÌ×ÔÚ±»×°ÊεĶÔÏóÖ®Í⣬´Ó¶ø¶¯Ì¬À©Õ¹±»×°ÊÎÕߵŦÄÜ¡£×°ÊÎÕߵķ½·¨ÓÐÒ»²¿·ÖÊÇ×Ô¼ºµÄ£¬ÕâÊôÓÚËüµÄ¹¦ÄÜ£¬È»ºóµ÷Óñ»×°ÊÎÕߵķ½·¨ÊµÏÖ£¬´Ó¶øÒ²±£ÁôÁ˱»×°ÊÎÕߵŦÄÜ¡£¿ÉÒÔ¿´µ½£¬¾ßÌå×é¼þÓ¦µ±ÊÇ×°Êβã´ÎµÄ×îµÍ²ã£¬ÒòΪֻÓоßÌå×é¼þÓÐÖ±½ÓʵÏÖ¶ø²»ÐèҪίÍиøÆäËü¶ÔÏóÈ¥´¦Àí¡£ +??????????????????????????????§à?????????????????????????????????????????????????????????????????????????????????????????¦Í??¦²?????????????????????¦Å??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????¦Â?¦Å??????????§à??????????????????????§Ú?????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/3dc454fb-efd4-4eb8-afde-785b2182caeb.jpg) -**4. ÎÊÌâ½â¾ö·½°¸µÄÀàͼ** +**4. ???????????????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/9c997ac5-c8a7-44fe-bf45-2c10eb773e53.jpg) -**5. Éè¼ÆÔ­Ôò** +**5. ??????** -**ÀàÓ¦¸Ã¶ÔÀ©Õ¹¿ª·Å£¬¶ÔÐ޸Ĺرա£**Ò²¾ÍÊÇÌí¼Óй¦ÄÜʱ²»ÐèÒªÐ޸ĴúÂë¡£ÔÚ±¾ÕÂÎÊÌâÖиÃÔ­ÔòÌåÏÖÔÚ£¬ÔÚÒûÁÏÖÐÌí¼ÓеIJÄÁÏ£¬¶ø²»ÐèҪȥÐÞ¸ÄÒûÁϵĴúÂë¡£¹Û²ìÔòģʽҲ·ûºÏÕâ¸öÔ­Ôò¡£²»¿ÉÄÜËùÓÐÀà¶¼ÄÜʵÏÖÕâ¸öÔ­Ôò£¬Ó¦µ±°Ñ¸ÃÔ­ÔòÓ¦ÓÃÓÚÉè¼ÆÖÐ×îÓпÉÄܸıäµÄµØ·½¡£ +**??????????????????????**???????????????????????????????????§Ú??????????????????????????????????????????????????????????????????????????????????????????????????????????????§á?????????? -**6. Java I/O ÖеÄ×°ÊÎÕßģʽ** +**6. Java I/O ?§Ö????????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/2a40042a-03c8-4556-ad1f-72d89f8c555c.jpg) -**7. ´úÂëʵÏÖ** +**7. ???????** ```java public interface Beverage { @@ -402,32 +402,32 @@ public class StartbuzzCoffee { } ``` -Êä³ö +??? ```html 3.0 ``` -# µÚ 4 Õ ¹¤³§Ä£Ê½ +# ?? 4 ?? ?????? -## 4.1 ¼òµ¥¹¤³§ +## 4.1 ????? -**1. ÎÊÌâÃèÊö** +**1. ????????** -Óв»Í¬µÄ Pizza£¬¸ù¾Ý²»Í¬µÄÇé¿öÓò»Í¬µÄ×ÓÀàʵÀý»¯Ò»¸ö Pizza ¶ÔÏó¡£ +?§Ó???? Pizza??????????????¨°???????????????? Pizza ???? -**2. ¶¨Òå** +**2. ????** -¼òµ¥¹¤³§²»ÊÇÉè¼ÆÄ£Ê½£¬¸üÏñÊÇÒ»ÖÖ±à³Ìϰ¹ß¡£ÔÚʵÀý»¯Ò»¸ö³¬ÀàµÄ¶ÔÏóʱ£¬¿ÉÒÔÓÃËüµÄËùÓÐ×ÓÀàÀ´½øÐÐʵÀý»¯£¬Òª¸ù¾Ý¾ßÌåÐèÇóÀ´¾ö¶¨Ê¹ÓÃÄĸö×ÓÀà¡£ÔÚÕâÖÖÇé¿öÏ£¬°ÑʵÀý»¯µÄ²Ù×÷·Åµ½¹¤³§À´ÖУ¬Èù¤³§ÀàÀ´¾ö¶¨Ó¦¸ÃÓÃÄĸö×ÓÀàÀ´ÊµÀý»¯¡£ÕâÑù×ö°Ñ¿Í»§¶ÔÏóºÍ¾ßÌå×ÓÀàµÄʵÏÖ½âñ¿Í»§¶ÔÏó²»ÔÙÐèÒªÖªµÀÓÐÄÄЩ×ÓÀàÒÔ¼°ÊµÀý»¯Äĸö×ÓÀà¡£ÒòΪ¿Í»§ÀàÍùÍùÓжà¸ö£¬Èç¹û²»Ê¹Óüòµ¥¹¤³§£¬ÄÇôËùÓеĿͻ§Àà¶¼ÒªÖªµÀËùÓÐ×ÓÀàµÄϸ½Ú£¬Ò»µ©×ÓÀà·¢Éú¸Ä±ä£¬ÀýÈçÔö¼Ó×ÓÀ࣬ÄÇôËùÓеĿͻ§Àà¶¼Òª·¢Éú¸Ä±ä¡£ +?????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????§µ??¨´????????????????????????????????????????????????????????????????????????????????§»????????????????????????????????§Ø???????????¨¹????????????§Ö????????????????????????????????????????????????????§Ö????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c470eb9b-fb05-45c5-8bb7-1057dc3c16de.jpg) -**3. ½â¾ö·½°¸Ààͼ** +**3. ??????????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/dc3e704c-7c57-42b8-93ea-ddd068665964.jpg) -**4. ´úÂëʵÏÖ** +**4. ???????** ```java public interface Pizza { @@ -473,33 +473,33 @@ public class PizzaStore { } ``` -ÔËÐнá¹û +???§ß?? ```java CheesePizza ``` -## 4.2 ¹¤³§·½·¨Ä£Ê½ +## 4.2 ?????????? -**1. ÎÊÌâÃèÊö** +**1. ????????** -ÿ¸öµØÇøµÄ Pizza µêËäÈ»ÖÖÀàÏàͬ£¬µ«ÊǶ¼ÓÐ×Ô¼ºµÄ·ç棬ÐèÒªµ¥¶ÀÇø·Ö¡£ÀýÈ磬һ¸ö¿Í»§µãÁËŦԼµÄ cheese ÖÖÀàµÄ Pizza ºÍÔÚÖ¥¼Ó¸çµãµÄÏàͬÖÖÀàµÄ Pizza ÊDz»Í¬µÄ¡£ +????????? Pizza ???????????????????????????¦Æ?????????????????íà?????????????? cheese ????? Pizza ?????????????????? Pizza ??????? -**2. ģʽ¶¨Òå** +**2. ??????** -¶¨ÒåÁËÒ»¸ö´´½¨¶ÔÏóµÄ½Ó¿Ú£¬µ«ÓÉ×ÓÀà¾ö¶¨ÒªÊµÀý»¯µÄÀàÊÇÄÄÒ»¸ö¡£¹¤³§·½·¨ÈÃÀà°ÑʵÀý»¯ÍƳٵ½×ÓÀà¡£ +????????????????????????????????????????????????????????????????????????????? -**3. ģʽÀàͼ** +**3. ?????** -ÔÚ¼òµ¥¹¤³§ÖУ¬´´½¨¶ÔÏóµÄÊÇÁíÒ»¸öÀ࣬¶øÔÚ¹¤³§·½·¨ÖУ¬ÊÇÓÉ×ÓÀàÀ´´´½¨¶ÔÏó¡£¹¤³§·½·¨³£ÓÃÔÚÔÚÿ¸ö×ÓÀà¶¼ÓÐ×Ô¼ºµÄÒ»×é²úÆ·Àà¡£¿ÉÒÔΪÿ¸ö×ÓÀà´´½¨µ¥¶ÀµÄ¼òµ¥¹¤³§£¬µ«ÊǰѼòµ¥¹¤³§Öд´½¨¶ÔÏóµÄ´úÂë·Åµ½×ÓÀàÖÐÀ´¿ÉÒÔ¼õÉÙÀàµÄÊýÄ¿£¬ÒòΪ×ÓÀ಻ËãÊDzúÆ·À࣬Òò´ËÍêÈ«¿ÉÒÔÕâô×ö¡£ +???????§µ???????????????????????????????§µ???????????????????????????????????????????????????????????????????????????????????????????§Õ???????????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/903093ec-acc8-4f9b-bf2c-b990b9a5390c.jpg) -**4. ½â¾ö·½°¸Ààͼ** +**4. ??????????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/664f8901-5dc7-4644-a072-dad88cc5133a.jpg) -**5. ´úÂëʵÏÖ** +**5. ???????** ```java public interface Pizza { @@ -588,36 +588,36 @@ public class PizzaTestDrive { } ``` -ÔËÐнá¹û +???§ß?? ```html NYStyleCheesePizza is making.. ChicagoStyleCheesePizza is making.. ``` -## 4.3 ³éÏ󹤳§Ä£Ê½ +## 4.3 ??????? -**1. Éè¼ÆÔ­Ôò** +**1. ??????** -**ÒÀÀµµ¹ÖÃÔ­Ôò**£ºÒªÒÀÀµ³éÏ󣬲»ÒªÒÀÀµ¾ßÌåÀà¡£ÌýÆðÀ´ÏñÊÇÕë¶Ô½Ó¿Ú±à³Ì£¬²»Õë¶ÔʵÏÖ±à³Ì£¬µ«ÊÇÕâ¸öÔ­Ôò˵Ã÷ÁË£º²»ÄÜÈø߲ã×é¼þÒÀÀµµ×²ã×é¼þ£¬¶øÇÒ£¬²»¹Ü¸ß²ã»òµ×²ã×é¼þ£¬Á½Õß¶¼Ó¦¸ÃÒÀÀµÓÚ³éÏó¡£ÀýÈ磬ÏÂͼÖÐ PizzaStore ÊôÓڸ߲ã×é¼þ£¬µ«ÊÇËüÒÀÀµÓڵײã×é¼þ Pizza µÄ¾ßÌåÀà¡£Èç¹ûÒÀÀµµÄÊÇ Pizza µÄ³éÏóÀ࣬ÄÇô¾Í¿ÉÒÔ²»ÓùØÐÄ Pizza µÄ¾ßÌåʵÏÖϸ½Ú¡£ +**???????????**??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????íà????? PizzaStore ???????????????????????????? Pizza ?????????????????? Pizza ?????????????????¨´??? Pizza ???????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ddf72ca9-c0be-49d7-ab81-57a99a974c8e.jpg) -**2. ģʽ¶¨Òå** +**2. ??????** -Ìṩһ¸ö½Ó¿Ú£¬ÓÃÓÚ´´½¨Ïà¹Ø»òÒÀÀµ¶ÔÏóµÄ¼Ò×壬¶ø²»ÐèÒªÃ÷È·Ö¸¶¨¾ßÌåÀà¡£ +???????????????????????????????ÈÉ??????????????????? -**3. ģʽÀàͼ** +**3. ?????** -³éÏ󹤳§Ä£Ê½´´½¨µÄÊǶÔÏó¼Ò×壬Ҳ¾ÍÊǺܶà¶ÔÏó¶ø²»ÊÇÒ»¸ö¶ÔÏ󣬲¢ÇÒÕâЩ¶ÔÏóÊÇÏà¹ØµÄ£¬Ò²¾ÍÊÇ˵±ØÐëÒ»Æð´´½¨³öÀ´¡£¶ø¹¤³§Ä£Ê½Ö»ÊÇÓÃÓÚ´´½¨Ò»¸ö¶ÔÏó£¬ÕâºÍ³éÏ󹤳§Ä£Ê½Óкܴó²»Í¬¡£²¢ÇÒ£¬³éÏ󹤳§Ä£Ê½Ò²Óõ½Á˹¤³§Ä£Ê½À´´´½¨µ¥Ò»¶ÔÏó£¬ÔÚÀàͼ×󲿣¬AbstractFactory ÖÐµÄ CreateProductA ºÍ CreateProductB ·½·¨¶¼ÊÇÈÃ×ÓÀàÀ´ÊµÏÖ£¬ÕâÁ½¸ö·½·¨µ¥¶ÀÀ´¿´¾ÍÊÇÔÚ´´½¨Ò»¸ö¶ÔÏó£¬Õâ·ûºÏ¹¤³§Ä£Ê½µÄ¶¨Òå¡£ÖÁÓÚ´´½¨¶ÔÏóµÄ¼Ò×åÕâÒ»¸ÅÄîÊÇÔÚ Client ÌåÏÖ£¬Client Ҫͨ¹ý AbstractFactory ͬʱµ÷ÓÃÁ½¸ö·½·¨À´´´½¨³öÁ½¸ö¶ÔÏó£¬ÔÚÕâÀïÕâÁ½¸ö¶ÔÏó¾ÍÓкܴóµÄÏà¹ØÐÔ£¬Client ÐèÒªÕâÁ½¸ö¶ÔÏóµÄЭ×÷²ÅÄÜÍê³ÉÈÎÎñ¡£´Ó¸ß²ã´ÎÀ´¿´£¬³éÏ󹤳§Ê¹ÓÃÁË×éºÏ£¬¼´ Cilent ×éºÏÁË AbstractFactory £¬¶ø¹¤³§Ä£Ê½Ê¹ÓÃÁ˼̳С£ +????????????????????ÈÉ???????????????????????????§»??????????????????????????????????????????????????????????????????§Ü?????????????????????????????????????????????????AbstractFactory ?§Ö? CreateProductA ?? CreateProductB ????????????????????????????????????????????????????????????????????‰^?????????????????????????? Client ?????Client ???? AbstractFactory ????????????????????????????????????????????????§Ü?????????Client ??????????????§¿??????????????????????????????????????? Cilent ????? AbstractFactory ????????????????§³? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/d301774f-e0d2-41f3-95f4-bfe39859b52e.jpg) -**4. ½â¾ö·½°¸Ààͼ** +**4. ??????????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8785dabd-1285-4bd0-b3aa-b05cc060a24a.jpg) -**5. ´úÂëʵÏÖ** +**5. ???????** ```java public interface Dough { @@ -719,28 +719,28 @@ public class NYPizzaStoreTestDrive { } ``` -ÔËÐнá¹û +???§ß?? ```html ThickCrustDough MarinaraSauce ``` -# µÚ 5 Õ µ¥¼þģʽ +# ?? 5 ?? ?????? -**1. ģʽ¶¨Òå** +**1. ??????** -È·±£Ò»¸öÀàÖ»ÓÐÒ»¸öʵÀý£¬²¢ÌṩÁËÒ»¸öÈ«¾Ö·ÃÎʵ㡣 +??????????????????????????????????? -**2. ģʽÀàͼ** +**2. ?????** -µ¥¼þģʽµÄ Java ʵÏÖÓÃÒ»¸ö˽Óй¹ÔìÆ÷¡¢Ò»¸ö˽Óо²Ì¬±äÁ¿ÒÔ¼°Ò»¸ö¹«Óо²Ì¬º¯Êý£¬¸Ãº¯Êý·µ»ØË½ÓбäÁ¿£¬Ê¹µÃËùÓÐͨ¹ý¸Ãº¯Êý»ñÈ¡µÄ¶ÔÏó¶¼Ö¸ÏòÕâ¸öΨһµÄ˽Óо²Ì¬±äÁ¿¡£ +???????? Java ??????????§Û????????????§à???????????????§à?????????¨²?????????§Ò????????????????¨²?????????????????¦·?????§à???????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/59aff6c1-8bc5-48e4-9e9c-082baeb2f274.jpg) -**3. ¾­µäʵÏÖ** +**3. ???????** -ÒÔÏÂʵÏÖÖУ¬Ë½Óо²Ì¬±äÁ¿±»ÑÓ³Ù»¯ÊµÀý»¯£¬ÕâÑù×öµÄºÃ´¦ÊÇ£¬Èç¹ûûÓÐÓõ½¸ÃÀ࣬ÄÇô¾Í²»»á´´½¨¸Ã˽Óо²Ì¬±äÁ¿£¬´Ó¶ø½ÚÔ¼×ÊÔ´¡£Õâ¸öʵÏÖÔÚ¶àÏ̻߳·¾³ÏÂÊDz»°²È«µÄ£¬ÒòΪ¶à¸öÏß³ÌÄܹ»Í¬Ê±½øÈë if(uniqueInstance == null) ÄÚµÄÓï¾ä¿é£¬ÄÇô¾Í»á¶à´ÎʵÀý»¯ uniqueInstance ˽Óо²Ì¬±äÁ¿¡£ +????????§µ???§à???????????????????????????????????????????????????????????§à??????????????????????????????????????????????????????????????? if(uniqueInstance == null) ??????ï…????????????? uniqueInstance ??§à???????? ```java public class Singleton { @@ -759,9 +759,9 @@ public class Singleton { } ``` -**4. Ï̲߳»°²È«ÎÊÌâµÄ½â¾ö·½°¸Ò»** +**4. ???????????????????** -Ö»ÐèÒª¶Ô getUniqueInstance() ·½·¨¼ÓËø£¬¾ÍÄÜÈø÷½·¨Ò»´ÎÖ»ÄÜÒ»¸öÏ̷߳ÃÎÊ£¬´Ó¶ø±ÜÃâÁË¶Ô uniqueInstance ±äÁ¿½øÐжà´ÎʵÀý»¯µÄÎÊÌâ¡£µ«ÊÇÕâÑùÓÐÒ»¸öÎÊÌâÊÇÒ»´ÎÖ»ÄÜÒ»¸öÏ߳̽øÈ룬ÐÔÄÜÉÏ»áÓÐÒ»¶¨µÄÀË·Ñ¡£ +?????? getUniqueInstance() ????????????????¡Â????????????????????????????? uniqueInstance ???????§Ø????????????????????????????????????????????????????????????????? ```java public static synchronized Singleton getUniqueInstance() { @@ -772,17 +772,17 @@ public class Singleton { } ``` -**5. Ï̲߳»°²È«ÎÊÌâµÄ½â¾ö·½°¸¶þ** +**5. ????????????????????** -²»ÓÃÑÓ³ÙʵÀý»¯£¬²ÉÓÃÖ±½ÓʵÀý»¯¡£ +???????????????????????????? ```java private static Singleton uniqueInstance = new Singleton(); ``` -**6. Ï̲߳»°²È«ÎÊÌâµÄ½â¾ö·½°¸Èý** +**6. ????????????????????** -¿¼ÂǵÚÒ»¸ö½â¾ö·½°¸£¬ËüÊÇÖ±½Ó¶Ô getUniqueInstance() ·½·¨½øÐмÓËø£¬¶øÊµ¼ÊÉÏÖ»ÐèÒª¶Ô uniqueInstance = new Singleton(); ÕâÌõÓï¾ä¼ÓËø¼´¿É¡£Ê¹ÓÃÁ½¸öÌõ¼þÓï¾äÀ´ÅÐ¶Ï uniqueInstance ÊÇ·ñÒѾ­ÊµÀý»¯£¬Èç¹ûûÓÐʵÀý»¯²ÅÐèÒª¼ÓËø¡£ +????????????????????????? getUniqueInstance() ???????§Þ?????????????????? uniqueInstance = new Singleton(); ?????????????¨À??????????????????§Ø? uniqueInstance ??????????????????????????????????? ```java public class Singleton { @@ -805,31 +805,31 @@ public class Singleton { } ``` -# µÚ 6 Õ ÃüÁîģʽ +# ?? 6 ?? ?????? -**1. ÎÊÌâÃèÊö** +**1. ????????** -Éè¼ÆÒ»¸öÒ£¿ØÆ÷£¬ËüÓкܶఴť£¬Ã¿¸ö°´Å¥¿ÉÒÔ·¢ÆðÒ»¸öÃüÁÈÃÒ»¸ö¼ÒµçÍê³ÉÏàÓ¦²Ù×÷¡£Óзdz£¶àµÄ¼Òµç£¬²¢ÇÒÒ²»áÔö¼Ó¼Òµç¡£ +????????????????§Ü??????????????????????????????????????????????§Ù??????íà????????????³‡ ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/7b8f0d8e-a4fa-4c9d-b9a0-3e6a11cb3e33.jpg) ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c3ca36b2-8459-4cf1-98b0-cc95a0e94f20.jpg) -**2. ģʽ¶¨Òå** +**2. ??????** -½«ÃüÁî·â×°³É¶ÔÏó£¬ÒÔ±ãʹÓò»Í¬µÄÃüÁîÀ´²ÎÊý»¯ÆäËü¶ÔÏó¡£ +??????????????????¨°???????????????????????? -**3. ģʽÀàͼ** +**3. ?????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1e09d75f-6268-4425-acf8-8ecd1b4a0ef3.jpg) -**4. ½â¾ö·½°¸Ààͼ** +**4. ??????????** -Invoker ÊÇÒ£¿ØÆ÷£¬Ëü¿ÉÒÔÉèÖÃÃüÁ²¢ÇÒµ÷ÓÃÃüÁî¶ÔÏóµÄ execute() ·½·¨¡£Receiver ÊÇµçµÆ£¬ÊÇÃüÁîÕæÕýµÄÖ´ÐÐÕß¡£ConcreteCommand Àà×éºÏÁËÒ»¸ö Receiver ¶ÔÏó£¬ÃüÁîµÄÖ´ÐÐίÍиø Receiver ¶ÔÏóÀ´´¦Àí£¬Ò²¾ÍÊÇ LightOnCommand ÃüÁîµÄ excute ·½·¨Î¯Íиø Light ¶ÔÏóÀ´´¦Àí£¬Light ¶ÔÏóͨ¹ýµ÷Óà on() ·½·¨À´Íê³É²Ù×÷¡£Invoker ²»ÊÇ Client ¶ÔÏó£¬ÊÇÒòΪÃüÁîµÄ´´½¨²»ÊÇÔÚ Invoker ÖÐÍê³ÉµÄ£¬Òò´ËÐèÒª¶îÍâµÄ Client ¶ÔÏóÀ´´¦ÀíÕâЩ²Ù×÷¡£ +Invoker ?????????????????????????????????????? execute() ??????Receiver ???????????????????????ConcreteCommand ?????????? Receiver ??????????????§Ú? Receiver ??????????????? LightOnCommand ????? excute ??????§Ú? Light ??????????Light ??????????? on() ??????????????Invoker ???? Client ??????????????????????? Invoker ?????????????????? Client ????????????§»?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/5ef94f62-98ce-464d-a646-842d9c72c8b8.jpg) -**5. ´úÂëʵÏÖ** +**5. ???????** ```java public interface Command { @@ -864,7 +864,7 @@ public class LightOnCommand implements Command{ ``` ```java /** - * Ò£¿ØÆ÷Àà + * ??????? */ public class SimpleRemoteControl { Command slot; @@ -895,39 +895,39 @@ public class RemoteLoader { } ``` -Êä³ö +??? ```html Light is on! ``` -# µÚ 7 Õ ÊÊÅäÆ÷ģʽÓëÍâ¹Ûģʽ +# ?? 7 ?? ??????????????? -## 7.1 ÊÊÅäÆ÷ģʽ +## 7.1 ???????? -**1. ģʽ¶¨Òå** +**1. ??????** -½«Ò»¸öÀàµÄ½Ó¿Ú£¬×ª»»Îª¿Í»§ÆÚÍûµÄÁíÒ»¸ö½Ó¿Ú¡£ÊÊÅäÆ÷ÈÃÔ­±¾²»¼æÈݵÄÀà¿ÉÒÔºÏ×÷Î޼䡣 +?????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/8e8ba824-7a9e-4934-a212-e6a41dcc1602.jpg) -**2. ģʽÀàͼ** +**2. ?????** -ÓÐÁ½ÖÖÊÊÅäÆ÷ģʽµÄʵÏÖ£¬Ò»ÖÖÊǶÔÏó·½Ê½£¬Ò»ÖÖÊÇÀ෽ʽ¡£¶ÔÏó·½Ê½ÊÇͨ¹ý×éºÏµÄ·½·¨£¬ÈÃÊÊÅäÆ÷ÀࣨAdapter£©ÓµÓÐÒ»¸ö´ýÊÊÅäµÄ¶ÔÏó£¨Adaptee£©£¬´Ó¶ø°ÑÏàÓ¦µÄ´¦ÀíίÍиø´ýÊÊÅäµÄ¶ÔÏó¡£À෽ʽÓõ½¶àÖØ¼Ì³Ð£¬Adapter ¿ÉÒÔ¿´³É Target ºÍ Adaptee ÀàÐÍ£¬ÏȰÑËüµ±³É Adaptee ÀàÐÍÈ»ºóʵÀý»¯Ò»¸ö Adapter ¶ÔÏó£¬ÔÙ°ÑËüµ±³É Target ÀàÐ͵ģ¬ÕâÑù Client ¾Í¿ÉÒÔ°ÑÕâ¸ö¶ÔÏóµ±³É Target µÄ¶ÔÏóÀ´´¦Àí¡£ +??????????????????????????????????????????????????????????????????????Adapter??????????????????Adaptee???????????????????§Ú??????????????????????§µ?Adapter ??????? Target ?? Adaptee ?????????????? Adaptee ??????????????? Adapter ????????????? Target ?????????? Client ?????????????? Target ??????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/253bd869-ea48-4092-9aed-6906ccb2f3b0.jpg) ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a797959a-0ed5-475b-8d97-df157c672019.jpg) -**3. ÎÊÌâÃèÊö** +**3. ????????** -ÈÃѼ×Ó£¨Duck£©ÊÊÅä»ð¼¦£¨Turkey£©£¬Duck ÓÐ quack() ·½·¨£¬¶ø Turkey Ö»ÓÐ gobble() ·½·¨¡£Ò²¾ÍÊÇÒªÈà Turkey Ò²ÓÐ Duck µÄ quack() ·½·¨¡£ +??????Duck????????Turkey????Duck ?? quack() ???????? Turkey ??? gobble() ?????????????? Turkey ??? Duck ?? quack() ?????? -**4. ½â¾ö·½°¸Ààͼ** +**4. ??????????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1a511c76-bb6b-40ab-b8aa-39eeb619d673.jpg) -**5. ´úÂëʵÏÖ** +**5. ???????** ```java public interface Duck { @@ -984,69 +984,69 @@ public class DuckTestDrive { } ``` -ÔËÐнá¹û +???§ß?? ```html gobble! fly! ``` -## 7.2 Íâ¹Ûģʽ +## 7.2 ????? -**1. ģʽ¶¨Òå** +**1. ??????** -ÌṩÁËÒ»¸öͳһµÄ½Ó¿Ú£¬ÓÃÀ´·ÃÎÊ×ÓϵͳÖеÄһȺ½Ó¿Ú¡£Íâ¹Û¶¨ÒåÁËÒ»¸ö¸ß²ã½Ó¿Ú£¬ÈÃ×Óϵͳ¸üÈÝÒ×ʹÓᣠ+???????????????????????????§Ö??????????????????????????????????????¨¢? -**2. ģʽÀàͼ** +**2. ?????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/78f2314e-2643-41df-8f3d-b7e28294094b.jpg) -**3. ÎÊÌâÃèÊö** +**3. ????????** -¼ÒÍ¥Ó°ÔºÖÐÓÐÖÚ¶àµçÆ÷£¬µ±Òª½øÐйۿ´µçӰʱÐèÒª¶ÔºÜ¶àµçÆ÷½øÐвÙ×÷¡£ÒªÇó¼ò»¯ÕâЩ²Ù×÷£¬Ê¹µÃ¼ÒÍ¥Ó°ÔºÀàÖ»Ìṩһ¸ö¼ò»¯µÄ½Ó¿Ú£¬ÀýÈçÌṩһ¸ö¿´µçÓ°µÄ½Ó¿Ú¶ø²»ÓþßÌå²Ù×÷ÖÚ¶àµçÆ÷¡£ +???????????????????????§Û???????????????????§Ó???????????§»????????¨¹??????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/106f5585-b2e7-4718-be5d-3b322d1ef42a.jpg) -**4. ½â¾ö·½°¸Ààͼ** +**4. ??????????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/25387681-89f8-4365-a2fa-83b86449ee84.jpg) -**5. Éè¼ÆÔ­Ôò** +**5. ??????** -**×îÉÙ֪ʶԭÔò**£ºÖ»ºÍÄãµÄÃÜÓÑ̸»°¡£Ò²¾ÍÊÇÓ¦µ±Ê¹µÃ¿Í»§¶ÔÏóËùÐèÒª½»»¥µÄ¶ÔÏóÓ¦µ±¾¡¿ÉÄÜÉÙ¡£ +**?????????**???????????????????????????????????????????????????????????? -# µÚ 8 Õ ģ°å·½·¨Ä£Ê½ +# ?? 8 ?? ??Ùã???? -**1. ģʽ¶¨Òå** +**1. ??????** -ÔÚÒ»¸ö·½·¨Öж¨ÒåÒ»¸öËã·¨µÄ¹Ç¼Ü£¬¶ø½«Ò»Ð©²½ÖèÑÓ³Ùµ½×ÓÀàÖС£ +??????????§Ø??????????????????§»?????????????§³? -Ä£°å·½·¨Ê¹µÃ×ÓÀà¿ÉÒÔÔÚ²»¸Ä±äËã·¨½á¹¹µÄÇé¿öÏ£¬ÖØÐ¶¨ÒåËã·¨ÖеÄijЩ²½Öè¡£ +??Ùã????????????????????????????????????????§Ö??§»???Ò -**2. ģʽÀàͼ** +**2. ?????** -Ä£°å·½·¨ templateMethod() ¶¨ÒåÁËËã·¨µÄ¹Ç¼Ü£¬È·¶¨ÁË primitiveOperation1() ºÍ primitiveOperation2() ·½·¨Ö´ÐеÄ˳Ðò£¬¶ø primitiveOperation1() ºÍ primitiveOperation2() ÈÃ×ÓÀàÈ¥¾ßÌåʵÏÖ¡£ +??Ùã?? templateMethod() ?????????????????? primitiveOperation1() ?? primitiveOperation2() ??????§Ö????? primitiveOperation1() ?? primitiveOperation2() ??????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/ed62f400-192c-4185-899b-187958201f0c.jpg) -**3. ÎÊÌâÃèÊö** +**3. ????????** -³å¿§·ÈºÍ³å²è¶¼ÓÐÀàËÆµÄÁ÷³Ì£¬µ«ÊÇijЩ²½Öè»áÓе㲻һÑù¡£ +?ÓÇ????õÂ?????????????????§»??????§Ö?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/d8f873fc-00bc-41ee-a87c-c1b4c0172844.png) -**4. ½â¾ö·½°¸Ààͼ** +**4. ??????????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/aa20c123-b6b5-432a-83d3-45dc39172192.jpg) -**5. Éè¼ÆÔ­Ôò** +**5. ??????** -**ºÃÀ³ÎëÔ­Ôò**£º±ðµ÷Ó㨴òµç»°¸ø£©ÎÒÃÇ£¬ÎÒÃÇ»áµ÷Ó㨴òµç»°¸ø£©Äã¡£ÕâÒ»Ô­Ôò¿ÉÒÔ·ÀÖ¹ÒÀÀµ¸¯°Ü£¬¼´·ÀÖ¹¸ß²ã×é¼þÒÀÀµµ×²ã×é¼þ£¬µ×²ã×é¼þÓÖÒÀÀµ¸ß²ã×é¼þ¡£¸ÃÔ­ÔòÔÚÄ£°å·½·¨µÄÌåÏÖΪ£¬Ö»Óи¸Àà»áµ÷ÓÃ×ÓÀ࣬×ÓÀ಻»áµ÷Óø¸Àà¡£ +**?????????**??????????´Â????????????????????´Â??????????????????????????????????????????????????????????????????????????????Ùã?????????????§Ú??????????????????????? -**6. ¹³×Ó** +**6. ????** -¹³×Ó£¨hock£©£ºÄ³Ð©²½ÖèÔÚ²»Í¬ÊµÏÖÖпÉÓпÉÎÞ£¬¿ÉÒÔÏȶ¨ÒåÒ»¸öʲô¶¼²»×öµÄ·½·¨£¬°ÑËü¼Óµ½Ä£°å·½·¨ templteMethod() ÖУ¬Èç¹û×ÓÀàÐèÒªËü¾Í¸²¸ÇĬÈÏʵÏÖ²¢¼ÓÉÏ×Ô¼ºµÄʵÏÖ¡£ +?????hock?????§»????????????§á??§á????????????????????????????????????????Ùã?? templteMethod() ?§µ?????????????????????????????????????? -**7. ´úÂëʵÏÖ** +**7. ???????** ```java public abstract class CaffeineBeverage { @@ -1109,7 +1109,7 @@ public class CaffeineBeverageTestDrive { } ``` -ÔËÐнá¹û +???§ß?? ```html boilWater @@ -1123,21 +1123,21 @@ pourInCup Tea.addCondiments ``` -# µÚ 9 Õ µü´úÆ÷ºÍ×éºÏģʽ +# ?? 9 ?? ????????????? -## 9.1 µü´úÆ÷ģʽ +## 9.1 ???????? -**1. ģʽ¶¨Òå** +**1. ??????** -ÌṩһÖÖ˳Ðò·ÃÎÊÒ»¸ö¾ÛºÏ¶ÔÏóÖеĸ÷¸öÔªËØµÄ·½·¨£¬¶øÓÖ²»±©Â¶ÆäÄÚ²¿µÄ±íʾ¡£ +?????????????????????§Ö???????????????????????????????? -**2. ģʽÀàͼ** +**2. ?????** -¿Í»§ÀàÓµÓÐÒ»¸ö¾ÛºÏ¶ÔÏóºÍµü´úÆ÷¶ÔÏ󣬵ü´úÆ÷¶ÔÏóÊǾۺ϶ÔÏóÉú³ÉµÄ¡£Ö»ÐèÒªµü´úÆ÷¶¨ÒåºÃÒÆ¶¯µÄ²Ù×÷£¬¾Í¿ÉÒÔÈþۺ϶ÔÏóÄܹ»Ë³Ðò±éÀú¡£ +????????????????????????????????????????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/439deca7-fed0-4c89-87e5-7088d10f1fdb.jpg) -**3. ´úÂëʵÏÖ** +**3. ???????** ```java public class Aggregate { @@ -1195,7 +1195,7 @@ public class Client { } } ``` -ÔËÐнá¹û +???§ß?? ```html 0 1 @@ -1209,13 +1209,13 @@ public class Client { 9 ``` -## 9.2 Java ÄÚÖõĵü´úÆ÷ +## 9.2 Java ?????????? -**1. ʵÏÖ½Ó¿Ú** +**1. ?????** -Java ÖÐÒѾ­ÓÐÁË Iterator ½Ó¿Ú£¬ÔÚʹÓà Java ʵÏÖʱ£¬ÐèÒªÈþۺ϶ÔÏóʵÏÖ Iterable ½Ó¿Ú£¬¸Ã½Ó¿ÚÓÐÒ»¸ö iterator() ·½·¨»á·µ»ØÒ»¸ö Iterator ¶ÔÏó¡£Ê¹Óà Java ÄÚÖõĵü´úÆ÷ʵÏÖ£¬¿Í»§¶ÔÏó¿ÉÒÔʹÓà foreach Ñ­»·À´±éÀú¾ÛºÏ¶ÔÏóÖеÄÿ¸öÔªËØ¡£ +Java ????????? Iterator ????????? Java ??????????????????? Iterable ????????????? iterator() ??????????? Iterator ??????? Java ??????????????????????????? foreach ????????????????§Ö???????? -**2. ´úÂëʵÏÖ** +**2. ???????** ```java import java.util.Iterator; @@ -1271,25 +1271,25 @@ public class Client { } ``` -## 9.3 ×éºÏģʽ +## 9.3 ????? -**1. Éè¼ÆÔ­Ôò** +**1. ??????** -Ò»¸öÀàÓ¦¸ÃÖ»ÓÐÒ»¸öÒýÆð¸Ä±äµÄÔ­Òò¡£ +???????????????????????? -**2. ģʽ¶¨Òå** +**2. ??????** -ÔÊÐí½«¶ÔÏó×éºÏ³ÉÊ÷ÐνṹÀ´±íÏÖ¡°ÕûÌå / ²¿·Ö¡±²ã´Î½á¹¹¡£ +???????????????¦Í???????????? / ???????¦Í??? -×éºÏÄÜÈÿͻ§ÒÔÒ»Öµķ½Ê½´¦Àí¸ö±ð¶ÔÏóÒÔ¼°¶ÔÏó×éºÏ¡£ +?????????????????????????????????????? -**3. ģʽÀàͼ** +**3. ?????** -ÓÉÓÚ×éºÏ£¨Composite£©ÀàÓµÓÐÒ»¸ö×é¼þ£¨Component£©¶ÔÏó£¬Òò´Ë×éºÏ¶ÔÏóλÓÚÊ÷ÐνṹµÄÖм䣬Ëü»¹¿ÉÒÔ¼ÌÐø²Ù×÷Õâ¸ö×é¼þ¶ÔÏ󣬲¢ºöÂÔ×é¼þ¶ÔÏóµÄ¾ßÌåÀàÐÍ¡£ +????????Composite???????????????Component???????????????¦Ë?????¦Í????§Þ??????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/f99c019e-7e91-4c2e-b94d-b031c402dcb5.jpg) -**4. ´úÂëʵÏÖ** +**4. ???????** ```java public abstract class Component { @@ -1316,7 +1316,7 @@ public class Leaf extends Component { @Override public void addChild(Component component) { - throw new UnsupportedOperationException(); // ÎþÉü͸Ã÷ÐÔ»»È¡µ¥Ò»Ö°ÔðÔ­Ôò , ÕâÑù¾Í²»Óÿ¼ÂÇÊÇÒ¶×ӽڵ㻹ÊÇ×éºÏ½Úµã + throw new UnsupportedOperationException(); // ???????????????????? , ?????????????????????????? } @Override @@ -1378,7 +1378,7 @@ public class Client { } } ``` -ÔËÐнá¹û +???§ß?? ```html Composite:root @@ -1390,56 +1390,56 @@ Composite:root --left:3 ``` -# µÚ 10 Õ ״̬ģʽ +# ?? 10 ?? ???? -**1. ģʽ¶¨Òå** +**1. ??????** -ÔÊÐí¶ÔÏóÔÚÄÚ²¿×´Ì¬¸Ä±äʱ¸Ä±äËüµÄÐÐΪ£¬¶ÔÏó¿´ÆðÀ´ºÃÏñÐÞ¸ÄÁËËüµÄÀà¡£ +????????????????????????????????????????????????????? -״̬ģʽµÄÀàͼºÍ²ßÂÔģʽһÑù£¬²¢ÇÒ¶¼ÊÇÄܹ»¶¯Ì¬¸Ä±ä¶ÔÏóµÄÐÐΪ¡£µ«ÊÇ״̬ģʽÊÇͨ¹ý״̬¶ÔÏóµÄ×´Ì¬×ªÒÆÀ´¸Ä±ä¿Í»§¶ÔÏó×éºÏµÄ״̬¶ÔÏ󣬶ø²ßÂÔģʽÊÇͨ¹ý¿Í»§¶ÔÏó±¾ÉíµÄ¾ö²ßÀ´¸Ä±ä×éºÏµÄ²ßÂÔ¶ÔÏó¡£ÀýÈ磬״̬ģʽÏ£¬¿Í»§¶ÔÏóίÍÐ״̬¶ÔÏó½øÐÐÒ»¸ö´¦Àí²Ù×÷£¬ÄÇô״̬¶ÔÏóÓпÉÄÜ·¢Éú×´Ì¬×ªÒÆ£¬Ê¹µÃ¿Í»§¶ÔÏóÓµÓеÄ״̬¶ÔÏó·¢Éú¸Ä±ä¡£×´Ì¬¶ÔÏó×éºÏÁ˿ͻ§¶ÔÏó£¬×´Ì¬×ªÒÆÊÇ״̬¶ÔÏóͨ¹ý¸Ä±ä¿Í»§¶ÔÏóËù×éºÏµÄ״̬¶ÔÏóʵÏֵġ£ +???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????íà????????????????????????????????????????????????§á???????????????????????§Ö??????????????????????????????????????????????????????????????????????? -**2. ģʽÀàͼ** +**2. ?????** ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c28fd93a-0d55-4a19-810f-72652feee00d.jpg) -**3. ÎÊÌâÃèÊö** +**3. ????????** -ÌǹûÏúÊÛ»úÓжàÖÖ״̬£¬Ã¿ÖÖ״̬ÏÂÏúÊÛ»úÓв»Í¬µÄÐÐΪ£¬×´Ì¬¿ÉÒÔ·¢Éú×ªÒÆ£¬Ê¹µÃÏúÊÛ»úµÄÐÐΪҲ·¢Éú¸Ä±ä¡£ +?????????§Ø????????????????????§Ó??????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/f7d880c9-740a-4a16-ac6d-be502281b4b2.jpg) -**4. Ö±½Ó½â¾ö·½°¸** +**4. ?????????** -ÔÚÌǹû»úµÄÿ¸ö²Ù×÷º¯ÊýÀïÃæ£¬Åжϵ±Ç°µÄ״̬£¬¸ù¾Ý²»Í¬µÄ״̬½øÐв»Í¬µÄ´¦Àí£¬²¢ÇÒ·¢Éú²»Í¬µÄ×´Ì¬×ªÒÆ¡£ÕâÖÖ½â¾ö·½°¸°ÑËùÓеÄʵÏÖϸ½Ú¶¼·Åµ½¿Í»§À࣬ÕâÑùÔÚÐÂÔö״̬µÄʱºò¾ÍҪȥÐ޸Ŀͻ§ÀàµÄ´úÂë¡£ +???????????????????????—¨?§Ø??????????????????????§Ó????????????????????????????????????????§Ö??????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/62ebbb63-8fd7-4488-a866-76a9dc911662.png) -**5. ʹÓÃ״̬ģʽµÄ½â¾ö·½°¸** +**5. ???????????????** -״̬µÄ×ªÒÆ±»ÒƵ½×´Ì¬ÀàÀïÃæ£¬¿Í»§ÀàµÄÿ¸ö²Ù×÷Ö»ÐèҪίÍиø×´Ì¬À༴¿É£¬¶ø²»ÐèÒªÖªµÀµ±Ç°ÊÇʲô״̬ÒÔ¼°×´Ì¬Ê±ÈçºÎ½øÐÐ×ªÒÆµÄ¡£ +??????????????????—¨???????????????????§Ú???????????????????????????????????¦Í???????? -**6. ´úÂëʵÏÖ** +**6. ???????** ```java public interface State { /** - * ͶÈë25 ·ÖÇ® + * ???25 ??? */ void insertQuarter(); /** - * ÍË»Ø25 ·ÖÇ® + * ???25 ??? */ void ejectQuarter(); /** - * ת¶¯Çú±ú + * ??????? */ void turnCrank(); /** - * ·¢·ÅÌǹû + * ??????? */ void dispense(); } @@ -1667,7 +1667,7 @@ public class GumballMachineTestDrive { } } ``` -ÔËÐнá¹û +???§ß?? ```html You insert a quarter You turned... @@ -1696,34 +1696,34 @@ You turned, but there are no gumballs No gumball dispensed ``` -# µÚ 11 Õ ´úÀíģʽ // TODO +# ?? 11 ?? ?????? // TODO -# µÚ 12 Õ ¸´ºÏģʽ +# ?? 12 ?? ?????? ## 12.1 MVC -### 12.1.1 ´«Í³ MVC +### 12.1.1 ??? MVC -ÊÓͼʹÓÃ×éºÏģʽ£¬Ä£ÐÍʹÓÃÁ˹۲ìÕßģʽ£¬¿ØÖÆÆ÷ʹÓÃÁ˲ßÂÔģʽ¡£ +??????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/4f67611d-492f-4958-9fa0-4948010e345f.jpg) -### 12.1.2 Web ÖÐµÄ MVC +### 12.1.2 Web ?§Ö? MVC -ģʽ²»ÔÙʹÓù۲ìÕßģʽ¡£ +????????¨´???????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1dd56e61-2970-4d27-97c2-6e81cee86978.jpg) -# µÚ 13 Õ ÓëÉè¼ÆÄ£Ê½Ïà´¦ +# ?? 13 ?? ????????? -¶¨Ò壺ÔÚij **Çé¾³** Ï£¬Õë¶Ôij **ÎÊÌâ** µÄijÖÖ **½â¾ö·½°¸**¡£ +???‰Ø??? **??** ??????? **????** ????? **???????**?? -¹ý¶ÈʹÓÃÉè¼ÆÄ£Ê½¿ÉÄܵ¼Ö´úÂë±»¹ý¶È¹¤³Ì»¯£¬Ó¦¸Ã×ÜÊÇÓÃ×î¼òµ¥µÄ½â¾ö·½°¸Íê³É¹¤×÷£¬²¢ÔÚÕæÕýÐèҪģʽµÄµØ·½²ÅʹÓÃËü¡£ +????????????????????????????????????????????????????????????????????????????????????? -·´Ä£Ê½£º²»ºÃµÄ½â¾ö·½°¸À´½â¾öÒ»¸öÎÊÌâ¡£Ö÷Òª×÷ÓÃÊÇΪÁ˾¯¸æ²»ÒªÊ¹ÓÃÕâЩ½â¾ö·½°¸¡£ +???????????????????????????????????????????ÖÎ??????§»????????? -ģʽ·ÖÀࣺ +?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/524a237c-ffd7-426f-99c2-929a6bf4c847.jpg) -# µÚ 14 Õ ʣϵÄģʽ // TODO +# ?? 14 ?? ?????? // TODO diff --git a/notes/é‡�æž„.md b/notes/é‡�æž„.md index a7d15340..53a6b7b2 100644 --- a/notes/é‡�æž„.md +++ b/notes/é‡�æž„.md @@ -1,300 +1,300 @@ -* [µÚÒ»Õ µÚÒ»¸ö°¸Àý](#µÚÒ»ÕÂ-µÚÒ»¸ö°¸Àý) -* [µÚ¶þÕÂ ÖØ¹¹Ô­Ôò](#µÚ¶þÕÂ-ÖØ¹¹Ô­Ôò) -* [µÚÈýÕ ´úÂëµÄ»µÎ¶µÀ](#µÚÈýÕÂ-´úÂëµÄ»µÎ¶µÀ) - * [1. Duplicated Code£¨Öظ´´úÂ룩](#1-duplicated-codeÖØ¸´´úÂë) - * [2. Long Method£¨¹ý³¤º¯Êý£©](#2-long-method¹ý³¤º¯Êý) - * [3. Large Class£¨¹ý´óµÄÀࣩ](#3-large-class¹ý´óµÄÀà) - * [4. Long Parameter List£¨¹ý³¤µÄ²ÎÊýÁУ©](#4-long-parameter-list¹ý³¤µÄ²ÎÊýÁÐ) - * [5. Divergent Change£¨·¢É¢Ê½±ä»¯£©](#5-divergent-change·¢É¢Ê½±ä»¯) - * [6. Shotgun Surgery£¨É¢µ¯Ê½Ð޸ģ©](#6-shotgun-surgeryÉ¢µ¯Ê½ÐÞ¸Ä) - * [7. Feature Envy£¨ÒÀÁµÇé½á£©](#7-feature-envyÒÀÁµÇé½á) - * [8. Data Clumps£¨Êý¾ÝÄàÍÅ£©](#8-data-clumpsÊý¾ÝÄàÍÅ) - * [9. Primitive Obsession£¨»ù±¾ÀàÐÍÆ«Ö´£©](#9-primitive-obsession»ù±¾ÀàÐÍÆ«Ö´) - * [10. Switch Statements£¨switch ¾ªã¤ÏÖÉí£©](#10-switch-statementsswitch-¾ªã¤ÏÖÉí) - * [11. Parallel Inheritance Hierarchies£¨Æ½Ðм̳ÐÌåϵ£©](#11-parallel-inheritance-hierarchiesƽÐм̳ÐÌåϵ) - * [12. Lazy Class£¨ÈßÓàÀࣩ](#12-lazy-classÈßÓàÀà) - * [13. Speculative Generality£¨¿ä¿äÆä̸δÀ´ÐÔ£©](#13-speculative-generality¿ä¿äÆä̸δÀ´ÐÔ) - * [14. Temporary Field£¨ÁîÈËÃÔ»óµÄÔÝʱ×ֶΣ©](#14-temporary-fieldÁîÈËÃÔ»óµÄÔÝʱ×Ö¶Î) - * [15. Message Chains£¨¹ý¶ÈñîºÏµÄÏûÏ¢Á´£©](#15-message-chains¹ý¶ÈñîºÏµÄÏûÏ¢Á´) - * [16. Middle Man£¨ÖмäÈË£©](#16-middle-manÖмäÈË) - * [17. Inappropriate Intimacy£¨áòêǹØÏµ£©](#17-inappropriate-intimacyáòêǹØÏµ) - * [18. Alernative Classes with Different Interfaces£¨ÒìÇúͬ¹¤µÄÀࣩ](#18-alernative-classes-with-different-interfacesÒìÇúͬ¹¤µÄÀà) - * [19. Incomplete Library Class£¨²»ÍêÃÀµÄÀà¿â£©](#19-incomplete-library-class²»ÍêÃÀµÄÀà¿â) - * [20. Data Class£¨Ó×ÖɵÄÊý¾ÝÀࣩ](#20-data-classÓ×ÖɵÄÊý¾ÝÀà) - * [21. Refused Bequest£¨±»¾Ü¾øµÄÀ¡Ôù£©](#21-refused-bequest±»¾Ü¾øµÄÀ¡Ôù) - * [22. Comments£¨¹ý¶àµÄ×¢ÊÍ£©](#22-comments¹ý¶àµÄ×¢ÊÍ) -* [µÚËÄÕ ¹¹Öþ²âÊÔÌåϵ](#µÚËÄÕÂ-¹¹Öþ²âÊÔÌåϵ) -* [µÚÎåÕÂ ÖØ¹¹Áбí](#µÚÎåÕÂ-ÖØ¹¹Áбí) -* [µÚÁùÕÂ ÖØÐÂ×éÖ¯º¯Êý](#µÚÁùÕÂ-ÖØÐÂ×éÖ¯º¯Êý) - * [1. Extract Method£¨ÌáÁ¶º¯Êý£©](#1-extract-methodÌáÁ¶º¯Êý) - * [2. Inline Method£¨ÄÚÁªº¯Êý£©](#2-inline-methodÄÚÁªº¯Êý) - * [3. Inline Temp£¨ÄÚÁªÁÙʱ±äÁ¿£©](#3-inline-tempÄÚÁªÁÙʱ±äÁ¿) - * [4. Replace Temp with Query£¨ÒÔ²éѯȡ´úÁÙʱ±äÁ¿£©](#4-replace-temp-with-queryÒÔ²éѯȡ´úÁÙʱ±äÁ¿) - * [5. Introduce Explaining Variable£¨ÒýÆð½âÊͱäÁ¿£©](#5-introduce-explaining-variableÒýÆð½âÊͱäÁ¿) - * [6. Split Temporary Variable£¨·Ö½âÁÙʱ±äÁ¿£©](#6-split-temporary-variable·Ö½âÁÙʱ±äÁ¿) - * [7. Remove Assigments to Parameters£¨ÒƳý¶Ô²ÎÊýµÄ¸³Öµ£©](#7-remove-assigments-to-parametersÒÆ³ý¶Ô²ÎÊýµÄ¸³Öµ) - * [8. Replace Method with Method Object£¨ÒÔº¯Êý¶ÔÏóÈ¡´úº¯Êý£©](#8-replace-method-with-method-objectÒÔº¯Êý¶ÔÏóÈ¡´úº¯Êý) - * [9. Subsititute Algorithn£¨Ìæ»»Ëã·¨£©](#9-subsititute-algorithnÌæ»»Ëã·¨) -* [µÚÆßÕ ÔÚ¶ÔÏóÖ®¼ä°áÒÆÌØÐÔ](#µÚÆßÕÂ-ÔÚ¶ÔÏóÖ®¼ä°áÒÆÌØÐÔ) - * [1. Move Method£¨°áÒÆº¯Êý£©](#1-move-method°áÒÆº¯Êý) - * [2. Move Field£¨°áÒÆ×ֶΣ©](#2-move-field°áÒÆ×Ö¶Î) - * [3. Extract Class£¨ÌáÁ¶Àࣩ](#3-extract-classÌáÁ¶Àà) - * [4. Inline Class£¨½«ÀàÄÚÁª»¯£©](#4-inline-class½«ÀàÄÚÁª»¯) - * [5. Hide Delegate£¨Òþ²Ø¡°Î¯ÍйØÏµ¡±£©](#5-hide-delegateÒþ²Ø¡°Î¯ÍйØÏµ¡±) - * [6. Remove Middle Man£¨ÒƳýÖмäÈË£©](#6-remove-middle-manÒÆ³ýÖмäÈË) - * [7. Introduce Foreign Method£¨ÒýÈëÍâ¼Óº¯Êý£©](#7-introduce-foreign-methodÒýÈëÍâ¼Óº¯Êý) - * [8. Introduce Local Extension£¨ÒýÈë±¾µØÀ©Õ¹£©](#8-introduce-local-extensionÒýÈë±¾µØÀ©Õ¹) -* [µÚ°ËÕÂ ÖØÐÂ×éÖ¯Êý¾Ý](#µÚ°ËÕÂ-ÖØÐÂ×éÖ¯Êý¾Ý) - * [1. Self Encapsulate Field£¨×Ô·â×°×ֶΣ©](#1-self-encapsulate-field×Ô·â×°×Ö¶Î) - * [2. Replace Data Value with Object£¨ÒÔ¶ÔÏóÈ¡´úÊý¾ÝÖµ£©](#2-replace-data-value-with-objectÒÔ¶ÔÏóÈ¡´úÊý¾ÝÖµ) - * [3. Change Value to Reference£¨½«Öµ¶ÔÏó¸Ä³ÉÒýÓöÔÏó£©](#3-change-value-to-reference½«Öµ¶ÔÏó¸Ä³ÉÒýÓöÔÏó) - * [4. Change Reference to value£¨½«ÒýÓöÔÏó¸ÄΪֵ¶ÔÏó£©](#4-change-reference-to-value½«ÒýÓöÔÏó¸ÄΪֵ¶ÔÏó) - * [5. Replace Array with Object£¨ÒÔ¶ÔÏóÈ¡´úÊý×飩](#5-replace-array-with-objectÒÔ¶ÔÏóÈ¡´úÊý×é) - * [6. Duplicate Observed Data£¨¸³Öµ¡°±»¼àÊÓÊý¾Ý¡±£©](#6-duplicate-observed-data¸³Öµ¡°±»¼àÊÓÊý¾Ý¡±) - * [7. Change Unidirectional Association to Bidirectional£¨½«µ¥Ïò¹ØÁª¸ÄΪ˫Ïò¹ØÁª£©](#7-change-unidirectional-association-to-bidirectional½«µ¥Ïò¹ØÁª¸ÄΪ˫Ïò¹ØÁª) - * [8. Change Bidirectional Association to Unidirectional£¨½«Ë«Ïò¹ØÁª¸ÄΪµ¥Ïò¹ØÁª£©](#8-change-bidirectional-association-to-unidirectional½«Ë«Ïò¹ØÁª¸ÄΪµ¥Ïò¹ØÁª) - * [9. Replace Magic Number with Symbolic Constant£¨ÒÔ×ÖÃæ³£Á¿È¡´úħ·¨Êý£©](#9-replace-magic-number-with-symbolic-constantÒÔ×ÖÃæ³£Á¿È¡´úħ·¨Êý) - * [10. Encapsulate Field£¨·â×°×ֶΣ©](#10-encapsulate-field·â×°×Ö¶Î) - * [11. Encapsulate Collection£¨·â×°¼¯ºÏ£©](#11-encapsulate-collection·â×°¼¯ºÏ) - * [12. Replace Record with Data Class£¨ÒÔÊý¾ÝÀàÈ¡´ú¼Ç¼£©](#12-replace-record-with-data-classÒÔÊý¾ÝÀàÈ¡´ú¼Ç¼) - * [13. Replace Type Code with Class£¨ÒÔÀàÈ¡´úÀàÐÍÂ룩](#13-replace-type-code-with-classÒÔÀàÈ¡´úÀàÐÍÂë) - * [14. Replace Type Code with Subcalsses£¨ÒÔ×ÓÀàÈ¡´úÀàÐÍÂ룩](#14-replace-type-code-with-subcalssesÒÔ×ÓÀàÈ¡´úÀàÐÍÂë) - * [15. Replace Type Code with State/Strategy £¨ÒÔ State/Strategy È¡´úÀàÐÍÂ룩](#15-replace-type-code-with-statestrategy-ÒÔ-statestrategy-È¡´úÀàÐÍÂë) - * [16. Replace Subclass with Fields£¨ÒÔ×Ö¶ÎÈ¡´ú×ÓÀࣩ](#16-replace-subclass-with-fieldsÒÔ×Ö¶ÎÈ¡´ú×ÓÀà) -* [µÚ¾ÅÕ ¼ò»¯Ìõ¼þ±í´ïʽ](#µÚ¾ÅÕÂ-¼ò»¯Ìõ¼þ±í´ïʽ) - * [1. Decompose Conditional£¨·Ö½âÌõ¼þ±í´ïʽ£©](#1-decompose-conditional·Ö½âÌõ¼þ±í´ïʽ) - * [2. Consolidate Conditional Expression£¨ºÏ²¢Ìõ¼þ±í´ïʽ£©](#2-consolidate-conditional-expressionºÏ²¢Ìõ¼þ±í´ïʽ) - * [3. Consolidate Duplicate Conditional Fragments £¨ºÏ²¢Öظ´µÄÌõ¼þƬ¶Î£©](#3-consolidate-duplicate-conditional-fragments-ºÏ²¢Öظ´µÄÌõ¼þƬ¶Î) - * [4. Remove Control Flag£¨ÒƳý¿ØÖƱê¼Ç£©](#4-remove-control-flagÒÆ³ý¿ØÖƱê¼Ç) - * [5. Replace Nested Conditional with Guard Clauses £¨ÒÔÎÀÓï¾äÈ¡´úǶÌ×Ìõ¼þ±í´ïʽ£©](#5-replace-nested-conditional-with-guard-clauses-ÒÔÎÀÓï¾äÈ¡´úǶÌ×Ìõ¼þ±í´ïʽ) - * [6. Replace Conditional with Polymorphism £¨ÒÔ¶à̬ȡ´úÌõ¼þ±í´ïʽ£©](#6-replace-conditional-with-polymorphism-ÒÔ¶à̬ȡ´úÌõ¼þ±í´ïʽ) - * [7. Introduce Null Object£¨ÒýÈëNull¶ÔÏó£©](#7-introduce-null-objectÒýÈënull¶ÔÏó) - * [8. Introduce Assertion£¨ÒýÈë¶ÏÑÔ£©](#8-introduce-assertionÒýÈë¶ÏÑÔ) -* [µÚʮՠ¼ò»¯º¯Êýµ÷ÓÃ](#µÚÊ®ÕÂ-¼ò»¯º¯Êýµ÷ÓÃ) - * [1. Rename Method£¨º¯Êý¸ÄÃû£©](#1-rename-methodº¯Êý¸ÄÃû) - * [2. Add Parameter£¨Ìí¼Ó²ÎÊý£©](#2-add-parameterÌí¼Ó²ÎÊý) - * [3. Remove Parameter£¨ÒƳý²ÎÊý£©](#3-remove-parameterÒÆ³ý²ÎÊý) - * [4. Separate Query from Modifier£¨½«²éѯº¯ÊýºÍÐ޸ĺ¯Êý·ÖÀ룩](#4-separate-query-from-modifier½«²éѯº¯ÊýºÍÐ޸ĺ¯Êý·ÖÀë) - * [5. Parameterize Method£¨ÁÊýЯ´ø²ÎÊý£©](#5-parameterize-methodÁÊýЯ´ø²ÎÊý) - * [6. Replace Parameter with Explicit Methods£¨ÒÔÃ÷È·º¯ÊýÈ¡´ú²ÎÊý£©](#6-replace-parameter-with-explicit-methodsÒÔÃ÷È·º¯ÊýÈ¡´ú²ÎÊý) - * [7. Preserve Whole Object£¨±£³Ö¶ÔÏóÍêÕû£©](#7-preserve-whole-object±£³Ö¶ÔÏóÍêÕû) - * [8. Replace Parameter with Methods£¨ÒÔº¯ÊýÈ¡´ú²ÎÊý£©](#8-replace-parameter-with-methodsÒÔº¯ÊýÈ¡´ú²ÎÊý) - * [9. Introduce Parameter Object£¨ÒýÈë²ÎÊý¶ÔÏó£©](#9-introduce-parameter-objectÒýÈë²ÎÊý¶ÔÏó) - * [10. Remove Setting Method£¨ÒƳýÉèÖµº¯Êý£©](#10-remove-setting-methodÒÆ³ýÉèÖµº¯Êý) - * [11. Hide Method£¨Òþ²Øº¯Êý£©](#11-hide-methodÒþ²Øº¯Êý) - * [12. Replace Constructor with Factory Method £¨ÒÔ¹¤³§º¯ÊýÈ¡´ú¹¹Ô캯Êý£©](#12-replace-constructor-with-factory-method-ÒÔ¹¤³§º¯ÊýÈ¡´ú¹¹Ô캯Êý) - * [13. Encapsulate Downcast£¨·â×°ÏòÏÂתÐÍ£©](#13-encapsulate-downcast·â×°ÏòÏÂתÐÍ) - * [14. Replace Error Code with Exception £¨ÒÔÒ쳣ȡ´ú´íÎóÂ룩](#14-replace-error-code-with-exception-ÒÔÒ쳣ȡ´ú´íÎóÂë) - * [15. Replace Exception with Test£¨ÒÔ²âÊÔÈ¡´úÒì³££©](#15-replace-exception-with-testÒÔ²âÊÔÈ¡´úÒì³£) -* [µÚʮһÕ ´¦Àí¸ÅÀ¨¹ØÏµ](#µÚʮһÕÂ-´¦Àí¸ÅÀ¨¹ØÏµ) - * [1. Pull Up Field£¨×Ö¶ÎÉÏÒÆ£©](#1-pull-up-field×Ö¶ÎÉÏÒÆ) - * [2. Pull Up Method£¨º¯ÊýÉÏÒÆ£©](#2-pull-up-methodº¯ÊýÉÏÒÆ) - * [3. Pull Up Constructor Body£¨¹¹Ô캯Êý±¾ÌåÉÏÒÆ£©](#3-pull-up-constructor-body¹¹Ô캯Êý±¾ÌåÉÏÒÆ) - * [4. Push Down Method£¨º¯ÊýÏÂÒÆ£©](#4-push-down-methodº¯ÊýÏÂÒÆ) - * [5. Push Down Field£¨×Ö¶ÎÏÂÒÆ£©](#5-push-down-field×Ö¶ÎÏÂÒÆ) - * [6. Extract Subclass£¨ÌáÁ¶×ÓÀࣩ](#6-extract-subclassÌáÁ¶×ÓÀà) - * [7. Extract Superclass£¨ÌáÁ¶³¬Àࣩ](#7-extract-superclassÌáÁ¶³¬Àà) - * [8. Extract Interface£¨ÌáÁ¶½Ó¿Ú£©](#8-extract-interfaceÌáÁ¶½Ó¿Ú) - * [9. Collapse Hierarchy£¨ÕÛµþ¼Ì³ÐÌåϵ£©](#9-collapse-hierarchyÕÛµþ¼Ì³ÐÌåϵ) - * [10. Form Template Method£¨ËÜÔìÄ£°åº¯Êý£©](#10-form-template-methodËÜÔìÄ£°åº¯Êý) - * [11. Replace Inheritance with Delegation £¨ÒÔίÍÐÈ¡´ú¼Ì³Ð£©](#11-replace-inheritance-with-delegation-ÒÔίÍÐÈ¡´ú¼Ì³Ð) - * [12. Replace Delegation with Inheritance £¨ÒԼ̳ÐÈ¡´úίÍУ©](#12-replace-delegation-with-inheritance-ÒԼ̳ÐÈ¡´úίÍÐ) +* [????? ?????????](#?????-?????????) +* [????? ??????](#?????-??????) +* [?????? ??????¦Æ??](#??????-??????¦Æ??) + * [1. Duplicated Code?????????](#1-duplicated-code?????????) + * [2. Long Method????????????](#2-long-method????????????) + * [3. Large Class?????????](#3-large-class?????????) + * [4. Long Parameter List????????????§µ?](#4-long-parameter-list????????????§å?) + * [5. Divergent Change???????�£??](#5-divergent-change???????�£??) + * [6. Shotgun Surgery??????????](#6-shotgun-surgery??????????) + * [7. Feature Envy?????????](#7-feature-envy?????????) + * [8. Data Clumps???????????](#8-data-clumps???????????) + * [9. Primitive Obsession??????????????](#9-primitive-obsession??????????????) + * [10. Switch Statements??switch ???????](#10-switch-statements??switch-???????) + * [11. Parallel Inheritance Hierarchies????§Þ???????](#11-parallel-inheritance-hierarchies????§Þ???????) + * [12. Lazy Class????????](#12-lazy-class????????) + * [13. Speculative Generality????????¦Ä?????](#13-speculative-generality????????¦Ä?????) + * [14. Temporary Field???????????????¦²?](#14-temporary-field???????????????¦Ò?) + * [15. Message Chains?????????????????](#15-message-chains?????????????????) + * [16. Middle Man???§Þ????](#16-middle-man???§Þ????) + * [17. Inappropriate Intimacy??????????](#17-inappropriate-intimacy??????????) + * [18. Alernative Classes with Different Interfaces?????????????](#18-alernative-classes-with-different-interfaces?????????????) + * [19. Incomplete Library Class?????????????](#19-incomplete-library-class?????????????) + * [20. Data Class?????????????](#20-data-class?????????????) + * [21. Refused Bequest???????????????](#21-refused-bequest???????????????) + * [22. Comments???????????](#22-comments???????????) +* [?????? ???????????](#??????-???????????) +* [?????? ????§Ò?](#??????-????§Ò?) +* [?????? ???????????](#??????-???????????) + * [1. Extract Method????????????](#1-extract-method????????????) + * [2. Inline Method????????????](#2-inline-method????????????) + * [3. Inline Temp???????????????](#3-inline-temp???????????????) + * [4. Replace Temp with Query??????????????????](#4-replace-temp-with-query??????????????????) + * [5. Introduce Explaining Variable??????????????](#5-introduce-explaining-variable??????????????) + * [6. Split Temporary Variable??????????????](#6-split-temporary-variable??????????????) + * [7. Remove Assigments to Parameters????????????????](#7-remove-assigments-to-parameters????????????????) + * [8. Replace Method with Method Object????????????????????](#8-replace-method-with-method-object????????????????????) + * [9. Subsititute Algorithn???�I????](#9-subsititute-algorithn???�I????) +* [?????? ???????????????](#??????-???????????????) + * [1. Move Method???????????](#1-move-method???????????) + * [2. Move Field????????¦²?](#2-move-field????????¦Ò?) + * [3. Extract Class????????](#3-extract-class????????) + * [4. Inline Class??????????????](#4-inline-class??????????????) + * [5. Hide Delegate?????????§Û??????](#5-hide-delegate?????????§Û??????) + * [6. Remove Middle Man??????§Þ????](#6-remove-middle-man??????§Þ????) + * [7. Introduce Foreign Method??????????????](#7-introduce-foreign-method??????????????) + * [8. Introduce Local Extension?????????????](#8-introduce-local-extension?????????????) +* [????? ???????????](#?????-???????????) + * [1. Self Encapsulate Field????????¦²?](#1-self-encapsulate-field????????¦Ò?) + * [2. Replace Data Value with Object?????????????????](#2-replace-data-value-with-object?????????????????) + * [3. Change Value to Reference??????????????????](#3-change-value-to-reference??????????????????) + * [4. Change Reference to value??????????????????](#4-change-reference-to-value??????????????????) + * [5. Replace Array with Object?????????????ï‚](#5-replace-array-with-object?????????????ï‚) + * [6. Duplicate Observed Data????????????????????](#6-duplicate-observed-data????????????????????) + * [7. Change Unidirectional Association to Bidirectional??????????????????????](#7-change-unidirectional-association-to-bidirectional??????????????????????) + * [8. Change Bidirectional Association to Unidirectional??????????????????????](#8-change-bidirectional-association-to-unidirectional??????????????????????) + * [9. Replace Magic Number with Symbolic Constant???????Æü????????????](#9-replace-magic-number-with-symbolic-constant???????Æü????????????) + * [10. Encapsulate Field???????¦²?](#10-encapsulate-field???????¦Ò?) + * [11. Encapsulate Collection??????????](#11-encapsulate-collection??????????) + * [12. Replace Record with Data Class??????????????????](#12-replace-record-with-data-class??????????????????) + * [13. Replace Type Code with Class???????????????](#13-replace-type-code-with-class???????????????) + * [14. Replace Type Code with Subcalsses?????????????????](#14-replace-type-code-with-subcalsses?????????????????) + * [15. Replace Type Code with State/Strategy ???? State/Strategy ?????????](#15-replace-type-code-with-statestrategy-????-statestrategy-?????????) + * [16. Replace Subclass with Fields??????????????](#16-replace-subclass-with-fields??????????????) +* [????? ??????????](#?????-??????????) + * [1. Decompose Conditional???????????????](#1-decompose-conditional???????????????) + * [2. Consolidate Conditional Expression???????????????](#2-consolidate-conditional-expression???????????????) + * [3. Consolidate Duplicate Conditional Fragments ????????????????¦²?](#3-consolidate-duplicate-conditional-fragments-????????????????¦Ò?) + * [4. Remove Control Flag????????????](#4-remove-control-flag????????????) + * [5. Replace Nested Conditional with Guard Clauses ?????????????????????????](#5-replace-nested-conditional-with-guard-clauses-?????????????????????????) + * [6. Replace Conditional with Polymorphism ???????????????????](#6-replace-conditional-with-polymorphism-???????????????????) + * [7. Introduce Null Object??????Null????](#7-introduce-null-object??????null????) + * [8. Introduce Assertion??????????](#8-introduce-assertion??????????) +* [????? ?????????](#?????-?????????) + * [1. Rename Method????????????](#1-rename-method????????????) + * [2. Add Parameter??????????](#2-add-parameter??????????) + * [3. Remove Parameter???????????](#3-remove-parameter???????????) + * [4. Separate Query from Modifier???????????????????????](#4-separate-query-from-modifier???????????????????????) + * [5. Parameterize Method??????§Á????????](#5-parameterize-method??????§ñ????????) + * [6. Replace Parameter with Explicit Methods????????????????????](#6-replace-parameter-with-explicit-methods????????????????????) + * [7. Preserve Whole Object???????????????](#7-preserve-whole-object???????????????) + * [8. Replace Parameter with Methods????????????????](#8-replace-parameter-with-methods????????????????) + * [9. Introduce Parameter Object?????????????](#9-introduce-parameter-object?????????????) + * [10. Remove Setting Method??????????????](#10-remove-setting-method??????????????) + * [11. Hide Method???????????](#11-hide-method???????????) + * [12. Replace Constructor with Factory Method ??????????????????????](#12-replace-constructor-with-factory-method-??????????????????????) + * [13. Encapsulate Downcast?????????????](#13-encapsulate-downcast?????????????) + * [14. Replace Error Code with Exception ???????????????](#14-replace-error-code-with-exception-???????????????) + * [15. Replace Exception with Test??????????????](#15-replace-exception-with-test??????????????) +* [?????? ??????????](#??????-??????????) + * [1. Pull Up Field??????????](#1-pull-up-field??????????) + * [2. Pull Up Method???????????](#2-pull-up-method???????????) + * [3. Pull Up Constructor Body?????????????????](#3-pull-up-constructor-body?????????????????) + * [4. Push Down Method???????????](#4-push-down-method???????????) + * [5. Push Down Field??????????](#5-push-down-field??????????) + * [6. Extract Subclass??????????](#6-extract-subclass??????????) + * [7. Extract Superclass??????????](#7-extract-superclass??????????) + * [8. Extract Interface??????????](#8-extract-interface??????????) + * [9. Collapse Hierarchy?????????????](#9-collapse-hierarchy?????????????) + * [10. Form Template Method????????Žï????](#10-form-template-method????????Žï????) + * [11. Replace Inheritance with Delegation ????????????§µ?](#11-replace-inheritance-with-delegation-????????????§å?) + * [12. Replace Delegation with Inheritance ???????????§µ?](#12-replace-delegation-with-inheritance-???????????§å?) -# µÚÒ»Õ µÚÒ»¸ö°¸Àý +# ????? ????????? -Èç¹ûÄã·¢ÏÖ×Ô¼ºÐèҪΪ³ÌÐòÌí¼ÓÒ»¸öÌØÐÔ£¬¶ø´úÂë½á¹¹Ê¹ÄãÎÞ·¨ºÜ·½±ãµØ´ï³ÉÄ¿µÄ£¬ÄǾÍÏÈÖØ¹¹Õâ¸ö³ÌÐò¡£ +????????????????????????????????????????????????????????????????????? -ÔÚÖØ¹¹Ç°£¬ÐèÒªÏȹ¹½¨ºÃ¿É¿¿µÄ²âÊÔ»·¾³£¬È·±£°²È«µØÖع¹¡£ +??????????????????????????????????????????? -ÖØ¹¹ÊÇÒÔ΢СµÄ²½·¥Ð޸ijÌÐò£¬Èç¹û·¸Ï´íÎ󣬺ÜÈÝÒ×±ã¿ÉÒÔ·¢ÏÖËü¡£ +????????§³????????????????????????????????????? -**°¸Àý·ÖÎö** +**????????** -ӰƬ³ö×âµêÓ¦ÓóÌÐò£¬°üÀ¨Èý¸öÀࣺMovie¡¢Rental ºÍ Customer£¬Rental °üº¬×âÁÞµÄ Movie ÒÔ¼°ÌìÊý¡£ +?????????¨®????????????Movie??Rental ?? Customer??Rental ????????? Movie ????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a758c8b2-0ac7-438f-90c2-3923ffad6328.png) -×ʼµÄʵÏÖÊǰÑËùÓеļƷѴúÂë¶¼·ÅÔÚ Customer ÀàÖУ¬Ôڱ仯·¢Éúʱ£¬ÐèÒª¶ÔÕⲿ·Ö´úÂë½øÐиü¸Ä¡£±¾°¸ÀýÖпÉÄÜ·¢ÉúµÄ±ä»¯ÓУºÒ»ÖÖÀà±ðµÄ¼Æ·Ñ·½Ê½·¢Éú¸Ä±ä£»Ìí¼ÓеĵçÓ°Àà±ð¡£¿¼Âǵ½¼Æ·Ñ´úÂë¿ÉÄÜ´æÔÚÓÚ¶à´¦£¬Ò»µ©·¢Éú¸Ä±äʱ£¬¾ÍÐèÒª¶ÔËùÓмƷѴúÂë½øÐÐÐ޸ġ£ +??????????????§Ö?????????? Customer ???§µ???�£?????????????????????§Ú???????????§á????????�£?§µ??????????????????????????????????????????????????????????????????????????§Þ???????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/9e5e3cc6-3107-4051-b584-8ff077638fe6.png) -ÒÔÏÂÊǼ̳РMovie µÄ¶à̬·½°¸¡£µ«ÊÇÓÉÓÚÒ»²¿ Movie µÄÀà±ð»á¶¯Ì¬¸Ä±ä£¬Òò´ËÕâÖÖ·½°¸²»¿ÉÐС£ +???????? Movie ????????????????????? Movie ?????????????????????????§³? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/2a502516-5d34-4eef-8f39-916298a60035.png) -ÒýÈë Price À´·´Ó¦Àà±ðÐÅÏ¢£¬Í¨¹ý×éºÏµÄ·½Ê½ÔÚ Movie ÖмÓÈë Price ¶ÔÏó£¬ÕâÑùÿÖÖÀà±ðµÄ¼Æ·Ñ·½Ê½¶¼·â×°ÔÚ²»Í¬µÄ Price ×ÓÀàÖУ¬²¢ÇÒ Movie ¶ÔÏóÒ²¿ÉÒÔ¶¯Ì¬¸Ä±äÀà±ð¡£ÕâÖÖ·½Ê½¿ÉÒԺܺõØÊÊÓ¦ÉÏÊöÌáµ½µÄ±ä»¯¡£ +???? Price ???????????????????????? Movie ?§Þ??? Price ?????????????????????????????? Price ?????§µ????? Movie ?????????????????????????????????????????�£?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c02a83b8-a6b9-4d00-a509-6f0516beaf5e.png) -ÖØ¹¹ºóµÄʱÐòͼºÍÀàͼ£º +????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/95f4559c-3d2a-4176-b365-4fbc46c76cf1.png) ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/293b9326-02fc-4ad8-8c79-b4a7b5ba60d3.png) -# µÚ¶þÕÂ ÖØ¹¹Ô­Ôò +# ????? ?????? -ÖØ¹¹ÊǶÔÈí¼þÄÚ²¿½á¹¹µÄÒ»ÖÖµ÷Õû£¬Ä¿µÄÊÇÔÚ²»¸Ä±äÈí¼þ¿É¹Û²ìÐÐΪµÄǰÌáÏ£¬Ìá¸ßÆä¿ÉÀí½âÐÔ£¬½µµÍÆäÐ޸ijɱ¾¡£ +?????????????????????????????????????????????????????????????????????????????? -ÖØ¹¹µÄºÃ´¦£º¸Ä½øÈí¼þÉè¼Æ£»Ê¹Èí¼þ¸üÈÝÒ×Àí½â£»°ïÖúÕÒµ½ bug£»Ìá¸ß±à³ÌËÙ¶È¡£ +??????????????????????????????????????? bug??????????? -Èý´Î·¨Ôò£ºµÚÒ»´Î×öij¼þÊÂʱֻ¹ÜÈ¥×ö£»µÚ¶þ´Î×öÀàËÆÊÂÇéʱ¿ÉÒÔÈ¥×ö£»µÚÈý´ÎÔÙ×öÀàËÆµÄÊ£¬¾ÍÓ¦¸ÃÖØ¹¹¡£ +???¦Ç???????????????????????????????????????????????????????????????????????????? -¼ä½Ó²ãÓëÖØ¹¹£º¼ÆËã»ú¿ÆÑ§ÖеĺܶàÎÊÌâ¿ÉÒÔͨ¹ýÔö¼ÓÒ»¸ö¼ä½Ó²ãÀ´½â¾ö£¬¼ä½Ó²ã¾ßÓÐÒÔϼÛÖµ£ºÔÊÐíÂß¼­¹²Ïí£»·Ö¿ª½âÊÍÒâͼºÍʵÏÖ£»¸ôÀë±ä»¯£»·â×°Ìõ¼þÂß¼­¡£Öع¹¿ÉÒÔÀí½âΪÔÚÊʵ±µÄλÖòåÈë¼ä½Ó²ãÒÔ¼°ÔÚ²»ÐèÒªÊ±ÒÆ³ý¼ä½Ó²ã¡£ +????????????????????§Ö?????????????????????????????????????????????????????????????????????????????�£????????????????????????????????¦Ë?¨°??????????????????????? -Ð޸Ľӿڣº¿ÉÒÔ±£Áô¾É½Ó¿Ú£¬ÈþɽӿÚÈ¥µ÷ÓÃнӿڣ¬²¢ÇÒʹÓà Java ÌṩµÄ @deprecation ½«¾É½Ó¿Ú±ê¼ÇΪÆúÓᣳý·ÇÕæÓбØÒª£¬²»Òª·¢²¼½Ó¿Ú£¬²¢ÇÒ²»Òª¹ýÔç·¢²¼½Ó¿Ú¡£ +???????????????????????????????????????? Java ???? @deprecation ????????????¨¢????????§Ò????????????????????????¾ˆ?????? -µ±ÏÖÓдúÂë¹ýÓÚ»ìÂÒʱ£¬Ó¦µ±ÖØÐ´¶ø²»ÊÇÖØ¹¹¡£Ò»¸öÕÛÖеİ취ÊÇ£¬½«´úÂë·â×°³ÉÒ»¸ö¸ö×é¼þ£¬È»ºó¶Ô¸÷¸ö×é¼þ×öÖØÐ´»òÕßÖØ¹¹µÄ¾ö¶¨¡£ +?????§Õ?????????????????§Õ?????????????????§Ö???????????????????????????????????????§Õ?????????????? -Èí¼þ¿ª·¢ÎÞ·¨Ô¤ÏÈÉè¼Æ£¬ÒòΪ¿ª·¢¹ý³ÌÓкܶà±ä»¯·¢Éú£¬ÔÚ×ʼ²»¿ÉÄܶ¼°ÑËùÓÐÇé¿ö¿¼ÂǽøÈ¥¡£Öع¹¿ÉÒÔ¼ò»¯Éè¼Æ£¬Öع¹ÔÚÒ»¸ö¼òµ¥µÄÉè¼ÆÉϽøÐÐÐÞÐ޸ĸ쬵±±ä»¯·¢Éúʱ£¬ÒÔÒ»ÖÖÁé»îµÄ·½Ê½È¥Ó¦¶Ô±ä»¯£¬½ø¶ø´øÀ´¸üºÃµÄÉè¼Æ¡£ +?????????????????????????????§Ü??�£????????????????????????????????????????????????????????????????????????????�£??????????????????????�£??????????????????? -ΪÁËÈí´úÂë¸üÈÝÒ×Àí½â£¬Öع¹¿ÉÄܻᵼÖÂÐÔÄܼõµÍ¡£ÔÚ±àд´úÂëʱ£¬²»ÓöÔÐÔÄܹý¶à¹Ø×¢£¬Ö»ÓÐÔÚ×îºóÐÔÄÜÓÅ»¯½×¶ÎÔÙ¿¼ÂÇÐÔÄÜÎÊÌâ¡£Ó¦µ±Ö»¹Ø×¢¹Ø¼ü´úÂëµÄÐÔÄÜ£¬ÒòΪֻÓÐһС²¿·ÖµÄ´úÂëÊǹؼü´úÂë¡£ +?????????????????????????????????????§Õ?????????????????????????????????????????????????????????????????????????????????§³???????????????? -# µÚÈýÕ ´úÂëµÄ»µÎ¶µÀ +# ?????? ??????¦Æ?? -## 1. Duplicated Code£¨Öظ´´úÂ룩 +## 1. Duplicated Code????????? -ͬһ¸öÀàµÄÁ½¸öº¯ÊýÓÐÏàͬ±í´ïʽ£¬ÔòÓà Extract Method ÌáÈ¡³öÖØ¸´´úÂ룻 +?????????????????????????????? Extract Method ???????????? -Á½¸ö»¥ÎªÐֵܵÄ×ÓÀຬÓÐÏàͬµÄ±í´ïʽ£¬ÏÈʹÓà Extract Method£¬È»ºó°ÑÌáÈ¡³öÀ´µÄº¯Êý Pull Up Method ÍÆÈ볬Àà¡£ +???????????????????????????????? Extract Method?????????????????? Pull Up Method ?????? -Èç¹ûÖ»ÊDz¿·ÖÏàͬ£¬Óà Extract Method ·ÖÀë³öÏàËÆ²¿·ÖºÍ²îÒ첿·Ö£¬È»ºóʹÓà Form Template Method ÕâÖÖÄ£°å·½·¨Éè¼ÆÄ£Ê½¡£ +???????????????? Extract Method ????????????????????????? Form Template Method ??????Ùã????????? -Èç¹ûÁ½¸öºÁ²»Ïà¹ØµÄÀà³öÏÖÖØ¸´´úÂ룬ÔòʹÓà Extract Class ·½·¨½«Öظ´´úÂëÌáÈ¡µ½Ò»¸ö¶ÀÁ¢ÀàÖС£ +???????????????????????????????? Extract Class ????????????????????????????§³? -## 2. Long Method£¨¹ý³¤º¯Êý£© +## 2. Long Method???????????? -¼ä½Ó²ãµÄ¼ÛÖµ£º½âÊÍÄÜÁ¦¡¢¹²ÏíÄÜÁ¦¡¢Ñ¡ÔñÄÜÁ¦£» +?????????????????????????????????????? -·Ö½âº¯ÊýµÄÔ­Ôò£ºµ±ÐèÒªÓÃ×¢ÊÍÀ´ËµÃ÷Ò»¶Î´úÂëʱ£¬¾ÍÐèÒª°ÑÕⲿ·Ö´úÂëдÈëÒ»¸ö¶ÀÁ¢µÄº¯ÊýÖС£ +??????????????????????????¦Ä????????????????????§Õ???????????????§³? -Extract Method »á°ÑºÜ¶à²ÎÊýºÍÁÙʱ±äÁ¿¶¼µ±×ö²ÎÊý£¬¿ÉÒÔÓà Replace Temp with Query Ïû³ýÁÙʱ±äÁ¿£¬Introduce Parameter Object ºÍ Preserve Whole Object ¿ÉÒÔ½«¹ý³¤µÄ²ÎÊýÁбäµÃ¸ü¼ò½à¡£ +Extract Method ??????????????????????????????????? Replace Temp with Query ?????????????Introduce Parameter Object ?? Preserve Whole Object ???????????????§Ò?????? -Ìõ¼þºÍÑ­»·ÍùÍùÒ²ÐèÒªÌáÈ¡µ½Ðµĺ¯ÊýÖС£ +?????????????????????????????§³? -## 3. Large Class£¨¹ý´óµÄÀࣩ +## 3. Large Class????????? -¹ý´óµÄÀà×öÁ˹ý¶àÊÂÇ飬ÐèҪʹÓà Extract Class »ò Extract Subclass¡£ +?????????????????ï…?????? Extract Class ?? Extract Subclass?? -ÏÈÈ·¶¨¿Í»§¶ËÈçºÎʹÓÃËüÃÇ£¬È»ºóÔËÓà Extract Interface ΪÿһÖÖʹÓ÷½Ê½ÌáÈ¡³öÒ»¸ö½Ó¿Ú¡£ +???????????????????????????? Extract Interface ???????¡Â?????????????? -## 4. Long Parameter List£¨¹ý³¤µÄ²ÎÊýÁУ© +## 4. Long Parameter List????????????§µ? -## 5. Divergent Change£¨·¢É¢Ê½±ä»¯£© +## 5. Divergent Change???????�£?? -Ò»¸öÀàÊܵ½¶àÖֱ仯µÄÓ°Ï죻 +????????????�£????? -Õë¶ÔijÖÖÔ­ÒòµÄ±ä»¯£¬Ê¹Óà Extract Class ½«ËüÌáÁ¶µ½Ò»¸öÀàÖС£ +??????????�£????? Extract Class ????????????????§³? -## 6. Shotgun Surgery£¨É¢µ¯Ê½Ð޸ģ© +## 6. Shotgun Surgery?????????? -Ò»¸ö±ä»¯ÒýÆð¶à¸öÀàÐ޸ģ» +????�£???????????? -ʹÓà Move Method ºÍ Move Field °ÑËùÓÐÐèÒªÐ޸ĵشúÂë·Åµ½Í¬Ò»¸öÀàÖС£ +??? Move Method ?? Move Field ?????????????????????????§³? -## 7. Feature Envy£¨ÒÀÁµÇé½á£© +## 7. Feature Envy????????? -Ò»¸öº¯Êý¶Ôij¸öÀàµÄÐËȤ¸ßÓÚ¶Ô×Ô¼ºËù´¦ÀàµÄÐËȤ£¬Í¨³£Êǹý¶à·ÃÎÊÆäËüÀàµÄÊý¾Ý¡£ +????????????????????????????????????????????????????????????? -ʹÓà Move Method ½«ËüÒÆµ½¸ÃÈ¥µÄµØ·½£¬Èç¹û¶Ô¶à¸öÀà¶¼ÓÐ Feature Envy£¬ÏÈÓà Extract Method ÌáÈ¡³ö¶à¸öº¯Êý¡£ +??? Move Method ??????????????????????????? Feature Envy?????? Extract Method ?????????????? -## 8. Data Clumps£¨Êý¾ÝÄàÍÅ£© +## 8. Data Clumps??????????? -ÓÐЩÊý¾Ý¾­³£Ò»Æð³öÏÖ£¬±ÈÈçÁ½¸öÀà¾ßÓÐÏàͬµÄ×ֶΡ¢Ðí¶àº¯ÊýÓÐÏàͬµÄ²ÎÊý¡£Ê¹Óà Extract Class ½«ËüÃÇ·ÅÔÚÒ»Æð¡£ +??§»??????????????????????????????????¦±????????????????????? Extract Class ???????????? -## 9. Primitive Obsession£¨»ù±¾ÀàÐÍÆ«Ö´£© +## 9. Primitive Obsession?????????????? -ʹÓÃÀàÍùÍù±ÈʹÓûù±¾ÀàÐ͸üºÃ£¬Ê¹Óà Replace Data Value with Object ½«Êý¾ÝÖµÌæ»»Îª¶ÔÏó¡£ +???????????????????????????? Replace Data Value with Object ????????�I????? -## 10. Switch Statements£¨switch ¾ªã¤ÏÖÉí£© +## 10. Switch Statements??switch ??????? -## 11. Parallel Inheritance Hierarchies£¨Æ½Ðм̳ÐÌåϵ£© +## 11. Parallel Inheritance Hierarchies????§Þ??????? -ÿµ±ÎªÄ³¸öÀàÔö¼ÓÒ»¸ö×ÓÀ࣬±ØÐëҲΪÁíÒ»¸öÀàÏàÓ¦Ôö¼ÓÒ»¸ö×ÓÀà¡£ +??????????????????????????????????????????????? -ÕâÖÖ½á¹û»á´øÀ´Ò»Ð©Öظ´ÐÔ£¬Ïû³ýÖØ¸´ÐÔµÄÒ»°ã²ßÂÔ£ºÈÃÒ»¸ö¼Ì³ÐÌåϵµÄʵÀýÒýÓÃÁíÒ»¸ö¼Ì³ÐÌåϵµÄʵÀý¡£ +????????????§»????????????????????????????????????????????????????????????? -## 12. Lazy Class£¨ÈßÓàÀࣩ +## 12. Lazy Class???????? -Èç¹ûÒ»¸öÀàûÓÐ×ö×ã¹»¶àµÄ¹¤×÷£¬¾ÍÓ¦¸ÃÏûʧ¡£ +????????????????????????????????? -## 13. Speculative Generality£¨¿ä¿äÆä̸δÀ´ÐÔ£© +## 13. Speculative Generality????????¦Ä????? -ÓÐЩÄÚÈÝÊÇÓÃÀ´´¦ÀíδÀ´¿ÉÄÜ·¢ÉúµÄ±ä»¯£¬µ«ÊÇÍùÍù»áÔì³ÉϵͳÄÑÒÔÀí½âºÍά»¤£¬²¢ÇÒÔ¤²âδÀ´¿ÉÄÜ·¢ÉúµÄ¸Ä±äºÜ¿ÉÄܺÍ×ʼµÄÉèÏëÏà·´¡£Òò´Ë£¬Èç¹û²»ÊDZØÒª£¬¾Í²»ÒªÕâô×ö¡£ +??§»??????????????¦Ä???????????�£?????????????????????????????????????¦Ä????????????????????????????????????????????????????????? -## 14. Temporary Field£¨ÁîÈËÃÔ»óµÄÔÝʱ×ֶΣ© +## 14. Temporary Field???????????????¦²? -ij¸ö×ֶνöΪijÖÖÌØ¶¨Çé¿ö¶øÉ裬ÕâÑùµÄ´úÂë²»Ò×Àí½â£¬ÒòΪͨ³£ÈÏΪ¶ÔÏóÔÚËùÓÐʱºò¶¼ÐèÒªËüµÄËùÓÐ×ֶΡ£ +?????¦Í??????????????Ñk?????????????????????????????????????????????????¦±? -°ÑÕâÖÖ×ֶκÍÌØ¶¨Çé¿öµÄ´¦Àí²Ù×÷ʹÓà Extract Class ÌáÁ¶µ½Ò»¸ö¶ÀÁ¢ÀàÖС£ +????????¦Ê?????????????????? Extract Class ????????????????§³? -## 15. Message Chains£¨¹ý¶ÈñîºÏµÄÏûÏ¢Á´£© +## 15. Message Chains????????????????? -Ò»¸ö¶ÔÏóÇëÇóÁíÒ»¸ö¶ÔÏó£¬È»ºóÔÙÏòºóÕßÇëÇóÁíÒ»¸ö¶ÔÏó£¬È»ºó...£¬Õâ¾ÍÊÇÏûÏ¢Á´¡£²ÉÓÃÕâÖÖ·½Ê½£¬Òâζ×ſͻ§´úÂ뽫Óë¶ÔÏó¼äµÄ¹ØÏµ½ôÃÜñîºÏ¡£ +??????????????????????????????????????????????...????????????????????????????¦Æ????????????????????????? -¸ÄÓú¯ÊýÁ´£¬Óú¯ÊýίÍÐÁíÒ»¸ö¶ÔÏóÀ´´¦Àí¡£ +???¨²????????¨²????????????????????? -## 16. Middle Man£¨ÖмäÈË£© +## 16. Middle Man???§Þ???? -ÖмäÈ˸ºÔð´¦ÀíίÍиøËüµÄ²Ù×÷£¬Èç¹ûÒ»¸öÀàÖÐÓйý¶àµÄº¯Êý¶¼Î¯ÍиøÆäËüÀ࣬ÄǾÍÊǹý¶ÈÔËÓÃίÍУ¬Ó¦µ± Remove Middle Man£¬Ö±½ÓÓ븺ÔðµÄ¶ÔÏó´ò½»µÀ¡£ +?§Þ??????????§Ú?????????????????????§Û???????????§Ú?????????????????????§µ???? Remove Middle Man????????????????? -## 17. Inappropriate Intimacy£¨áòêǹØÏµ£© +## 17. Inappropriate Intimacy?????????? -Á½¸öÀà¶àÓÚÇ×ÃÜ£¬»¨·ÑÌ«¶àʱ¼äȥ̽ÌÖ±Ë´ËµÄ private ³É·Ö¡£ +??????????????????????????????? private ???? -## 18. Alernative Classes with Different Interfaces£¨ÒìÇúͬ¹¤µÄÀࣩ +## 18. Alernative Classes with Different Interfaces????????????? -## 19. Incomplete Library Class£¨²»ÍêÃÀµÄÀà¿â£© +## 19. Incomplete Library Class????????????? -Àà¿âµÄÉè¼ÆÕß²»¿ÉÄÜÉè¼Æ³öÍêÃÀµÄÀà¿â£¬µ±ÎÒÃÇÐèÒª¶ÔÀà¿â½øÐÐһЩÐÞ¸Äʱ£¬¿ÉÒÔʹÓÃÒÔÏÂÁ½ÖÖ·½·¨£ºÈç¹ûÖ»ÊÇÐÞ¸ÄÒ»Á½¸öº¯Êý£¬Ê¹Óà Introduce Foreign Method£»Èç¹ûÒªÌí¼ÓÒ»´ó¶Ñ¶îÍâÐÐΪ£¬Ê¹Óà Introduce Local Extension¡£ +?????????????????????????????????????????????§»????????????????????????????????????????????????? Introduce Foreign Method???????????????????????? Introduce Local Extension?? -## 20. Data Class£¨Ó×ÖɵÄÊý¾ÝÀࣩ +## 20. Data Class????????????? -ËüÖ»ÓµÓÐһЩÊý¾Ý×ֶΡ£ +???????§»??????¦±? -ÕÒ³ö×Ö¶ÎʹÓõĵط½£¬È»ºó°ÑÏàÓ¦µÄ²Ù×÷ÒÆµ½ Data Class ÖС£ +????????????????????????????? Data Class ?§³? -## 21. Refused Bequest£¨±»¾Ü¾øµÄÀ¡Ôù£© +## 21. Refused Bequest??????????????? -×ÓÀà¼Ì³Ð³¬ÀàµÄËùÓк¯ÊýºÍÊý¾Ý£¬µ«ÊÇËüÖ»ÏëÒªÒ»²¿·Ö¡£ +?????§Ô???????§Ü?????????????????????????? -Ϊ×ÓÀàн¨Ò»¸öÐÖµÜÀ࣬²»ÐèÒªµÄº¯Êý»òÊý¾ÝʹÓà Push Down Method ºÍ Push Down Field ÏÂÍÆ¸øÄǸöÐֵܡ£ +??????????????????????????????????? Push Down Method ?? Push Down Field ???????????? -## 22. Comments£¨¹ý¶àµÄ×¢ÊÍ£© +## 22. Comments??????????? -ʹÓà Extract Method ÌáÁ¶³öÐèҪעÊ͵IJ¿·Ö£¬È»ºóÓú¯ÊýÃûÀ´½âÊͺ¯ÊýµÄÐÐΪ¡£ +??? Extract Method ?????????????????????¨²????????????????????? -# µÚËÄÕ ¹¹Öþ²âÊÔÌåϵ +# ?????? ??????????? -Java ¿ÉÒÔʹÓà Junit ½øÐе¥Ôª²âÊÔ¡£ +Java ??????? Junit ???§Ö??????? -µ¥Ôª²âÊԵĶÔÏóÊÇÀàµÄ·½·¨£¬¶ø¹¦ÄܲâÒÔ¿Í»§µÄ½Ç¶È±£Ö¤Èí¼þÕý³£ÔËÐС£ +????????????????????????????????????????????????§³? -Ó¦µ±¼¯ÖвâÊÔ¿ÉÄܳö´íµÄ±ß½çÌõ¼þ¡£ +??????§Ó?????????????????? -# µÚÎåÕÂ ÖØ¹¹Áбí +# ?????? ????§Ò? -С²½Ç°½ø£¬Æµ·±²âÊÔ¡£ +§³??????????????? -# µÚÁùÕÂ ÖØÐÂ×éÖ¯º¯Êý +# ?????? ??????????? -## 1. Extract Method£¨ÌáÁ¶º¯Êý£© +## 1. Extract Method???????????? -½«Õâ¶Î´úÂë·Å½øÒ»¸ö¶ÀÁ¢º¯ÊýÖУ¬²¢Èú¯ÊýÃû³Æ½âÊ͸ú¯ÊýµÄÓÃ;¡£ +????¦Ä?????????????????§µ????¨²??????????¨²?????????? -## 2. Inline Method£¨ÄÚÁªº¯Êý£© +## 2. Inline Method???????????? -Ò»¸öº¯ÊýµÄ±¾ÌåÓëÃû³ÆÍ¬ÑùÇå³þÒ×¶®¡£ +????????????????????????????? -ÔÚº¯Êýµ÷Óõã²åÈ뺯Êý±¾Ì壬ȻºóÒÆ³ý¸Ãº¯Êý¡£ +??????????????????ÈÉ???????¨²????? -## 3. Inline Temp£¨ÄÚÁªÁÙʱ±äÁ¿£© +## 3. Inline Temp??????????????? -Ò»¸öÁÙʱ±äÁ¿£¬Ö»±»¼òµ¥±í´ïʽ¸³ÖµÒ»´Î£¬¶øËü·Á°­ÁËÆäËüÖØ¹¹ÊÖ·¨¡£ +?????????????????????????¦²??????????????????????? -½«ËùÓжԸñäÁ¿µÄÒýÓÃÌæ»»Îª¶ÔËü¸³ÖµµÄÄǸö±í´ïʽ×ÔÉí¡£ +?????§Ø????????????�I????????????????????? ```java double basePrice = anOrder.basePrice(); @@ -305,9 +305,9 @@ return basePrice > 1000; return anOrder.basePrice() > 1000; ``` -## 4. Replace Temp with Query£¨ÒÔ²éѯȡ´úÁÙʱ±äÁ¿£© +## 4. Replace Temp with Query?????????????????? -ÒÔÁÙʱ±äÁ¿±£´æÄ³Ò»±í´ïʽµÄÔËËã½á¹û£¬½«Õâ¸ö±í´ïʽÌáÁ¶µ½Ò»¸ö¶ÀÁ¢º¯ÊýÖУ¬½«ËùÓжÔÁÙʱ±äÁ¿µÄÒýÓõãÌæ»»Îª¶Ôк¯ÊýµÄµ÷Óá£Replace Temp with Query ÍùÍùÊÇ Extract Method ֮ǰ±Ø²»¿ÉÉÙµÄÒ»¸ö²½Ö裬ÒòΪ¾Ö²¿±äÁ¿»áʹ´úÂëÄÑÒÔÌáÁ¶¡£ +????????????????????????????????????????????????????????§µ??????§Ø????????????????�I????????????¨¢?Replace Temp with Query ?????? Extract Method ????????????????Ñk??????????????????????????? ```java double basePrice = quantity * itemPrice; @@ -329,9 +329,9 @@ double basePrice(){ } ``` -## 5. Introduce Explaining Variable£¨ÒýÆð½âÊͱäÁ¿£© +## 5. Introduce Explaining Variable?????????????? -½«¸´ÔÓ±í´ïʽ£¨»òÆäÖÐÒ»²¿·Ö£©µÄ½á¹û·Å½øÒ»¸öÁÙʱ±äÁ¿£¬ÒԴ˱äÁ¿Ãû³ÆÀ´½âÊͱí´ïʽÓÃ;¡£ +?????????????????????????????????????????????????????????????????? ```java if((platform.toUpperCase().indexOf("MAC") > -1) && @@ -351,15 +351,15 @@ if(isMacOS && isIEBrower && wasInitialized() && wasResized) { } ``` -## 6. Split Temporary Variable£¨·Ö½âÁÙʱ±äÁ¿£© +## 6. Split Temporary Variable?????????????? -ij¸öÁÙʱ±äÁ¿±»¸³Öµ³¬¹ýÒ»´Î£¬Ëü¼È²»ÊÇÑ­»·±äÁ¿£¬Ò²²»ÊÇÓÃÓÚÊÕ¼¯¼ÆËã½á¹û¡£ +?????????????????????¦²????????????????????????????????????? -Õë¶Ôÿ´Î¸³Öµ£¬´´ÔìÒ»¸ö¶ÀÁ¢¡¢¶ÔÓ¦µÄÁÙʱ±äÁ¿£¬Ã¿¸öÁÙʱ±äÁ¿Ö»³Ðµ£Ò»¸öÔðÈΡ£ +?????¦È???????????????????????????????????????????§Ö???????¦±? -## 7. Remove Assigments to Parameters£¨ÒƳý¶Ô²ÎÊýµÄ¸³Öµ£© +## 7. Remove Assigments to Parameters???????????????? -ÒÔÒ»¸öÁÙʱ±äÁ¿È¡´ú¶Ô¸Ã²ÎÊýµÄ¸³Öµ¡£ +?????????????????¨°????????? ```java int discount (int inputVal, int quentity, int yearToDate){ @@ -372,39 +372,39 @@ int discount (int inputVal, int quentity, int yearToDate){ if (inputVal > 50) result -= 2; ``` -## 8. Replace Method with Method Object£¨ÒÔº¯Êý¶ÔÏóÈ¡´úº¯Êý£© +## 8. Replace Method with Method Object???????????????????? -µ±¶ÔÒ»¸ö´óÐͺ¯Êý²ÉÓà Extract Method ʱ£¬ÓÉÓÚ°üº¬Á˾ֲ¿±äÁ¿Ê¹µÃºÜÄѽøÐиòÙ×÷¡£ +?????????????????? Extract Method ????????????????????¨²?????§Ú¨°????? -½«Õâ¸öº¯Êý·Å½øÒ»¸öµ¥¶À¶ÔÏóÖУ¬Èç´ËÒ»À´¾Ö²¿±äÁ¿¾Í³ÉÁ˶ÔÏóÄÚµÄ×ֶΡ£È»ºó¿ÉÒÔÔÚͬһ¸ö¶ÔÏóÖн«Õâ¸ö´óÐͺ¯Êý·Ö½âΪ¶à¸öСÐͺ¯Êý¡£ +????????????????????????§µ???????????????????????????¦±??????????????????§ß??????????????????§³??????? -## 9. Subsititute Algorithn£¨Ìæ»»Ëã·¨£© +## 9. Subsititute Algorithn???�I???? -# µÚÆßÕ ÔÚ¶ÔÏóÖ®¼ä°áÒÆÌØÐÔ +# ?????? ??????????????? -## 1. Move Method£¨°áÒÆº¯Êý£© +## 1. Move Method??????????? -ÀàÖеÄij¸öº¯ÊýÓëÁíÒ»¸öÀà½øÐиü¶à½»Á÷£ºµ÷ÓúóÕß»òÕß±»ºóÕßµ÷Óᣠ+???§Ö???????????????????§Ú??????????¨²?????????????¨¢? -½«Õâ¸öº¯Êý°áÒÆµ½ÁíÒ»¸öÀàÖС£ +??????????????????????§³? -## 2. Move Field£¨°áÒÆ×ֶΣ© +## 2. Move Field????????¦²? -ÀàÖеÄij¸ö×ֶα»ÁíÒ»¸öÀà¸ü¶àµØÓõ½£¬ÕâÀïµÄÓõ½ÊÇÖ¸µ÷ÓÃȡֵÉèÖµº¯Êý£¬Ó¦µ±°Ñ¸Ã×Ö¶ÎÒÆµ½ÁíÒ»¸öÀàÖС£ +???§Ö??????¦Á???????????????????????????????????????????????????????????????§³? -## 3. Extract Class£¨ÌáÁ¶Àࣩ +## 3. Extract Class???????? -ij¸öÀà×öÁËÓ¦µ±ÓÉÁ½¸öÀà×öµÄÊ¡£ +??????????????????????????? -Ó¦µ±½¨Á¢Ò»¸öÐÂÀ࣬½«Ïà¹ØµÄ×ֶκͺ¯Êý´Ó¾ÉÀà°áÒÆµ½ÐÂÀà¡£ +??????????????????????¦Ê????????????????? -## 4. Inline Class£¨½«ÀàÄÚÁª»¯£© +## 4. Inline Class?????????????? -Óë Extract Class Ïà·´¡£ +?? Extract Class ???? -## 5. Hide Delegate£¨Òþ²Ø¡°Î¯ÍйØÏµ¡±£© +## 5. Hide Delegate?????????§Û?????? -½¨Á¢ËùÐèµÄº¯Êý£¬Òþ²ØÎ¯ÍйØÏµ¡£ +????????????????????§Û???? ```java class Person{ @@ -424,13 +424,13 @@ class Department{ } ``` -Èç¹û¿Í»§Ï£ÍûÖªµÀijÈ˵ľ­ÀíÊÇË­£¬±ØÐë»ñµÃ Department ¶ÔÏó£¬ÕâÑù¾Í¶Ô¿Í»§½Ò¶ÁË Department µÄ¹¤×÷Ô­Àí¡£ +?????????????????????????????? Department ?????????????????? Department ???????? ```java Person manager = john.getDepartment().getManager(); ``` -ͨ¹ýΪ Peron ½¨Á¢Ò»¸öº¯ÊýÀ´Òþ²ØÕâÖÖίÍйØÏµ¡£ +???? Peron ???????????????????????§Û???? ```java public Person getManager(){ @@ -438,61 +438,61 @@ public Person getManager(){ } ``` -## 6. Remove Middle Man£¨ÒƳýÖмäÈË£© +## 6. Remove Middle Man??????§Þ???? -Óë Hide Delegate Ïà·´£¬±¾·½·¨ÐèÒªÒÆ³ýίÍк¯Êý£¬Èÿͻ§Ö±½Óµ÷ÓÃίÍÐÀà¡£ +?? Hide Delegate ??????????????????§Ü???????????????????? -Hide Delegate ÓкܴóºÃ´¦£¬µ«ÊÇËüµÄ´ú¼ÛÊÇ£ºÃ¿µ±¿Í»§ÒªÊ¹ÓÃÊÜÍÐÀàµÄÐÂÌØÐÔʱ£¬¾Í±ØÐëÔÚ·þÎñÆ÷¶ËÌí¼ÓÒ»¸ö¼òµ¥µÄίÍк¯Êý¡£Ëæ×ÅÊÜίÍеÄÌØÐÔÔ½À´Ô½¶à£¬·þÎñÆ÷ÀàÍêÈ«±ä³ÉÁËÒ»¸ö¡°ÖмäÈË¡±¡£ +Hide Delegate ?§Ü???????????????????????????????????????????????????????????????????????§Ü?????????????§Ö?????????????????????????????????§Þ?????? -## 7. Introduce Foreign Method£¨ÒýÈëÍâ¼Óº¯Êý£© +## 7. Introduce Foreign Method?????????????? -ÐèҪΪÌṩ·þÎñµÄÀàÌí¼ÓÒ»¸öº¯Êý£¬µ«ÊÇÎÞ·¨ÐÞ¸ÄÕâ¸öÀà¡£ +???????????????????????????????????????? -¿ÉÒÔÔÚ¿Í»§ÀàÖн¨Á¢Ò»¸öº¯Êý£¬²¢ÒÔµÚÒ»²ÎÊýÐÎʽ´«ÈëÒ»¸ö·þÎñÀàµÄʵÀý£¬Èÿͻ§Àà×éºÏ·þÎñÆ÷ʵÀý¡£ +???????????§ß??????????????????????????????????????????????????????????????? -## 8. Introduce Local Extension£¨ÒýÈë±¾µØÀ©Õ¹£© +## 8. Introduce Local Extension????????????? -ºÍ Introduce Foreign Method Ä¿µÄÒ»Ñù£¬µ«ÊÇ Introduce Local Extension ͨ¹ý½¨Á¢ÐµÄÀàÀ´ÊµÏÖ¡£ÓÐÁ½ÖÖ·½Ê½£º×ÓÀà»òÕß°ü×°À࣬×ÓÀà¾ÍÊÇͨ¹ý¼Ì³ÐʵÏÖ£¬°ü×°Àà¾ÍÊÇͨ¹ý×éºÏʵÏÖ¡£ +?? Introduce Foreign Method ???????????? Introduce Local Extension ?????????????????????????????????????????????????????????????????????????? -# µÚ°ËÕÂ ÖØÐÂ×éÖ¯Êý¾Ý +# ????? ??????????? -## 1. Self Encapsulate Field£¨×Ô·â×°×ֶΣ© +## 1. Self Encapsulate Field????????¦²? -Ϊ×ֶν¨Á¢È¡Öµ/ÉèÖµº¯Êý£¬²¢ÓÃÕâЩº¯ÊýÀ´·ÃÎÊ×ֶΡ£Ö»Óе±×ÓÀàÏë·ÃÎʳ¬ÀàµÄÒ»¸ö×ֶΣ¬ÓÖÏëÔÚ×ÓÀàÖн«¶ÔÕâ¸ö×ֶηÃÎʸÄΪһ¸ö¼ÆËãºóµÄÖµ£¬²ÅʹÓÃÕâÖÖ·½Ê½£¬·ñÔòÖ±½Ó·ÃÎÊ×ֶεķ½Ê½¼ò½àÃ÷ÁË¡£ +???¦Í?????/???????????????§»????????????¦±???§Ö???????????????????¦²????????????§ß????????¦Ç??????????????????????????????????????????¦Å??????????? -## 2. Replace Data Value with Object£¨ÒÔ¶ÔÏóÈ¡´úÊý¾ÝÖµ£© +## 2. Replace Data Value with Object????????????????? -ÔÚ¿ª·¢³õÆÚ£¬ÍùÍù»áÓüòµ¥µÄÊý¾ÝÏî±íʾ¼òµ¥µÄÇé¿ö£¬µ«ÊÇËæ×Å¿ª·¢µÄ½øÐУ¬Ò»Ð©¼òµ¥Êý¾ÝÏî»á¾ßÓÐÒ»Ð©ÌØÊâÐÐΪ¡£±ÈÈçÒ»¿ªÊ¼»á°Ñµç»°ºÅÂë´æ³É×Ö·û´®£¬µ«ÊÇËæºó·¢Ïֵ绰ºÅÂëÐèÒª¡°¸ñʽ»¯¡±¡¢¡°³éÈ¡ÇøºÅ¡±Ö®ÀàµÄÌØÊâÐÐΪ¡£ +?????????????????¨¹?????????????????????????????????§µ??§»?????????????§»????????????????????´Â??????????????????????´Â????????????????????????????????????????? -## 3. Change Value to Reference£¨½«Öµ¶ÔÏó¸Ä³ÉÒýÓöÔÏó£© +## 3. Change Value to Reference?????????????????? -½«±Ë´ËÏàµÈµÄʵÀýÌæ»»ÎªÍ¬Ò»¸ö¶ÔÏó¡£Õâ¾ÍÒªÓÃÒ»¸ö¹¤³§À´´´½¨ÕâÖÖΨһ¶ÔÏ󣬹¤³§ÀàÖÐÐèÒª±£ÁôÒ»·ÝÒѾ­´´½¨¶ÔÏóµÄÁÐ±í£¬µ±Òª´´½¨Ò»¸ö¶ÔÏóʱ£¬ÏȲéÕÒÕâ·ÝÁбíÖÐÊÇ·ñÒѾ­´æÔڸöÔÏó£¬Èç¹û´æÔÚ£¬Ôò·µ»ØÁбíÖеÄÕâ¸ö¶ÔÏó£»·ñÔò£¬Ð½¨Ò»¸ö¶ÔÏó£¬Ìí¼Óµ½ÁбíÖУ¬²¢·µ»Ø¸Ã¶ÔÏó¡£ +?????????????�I????????????????????????????????¦·???????????????????????????????????§Ò???????????????????????????§Ò?????????????????????????????§Ò??§Ö??????????????????????????§Ò??§µ??????????? -## 4. Change Reference to value£¨½«ÒýÓöÔÏó¸ÄΪֵ¶ÔÏó£© +## 4. Change Reference to value?????????????????? -ÒÔ Change Value to Reference Ïà·´¡£Öµ¶ÔÏóÓиö·Ç³£ÖØÒªµÄÌØÐÔ£ºËüÊDz»¿É±äµÄ£¬²»¿É±ä±íʾÈç¹ûÒª¸Ä±äÕâ¸ö¶ÔÏ󣬱ØÐëÓÃÒ»¸öеĶÔÏóÀ´Ìæ»»¾É¶ÔÏ󣬶ø²»ÊÇÐ޸ľɶÔÏó¡£ +?? Change Value to Reference ??????????§Ú??????????????????????????????????????????????????????????????�I????????????????? -ÐèҪΪֵ¶ÔÏóʵÏÖ equals() ºÍ hashCode() ·½·¨ +???????????? equals() ?? hashCode() ???? -## 5. Replace Array with Object£¨ÒÔ¶ÔÏóÈ¡´úÊý×飩 +## 5. Replace Array with Object?????????????ï‚ -ÓÐÒ»¸öÊý×飬ÆäÖеÄÔªËØ¸÷×Ô´ú±í²»Í¬µÄ¶«Î÷¡£ +????????ï…???§Ö?????????????????? -ÒÔ¶ÔÏóÌæ»»Êý×飬¶ÔÓÚÊý×éÖеÄÿ¸öÔªËØ£¬ÒÔÒ»¸ö×Ö¶ÎÀ´±íʾ£¬ÕâÑù·½±ã²Ù×÷£¬Ò²¸üÈÝÒ×Àí½â¡£ +??????�I???ï…?????????§Ö?????????????????????????????????????????????? -## 6. Duplicate Observed Data£¨¸³Öµ¡°±»¼àÊÓÊý¾Ý¡±£© +## 6. Duplicate Observed Data???????????????????? -һЩÁìÓòÊý¾ÝÖÃÉíÓÚ GUI ¿Ø¼þÖУ¬¶øÁìÓòº¯ÊýÐèÒª·ÃÎÊÕâЩÊý¾Ý¡£ +?§»?????????????? GUI ????§µ??????????????????§»????? -½«¸ÃÊý¾Ý¸³Öµµ½Ò»¸öÁìÓò¶ÔÏóÖУ¬½¨Á¢Ò»¸ö Oberver ģʽ£¬ÓÃÒÔͬ²½ÁìÓò¶ÔÏóºÍ GUI ¶ÔÏóÄÚµÄÖØ¸´Êý¾Ý¡£ +???????????????????????§µ???????? Oberver ??????????????????? GUI ??????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/e024bd7e-fb4e-4239-9451-9a6227f50b00.jpg) -## 7. Change Unidirectional Association to Bidirectional£¨½«µ¥Ïò¹ØÁª¸ÄΪ˫Ïò¹ØÁª£© +## 7. Change Unidirectional Association to Bidirectional?????????????????????? -µ±Á½¸öÀà¶¼ÐèÒª¶Ô·½µÄÌØÐÔʱ£¬¿ÉÒÔʹÓÃË«Ïò¹ØÁª¡£ +?????????????????????????????????????? -ÓÐÁ½¸öÀ࣬·Ö±ðΪ¶©µ¥ Order ºÍ¿Í»§ Customer£¬Order ÒýÓÃÁË Customer£¬Customer Ò²ÐèÒªÒýÓà Order À´²é¿´ÆäËùÓж©µ¥ÏêÇé¡£ +???????????????? Order ???? Customer??Order ?????? Customer??Customer ???????? Order ?????????§Ø??????î• ```java class Order{ @@ -517,59 +517,59 @@ class Curstomer{ } ``` -×¢Òâµ½£¬ÕâÀïÈà Curstomer ÀàÀ´¿ØÖƹØÁª¹ØÏµ¡£ÓÐÒÔÏÂÔ­ÔòÀ´¾ö¶¨ÄĸöÀàÀ´¿ØÖƹØÁª¹ØÏµ£ºÈç¹ûij¸ö¶ÔÏóÊÇ×é³ÉÁíÒ»¸ö¶ÔÏóµÄ²¿¼þ£¬ÄÇôÓɺóÕ߸ºÔð¿ØÖƹØÁª¹ØÏµ£»Èç¹ûÊÇÒ»¶Ô¶à¹ØÏµ£¬ÔòÓɵ¥Ò»ÒýÓÃÄÇÒ»·½À´¿ØÖƹØÁª¹ØÏµ¡£ +??????????? Curstomer ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -## 8. Change Bidirectional Association to Unidirectional£¨½«Ë«Ïò¹ØÁª¸ÄΪµ¥Ïò¹ØÁª£© +## 8. Change Bidirectional Association to Unidirectional?????????????????????? -ºÍ Change Unidirectional Association to Bidirectiona Ϊ·´²Ù×÷¡£ +?? Change Unidirectional Association to Bidirectiona ????????? -Ë«Ïò¹ØÁªÎ¬»¤³É±¾¸ß£¬²¢ÇÒÒ²²»Ò×ÓÚÀí½â¡£´óÁ¿µÄË«ÏòÁ¬½ÓºÜÈÝÒ×Ôì³É¡°½©Ê¬¶ÔÏó¡±£ºÄ³¸ö¶ÔÏó±¾ÉíÒѾ­ËÀÍöÁË£¬È´±£ÁôÔÚϵͳÖУ¬ÒòΪËüµÄÒýÓû¹Ã»ÓÐÈ«²¿ÍêÈ«Çå³ý¡£ +?????????????????????????????????????????????????¨À??????????????????????????????????????§µ??????????????????????????? -## 9. Replace Magic Number with Symbolic Constant£¨ÒÔ×ÖÃæ³£Á¿È¡´úħ·¨Êý£© +## 9. Replace Magic Number with Symbolic Constant???????Æü???????????? -´´½¨Ò»¸ö³£Á¿£¬¸ù¾ÝÆäÒâÒåΪËüÃüÃû£¬²¢½«×ÖÃæ³£Á¿»»Î»Õâ¸ö³£Á¿¡£ +???????????????????????????????????????Æü????¦Ë????????? -## 10. Encapsulate Field£¨·â×°×ֶΣ© +## 10. Encapsulate Field???????¦²? -public ×Ö¶ÎÓ¦µ±¸ÄΪ private£¬²¢ÌṩÏàÓ¦µÄ·ÃÎʺ¯Êý¡£ +public ????????? private??????????????????? -## 11. Encapsulate Collection£¨·â×°¼¯ºÏ£© +## 11. Encapsulate Collection?????????? -º¯Êý·µ»Ø¼¯ºÏµÄÒ»¸öÖ»¶Á¸±±¾£¬²¢ÔÚÕâ¸öÀàÖÐÌṩÌí¼Ó/ÒÆ³ý¼¯ºÏÔªËØµÄº¯Êý¡£Èç¹ûº¯Êý·µ»Ø¼¯ºÏ×ÔÉí£¬»áÈÃÓû§µÃÒÔÐ޸ļ¯ºÏÄÚÈݶø¼¯ºÏÓµÓÐÕßÈ´Ò»ÎÞËùÖª¡£ +????????????????????????????????????????/?????????????????????????????????????????????????????????????????????????? -## 12. Replace Record with Data Class£¨ÒÔÊý¾ÝÀàÈ¡´ú¼Ç¼£© +## 12. Replace Record with Data Class?????????????????? -## 13. Replace Type Code with Class£¨ÒÔÀàÈ¡´úÀàÐÍÂ룩 +## 13. Replace Type Code with Class??????????????? -ÀàÖÐÓÐÒ»¸öÊýÖµÀàÐÍÂ룬µ«Ëü²¢²»Ó°ÏìÀàµÄÐÐΪ£¬¾ÍÓÃÒ»¸öÐÂÀàÌæ»»¸ÃÊýÖµÀàÐÍÂë¡£Èç¹ûÀàÐÍÂë³öÏÖÔÚ switch Óï¾äÖУ¬ÐèҪʹÓà Replace Conditional with Polymorphism È¥µô switch£¬Ê×ÏȱØÐëÔËÓà Replace Type Code with Subcalss »ò Replace Type Code with State/Strategy È¥µôÀàÐÍÂë¡£ +?????????????????????????????????????????????????�I????????????????????????? switch ????§µ??????? Replace Conditional with Polymorphism ??? switch????????????? Replace Type Code with Subcalss ?? Replace Type Code with State/Strategy ????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/27c2e0b3-8f95-453d-bedc-6398a8566ce9.jpg) -## 14. Replace Type Code with Subcalsses£¨ÒÔ×ÓÀàÈ¡´úÀàÐÍÂ룩 +## 14. Replace Type Code with Subcalsses????????????????? -ÓÐÒ»¸ö²»¿É±äµÄÀàÐÍÂ룬Ëü»áÓ°ÏìÀàµÄÐÐΪ£¬ÒÔ×ÓÀàÈ¡´úÕâ¸öÀàÐÍÂë¡£ +?????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/c41d3977-e0e7-4ee4-93e1-d84f1ae3e20e.jpg) -## 15. Replace Type Code with State/Strategy £¨ÒÔ State/Strategy È¡´úÀàÐÍÂ룩 +## 15. Replace Type Code with State/Strategy ???? State/Strategy ????????? -ÓÐÒ»¸ö¿É±äµÄÀàÐÍÂ룬Ëü»áÓ°ÏìÀàµÄÐÐΪ£¬ÒÔ״̬¶ÔÏóÈ¡´úÀàÐÍÂë¡£ +??????????????????????????????????????????????? -ºÍ Replace Type Code with Subcalsses µÄÇø±ðÊÇ Replace Type Code with State/Strategy µÄÀàÐÍÂëÊǶ¯Ì¬¿É±äµÄ£¬Ç°Õßͨ¹ý¼Ì³ÐµÄ·½Ê½À´ÊµÏÖ£¬ºóÕßͨ¹ý×éºÏµÄ·½Ê½À´ÊµÏÖ¡£ÒòΪÀàÐÍÂë¿É±ä£¬Èç¹ûͨ¹ý¼Ì³ÐµÄ·½Ê½£¬Ò»µ©Ò»¸ö¶ÔÏóµÄÀàÐÍÂë¸Ä±ä£¬ÄÇô¾ÍÒª¸Ä±äÓÃеĶÔÏóÀ´È¡´ú¾É¶ÔÏ󣬶ø¿Í»§¶ËÄÑÒԸıäеĶÔÏó¡£µ«ÊÇͨ¹ý×éºÏµÄ·½Ê½£¬¸Ä±äÒýÓõÄ״̬ÀàÊǺÜÈÝÒ׵ġ£ +?? Replace Type Code with Subcalsses ???????? Replace Type Code with State/Strategy ?????????????????????????§Ö???????????????????????????????????????????????§Ö???????????????????????????????????????????????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/81fd1d6f-a3b2-4160-9a0a-1f7cb50ba440.jpg) -## 16. Replace Subclass with Fields£¨ÒÔ×Ö¶ÎÈ¡´ú×ÓÀࣩ +## 16. Replace Subclass with Fields?????????????? -¸÷¸ö×ÓÀàµÄΨһ²î±ðÖ»ÔÚ¡°·µ»Ø³£Á¿Êý¾Ý¡±µÄº¯ÊýÉÏ¡£ +?????????¦·???????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/f2e0cee9-ecdc-4a96-853f-d9f6a1ad6ad1.jpg) -# µÚ¾ÅÕ ¼ò»¯Ìõ¼þ±í´ïʽ +# ????? ?????????? -## 1. Decompose Conditional£¨·Ö½âÌõ¼þ±í´ïʽ£© +## 1. Decompose Conditional??????????????? -¶ÔÓÚÒ»¸ö¸´ÔÓµÄÌõ¼þÓï¾ä£¬¿ÉÒÔ´Ó if¡¢then¡¢else Èý¸ö¶ÎÂäÖзֱðÌáÁ¶³ö¶ÀÁ¢º¯Êý¡£ +???????????????????????? if??then??else ?????????§Ù?????????????????? ```java if(data.befor(SUMMER_START) || data.after(SUMMER_END)) @@ -583,11 +583,11 @@ if(notSummer(date)) else charge = summerCharge(quantity); ``` -## 2. Consolidate Conditional Expression£¨ºÏ²¢Ìõ¼þ±í´ïʽ£© +## 2. Consolidate Conditional Expression??????????????? -ÓÐһϵÁÐÌõ¼þ²âÊÔ£¬¶¼µÃµ½Ïàͬ½á¹û¡£ +???????????????????????????? -½«ÕâЩ²âÊԺϲ¢ÎªÒ»¸öÌõ¼þ±í´ïʽ£¬²¢½«Õâ¸öÌõ¼þ±í´ïʽÌáÁ¶³ÉΪһ¸ö¶ÀÁ¢º¯Êý¡£ +????§»??????????????????????????????????????????????????????? ```java double disabilityAmount(){ @@ -604,11 +604,11 @@ double disabilityAmount(){ } ``` -## 3. Consolidate Duplicate Conditional Fragments £¨ºÏ²¢Öظ´µÄÌõ¼þƬ¶Î£© +## 3. Consolidate Duplicate Conditional Fragments ????????????????¦²? -ÔÚÌõ¼þ±í´ïʽµÄÿ¸ö·ÖÖ§ÉÏÓÐ×ÅÏàͬµÄÒ»¶Î´úÂë¡£ +???????????????????????????????¦Ä??? -½«Õâ¶ÎÖØ¸´´úÂë°áÒÆµ½Ìõ¼þ±í´ïʽ֮Íâ¡£ +??????????????????????????? ```java if (isSpecialDeal()){ @@ -629,17 +629,17 @@ if (isSpecialDeal()) { send(); ``` -## 4. Remove Control Flag£¨ÒƳý¿ØÖƱê¼Ç£© +## 4. Remove Control Flag???????????? -ÔÚһϵÁв¼¶û±í´ïʽÖУ¬Ä³¸ö±äÁ¿´øÓС°¿ØÖƱê¼Ç¡±µÄ×÷Óᣠ+?????§Ó????????§µ???????????§³?????????????¨¢? -Óà breakÓï ¾ä»ò return Óï¾äÀ´È¡´ú¿ØÖƱê¼Ç¡£ +?? break?? ??? return ??????????????? -## 5. Replace Nested Conditional with Guard Clauses £¨ÒÔÎÀÓï¾äÈ¡´úǶÌ×Ìõ¼þ±í´ïʽ£© +## 5. Replace Nested Conditional with Guard Clauses ????????????????????????? -Èç¹ûij¸öÌõ¼þ¼«Æäº±¼û£¬¾ÍÓ¦¸Ãµ¥¶À¼ì²é¸ÃÌõ¼þ£¬²¢ÔÚ¸ÃÌõ¼þÎªÕæÊ±Á¢¿Ì´Óº¯ÊýÖзµ»Ø£¬ÕâÑùµÄµ¥¶À¼ì²é³£³£±»³ÆÎª¡°ÎÀÓï¾ä¡±£¨guard clauses£©¡£ +?????????????�‹????????????????????????????????????????????§Ù???????????????ø@????????????????guard clauses???? -Ìõ¼þ±í´ïʽͨ³£ÓÐÁ½ÖÖ±íÏÖÐÎʽ¡£µÚÒ»ÖÖÐÎʽÊÇ£ºËùÓзÖÖ§¶¼ÊôÓÚÕý³£ÐÐΪ¡£µÚ¶þÖÖÐÎʽÔòÊÇ£ºÌõ¼þ±í´ïʽÌṩµÄ´ð°¸ÖÐÖ»ÓÐÒ»ÖÖÊÇÕý³£ÐÐΪ£¬ÆäËû¶¼ÊDz»³£¼ûµÄÇé¿ö£¬¿ÉÒÔʹÓÃÎÀÓï¾ä±íÏÖËùÓÐÌØÊâÇé¿ö¡£ +???????????????????????????????????????§Ù?????????????????????????????????????????????????????????????????????????????????????????????????????????????? ```java double getPayAmount() { @@ -665,9 +665,9 @@ double getPayAmount() { }; ``` -## 6. Replace Conditional with Polymorphism £¨ÒÔ¶à̬ȡ´úÌõ¼þ±í´ïʽ£© +## 6. Replace Conditional with Polymorphism ??????????????????? -½«Õâ¸öÌõ¼þ±í´ïʽµÄÿ¸ö·ÖÖ§·Å½øÒ»¸ö×ÓÀàÄڵĸ²Ð´º¯ÊýÖУ¬È»ºó½«Ô­Ê¼º¯ÊýÉùÃ÷Ϊ³éÏóº¯Êý¡£ÐèÒªÏÈʹÓà Replace Type Code with Subclass »ò Replace Type Code with State/Strategy À´½¨Á¢¼Ì³Ð½á¹û¡£ +???????????????????????????????????§Õ?????§µ??????????????????????????????? Replace Type Code with Subclass ?? Replace Type Code with State/Strategy ????????§ß???? ```java double getSpeed() { @@ -685,18 +685,18 @@ double getSpeed() { ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/1c8432c8-2552-457f-b117-1da36c697221.jpg) -## 7. Introduce Null Object£¨ÒýÈëNull¶ÔÏó£© +## 7. Introduce Null Object??????Null???? -½« null ÖµÌæ»»Îª null ¶ÔÏó¡£ÕâÑù×öµÄºÃ´¦ÔÚÓÚ£¬²»ÐèҪѯÎʶÔÏóÊÇ·ñΪ¿Õ£¬Ö±½Óµ÷ÓþÍÐС£ +?? null ??�I? null ?????????????????????????????????????????????§³? ```java if (customer == null) plan = BillingPlan.basic(); else plan = customer.getPlan(); ``` -## 8. Introduce Assertion£¨ÒýÈë¶ÏÑÔ£© +## 8. Introduce Assertion?????????? -ÒÔ¶ÏÑÔÃ÷È·±íÏÖijÖÖ¼ÙÉè¡£¶ÏÑÔÖ»ÄÜÓÃÓÚ¿ª·¢¹ý³ÌÖУ¬²úÆ·´úÂëÖв»»áÓжÏÑÔ¡£ +?????????????????ÒÂ???????????????????§µ?????????§Ó????§Ø???? ```java double getExpenseLimit() { @@ -712,25 +712,25 @@ double getExpenseLimit() { } ``` -# µÚʮՠ¼ò»¯º¯Êýµ÷Óà +# ????? ????????? -## 1. Rename Method£¨º¯Êý¸ÄÃû£© +## 1. Rename Method???????????? -ʹº¯ÊýÃûÄܽâÊͺ¯ÊýµÄÓÃ;¡£ +?????????????????????? -## 2. Add Parameter£¨Ìí¼Ó²ÎÊý£© +## 2. Add Parameter?????????? -ʹº¯Êý²»ÐèҪͨ¹ýµ÷ÓûñµÃij¸öÐÅÏ¢¡£ +??????????????????????????? -## 3. Remove Parameter£¨ÒƳý²ÎÊý£© +## 3. Remove Parameter??????????? -Óë Add Parameter Ïà·´£¬¸ÄÓõ÷Óõķ½Ê½À´»ñµÃij¸öÐÅÏ¢¡£ +?? Add Parameter ??????????????????????????? -## 4. Separate Query from Modifier£¨½«²éѯº¯ÊýºÍÐ޸ĺ¯Êý·ÖÀ룩 +## 4. Separate Query from Modifier??????????????????????? -ij¸öº¯Êý¼´·µ»Ø¶ÔÏó״ֵ̬£¬ÓÖÐ޸ĶÔÏó״̬¡£ +????????????????????????????????? -Ó¦µ±½¨Á¢Á½¸ö²»Í¬µÄº¯Êý£¬ÆäÖÐÒ»¸ö¸ºÔð²éѯ£¬ÁíÒ»¸ö¸ºÔðÐ޸ġ£ÈκÎÓзµ»ØÖµµÄº¯Êý£¬¶¼²»Ó¦¸ÃÓп´µÃµ½µÄ¸±×÷Óᣠ+??????????????????????????????????????????????????¦Ê??§Ù???????????????????§á??????????¨¢? ```java getTotalOutstandingAndSetReadyForSummaries(); @@ -741,11 +741,11 @@ getTotalOutstanding(); setReadyForSummaries(); ``` -## 5. Parameterize Method£¨ÁÊýЯ´ø²ÎÊý£© +## 5. Parameterize Method??????§Á???????? -Èô¸Éº¯Êý×öÁËÀàËÆµÄ¹¤×÷£¬µ«ÔÚº¯Êý±¾ÌåÖÐÈ´°üº¬Á˲»Í¬µÄÖµ¡£ +???????????????????????????????????????????????? -½¨Á¢µ¥Ò»º¯Êý£¬ÒÔ²ÎÊý±í´ïÄÇЩ²»Í¬µÄÖµ¡£ +???????????????????????§»???????? ```java fivePercentRaise(); @@ -755,11 +755,11 @@ tenPercentRaise(); raise(percentage); ``` -## 6. Replace Parameter with Explicit Methods£¨ÒÔÃ÷È·º¯ÊýÈ¡´ú²ÎÊý£© +## 6. Replace Parameter with Explicit Methods???????????????????? -ÓÐÒ»¸öº¯Êý£¬Íêȫȡ¾öÓÚ²ÎÊýÖµ¶ø²ÉÈ¡²»Í¬ÐÐΪ¡£ +???????????????????????????????????? -Õë¶Ô¸Ã²ÎÊýµÄÿһ¸ö¿ÉÄÜÖµ£¬½¨Á¢Ò»¸ö¶ÀÁ¢º¯Êý¡£ +???¨°????????????????????????????????? ```java void setValue(String name, int value){ @@ -784,11 +784,11 @@ void setWidth(int arg){ } ``` -## 7. Preserve Whole Object£¨±£³Ö¶ÔÏóÍêÕû£© +## 7. Preserve Whole Object??????????????? -´Óij¸ö¶ÔÏóÖÐÈ¡³öÈô¸ÉÖµ£¬½«ËüÃÇ×÷Ϊijһ´Îº¯Êýµ÷ÓÃʱµÄ²ÎÊý¡£ +?????????????????????????????????¦Ê??????????????? -¸ÄΪ´«µÝÕû¸ö¶ÔÏó¡£ +??????????????? ```java int low = daysTempRange().getLow(); @@ -800,11 +800,11 @@ withinPlan = plan.withinRange(low,high); withinPlan = plan.withinRange(daysTempRange()); ``` -## 8. Replace Parameter with Methods£¨ÒÔº¯ÊýÈ¡´ú²ÎÊý£© +## 8. Replace Parameter with Methods???????????????? -¶ÔÏóµ÷ÓÃij¸öº¯Êý£¬²¢½«ËùµÃ½á¹û×÷Ϊ²ÎÊý£¬´«µÝ¸øÁíÒ»¸öº¯Êý¡£¶ø½ÓÊܸòÎÊýµÄº¯Êý±¾ÉíÒ²Äܹ»µ÷ÓÃǰһ¸öº¯Êý¡£ +?????????????????????????????????????????????????????????¨°?????????????????????????????? -ÈòÎÊý½ÓÊÕÕßÈ¥³ý¸ÃÏî²ÎÊý£¬¶øÊÇÖ±½Óµ÷ÓÃǰһ¸öº¯Êý¡£ +?¨°????????????????????????????????????????? ```java int basePrice = _quantity * _itemPrice; @@ -817,37 +817,37 @@ int basePrice = _quantity * _itemPrice; double finalPrice = discountedPrice (basePrice); ``` -## 9. Introduce Parameter Object£¨ÒýÈë²ÎÊý¶ÔÏó£© +## 9. Introduce Parameter Object????????????? -ijЩ²ÎÊý×ÜÊǺÜ×ÔÈ»µØÍ¬Ê±³öÏÖ£¬ÕâЩ²ÎÊý¾ÍÊÇ Data Clumps¡£ +?§»???????????????????????§»???????? Data Clumps?? -ÒÔÒ»¸ö¶ÔÏóÈ¡´úÕâЩ²ÎÊý¡£ +??????????????§»?????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/08738dd0-ae8e-404a-ba78-a6b1b7d225b3.jpg) -## 10. Remove Setting Method£¨ÒƳýÉèÖµº¯Êý£© +## 10. Remove Setting Method?????????????? -ÀàÖеÄij¸ö×Ö¶ÎÓ¦¸ÃÔÚ¶ÔÏó´´½¨Ê±±»ÉèÖµ£¬È»ºó¾Í²»Ôٸı䡣 +???§Ö????????????????????????????????? -È¥µô¸Ã×ֶεÄËùÓÐÉèÖµº¯Êý£¬²¢½«¸Ã×Ö¶ÎÉèΪ final¡£ +???????¦Å?????????????????????????? final?? -## 11. Hide Method£¨Òþ²Øº¯Êý£© +## 11. Hide Method??????????? -ÓÐÒ»¸öº¯Êý£¬´ÓÀ´Ã»Óб»ÆäËûÈκÎÀàÓõ½¡£ +?????????????????§Ò??????¦Ê???????? -½«Õâ¸öº¯ÊýÐÞ¸ÄΪ private¡£ +????????????? private?? -## 12. Replace Constructor with Factory Method £¨ÒÔ¹¤³§º¯ÊýÈ¡´ú¹¹Ô캯Êý£© +## 12. Replace Constructor with Factory Method ?????????????????????? -Ï£ÍûÔÚ´´½¨¶ÔÏóʱ²»½ö½öÊÇ×ö¼òµ¥µÄ½¨¹¹¶¯×÷¡£ +??????????????????????????????????? -½«¹¹Ô캯ÊýÌæ»»Îª¹¤³§º¯Êý¡£ +?????????�I??????????? -## 13. Encapsulate Downcast£¨·â×°ÏòÏÂתÐÍ£© +## 13. Encapsulate Downcast????????????? -ij¸öº¯Êý·µ»ØµÄ¶ÔÏó£¬ÐèÒªÓɺ¯Êýµ÷ÓÃÕßÖ´ÐÐÏòÏÂתÐÍ£¨downcast£©¡£ +????????????????????????????????????????downcast???? -½«ÏòÏÂתÐͶ¯×÷ÒÆµ½º¯ÊýÖС£ +????????????????????§³? ```java Object lastReading(){ @@ -860,17 +860,17 @@ Reading lastReading(){ } ``` -## 14. Replace Error Code with Exception £¨ÒÔÒ쳣ȡ´ú´íÎóÂ룩 +## 14. Replace Error Code with Exception ??????????????? -ij¸öº¯Êý·µ»ØÒ»¸öÌØ¶¨µÄ´úÂ룬ÓÃÒÔ±íʾijÖÖ´íÎóÇé¿ö¡£ +??????????????????????????????????????? -¸ÄÓÃÒì³££¬Òì³£½«ÆÕͨ³ÌÐòºÍ´íÎó´¦Àí·Ö¿ª£¬Ê¹´úÂë¸üÈÝÒ×Àí½â¡£ +?????????????????????????????????????????? -## 15. Replace Exception with Test£¨ÒÔ²âÊÔÈ¡´úÒì³££© +## 15. Replace Exception with Test?????????????? -Ãæ¶ÔÒ»¸öµ÷ÓÃÕß¿ÉÒÔÔ¤Ïȼì²éµÄÌõ¼þ£¬ÄãÅ׳öÁËÒ»¸öÒì³£¡£ +????????????????????????????????????????? -Ð޸ĵ÷ÓÃÕߣ¬Ê¹ËüÔÚµ÷Óú¯Êý֮ǰÏÈ×ö¼ì²é¡£ +????????????????¨²???????????î• ```java double getValueForPeriod(int periodNumber) { @@ -887,25 +887,25 @@ double getValueForPeriod(int periodNumber) { return values[periodNumber]; ``` -# µÚʮһÕ ´¦Àí¸ÅÀ¨¹ØÏµ +# ?????? ?????????? -## 1. Pull Up Field£¨×Ö¶ÎÉÏÒÆ£© +## 1. Pull Up Field?????????? -Á½¸ö×ÓÀàÓµÓÐÏàͬµÄ×ֶΡ£ +??????????????????¦±? -½«¸Ã×Ö¶ÎÒÆÖÁ³¬Àà¡£ +??????????????? -## 2. Pull Up Method£¨º¯ÊýÉÏÒÆ£© +## 2. Pull Up Method??????????? -ÓÐЩº¯Êý£¬ÔÚ¸÷¸ö×ÓÀàÖвúÉúÍêÈ«ÏàͬµÄ½á¹û¡£ +??§»????????????????§Ó??????????????? -½«¸Ãº¯ÊýÒÆÖÁ³¬Àà¡£ +???¨²??????????? -## 3. Pull Up Constructor Body£¨¹¹Ô캯Êý±¾ÌåÉÏÒÆ£© +## 3. Pull Up Constructor Body????????????????? -ÄãÔÚ¸÷¸ö×ÓÀàÖÐÓµÓÐһЩ¹¹Ô캯Êý£¬ËüÃǵı¾Ì弸ºõÍêȫһÖ¡£ +?????????????????§»???????????????�‹????????? -ÔÚ³¬ÀàÖÐн¨Ò»¸ö¹¹Ô캯Êý£¬²¢ÔÚ×ÓÀ๹Ô캯ÊýÖе÷ÓÃËü¡£ +??????????????????????????????????§Ö??????? ```java class Manager extends Employee... @@ -924,56 +924,56 @@ public Manager(String name, String id, int grade) { } ``` -## 4. Push Down Method£¨º¯ÊýÏÂÒÆ£© +## 4. Push Down Method??????????? -³¬ÀàÖеÄij¸öº¯ÊýÖ»Ó벿·Ö×ÓÀàÓйء£ +?????§Ö??????????????????§Û?? -½«Õâ¸öº¯ÊýÒÆµ½Ïà¹ØµÄÄÇЩ×ÓÀàÈ¥¡£ +??????????????????§»??????? -## 5. Push Down Field£¨×Ö¶ÎÏÂÒÆ£© +## 5. Push Down Field?????????? -³¬ÀàÖеÄij¸ö×Ö¶ÎÖ»±»²¿·Ö×ÓÀàÓõ½¡£ +?????§Ö??????????????????????? -½«Õâ¸ö×Ö¶ÎÒÆµ½ÐèÒªËüµÄÄÇЩ×ÓÀàÈ¥¡£ +????????????????????§»??????? -## 6. Extract Subclass£¨ÌáÁ¶×ÓÀࣩ +## 6. Extract Subclass?????????? -ÀàÖеÄÄ³Ð©ÌØÐÔÖ»±»Ä³Ð©ÊµÀýÓõ½¡£ +???§Ö??§»????????§»???????? -н¨Ò»¸ö×ÓÀ࣬½«ÉÏÃæËù˵µÄÄÇÒ»²¿·ÖÌØÐÔÒÆµ½×ÓÀàÖС£ +????????????????????????????????????????§³? -## 7. Extract Superclass£¨ÌáÁ¶³¬Àࣩ +## 7. Extract Superclass?????????? -Á½¸öÀàÓÐÏàËÆÌØÐÔ¡£ +????????????????? -ΪÕâÁ½¸öÀཨÁ¢Ò»¸ö³¬À࣬½«ÏàÍ¬ÌØÐÔÒÆÖÁ³¬Àà¡£ +??????????????????????????????????? -## 8. Extract Interface£¨ÌáÁ¶½Ó¿Ú£© +## 8. Extract Interface?????????? -Èô¸É¿Í»§Ê¹ÓÃÀà½Ó¿ÚÖеÄͬһ×Ó¼¯£¬»òÕßÁ½¸öÀàµÄ½Ó¿ÚÓв¿·ÖÏàͬ¡£ +??????????????§Ö??????????????????????§Ó???????? -½«ÏàͬµÄ×Ó¼¯ÌáÁ¶µ½Ò»¸ö¶ÀÁ¢½Ó¿ÚÖС£ +???????????????????????????§³? -## 9. Collapse Hierarchy£¨ÕÛµþ¼Ì³ÐÌåϵ£© +## 9. Collapse Hierarchy????????????? -³¬ÀàºÍ×ÓÀàÖ®¼äÎÞÌ«´óÇø±ð¡£ +????????????????????? -½«ËüÃǺÏΪһÌå¡£ +??????????‰^ -## 10. Form Template Method£¨ËÜÔìÄ£°åº¯Êý£© +## 10. Form Template Method????????Žï???? -ÄãÓÐһЩ×ÓÀ࣬ÆäÖÐÏàÓ¦µÄijЩº¯ÊýÒÔÏàͬ˳ÐòÖ´ÐÐÀàËÆµÄ²Ù×÷£¬µ«¸÷¸ö²Ù×÷µÄϸ½ÚÉÏÓÐËù²»Í¬¡£ +?????§»??????????????§»??????????????????????????????????????????????????? -½«ÕâЩ²Ù×÷·Ö±ð·Å½ø¶ÀÁ¢º¯ÊýÖУ¬²¢±£³ÖËüÃǶ¼ÓÐÏàͬµÄÇ©Ãû£¬ÓÚÊÇÔ­º¯ÊýÒ²¾Í±äµÃÏàͬÁË¡£È»ºó½«Ô­º¯ÊýÉÏÒÆÖÁ³¬Àà¡£(Ä£°å·½·¨Ä£Ê½) +????§»??????????????????§µ??????????????????????????????????????????????????????????????(??Ùã????) -## 11. Replace Inheritance with Delegation £¨ÒÔίÍÐÈ¡´ú¼Ì³Ð£© +## 11. Replace Inheritance with Delegation ????????????§µ? -ij¸ö×ÓÀàֻʹÓó¬Àà½Ó¿ÚÖеÄÒ»²¿·Ö£¬»òÊǸù±¾²»ÐèÒª¼Ì³Ð¶øÀ´µÄÊý¾Ý¡£ +??????????¨®??????§Ö?????????????????????§Ø?????????? -ÔÚ×ÓÀàÖÐн¨Ò»¸ö×Ö¶ÎÓÃÒÔ±£´æ³¬À࣬µ÷Õû×ÓÀຯÊý£¬ÁîËü¸Ä¶øÎ¯Íг¬À࣬ȻºóÈ¥µôÁ½ÕßÖ®¼äµÄ¼Ì³Ð¹ØÏµ¡£ +???????????????????????›‰???????????????????????§Ô??????????????????§Û???? -## 12. Replace Delegation with Inheritance £¨ÒԼ̳ÐÈ¡´úίÍУ© +## 12. Replace Delegation with Inheritance ???????????§µ? -ÄãÔÚÁ½¸öÀàÖ®¼äʹÓÃίÍйØÏµ£¬²¢¾­³£ÎªÕû¸ö½Ó¿Ú±àдÐí¶à¼«¼òµ¥µÄίÍк¯Êý¡£ +??????????????????§Û???????????????????§Õ????????§Ü????? -ÈÃίÍÐÀà¼Ì³ÐÊÜÍÐÀà¡£ +??????????????? diff --git a/notes/é�¢å�‘对象æ€�想.md b/notes/é�¢å�‘对象æ€�想.md index 0403888d..0cf0b96e 100644 --- a/notes/é�¢å�‘对象æ€�想.md +++ b/notes/é�¢å�‘对象æ€�想.md @@ -1,75 +1,75 @@ * [S.O.L.I.D](#solid) - * [1. µ¥Ò»ÔðÈÎÔ­Ôò](#1-µ¥Ò»ÔðÈÎÔ­Ôò) - * [2. ¿ª·Å·â±ÕÔ­Ôò](#2-¿ª·Å·â±ÕÔ­Ôò) - * [3. ÀïÊÏÌæ»»Ô­Ôò](#3-ÀïÊÏÌæ»»Ô­Ôò) - * [4. ½Ó¿Ú·ÖÀëÔ­Ôò](#4-½Ó¿Ú·ÖÀëÔ­Ôò) - * [5. ÒÀÀµµ¹ÖÃÔ­Ôò](#5-ÒÀÀµµ¹ÖÃÔ­Ôò) -* [·â×°¡¢¼Ì³Ð¡¢¶à̬](#·â×°¼Ì³Ð¶à̬) - * [1. ·â×°](#1-·â×°) - * [2. ¼Ì³Ð](#2-¼Ì³Ð) - * [3. ¶à̬](#3-¶à̬) + * [1. ??????????](#1-??????????) + * [2. ?????????](#2-?????????) + * [3. ?????�I???](#3-?????�I???) + * [4. ?????????](#4-?????????) + * [5. ???????????](#5-???????????) +* [???????§³????](#???????§ã????) + * [1. ???](#1-???) + * [2. ???](#2-???) + * [3. ???](#3-???) * [UML](#uml) - * [1. Ààͼ](#1-Ààͼ) - * [2. ʱÐòͼ](#2-ʱÐòͼ) -* [²Î¿¼×ÊÁÏ](#²Î¿¼×ÊÁÏ) + * [1. ???](#1-???) + * [2. ????](#2-????) +* [?¦Ï?????](#?¦Ï?????) # S.O.L.I.D -S.O.L.I.DÊÇÃæÏò¶ÔÏóÉè¼ÆºÍ±à³Ì(OOD&OOP)Öм¸¸öÖØÒª±àÂëÔ­Ôò(Programming Priciple)µÄÊ××ÖĸËõд¡£ +S.O.L.I.D???????????????(OOD&OOP)?§Þ?????????????(Programming Priciple)?????????§Õ?? -|¼òд |ȫƴ |ÖÐÎÄ·­Òë| +|??§Õ |?? |???????| | -- | -- | -- | -|SRP| The Single Responsibility Principle |µ¥Ò»ÔðÈÎÔ­Ôò| -|OCP| The Open Closed Principle | ¿ª·Å·â±ÕÔ­Ôò| -|LSP| The Liskov Substitution Principle |ÀïÊÏÌæ»»Ô­Ôò| -|ISP| The Interface Segregation Principle |½Ó¿Ú·ÖÀëÔ­Ôò| -|DIP| The Dependency Inversion Principle |ÒÀÀµµ¹ÖÃÔ­Ôò| +|SRP| The Single Responsibility Principle |??????????| +|OCP| The Open Closed Principle | ?????????| +|LSP| The Liskov Substitution Principle |?????�I???| +|ISP| The Interface Segregation Principle |?????????| +|DIP| The Dependency Inversion Principle |???????????| -## 1. µ¥Ò»ÔðÈÎÔ­Ôò +## 1. ?????????? -µ±ÐèÒªÐÞ¸Äij¸öÀàµÄʱºòÔ­ÒòÓÐÇÒÖ»ÓÐÒ»¸ö¡£»»¾ä»°Ëµ¾ÍÊÇÈÃÒ»¸öÀàÖ»×öÒ»ÖÖÀàÐÍÔðÈΣ¬µ±Õâ¸öÀàÐèÒª³Ðµ±ÆäËûÀàÐ͵ÄÔðÈεÄʱºò£¬¾ÍÐèÒª·Ö½âÕâ¸öÀà¡£ +???????????????????????????????????Ñö?????????????????????????¦²????????????§Ö?????????????¦Å???????????????? -## 2. ¿ª·Å·â±ÕÔ­Ôò +## 2. ????????? -Èí¼þʵÌåÓ¦¸ÃÊÇ¿ÉÀ©Õ¹£¬¶ø²»¿ÉÐ޸ĵġ£Ò²¾ÍÊÇ˵£¬¶ÔÀ©Õ¹ÊÇ¿ª·ÅµÄ£¬¶ø¶ÔÐÞ¸ÄÊÇ·â±ÕµÄ¡£ +????????????????????????????????????????????????????????????? -## 3. ÀïÊÏÌæ»»Ô­Ôò +## 3. ?????�I??? -µ±Ò»¸ö×ÓÀàµÄʵÀýÓ¦¸ÃÄܹ»Ìæ»»ÈÎºÎÆä³¬ÀàµÄʵÀýʱ£¬ËüÃÇÖ®¼ä²Å¾ßÓÐ is-a ¹ØÏµ¡£ +????????????????????�I?¦Ê??????????????????????? is-a ????? -## 4. ½Ó¿Ú·ÖÀëÔ­Ôò +## 4. ????????? -²»ÄÜÇ¿ÆÈÓû§È¥ÒÀÀµÄÇЩËûÃDz»Ê¹ÓõĽӿڡ£»»¾ä»°Ëµ£¬Ê¹Óöà¸öרÃŵĽӿڱÈʹÓõ¥Ò»µÄ×ܽӿÚ×ÜÒªºÃ¡£ +?????????????????§»???????????????Ñö??????????????????????????????¨¢? -## 5. ÒÀÀµµ¹ÖÃÔ­Ôò +## 5. ??????????? -1. ¸ß²ãÄ£¿é²»Ó¦¸ÃÒÀÀµÓڵͲãÄ£¿é£¬¶þÕß¶¼Ó¦¸ÃÒÀÀµÓÚ³éÏó -2. ³éÏó²»Ó¦¸ÃÒÀÀµÓÚϸ½Ú£¬Ï¸½ÚÓ¦¸ÃÒÀÀµÓÚ³éÏó +1. ?????öö?????????????ï…????????????????? +2. ???????????????????????????????? -# ·â×°¡¢¼Ì³Ð¡¢¶à̬ +# ???????§³???? -·â×°¡¢¼Ì³Ð¡¢¶à̬ÊÇÃæÏò¶ÔÏóµÄÈý´óÌØÐÔ¡£ +???????§³??????????????????????? -## 1. ·â×° +## 1. ??? -ÀûÓóéÏóÊý¾ÝÀàÐͽ«Êý¾ÝºÍ»ùÓÚÊý¾ÝµÄ²Ù×÷·â×°ÔÚÒ»Æð£¬Ê¹Æä¹¹³ÉÒ»¸ö²»¿É·Ö¸îµÄ¶ÀÁ¢ÊµÌ壬Êý¾Ý±»±£»¤ÔÚ³éÏóÊý¾ÝÀàÐ͵ÄÄÚ²¿£¬¾¡¿ÉÄܵØÒþ²ØÄÚ²¿µÄϸ½Ú£¬Ö»±£ÁôһЩ¶ÔÍâ½Ó¿Úʹ֮ÓëÍⲿ·¢ÉúÁªÏµ¡£Óû§ÊÇÎÞÐèÖªµÀ¶ÔÏóÄÚ²¿µÄϸ½Ú£¬µ«¿ÉÒÔͨ¹ý¸Ã¶ÔÏó¶ÔÍâµÄÌṩµÄ½Ó¿ÚÀ´·ÃÎʸöÔÏó¡£ +???¨®??????????????????????????????????????�q?????????????????ÈÉ??????????????????????????????????????????????????????§»???????????????????????????????????????????????????????????????????????????????? -·â×°ÓÐÈý´óºÃ´¦£º +????????????? -1. Á¼ºÃµÄ·â×°Äܹ»¼õÉÙñîºÏ¡£ +1. ?????????????????? -2. ÀàÄÚ²¿µÄ½á¹¹¿ÉÒÔ×ÔÓÉÐ޸ġ£ +2. ???????????????????? -3. ¿ÉÒÔ¶Ô³ÉÔ±½øÐиü¾«È·µÄ¿ØÖÆ¡£ +3. ??????????§Ú?????????? -4. Òþ²ØÐÅÏ¢£¬ÊµÏÖϸ½Ú¡£ +4. ???????????????? -ÒÔÏ Person Àà·â×° name¡¢gender¡¢age µÈÊôÐÔ£¬Íâ½çÖ»ÄÜͨ¹ý get() ·½·¨»ñȡһ¸ö Person ¶ÔÏóµÄ name ÊôÐÔºÍ gender ÊôÐÔ£¬¶øÎÞ·¨»ñÈ¡ age ÊôÐÔ£¬µ«ÊÇ age ÊôÐÔ¿ÉÒÔ¹© work() ·½·¨Ê¹Óᣠ+???? Person ???? name??gender??age ???????????????? get() ?????????? Person ????? name ????? gender ????????????? age ????????? age ???????? work() ??????¨¢? -×¢Òâµ½ gender ÊôÐÔʹÓà int Êý¾ÝÀàÐͽøÐд洢£¬·âװʹµÃÓû§×¢Òâ²»µ½ÕâÖÖʵÏÖϸ½Ú¡£²¢ÇÒÔÚÐèÒªÐÞ¸ÄʹÓõÄÊý¾ÝÀàÐÍʱ£¬Ò²¿ÉÒÔÔÚ²»Ó°Ïì¿Í»§¶Ë´úÂëµÄÇé¿öϽøÐС£ +??? gender ??????? int ??????????§Õ›¥????????????????????????????????????????????????????????????????????????????????§³? ```java public class Person { @@ -95,25 +95,25 @@ public class Person { } ``` -## 2. ¼Ì³Ð +## 2. ??? -¼Ì³ÐʵÏÖÁË **is-a** ¹ØÏµ£¬ÀýÈç Cat ºÍ Animal ¾ÍÊÇÒ»ÖÖ is-a ¹ØÏµ£¬Òò´Ë¿ÉÒÔ½« Cat ¼Ì³Ð×Ô Animal£¬´Ó¶ø»ñµÃ Animal ·Ç private µÄÊôÐԺͷ½·¨¡£ +???????? **is-a** ????????? Cat ?? Animal ??????? is-a ???????????? Cat ????? Animal???????? Animal ?? private ???????????? -Cat ¿ÉÒÔµ±×ö Animal À´Ê¹Óã¬Ò²¾ÍÊÇ¿ÉÒÔʹÓà Animal ÒýÓà Cat ¶ÔÏó£¬ÕâÖÖ×ÓÀàת»»Îª¸¸Àà³ÆÎª **ÏòÉÏתÐÍ**¡£ +Cat ??????? Animal ????????????????? Animal ???? Cat ?????????????????????? **???????**?? -¼Ì³ÐÓ¦¸Ã×ñÑ­ÀïÊÏÌæ»»Ô­Ôò£ºµ±Ò»¸ö×ÓÀàµÄʵÀýÓ¦¸ÃÄܹ»Ìæ»»ÈÎºÎÆä³¬ÀàµÄʵÀýʱ£¬ËüÃÇÖ®¼ä²Å¾ßÓÐ is-a ¹ØÏµ¡£ +??????????????�I??????????????????????�I?¦Ê??????????????????????? is-a ????? ```java Animal animal = new Cat(); ``` -## 3. ¶à̬ +## 3. ??? -¶à̬·ÖΪ±àÒëʱ¶à̬ºÍÔËÐÐʱ¶à̬¡£±àÒëʱ¶à̬Ö÷ÒªÖ¸·½·¨µÄ֨װ£¬ÔËÐÐʱ¶àָ̬³ÌÐòÖж¨ÒåµÄ¶ÔÏóÒýÓÃËùÖ¸ÏòµÄ¾ßÌåÀàÐÍÔÚÔËÐÐÆÚ¼ä²ÅÈ·¶¨¡£ +???????????????????????????????????????????????????????????????§Ø??????????????????????????????????????? -¶à̬ÓÐÈý¸öÌõ¼þ£º1. ¼Ì³Ð£»2. ¸²¸Ç¸¸Àà·½·¨£»3. ÏòÉÏתÐÍ¡£ +???????????????1. ??§µ?2. ???????????3. ???????? -ÏÂÃæµÄ´úÂëÖУ¬ÀÖÆ÷ÀࣨInstrument£©ÓÐÁ½¸ö×ÓÀࣺWind ºÍ Percussion£¬ËüÃǶ¼¸²¸ÇÁË play() ·½·¨£¬²¢ÇÒÔÚ main() ·½·¨ÖÐʹÓø¸Àà Instrument À´ÒýÓà Wind ºÍ Percussion ¶ÔÏó¡£ÔÚ Instrument ÒýÓõ÷Óà play() ·½·¨Ê±£¬»áÖ´ÐÐʵ¼ÊÒýÓöÔÏóËùÔÚÀàµÄ play() ·½·¨£¬¶ø²»ÊÇ Instrument ÀàµÄ·½·¨¡£ +?????????§µ???????Instrument????????????Wind ?? Percussion????????????? play() ???????????? main() ???????????? Instrument ?????? Wind ?? Percussion ?????? Instrument ??????? play() ????????????????????????????? play() ???????????? Instrument ???????? ```java public class Instrument { @@ -151,157 +151,157 @@ public class Music { # UML -## 1. Ààͼ +## 1. ??? -**1.1 ¼Ì³ÐÏà¹Ø** +**1.1 ??????** -¼Ì³ÐÓÐÁ½ÖÖÐÎʽ: ·º»¯£¨generalize£©ºÍʵÏÖ£¨realize£©£¬±íÏÖΪ is-a ¹ØÏµ¡£ +????????????: ??????generalize????????realize????????? is-a ????? -¢Ù ·º»¯¹ØÏµ(generalization) +?? ???????(generalization) -´Ó¾ßÌåÀàÖм̳Р+????????§Þ?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/29badd92-109f-4f29-abb9-9857f5973928.png) -¢Ú ʵÏÖ¹ØÏµ(realize) +?? ?????(realize) -´Ó³éÏóÀà»òÕß½Ó¿ÚÖм̳Р+?????????????§Þ?? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/4b16e1d3-3a60-472c-9756-2f31b1c48abe.png) -**1.2 ÕûÌåºÍ²¿·Ö** +**1.2 ????????** -¢Ù ¾ÛºÏ¹ØÏµ(aggregation) +?? ?????(aggregation) -±íʾÕûÌåÓɲ¿·Ö×é³É£¬µ«ÊÇÕûÌåºÍ²¿·Ö²»ÊÇÇ¿ÒÀÀµµÄ£¬ÕûÌå²»´æÔÚÁ˲¿·Ö»¹ÊÇ»á´æÔÚ¡£ÒÔϱíʾ B ÓÉ A ×é³É£º +??????????????????????????????????????????�I????????????????????¡À?? B ?? A ???? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/34259bb8-ca3a-4872-8771-9e946782d9c3.png) -¢Ú ×éºÏ¹ØÏµ(composition) +?? ?????(composition) -ºÍ¾ÛºÏ²»Í¬£¬×éºÏÖÐÕûÌåºÍ²¿·ÖÊÇÇ¿ÒÀÀµµÄ£¬ÕûÌå²»´æÔÚÁ˲¿·ÖÒ²²»´æÔÚÁË¡£±ÈÈ繫˾ºÍ²¿ÃÅ£¬¹«Ë¾Ã»Á˲¿ÃžͲ»´æÔÚÁË¡£µ«Êǹ«Ë¾ºÍÔ±¹¤¾ÍÊôÓھۺϹØÏµÁË£¬ÒòΪ¹«Ë¾Ã»ÁËÔ±¹¤»¹ÔÚ¡£ +??????????????????????????????????�I??????????????????????ÀM?????????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/7dda050d-ac35-4f47-9f51-18f18ed6fa9a.png) -**1.3 Ï໥ÁªÏµ** +**1.3 ?????** -¢Ù ¹ØÁª¹ØÏµ(association) +?? ???????(association) -±íʾ²»Í¬Àà¶ÔÏóÖ®¼äÓйØÁª£¬ÕâÊÇÒ»ÖÖ¾²Ì¬¹ØÏµ£¬ÓëÔËÐйý³ÌµÄ״̬Î޹أ¬ÔÚ×ʼ¾Í¿ÉÒÔÈ·¶¨¡£Òò´ËÒ²¿ÉÒÔÓà 1 ¶Ô 1¡¢¶à¶Ô 1¡¢¶à¶Ô¶àÕâÖÖ¹ØÁª¹ØÏµÀ´±íʾ¡£±ÈÈçѧÉúºÍѧУ¾ÍÊÇÒ»ÖÖ¹ØÁª¹ØÏµ£¬Ò»¸öѧУ¿ÉÒÔÓкܶàѧÉú£¬µ«ÊÇÒ»¸öѧÉúÖ»ÊôÓÚÒ»¸öѧУ£¬Òò´ËÕâÊÇÒ»ÖÖ¶à¶ÔÒ»µÄ¹ØÏµ£¬ÔÚÔËÐпªÊ¼Ö®Ç°¾Í¿ÉÒÔÈ·¶¨¡£ +???????????????§Û????????????????????????§Û??????????????????????????????????? 1 ?? 1????? 1?????????????????????????????????§µ???????????????????§µ?????§Ü??????????????????????????§µ??????????????????????????§á?????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/4ccd294c-d6b2-421b-839e-d88336ff5fb7.png) -¢Ú ÒÀÀµ¹ØÏµ(dependency) +?? ???????(dependency) -ºÍ¹ØÁª¹ØÏµ²»Í¬µÄÊÇ, ÒÀÀµ¹ØÏµÊÇÔÚÔËÐйý³ÌÖÐÆð×÷Óõġ£Ò»°ãÒÀÀµ×÷ΪÀàµÄ¹¹ÔìÆ÷»òÕß·½·¨µÄ²ÎÊý´«È롣˫ÏòÒÀÀµÊ±Ò»ÖÖ²»ºÃµÄÉè¼Æ¡£ +???????????????, ??????????????§Û?????????????????????????????????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/47ca2614-509f-476e-98fc-50ec9f9d43c0.png) -## 2. ʱÐòͼ +## 2. ???? -**2.1 ¶¨Òå** +**2.1 ????** -ʱÐòͼÃèÊöÁ˶ÔÏóÖ®¼ä´«µÝÏûÏ¢µÄʱ¼ä˳Ðò£¬ËüÓÃÀ´±íʾÓÃÀýµÄÐÐΪ˳Ðò¡£ËüµÄÖ÷Òª×÷ÓÃÊÇͨ¹ý¶ÔÏó¼äµÄ½»»¥À´ÃèÊöÓÃÀý£¨×¢ÒâÊǶÔÏ󣩣¬´Ó¶øÑ°ÕÒÀàµÄ²Ù×÷¡£ +?????????????????????????????????????????????????????????????????????????????????????????????????????????????? -**2.2 ³à±Ú֮սʱÐòͼ** +**2.2 ?????????** -´ÓÐéÏß´ÓÉÏÍùϱíʾʱ¼äµÄÍÆ½ø¡£ +????????????¡À??????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/80c5aff8-fc46-4810-aeaa-215b5c60a003.png) -¿É¼û£¬Í¨¹ýʱÐòͼ¿ÉÒÔÖªµÀÿ¸öÀà¾ßÓÐÒÔϲÙ×÷£º +???????????????????????????????????? ```java -publc class Áõ±¸ { - public void Ó¦Õ½(); +publc class ???? { + public void ??(); } -publc class ¿×Ã÷ { - public void Äⶨ²ßÂÔ(); - public void ÁªºÏËïȨ(); - private void ½è¶«·ç»ð¹¥(); +publc class ???? { + public void ??????(); + public void ???????(); + private void ?Úˆ???(); } -public class ¹ØÓð { - public void ·ÀÊØÇGÖÝ(); +public class ???? { + public void ?????G??(); } -public class ÕÅ·É { - public void ·ÀÊØ¾£ÖÝǰÏß(); +public class ??? { + public void ??????????(); } -public class ËïȨ { - public void Áì±øÏàÖú(); +public class ??? { + public void ???????(); } ``` -**2.3 »î¶¯Í¼¡¢Ê±Ðòͼ֮¼äµÄ¹ØÏµ** +**2.3 ???????????????** -»î¶¯Í¼Ê¾´ÓÓû§µÄ½Ç¶ÈÀ´ÃèÊöÓÃÀý£» +????????????????????????? -ʱÐòͼÊÇ´Ó¼ÆËã»úµÄ½Ç¶È£¨¶ÔÏó¼äµÄ½»»¥£©ÃèÊöÓÃÀý¡£ +????????????????????????????????????? -**2.4 ÀàͼÓëʱÐòͼµÄ¹ØÏµ** +**2.4 ?????????????** -ÀàͼÃèÊöϵͳµÄ¾²Ì¬½á¹¹£¬Ê±ÐòͼÃèÊöϵͳµÄ¶¯Ì¬ÐÐΪ¡£ +???????????????????????????????????? -**2.5 ʱÐòͼµÄ×é³É** +**2.5 ?????????** -¢Ù ¶ÔÏó +?? ???? -ÓÐÈýÖÖ±íÏÖÐÎʽ +???????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/25b8adad-2ef6-4f30-9012-c306b4e49897.png) -ÔÚ»­Í¼Ê±£¬Ó¦¸Ã×ñÑ­ÒÔÏÂÔ­Ôò£º +???????????????????? -1. °Ñ½»»¥Æµ·±µÄ¶ÔÏ󾡿ÉÄܵؿ¿Â£¡£ +1. ????????????????????? -2. °Ñ³õʼ»¯Õû¸ö½»»¥»î¶¯µÄ¶ÔÏó£¨ÓÐʱÊÇÒ»¸ö²ÎÓëÕߣ©·ÅÖÃÔÚ×î×ó±ß¡£ +2. ???????????????????????????????????????????????? -¢Ú ÉúÃüÏß +?? ?????? -ÉúÃüÏß´Ó¶ÔÏóµÄ´´½¨¿ªÊ¼µ½¶ÔÏóÏú»ÙʱÖÕÖ¹ +??????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/b7b0eac6-e7ea-4fb6-8bfb-95fec6f235e2.png) -¢Û ÏûÏ¢ +?? ??? -¶ÔÏóÖ®¼äµÄ½»»¥Ê½Í¨¹ý·¢ËÍÏûÏ¢À´ÊµÏֵġ£ +????????????????????????????? -ÏûÏ¢ÓÐ4ÖÖÀàÐÍ£º +?????4??????? -1\. ¼òµ¥ÏûÏ¢£¬²»Çø·Öͬ²½Òì²½¡£ +1\. ???????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/a13b62da-0fa8-4224-a615-4cadacc08871.png) -2\. ͬ²½ÏûÏ¢£¬·¢ËÍÏûÏ¢Ö®ºóÐèÒªÔÝÍ£»î¶¯À´µÈ´ý»ØÓ¦¡£ +2\. ???????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/33821037-dc40-4266-901c-e5b38e618426.png) -3\. Òì²½ÏûÏ¢£¬·¢ËÍÏûÏ¢Ö®ºó²»ÐèÒªµÈ´ý¡£ +3\. ????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/dec6c6cc-1b5f-44ed-b8fd-464fcf849dac.png) -4\. ·µ»ØÏûÏ¢£¬¿ÉÑ¡¡£ +4\. ?????????????? -¢Ü ¼¤»î +?? ???? -ÉúÃüÏßÉϵķ½¿ò±íʾ¼¤»î״̬£¬ÆäËüʱ¼ä´¦ÓÚÐÝÃß״̬¡£ +??????????????????????????????????????? ![](https://github.com/CyC2018/InterviewNotes/blob/master/pics/6ab5de9b-1c1e-4118-b2c3-fb6c7ed7de6f.png) -# ²Î¿¼×ÊÁÏ +# ?¦Ï????? -- Java ±à³Ì˼Ïë +- Java ?????? -- [ÃæÏò¶ÔÏóÉè¼ÆµÄSOLIDÔ­Ôò](http://www.cnblogs.com/shanyou/archive/2009/09/21/1570716.html) +- [???????????SOLID???](http://www.cnblogs.com/shanyou/archive/2009/09/21/1570716.html) -- [¿´¶®UMLÀàͼºÍʱÐòͼ](http://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html#generalization) +- [????UML?????????](http://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html#generalization) -- [UMLϵÁСª¡ªÊ±Ðòͼ£¨Ë³Ðòͼ£©sequence diagram](http://www.cnblogs.com/wolf-sun/p/UML-Sequence-diagram.html) +- [UML??§³???????????????sequence diagram](http://www.cnblogs.com/wolf-sun/p/UML-Sequence-diagram.html) -- [ÃæÏò¶ÔÏó±à³ÌÈý´óÌØÐÔ------·â×°¡¢¼Ì³Ð¡¢¶à̬](http://blog.csdn.net/jianyuerensheng/article/details/51602015) +- [?????????????????------???????§³????](http://blog.csdn.net/jianyuerensheng/article/details/51602015) diff --git a/notes/é�¢ç»�/C++å�Žå�°å¼€å�‘é�¢è¯•常è§�问题汇总_讨论区_牛客网 -.txt b/notes/é�¢ç»�/C++å�Žå�°å¼€å�‘é�¢è¯•常è§�问题汇总_讨论区_牛客网 -.txt new file mode 100644 index 00000000..f90163ce --- /dev/null +++ b/notes/é�¢ç»�/C++å�Žå�°å¼€å�‘é�¢è¯•常è§�问题汇总_讨论区_牛客网 -.txt @@ -0,0 +1,1259 @@ + + +下载APP 注册或登录 讨论区 +C++å�Žå�°å¼€å�‘é�¢è¯•常è§�问题汇总 + +oscarwin +2017-10-27 09:42:47 +13 29 + + +从牛客获得太多的资æº�,æ�¥ä¸€å�‘é�¢ç»�,纯技术干货。é�¢è¯•的技巧,心æ€�,简历也都很é‡�è¦�,ä¸�过牛客有很多大佬总结的太好了,就ä¸�é‡�å¤�了。 + +主è¦�是C++å�Žå�°å¼€å�‘,基本总结了我自己é�¢è¯•常问到的,看别人的é�¢ç»�问到过的,分享出æ�¥äº¤æµ�一下。 C++å�Žå�°å¼€å�‘é�¢è¯•常è§�问题汇总 + +原文æ�¥è‡ªæˆ‘çš„å�šå®¢ï¼Œæ¬¢è¿Žç‚¹å‡»ï¼š http://blog.csdn.net/shanghairuoxiao/article/details/72876248 Cå’ŒC++语言基础 + + +extern关键字作用 +extern声明å�˜é‡�在在外部定义? +extern修饰函数? +extern C的作用?用法? + + +static关键字作用 +static修饰局部å�˜é‡�? +static全局å�˜é‡�?(é™�定å�˜é‡�在一个编译å�•元内,一个编译å�•元就是指一个cpp和它包å�«çš„头文件,这个回答å�¯ä»¥ç»“å�ˆç¼–译需è¦�ç»�历的几个过程æ�¥ç­”) +static修饰普通函数? +static修饰æˆ�员å�˜é‡�? +static修饰æˆ�员函数? + + +volatile是干啥的 +访问寄存器è¦�比访问内存è¦�å�—,因此CPU会优先访问该数æ�®åœ¨å¯„存器中的存储结果,但是内存中的数æ�®å�¯èƒ½å·²ç»�å�‘生了改å�˜ï¼Œè€Œå¯„存器中还ä¿�ç•™ç�€åŽŸæ�¥çš„结果。为了é�¿å…�è¿™ç§�情况的å�‘生将该å�˜é‡�声明为volatile,告诉CPUæ¯�次都从内存去读å�–æ•°æ�®ã€‚ +一个å�‚æ•°å�¯ä»¥å�³æ˜¯constå�ˆæ˜¯volatileçš„å�—?å�¯ä»¥ï¼Œä¸€ä¸ªä¾‹å­�是å�ªè¯»çжæ€�寄存器,是volatile是因为它å�¯èƒ½è¢«æ„�想ä¸�到的被改å�˜ï¼Œæ˜¯const告诉程åº�ä¸�应该试图去修改他。 + + +说说const的作用,越多越好 +const修饰全局å�˜é‡�ï¼› +const修饰局部å�˜é‡�ï¼› +const修饰指针,const int *ï¼› +const修饰指针指å�‘的对象, int * constï¼› +const修饰引用å�šå½¢å�‚ï¼› +const修饰æˆ�员å�˜é‡�,必须在构造函数列表中åˆ�始化; +const修饰æˆ�员函数,说明该函数ä¸�应该修改é�žé�™æ€�æˆ�员,但是这并ä¸�是å��分å�¯é� çš„,指针所指的é�žæˆ�员对象值å�¯èƒ½ä¼šè¢«æ”¹å�˜ + + +new与malloc区别 +new分é…�内存按照数æ�®ç±»åž‹è¿›è¡Œåˆ†é…�,malloc分é…�内存按照大å°�分é…�ï¼› +newä¸�仅分é…�一段内存,而且会调用构造函数,但是malloc则ä¸�会。new的实现原ç�†ï¼Ÿä½†æ˜¯è¿˜éœ€è¦�注æ„�的是,之å‰�看到过一个题说int p = new int与int p = new int()的区别,因为int属于C++内置对象,ä¸�会默认åˆ�始化,必须显示调用默认构造函数,但是对于自定义对象都会默认调用构造函数åˆ�始化。翻阅资料å�Žï¼Œåœ¨C++11中两者没有区别了,自己测试的结构也都是为0ï¼› +new返回的是指定对象的指针,而malloc返回的是void*,因此malloc的返回值一般都需è¦�进行类型转化; +new是一个æ“�作符å�¯ä»¥é‡�载,malloc是一个库函数; +new分é…�的内存è¦�用delete销æ¯�,mallocè¦�用freeæ�¥é”€æ¯�ï¼›delete销æ¯�的时候会调用对象的æž�构函数,而free则ä¸�会; +malloc分é…�的内存ä¸�够的时候,å�¯ä»¥ç”¨realloc扩容。扩容的原ç�†ï¼Ÿnew没用这样æ“�作; +new如果分é…�失败了会抛出bad_malloc的异常,而malloc失败了会返回NULL。因此对于new,正确的姿势是采用try...catch语法,而malloc则应该判断指针的返回值。为了兼容很多c程åº�员的习惯,C++也å�¯ä»¥é‡‡ç”¨new nothrow的方法ç¦�止抛出异常而返回NULLï¼› +newå’Œnew[]的区别,new[]一次分é…�所有内存,多次调用构造函数,分别æ�­é…�使用deleteå’Œdelete[],å�Œç�†ï¼Œdelete[]多次调用æž�构函数,销æ¯�数组中的æ¯�个对象。而malloc则å�ªèƒ½sizeof(int) * nï¼› +如果ä¸�够å�¯ä»¥ç»§ç»­è°ˆnewå’Œmalloc的实现,空闲链表,分é…�方法(首次适é…�原则,最佳适é…�原则,最差适é…�原则,快速适é…�原则)。deleteå’Œfree的实现原ç�†ï¼Œfree为什么直到销æ¯�多大的空间? + + +C++多æ€�性与虚函数表 +C++多æ€�的实现? +多æ€�分为é�™æ€�多æ€�和动æ€�多æ€�。é�™æ€�多æ€�是通过é‡�载和模æ�¿æŠ€æœ¯å®žçŽ°ï¼Œåœ¨ç¼–è¯‘çš„æ—¶å€™ç¡®å®šã€‚åŠ¨æ€�多æ€�通过虚函数和继承关系æ�¥å®žçŽ°ï¼Œæ‰§è¡ŒåŠ¨æ€�绑定,在è¿�行的时候确定。 +动æ€�多æ€�实现有几个æ�¡ä»¶ï¼š +(1) 虚函数; +(2) 一个基类的指针或引用指å�‘派生类的对象; +基类指针在调用æˆ�员函数(虚函数)时,就会去查找该对象的虚函数表。虚函数表的地å�€åœ¨æ¯�个对象的首地å�€ã€‚查找该虚函数表中该函数的指针进行调用。 +æ¯�个对象中ä¿�存的å�ªæ˜¯ä¸€ä¸ªè™šå‡½æ•°è¡¨çš„æŒ‡é’ˆï¼ŒC++内部为æ¯�一个类维æŒ�一个虚函数表,该类的对象的都指å�‘è¿™å�Œä¸€ä¸ªè™šå‡½æ•°è¡¨ã€‚ +虚函数表中为什么就能准确查找相应的函数指针呢?因为在类设计的时候,虚函数表直接从基类也继承过æ�¥ï¼Œå¦‚果覆盖了其中的æŸ�个虚函数,那么虚函数表的指针就会被替æ�¢ï¼Œå› æ­¤å�¯ä»¥æ ¹æ�®æŒ‡é’ˆå‡†ç¡®æ‰¾åˆ°è¯¥è°ƒç”¨å“ªä¸ªå‡½æ•°ã€‚ + + +虚函数的作用? +虚函数用于实现多æ€�,这点大家都能答上æ�¥ +但是虚函数在设计上还具有å°�装和抽象的作用。比如抽象工厂模å¼�。 + + +动æ€�绑定是如何实现的? +第一个问题中基本回答了,主è¦�都是结å�ˆè™šå‡½æ•°è¡¨æ�¥ç­”就行。 + + +é�™æ€�多æ€�和动æ€�多æ€� 。é�™æ€�多æ€�是指通过模æ�¿æŠ€æœ¯æˆ–者函数é‡�载技术实现的多æ€�,其在编译器确定行为。动æ€�多æ€�是指通过虚函数技术实现在è¿�行期动æ€�绑定的技术。 + + +虚函数表 + + +虚函数表是针对类的还是针对对象的?å�Œä¸€ä¸ªç±»çš„两个对象的虚函数表是怎么维护的? +编译器为æ¯�一个类维护一个虚函数表,æ¯�个对象的首地å�€ä¿�å­˜ç�€è¯¥è™šå‡½æ•°è¡¨çš„æŒ‡é’ˆï¼Œå�Œä¸€ä¸ªç±»çš„ä¸�å�Œå¯¹è±¡å®žé™…上指å�‘å�Œä¸€å¼ è™šå‡½æ•°è¡¨ã€‚ + + +纯虚函数如何定义,为什么对于存在虚函数的类中æž�构函数è¦�定义æˆ�虚函数 +为了实现多æ€�进行动æ€�绑定,将派生类对象指针绑定到基类指针上,对象销æ¯�时,如果æž�构函数没有定义为æž�构函数,则会调用基类的æž�构函数,显然å�ªèƒ½é”€æ¯�部分数æ�®ã€‚如果è¦�调用对象的æž�构函数,就需è¦�将该对象的æž�构函数定义为虚函数,销æ¯�时通过虚函数表找到对应的æž�构函数。 +//纯虚函数定义 +virtual ~myClass() = 0; + + + +æž�构函数能抛出异常å�— +答案肯定是ä¸�能。 + +C++标准指明æž�构函数ä¸�能ã€�也ä¸�应该抛出异常。C++异常处ç�†æ¨¡åž‹æœ€å¤§çš„特点和优势就是对C++中的é�¢å�‘对象æ��供了最强大的无ç¼�支æŒ�。那么如果对象在è¿�行期间出现了异常,C++异常处ç�†æ¨¡åž‹æœ‰è´£ä»»æ¸…除那些由于出现异常所导致的已ç»�失效了的对象(也å�³å¯¹è±¡è¶…出了它原æ�¥çš„作用域),并释放对象原æ�¥æ‰€åˆ†é…�的资æº�, 这就是调用这些对象的æž�构函数æ�¥å®Œæˆ�释放资æº�的任务,所以从这个æ„�义上说,æž�构函数已ç»�å�˜æˆ�了异常处ç�†çš„一部分。 + + +(1) 如果æž�构函数抛出异常,则异常点之å�Žçš„程åº�ä¸�会执行,如果æž�构函数在异常点之å�Žæ‰§è¡Œäº†æŸ�些必è¦�的动作比如释放æŸ�些资æº�,则这些动作ä¸�会执行,会造æˆ�诸如资æº�泄æ¼�的问题。 + +(2) 通常异常å�‘生时,c++的机制会调用已ç»�构造对象的æž�构函数æ�¥é‡Šæ”¾èµ„æº�,此时若æž�构函数本身也抛出异常,则å‰�一个异常尚未处ç�†ï¼Œå�ˆæœ‰æ–°çš„异常,会造æˆ�程åº�崩溃的问题。 + + +构造函数和æž�构函数中调用虚函数å�—? + + +指针和引用的区别 +指针ä¿�存的是所指对象的地å�€ï¼Œå¼•用是所指对象的别å��,指针需è¦�通过解引用间接访问,而引用是直接访问; +指针å�¯ä»¥æ”¹å�˜åœ°å�€ï¼Œä»Žè€Œæ”¹å�˜æ‰€æŒ‡çš„对象,而引用必须从一而终; +引用在定义的时候必须åˆ�始化,而指针则ä¸�需è¦�ï¼› +指针有指å�‘常é‡�的指针和指针常é‡�,而引用没有常é‡�引用; +指针更ç�µæ´»ï¼Œç”¨çš„好å¨�力无比,用的ä¸�好处处是å�‘,而引用用起æ�¥åˆ™å®‰å…¨å¤šäº†ï¼Œä½†æ˜¯æ¯”较死æ�¿ã€‚ + + +指针与数组å�ƒä¸�万缕的è�”ç³» +一个一维int数组的数组å��实际上是一个int* const 类型; +一个二维int数组的数组å��实际上是一个int (*const p)[n]; +数组å��å�šå�‚数会退化为指针,除了sizeof + + +智能指针是怎么实现的?什么时候改å�˜å¼•用计数? +构造函数中计数åˆ�始化为1ï¼› +æ‹·è´�构造函数中计数值加1ï¼› +赋值è¿�算符中,左边的对象引用计数å‡�一,å�³è¾¹çš„对象引用计数加一; +æž�构函数中引用计数å‡�一; +在赋值è¿�算符和æž�构函数中,如果å‡�一å�Žä¸º0,则调用delete释放对象。 +share_prt与weak_ptr的区别? + +//share_ptrå�¯èƒ½å‡ºçŽ°å¾ªçŽ¯å¼•ç”¨ï¼Œä»Žè€Œå¯¼è‡´å†…å­˜æ³„éœ² +class A +{ +public: + share_ptr p; +}; +class B +{ +public: + share_ptr p; +} +int main() +{ + while(true) + { + share_prt pa(new A()); //pa的引用计数åˆ�始化为1 + share_prt pb(new B()); //pb的引用计数åˆ�始化为1 + pa->p = pb; //pb的引用计数å�˜ä¸º2 + pb->p = pa; //pa的引用计数å�˜ä¸º2 + } + //å�‡è®¾pa先离开,引用计数å‡�一å�˜ä¸º1,ä¸�为0å› æ­¤ä¸�会调用class Açš„æž�构函数,因此其æˆ�员p也ä¸�会被æž�构,pb的引用计数ä»�然为2ï¼› + //å�Œç�†pb离开的时候,引用计数也ä¸�能å‡�到0 + return 0; +} +/* +** weak_ptr是一ç§�弱引用指针,其存在ä¸�会影å“�引用计数,从而解决循环引用的问题 +*/ + + + +C++å››ç§�类型转æ�¢ : static_cast, dynamic_cast, const_cast, reinterpret_cast +const_cast用于将constå�˜é‡�转为é�žconst +static_cast用的最多,对于å�„ç§�éš�å¼�转æ�¢ï¼Œé�žconst转const,void*转指针等, static_cast能用于多æ€�想上转化,如果å�‘下转能æˆ�功但是ä¸�安全,结果未知; +dynamic_cast用于动æ€�类型转æ�¢ã€‚å�ªèƒ½ç”¨äºŽå�«æœ‰è™šå‡½æ•°çš„类,用于类层次间的å�‘上和å�‘下转化。å�ªèƒ½è½¬æŒ‡é’ˆæˆ–引用。å�‘下转化时,如果是é�žæ³•的对于指针返回NULL,对于引用抛异常。è¦�深入了解内部转æ�¢çš„原ç�†ã€‚ +reinterpret_cast几乎什么都å�¯ä»¥è½¬ï¼Œæ¯”如将int转指针,å�¯èƒ½ä¼šå‡ºé—®é¢˜ï¼Œå°½é‡�少用; +为什么ä¸�使用C的强制转æ�¢ï¼ŸC的强制转æ�¢è¡¨é�¢ä¸Šçœ‹èµ·æ�¥åŠŸèƒ½å¼ºå¤§ä»€ä¹ˆéƒ½èƒ½è½¬ï¼Œä½†æ˜¯è½¬åŒ–ä¸�够明确,ä¸�能进行错误检查,容易出错。 + + +内存对é½�的原则 +从0ä½�置开始存储; +å�˜é‡�存储的起始ä½�置是该å�˜é‡�大å°�的整数å€�ï¼› +结构体总的大å°�是其最大元素的整数å€�,ä¸�足的å�Žé�¢è¦�è¡¥é½�ï¼› +结构体中包å�«ç»“构体,从结构体中最大元素的整数å€�开始存; +如果加入pragma pack(n) ,å�–nå’Œå�˜é‡�自身大å°�较å°�的一个。 + + +内è�”函数有什么优点?内è�”函数与å®�定义的区别? +å®�定义在预编译的时候就会进行å®�替æ�¢ï¼› +内è�”函数在编译阶段,在调用内è�”函数的地方进行替æ�¢ï¼Œå‡�少了函数的调用过程,但是使得编译文件å�˜å¤§ã€‚因此,内è�”函数适å�ˆç®€å�•函数,对于å¤�æ�‚函数,å�³ä½¿å®šä¹‰äº†å†…è�”编译器å�¯èƒ½ä¹Ÿä¸�会按照内è�”的方å¼�进行编译。 +内è�”函数相比å®�定义更安全,内è�”函数å�¯ä»¥æ£€æŸ¥å�‚数,而å®�定义å�ªæ˜¯ç®€å�•的文本替æ�¢ã€‚因此推è��使用内è�”函数,而ä¸�是å®�定义。 +使用å®�定义函数è¦�特别注æ„�给所有å�•元都加上括å�·ï¼Œ#define MUL(a, b) a b,这很å�±é™©ï¼Œæ­£ç¡®å†™æ³•:#define MUL(a, b) ((a) (b)) + + +C++内存管ç�† +C++内存分为那几å�—?(堆区,栈区,常é‡�区,é�™æ€�和全局区) +æ¯�å�—存储哪些å�˜é‡�? +学会è¿�移,å�¯ä»¥è¯´åˆ°malloc,从malloc说到æ“�作系统的内存管ç�†ï¼Œè¯´é�“内核æ€�和用户æ€�,然å�Žå°±ä»€ä¹ˆé«˜ç«¯å†…存,slab层,伙伴算法,VMAå�¯ä»¥å·´æ‹‰å·´æ‹‰äº†ï¼ŒæŽ¥ç�€å�¯ä»¥è¿�移到fork()。 +STL里的内存池实现 +STL内存分é…�分为一级分é…�器和二级分é…�器,一级分é…�器就是采用malloc分é…�内存,二级分é…�器采用内存池。 + + +二级分é…�器设计的é�žå¸¸å·§å¦™ï¼Œåˆ†åˆ«ç»™8k,16k,..., 128k等比较å°�的内存片都维æŒ�一个空闲链表,æ¯�个链表的头节点由一个数组æ�¥ç»´æŠ¤ã€‚需è¦�分é…�内存时从å�ˆé€‚大å°�的链表中å�–一å�—下æ�¥ã€‚å�‡è®¾éœ€è¦�分é…�一å�—10K的内存,那么就找到最å°�的大于等于10kçš„å�—,也就是16K,从16K的空闲链表里å�–出一个用于分é…�。释放该å�—内存时,将内存节点归还给链表。 +如果è¦�分é…�的内存大于128K则直接调用一级分é…�器。 +为了节çœ�ç»´æŒ�链表的开销,采用了一个union结构体,分é…�器使用union里的next指针æ�¥æŒ‡å�‘下一个节点,而用户则使用union的空指针æ�¥è¡¨ç¤ºè¯¥èŠ‚ç‚¹çš„åœ°å�€ã€‚ + + +STL里setå’Œmap是基于什么实现的。红黑树的特点? +setå’Œmap都是基于红黑树实现的。 +红黑树是一ç§�平衡二å�‰æŸ¥æ‰¾æ ‘,与AVL树的区别是什么?AVL树是完全平衡的,红黑树基本上是平衡的。 +为什么选用红黑数呢?因为红黑数是平衡二å�‰æ ‘,其æ�’入和删除的效率都是N(logN),与AVL相比红黑数æ�’入和删除最多å�ªéœ€è¦�3次旋转,而AVL树为了维æŒ�其完全平衡性,在å��的情况下è¦�旋转的次数太多。 +红黑树的定义: +(1) 节点是红色或者黑色; +(2) 父节点是红色的è¯�,å­�节点就ä¸�能为红色; +(3) 从根节点到æ¯�个页å­�节点路径上黑色节点的数é‡�相å�Œï¼› +(4) 根是黑色的,NULL节点被认为是黑色的。 + + +STL里的其他数æ�®ç»“构和算法实现也è¦�清楚 +这个问题,把STLæº�ç �剖æž�好好看看,ä¸�ä»…é�¢è¯•ä¸�慌,自己对STL的使用也会上å�‡ä¸€ä¸ªå±‚次。 + + +必须在构造函数åˆ�始化å¼�里进行åˆ�始化的数æ�®æˆ�员有哪些 +(1) 常é‡�æˆ�员,因为常é‡�å�ªèƒ½åˆ�始化ä¸�能赋值,所以必须放在åˆ�始化列表里é�¢ +(2) 引用类型,引用必须在定义的时候åˆ�始化,并且ä¸�能é‡�新赋值,所以也è¦�写在åˆ�始化列表里é�¢ +(3) 没有默认构造函数的类类型,因为使用åˆ�始化列表å�¯ä»¥ä¸�必调用默认构造函数æ�¥åˆ�始化,而是直接调用拷è´�构造函数åˆ�始化 + + +模æ�¿ç‰¹åŒ– +(1) 模æ�¿ç‰¹åŒ–分为全特化和å��特化,模æ�¿ç‰¹åŒ–的目的就是对于æŸ�一ç§�å�˜é‡�类型具有ä¸�å�Œçš„实现,因此需è¦�特化版本。例如,在STL里迭代器为了适应原生指针就将原生指针进行特化。 + + +定ä½�内存泄露 +(1)在windowså¹³å�°ä¸‹é€šè¿‡CRT中的库函数进行检测; +(2)在å�¯èƒ½æ³„æ¼�的调用å‰�å�Žç”Ÿæˆ�å�—的快照,比较å‰�å�Žçš„状æ€�,定ä½�泄æ¼�çš„ä½�ç½® +(3)Linux下通过工具valgrind检测 + + +手写strcpy +``` +char strcpy(char dst, const char src) +{ +assert(dst); +assert(src); +char ret = dst; +while(( dst++ = src++) != '\0'); +return ret; +} +//该函数是没有考虑é‡�å� çš„ + + +char strcpy(char dst, const char src) +{ +assert((dst != NULL) && (src != NULL)); +char ret = dst; +int size = strlen(src) + 1; +if(dst > src || dst < src + len) +{ +dst = dst + size - 1; +src = src + size - 1; +while(size--) +{ +dst-- = src--; +} +} +else +{ +while(size--) +{ +dst++ = src++; +} +} +return ret; +} +- **手写memcpy函数** + + +void memcpy(void dst, const void src, size_t size) +{ +if(dst == NULL || src == NULL) +{ +return NULL; +} +void res = dst; +char pdst = (char )dst; +char psrc = (char )src; +if(pdst > psrc && pdst < psrc + size) //é‡�å�  +{ + pdst = pdst + size - 1; + psrc = pdst + size - 1; + while(size--) + { + *pdst-- = *psrc--; + } +} +else //æ— é‡�å�  +{ + while(size--) + { + *dst++ = *src++; + } +} +return ret; + + +} +- **手写strcat函数** + + +char strcat(char dst, const char src) +{ +char ret = dst; +while(*dst != '\0') + ++dst; +while((*dst++ = *src) != '\0'); +return ret; + + +} +- **手写strcmp函数** + + +int strcmp(const char str1, const char str2) +{ +while(*str1 == *str2 && *str1 != '\0') +{ + ++str1; + ++str2; +} +return *str1 - *str2; + + +} æ•°æ�®ç»“构与算法 + +这一å�—考察范围太广,主è¦�é� å¤šåˆ·é¢˜å�§ï¼Œç‰›å®¢ç½‘,剑指OFFER,LeetCode等。 Hash表 +Hash表实现(拉链和分散地å�€ï¼‰ +Hash策略常è§�的有哪些? +STL中hash_map扩容å�‘生什么? +(1) 创建一个新桶,该桶是原æ�¥æ¡¶ä¸¤å€�大最接近的质数(判断n是ä¸�是质数的方法:用n除2到$sqrt(n)$范围内的数) ï¼› +(2) 将原æ�¥æ¡¶é‡Œçš„æ•°é€šè¿‡æŒ‡é’ˆçš„转æ�¢ï¼Œæ�’入到新桶中(注æ„�STL这里å�šçš„很精细,没有直接将数æ�®ä»Žæ—§æ¡¶é��历拷è´�æ•°æ�®æ�’入到新桶,而是通过指针转æ�¢) +(3) 通过swap函数将新桶和旧桶交æ�¢ï¼Œé”€æ¯�新桶。 æ ‘ +二å�‰æ ‘结构,二å�‰æŸ¥æ‰¾æ ‘实现; +二å�‰æ ‘的六ç§�é��历; +二å�‰æ ‘的按层é��历; +递归是解决二å�‰æ ‘相关问题的神级方法; +æ ‘çš„å�„ç§�常è§�算法题( http://blog.csdn.net/xiajun07061225/article/details/12760493)ï¼› +什么是红黑树? +节点为红色或者黑色; +根节点为黑色; +从根节点到æ¯�个å�¶å­�节点ç»�过的黑色节点个数的和相å�Œï¼› +如果父节点为红色,那么其å­�节点就ä¸�能为红色。 + +红黑树与AVL树的区别 +红黑树与AVL树都是平衡树,但是AVL是完全平衡的(平衡就是值树中任æ„�节点的左å­�æ ‘å’Œå�³å­�树高度差ä¸�超过1)ï¼› +红黑树效率更高,因为AVL为了ä¿�è¯�其完全平衡,æ�’入和删除的时候在最å��的情况下è¦�旋转logN次,而红黑树æ�’入和删除的旋转次数è¦�比AVL少。 + +Trieæ ‘(字典树) +æ¯�个节点ä¿�存一个字符 +根节点ä¸�ä¿�存字符 +æ¯�个节点最多有n个å­�节点(n是所有å�¯èƒ½å‡ºçŽ°å­—ç¬¦çš„ä¸ªæ•°) +查询的å¤�æ�‚父为O(k),k为查询字符串长度 链表 + +链表和æ�’入和删除,å�•å�‘å’Œå�Œå�‘链表都è¦�会 +链表的问题考虑多个指针和递归 +(1) å��å�‘打å�°é“¾è¡¨(递归) +(2) 打å�°å€’数第K个节点(å‰�å�ŽæŒ‡é’ˆ) +(3) 链表是å�¦æœ‰çޝ(快慢指针)等等。b ggg 栈和队列 +队列和栈的区别 ?(从实现,应用,自身特点多个方é�¢æ�¥é˜�述,ä¸�è¦�å�ªè¯´ä¸€ä¸ªå…ˆå…¥å…ˆå‡ºï¼Œå…ˆå…¥å�Žå‡ºï¼Œè¿™ä¸ªä½ ä¼šåˆ«äººä¹Ÿä¼šï¼Œè¦�展现出你比别人掌æ�¡çš„æ›´æ·±) +典型的应用场景 æµ·é‡�æ•°æ�®é—®é¢˜ +å��亿整数(éš�机生æˆ�,å�¯é‡�å¤�)中å‰�K最大的数 +类似问题的解决方法æ€�路:首先哈希将数æ�®åˆ†æˆ�N个文件,然å�Žå¯¹æ¯�个文件建立K个元素最å°�/大堆(根æ�®è¦�求æ�¥é€‰æ‹©ï¼‰ã€‚最å�Žå°†æ–‡ä»¶ä¸­å‰©ä½™çš„æ•°æ�’入堆中,并维æŒ�K个元素的堆。最å�Žå°†N个堆中的元素å�ˆèµ·æ�¥åˆ†æž�。å�¯ä»¥é‡‡ç”¨å½’并的方å¼�æ�¥å�ˆå¹¶ã€‚在归并的时候为了æ��高效率还需è¦�建一个N个元素构æˆ�的最大堆,先用N个堆中的最大值填充这个堆,然å�Žå°±æ˜¯å¼¹å‡ºæœ€å¤§å€¼ï¼ŒæŒ‡é’ˆå�Žç§»çš„æ“�作了。当然这ç§�问题在现在的互è�”网技术中,一般就用map-reduce框架æ�¥å�šäº†ã€‚ +大数æ�®æŽ’åº�相å�Œçš„æ€�路:先哈希(哈希是好处是分布å�‡åŒ€ï¼Œç›¸å�Œçš„æ•°åœ¨å�Œä¸€ä¸ªæ–‡ä»¶ä¸­ï¼‰ï¼Œç„¶å�Žå°�文件装入内存快排,排åº�结果输出到文件。最å�Žå»ºå †å½’并。 +å��亿整数(éš�机生æˆ�,å�¯é‡�å¤�)中出现频率最高的一å�ƒä¸ª 排åº�算法 +排åº�算法当然是基础内容了,必须至少能快速写出,快排,建堆,和归并 +æ¯�ç§�算法的时间空间å¤�æ�‚度,最好最差平å�‡æƒ…况 ä½�è¿�ç®— 布隆过滤器 几å��亿个数ç»�常è¦�查找æŸ�一个数在ä¸�在里é�¢ï¼Œä½¿ç”¨å¸ƒéš†è¿‡æ»¤å™¨ï¼Œå¸ƒéš†è¿‡æ»¤å™¨çš„原ç�†ã€‚布隆过滤器å�¯èƒ½å‡ºçŽ°è¯¯åˆ¤ï¼Œæ€Žä¹ˆä¿�è¯�无误差? 网络与TCP/IP +TCP与UDP之间的区别 +(1) IP首部,TCP首部,UDP首部 +(2) TCPå’ŒUDP区别 +(3) TCPå’ŒUDP应用场景 +(4) 如何实现å�¯é� çš„UDP +TCP三次æ�¡æ‰‹ä¸Žå››æ¬¡æŒ¥æ‰‹ +详细说明TCP状æ€�è¿�移过程 +(1) 三次æ�¡æ‰‹å’Œå››æ¬¡æŒ¥æ‰‹çжæ€�å�˜åŒ–ï¼› +(2) 2MSL是什么状æ€�?作用是什么? +TCP相关技术 +1. TCPé‡�å�‘机制,Nagle算法 +2. TCP的拥塞控制使用的算法和具体过程 +3. TCP的窗å�£æ»‘动 +TCP客户与æœ�务器模型,用到哪些函数 +UDP客户与æœ�务器模型,用到哪些函数 +域å��è§£æž�过程,ARP的机制,RARP的实现 +1. RARP用于无盘æœ�务器,开机å�Žé€šè¿‡å�‘é€�RARP包给RARPæœ�务器,通过mac地å�€å¾—到IP地å�€ +Pingå’ŒTraceRoute实现原ç�† +(1) Ping是通过å�‘é€�ICMP报文回显请求实现。 +(2) TraceRoute通过å�‘é€�UDP报文,设置目的端å�£ä¸ºä¸€ä¸ªä¸�å�¯èƒ½çš„值,将IP首部中的TTL分别设置从1到N,æ¯�次é€�个增加,如果收到端å�£ä¸�å�¯è¾¾ï¼Œè¯´æ˜Žåˆ°è¾¾ç›®çš„主机,如果是因为TTL跳数超过,路由器会å�‘é€�主机ä¸�å�¯è¾¾çš„ICMP报文。 +HTTP http/https 1.0ã€�1.1ã€�2.0 + +1. http的主è¦�特点: +简å�•快速: 当客户端å�‘æœ�务器端å�‘é€�请求时,å�ªæ˜¯ç®€å�•的填写请求路径和请求方法å�³å�¯ï¼Œç„¶å�Žå°±å�¯ä»¥é€šè¿‡æµ�览器或其他方å¼�将该请求å�‘é€�就行了 +ç�µæ´»ï¼š HTTP å��è®®å…�许客户端和æœ�务器端传输任æ„�类型任æ„�æ ¼å¼�的数æ�®å¯¹è±¡ +无连接: 无连接的å�«ä¹‰æ˜¯é™�制æ¯�次连接å�ªå¤„ç�†ä¸€ä¸ªè¯·æ±‚。æœ�务器处ç�†å®Œå®¢æˆ·çš„请求,并收到客户的应答å�Žï¼Œå�³æ–­å¼€è¿žæŽ¥ï¼Œé‡‡ç”¨è¿™ç§�æ–¹å¼�å�¯ä»¥èŠ‚çœ�传输时间。(当今多数æœ�务器支æŒ�Keep-Alive功能,使用æœ�务器支æŒ�长连接,解决无连接的问题) +无状æ€�: 无状æ€�是指å��议对于事务处ç�†æ²¡æœ‰è®°å¿†èƒ½åŠ›ï¼Œæœ�务器ä¸�知é�“客户端是什么状æ€�。å�³å®¢æˆ·ç«¯å�‘é€�HTTP请求å�Žï¼Œæœ�务器根æ�®è¯·æ±‚,会给我们å�‘é€�æ•°æ�®ï¼Œå�‘é€�完å�Žï¼Œä¸�会记录信æ�¯ã€‚(使用 cookie 机制å�¯ä»¥ä¿�æŒ� session,解决无状æ€�的问题) +2. http1.1的特点 +aã€�默认æŒ�久连接节çœ�通信é‡�,å�ªè¦�客户端æœ�务端任æ„�一端没有明确æ��出断开TCP连接,就一直ä¿�æŒ�连接,å�¯ä»¥å�‘é€�多次HTTP请求 +bã€�管线化,客户端å�¯ä»¥å�Œæ—¶å�‘出多个HTTP请求,而ä¸�用一个个等待å“�应 +cã€�断点续传ftghh +3. http2.0的特点 +aã€�HTTP/2采用二进制格å¼�而é�žæ–‡æœ¬æ ¼å¼� +bã€�HTTP/2是完全多路å¤�用的,而é�žæœ‰åº�并阻塞的——å�ªéœ€ä¸€ä¸ªHTTP连接就å�¯ä»¥å®žçŽ°å¤šä¸ªè¯·æ±‚å“�应 +cã€�使用报头压缩,HTTP/2é™�低了开销 +dã€�HTTP/2让æœ�务器å�¯ä»¥å°†å“�应主动“推é€�â€�到客户端缓存中 get/post 区别 + +区别一: +geté‡�点在从æœ�务器上获å�–资æº�,posté‡�点在å�‘æœ�务器å�‘é€�æ•°æ�®ï¼› +区别二: +get传输数æ�®æ˜¯é€šè¿‡URL请求,以field(字段)= value的形å¼�,置于URLå�Žï¼Œå¹¶ç”¨"?"连接,多个请求数æ�®é—´ç”¨"&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是å�¯è§�的; +post传输数æ�®é€šè¿‡Httpçš„post机制,将字段与对应值å°�存在请求实体中å�‘é€�ç»™æœ�务器,这个过程对用户是ä¸�å�¯è§�的; +区别三: +Get传输的数æ�®é‡�å°�,因为å�—URL长度é™�制,但效率较高; +Postå�¯ä»¥ä¼ è¾“大é‡�æ•°æ�®ï¼Œæ‰€ä»¥ä¸Šä¼ æ–‡ä»¶æ—¶å�ªèƒ½ç”¨Postæ–¹å¼�ï¼› +区别四: +get是ä¸�安全的,因为URL是å�¯è§�的,å�¯èƒ½ä¼šæ³„露ç§�密信æ�¯ï¼Œå¦‚密ç �等; +post较get安全性较高; + 返回状æ€�ç � + +200:请求被正常处ç�† +204:请求被å�—ç�†ä½†æ²¡æœ‰èµ„æº�å�¯ä»¥è¿”回 +206:客户端å�ªæ˜¯è¯·æ±‚资æº�的一部分,æœ�务器å�ªå¯¹è¯·æ±‚的部分资æº�执行GET方法,相应报文中通过Content-Range指定范围的资æº�。 +301:永久性é‡�定å�‘ +302:临时é‡�定å�‘ +303:与302状æ€�ç �有相似功能,å�ªæ˜¯å®ƒå¸Œæœ›å®¢æˆ·ç«¯åœ¨è¯·æ±‚一个URI的时候,能通过GET方法é‡�定å�‘到å�¦ä¸€ä¸ªURI上 +304:å�‘é€�附带æ�¡ä»¶çš„请求时,æ�¡ä»¶ä¸�满足时返回,与é‡�定å�‘æ— å…³ +307:临时é‡�定å�‘,与302类似,å�ªæ˜¯å¼ºåˆ¶è¦�求使用POST方法 +400:请求报文语法有误,æœ�务器无法识别 +401:请求需è¦�认è¯� +403:请求的对应资æº�ç¦�止被访问 +404:æœ�务器无法找到对应资æº� +500:æœ�务器内部错误 +503:æœ�务器正忙 + http å��议头相关 + +httpæ•°æ�®ç”±è¯·æ±‚行,首部字段,空行,报文主体四个部分组æˆ� +首部字段分为:通用首部字段,请求首部字段,å“�应首部字段,实体首部字段 https与http的区别?如何实现加密传输? +https就是在http与传输层之间加上了一个SSL +对称加密与é�žå¯¹ç§°åР坆 æµ�览器中输入一个URLå�‘生什么,用到哪些å��议? æµ�览器中输入URL,首先æµ�览器è¦�å°†URLè§£æž�为IP地å�€ï¼Œè§£æž�域å��å°±è¦�用到DNSå��议,首先主机会查询DNS的缓存,如果没有就给本地DNSå�‘é€�查询请求。DNS查询分为两ç§�æ–¹å¼�,一ç§�是递归查询,一ç§�是迭代查询。如果是迭代查询,本地的DNSæœ�务器,å�‘根域å��æœ�务器å�‘é€�查询请求,根域å��æœ�务器告知该域å��的一级域å��æœ�务器,然å�Žæœ¬åœ°æœ�务器给该一级域å��æœ�务器å�‘é€�查询请求,然å�Žä¾�次类推直到查询到该域å��çš„IP地å�€ã€‚DNSæœ�务器是基于UDP的,因此会用到UDPå��议。 +得到IP地å�€å�Žï¼Œæµ�览器就è¦�与æœ�务器建立一个http连接。因此è¦�用到httpå��议,httpå��议报文格å¼�上é�¢å·²ç»�æ��到。http生æˆ�一个get请求报文,将该报文传给TCP层处ç�†ã€‚如果采用https还会先对httpæ•°æ�®è¿›è¡ŒåŠ å¯†ã€‚TCP层如果有需è¦�先将HTTPæ•°æ�®åŒ…分片,分片ä¾�æ�®è·¯å¾„MTUå’ŒMSS。TCP的数æ�®åŒ…ç„¶å�Žä¼šå�‘é€�ç»™IP层,用到IPå��议。IP层通过路由选路,一跳一跳å�‘é€�到目的地å�€ã€‚当然在一个网段内的寻å�€æ˜¯é€šè¿‡ä»¥å¤ªç½‘å��议实现(也å�¯ä»¥æ˜¯å…¶ä»–物ç�†å±‚å��议,比如PPP,SLIP),以太网å��议需è¦�直到目的IP地å�€çš„物ç�†åœ°å�€ï¼Œæœ‰éœ€è¦�ARPå��议。 安全相关 +SQL注入 +XSS +RCFS +APR欺骗 æ•°æ�®åº“ +SQL语言(内外连接,å­�查询,分组,è�šé›†ï¼ŒåµŒå¥—,逻辑) +MySQL索引方法?索引的优化? +InnoDB与MyISAM区别? +事务的ACID +事务的四个隔离级别 +查询优化(从索引上优化,从SQL语言上优化) +B-与B+树区别? +MySQLçš„è�”å�ˆç´¢å¼•(å�ˆç§°å¤šåˆ—索引)是什么?生效的æ�¡ä»¶ï¼Ÿ +分库分表 Linux 进程与线程 (1) 进程与线程区别? +(2) 线程比进程具有哪些优势? +(3) 什么时候用多进程?什么时候用多线程? +(4) LINUX中进程和线程使用的几个函数? +(5) 线程å�Œæ­¥ï¼Ÿ +在Windows下线程å�Œæ­¥çš„æ–¹å¼�有:互斥é‡�,信å�·é‡�,事件,关键代ç �段 +在Linux下线程å�Œæ­¥çš„æ–¹å¼�有:互斥é”�,自旋é”�,读写é”�,å±�éšœ(å¹¶å�‘完æˆ�å�Œä¸€é¡¹ä»»åŠ¡æ—¶ï¼Œå±�障的作用特别好使) +知é�“这些é”�之间的区别,使用场景? 进程间通讯方å¼� + +管é�“( pipe ) :管é�“是一ç§�å�Šå�Œå·¥çš„通信方å¼�,数æ�®å�ªèƒ½å�•å�‘æµ�动,而且å�ªèƒ½åœ¨å…·æœ‰äº²ç¼˜å…³ç³»çš„进程间使用。进程的亲缘关系通常是指父å­�进程关系。 + +命å��管é�“ (FIFO) : 有å��管é�“也是å�Šå�Œå·¥çš„通信方å¼�,但是它å…�许无亲缘关系进程间的通信。 + +ä¿¡å�·é‡� :信å�·é‡�用于实现进程间的互斥与å�Œæ­¥ï¼Œè€Œä¸�是用于存储进程间通信数æ�®ï¼Œæœ‰XSIä¿¡å�·é‡�å’ŒPOSIXä¿¡å�·é‡�,POSIXä¿¡å�·é‡�更加完善。 + +消æ�¯é˜Ÿåˆ—( message queue ) : 消æ�¯é˜Ÿåˆ—是由消æ�¯çš„链表,存放在内核中并由消æ�¯é˜Ÿåˆ—标识符标识。消æ�¯é˜Ÿåˆ—å…‹æœ�了信å�·ä¼ é€’ä¿¡æ�¯å°‘ã€�管é�“å�ªèƒ½æ‰¿è½½æ— æ ¼å¼�字节æµ�以å�Šç¼“冲区大å°�å�—é™�等缺点。 + +共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都å�¯ä»¥è®¿é—®ã€‚共享内存是最快的 IPC æ–¹å¼�,它是针对其他进程间通信方å¼�è¿�行效率低而专门设计的。它往往与其他通信机制,如信å�·ä¸¤ï¼Œé…�å�ˆä½¿ç”¨ï¼Œæ�¥å®žçŽ°è¿›ç¨‹é—´çš„å�Œæ­¥å’Œé€šä¿¡ã€‚(原ç�†ä¸€å®šè¦�清楚,常考) + +ä¿¡å�· ( sinal ) : ä¿¡å�·æ˜¯ä¸€ç§�比较å¤�æ�‚的通信方å¼�,用于通知接收进程æŸ�个事件已ç»�å�‘生,常è§�的信å�·ã€‚ + +套接字( socket ) : 套解å�£ä¹Ÿæ˜¯ä¸€ç§�进程间通信机制,与其他通信机制ä¸�å�Œçš„æ˜¯ï¼Œå®ƒå�¯ç”¨äºŽä¸�å�Œå�Šå…¶é—´çš„进程通信。 +匿å��管é�“与命å��管é�“的区别 :匿å��管é�“å�ªèƒ½åœ¨å…·æœ‰å…¬å…±ç¥–先的两个进程间使用。 +共享文件映射mmap +mmap建立进程空间到文件的映射,在建立的时候并ä¸�直接将文件拷è´�到物ç�†å†…存,å�Œæ ·é‡‡ç”¨ç¼ºé¡µç»ˆç«¯ã€‚mmap映射一个具体的文件å�¯ä»¥å®žçް任æ„�进程间共享内存,映射一个匿å��文件,å�¯ä»¥å®žçŽ°çˆ¶å­�进程间共享内存。 +常è§�的信å�·æœ‰å“ªäº›ï¼Ÿ :SIGINT,SIGKILL(ä¸�能被æ�•获),SIGTERM(å�¯ä»¥è¢«æ�•获),SIGSEGV,SIGCHLD,SIGALRM 内存管ç�† 1. 虚拟内存的作用? +2. 虚拟内存的实现? +3. æ“�作系统层é�¢å¯¹å†…存的管ç�†ï¼Ÿ +4. 内存池的作用?STL里 内存池如何实现 ? +5. 进程空间和内核空间对内存的管ç�†ä¸�å�Œï¼Ÿ +6. Linuxçš„slab层,VAM? +7. 伙伴算法 +8. 高端内存 进程调度 1. Linux进程分为两ç§�,实时进程和é�žå®žæ—¶è¿›ç¨‹ï¼› +2. 优先级分为é�™æ€�优先级和动æ€�优先级,优先级的范围; +3. 调度策略,FIFO,LRU,时间片轮转 +4. 交互进程通过平å�‡ç�¡çœ æ—¶é—´è€Œè¢«å¥–励; æ­»é”� (1) æ­»é”�产生的æ�¡ä»¶ï¼› +(2) æ­»é”�çš„é�¿å…�ï¼› 命令行 +Linux命令 在一个文件中,倒åº�打å�°ç¬¬äºŒè¡Œå‰�100个大写字æ¯� +``` + + +cat filename | head -n 2 | tail -n 1 | grep '[[:upper:]]' -o | tr -d '\n'| cut -c 1-100 | rev +与CPU,内存,ç£�盘相关的命令(top,free, df, fdisk) +网络相关的命令netstat,tcpdumpç­‰ +sed, awk, grep三个超强大的命å��,分别用与格å¼�化修改,统计,和正则查找 +ipcså’Œipcrm命令 +查找当å‰�目录以å�Šå­—æ¯�下以.c结尾的文件,且文件中包å�«"hello world"的文件的路径 +创建定时任务 IO模型 +五ç§�IO模型: 阻塞IO,é�žé˜»å¡žIO,IOå¤�用,信å�·é©±åЍå¼�IO,异步IO +select,poll,epoll的区别 +select: 是最åˆ�解决IO阻塞问题的方法。用结构体fd_setæ�¥å‘Šè¯‰å†…核监å�¬å¤šä¸ªæ–‡ä»¶æ��述符,该结构体被称为æ��述符集。由数组æ�¥ç»´æŒ�哪些æ��述符被置ä½�了。对结构体的æ“�作å°�装在三个å®�定义中。通过轮寻æ�¥æŸ¥æ‰¾æ˜¯å�¦æœ‰æ��述符è¦�被处ç�†ï¼Œå¦‚果没有返回 +存在的问题: +1. 内置数组的形å¼�使得select的最大文件数å�—é™�与FD_SIZEï¼› +2. æ¯�次调用selectå‰�都è¦�é‡�æ–°åˆ�始化æ��述符集,将fd从用户æ€�æ‹·è´�到内核æ€�,æ¯�次调用selectå�Žï¼Œéƒ½éœ€è¦�å°†fd从内核æ€�æ‹·è´�到用户æ€�ï¼› +3. 轮寻排查当文件æ��述符个数很多时,效率很低; poll: 通过一个å�¯å�˜é•¿åº¦çš„æ•°ç»„解决了select文件æ��述符å�—é™�的问题。数组中元素是结构体,该结构体ä¿�å­˜æ��述符的信æ�¯ï¼Œæ¯�增加一个文件æ��述符就å�‘数组中加入一个结构体,结构体å�ªéœ€è¦�æ‹·è´�一次到内核æ€�。poll解决了selecté‡�å¤�åˆ�始化的问题。轮寻排查的问题未解决。 +epoll: 轮寻排查所有文件æ��述符的效率ä¸�高,使æœ�务器并å�‘能力å�—é™�。因此,epoll采用å�ªè¿”回状æ€�å�‘生å�˜åŒ–的文件æ��述符,便解决了轮寻的瓶颈。 +为什么使用IO多路å¤�用,最主è¦�的原因是什么? +epoll有两ç§�触å�‘模å¼�?这两ç§�触å�‘模å¼�有什么区别?编程的时候有什么区别? +上一题中编程的时候有什么区别,是在边缘触å�‘的时候è¦�把套接字中的数æ�®è¯»å¹²å‡€ï¼Œé‚£ä¹ˆå½“有多个套接字时,在读的套接字一直ä¸�å�œçš„æœ‰æ•°æ�®åˆ°è¾¾ï¼Œå¦‚何ä¿�è¯�其他套接字ä¸�被饿死(é�¢è¯•网易游æˆ�的时候问的一个问题,答ä¸�上æ�¥ï¼Œå�°è±¡è´¼æ·±åˆ»)。 +1. select/poll/epoll区别 +2. 几ç§�网络æœ�务器模型的介ç»�与比较 +3. epoll为什么这么快 (æ�žæ‡‚这篇文章,关于IOå¤�用的问题就信手拈æ�¥äº†) 线程池 Linuxçš„API +fork与vfork区别 +forkå’Œvfork都用于创建å­�进程。但是vfork创建å­�进程å�Žï¼Œçˆ¶è¿›ç¨‹é˜»å¡žï¼Œç›´åˆ°å­�进程调用exit()或者excle()。 +对于内核中过程fork通过调用clone函数,然å�Žclone函数调用do_fork()。do_fork()中调用copy_process()函数先å¤�制task_struct结构体,然å�Žå¤�制其他关于内存,文件,寄存器等信æ�¯ã€‚fork采用写时拷è´�技术,因此å­�进程和父进程的页表指å�‘相å�Œçš„页框。但是vforkä¸�需è¦�æ‹·è´�页表,因为父进程会一直阻塞,直接使用父进程页表。 +exit()与_exit()区别 +exit()清ç�†å�Žè¿›å…¥å†…核,_exit()直接陷入内核。 +孤儿进程与僵死进程 +1. 孤儿进程是怎么产生的? +2. 僵死进程是怎么产生的? +3. 僵死进程的å�±å®³ï¼Ÿ +4. 如何é�¿å…�僵死进程的产生? +Linux是如何é�¿å…�内存碎片的 +1. 伙伴算法,用于管ç�†ç‰©ç�†å†…存,é�¿å…�内存碎片; +2. 高速缓存Slab层用于管ç�†å†…核分é…�内存,é�¿å…�碎片。 +共享内存的实现原ç�†ï¼Ÿ +共享内存实现分为两ç§�æ–¹å¼�一ç§�是采用mmap,å�¦ä¸€ç§�是采用XSI机制中的共享内存方法。mmap是内存文件映射,将一个文件映射到进程的地å�€ç©ºé—´ï¼Œç”¨æˆ·è¿›ç¨‹çš„地å�€ç©ºé—´çš„管ç�†æ˜¯é€šè¿‡vm_area_struct结构体进行管ç�†çš„。mmap通过映射一个相å�Œçš„æ–‡ä»¶åˆ°ä¸¤ä¸ªä¸�å�Œçš„进程,就能实现这两个进程的通信,采用该方法å�¯ä»¥å®žçް任æ„�进程之间的通信。mmap也å�¯ä»¥é‡‡ç”¨åŒ¿å��映射,ä¸�指定映射的文件,但是å�ªèƒ½åœ¨çˆ¶å­�进程间通信。XSI的内存共享实际上也是通过映射文件实现,å�ªæ˜¯å…¶æ˜ å°„的是一ç§�特殊文件系统下的文件,该文件是ä¸�能通过readå’Œwrite访问的。 +二者区别: + +1ã€� 系统V共享内存中的数æ�®ï¼Œä»Žæ�¥ä¸�写入到实际ç£�盘文件中去;而通过mmap()映射普通文件实现的共享内存通信å�¯ä»¥æŒ‡å®šä½•时将数æ�®å†™å…¥ç£�盘文件中。注:å‰�é�¢è®²åˆ°ï¼Œç³»ç»ŸV共享内存机制实际是通过映射特殊文件系统shm中的文件实现的,文件系统shm的安装点在交æ�¢åˆ†åŒºä¸Šï¼Œç³»ç»Ÿé‡�新引导å�Žï¼Œæ‰€æœ‰çš„内容都丢失。 +2ã€� 系统V共享内存是éš�内核æŒ�续的,å�³ä½¿æ‰€æœ‰è®¿é—®å…±äº«å†…存的进程都已ç»�正常终止,共享内存区ä»�然存在(除é�žæ˜¾å¼�删除共享内存),在内核é‡�新引导之å‰�,对该共享内存区域的任何改写æ“�作都将一直ä¿�留。 +3ã€� 通过调用mmap()映射普通文件进行进程间通信时,一定è¦�注æ„�考虑进程何时终止对通信的影å“�。而通过系统V共享内存实现通信的进程则ä¸�然。注:这里没有给出shmctl的使用范例,原ç�†ä¸Žæ¶ˆæ�¯é˜Ÿåˆ—大å�Œå°�异。 +系统调用与库函数(open, close, create, lseek, write, read) +å�Œæ­¥æ–¹æ³•有哪些? +1. 互斥é”�,自旋é”�,信å�·é‡�,读写é”�,å±�éšœ +2. 互斥é”�与自旋é”�的区别:互斥é”�å¾—ä¸�到资æº�的时候阻塞,ä¸�å� ç”¨cpu资æº�。自旋é”�å¾—ä¸�到资æº�的时候,ä¸�å�œçš„æŸ¥è¯¢ï¼Œè€Œç„¶å� ç”¨cpu资æº�。 +3. æ­»é”� å…¶ä»– +++i是å�¦æ˜¯åŽŸå­�æ“�作 +明显ä¸�是,++i主è¦�有三个步骤,把数æ�®ä»Žå†…存放在寄存器上,在寄存器上进行自增,把数æ�®ä»Žå¯„存器拷è´�会内存,æ¯�个步骤都å�¯èƒ½è¢«ä¸­æ–­ã€‚ +判断大å°�端 +``` + + +union un +{ +int i; +char ch; +}; + +void fun() +{ +union un test; +test.i = 1; +if(ch == 1) +cout << "å°�端" << endl; +else +cout << "大端" << endl; +} +``` 设计模å¼� +å�•例模å¼�线程安全的写法 +STL里的迭代器使用了迭代器模å¼� +MVCçš„ç�†è§£ +分布å¼�系统 +map_reduce原ç�† (这篇文章讲的很通俗易懂) +è´Ÿè½½å�‡è¡¡ +CDN + +29 +精彩评论 +13æ�¡å›žå¸– + +康å°�城 +2017-10-27 09:45:44 +0 0 +满满的干货,干货满满 + +77浩力,百世ä¸�敌 +2017-10-27 09:54:24 +0 0 +66666666666 + +è‹�Per +2017-10-27 09:55:13 +0 0 +干货ï¼�赞ï¼� + +ä¸�知ç�« +2017-10-27 10:59:40 +0 0 +此贴è¦�é¡¶ + +我家的狗ä¸�咬人 +2017-10-27 11:17:04 +0 0 +干货,很棒ï¼� + +JackLiao +2017-10-27 11:20:55 +0 0 +干货,多谢 + +寻ME +2017-10-27 12:37:47 +0 0 +太强辣 + +跋锋å°�寒 +2017-10-27 13:02:45 +0 0 +总结的好 + +三和大神 +2017-10-27 13:55:35 +1 0 +赞一个,有几个ä½�置想æ��一下自己的æ„�è§� +1,new与malloc区别第二æ�¡ï¼Œå¯¹äºŽPOD对象并无默认构造函数。 + 第七æ�¡ï¼Œnew有八个é‡�载版本,失败还å�¯èƒ½è¿”回空指针 +2,虚函数表这里,æ¯�个类的虚函数表å�¯ä»¥æœ‰å¤šä¸ªçš„å�§ï¼Œä¸Žç»§æ‰¿çš„基类数目相å�Œ +3,内è�”函数这里。内è�”函数并ä¸�一定å�ªåœ¨ç¼–译期,还å�¯åœ¨ç¼–ç �期,连接期(如VC++7.0),è¿�行期(如RVM),å�–决于具体编译器的实现,å�‚考more exceptional c++ æ�¡æ¬¾8,c++编程剖æž�第25æ�¡ +4,c++内存管ç�†è¿™é‡Œï¼Œc++还有一个自由存储区,new的内存ä¸�一定就是堆,还å�¯ä»¥æ˜¯åœ¨æ ˆä¸­ï¼Œå…¨å±€åŒºä¸­ã€‚å�‚考exceptional c++æ�¡æ¬¾35 +5,定ä½�内存泄露这里,无论是CRT还是Valgrind都å�ªæ˜¯åœ¨debug模å¼�下使用,在release模å¼�下方å¼�有:1,对象计数,2,é‡�è½½new,delete(记录分é…�点,定期打å�°å †æ ˆ),3,hook 分é…�内存的API 4,DiagLeak +6, tranceroute这里。tranceroute使用UDP的?我å�°è±¡ä¸­å°±æ˜¯ICMP+TTL +7, getå’Œpost区别这里,http设计中ä¸�是è¦�考虑幂等性å�—,怎么getå°±ä¸�安全了呢,对于暴æ¼�urlä¸�是有ssl/tlså�—,而且url长度é™�制貌似是å�–决于æµ�览器的å�§ã€‚。 +8,DNSä¸�是基于UDP,是基于UDPå’ŒTCP +9,消æ�¯é˜Ÿåˆ—这里,貌似Posix标准下消æ�¯é˜Ÿåˆ—本质是一个优先级队列,在system v标准下æ‰�是通过消æ�¯çš„æ ‡è¯†æ�¥æ��å�–感兴趣的消æ�¯ + 所以system væ›´ç�µæ´»ã€‚å�‚考linux从应用到内核 第å��一章 +10,信å�·è¿™é‡Œè¡¥å……一下,信å�·åˆ†ä¸ºå�¯é� ä¿¡å�·å’Œä¸�å�¯é� ä¿¡å�·ï¼Œä¸�å�¯é� ä¿¡å�·æ˜¯ç”¨ä½�图管ç�†ï¼Œå�¯èƒ½ä¸¢å¤±ï¼Œå�¯é� ä¿¡å�·æ˜¯ç”±ä¸€ä¸ªé˜Ÿåˆ—进行管ç�†ï¼Œåœ¨ä¸€å®šé™�度内ä¸�丢失(当队列塞ä¸�下的时候就丢失了) +11,进程调度这里,é�žå®žæ—¶è¿›ç¨‹é‡‡ç”¨å®Œå…¨å…¬å¹³è°ƒåº¦ï¼Œé€šè¿‡nice值计算虚拟è¿�行时间,内核对这些进程用红黑树进行管ç�†ã€‚实现进程采用fifo和时间片转轮 +12,poll这里,pollå�ªæ‹·è´�一次到文件内核æ€�å�—?是epollå�§ï¼ŒåŽŸç�†æ˜¯é€šè¿‡ä¸€ä¸ªé¢�外的文件æ��述符标识这个文件æ��述符集 + 那个问题,边沿触å�‘设置一个EPOLLONESHOT事件å�¯ä»¥è§£å†³äº‹ä»¶é¢‘ç¹�触å�‘的问题 + +御光飘扬 +2017-10-27 15:55:25 +0 0 +很ä¸�错,大佬 + +TheBestIsYetToCome- +2017-10-27 16:16:57 +0 0 +牛批 + +红色å°�å®�马 +2017-10-28 19:38:23 +0 0 +好难 + +广州渣渣辉 +2017-10-28 19:49:34 +0 0 +谢谢大佬 +加载中... +查看更多回å¤� +没有回å¤� +添加回å¤� +查看更多精彩内容 > +回å¤� + + +0 / +确定 +下载牛客APP,把IT求è�Œç¥žå™¨è£…è¿›å�£è¢‹ + +请登录å�ŽæŸ¥çœ‹ + + + + +知识点专项练习 + + + + +笔试真题查看 + + + + +å…¬å�¸çœŸé¢˜å¥—题练习 + + + + +计算机期末备考专场 + + + + +讨论区 + + + + +我的练习 + + + + + +请登录å�Žè®¾ç½® + + + +从牛客获得太多的资æº�,æ�¥ä¸€å�‘é�¢ç»�,纯技术干货。é�¢è¯•的技巧,心æ€�,简历也都很é‡�è¦�,ä¸�过牛客有很多大佬总结的太好了,就ä¸�é‡�å¤�了。 + +主è¦�是C++å�Žå�°å¼€å�‘,基本总结了我自己é�¢è¯•常问到的,看别人的é�¢ç»�问到过的,分享出æ�¥äº¤æµ�一下。 C++å�Žå�°å¼€å�‘é�¢è¯•常è§�问题汇总 + +原文æ�¥è‡ªæˆ‘çš„å�šå®¢ï¼Œæ¬¢è¿Žç‚¹å‡»ï¼š http://blog.csdn.net/shanghairuoxiao/article/details/72876248 Cå’ŒC++语言基础 + + +extern关键字作用 +extern声明å�˜é‡�在在外部定义? +extern修饰函数? +extern C的作用?用法? + + +static关键字作用 +static修饰局部å�˜é‡�? +static全局å�˜é‡�?(é™�定å�˜é‡�在一个编译å�•元内,一个编译å�•元就是指一个cpp和它包å�«çš„头文件,这个回答å�¯ä»¥ç»“å�ˆç¼–译需è¦�ç»�历的几个过程æ�¥ç­”) +static修饰普通函数? +static修饰æˆ�员å�˜é‡�? +static修饰æˆ�员函数? + + +volatile是干啥的 +访问寄存器è¦�比访问内存è¦�å�—,因此CPU会优先访问该数æ�®åœ¨å¯„存器中的存储结果,但是内存中的数æ�®å�¯èƒ½å·²ç»�å�‘生了改å�˜ï¼Œè€Œå¯„存器中还ä¿�ç•™ç�€åŽŸæ�¥çš„结果。为了é�¿å…�è¿™ç§�情况的å�‘生将该å�˜é‡�声明为volatile,告诉CPUæ¯�次都从内存去读å�–æ•°æ�®ã€‚ +一个å�‚æ•°å�¯ä»¥å�³æ˜¯constå�ˆæ˜¯volatileçš„å�—?å�¯ä»¥ï¼Œä¸€ä¸ªä¾‹å­�是å�ªè¯»çжæ€�寄存器,是volatile是因为它å�¯èƒ½è¢«æ„�想ä¸�到的被改å�˜ï¼Œæ˜¯const告诉程åº�ä¸�应该试图去修改他。 + + +说说const的作用,越多越好 +const修饰全局å�˜é‡�ï¼› +const修饰局部å�˜é‡�ï¼› +const修饰指针,const int *ï¼› +const修饰指针指å�‘的对象, int * constï¼› +const修饰引用å�šå½¢å�‚ï¼› +const修饰æˆ�员å�˜é‡�,必须在构造函数列表中åˆ�始化; +const修饰æˆ�员函数,说明该函数ä¸�应该修改é�žé�™æ€�æˆ�员,但是这并ä¸�是å��分å�¯é� çš„,指针所指的é�žæˆ�员对象值å�¯èƒ½ä¼šè¢«æ”¹å�˜ + + +new与malloc区别 +new分é…�内存按照数æ�®ç±»åž‹è¿›è¡Œåˆ†é…�,malloc分é…�内存按照大å°�分é…�ï¼› +newä¸�仅分é…�一段内存,而且会调用构造函数,但是malloc则ä¸�会。new的实现原ç�†ï¼Ÿä½†æ˜¯è¿˜éœ€è¦�注æ„�的是,之å‰�看到过一个题说int p = new int与int p = new int()的区别,因为int属于C++内置对象,ä¸�会默认åˆ�始化,必须显示调用默认构造函数,但是对于自定义对象都会默认调用构造函数åˆ�始化。翻阅资料å�Žï¼Œåœ¨C++11中两者没有区别了,自己测试的结构也都是为0ï¼› +new返回的是指定对象的指针,而malloc返回的是void*,因此malloc的返回值一般都需è¦�进行类型转化; +new是一个æ“�作符å�¯ä»¥é‡�载,malloc是一个库函数; +new分é…�的内存è¦�用delete销æ¯�,mallocè¦�用freeæ�¥é”€æ¯�ï¼›delete销æ¯�的时候会调用对象的æž�构函数,而free则ä¸�会; +malloc分é…�的内存ä¸�够的时候,å�¯ä»¥ç”¨realloc扩容。扩容的原ç�†ï¼Ÿnew没用这样æ“�作; +new如果分é…�失败了会抛出bad_malloc的异常,而malloc失败了会返回NULL。因此对于new,正确的姿势是采用try...catch语法,而malloc则应该判断指针的返回值。为了兼容很多c程åº�员的习惯,C++也å�¯ä»¥é‡‡ç”¨new nothrow的方法ç¦�止抛出异常而返回NULLï¼› +newå’Œnew[]的区别,new[]一次分é…�所有内存,多次调用构造函数,分别æ�­é…�使用deleteå’Œdelete[],å�Œç�†ï¼Œdelete[]多次调用æž�构函数,销æ¯�数组中的æ¯�个对象。而malloc则å�ªèƒ½sizeof(int) * nï¼› +如果ä¸�够å�¯ä»¥ç»§ç»­è°ˆnewå’Œmalloc的实现,空闲链表,分é…�方法(首次适é…�原则,最佳适é…�原则,最差适é…�原则,快速适é…�原则)。deleteå’Œfree的实现原ç�†ï¼Œfree为什么直到销æ¯�多大的空间? + + +C++多æ€�性与虚函数表 +C++多æ€�的实现? +多æ€�分为é�™æ€�多æ€�和动æ€�多æ€�。é�™æ€�多æ€�是通过é‡�载和模æ�¿æŠ€æœ¯å®žçŽ°ï¼Œåœ¨ç¼–è¯‘çš„æ—¶å€™ç¡®å®šã€‚åŠ¨æ€�多æ€�通过虚函数和继承关系æ�¥å®žçŽ°ï¼Œæ‰§è¡ŒåŠ¨æ€�绑定,在è¿�行的时候确定。 +动æ€�多æ€�实现有几个æ�¡ä»¶ï¼š +(1) 虚函数; +(2) 一个基类的指针或引用指å�‘派生类的对象; +基类指针在调用æˆ�员函数(虚函数)时,就会去查找该对象的虚函数表。虚函数表的地å�€åœ¨æ¯�个对象的首地å�€ã€‚查找该虚函数表中该函数的指针进行调用。 +æ¯�个对象中ä¿�存的å�ªæ˜¯ä¸€ä¸ªè™šå‡½æ•°è¡¨çš„æŒ‡é’ˆï¼ŒC++内部为æ¯�一个类维æŒ�一个虚函数表,该类的对象的都指å�‘è¿™å�Œä¸€ä¸ªè™šå‡½æ•°è¡¨ã€‚ +虚函数表中为什么就能准确查找相应的函数指针呢?因为在类设计的时候,虚函数表直接从基类也继承过æ�¥ï¼Œå¦‚果覆盖了其中的æŸ�个虚函数,那么虚函数表的指针就会被替æ�¢ï¼Œå› æ­¤å�¯ä»¥æ ¹æ�®æŒ‡é’ˆå‡†ç¡®æ‰¾åˆ°è¯¥è°ƒç”¨å“ªä¸ªå‡½æ•°ã€‚ + + +虚函数的作用? +虚函数用于实现多æ€�,这点大家都能答上æ�¥ +但是虚函数在设计上还具有å°�装和抽象的作用。比如抽象工厂模å¼�。 + + +动æ€�绑定是如何实现的? +第一个问题中基本回答了,主è¦�都是结å�ˆè™šå‡½æ•°è¡¨æ�¥ç­”就行。 + + +é�™æ€�多æ€�和动æ€�多æ€� 。é�™æ€�多æ€�是指通过模æ�¿æŠ€æœ¯æˆ–者函数é‡�载技术实现的多æ€�,其在编译器确定行为。动æ€�多æ€�是指通过虚函数技术实现在è¿�行期动æ€�绑定的技术。 + + +虚函数表 + + +虚函数表是针对类的还是针对对象的?å�Œä¸€ä¸ªç±»çš„两个对象的虚函数表是怎么维护的? +编译器为æ¯�一个类维护一个虚函数表,æ¯�个对象的首地å�€ä¿�å­˜ç�€è¯¥è™šå‡½æ•°è¡¨çš„æŒ‡é’ˆï¼Œå�Œä¸€ä¸ªç±»çš„ä¸�å�Œå¯¹è±¡å®žé™…上指å�‘å�Œä¸€å¼ è™šå‡½æ•°è¡¨ã€‚ + + +纯虚函数如何定义,为什么对于存在虚函数的类中æž�构函数è¦�定义æˆ�虚函数 +为了实现多æ€�进行动æ€�绑定,将派生类对象指针绑定到基类指针上,对象销æ¯�时,如果æž�构函数没有定义为æž�构函数,则会调用基类的æž�构函数,显然å�ªèƒ½é”€æ¯�部分数æ�®ã€‚如果è¦�调用对象的æž�构函数,就需è¦�将该对象的æž�构函数定义为虚函数,销æ¯�时通过虚函数表找到对应的æž�构函数。 +//纯虚函数定义 +virtual ~myClass() = 0; + + + +æž�构函数能抛出异常å�— +答案肯定是ä¸�能。 + +C++标准指明æž�构函数ä¸�能ã€�也ä¸�应该抛出异常。C++异常处ç�†æ¨¡åž‹æœ€å¤§çš„特点和优势就是对C++中的é�¢å�‘对象æ��供了最强大的无ç¼�支æŒ�。那么如果对象在è¿�行期间出现了异常,C++异常处ç�†æ¨¡åž‹æœ‰è´£ä»»æ¸…除那些由于出现异常所导致的已ç»�失效了的对象(也å�³å¯¹è±¡è¶…出了它原æ�¥çš„作用域),并释放对象原æ�¥æ‰€åˆ†é…�的资æº�, 这就是调用这些对象的æž�构函数æ�¥å®Œæˆ�释放资æº�的任务,所以从这个æ„�义上说,æž�构函数已ç»�å�˜æˆ�了异常处ç�†çš„一部分。 + + +(1) 如果æž�构函数抛出异常,则异常点之å�Žçš„程åº�ä¸�会执行,如果æž�构函数在异常点之å�Žæ‰§è¡Œäº†æŸ�些必è¦�的动作比如释放æŸ�些资æº�,则这些动作ä¸�会执行,会造æˆ�诸如资æº�泄æ¼�的问题。 + +(2) 通常异常å�‘生时,c++的机制会调用已ç»�构造对象的æž�构函数æ�¥é‡Šæ”¾èµ„æº�,此时若æž�构函数本身也抛出异常,则å‰�一个异常尚未处ç�†ï¼Œå�ˆæœ‰æ–°çš„异常,会造æˆ�程åº�崩溃的问题。 + + +构造函数和æž�构函数中调用虚函数å�—? + + +指针和引用的区别 +指针ä¿�存的是所指对象的地å�€ï¼Œå¼•用是所指对象的别å��,指针需è¦�通过解引用间接访问,而引用是直接访问; +指针å�¯ä»¥æ”¹å�˜åœ°å�€ï¼Œä»Žè€Œæ”¹å�˜æ‰€æŒ‡çš„对象,而引用必须从一而终; +引用在定义的时候必须åˆ�始化,而指针则ä¸�需è¦�ï¼› +指针有指å�‘常é‡�的指针和指针常é‡�,而引用没有常é‡�引用; +指针更ç�µæ´»ï¼Œç”¨çš„好å¨�力无比,用的ä¸�好处处是å�‘,而引用用起æ�¥åˆ™å®‰å…¨å¤šäº†ï¼Œä½†æ˜¯æ¯”较死æ�¿ã€‚ + + +指针与数组å�ƒä¸�万缕的è�”ç³» +一个一维int数组的数组å��实际上是一个int* const 类型; +一个二维int数组的数组å��实际上是一个int (*const p)[n]; +数组å��å�šå�‚数会退化为指针,除了sizeof + + +智能指针是怎么实现的?什么时候改å�˜å¼•用计数? +构造函数中计数åˆ�始化为1ï¼› +æ‹·è´�构造函数中计数值加1ï¼› +赋值è¿�算符中,左边的对象引用计数å‡�一,å�³è¾¹çš„对象引用计数加一; +æž�构函数中引用计数å‡�一; +在赋值è¿�算符和æž�构函数中,如果å‡�一å�Žä¸º0,则调用delete释放对象。 +share_prt与weak_ptr的区别? + +//share_ptrå�¯èƒ½å‡ºçŽ°å¾ªçŽ¯å¼•ç”¨ï¼Œä»Žè€Œå¯¼è‡´å†…å­˜æ³„éœ² +class A +{ +public: + share_ptr p; +}; +class B +{ +public: + share_ptr p; +} +int main() +{ + while(true) + { + share_prt pa(new A()); //pa的引用计数åˆ�始化为1 + share_prt pb(new B()); //pb的引用计数åˆ�始化为1 + pa->p = pb; //pb的引用计数å�˜ä¸º2 + pb->p = pa; //pa的引用计数å�˜ä¸º2 + } + //å�‡è®¾pa先离开,引用计数å‡�一å�˜ä¸º1,ä¸�为0å› æ­¤ä¸�会调用class Açš„æž�构函数,因此其æˆ�员p也ä¸�会被æž�构,pb的引用计数ä»�然为2ï¼› + //å�Œç�†pb离开的时候,引用计数也ä¸�能å‡�到0 + return 0; +} +/* +** weak_ptr是一ç§�弱引用指针,其存在ä¸�会影å“�引用计数,从而解决循环引用的问题 +*/ + + + +C++å››ç§�类型转æ�¢ : static_cast, dynamic_cast, const_cast, reinterpret_cast +const_cast用于将constå�˜é‡�转为é�žconst +static_cast用的最多,对于å�„ç§�éš�å¼�转æ�¢ï¼Œé�žconst转const,void*转指针等, static_cast能用于多æ€�想上转化,如果å�‘下转能æˆ�功但是ä¸�安全,结果未知; +dynamic_cast用于动æ€�类型转æ�¢ã€‚å�ªèƒ½ç”¨äºŽå�«æœ‰è™šå‡½æ•°çš„类,用于类层次间的å�‘上和å�‘下转化。å�ªèƒ½è½¬æŒ‡é’ˆæˆ–引用。å�‘下转化时,如果是é�žæ³•的对于指针返回NULL,对于引用抛异常。è¦�深入了解内部转æ�¢çš„原ç�†ã€‚ +reinterpret_cast几乎什么都å�¯ä»¥è½¬ï¼Œæ¯”如将int转指针,å�¯èƒ½ä¼šå‡ºé—®é¢˜ï¼Œå°½é‡�少用; +为什么ä¸�使用C的强制转æ�¢ï¼ŸC的强制转æ�¢è¡¨é�¢ä¸Šçœ‹èµ·æ�¥åŠŸèƒ½å¼ºå¤§ä»€ä¹ˆéƒ½èƒ½è½¬ï¼Œä½†æ˜¯è½¬åŒ–ä¸�够明确,ä¸�能进行错误检查,容易出错。 + + +内存对é½�的原则 +从0ä½�置开始存储; +å�˜é‡�存储的起始ä½�置是该å�˜é‡�大å°�的整数å€�ï¼› +结构体总的大å°�是其最大元素的整数å€�,ä¸�足的å�Žé�¢è¦�è¡¥é½�ï¼› +结构体中包å�«ç»“构体,从结构体中最大元素的整数å€�开始存; +如果加入pragma pack(n) ,å�–nå’Œå�˜é‡�自身大å°�较å°�的一个。 + + +内è�”函数有什么优点?内è�”函数与å®�定义的区别? +å®�定义在预编译的时候就会进行å®�替æ�¢ï¼› +内è�”函数在编译阶段,在调用内è�”函数的地方进行替æ�¢ï¼Œå‡�少了函数的调用过程,但是使得编译文件å�˜å¤§ã€‚因此,内è�”函数适å�ˆç®€å�•函数,对于å¤�æ�‚函数,å�³ä½¿å®šä¹‰äº†å†…è�”编译器å�¯èƒ½ä¹Ÿä¸�会按照内è�”的方å¼�进行编译。 +内è�”函数相比å®�定义更安全,内è�”函数å�¯ä»¥æ£€æŸ¥å�‚数,而å®�定义å�ªæ˜¯ç®€å�•的文本替æ�¢ã€‚因此推è��使用内è�”函数,而ä¸�是å®�定义。 +使用å®�定义函数è¦�特别注æ„�给所有å�•元都加上括å�·ï¼Œ#define MUL(a, b) a b,这很å�±é™©ï¼Œæ­£ç¡®å†™æ³•:#define MUL(a, b) ((a) (b)) + + +C++内存管ç�† +C++内存分为那几å�—?(堆区,栈区,常é‡�区,é�™æ€�和全局区) +æ¯�å�—存储哪些å�˜é‡�? +学会è¿�移,å�¯ä»¥è¯´åˆ°malloc,从malloc说到æ“�作系统的内存管ç�†ï¼Œè¯´é�“内核æ€�和用户æ€�,然å�Žå°±ä»€ä¹ˆé«˜ç«¯å†…存,slab层,伙伴算法,VMAå�¯ä»¥å·´æ‹‰å·´æ‹‰äº†ï¼ŒæŽ¥ç�€å�¯ä»¥è¿�移到fork()。 +STL里的内存池实现 +STL内存分é…�分为一级分é…�器和二级分é…�器,一级分é…�器就是采用malloc分é…�内存,二级分é…�器采用内存池。 + + +二级分é…�器设计的é�žå¸¸å·§å¦™ï¼Œåˆ†åˆ«ç»™8k,16k,..., 128k等比较å°�的内存片都维æŒ�一个空闲链表,æ¯�个链表的头节点由一个数组æ�¥ç»´æŠ¤ã€‚需è¦�分é…�内存时从å�ˆé€‚大å°�的链表中å�–一å�—下æ�¥ã€‚å�‡è®¾éœ€è¦�分é…�一å�—10K的内存,那么就找到最å°�的大于等于10kçš„å�—,也就是16K,从16K的空闲链表里å�–出一个用于分é…�。释放该å�—内存时,将内存节点归还给链表。 +如果è¦�分é…�的内存大于128K则直接调用一级分é…�器。 +为了节çœ�ç»´æŒ�链表的开销,采用了一个union结构体,分é…�器使用union里的next指针æ�¥æŒ‡å�‘下一个节点,而用户则使用union的空指针æ�¥è¡¨ç¤ºè¯¥èŠ‚ç‚¹çš„åœ°å�€ã€‚ + + +STL里setå’Œmap是基于什么实现的。红黑树的特点? +setå’Œmap都是基于红黑树实现的。 +红黑树是一ç§�平衡二å�‰æŸ¥æ‰¾æ ‘,与AVL树的区别是什么?AVL树是完全平衡的,红黑树基本上是平衡的。 +为什么选用红黑数呢?因为红黑数是平衡二å�‰æ ‘,其æ�’入和删除的效率都是N(logN),与AVL相比红黑数æ�’入和删除最多å�ªéœ€è¦�3次旋转,而AVL树为了维æŒ�其完全平衡性,在å��的情况下è¦�旋转的次数太多。 +红黑树的定义: +(1) 节点是红色或者黑色; +(2) 父节点是红色的è¯�,å­�节点就ä¸�能为红色; +(3) 从根节点到æ¯�个页å­�节点路径上黑色节点的数é‡�相å�Œï¼› +(4) 根是黑色的,NULL节点被认为是黑色的。 + + +STL里的其他数æ�®ç»“构和算法实现也è¦�清楚 +这个问题,把STLæº�ç �剖æž�好好看看,ä¸�ä»…é�¢è¯•ä¸�慌,自己对STL的使用也会上å�‡ä¸€ä¸ªå±‚次。 + + +必须在构造函数åˆ�始化å¼�里进行åˆ�始化的数æ�®æˆ�员有哪些 +(1) 常é‡�æˆ�员,因为常é‡�å�ªèƒ½åˆ�始化ä¸�能赋值,所以必须放在åˆ�始化列表里é�¢ +(2) 引用类型,引用必须在定义的时候åˆ�始化,并且ä¸�能é‡�新赋值,所以也è¦�写在åˆ�始化列表里é�¢ +(3) 没有默认构造函数的类类型,因为使用åˆ�始化列表å�¯ä»¥ä¸�必调用默认构造函数æ�¥åˆ�始化,而是直接调用拷è´�构造函数åˆ�始化 + + +模æ�¿ç‰¹åŒ– +(1) 模æ�¿ç‰¹åŒ–分为全特化和å��特化,模æ�¿ç‰¹åŒ–的目的就是对于æŸ�一ç§�å�˜é‡�类型具有ä¸�å�Œçš„实现,因此需è¦�特化版本。例如,在STL里迭代器为了适应原生指针就将原生指针进行特化。 + + +定ä½�内存泄露 +(1)在windowså¹³å�°ä¸‹é€šè¿‡CRT中的库函数进行检测; +(2)在å�¯èƒ½æ³„æ¼�的调用å‰�å�Žç”Ÿæˆ�å�—的快照,比较å‰�å�Žçš„状æ€�,定ä½�泄æ¼�çš„ä½�ç½® +(3)Linux下通过工具valgrind检测 + + +手写strcpy +``` +char strcpy(char dst, const char src) +{ +assert(dst); +assert(src); +char ret = dst; +while(( dst++ = src++) != '\0'); +return ret; +} +//该函数是没有考虑é‡�å� çš„ + + +char strcpy(char dst, const char src) +{ +assert((dst != NULL) && (src != NULL)); +char ret = dst; +int size = strlen(src) + 1; +if(dst > src || dst < src + len) +{ +dst = dst + size - 1; +src = src + size - 1; +while(size--) +{ +dst-- = src--; +} +} +else +{ +while(size--) +{ +dst++ = src++; +} +} +return ret; +} +- **手写memcpy函数** + + +void memcpy(void dst, const void src, size_t size) +{ +if(dst == NULL || src == NULL) +{ +return NULL; +} +void res = dst; +char pdst = (char )dst; +char psrc = (char )src; +if(pdst > psrc && pdst < psrc + size) //é‡�å�  +{ + pdst = pdst + size - 1; + psrc = pdst + size - 1; + while(size--) + { + *pdst-- = *psrc--; + } +} +else //æ— é‡�å�  +{ + while(size--) + { + *dst++ = *src++; + } +} +return ret; + + +} +- **手写strcat函数** + + +char strcat(char dst, const char src) +{ +char ret = dst; +while(*dst != '\0') + ++dst; +while((*dst++ = *src) != '\0'); +return ret; + + +} +- **手写strcmp函数** + + +int strcmp(const char str1, const char str2) +{ +while(*str1 == *str2 && *str1 != '\0') +{ + ++str1; + ++str2; +} +return *str1 - *str2; + + +} æ•°æ�®ç»“构与算法 + +这一å�—考察范围太广,主è¦�é� å¤šåˆ·é¢˜å�§ï¼Œç‰›å®¢ç½‘,剑指OFFER,LeetCode等。 Hash表 +Hash表实现(拉链和分散地å�€ï¼‰ +Hash策略常è§�的有哪些? +STL中hash_map扩容å�‘生什么? +(1) 创建一个新桶,该桶是原æ�¥æ¡¶ä¸¤å€�大最接近的质数(判断n是ä¸�是质数的方法:用n除2到$sqrt(n)$范围内的数) ï¼› +(2) 将原æ�¥æ¡¶é‡Œçš„æ•°é€šè¿‡æŒ‡é’ˆçš„转æ�¢ï¼Œæ�’入到新桶中(注æ„�STL这里å�šçš„很精细,没有直接将数æ�®ä»Žæ—§æ¡¶é��历拷è´�æ•°æ�®æ�’入到新桶,而是通过指针转æ�¢) +(3) 通过swap函数将新桶和旧桶交æ�¢ï¼Œé”€æ¯�新桶。 æ ‘ +二å�‰æ ‘结构,二å�‰æŸ¥æ‰¾æ ‘实现; +二å�‰æ ‘的六ç§�é��历; +二å�‰æ ‘的按层é��历; +递归是解决二å�‰æ ‘相关问题的神级方法; +æ ‘çš„å�„ç§�常è§�算法题( http://blog.csdn.net/xiajun07061225/article/details/12760493)ï¼› +什么是红黑树? +节点为红色或者黑色; +根节点为黑色; +从根节点到æ¯�个å�¶å­�节点ç»�过的黑色节点个数的和相å�Œï¼› +如果父节点为红色,那么其å­�节点就ä¸�能为红色。 + +红黑树与AVL树的区别 +红黑树与AVL树都是平衡树,但是AVL是完全平衡的(平衡就是值树中任æ„�节点的左å­�æ ‘å’Œå�³å­�树高度差ä¸�超过1)ï¼› +红黑树效率更高,因为AVL为了ä¿�è¯�其完全平衡,æ�’入和删除的时候在最å��的情况下è¦�旋转logN次,而红黑树æ�’入和删除的旋转次数è¦�比AVL少。 + +Trieæ ‘(字典树) +æ¯�个节点ä¿�存一个字符 +根节点ä¸�ä¿�存字符 +æ¯�个节点最多有n个å­�节点(n是所有å�¯èƒ½å‡ºçŽ°å­—ç¬¦çš„ä¸ªæ•°) +查询的å¤�æ�‚父为O(k),k为查询字符串长度 链表 + +链表和æ�’入和删除,å�•å�‘å’Œå�Œå�‘链表都è¦�会 +链表的问题考虑多个指针和递归 +(1) å��å�‘打å�°é“¾è¡¨(递归) +(2) 打å�°å€’数第K个节点(å‰�å�ŽæŒ‡é’ˆ) +(3) 链表是å�¦æœ‰çޝ(快慢指针)等等。b ggg 栈和队列 +队列和栈的区别 ?(从实现,应用,自身特点多个方é�¢æ�¥é˜�述,ä¸�è¦�å�ªè¯´ä¸€ä¸ªå…ˆå…¥å…ˆå‡ºï¼Œå…ˆå…¥å�Žå‡ºï¼Œè¿™ä¸ªä½ ä¼šåˆ«äººä¹Ÿä¼šï¼Œè¦�展现出你比别人掌æ�¡çš„æ›´æ·±) +典型的应用场景 æµ·é‡�æ•°æ�®é—®é¢˜ +å��亿整数(éš�机生æˆ�,å�¯é‡�å¤�)中å‰�K最大的数 +类似问题的解决方法æ€�路:首先哈希将数æ�®åˆ†æˆ�N个文件,然å�Žå¯¹æ¯�个文件建立K个元素最å°�/大堆(根æ�®è¦�求æ�¥é€‰æ‹©ï¼‰ã€‚最å�Žå°†æ–‡ä»¶ä¸­å‰©ä½™çš„æ•°æ�’入堆中,并维æŒ�K个元素的堆。最å�Žå°†N个堆中的元素å�ˆèµ·æ�¥åˆ†æž�。å�¯ä»¥é‡‡ç”¨å½’并的方å¼�æ�¥å�ˆå¹¶ã€‚在归并的时候为了æ��高效率还需è¦�建一个N个元素构æˆ�的最大堆,先用N个堆中的最大值填充这个堆,然å�Žå°±æ˜¯å¼¹å‡ºæœ€å¤§å€¼ï¼ŒæŒ‡é’ˆå�Žç§»çš„æ“�作了。当然这ç§�问题在现在的互è�”网技术中,一般就用map-reduce框架æ�¥å�šäº†ã€‚ +大数æ�®æŽ’åº�相å�Œçš„æ€�路:先哈希(哈希是好处是分布å�‡åŒ€ï¼Œç›¸å�Œçš„æ•°åœ¨å�Œä¸€ä¸ªæ–‡ä»¶ä¸­ï¼‰ï¼Œç„¶å�Žå°�文件装入内存快排,排åº�结果输出到文件。最å�Žå»ºå †å½’并。 +å��亿整数(éš�机生æˆ�,å�¯é‡�å¤�)中出现频率最高的一å�ƒä¸ª 排åº�算法 +排åº�算法当然是基础内容了,必须至少能快速写出,快排,建堆,和归并 +æ¯�ç§�算法的时间空间å¤�æ�‚度,最好最差平å�‡æƒ…况 ä½�è¿�ç®— 布隆过滤器 几å��亿个数ç»�常è¦�查找æŸ�一个数在ä¸�在里é�¢ï¼Œä½¿ç”¨å¸ƒéš†è¿‡æ»¤å™¨ï¼Œå¸ƒéš†è¿‡æ»¤å™¨çš„原ç�†ã€‚布隆过滤器å�¯èƒ½å‡ºçŽ°è¯¯åˆ¤ï¼Œæ€Žä¹ˆä¿�è¯�无误差? 网络与TCP/IP +TCP与UDP之间的区别 +(1) IP首部,TCP首部,UDP首部 +(2) TCPå’ŒUDP区别 +(3) TCPå’ŒUDP应用场景 +(4) 如何实现å�¯é� çš„UDP +TCP三次æ�¡æ‰‹ä¸Žå››æ¬¡æŒ¥æ‰‹ +详细说明TCP状æ€�è¿�移过程 +(1) 三次æ�¡æ‰‹å’Œå››æ¬¡æŒ¥æ‰‹çжæ€�å�˜åŒ–ï¼› +(2) 2MSL是什么状æ€�?作用是什么? +TCP相关技术 +1. TCPé‡�å�‘机制,Nagle算法 +2. TCP的拥塞控制使用的算法和具体过程 +3. TCP的窗å�£æ»‘动 +TCP客户与æœ�务器模型,用到哪些函数 +UDP客户与æœ�务器模型,用到哪些函数 +域å��è§£æž�过程,ARP的机制,RARP的实现 +1. RARP用于无盘æœ�务器,开机å�Žé€šè¿‡å�‘é€�RARP包给RARPæœ�务器,通过mac地å�€å¾—到IP地å�€ +Pingå’ŒTraceRoute实现原ç�† +(1) Ping是通过å�‘é€�ICMP报文回显请求实现。 +(2) TraceRoute通过å�‘é€�UDP报文,设置目的端å�£ä¸ºä¸€ä¸ªä¸�å�¯èƒ½çš„值,将IP首部中的TTL分别设置从1到N,æ¯�次é€�个增加,如果收到端å�£ä¸�å�¯è¾¾ï¼Œè¯´æ˜Žåˆ°è¾¾ç›®çš„主机,如果是因为TTL跳数超过,路由器会å�‘é€�主机ä¸�å�¯è¾¾çš„ICMP报文。 +HTTP http/https 1.0ã€�1.1ã€�2.0 + +1. http的主è¦�特点: +简å�•快速: 当客户端å�‘æœ�务器端å�‘é€�请求时,å�ªæ˜¯ç®€å�•的填写请求路径和请求方法å�³å�¯ï¼Œç„¶å�Žå°±å�¯ä»¥é€šè¿‡æµ�览器或其他方å¼�将该请求å�‘é€�就行了 +ç�µæ´»ï¼š HTTP å��è®®å…�许客户端和æœ�务器端传输任æ„�类型任æ„�æ ¼å¼�的数æ�®å¯¹è±¡ +无连接: 无连接的å�«ä¹‰æ˜¯é™�制æ¯�次连接å�ªå¤„ç�†ä¸€ä¸ªè¯·æ±‚。æœ�务器处ç�†å®Œå®¢æˆ·çš„请求,并收到客户的应答å�Žï¼Œå�³æ–­å¼€è¿žæŽ¥ï¼Œé‡‡ç”¨è¿™ç§�æ–¹å¼�å�¯ä»¥èŠ‚çœ�传输时间。(当今多数æœ�务器支æŒ�Keep-Alive功能,使用æœ�务器支æŒ�长连接,解决无连接的问题) +无状æ€�: 无状æ€�是指å��议对于事务处ç�†æ²¡æœ‰è®°å¿†èƒ½åŠ›ï¼Œæœ�务器ä¸�知é�“客户端是什么状æ€�。å�³å®¢æˆ·ç«¯å�‘é€�HTTP请求å�Žï¼Œæœ�务器根æ�®è¯·æ±‚,会给我们å�‘é€�æ•°æ�®ï¼Œå�‘é€�完å�Žï¼Œä¸�会记录信æ�¯ã€‚(使用 cookie 机制å�¯ä»¥ä¿�æŒ� session,解决无状æ€�的问题) +2. http1.1的特点 +aã€�默认æŒ�久连接节çœ�通信é‡�,å�ªè¦�客户端æœ�务端任æ„�一端没有明确æ��出断开TCP连接,就一直ä¿�æŒ�连接,å�¯ä»¥å�‘é€�多次HTTP请求 +bã€�管线化,客户端å�¯ä»¥å�Œæ—¶å�‘出多个HTTP请求,而ä¸�用一个个等待å“�应 +cã€�断点续传ftghh +3. http2.0的特点 +aã€�HTTP/2采用二进制格å¼�而é�žæ–‡æœ¬æ ¼å¼� +bã€�HTTP/2是完全多路å¤�用的,而é�žæœ‰åº�并阻塞的——å�ªéœ€ä¸€ä¸ªHTTP连接就å�¯ä»¥å®žçŽ°å¤šä¸ªè¯·æ±‚å“�应 +cã€�使用报头压缩,HTTP/2é™�低了开销 +dã€�HTTP/2让æœ�务器å�¯ä»¥å°†å“�应主动“推é€�â€�到客户端缓存中 get/post 区别 + +区别一: +geté‡�点在从æœ�务器上获å�–资æº�,posté‡�点在å�‘æœ�务器å�‘é€�æ•°æ�®ï¼› +区别二: +get传输数æ�®æ˜¯é€šè¿‡URL请求,以field(字段)= value的形å¼�,置于URLå�Žï¼Œå¹¶ç”¨"?"连接,多个请求数æ�®é—´ç”¨"&"连接,如http://127.0.0.1/Test/login.action?name=admin&password=admin,这个过程用户是å�¯è§�的; +post传输数æ�®é€šè¿‡Httpçš„post机制,将字段与对应值å°�存在请求实体中å�‘é€�ç»™æœ�务器,这个过程对用户是ä¸�å�¯è§�的; +区别三: +Get传输的数æ�®é‡�å°�,因为å�—URL长度é™�制,但效率较高; +Postå�¯ä»¥ä¼ è¾“大é‡�æ•°æ�®ï¼Œæ‰€ä»¥ä¸Šä¼ æ–‡ä»¶æ—¶å�ªèƒ½ç”¨Postæ–¹å¼�ï¼› +区别四: +get是ä¸�安全的,因为URL是å�¯è§�的,å�¯èƒ½ä¼šæ³„露ç§�密信æ�¯ï¼Œå¦‚密ç �等; +post较get安全性较高; + 返回状æ€�ç � + +200:请求被正常处ç�† +204:请求被å�—ç�†ä½†æ²¡æœ‰èµ„æº�å�¯ä»¥è¿”回 +206:客户端å�ªæ˜¯è¯·æ±‚资æº�的一部分,æœ�务器å�ªå¯¹è¯·æ±‚的部分资æº�执行GET方法,相应报文中通过Content-Range指定范围的资æº�。 +301:永久性é‡�定å�‘ +302:临时é‡�定å�‘ +303:与302状æ€�ç �有相似功能,å�ªæ˜¯å®ƒå¸Œæœ›å®¢æˆ·ç«¯åœ¨è¯·æ±‚一个URI的时候,能通过GET方法é‡�定å�‘到å�¦ä¸€ä¸ªURI上 +304:å�‘é€�附带æ�¡ä»¶çš„请求时,æ�¡ä»¶ä¸�满足时返回,与é‡�定å�‘æ— å…³ +307:临时é‡�定å�‘,与302类似,å�ªæ˜¯å¼ºåˆ¶è¦�求使用POST方法 +400:请求报文语法有误,æœ�务器无法识别 +401:请求需è¦�认è¯� +403:请求的对应资æº�ç¦�止被访问 +404:æœ�务器无法找到对应资æº� +500:æœ�务器内部错误 +503:æœ�务器正忙 + http å��议头相关 + +httpæ•°æ�®ç”±è¯·æ±‚行,首部字段,空行,报文主体四个部分组æˆ� +首部字段分为:通用首部字段,请求首部字段,å“�应首部字段,实体首部字段 https与http的区别?如何实现加密传输? +https就是在http与传输层之间加上了一个SSL +对称加密与é�žå¯¹ç§°åР坆 æµ�览器中输入一个URLå�‘生什么,用到哪些å��议? æµ�览器中输入URL,首先æµ�览器è¦�å°†URLè§£æž�为IP地å�€ï¼Œè§£æž�域å��å°±è¦�用到DNSå��议,首先主机会查询DNS的缓存,如果没有就给本地DNSå�‘é€�查询请求。DNS查询分为两ç§�æ–¹å¼�,一ç§�是递归查询,一ç§�是迭代查询。如果是迭代查询,本地的DNSæœ�务器,å�‘根域å��æœ�务器å�‘é€�查询请求,根域å��æœ�务器告知该域å��的一级域å��æœ�务器,然å�Žæœ¬åœ°æœ�务器给该一级域å��æœ�务器å�‘é€�查询请求,然å�Žä¾�次类推直到查询到该域å��çš„IP地å�€ã€‚DNSæœ�务器是基于UDP的,因此会用到UDPå��议。 +得到IP地å�€å�Žï¼Œæµ�览器就è¦�与æœ�务器建立一个http连接。因此è¦�用到httpå��议,httpå��议报文格å¼�上é�¢å·²ç»�æ��到。http生æˆ�一个get请求报文,将该报文传给TCP层处ç�†ã€‚如果采用https还会先对httpæ•°æ�®è¿›è¡ŒåŠ å¯†ã€‚TCP层如果有需è¦�先将HTTPæ•°æ�®åŒ…分片,分片ä¾�æ�®è·¯å¾„MTUå’ŒMSS。TCP的数æ�®åŒ…ç„¶å�Žä¼šå�‘é€�ç»™IP层,用到IPå��议。IP层通过路由选路,一跳一跳å�‘é€�到目的地å�€ã€‚当然在一个网段内的寻å�€æ˜¯é€šè¿‡ä»¥å¤ªç½‘å��议实现(也å�¯ä»¥æ˜¯å…¶ä»–物ç�†å±‚å��议,比如PPP,SLIP),以太网å��议需è¦�直到目的IP地å�€çš„物ç�†åœ°å�€ï¼Œæœ‰éœ€è¦�ARPå��议。 安全相关 +SQL注入 +XSS +RCFS +APR欺骗 æ•°æ�®åº“ +SQL语言(内外连接,å­�查询,分组,è�šé›†ï¼ŒåµŒå¥—,逻辑) +MySQL索引方法?索引的优化? +InnoDB与MyISAM区别? +事务的ACID +事务的四个隔离级别 +查询优化(从索引上优化,从SQL语言上优化) +B-与B+树区别? +MySQLçš„è�”å�ˆç´¢å¼•(å�ˆç§°å¤šåˆ—索引)是什么?生效的æ�¡ä»¶ï¼Ÿ +分库分表 Linux 进程与线程 (1) 进程与线程区别? +(2) 线程比进程具有哪些优势? +(3) 什么时候用多进程?什么时候用多线程? +(4) LINUX中进程和线程使用的几个函数? +(5) 线程å�Œæ­¥ï¼Ÿ +在Windows下线程å�Œæ­¥çš„æ–¹å¼�有:互斥é‡�,信å�·é‡�,事件,关键代ç �段 +在Linux下线程å�Œæ­¥çš„æ–¹å¼�有:互斥é”�,自旋é”�,读写é”�,å±�éšœ(å¹¶å�‘完æˆ�å�Œä¸€é¡¹ä»»åŠ¡æ—¶ï¼Œå±�障的作用特别好使) +知é�“这些é”�之间的区别,使用场景? 进程间通讯方å¼� + +管é�“( pipe ) :管é�“是一ç§�å�Šå�Œå·¥çš„通信方å¼�,数æ�®å�ªèƒ½å�•å�‘æµ�动,而且å�ªèƒ½åœ¨å…·æœ‰äº²ç¼˜å…³ç³»çš„进程间使用。进程的亲缘关系通常是指父å­�进程关系。 + +命å��管é�“ (FIFO) : 有å��管é�“也是å�Šå�Œå·¥çš„通信方å¼�,但是它å…�许无亲缘关系进程间的通信。 + +ä¿¡å�·é‡� :信å�·é‡�用于实现进程间的互斥与å�Œæ­¥ï¼Œè€Œä¸�是用于存储进程间通信数æ�®ï¼Œæœ‰XSIä¿¡å�·é‡�å’ŒPOSIXä¿¡å�·é‡�,POSIXä¿¡å�·é‡�更加完善。 + +消æ�¯é˜Ÿåˆ—( message queue ) : 消æ�¯é˜Ÿåˆ—是由消æ�¯çš„链表,存放在内核中并由消æ�¯é˜Ÿåˆ—标识符标识。消æ�¯é˜Ÿåˆ—å…‹æœ�了信å�·ä¼ é€’ä¿¡æ�¯å°‘ã€�管é�“å�ªèƒ½æ‰¿è½½æ— æ ¼å¼�字节æµ�以å�Šç¼“冲区大å°�å�—é™�等缺点。 + +共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都å�¯ä»¥è®¿é—®ã€‚共享内存是最快的 IPC æ–¹å¼�,它是针对其他进程间通信方å¼�è¿�行效率低而专门设计的。它往往与其他通信机制,如信å�·ä¸¤ï¼Œé…�å�ˆä½¿ç”¨ï¼Œæ�¥å®žçŽ°è¿›ç¨‹é—´çš„å�Œæ­¥å’Œé€šä¿¡ã€‚(原ç�†ä¸€å®šè¦�清楚,常考) + +ä¿¡å�· ( sinal ) : ä¿¡å�·æ˜¯ä¸€ç§�比较å¤�æ�‚的通信方å¼�,用于通知接收进程æŸ�个事件已ç»�å�‘生,常è§�的信å�·ã€‚ + +套接字( socket ) : 套解å�£ä¹Ÿæ˜¯ä¸€ç§�进程间通信机制,与其他通信机制ä¸�å�Œçš„æ˜¯ï¼Œå®ƒå�¯ç”¨äºŽä¸�å�Œå�Šå…¶é—´çš„进程通信。 +匿å��管é�“与命å��管é�“的区别 :匿å��管é�“å�ªèƒ½åœ¨å…·æœ‰å…¬å…±ç¥–先的两个进程间使用。 +共享文件映射mmap +mmap建立进程空间到文件的映射,在建立的时候并ä¸�直接将文件拷è´�到物ç�†å†…存,å�Œæ ·é‡‡ç”¨ç¼ºé¡µç»ˆç«¯ã€‚mmap映射一个具体的文件å�¯ä»¥å®žçް任æ„�进程间共享内存,映射一个匿å��文件,å�¯ä»¥å®žçŽ°çˆ¶å­�进程间共享内存。 +常è§�的信å�·æœ‰å“ªäº›ï¼Ÿ :SIGINT,SIGKILL(ä¸�能被æ�•获),SIGTERM(å�¯ä»¥è¢«æ�•获),SIGSEGV,SIGCHLD,SIGALRM 内存管ç�† 1. 虚拟内存的作用? +2. 虚拟内存的实现? +3. æ“�作系统层é�¢å¯¹å†…存的管ç�†ï¼Ÿ +4. 内存池的作用?STL里 内存池如何实现 ? +5. 进程空间和内核空间对内存的管ç�†ä¸�å�Œï¼Ÿ +6. Linuxçš„slab层,VAM? +7. 伙伴算法 +8. 高端内存 进程调度 1. Linux进程分为两ç§�,实时进程和é�žå®žæ—¶è¿›ç¨‹ï¼› +2. 优先级分为é�™æ€�优先级和动æ€�优先级,优先级的范围; +3. 调度策略,FIFO,LRU,时间片轮转 +4. 交互进程通过平å�‡ç�¡çœ æ—¶é—´è€Œè¢«å¥–励; æ­»é”� (1) æ­»é”�产生的æ�¡ä»¶ï¼› +(2) æ­»é”�çš„é�¿å…�ï¼› 命令行 +Linux命令 在一个文件中,倒åº�打å�°ç¬¬äºŒè¡Œå‰�100个大写字æ¯� +``` + + +cat filename | head -n 2 | tail -n 1 | grep '[[:upper:]]' -o | tr -d '\n'| cut -c 1-100 | rev +与CPU,内存,ç£�盘相关的命令(top,free, df, fdisk) +网络相关的命令netstat,tcpdumpç­‰ +sed, awk, grep三个超强大的命å��,分别用与格å¼�化修改,统计,和正则查找 +ipcså’Œipcrm命令 +查找当å‰�目录以å�Šå­—æ¯�下以.c结尾的文件,且文件中包å�«"hello world"的文件的路径 +创建定时任务 IO模型 +五ç§�IO模型: 阻塞IO,é�žé˜»å¡žIO,IOå¤�用,信å�·é©±åЍå¼�IO,异步IO +select,poll,epoll的区别 +select: 是最åˆ�解决IO阻塞问题的方法。用结构体fd_setæ�¥å‘Šè¯‰å†…核监å�¬å¤šä¸ªæ–‡ä»¶æ��述符,该结构体被称为æ��述符集。由数组æ�¥ç»´æŒ�哪些æ��述符被置ä½�了。对结构体的æ“�作å°�装在三个å®�定义中。通过轮寻æ�¥æŸ¥æ‰¾æ˜¯å�¦æœ‰æ��述符è¦�被处ç�†ï¼Œå¦‚果没有返回 +存在的问题: +1. 内置数组的形å¼�使得select的最大文件数å�—é™�与FD_SIZEï¼› +2. æ¯�次调用selectå‰�都è¦�é‡�æ–°åˆ�始化æ��述符集,将fd从用户æ€�æ‹·è´�到内核æ€�,æ¯�次调用selectå�Žï¼Œéƒ½éœ€è¦�å°†fd从内核æ€�æ‹·è´�到用户æ€�ï¼› +3. 轮寻排查当文件æ��述符个数很多时,效率很低; poll: 通过一个å�¯å�˜é•¿åº¦çš„æ•°ç»„解决了select文件æ��述符å�—é™�的问题。数组中元素是结构体,该结构体ä¿�å­˜æ��述符的信æ�¯ï¼Œæ¯�增加一个文件æ��述符就å�‘数组中加入一个结构体,结构体å�ªéœ€è¦�æ‹·è´�一次到内核æ€�。poll解决了selecté‡�å¤�åˆ�始化的问题。轮寻排查的问题未解决。 +epoll: 轮寻排查所有文件æ��述符的效率ä¸�高,使æœ�务器并å�‘能力å�—é™�。因此,epoll采用å�ªè¿”回状æ€�å�‘生å�˜åŒ–的文件æ��述符,便解决了轮寻的瓶颈。 +为什么使用IO多路å¤�用,最主è¦�的原因是什么? +epoll有两ç§�触å�‘模å¼�?这两ç§�触å�‘模å¼�有什么区别?编程的时候有什么区别? +上一题中编程的时候有什么区别,是在边缘触å�‘的时候è¦�把套接字中的数æ�®è¯»å¹²å‡€ï¼Œé‚£ä¹ˆå½“有多个套接字时,在读的套接字一直ä¸�å�œçš„æœ‰æ•°æ�®åˆ°è¾¾ï¼Œå¦‚何ä¿�è¯�其他套接字ä¸�被饿死(é�¢è¯•网易游æˆ�的时候问的一个问题,答ä¸�上æ�¥ï¼Œå�°è±¡è´¼æ·±åˆ»)。 +1. select/poll/epoll区别 +2. 几ç§�网络æœ�务器模型的介ç»�与比较 +3. epoll为什么这么快 (æ�žæ‡‚这篇文章,关于IOå¤�用的问题就信手拈æ�¥äº†) 线程池 Linuxçš„API +fork与vfork区别 +forkå’Œvfork都用于创建å­�进程。但是vfork创建å­�进程å�Žï¼Œçˆ¶è¿›ç¨‹é˜»å¡žï¼Œç›´åˆ°å­�进程调用exit()或者excle()。 +对于内核中过程fork通过调用clone函数,然å�Žclone函数调用do_fork()。do_fork()中调用copy_process()函数先å¤�制task_struct结构体,然å�Žå¤�制其他关于内存,文件,寄存器等信æ�¯ã€‚fork采用写时拷è´�技术,因此å­�进程和父进程的页表指å�‘相å�Œçš„页框。但是vforkä¸�需è¦�æ‹·è´�页表,因为父进程会一直阻塞,直接使用父进程页表。 +exit()与_exit()区别 +exit()清ç�†å�Žè¿›å…¥å†…核,_exit()直接陷入内核。 +孤儿进程与僵死进程 +1. 孤儿进程是怎么产生的? +2. 僵死进程是怎么产生的? +3. 僵死进程的å�±å®³ï¼Ÿ +4. 如何é�¿å…�僵死进程的产生? +Linux是如何é�¿å…�内存碎片的 +1. 伙伴算法,用于管ç�†ç‰©ç�†å†…存,é�¿å…�内存碎片; +2. 高速缓存Slab层用于管ç�†å†…核分é…�内存,é�¿å…�碎片。 +共享内存的实现原ç�†ï¼Ÿ +共享内存实现分为两ç§�æ–¹å¼�一ç§�是采用mmap,å�¦ä¸€ç§�是采用XSI机制中的共享内存方法。mmap是内存文件映射,将一个文件映射到进程的地å�€ç©ºé—´ï¼Œç”¨æˆ·è¿›ç¨‹çš„地å�€ç©ºé—´çš„管ç�†æ˜¯é€šè¿‡vm_area_struct结构体进行管ç�†çš„。mmap通过映射一个相å�Œçš„æ–‡ä»¶åˆ°ä¸¤ä¸ªä¸�å�Œçš„进程,就能实现这两个进程的通信,采用该方法å�¯ä»¥å®žçް任æ„�进程之间的通信。mmap也å�¯ä»¥é‡‡ç”¨åŒ¿å��映射,ä¸�指定映射的文件,但是å�ªèƒ½åœ¨çˆ¶å­�进程间通信。XSI的内存共享实际上也是通过映射文件实现,å�ªæ˜¯å…¶æ˜ å°„的是一ç§�特殊文件系统下的文件,该文件是ä¸�能通过readå’Œwrite访问的。 +二者区别: + +1ã€� 系统V共享内存中的数æ�®ï¼Œä»Žæ�¥ä¸�写入到实际ç£�盘文件中去;而通过mmap()映射普通文件实现的共享内存通信å�¯ä»¥æŒ‡å®šä½•时将数æ�®å†™å…¥ç£�盘文件中。注:å‰�é�¢è®²åˆ°ï¼Œç³»ç»ŸV共享内存机制实际是通过映射特殊文件系统shm中的文件实现的,文件系统shm的安装点在交æ�¢åˆ†åŒºä¸Šï¼Œç³»ç»Ÿé‡�新引导å�Žï¼Œæ‰€æœ‰çš„内容都丢失。 +2ã€� 系统V共享内存是éš�内核æŒ�续的,å�³ä½¿æ‰€æœ‰è®¿é—®å…±äº«å†…存的进程都已ç»�正常终止,共享内存区ä»�然存在(除é�žæ˜¾å¼�删除共享内存),在内核é‡�新引导之å‰�,对该共享内存区域的任何改写æ“�作都将一直ä¿�留。 +3ã€� 通过调用mmap()映射普通文件进行进程间通信时,一定è¦�注æ„�考虑进程何时终止对通信的影å“�。而通过系统V共享内存实现通信的进程则ä¸�然。注:这里没有给出shmctl的使用范例,原ç�†ä¸Žæ¶ˆæ�¯é˜Ÿåˆ—大å�Œå°�异。 +系统调用与库函数(open, close, create, lseek, write, read) +å�Œæ­¥æ–¹æ³•有哪些? +1. 互斥é”�,自旋é”�,信å�·é‡�,读写é”�,å±�éšœ +2. 互斥é”�与自旋é”�的区别:互斥é”�å¾—ä¸�到资æº�的时候阻塞,ä¸�å� ç”¨cpu资æº�。自旋é”�å¾—ä¸�到资æº�的时候,ä¸�å�œçš„æŸ¥è¯¢ï¼Œè€Œç„¶å� ç”¨cpu资æº�。 +3. æ­»é”� å…¶ä»– +++i是å�¦æ˜¯åŽŸå­�æ“�作 +明显ä¸�是,++i主è¦�有三个步骤,把数æ�®ä»Žå†…存放在寄存器上,在寄存器上进行自增,把数æ�®ä»Žå¯„存器拷è´�会内存,æ¯�个步骤都å�¯èƒ½è¢«ä¸­æ–­ã€‚ +判断大å°�端 +``` + + +union un +{ +int i; +char ch; +}; + +void fun() +{ +union un test; +test.i = 1; +if(ch == 1) +cout << "å°�端" << endl; +else +cout << "大端" << endl; +} +``` 设计模å¼� +å�•例模å¼�线程安全的写法 +STL里的迭代器使用了迭代器模å¼� +MVCçš„ç�†è§£ +分布å¼�系统 +map_reduce原ç�† (这篇文章讲的很通俗易懂) +è´Ÿè½½å�‡è¡¡ +CDN + + +å�–消 确定 + +确定 \ No newline at end of file diff --git a/notes/é�¢ç»�/MySQL ç»�å…¸é�¢è¯•题 - 王守昌 - å�šå®¢å›­.txt b/notes/é�¢ç»�/MySQL ç»�å…¸é�¢è¯•题 - 王守昌 - å�šå®¢å›­.txt new file mode 100644 index 00000000..e8f5b22e --- /dev/null +++ b/notes/é�¢ç»�/MySQL ç»�å…¸é�¢è¯•题 - 王守昌 - å�šå®¢å›­.txt @@ -0,0 +1,218 @@ +Keven King +编程人生 +éš�笔 - 91, 文章 - 0, 评论 - 11, 引用 - 0 +MySQL ç»�å…¸é�¢è¯•题 +MySQL é�¢è¯• 1 存储过程 + +什么是存储过程 +存储过程是一些编译好的SQL语å�¥ +因为系统在调用SQL的时候比较浪费时间,所以之å‰�先将一些基本的é¢�SQL语å�¥ä»£ç �进行编译(对å�•表或多表的增删改查),然å�Žå†�给代ç �å�–一个å��字,在需è¦�这个功能时去调用它就å�¯ä»¥äº†ã€‚ +优缺点 +存储工程是编译å�Žçš„代ç � 效率高 +存储过程代替SQL语å�¥ï¼Œé™�低网络通信 +在一定的程度确ä¿�æ•°æ�®å®‰å…¨ +2 索引 + +索引是什么 +索引是对数æ�®åº“中一或多个列值的排åº�,帮助数æ�®åº“高效获å�–æ•°æ�®çš„æ•°æ�®ç»“æž„ +å�‡å¦‚我们用类比的方法,数æ�®åº“中的索引就相当于书ç±�中的目录一样,当我们想找到书中的摸个知识点,我们å�¯ä»¥ç›´æŽ¥åŽ»ç›®å½•ä¸­æ‰¾è€Œä¸�是在书中æ¯�页的找,但是这也抛出了索引的一个缺点,在对数æ�®åº“修改的时候è¦�修改索引到导致时间å�˜å¤šã€‚ +几个基本的索引类型 普通索引 唯一索引 主键索引 全文索引 +索引优点 +加快检索速度 +唯一索引确ä¿�æ¯�行数æ�®çš„唯一性 +在使用索引的过程å�¯ä»¥ä¼˜åŒ–éš�è—�器,æ��高系统性能 + + +索引缺点 +æ�’入删除 修改 维护速度下é™� +å� ç”¨ç‰©ç�†å’Œæ•°æ�®ç©ºé—´ +3 事务 + +事务的作用 +事务(Transaction)是并å�‘控制的基本å�•ä½�。事务就是一系列的æ“�作,这些æ“�作è¦�么都执行,è¦�么都ä¸�执行。 +事务具有以下4个基本特å¾� +Atomic(原å­�性) 事务中的一系列的æ“�作è¦�么都完æˆ�,è¦�么全部失败 +Consistency(一致性) 一个æˆ�功的事务应该讲数æ�®å†™å…¥çš„到数æ�®åº“,å�¦åˆ™å°±è¦�回滚到最åˆ�的状æ€� +Isolation(隔离性) å¹¶å�‘访问和修改的duli +Durability(æŒ�久性) 事务结æ�Ÿåº”该讲事务的处ç�†ç»“构存储起æ�¥ +事务的语å�¥ +开始事物:BEGIN TRANSACTION +æ��交事物:COMMIT TRANSACTION +回滚事务:ROLLBACK TRANSACTION +4 æ•°æ�®åº“中的ä¹�è§‚é”�和悲观é”� + +æ ¹æ�®ä¸�å�Œç±»åž‹å�¯ä»¥å¯¹æ•°æ�®è®¾ç½®ä¸�å�Œçš„é”�æ�ƒé™� +** ä¹�è§‚ 悲观 é”� 主è¦�是作用在并å�‘访问控制** +悲观é”� å�‡å®šä¼šå�‘生并å�‘冲çª�,å±�蔽任何è¿�å��æ•°æ�®å®Œæ•´çš„æ“�作 +ä¹�è§‚é”� å�‡å®šä¸�会å�‘生冲çª�,å�ªæœ‰åœ¨æ��交æ“�作时检查是å�¦è¿�å��æ•°æ�®çš„完整性 +5 drop, delete truncate 的区别 + +三者都是 删除 çš„æ„�æ€�,但是三者个有些区别 +deleteå’Œtruncateå�ªåˆ é™¤è¡¨çš„æ•°æ�®ä¸�删除表的结构 +速度 drop > truncate > delete +想删除部分数æ�®æ—¶ï¼Œ delete 删除时è¦�带上where语å�¥ +ä¿�留表而想删除所有的数æ�®æ—¶ç”¨ truncate +6 è¶…é”® 候选键 主键 外键 区别 + +è¶…é”® 在关系中能唯一标识元组的属性集称为关系模å¼�的超键 ,一个或多个属性组å�ˆåœ¨ä¸€èµ·ä½œä¸ºè¶…键。 +候选键 最下超键,没有冗余元素的超键 +主键 æ•°æ�®åº“中表中唯一和完整标识的数æ�®åˆ—或属性集å�ˆã€‚ +外键 在一个表中存在å�¦å¤–一个表的主键å�«å�šå¤–é”® 7视图 + +定义 视图是一ç§�虚拟表,å�¯ä»¥å¯¹è§†å›¾è¿›è¡Œå¢žåˆ æŸ¥æ”¹ 。å�¯ä»¥å°†ä¸€ä¸ªè¡¨å¤šä¸ªè¡¨ç»„å�ˆæˆ�一个视图。对视图的修改ä¸�å½±å“�基本表。 8 æ•°æ�®åº“三大范å¼�介ç»� +1NF 字段是最å°�å�•元,ä¸�å�¯å†�分 +2NF 满足1NF 表中字段必须完全ä¾�赖全部主键而并é�žéƒ¨åˆ†ä¸»é”® + + +3NF 满足2NF,é�žä¸»é”®å¤–的所有字段必须互ä¸�ä¾�èµ– +4.æ•°æ�®åº“三范å¼� +第一范å¼� 字段具有原å­�性,ä¸�å�¯å†�分 +第二范å¼� 表中的æ¯�列都和主键相关 +第三范å¼� æ¯�列都和主键列直接相关,而ä¸�是间接相关 + +好文è¦�é¡¶ 关注我 æ”¶è—�该文 + +王守昌 +关注 - 0 +粉ä¸� - 9 ++加关注 +0 +0 +« 上一篇: MongoDB分片原ç�†ç¯‡ +» 下一篇: 类图关系以å�Šç±»å›¾ä¹‹é—´ç®­å¤´è¡¨ç¤º + + +posted on 2017-06-01 19:32 王守昌 阅读( 3298 ) 评论( 0 ) 编辑 æ”¶è—� + +刷新评论 刷新页é�¢ 返回顶部 +注册用户登录å�Žæ‰�能å�‘表评论,请 登录 或 注册 , 访问 网站首页。 +ã€�推è��】50万行VC++æº�ç �: 大型组æ€�工控ã€�电力仿真CAD与GISæº�ç �库 +ã€�推è��】Vue.js 2.x 快速入门,大é‡�高效实战示例 +ã€�活动】腾讯云 学生专属优惠套é¤� 多规格选择 +ã€�活动】释放技术的想象-è§£ç �腾讯云软件架构与应用 + + +最新ITæ–°é—» : +· 京东è¦�用机器人和无人机对抗阿里巴巴 刘强东到底胜算几何? +· TF Liteå�ªæ˜¯æ•…事的一部分,谷歌还一并介ç»�了新的模型压缩方法 +· “大ç�°ç‹¼â€�远控开å�‘者被æ›�çŒ�æ­» +· UCæµ�览器é�­Google Play下架,被指存在éš�ç§�问题 +· 董明ç� ï¼šä¸�å��对在国外买技术但真正创造者è¦�自主研å�‘ +» 更多新闻... + +最新知识库文章 : + +· 关于编程,你的练习是ä¸�是有效的? +· 改善程åº�员生活质é‡�çš„ 3+10 习惯 +· NASAçš„10æ�¡ä»£ç �编写原则 +· 为什么你å�‚加了那么多培训,å�´ä¾�然表现平平? +· 写给åˆ�å­¦å‰�端工程师的一å°�ä¿¡ +» 更多知识库文章... +导航 +å�šå®¢å›­ +首页 +æ–°éš�笔 +è�”ç³» +订阅 +管ç�† + + < 2017å¹´11月 > + +æ—¥ 一 二 三 å›› 五 å…­ + 29 30 31 1 2 3 4 + 5 6 7 8 9 10 11 + 12 13 14 15 16 17 18 + 19 20 21 22 23 24 25 + 26 27 28 29 30 1 2 + 3 4 5 6 7 8 9 +公告 +昵称: 王守昌 +园龄: 2å¹´5个月 +粉ä¸�: 9 +关注: 0 ++加关注 +æ�œç´¢ + + +常用链接 +我的éš�笔 +我的评论 +我的å�‚与 +最新评论 +我的标签 + +éš�笔分类 +git 学习与记录(1) +Hadoop 安装(1) +HTMLå’ŒCSS(5) +HTTPæ�ƒå¨�指å�—读书笔记(1) +Java(3) +java Web 分类 (9) +Java 线程池(2) +JavaScript 学习笔记(5) +Java与设计模å¼�(2) +Linux (17) +Maven 笔记(11) +mongodb éš�笔(17) +python 入门教程 +rabbitmq 安装使用记录 +redis 学习éš�笔(3) +thinking in java 笔记(1) +æ•°æ�®ç»“构与算法(1) +éš�笔档案 +2017å¹´10月 (4) +2017å¹´9月 (10) +2017å¹´8月 (5) +2017å¹´6月 (1) +2017å¹´5月 (15) +2017å¹´4月 (19) +2017å¹´3月 (8) +2016å¹´12月 (29) + +最新评论 + +1. Re:如何高效学习读书笔记 +@王守昌谢谢。... +--北è�½å¸ˆé—¨Î± +2. Re:如何高效学习读书笔记 +@北è�½å¸ˆé—¨Î±ç”¨markdown编辑器上编辑,然å�Žç›´æŽ¥å¤�制到å�šå®¢å›­çš„编辑框中... +--王守昌 +3. Re:如何高效学习读书笔记 +@退å�Žä¸€æ­¥æ˜¯äººç”Ÿè°¢è°¢... +--王守昌 +4. Re:如何高效学习读书笔记 +问下,笔记用什么记录的。 +想请教下怎么整ç�†çš„这么整é½�。什么软件上先写好,å†�粘到园å­�里的å�§ã€‚ +--北è�½å¸ˆé—¨Î± +5. Re:如何高效学习读书笔记 +楼主好总结ï¼�ï¼�ï¼� +--退å�Žä¸€æ­¥æ˜¯äººç”Ÿ + +阅读排行榜 + +1. eclipseé…�ç½®maven + 创建maven项目(三)(14634) +2. 在java中使用MongoDBæ•°æ�®åº“(4427) +3. MySQL ç»�å…¸é�¢è¯•题(3299) +4. maven web 项目中å�¯åŠ¨æŠ¥é”™ Java.lang.ClassNotFoundException: org.springframework.web.servlet.DispatcherServlet(2843) +5. 自己把jar包添加到maven仓库中(2157) + +评论排行榜 + +1. 如何高效学习读书笔记(7) +2. 在java中使用MongoDBæ•°æ�®åº“(2) +3. Maven下载ã€�安装和é…�置(二)(1) +4. MongoDB的备份和部署 高级功能索引,è�šå�ˆå¤�制,分片(1) + +推è��排行榜 + +1. eclipseé…�ç½®maven + 创建maven项目(三)(2) +2. MongoDB 分布å¼�æž¶æž„ å¤�制 分片 适用性范围(1) +3. å°†eclipse左边目录结构改为 树形结构(1) +4. 如何高效学习读书笔记(1) +5. MongoDB分片原ç�†ç¯‡(1) + + + +Powered by: +å�šå®¢å›­ +Copyright © 王守昌 \ No newline at end of file diff --git a/notes/é�¢ç»�/csdn-腾讯å�Žå�°å¼€å�‘é�¢è¯•ç»�验.md.txt b/notes/é�¢ç»�/csdn-腾讯å�Žå�°å¼€å�‘é�¢è¯•ç»�验.md.txt new file mode 100644 index 00000000..e26fa663 --- /dev/null +++ b/notes/é�¢ç»�/csdn-腾讯å�Žå�°å¼€å�‘é�¢è¯•ç»�验.md.txt @@ -0,0 +1,13 @@ +é�¢è¯•准备:主è¦�准备的知识包括,C/C++ã€�TCP/IPã€�HTTPã€�æ“�作系统ã€�æ•°æ�®ç»“构和算法ã€�熟悉Linuxæ“�作ã€�熟悉Linux网络编程ã€�æ•°æ�®åº“ +(主è¦�是MySql,Redis,Memcached)。 + +C/C++必看书ç±�:C++ Primerã€�深度探索C++对象模型ã€�STLæº�ç �剖æž�ã€�还有其它一些ç»�典书ç±�,比如effective系列,侯æ�·ç¿»è¯‘的其它ç»�å…¸ +TCP/IP必看书ç±�:TCP/IP详解 å�·1:å��议, 图解TCP/IP +HTTP必看书ç±�:图解HTTP,HTTPæ�ƒå¨�指å�—(这本书我就看了一点) +æ“�作系统必看书ç±�:现代æ“�作系统 +æ•°æ�®ç»“构和算法必看书ç±�:数æ�®ç»“构与算法分æž�C++æ��è¿° +Linux知识必看书ç±�:鸟哥的Linuxç§�房è�œåŸºç¡€ +Linux编程必看书ç±�:APUE,UNP。 +æ•°æ�®åº“必看书ç±�:MySql入门很简å�•,高性能MySql + +链接:http://blog.csdn.net/linux_ever/article/details/53575251 diff --git a/notes/é�¢ç»�/javaå�Žå�°ç ”å�‘é�¢ç»�.md.txt b/notes/é�¢ç»�/javaå�Žå�°ç ”å�‘é�¢ç»�.md.txt new file mode 100644 index 00000000..248f80c7 --- /dev/null +++ b/notes/é�¢ç»�/javaå�Žå�°ç ”å�‘é�¢ç»�.md.txt @@ -0,0 +1 @@ +- [牛客网:如何准备校招技术é�¢è¯•](https://www.nowcoder.com/discuss/50990?type=0&order=0&pos=14&page=0) diff --git a/notes/é�¢ç»�/亚辉的é�¢è¯•ç»�验-cvte.md.txt b/notes/é�¢ç»�/亚辉的é�¢è¯•ç»�验-cvte.md.txt new file mode 100644 index 00000000..ff08d2bf --- /dev/null +++ b/notes/é�¢ç»�/亚辉的é�¢è¯•ç»�验-cvte.md.txt @@ -0,0 +1,92 @@ +# 一é�¢ +## 问有没有å�šè¿‡JAVA Web的项目,选一个讲 +答:选择了一个å�šçš„CMSæ�¥è®²ï¼Œå› ä¸ºæˆ‘是这个项目的总负责人 + + +## 问项目上有没有é�‡åˆ°ä»€ä¹ˆå›°éš¾ +答:没有。。 +## 技术选型是如何决定的。 +答:感觉ä¸�是真让回答技术选型的过程。我就对比了SpringMVCå’Œstruts的优缺点,Mybatiså’ŒHibernate的区别。 +ç„¶å�Žä»–å�ˆé—®äº†ä¸ºä»€ä¹ˆé€‰æ‹©äº†shiro而ä¸�是spring security。我就说因为之å‰�没有接触过æ�ƒé™�管ç�†çš„æ¡†æž¶ï¼Œåœ¨ç½‘上看帖å­�说spring security比shiro更为å¤�æ�‚和庞大,对于我们项目没有很多的时间和学习æˆ�本去接触spring security,shiro更容易上手。 + + +## æ•°æ�®åº“查询 +三个表,其中一个表是其他两个表的关系表。问如何根æ�®ä¸€ä¸ªè¡¨çš„字段查找出å�¦å¤–一张表的字段。 +回答出sql。 +我回答了å­�查询,其实用join更好点,但是一时间ä¸�知é�“怎么join。 + + +## æ•°æ�®åº“索引有了解å�—?索引的优缺点。 + + +查询快,æ�’入慢。所以适å�ˆæŸ¥è¯¢ä¸ºä¸»çš„字段。 + + +## 常用的集å�ˆæœ‰å“ªäº› + LinkedList,ArrayList,Hashmap。 + + +## LinkedListå’ŒArrayList的区别 +底层实现ä¸�å�Œã€‚LinkedListå�Œå�‘链表,ArrayList数组。ArrayListæ�’入慢,但是查询快。LinkedListæ�’入快,查询慢。 + + +## LinkedList的底层实现是怎么样的?å�‡å¦‚å¾€LinkedList的第k个ä½�ç½®æ�’入数æ�®ï¼Œæ—¶é—´å¤�æ�‚度?最å�Žä¸€ä¸ªä½�ç½®æ�’入呢? +å�Œå�‘链表。 +第k个ä½�ç½®æ�’入数æ�®ï¼šk+1 ,é��历kä½�,æ�’入一次。 +最å�Žä¸€ä¸ªä½�置:1。因为是å�Œå�‘链表。 + + +## Hashmap能ä¸�能用对象å�škey。 +å�¯ä»¥ã€‚但是得é‡�写hashcode方法和equals方法。 + + +## Hashmap用对象å�škey时,putå�Žï¼Œå�ˆä¿®æ”¹äº†è¿™ä¸ªå¯¹è±¡ï¼Œä¼šå�‘生什么。 +我就说那得看你设计的这个hashcodeå’Œequals方法跟你修改得属性有没有关系,å�‡å¦‚有,那会导致put进去,getä¸�出æ�¥ + + +## java的异常分类 + + +Errorã€�Exception,还有一个比较特别的RuntimeException + + +## Java如何æ�•获异常 +回答:try...catch.. +ç„¶å�Žé—®finallyä¸�是å�—? +回答:ä¸�是。finallyå�ªæ˜¯é…�å�ˆä½¿ç”¨çš„,没有异常的时候å�•独使用finally也是å�¯ä»¥çš„。 +ç„¶å�Žé—® 什么情况下会在finally里é�¢å†™ä»£ç �? +回答:举了数æ�®åº“连接的例å­�。。 + + +## JVM何时会å�‘生内存泄露 +ä¸�知é�“。。å�¯ä»¥çœ‹è¿™ä¸ªå¸–å­� +http://blog.csdn.net/anxpp/article/details/51325838 + + +看了这个帖å­�。。估计é�¢è¯•官是想问我数æ�®åº“连接也会导致内存泄露å�§ã€‚。。 +## JVM的内存划分是如何的 +堆,栈,方法区,程åº�计数器什么呢。 + + +## 方法区都存放了哪些东西 +类的信æ�¯ï¼Œé�™æ€�类和é�™æ€�å�˜é‡�。 + + + + +## 平常ç§�下会å�šä»€ä¹ˆäº‹ +讲了我github一直在维护的个人项目。爬虫和tinyjvm。 + + +## 算法题:0~nå…±n+1个数,从中éš�机抽å�–一个数,剩下的n个数都知é�“是什么,问éš�机抽出的数是什么。 + + +刚开始回答了0~n加起æ�¥ï¼Œç„¶å�Žå‡�去剩下的n个数之和,就å�¯ä»¥å¾—到了。 +ä»–é—®å�‡å¦‚n很大会å�‘生什么情况? +我说会超出int或者long的最大值。 +ç„¶å�Žé€‰æ‹©äº†bitmap的方å¼�æ�¥è§£å†³ï¼Œä¸€ä¸ªæ•°å¯¹åº”一个bit。 +#二é�¢ +è�Šé¡¹ç›® +#HRé�¢ +è�Šæ€§æ ¼ + diff --git a/notes/é�¢ç»�/亚辉的é�¢è¯•ç»�验-美团.md.txt b/notes/é�¢ç»�/亚辉的é�¢è¯•ç»�验-美团.md.txt new file mode 100644 index 00000000..e8164c7b --- /dev/null +++ b/notes/é�¢ç»�/亚辉的é�¢è¯•ç»�验-美团.md.txt @@ -0,0 +1,36 @@ +# 一é�¢ +## 开闭原则 +## 简å�•工厂和工厂模å¼�的区别 +## MySQL的隔离级别 +## MySQL的索引,原ç�† +## MySQL幻读和è„�读的区别 +## Hashmap是ä¸�是线程安全的。 +## Hashmap的底层机制。除了拉链法,还有哪些解决冲çª�的方法。 +## static的用法 +## sleepå’Œwait的区别 +sleep()方法导致了程åº�æš‚å�œæ‰§è¡ŒæŒ‡å®šçš„æ—¶é—´ï¼Œè®©å‡ºcpu该其他线程,但是他的监控状æ€�ä¾�ç„¶ä¿�æŒ�者,当指定的时间到了å�ˆä¼šè‡ªåЍæ�¢å¤�è¿�行状æ€�。 + + +在调用sleep()方法的过程中,线程ä¸�会释放对象é”�。 + + +而当调用wait()方法的时候,线程会放弃对象é”�,进入等待此对象的等待é”�定池,å�ªæœ‰é’ˆå¯¹æ­¤å¯¹è±¡è°ƒç”¨notify()方法å�Žæœ¬çº¿ç¨‹æ‰�进入对象é”�定池准备 + + +获å�–对象é”�进入è¿�行状æ€�。 +## notifyå’ŒnotifyAll的区别 +这个问题的主è¦�考点在于é”�池和等待池 +http://blog.csdn.net/emailed/article/details/4689220 +## spring的底层æ€�想是什么 +## 为什么会有GC? +## JVM的垃圾收集算法,以å�Šå¹´è½»ä»£ã€�å¹´è€�代是如何选择垃圾收集算法 +新生代 å¤�制算法 Edenã€�Survivor +è€�年代 标记整ç�†/标记清除 + + +## HTTP是哪一层的? +## GETå’ŒPOST的区别 +## 类加载的æµ�程 +## 一次æµ�览器到æœ�务器端的HTTP请求是怎么样的。 +https://www.zhihu.com/question/34873227 +## 怎么加快HTTP请求的速度? \ No newline at end of file diff --git a/notes/é�¢ç»�/亚辉的é�¢è¯•ç»�验-腾讯.md.txt b/notes/é�¢ç»�/亚辉的é�¢è¯•ç»�验-腾讯.md.txt new file mode 100644 index 00000000..d93a7b0a --- /dev/null +++ b/notes/é�¢ç»�/亚辉的é�¢è¯•ç»�验-腾讯.md.txt @@ -0,0 +1,261 @@ +# 一é�¢ +## 讲下class文件结构 + + +## import是在class文件哪里存储的 + + +## 类是从哪里加载的 +bootstrapã€�extã€�user + + +## 栈指令集和寄存器指令集的区别 +http://www.voidcn.com/blog/pq258280920/article/p-4274066.html + + +## GC算法。 +感觉这个必问的。说了下分代收集。 + + +## Httpçš„action都有哪些 +我回答了GETã€�POSTã€�PUTã€�DELETEã€�HEAD。我说应该还有,但一时想ä¸�èµ·æ�¥äº†ã€‚他就没继续问了。 +TRACEã€�OPTIONS +## http1.0å’Œ2.0的区别在哪里 +我说最大的区别就是安全方é�¢ã€‚ ç„¶å�Žä»–说还有呢? + + +## TCPå’ŒUDP的区别 + + +## 线程和进程的区别 + + +## QQ应该用哪一ç§�? +我说QQ主è¦�ä¿�è¯�消æ�¯ä¸�丢失。å�¯ä»¥é‡‡ç”¨TCPå’ŒUDPæ··å�ˆçš„。在网络环境差的时候,用TCPä¿�è¯�消æ�¯ä¸�丢失。网络环境好的时候,å�¯ä»¥é‡‡ç”¨UDP加快速度。 + + +我感觉对于TCPå’ŒUDPçš„ç�†è§£ä¸�是很到ä½�,知乎有个问题 +https://www.zhihu.com/question/20292749 +## TCP是怎么ä¿�è¯�消æ�¯å�¯é� æ€§çš„? + + +## Gitå’ŒSVN的区别。 +讲了Git的分布å¼�版本库和SVN的集中å¼�版本库。 + + +## MySQLå�‡å¦‚查询é�žå¸¸æ…¢ï¼Œæ€Žä¹ˆè§£å†³? +1. 建索引 +2. 分表。 +é�¢è¯•官感觉ä¸�太够,问还有å�—? +http://tech.meituan.com/mysql-index.html +《高性能MySQL》 查询性能优化 +## 排åº�算法都有哪些。æ¯�个的时间å¤�æ�‚度都是多少? + + +## å�•链表排åº� +æ—¶é—´å¤�æ�‚度O(nlgn) 空间å¤�æ�‚度O(1) +å�¯ä»¥ä½¿ç”¨å½’并排åº�æ�¥å�šã€‚ +http://noalgo.info/388.html +## 给两分钟讲下一个你å�šçš„æœ€å¥½é¡¹ç›®ã€‚ +我讲了税务主题爬虫项目。介ç»�了爬虫的技术。以å�Šæˆ‘è´Ÿè´£URL去é‡�,正文æ��å�–以å�Šå�ŽæœŸçš„é‡�构。 +ç„¶å�Žé�¢è¯•官根æ�®è¿™å‡ éƒ¨åˆ†åˆ†åˆ«å±•开问。 + + +## url去é‡�。 +BloomFilter + æ ¹æ�®æ–‡ä»¶å��去é‡�。 +讲了下为什么这么å�šã€‚ç„¶å�Žé�¢è¯•官问为什么存文件。我说是因为å�ŽæœŸæ�°å¥½ä¹Ÿè¦�建æ�œç´¢å¼•擎,刚好存文件的时候判断文件是å�¦å­˜åœ¨ã€‚ +é�¢è¯•官好åƒ�对æ�œç´¢å¼•擎很感兴趣,于是似乎想问我æ�œç´¢å¼•擎的知识,我说这å�—ä¸�是我负责的,但是知é�“一些。é�¢è¯•官说,ä¸�是你负责的就算了å�§ã€‚ + + +## 正文æ��å�–的步骤 +简å�•说了下所用的哈工大的基于行å�—密度的正文æ��å�–算法,中间也加了常è§�çš„æ�‚质过滤,以ä¿�è¯�最终结果的纯净。 + + +é�¢è¯•官问了怎么组织这些æ�‚质信æ�¯å‘¢ï¼Ÿè¿™äº›ä¿¡æ�¯éƒ½æ”¾åœ¨å“ªé‡Œäº†å‘¢ï¼Ÿ +我说放在了数æ�®åº“里é�¢ï¼Œç„¶å�Žå�¯åЍ之å�ŽåŠ è½½åˆ°redis里é�¢ã€‚ + + +## redis用过å�—?讲下你所知é�“çš„redis? +讲了下IO多路å¤�用 + + +## 说下IO多路å¤�用。 epollå’Œselect的区别。epoll的水平触å�‘和边缘触å�‘。 + + +## 说下BloomFilter的原ç�†ã€‚ + + +这个幸好我寒å�‡æœ‰ç ”究。具体å�¯ä»¥çœ‹æˆ‘çš„å�šå®¢ã€‚è¿™å�—回答的蛮好的。 +http://www.cyhone.com/2017/02/07/Introduce-to-BloomFilter/ + + +## Hashmap 底层实现 +讲一é��Hashmap的原ç�†ã€‚ + + +## Hashmap å�¯ä»¥å­˜nullå�—? +valueå�¯ä»¥ä¸ºnull。keyå�ªèƒ½æœ‰ä¸€ä¸ªä¸ºnull。 + + +## ConcurrenyHashMap的底层? +我说没看过æº�ç �,但知é�“他是由分段é”�æ�¥å®žçŽ°çš„ã€‚ä¹Ÿæ²¡ç»§ç»­é—®ä¸‹åŽ»ã€‚ + + +## 除了synchronized,还有其他的å�Œæ­¥æ–¹å¼�? +é‡�å…¥é”�ã€�读写é”�。还有一些javaæ��供的å�Œæ­¥ç±»ã€‚ + + +## 读写é”�。加读é”�的时候能ä¸�能写? + + +## Webå�Žç«¯æ˜¯æ€Žä¹ˆåˆ†å±‚的。为什么这么分。 +讲了下MVCå’Œå�Žç«¯çš„serviceã€�daoå’Œaction。 + + +我说主è¦�是业务的解耦以å�Šå�¯ä»¥åˆ†å·¥å�ˆä½œã€‚ +## 讲一下你所知é�“çš„docker。 +我说了下docker和虚拟机的区别,主è¦�区别是docker是基于宿主机的内核,而虚拟机是有自己的æ“�作系统内核。 +主è¦�相似性就是都æ��供了è¿�行环境的隔离。 +http://dockone.io/article/723 + + +ç„¶å�Žé�¢è¯•官就根æ�®è¿™ä¸ªç‚¹ï¼Œæ·±å…¥é—®äº†ä¸€ä¸ªé—®é¢˜ã€‚ +## 宿主机能ä¸�能看到docker的进程 +我说ä¸�能看到。其实是å�¯ä»¥çœ‹åˆ°çš„ï¼� +http://dockone.io/question/529 + + +## NOSQLå’ŒSQL的区别,以å�Šæ¯�个的应用场景 + + +# 二é�¢ + + +## StringBufferå’ŒStringBuilder的区别 +StringBuilder 线程ä¸�安全 +## Java中final的用处 +1. 用于类 ä¸�å�¯ç»§æ‰¿ +2. 用于方法 ä¸�å�¯é‡�写 +3. 用于属性 值ä¸�å�¯ä¿®æ”¹ï¼Œå¯¹è±¡ä¸�å�¯ä¿®æ”¹åœ°å�€ + + +## 什么情况下ä¸�用final会编译失败 +这个没回答上æ�¥ã€‚下æ�¥æŸ¥äº†ä¸€ä¸‹ +1. 匿å��内部类æ�¥è‡ªå¤–部闭包环境的自由å�˜é‡�必须是finalçš„ +2. 在外部类æˆ�员方法内部的内部类。 +3. 在一个代ç �å�—block里的内部类。 +https://www.zhihu.com/question/21395848 + + +## 说下HashMap的底层实现 +这个目å‰�所有é�¢è¯•中都问了。 所以HashMapçš„æº�ç �一定è¦�好好看。 +## Java8解决冲çª�的方å¼� + 我说还是拉链法,似乎ä¸�是很满æ„�,然å�Žæˆ‘说,当超过冲çª�æŸ�个值时,Java8会把链表改为Treemap。 +## ThreadLocal了解多少 + 讲了下ThreadLocalçš„æº�ç �实现,threadçš„localmap对象之类的。 +## 快排的最大时间å¤�æ�‚度ã€�最å°�æ—¶é—´å¤�æ�‚度ã€�å¹³å�‡æ—¶é—´å¤�æ�‚度。 +## 快排是ä¸�是稳定的。 +快排是ä¸�稳定的。 +这个真是自己找死,我å�ˆè¯´äº†å †æŽ’åº�是稳定的。实际上是ä¸�稳定啊脑å­�啊脑å­�。。 +http://baike.baidu.com/item/%E6%8E%92%E5%BA%8F%E7%AE%97%E6%B3%95%E7%A8%B3%E5%AE%9A%E6%80%A7 + + +## 1000万个数æ�®çš„Top K + 说了最大堆。然å�Žè®©æˆ‘计算1000万个int有多大,然å�Žè¯´å†…存足够。 + ç„¶å�Žæˆ‘讲了下如何用快排实现topk的过程。 + 当内存足够的情况下,用快排时间求topkå¤�æ�‚度å�¯ä»¥ä¸ºO(n) +## TCP的四次挥手 +## UDP一次最大å�‘é€�多少个字节 +## Http状æ€�ç � + 主è¦�问了302ã€�404ã€�500 + http://seo.ibw.cn/display.asp?id=82 + +## rediså’Œmemcached的区别 + 给了个选择题。实际上就是问rediså’Œmemcached的差异,最大的差异就是memcachedä¸�支æŒ�å¤�æ�‚类型如list等。 +## 最快的进程间通信方å¼�是怎么样的 + + +## linux命令 + df -h 查看ç£�盘空间 + du -h 查看文件夹大å°� + lsof 查看端å�£å� ç”¨ + top | grep 查看cpuå� ç”¨ + ps -aux | grep + + + linux如何查看一个进程的执行路径? + http://lovesoo.org/view-processes-running-linux-full-path-method.html + ll /proc/{pid} + + 通过进程å��查找进程PIDå�¯ä»¥é€šè¿‡ pidof +## 逻辑题。 +五辆汽车加油问题。 +1/5+1/4+1/3+1/2+1 +## 问了一个多分布å¼�消费者请求生产者的问题 +当时一时间没想出æ�¥ã€‚就往raftå��议和一致性hash上é�¢è¯´ +## raftå��è®®ã€�一致性hash +扯了一波主节点分å�‘,领导者选举,一致性hash啥的。我都ä¸�知é�“我在说啥了,估计é�¢è¯•官也晕晕的。。 +raftå��议说完å�Žï¼Œé�¢è¯•官问如果没有主控节点,所有节点都是平级的应该怎么如何设计。 +我说应该加分布å¼�é”�。 +## 如何实现一个分布å¼�é”�。 +我说使用rediså�¯ä»¥å®žçŽ°åˆ†å¸ƒå¼�é”�,但是具体的怎么实践还ä¸�是很清楚。 +具体的分布å¼�é”�的细节,都在此å�šå®¢ä¸­æœ‰ +http://ifeve.com/redis-lock/ + + +最å�Žé�¢è¯•官介ç»�说他们是腾讯手机QQ团队 + + +å‰�é�¢ä¸¤é�¢ç”µé�¢é�¢è¯•完之å�Žï¼ŒHR通知我去深圳é�¢è¯•,当天有三é�¢å’Œå››é�¢ã€‚ +# 三é�¢ +手写代ç �。 +1. 两个字符串å‰�nä½�忽略大å°�写的比较。 +2. bitmap实现。 + + +手写完代ç �之å�Žé�¢è¯•官直接带我去四é�¢ï¼Œå››é�¢æ˜¯æ€»ç›‘é�¢ã€‚ +# å››é�¢ + + +1. 英语六级 +我的六级是飘过,é�¢è¯•官对此略ä¸�满æ„�。 +2. linux熟悉å�—. +我说了下/proc.é�¢è¯•官让我讲下底层实现。。 +ç„¶å�Žé�¢è¯•官问linux下的inode熟悉å�—。 +我ä¾�稀记得是apue里é�¢è®²è¿‡ï¼Œä½†ä¸€ç‚¹ä¹Ÿæƒ³ä¸�èµ·æ�¥äº†ã€‚就说了ä¸�知é�“。 + + +3. TCP为什么四次挥手。 +4. TIME_WAIT阶段是干嘛的。 +5. “六度空间ç�†è®ºâ€�该如何表示 +我说了下用一个巨大的图,然å�Žå°†å…¶è½¬åŒ–为å�„个节点之间的最短路径问题。 +6. 链表倒数第k个怎么快速找。 +å�ŒæŒ‡é’ˆæ–¹æ³• +7. Mac osçš„å�‘展å�² +8. nio +9. 二å�‰æ ‘é��历,é�žé€’归的方å¼� + + +å››é�¢æˆ‘个人总体感觉还ä¸�错,但是é�¢è¯•完å�Žåœ¨è…¾è®¯å¤§åŽ¦ç­‰äº†ä¸€ä¸‹å�ˆä¹Ÿæ²¡HRé�¢ï¼Œå› ä¸ºè¦�回武汉就没继续等下去,å�Žæ�¥é€šçŸ¥ç»“果跪了。 +想想四é�¢èµ°æ�¥æœ€ç»ˆæœ€å�Žè·ªäº†ï¼Œä¹Ÿæ˜¯è›®é�—憾。但是也å�‘现了个人在很多方é�¢çš„ä¸�足。 + + + + +å�Žæ�¥å�‘现竟然是因为æ��å‰�走了被认定为自动放弃。。。。好气。。 +å�Žæ�¥å�‚加了腾讯在武汉的校招。到了现场å�Žå�‘现自己被调到了è¿�è�¥å¼€å�‘岗。 +# 一é�¢ï¼ˆè¿�è�¥å¼€å�‘) +## 从æµ�览器到æœ�务器请求结果,整个æµ�程 + + +é�¢è¯•完之å�Žé�¢è¯•官通知我过了一é�¢ã€‚看é�¢è¯•官心情好,就申请了转岗。 +晚上6点多的时候,被TEGçš„æ�žäº†èµ·æ�¥ã€‚ + + +# 一é�¢ + + +# 二é�¢ + + +# HRé�¢ \ No newline at end of file diff --git a/notes/é�¢ç»�/亚辉的é�¢è¯•ç»�验-阿里.md.txt b/notes/é�¢ç»�/亚辉的é�¢è¯•ç»�验-阿里.md.txt new file mode 100644 index 00000000..15e90c4d --- /dev/null +++ b/notes/é�¢ç»�/亚辉的é�¢è¯•ç»�验-阿里.md.txt @@ -0,0 +1,147 @@ +# 简历筛选é�¢ + + +## 介ç»�下自己 + + +## 介ç»�下爬虫项目 + + +## 爬虫项目正文æ��å�–的算法 +介ç»�了下正文æ��å�–算法。é�¢è¯•官没继续问下去。。 + + +## 说下你们的爬虫跟其他爬虫比主è¦�ä¸�一样的地方是哪里 + + +## 爬虫里é�¢simhash是怎么回事 +介ç»�了下simhash是干嘛的。é�¢è¯•官也没继续问下去。。 + + +## 会Javaå�—。。介ç»�下垃圾回收方é�¢çš„东西。 +回答了分代收集的æµ�程 +## 会算法å�—。。说下常è§�的排åº�。。 + + +## 说下冒泡排åº�的优势。。 + + +## å�‡å¦‚有1000万个数æ�®éœ€è¦�排åº�,用哪个å�ˆé€‚。 +说的堆排åº�,这个说错了。实际上应该是二路归并排åº�,有点é�—憾。 + + +## 说下é‡�载和é‡�写。。 + + +## 说下Hashmap +没太明白让我说什么。。就把Hashmapçš„æµ�程说了下。然å�Žé—®æˆ‘keyå’Œvalue是怎么存的。。有点懵逼,ä¸�知é�“想问啥,就说了Entry。 + + +总体é�¢è¯•的很ä¸�舒æœ�。过了一个多星期接到一个电è¯�告诉我之å‰�的那个是简历筛选é�¢ã€‚ç„¶å�Žçº¦äº†é�¢è¯•的时间。 + + +# 一é�¢ï¼ˆ38分钟) + + +## 问了学了那些课?数æ�®ç»“构考了多少分?专业排å��怎么样 + + +## 都会哪些语言 +Javaã€�Golangã€�Pythonã€�PHP。 +其中Java用的最多。 + + +## 怎么学习Java的?都看了哪些书?英文版的还是中文版的。 +看书+实践 +《Think in Java》ã€�《Effective Java》ã€�《Javaå¹¶å�‘编程指å�—》ã€�《深入ç�†è§£Java虚拟机》 +一般是以中文版为主,中间有歧义的å�¥å­�会对照ç�€è‹±æ–‡ç‰ˆçš„看。 + + +## Java内存回收 +分代收集那一套讲一é��。 + + +## å¹¶å�‘。 +线程间通信方å¼�。 +ThreadLocal原ç�†ã€�场景。 +volatile原ç�†ï¼šJava内存模型划分为主内存工作内存之类的。 + + +## ARPå��议。 +IP地å�€->物ç�†åœ°å�€ã€‚ + + +## 有没有å�šè¿‡è·¯ç”±å™¨ç›¸å…³çš„å¼€å�‘。 +实际上计算机网络实验课还是弄过的。。但是全忘光了。。å�ªèƒ½è¯´æ²¡æœ‰ã€‚。 + + +## 递归的优点与缺点,递归优化。 + + +通过使用尾递归,编译器å�¯ä»¥å°†é€’归代ç �优化为é�žé€’归的。 +http://blog.csdn.net/whinah/article/details/6419680 +http://www.ruanyifeng.com/blog/2015/04/tail-call.html + + +## 排åº�算法,了解哪些排åº�算法,那些是稳定的。 + + +## MySQL索引方é�¢ +查询一æ�¡è¯­å�¥çš„æ—¶å€™ï¼Œæ€Žä¹ˆçŸ¥é�“他用了哪些索引。 +explain +show index from +## 常è§�çš„Linux命令。用的哪个å�‘行版。 +psã€�lsofã€�dfã€�duã€�top + + +## Rediså’ŒMemcached的区别。 + + +## 说下项目 + + +# 二é�¢ + + +## 数学建模比赛的情况。 +## 项目 +## 线程和进程的区别 +## 对java线程的ç�†è§£ + java内存模型 +## hashmap与ConcurrentHashMap +## 线程的几ç§�状æ€�,状æ€�之间是怎么轮转的 +## ThreadLocal应用场景 +## mybatis与jdbc template +## limit字段使用 + + +# 三é�¢ + + +## 项目 +爬虫去é‡�是怎么å�šçš„? +正文æ��å�–是怎么å�šçš„。 +å�ªå�¯ä»¥æŠ“å�–é�™æ€�页é�¢å�—?如果è¦�抓å�–js渲染的页é�¢åº”该怎么å�šã€‚ +å�¯ä»¥æŠ“å�–Https的网站å�—? + + +## 毕设 +内容相似度是怎么比较的。 +余弦相似度的æµ�程。 + + +## 用户体验你怎么看? +回答这个问题时候有点懵。。 +语言组织有点乱。就说了 +用户UI和用户交互 +功能ä¸�è¦�太深,层次在3-4层就å�¯ä»¥ã€‚ +用户行为日志分æž� +用户å��馈 + + +## 还报了哪些公å�¸ï¼Ÿ + + +这个é�¢è¯•总共å��五分钟。。é�¢è¯•官说看了å‰�两é�¢çš„é�¢è¯•记录,觉得没太多问题è¦�问我的了。 +心情愉悦。。 + diff --git a/notes/é�¢ç»�/知识点差缺补æ¼�.txt b/notes/é�¢ç»�/知识点差缺补æ¼�.txt new file mode 100644 index 00000000..fef84d86 --- /dev/null +++ b/notes/é�¢ç»�/知识点差缺补æ¼�.txt @@ -0,0 +1,6 @@ +IO多路å¤�用 +Java HashMap LinkedList CurrentHashMap æº�ç � 1 2 3 4 5 +Java å¹¶å�‘:countDownLatch CAS +æµ�览器访问网站全过程 +C++ 基础语法 +​sql注入​ \ No newline at end of file diff --git a/notes/é�¢ç»�/腾讯å�Žå�°ç ”å�‘é�¢è¯•.md.txt b/notes/é�¢ç»�/腾讯å�Žå�°ç ”å�‘é�¢è¯•.md.txt new file mode 100644 index 00000000..2b29d927 --- /dev/null +++ b/notes/é�¢ç»�/腾讯å�Žå�°ç ”å�‘é�¢è¯•.md.txt @@ -0,0 +1 @@ +- [牛客网:腾讯å�Žå�°å¼€å�‘一é�¢äºŒé�¢çºªå®ž](https://www.nowcoder.com/discuss/5082) diff --git a/notes/é�¢ç»�/é�¢ç»�文档.txt b/notes/é�¢ç»�/é�¢ç»�文档.txt new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/notes/é�¢ç»�/é�¢ç»�文档.txt @@ -0,0 +1 @@ + diff --git a/notes/é�¢ç»�/é�¢ç»�汇总.md.txt b/notes/é�¢ç»�/é�¢ç»�汇总.md.txt new file mode 100644 index 00000000..1319ca4e --- /dev/null +++ b/notes/é�¢ç»�/é�¢ç»�汇总.md.txt @@ -0,0 +1,119 @@ +# 算法 + +- ä¹�ä¹�乘法表(美团) +- 大文件å°�内存如何排åº�,大概的æ€�路是大文件划分为å°�文件然å�޿ޒåº�归并。(网易) +- 100亿个long int,å�–中ä½�数(腾富å�šï¼‰ +- 一个矩阵中元素分类的算法。一个矩阵中的元素和它周围八个元素是相邻的。如果两个元素相邻切相等就认为他们是一类。(微软) +- 给2TBæ•°æ�®ï¼Œ2GB的内存,详细说明外部排åº�算法,算法å¤�æ�‚度。然å�Žå›žç­”一共读了多少数æ�®é‡�,写了多少数æ�®ã€‚(2路,多路都问了) + +# Java + +- String,StringBuffer,StringBuider区别,结å�ˆçº¿ç¨‹å’Œå�•例模å¼�å�˜æ�¢ç�€é—®(美团) +- JVM垃圾回收,è€�年和新生代区别(美团) +- JVM内存分é…�(美团) +- HashMap原ç�†ï¼Œå¯»æ‰¾ç¬¬ä¸€ä¸ªentryä½�置(美团) +- Wait()å’Œsleep()区别(58到家) +- 线程安全集å�ˆç±»ï¼ˆ58到家) +- ä¸�加é”�,如何实现线程安全(58到家) +- Stringæº�ç �看过么?(58到家) +- Volatile有什么功能,能å�¦å®žçŽ°çº¿ç¨‹å®‰å…¨ï¼ˆ58到家) +- 线程池的四ç§�创建方å¼�,以å�Šçº¿ç¨‹æ± çš„好处(猎è�˜ï¼‰ +- HashMap底层原ç�†ï¼Œæ‰©å®¹æœºåˆ¶ï¼ˆçŒŽè�˜ï¼‰ +- 如何组织列对象åº�列化,关键字是什么(猎è�˜ï¼‰ +- GC是ä¸�是守护线程(盖亚互娱) +- 阻塞和é�žé˜»å¡žæœ‰ä»€ä¹ˆåŒºåˆ«ï¼ˆRokid) +- ArrayList()的扩容机制(éš�行付) +- 如何实现多线程异步方å¼�(Keep) +- Sychronizedå’ŒLocké”�的区别(Keep) +- 堆和栈结构(Keep) +- 堆一般存放那几ç§�对象(Keep) +- Threadå’ŒRunnable区别 +- 字节æµ�和字符æµ�区别(猎豹) +- Arraylistå’ŒLinkedlisæº�ç �(猎豹) + +# Java EE + +- 对Mybatisçš„ç�†è§£ï¼Œä½¿ç”¨çš„好处(Rokid) +- 说说Mybatis优点,缓冲,与Hibernate有什么区别 +- Mybatis的映射原ç�†æ˜¯ä»€ä¹ˆï¼ˆRokid) +- 说说BIO,AIO,NIO的区别(Rokid) +- Springå’ŒspringMVC的处ç�†å¼‚常问题(Keep) + +# C++ + +- 动æ€�链接库的认识(360) +- 与 Java 的区别 +- vector 动æ€�增长 +- Socket 通信 + +# 计算机网络 + +- tcp udp区别,报文格å¼�(网易) +- 网络粘包问题å�Šè§£å†³æ–¹æ¡ˆã€‚(cvte) + +# æ“�作系统 + +- 为什么用epoll,ä¸�用select,区别是什么(腾富å�šï¼‰ +- writeå’Œfwrite区别 (58) + +# 数æ�®åº“ + +- 数æ�®åº“隔离级别,分别产生的错误(美团) +- 数æ�®åº“分页的关键字是什么,如何实现(猎è�˜ï¼‰ +- 数æ�®åº“中分表的原因(éš�行付) +- Mysql索引原ç�†ï¼Œæ€Žä¹ˆå®žçŽ°ï¼Œç¬¦å�ˆç´¢å¼•æ�¡ä»¶ï¼ˆKeep) +- 为什么串行化消耗的资æº�大?(网易) +- mysqlå’ŒOracle的区别(美团) +- 你的项目中给用户密ç �进行了salt加密,如果加密算法泄æ¼�了怎么办?(美团) + +# Linux + +- 如何查看连接本主机的其他ip(Rokid) +- netstat如何查看端å�£ä½¿ç”¨æƒ…况,å�‚数是什么(Rokid) +- Linux如何进行文件删除(神州信æ�¯ï¼‰ + + +# 分布å¼� + +- 问我了解分布å¼�å�—(网易) +- MapReduce +- Hadoop + +# 设计模å¼� + +- 了解的设计模å¼�,结å�ˆÂ jdk(éš�行付) + +# é�¢å�‘对象 + +- 多æ€�çš„ç�†è§£ï¼Œç»†è¯´äº†é‡�载和é‡�写(Keep) + +# 系统设计 + +- 设计一个类似于qq的东西,客户端和æœ�务端è¦�怎么设计(网易) + +# 智力题 + +- a,b,aa,ab,ba,bb ,,,,,问接下æ�¥çš„æ˜¯ä»€ä¹ˆï¼ˆç”»äº†ä¸€ä¸ªäºŒå�‰æ ‘,根节点空,左å�³å­�æ ‘a,b以此类推),然å�Žå�ˆæ”¹é€ äº†ä¸€ä¸‹ï¼Œæ�¢æˆ�01,这样移动或加å‡�1å°±å�¯è§£å†³äº†ï¼ˆKeep) + +- 有足够é‡�çš„2分ã€�5分ã€�1分硬å¸�,如果想凑é½�一元钱,å�¯ä»¥æœ‰å¤šå°‘ç§�方法(猎豹) + +# 其它 + +- 平时爱看什么é�žæŠ€æœ¯ä¹¦ï¼ˆç¾Žå›¢ï¼‰ +- 学习规划(猎è�˜ï¼‰ +- 群é�¢ï¼Œå¼€æ”¾æ€§æ€�维题(Rokid) +- 家庭情况(Keep) +- 平时爱好(Keep) +- 自身优势(第一:我自学能力ä¸�错,å�šäº‹èƒ½å�šæŒ�,以我的计算机知识为例。第二:我有明确的目标和规划,ä¸�会在考研工作之å‰�徘徊。)(网易) +- å®�å�šé¸¡å¤´ä¸�å�šå‡¤å°¾Â Â è¿™å�¥è¯�你怎么看?(网易) +- 你周围的人怎么评价你?(网易) +- 你的自学过程是怎样的?(网易) +- 有没女朋å�‹ï¼ˆç½‘易) +- 问æˆ�绩,问爱好,家在哪,有没有男朋å�‹ï¼Œå·¥ä½œæ„�å�‘地点是哪(58) +- 有没有其他offer(招银) +- 对加ç�­æ€Žä¹ˆçœ‹ï¼ˆæ‹›é“¶ï¼‰ +- 你更希望从事哪方é�¢çš„工作,应用型还是研究型的工作?为什么? +- 你觉得应用和研究之间的关系和区别? +- 平时会逛技术论å�›å�—? +- 平时会自己写一些å°�程åº�å�—? +- æ�¥ä¸€æ®µè‹±æ–‡çš„自我介ç»�。 \ No newline at end of file diff --git a/notes/é�¢ç»�/é�¢è¯•.md.txt b/notes/é�¢ç»�/é�¢è¯•.md.txt new file mode 100644 index 00000000..3ff3ef4b --- /dev/null +++ b/notes/é�¢ç»�/é�¢è¯•.md.txt @@ -0,0 +1,7 @@ +# [Leetcode刷题五é��还没offer - å�¬æˆ‘分æž�为什么找工作光刷题没用](http://blog.sina.com.cn/s/blog_686de9d90102w0rf.html) + +- é�¢è¯•官希望你跟他沟通,é�¢è¯•有æ�¥æœ‰å¾€ï¼Œä¸Šæ�¥äºŒè¯�ä¸�说闷头就写代ç �最糟糕。 + +- 有些时候,é�¢è¯•官甚至把题目å�šç‚¹å°�å�˜åŒ–,或者是有æ„�æ— æ„�把题目说模糊点,让你想当然的以为是æŸ�ç§�情况,一头跳进去,折腾一番å�‘现跟想象的ä¸�一样,结果就是稳稳的拒掉你了。 + +- 解决方法很简å�•:æ¯�次å�šé¢˜ä¹‹å‰�,跟对方迅速说下你的æ€�路,看看是å�¦æ˜¯ä»–想å�¬åˆ°çš„æ–¹æ³•,å†�动手,就é�¿å…�问题了。 \ No newline at end of file diff --git a/notes/é�¢ç»�/é�¢è¯•题-HTTP.txt b/notes/é�¢ç»�/é�¢è¯•题-HTTP.txt new file mode 100644 index 00000000..82fc606d --- /dev/null +++ b/notes/é�¢ç»�/é�¢è¯•题-HTTP.txt @@ -0,0 +1,6 @@ + + HTTP缓存机制(cache-controlã€�Expires之类的一系列请求与相应报头字段) + +HTTP1.0å’ŒHTTP1.1区别 + +sessionå’Œcookie的区别,ç¦�用cookieå�Žæ€Žä¹ˆåŠž diff --git a/notes/é�¢ç»�/é�¢è¯•题-Linux.md.txt b/notes/é�¢ç»�/é�¢è¯•题-Linux.md.txt new file mode 100644 index 00000000..d55874c9 --- /dev/null +++ b/notes/é�¢ç»�/é�¢è¯•题-Linux.md.txt @@ -0,0 +1,144 @@ +硬链接和软连接区别 +kill用法,æŸ�个进程æ�€ä¸�掉的原因(进入内核æ€�,忽略killä¿¡å�·ï¼‰ +linux用过的命令 +系统管ç�†å‘½ä»¤ï¼ˆå¦‚查看内存使用ã€�网络情况) +管é�“的使用 | +grep的使用,一定è¦�掌æ�¡ï¼Œæ¯�次都会问在文件中查找 +shell脚本 +find命令 +awk使用 + +作者:oscarwin +链接:https://www.nowcoder.com/discuss/59394 +æ�¥æº�:牛客网 + +进程与线程 + +(1) 进程与线程区别? +(2) 线程比进程具有哪些优势? +(3) 什么时候用多进程?什么时候用多线程? +(4) LINUX中进程和线程使用的几个函数? +(5) 线程å�Œæ­¥ï¼Ÿ +在Windows下线程å�Œæ­¥çš„æ–¹å¼�有:互斥é‡�,信å�·é‡�,事件,关键代ç �段 +在Linux下线程å�Œæ­¥çš„æ–¹å¼�有:互斥é”�,自旋é”�,读写é”�,å±�éšœ(å¹¶å�‘完æˆ�å�Œä¸€é¡¹ä»»åŠ¡æ—¶ï¼Œå±�障的作用特别好使) +知é�“这些é”�之间的区别,使用场景? +进程间通讯方å¼� + +管é�“( pipe ):管é�“是一ç§�å�Šå�Œå·¥çš„通信方å¼�,数æ�®å�ªèƒ½å�•å�‘æµ�动,而且å�ªèƒ½åœ¨å…·æœ‰äº²ç¼˜å…³ç³»çš„进程间使用。进程的亲缘关系通常是指父å­�进程关系。 + +命å��管é�“ (FIFO) : 有å��管é�“也是å�Šå�Œå·¥çš„通信方å¼�,但是它å…�许无亲缘关系进程间的通信。 + +ä¿¡å�·é‡�:信å�·é‡�用于实现进程间的互斥与å�Œæ­¥ï¼Œè€Œä¸�是用于存储进程间通信数æ�®ï¼Œæœ‰XSIä¿¡å�·é‡�å’ŒPOSIXä¿¡å�·é‡�,POSIXä¿¡å�·é‡�更加完善。 + +消æ�¯é˜Ÿåˆ—( message queue ) : 消æ�¯é˜Ÿåˆ—是由消æ�¯çš„链表,存放在内核中并由消æ�¯é˜Ÿåˆ—标识符标识。消æ�¯é˜Ÿåˆ—å…‹æœ�了信å�·ä¼ é€’ä¿¡æ�¯å°‘ã€�管é�“å�ªèƒ½æ‰¿è½½æ— æ ¼å¼�字节æµ�以å�Šç¼“冲区大å°�å�—é™�等缺点。 + +共享内存( shared memory ) :共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都å�¯ä»¥è®¿é—®ã€‚共享内存是最快的 IPC 方å¼�,它是针对其他进程间通信方å¼�è¿�行效率低而专门设计的。它往往与其他通信机制,如信å�·ä¸¤ï¼Œé…�å�ˆä½¿ç”¨ï¼Œæ�¥å®žçŽ°è¿›ç¨‹é—´çš„å�Œæ­¥å’Œé€šä¿¡ã€‚(原ç�†ä¸€å®šè¦�清楚,常考) + +ä¿¡å�·Â ( sinal ) : 信å�·æ˜¯ä¸€ç§�比较å¤�æ�‚的通信方å¼�,用于通知接收进程æŸ�个事件已ç»�å�‘生,常è§�的信å�·ã€‚ + +套接字( socket ) : 套解å�£ä¹Ÿæ˜¯ä¸€ç§�进程间通信机制,与其他通信机制ä¸�å�Œçš„æ˜¯ï¼Œå®ƒå�¯ç”¨äºŽä¸�å�Œå�Šå…¶é—´çš„进程通信。 + +匿å��管é�“与命å��管é�“的区别:匿å��管é�“å�ªèƒ½åœ¨å…·æœ‰å…¬å…±ç¥–先的两个进程间使用。 +共享文件映射mmap +mmap建立进程空间到文件的映射,在建立的时候并ä¸�直接将文件拷è´�到物ç�†å†…存,å�Œæ ·é‡‡ç”¨ç¼ºé¡µç»ˆç«¯ã€‚mmap映射一个具体的文件å�¯ä»¥å®žçް任æ„�进程间共享内存,映射一个匿å��文件,å�¯ä»¥å®žçŽ°çˆ¶å­�进程间共享内存。 +常è§�的信å�·æœ‰å“ªäº›ï¼Ÿï¼šSIGINT,SIGKILL(ä¸�能被æ�•获),SIGTERM(å�¯ä»¥è¢«æ�•获),SIGSEGV,SIGCHLD,SIGALRM +内存管ç�† + +1. 虚拟内存的作用? +2. 虚拟内存的实现? +3. æ“�作系统层é�¢å¯¹å†…存的管ç�†ï¼Ÿ +4. 内存池的作用?STL里内存池如何实现? +5. 进程空间和内核空间对内存的管ç�†ä¸�å�Œï¼Ÿ +6. Linuxçš„slab层,VAM? +7. 伙伴算法 +8. 高端内存 +进程调度 + +1. Linux进程分为两ç§�,实时进程和é�žå®žæ—¶è¿›ç¨‹ï¼› +2. 优先级分为é�™æ€�优先级和动æ€�优先级,优先级的范围; +3. 调度策略,FIFO,LRU,时间片轮转 +4. 交互进程通过平å�‡ç�¡çœ æ—¶é—´è€Œè¢«å¥–励; +æ­»é”� + +(1) 死é”�产生的æ�¡ä»¶ï¼› +(2) 死é”�çš„é�¿å…�ï¼› +命令行 + +Linux命令 在一个文件中,倒åº�打å�°ç¬¬äºŒè¡Œå‰�100个大写字æ¯� +``` +cat filename | head -n 2 | tail -n 1 | grep '[[:upper:]]' -o | tr -d '\n'| cut -c 1-100 | rev +``` + +与CPU,内存,ç£�盘相关的命令(top,free, df, fdisk) +网络相关的命令netstat,tcpdumpç­‰ +sed, awk, grep三个超强大的命å��,分别用与格å¼�化修改,统计,和正则查找 +ipcså’Œipcrm命令 +查找当å‰�目录以å�Šå­—æ¯�下以.c结尾的文件,且文件中包å�«"hello world"的文件的路径 +创建定时任务 +IO模型 + +五ç§�IO模型:阻塞IO,é�žé˜»å¡žIO,IOå¤�用,信å�·é©±åЍå¼�IO,异步IO +select,poll,epoll的区别 +select:是最åˆ�解决IO阻塞问题的方法。用结构体fd_setæ�¥å‘Šè¯‰å†…核监å�¬å¤šä¸ªæ–‡ä»¶æ��述符,该结构体被称为æ��述符集。由数组æ�¥ç»´æŒ�哪些æ��述符被置ä½�了。对结构体的æ“�作å°�装在三个å®�定义中。通过轮寻æ�¥æŸ¥æ‰¾æ˜¯å�¦æœ‰æ��述符è¦�被处ç�†ï¼Œå¦‚果没有返回 +存在的问题: +1. 内置数组的形å¼�使得select的最大文件数å�—é™�与FD_SIZEï¼› +2. æ¯�次调用selectå‰�都è¦�é‡�æ–°åˆ�始化æ��述符集,将fd从用户æ€�æ‹·è´�到内核æ€�,æ¯�次调用selectå�Žï¼Œéƒ½éœ€è¦�å°†fd从内核æ€�æ‹·è´�到用户æ€�ï¼› +3. 轮寻排查当文件æ��述符个数很多时,效率很低; poll:通过一个å�¯å�˜é•¿åº¦çš„æ•°ç»„解决了select文件æ��述符å�—é™�的问题。数组中元素是结构体,该结构体ä¿�å­˜æ��述符的信æ�¯ï¼Œæ¯�增加一个文件æ��述符就å�‘数组中加入一个结构体,结构体å�ªéœ€è¦�æ‹·è´�一次到内核æ€�。poll解决了selecté‡�å¤�åˆ�始化的问题。轮寻排查的问题未解决。 +epoll:轮寻排查所有文件æ��述符的效率ä¸�高,使æœ�务器并å�‘能力å�—é™�。因此,epoll采用å�ªè¿”回状æ€�å�‘生å�˜åŒ–的文件æ��述符,便解决了轮寻的瓶颈。 +为什么使用IO多路å¤�用,最主è¦�的原因是什么? +epoll有两ç§�触å�‘模å¼�?这两ç§�触å�‘模å¼�有什么区别?编程的时候有什么区别? +上一题中编程的时候有什么区别,是在边缘触å�‘的时候è¦�把套接字中的数æ�®è¯»å¹²å‡€ï¼Œé‚£ä¹ˆå½“有多个套接字时,在读的套接字一直ä¸�å�œçš„æœ‰æ•°æ�®åˆ°è¾¾ï¼Œå¦‚何ä¿�è¯�其他套接字ä¸�被饿死(é�¢è¯•网易游æˆ�的时候问的一个问题,答ä¸�上æ�¥ï¼Œå�°è±¡è´¼æ·±åˆ»)。 +1. select/poll/epoll区别 +2. 几ç§�网络æœ�务器模型的介ç»�与比较 +3. epoll为什么这么快(æ�žæ‡‚这篇文章,关于IOå¤�用的问题就信手拈æ�¥äº†) +线程池 + +Linuxçš„API + +fork与vfork区别 +forkå’Œvfork都用于创建å­�进程。但是vfork创建å­�进程å�Žï¼Œçˆ¶è¿›ç¨‹é˜»å¡žï¼Œç›´åˆ°å­�进程调用exit()或者excle()。 +对于内核中过程fork通过调用clone函数,然å�Žclone函数调用do_fork()。do_fork()中调用copy_process()函数先å¤�制task_struct结构体,然å�Žå¤�制其他关于内存,文件,寄存器等信æ�¯ã€‚fork采用写时拷è´�技术,因此å­�进程和父进程的页表指å�‘相å�Œçš„页框。但是vforkä¸�需è¦�æ‹·è´�页表,因为父进程会一直阻塞,直接使用父进程页表。 +exit()与_exit()区别 +exit()清ç�†å�Žè¿›å…¥å†…核,_exit()直接陷入内核。 +孤儿进程与僵死进程 +1. 孤儿进程是怎么产生的? +2. 僵死进程是怎么产生的? +3. 僵死进程的å�±å®³ï¼Ÿ +4. 如何é�¿å…�僵死进程的产生? +Linux是如何é�¿å…�内存碎片的 +1. 伙伴算法,用于管ç�†ç‰©ç�†å†…存,é�¿å…�内存碎片; +2. 高速缓存Slab层用于管ç�†å†…核分é…�内存,é�¿å…�碎片。 +共享内存的实现原ç�†ï¼Ÿ +共享内存实现分为两ç§�æ–¹å¼�一ç§�是采用mmap,å�¦ä¸€ç§�是采用XSI机制中的共享内存方法。mmap是内存文件映射,将一个文件映射到进程的地å�€ç©ºé—´ï¼Œç”¨æˆ·è¿›ç¨‹çš„地å�€ç©ºé—´çš„管ç�†æ˜¯é€šè¿‡vm_area_struct结构体进行管ç�†çš„。mmap通过映射一个相å�Œçš„æ–‡ä»¶åˆ°ä¸¤ä¸ªä¸�å�Œçš„进程,就能实现这两个进程的通信,采用该方法å�¯ä»¥å®žçް任æ„�进程之间的通信。mmap也å�¯ä»¥é‡‡ç”¨åŒ¿å��映射,ä¸�指定映射的文件,但是å�ªèƒ½åœ¨çˆ¶å­�进程间通信。XSI的内存共享实际上也是通过映射文件实现,å�ªæ˜¯å…¶æ˜ å°„的是一ç§�特殊文件系统下的文件,该文件是ä¸�能通过readå’Œwrite访问的。 +二者区别: +1ã€� 系统V共享内存中的数æ�®ï¼Œä»Žæ�¥ä¸�写入到实际ç£�盘文件中去;而通过mmap()映射普通文件实现的共享内存通信å�¯ä»¥æŒ‡å®šä½•时将数æ�®å†™å…¥ç£�盘文件中。注:å‰�é�¢è®²åˆ°ï¼Œç³»ç»ŸV共享内存机制实际是通过映射特殊文件系统shm中的文件实现的,文件系统shm的安装点在交æ�¢åˆ†åŒºä¸Šï¼Œç³»ç»Ÿé‡�新引导å�Žï¼Œæ‰€æœ‰çš„内容都丢失。 +2ã€� 系统V共享内存是éš�内核æŒ�续的,å�³ä½¿æ‰€æœ‰è®¿é—®å…±äº«å†…存的进程都已ç»�正常终止,共享内存区ä»�然存在(除é�žæ˜¾å¼�删除共享内存),在内核é‡�新引导之å‰�,对该共享内存区域的任何改写æ“�作都将一直ä¿�留。 +3ã€� 通过调用mmap()映射普通文件进行进程间通信时,一定è¦�注æ„�考虑进程何时终止对通信的影å“�。而通过系统V共享内存实现通信的进程则ä¸�然。注:这里没有给出shmctl的使用范例,原ç�†ä¸Žæ¶ˆæ�¯é˜Ÿåˆ—大å�Œå°�异。 + +系统调用与库函数(open, close, create, lseek, write, read) +å�Œæ­¥æ–¹æ³•有哪些? +1. 互斥é”�,自旋é”�,信å�·é‡�,读写é”�,å±�éšœ +2. 互斥é”�与自旋é”�的区别:互斥é”�å¾—ä¸�到资æº�的时候阻塞,ä¸�å� ç”¨cpu资æº�。自旋é”�å¾—ä¸�到资æº�的时候,ä¸�å�œçš„æŸ¥è¯¢ï¼Œè€Œç„¶å� ç”¨cpu资æº�。 +3. 死é”� +å…¶ä»– + +++i是å�¦æ˜¯åŽŸå­�æ“�作 +明显ä¸�是,++i主è¦�有三个步骤,把数æ�®ä»Žå†…存放在寄存器上,在寄存器上进行自增,把数æ�®ä»Žå¯„存器拷è´�会内存,æ¯�个步骤都å�¯èƒ½è¢«ä¸­æ–­ã€‚ +判断大å°�端 + +``` +union un +{ +int i; +char ch; +}; +void fun() +{ +union un test; +test.i = 1; +if(ch == 1) +cout << "å°�端" << endl; +else +cout << "大端" << endl; +} +``` diff --git a/notes/é�¢ç»�/é�¢è¯•题-java.md.txt b/notes/é�¢ç»�/é�¢è¯•题-java.md.txt new file mode 100644 index 00000000..76e504aa --- /dev/null +++ b/notes/é�¢ç»�/é�¢è¯•题-java.md.txt @@ -0,0 +1 @@ +- [最近5å¹´133个Javaé�¢è¯•问题列表](http://www.importnew.com/17232.html) diff --git a/notes/é�¢ç»�/é�¢è¯•题-mysql.md.txt b/notes/é�¢ç»�/é�¢è¯•题-mysql.md.txt new file mode 100644 index 00000000..1a0c4e70 --- /dev/null +++ b/notes/é�¢ç»�/é�¢è¯•题-mysql.md.txt @@ -0,0 +1 @@ +https://www.jianshu.com/p/977a9e7d80b3 diff --git a/notes/é�¢ç»�/é�¢è¯•题-æ“�作系统.md.txt b/notes/é�¢ç»�/é�¢è¯•题-æ“�作系统.md.txt new file mode 100644 index 00000000..c715b924 --- /dev/null +++ b/notes/é�¢ç»�/é�¢è¯•题-æ“�作系统.md.txt @@ -0,0 +1,2 @@ +http://wdxtub.com/interview/14520847747820.html +https://zhuanlan.zhihu.com/p/23755202 diff --git a/notes/é�¢ç»�/é�¢è¯•题-计算机网络.md.txt b/notes/é�¢ç»�/é�¢è¯•题-计算机网络.md.txt new file mode 100644 index 00000000..4d6ad33f --- /dev/null +++ b/notes/é�¢ç»�/é�¢è¯•题-计算机网络.md.txt @@ -0,0 +1 @@ +[计算机网络方é�¢çš„é�¢è¯•基础题](https://wenku.baidu.com/view/6ad2acc0aa00b52acfc7ca21.html) \ No newline at end of file diff --git a/notes/黑客与画家.md b/notes/黑客与画家.md index a50f6453..ca3464f3 100644 --- a/notes/黑客与画家.md +++ b/notes/黑客与画家.md @@ -1,135 +1,135 @@ -* [ÒëÕßÐò](#ÒëÕßÐò) -* [ΪʲôÊé´ô×Ó²»ÊÜ»¶Ó­](#ΪʲôÊé´ô×Ó²»ÊÜ»¶Ó­) -* [ºÚ¿ÍÓë»­¼Ò](#ºÚ¿ÍÓë»­¼Ò) -* [²»ÄÜ˵µÄ»°](#²»ÄÜ˵µÄ»°) -* [ÁíÒ»Ìõ·](#ÁíÒ»Ìõ·) -* [Éè¼ÆÓëÑо¿](#Éè¼ÆÓëÑо¿) +* [??????](#??????) +* [?????????????](#?????????????) +* [???????](#???????) +* [????????](#????????) +* [?????¡¤](#?????¡¤) +* [??????§à?](#??????§à?) -# ÒëÕßÐò +# ?????? -×÷ÕߣºÃÀ¹ú»¥ÁªÍø´´ÒµÖ®¸¸ +????????????????????? -×ʼ hack Ö¸µÄÊÇÄÑÌâµÄ½â¾ö°ì·¨£¬ÄÇЩ×îÄܸɵÄÈ˱»³ÉΪ hacker¡£ºÚ¿Í°üº¬ÒÔÏÂÈý¸öÌØµã£ººÃÍæ¡¢¸ßÖÇÉÌ¡¢Ì½Ë÷¾«Éñ¡£ºÚ¿ÍµÄºËÐļÛÖµ¹Û£º·ÖÏí¡¢¿ª·Å¡¢ÃñÖ÷¡¢¼ÆËã»úµÄ×ÔÓÉʹÓᢽø²½¡£Òò´ËºÚ¿ÍÖ¸µÄÊÇÄÇЩר¼Ò¼¶³ÌÐòÔ±¡£ +??? hack ??????????????????§»???????????? hacker??????????????????????èå?????????????????????????????????????????????????????¨¢???????????????????§»??????????? -ÓÉÓںڿͳ£³£ÈëÇÖϵͳ£¬Òò´Ë±»ÓëÄÇÐ©ÆÆ»µ¼ÆËã»úϵͳµÄÈËÁªÏµÆðÀ´¡£È»¶øÆÆ»µ¼ÆËã»úϵͳµÄÈ˳ÆÎªº§¿Í£¬ÕæÕýµÄºÚ¿Í²»Õâô×ö£¬·´¶øÊÇÈÃÊÀ½ç±äµÃ¸üºÃ¡£ +?????????????????????????§»???????????????????????????????????????????????????????????????????????????????¨¢? -# ΪʲôÊé´ô×Ó²»ÊÜ»¶Ó­ +# ????????????? -×÷ÕßÈÏΪ£¬¡°Êé´ô×Ó¡±ºÍ¡°¸ßÖÇÉÌ¡±ÕýÏà¹Ø£¬¶ø¡°Êé´ô×Ó¡±ºÍ¡°ÊÜ»¶Ó­¡±¸ºÏà¹Ø¡£ +?????????????????????????????????????????????????????????? -Ìá³öÎÊÌ⣺¼ÈÈ»Êé´ô×ÓÖÇÉ̸ߣ¬ÄÇôΪʲô²»Ïë³öÊÜ»¶Ó­µÄ·½·¨£¿ÒòΪҪÏëÊÜ»¶Ó­£¬ÐèҪͶÈëºÜ´óµÄʱ¼ä¾«Á¦È¥ËÜÔì¸öÈË÷ÈÁ¦¡£¶øÊé´ô×ÓûÓÐÄÇô¶àµÄʱ¼äºÍ¾«Á¦£¬Ïà±ÈÓÚÊÜ»¶Ó­£¬ËûÃǸüÔÚºõÆäËü¸üÓÐȤµÄÊ£¬±ÈÈçÉè¼ÆÆæÃîµÄ»ð¼ýµÈ¡£ +??????????????????????????????????????????????????????????????????‚A??????????????????????????????????????????????????????????????????????????????????????????? -ÆÛ¸ºÊé´ô×ÓµÄÔ­Òò£º +???????????? -- ÇàÉÙÄêµÄº¢×Ó¸ü¼Ó²ÐÈÌ£¬Êé´ô×Ó²»ÊÜ»¶Ó­Òâζ×ű»ÆçÊÓºÍÊÜÆÛ¸º¡£ - > 11 ËêÒÔǰ£¬Ð¡º¢µÄÉú»îÓɼҳ¤Ö÷µ¼£¬ÆäËûº¢×ÓµÄÓ°ÏìÓÐÏÞ¡£ º¢×ÓÃDz»ÊDz»¹ØÐÄСѧÀïÆäËûͬѧµÄÏë·¨£¬µ«ÊǺóÕß²»¾ßÓоö¶¨ÐÔÓ°Ï졣Сѧ±ÏÒµÒÔºó£¬ÕâÖÖÇéÐοªÊ¼·¢Éú±ä»¯¡£µ½ÁË 11 Ëê×óÓÒ£¬º¢×ÓÃÇÖ𽥰ѼÒÍ¥Éú»îµ±×÷Ѱ³£ÊÂÁË¡£ ËûÃÇÔÚͬ°éÖпª±ÙÁËÒ»¸öеÄÊÀ½ç£¬²¢ÈÏΪÄǸöÊÀ½ç²ÅÊÇÖØÒªµÄ£¬±È¼ÒÀïµÄÊÀ½ç¸üÖØÒª¡£Êµ¼ÊÉÏ£¬Èç¹ûËûÃÇÔÚ¼ÒÀïÓ븸ĸ·¢Éú³åÍ»£¬ ·´¶øÄÜÔÚÄǸöеÄÊÀ½çÖÐÕõµÃÃæ×Ó£¬¶øËûÃÇҲȷʵ¸üÔÚºõÄǸöÊÀ½ç¡£µ«ÊÇ£¬ÎÊÌâÔÚÓÚ£¬º¢×ÓÃÇ×Ô¼º´´Ôì³öÀ´µÄÊÀ½çÊÇÒ»¸ö·Ç³£Ô­Ê¼µÄÊÀ½ç¡£ÇàÉÙÄêÔÚÐÄÀíÉÏ»¹Ã»ÓаÚÍѶùͯ״̬£¬ Ðí¶àÈ˶¼»á²ÐÈ̵ضԴýËûÈË¡£ËûÃÇÕÛÄ¥Êé´ô×ÓµÄÔ­Òò¾ÍÏñ°ÎµôÒ»ÌõÖ©ÖëÍÈÒ»Ñù£¬¾õµÃºÜºÃÍæ¡£ÔÚÒ»¸öÈ˲úÉúÁ¼ÖªÖ®Ç°£¬ÕÛÄ¥¾ÍÊÇÒ»ÖÖÓéÀÖ¡£ +- ?????????????????????????????¦Æ??????????????? + > 11 ???????§³??????????????????????????????????? ??????????????§³??????????????????????????§à????????§³??????????????¦Ï???????�£?????? 11 ???????????????????????????????? ??????????§á??????????????íà??????????????????????????????????????????????????????????????????? ?????????????????????????????????????????????????³‡???????????????????????????????????????????????????³‡?????????????????§Ñ????????? ??????????????????????????????????????¦Å?????????????????¨²???µµ???????????????????????????????? -- ΪÁË͹ÏÔ×Ô¼º¡£ - > ÔÚÈκÎÉç»áµÈ¼¶ÖƶÈÖУ¬ÄÇЩ¶Ô×Ô¼ºÃ»×ÔÐŵÄÈ˾ͻáͨ¹ýŰ´ýËûÃÇÑÛÖеÄϵÈÈËÀ´Í»ÏÔ×Ô¼ºµÄÉí·Ý¡£ÎÒÒѾ­Òâʶµ½£¬ÕýÊÇÒòΪÕâ¸öÔ­Òò£¬ÔÚÃÀ¹úÉç»áÖеײã°×ÈËÊǶԴýºÚÈË×î²Ð¿áµÄȺÌå¡£×îÊÜ»¶Ó­µÄº¢×Ó²¢²»ÆÛ¸ºÊé´ô×Ó£¬ËûÃDz»ÐèÒª¿¿²ÈÔÚÊé´ô×ÓÉíÉÏÀ´µæ¸ß×Ô¼º¡£´ó²¿·ÖµÄÆÛ¸ºÀ´×Ô´¦ÓÚÏÂÒ»µÈ¼¶µÄѧÉú£¬ÄÇЩ½¹ÂǵÄÖмä²ã¡£ +- ??????????? + > ???¦Ê??????????§µ???§»????????????????????????????§Ö???????????????????????????????????????????????????????§Ö???????????????§á????‰^?????????????????????????????????????????????????????????????????????????????????????§»??????§Þ?? -- ΪÁ˺ÍÊÜ»¶Ó­µÄÈ˽á³ÉͬÃË¡£ - > ûÓÐʲô±ÈÒ»¸ö¹²Í¬µÄµÐÈ˸üÄÜʹµÃÈËÃÇÍŽáÆðÀ´ÁË¡£Õâ¾ÍºÃ±ÈÒ»¸öÕþ¿Í£¬ËûÏëÈÃÑ¡ÃñÍü¼ÇÔã¸âµÄ¹úÄÚ¾ÖÊÆ£¬·½·¨¾ÍÊÇΪ¹ú¼ÒÕÒ³öÒ»¸öµÐÈË£¬ÄÄŵÐÈ˲¢²»ÕæµÄ´æÔÚ£¬ËûÒ²¿ÉÒÔ´´ÔìÒ»¸ö³öÀ´¡£Ò»ÈºÈËÔÚÒ»Æð£¬Ìô³öÒ»¸öÊé´ô×Ó£¬¾Ó¸ßÁÙÏÂµØÆÛ¸ºËû£¬¾Í»á°Ñ±Ë´ËÁªÏµÆðÀ´¡£Ò»Æð¹¥»÷Ò»¸öÍâÈË£¬ËùÓÐÈËÒò´Ë¾Í¶¼³ÉÁË×Ô¼ºÈË¡£Õâ¾ÍÊÇΪʲô×î¶ñÁÓµÄÒÔÇ¿ÁèÈõµÄʼþ¶¼ÓëÍÅÌåÓйصÄÔ­Òò¡£Ëæ±ãÕÒÒ»¸öÊé´ô×Ó£¬Ëû¶¼»á¸æËßÄ㣬һȺÈ˵ÄŰ´ý±ÈÒ»¸öÈ˵ÄŰ´ý²Ð¿áµÃ¶à¡£ +- ?????????????????? + > ???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????§Û??????????????????????????????????????????????????§á??? -ѧУÀÏʦµÄÖ»ÊǰѽÌÊéµ±³É¹¤×÷¡£ -> ¹«Á¢Ñ§Ð£µÄÀÏʦºÜÏñ¼àÓüµÄÓü×ä¡£¿´¹Ü¼àÓüµÄÈËÖ÷Òª¹ØÐĵÄÊÇ·¸È˶¼´ýÔÚ×Ô¼ºÓ¦¸Ã´ýµÄλÖá£È»ºó£¬È÷¸ÈËÓж«Î÷³Ô£¬¾¡¿ÉÄܲ»Òª·¢Éú¶·Å¹ºÍÉ˺¦Ê¼þ£¬Õâ¾Í¿ÉÒÔÁË¡£ +?§µ???????????ùn??????? +> ?????§µ????????????????????????????????????????????????????????¦Ë?¨¢?????¡Â????§Ø???????????????????????????????????????? -µ½Éç»áÖ®ºó£¬Êé´ô×ӻᱻÓѺöԴý£¬ÒòΪËûÃÇ×öµÄÊÂÄܹ»²úÉú¸ü¶àµÄÓ°Ï죬¶øÉç»áÕýÐèÒªÕâЩӰÏì¡£ +?????????????????????????????????????????????????????????????§»??? -³ÉÄêÈ˰Ѻ¢×ÓÔÚѧУÊÜ¿àÊÜÄѹé½áΪÇà´ºÆÚµÄ¼¤ËØÓ°Ï죬µ«ÊÇʵ¼ÊÉÏÕâÊÇѧУÕâÖÖÌåÖÆµÄÎÊÌ⣬ѧУֻÊǰѺ¢×ÓÈ¦ÑøÆðÀ´£¬²»ÈÃËûÃǵ½´¦ÂÒÅÜ£¬È»¶øÑ§Ð£ÄÚ²¿´æÔÚןܶà²ÐÈÌ¡£ +?????????????§µ???????????????????????????????????§µ??????????????§µ????????????????????????????????????§µ??????????????? -¹ýÈ¥µÄº¢×Ó¸üÔçͶÈëÉç»á£¬Ò²¸üÄܹ»ÕæÕýѧ»á±¾Áì¡£ -> ¹ýÈ¥µÄÉç»áÖУ¬ÇàÉÙÄê°çÑÝ×ÅÒ»¸ö¸ü»ý¼«µÄ½ÇÉ«¡£¹¤Òµ»¯Ê±´úµ½À´Ç°£¬ÇàÉÙÄê¶¼ÊÇijÖÖÐÎʽµÄѧͽ£¬²»ÊÇÔÚij¸ö×÷·»£¬¾ÍÊÇÔÚij¸öũׯ£¬ÉõÖÁÔÚijËÒ¾ü½¢ÉÏ¡£ËûÃDz»»á±»ÈÓµ½Ò»ÅÔ£¬´´Ôì×Ô¼ºµÄСÉç»á¡£ËûÃÇÊdzÉÄêÈËÉç»áµÄµÍ¼¶³ÉÔ±¡£ÒÔǰµÄÇàÉÙÄêËÆºõÒ²¸ü×ð¾´³ÉÄêÈË£¬ÒòΪ³ÉÄêÈ˶¼ÊÇ¿´µÃ¼ûµÄר¼Ò£¬»á´«ÊÚËûÃÇËùҪѧϰµÄ¼¼ÄÜ¡£Èç½ñµÄ´ó¶àÊýÇàÉÙÄ꣬¶ÔËûÃǵļҳ¤ÔÚÒ£Ô¶µÄ°ì¹«ÊÒËù´ÓÊµĹ¤×÷¼¸ºõÒ»ÎÞËùÖª¡£ËûÃÇ¿´²»µ½Ñ§Ð£×÷ÒµÓëδÀ´×ßÉÏÉç»áºó´ÓÊµĹ¤×÷ÓкÎÁªÏµ¡£ +???????????????????????????????? +> ?????????§µ????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????§³????????????????????????????????????????????????????????????????¨¹??????????????????????????????????????????????????????????????????????????????????????????§µ?????¦Ä??????????????????§Ü?????? -ѧУµÄʹÃüÊǽÌÊéÓýÈË£¬¶ø²¢Ã»ÓÐÍâ½çµÄѹÁ¦È¥¼à¶½ËûÃÇÕâô×ö£¬ËùÒÔÀÏʦºÍѧÉúË«·½ÍùÍù¶¼ÊÇ·óÑÜÁËÊ¡£ +?§µ?????????????????????????????????????????????????????????????????????????? -ûÓÐÍâÔڵĶÔÊÖ£¬º¢×ÓÃǾͻ¥Ïà°Ñ¶Ô·½µ±×÷¶ÔÊÖ¡£ +?????????????????????????????????? -³ÉÄêÈ˱áµÍÁ˺ܶàÃÀºÃµÄ¶«Î÷£¬±ÈÈç¡°È˸ñ¡±¡£ -> Ðí¶àÊé´ô×Ó¿ÉÄܶ¼ÓëÎÒÒ»Ñù£¬Ö±µ½¸ßÖбÏÒµ¶àÄêºó£¬²ÅÈ¥¶ÁÖÐѧÀïµÄÖ¸¶¨¶ÁÎï¡£µ«ÊÇ£¬ÎÒ´í¹ýµÄ¾ø²»½ö½öÖ»ÊǼ¸±¾Êé¶øÒÑ¡£ÎÒ¶ÔÐí¶àÃÀºÃµÄ×ÖÑÛ¶¼àÍÖ®ÒԱǣ¬±ÈÈç¡°È˸ñ¡±¡¢¡°ÕýÖ±¡±£¬ÒòΪ³ÉÄêÈ˱áµÍÁËÕâЩ´Ê¡£ÔÚËûÃÇ×ìÀÕâЩ´ÊËÆºõ¶¼ÊÇͬһ¸öÒâ˼¡ª¡ª¡°Ìý»°¡±¡£Ò»Ð©º¢×ÓÒòΪ¾ß±¸ËùνµÄ¡°È˸ñ¡±ºÍ¡°ÕýÖ±¡±£¬¶øÊܵ½¿ä½±£¬¿ÉÊÇËûÃDz»ÊÇ´ôµÃÏñһͷ´ó±¿Å££¬¾ÍÊÇÇḡµÃÏñÒ»¸ö²»¶¯ÄÔ½îµÄ´µÅ£Õß¡£Èç¹û¡°È˸ñ¡±ºÍ¡°ÕýÖ±¡±¾ÍÊÇÕâÖÖÑù×Ó£¬ÎÒÄþÔ¸²»ÒªËüÃÇ¡£ +?????????????????????????³�???? +> ???????????????????????????§Ò????????????????????????????????????????????????????????????????????????????????³�????????????????????????????§»???????????????§»???????????????????????????????§»????????????¦Í?????????????????????�á???????????????????????????????????????????????????????????????????????????????????????????? -# ºÚ¿ÍÓë»­¼Ò +# ??????? -ºÚ¿ÍºÍ»­¼ÒÒ»Ñù£¬¶¼ÊÇÒÕÊõ¼Ò£¬¶¼ÔÚ½øÐд´×÷¡£ +?????????????????????????????§Õ????? -ºÚ¿Í±È½Ïϲ»¶½Å±¾ÓïÑÔÄÇÖÖ¿ÉÒÔ¶¯Ì¬À©Õ¹£¬²¢ÇÒ¿ÉÒÔÏñǦ±Ê»­»­Ò»ÑùÐÞÐ޸ĸġ£ -> ±à³ÌÓïÑÔÊ×ÒªµÄÌØÐÔÓ¦¸ÃÊÇÔÊÐí¶¯Ì¬À©Õ¹£¨malleable£©¡£±à³ÌÓïÑÔÊÇÓÃÀ´°ïÖú˼¿¼³ÌÐòµÄ£¬¶ø²»ÊÇÓÃÀ´±í´ïÄãÒѾ­ÏëºÃµÄ³ÌÐò¡£ËüÓ¦¸ÃÊÇһ֧Ǧ±Ê£¬¶ø²»ÊÇÒ»Ö§¸Ö±Ê¡£Èç¹û´ó¼Ò¶¼ÏñѧУ½ÌµÄÄÇÑù±à³Ì£¬ÄÇô¾²Ì¬ÀàÐÍ£¨static typing£©ÊÇÒ»¸ö²»´íµÄ¸ÅÄî¡£µ«ÊÇ£¬ÎÒÈÏʶµÄºÚ¿Í£¬Ã»ÓÐÒ»¸öÈËϲ»¶Óþ²Ì¬ÀàÐÍÓïÑÔ±à³Ì¡£ÎÒÃÇÐèÒªµÄÊÇÒ»ÖÖ¿ÉÒÔËæÒâͿĨ¡¢²Á²Á¸Ä¸ÄµÄÓïÑÔ£¬ÎÒÃDz»ÏëÕý½óÎ£×ø£¬°ÑÒ»¸öÊ¢Âú¸÷ÖÖ±äÁ¿ÀàÐ͵IJ豭£¬Ð¡ÐÄÒíÒí·ÅÔÚ×Ô¼ºµÄÏ¥¸ÇÉÏ£¬ÎªÁËÓëһ˿²»¹¶µÄ±àÒëÆ÷´óÉô½»Ì¸£¬Å¬Á¦µØÌôÑ¡´ÊÓȷ±£±äÁ¿ÀàÐÍÆ¥Å䣬ºÃÈÃ×Ô¼ºÏÔµÃÀñòÓÖÖܵ½¡£ +?????????????????????????????????????????????????????? +> ???????????????????????????????malleable??????????????????????????????????????????????????????????????????????????????????????????§µ??????????????????????static typing??????????????þŸ??????????????????????????????????????????????????????????????????????????????????????????¦²????????????????????????Øj??§³?????????????????????????????????????????????????????????????????????????????????????¨°??????? -±àÂë²¢²»ÊÇ¿ÆÑ§Ñо¿£¬Òò´ËÊýѧ¼Ò²»Ò»¶¨Ð´Ò»ÊֺôúÂë¡£ -> ´´×÷Õß²»Í¬ÓÚ¿ÆÑ§¼Ò£¬Ã÷°×ÕâÒ»µãÓкܶàºÃ´¦¡£³ýÁ˲»ÓÃΪ¾²Ì¬ÀàÐÍ·³ÄÕÒÔÍ⣬»¹¿ÉÒÔÃâÈ¥ÁíÒ»¸öÕÛÄ¥¿ÆÑ§¼ÒµÄÄÑÌ⣬ÄǾÍÊÇ¡°¶ÔÊýѧµÄ¶Ê¼É¡±¡£¿ÆÑ§½çµÄÿһ¸öÈË£¬°µµØÀï¶¼ÏàÐÅÊýѧ¼Ò±È×Ô¼º´ÏÃ÷¡£ÎÒ¾õµÃ£¬Êýѧ¼Ò×Ô¼ºÒ²ÏàÐÅÕâÒ»µã¡£×îºóµÄ½á¹û¾ÍÊÇ¿ÆÑ§¼ÒÍùÍù»á°Ñ×Ô¼ºµÄ¹¤×÷¾¡¿ÉÄÜŪµÃ¿´ÉÏÈ¥ÏñÊýѧ¡£¶ÔÓÚÎïÀíѧÕâÑùµÄÁìÓò£¬Õâ¿ÉÄܲ»»áÓÐÌ«´ó²»Á¼Ó°Ïì¡£µ«ÊÇ£¬ÄãÔ½Íù×ÔÈ»¿ÆÑ§µÄ·½Ïò·¢Õ¹£¬Ëü¾ÍÔ½³ÉΪһ¸öÑÏÖØµÄÎÊÌâ¡£ +???????????§à???????????????§Õ??????? +> ?????????????????????????§Ü?????????????????????????????????????????????????????????????????????¨À??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????? -ºÚ¿ÍΪÁËÄÜ×ö×Ô¼ºÏ²»¶×öµÄʲ¢ÇÒ¿ÉÒÔÑø»î×Ô¼º£¬ÍùÍù°×Ì칤×÷ÍíÉÏ×ö×Ô¼ºµÄÊ¡£ +????????????????????????????????????????????????????????????? -ÈȰ®±à³ÌµÄÈ˲»¿É±ÜÃâµÄ»á¿ª·¢×Ô¼ºµÄÏîÄ¿¡£ -> ÎÒÃÇÃæÊÔ³ÌÐòÔ±µÄʱºò£¬Ö÷Òª¹Ø×¢µÄÊÂÇé¾ÍÊÇÒµÓàʱ¼äËûÃÇдÁËʲôÈí¼þ¡£ÒòΪÈç¹ûÄã²»°®Ò»¼þÊ£¬Äã²»¿ÉÄܰÑËü×öµÃÕæÕýÓÅÐ㣬ҪÊÇÄãºÜÈȰ®±à³Ì£¬Äã¾Í²»¿É±ÜÃâµØ»á¿ª·¢Äã×Ô¼ºµÄÏîÄ¿¡£ +????????????????????????????? +> ??????????????????????????????????????????§Õ???????????????????????????????????????????????????????????????????????????????????? -ºÚ¿Í²»ÊÇ»úе¹¤×÷µÄ¼¼Êõ¹¤ÈË£¬¶øÊÇһλ´´×÷Õß¡£ -> Èç¹ûºÚ¿ÍÖ»ÊÇÒ»¸ö¸ºÔðʵÏÖÁìµ¼ÒâÖ¾µÄ¼¼Êõ¹¤ÈË£¬Ö°Ôð¾ÍÊǸù¾Ý¹æ¸ñ˵Ã÷Êéд³ö´úÂ룬ÄÇôËûÆäʵÓëÒ»¸öÍÚË®¹µµÄ¹¤ÈËÊÇÒ»ÑùµÄ£¬´ÓÕâÍ·ÍÚµ½ÄÇÍ·£¬½ö´Ë¶øÒÑ¡£µ«ÊÇ£¬Èç¹ûºÚ¿ÍÊÇÒ»¸ö´´×÷Õߣ¬Ëû´ÓʵľͲ»ÊÇ»úеÐԵŤ×÷£¬Ëû±ØÐë¾ß±¸Áé¸Ð¡£ +???????§Ö???????????????????¦Ë??????? +> ??????????????????????????????????????????????????§Õ?????????????????????????????????????????????????????????????????????????????????????????????§Ö??????????????????§³? -# ²»ÄÜ˵µÄ»° +# ???????? -Á÷ÐеĵÀµÂ¹ÛÄîËäÈ»ÔÚºóÊÀ¿´À´»áÊǻĵ®µÄ£¬µ«ÊÇÈç¹ûÔÚÏÖ½ñȥΥ±³ÕâЩµÀµÂ¹ÛÄ˵һЩ²»ºÏÊʵÄÑÔÂÛ£¬»áÈÃ×Ô¼º´¦ÓÚÂé·³Ö®ÖС£ +???§Ö?????????????????????????????????????????¦´????§»?????????§»????????????????????????ú‘??§³? -×Ô¼º»áÉîÉîÔÞͬ×Ô¼ºµÄ¹Ûµã£¬²¢ÇÒÈ·ÐÅ»áµÃµ½±ðÈ˵ÄÈÏͬ£¬ºÜ¿ÉÄÜÊÇ£¬ÕâЩ¹ÛµãÊDZðÈ˸ø×Ô¼º¹àÊäµÄ£¬±ðÈË˵ʲô£¬×Ô¼º¾ÍÏàÐÅʲô¡£ +?????????????????????????????????????????????????§»???????????????????????????????????????? -²»ÄÜ˵µÄ»°ÍùÍùÊÇÕýÈ·µÄ»°£¬ÒòΪ¾ßÓÐÕùÒéÐÔ£¬»áÈÃijЩÈ˱©ÌøÈçÀס£ +?????????????????????????????????????????§»?????????? -ÄÇЩ²»Ò»¶¨ÕýÈ·£¬¼«¸»ÕùÒéÐÔµÄÑÔÂÛ±»³ÉΪ¡°Òì¶Ëа˵¡°£¬ÈËÃdz£³£»á¸øËüÃǼÓÉϱêÇ©£¬Ä¿µÄÊÇΪÁË·âɱËüÃÇ¡£ -> ÙôäÂÉñÃ÷¡¢Ã°·¸Ê¥Áé¡¢Òì¶Ë¶¼ÊÇÎ÷·½ÀúÊ·Éϳ£¼ûµÄ±êÇ©£¬µ±´úµÄ±êÇ©ÔòÊÇÓÐÉ˷绯¡¢²»µÃÌå¡¢ÆÆ»µ¹ú¼ÒÀûÒæµÈ¡£ +??§»??????????????????????????????????§Ñ????????????????????????????????????????? +> ???????????????î”????????????????????????????????????????ç³???????‰]????????????? -½û¼ÉµÄÍÆ³çÕßÊÇÄÇЩ´¦ÓÚÖеȽײãµÄÈË£¬ËûÃDz»Ïñ¸ßµÈ½×²ãÄÇÑùÓÐ×ã¹»×ÔÐű£»¤×Ô¼ºµÄÀûÒæ£¬ÓÖ²»Í¬Óڵ͵Ƚײ㣬ËûÃÇÓÐʵÁ¦È¥ÍÆÐС£ +??????????????§»?????§Ö?????????????????????????????????????????—¨???????????????????????§³? -Á÷Ðй۵ãµÄµÚÒ»Åú×·ÖðÕßÊÇΪÁËÈÃ×Ô¼ºÓëÖÚ²»Í¬£¬¶øµÚ¶þÅúÔòÊÇÅÂ×Ô¼ºÓëÖÚ²»Í¬¡£ +???§Û?????????????????????????????????????????????????????? -¿ÆÑ§¼ÒÍùÍùÐèÒª´òÆÆÁ÷Ðй۵㣬´Ó¶øÈ¡µÃÍ»ÆÆ¡£ +???????????????????§Û???????????? -Èç¹ûÒòΪ˵ÁËijЩ»°¶øÈøÉÈÅÁË×Ô¼ºµÄÉú»î£¬×îºÃ»¹ÊDZð˵¡£ -> ÕâʱÄãÒªÃ÷°×£¬×ÔÓÉ˼¿¼±È³©ËùÓûÑÔ¸üÖØÒª¡£Èç¹ûÄã¸Ðµ½Ò»¶¨Òª¸úÄÇЩÈ˱ç¸öÃ÷°×£¬¾ø²»ÑÊÏÂÕâ¿ÚÆø£¬Ò»¶¨Òª°Ñ»°ËµÇå³þ£¬½á¹ûºÜ¿ÉÄÜÊÇ´Ó´ËÄãÔÙÒ²ÎÞ·¨×ÔÓÉÀíÐÔµØË¼¿¼ÁË¡£ÎÒÈÏΪÕâÑù×ö²»¿ÉÈ¡£¬¸üºÃµÄ·½·¨ÊÇÔÚ˼ÏëºÍÑÔÂÛÖ®¼ä»®Ò»ÌõÃ÷È·µÄ½çÏß¡£ÔÚÐÄÀïÎÞËù²»Ï룬µ«ÊDz»Ò»¶¨ÒªËµ³öÀ´¡£ÎҾ͹ÄÀø×Ô¼ºÔÚÐÄÀïĬĬ˼¿¼ÄÇЩ×îÎÞ·¨ÎÞÌìµÄÏë·¨¡£ÄãµÄ˼ÏëÊÇÒ»¸öµØÏÂ×éÖ¯£¬¾ø²»Òª°ÑÄÇÀï·¢ÉúµÄÊÂÇéÒ»¹ÉÄÔ˵¸øÍâÈËÌý¡£¡°¸ñ¶·¾ãÀÖ²¿¡±µÄµÚÒ»Ìõ¹æÔò£¬¾ÍÊDz»ÒªÌáµ½¸ñ¶·¾ãÀÖ²¿¡£ +??????????§»?????????????????????????????? +> ??????????????????????????????????????§Ö?????????§»????????????????????????????????????????????????????????????????????????????????????????????????????????????????�¢????????????????????????????????????????????????????????????????§»???????????????????????????????????????????????????????????????????????????????????????????????????????? -µ±¿ñÈÈ·Ö×ÓÖÊÎÊÄãµÄ¹Ûµãʱ£¬×îºÃÊÇ˵×Ô¼º»¹Ã»ÏëºÃ¡£ +???????????????????????????????????¨¢? -ÈËÃÇ»áÎóÈÏΪ×Ô¼ºË¼Ï뿪·Å£¬µ«ÊÇËûÃÇÐÄÀïÔç¾ÍÓÐÒ»¸ù½çÏÞ£¬ÈÏΪʲôÊÇÕýÈ·µÄʲôÊÇ´íÎóµÄ¡£ +????????????????????????????????????????????????????????????????? -¸üÉîÈëµÄÈÏʶ×Ô¼º¡£ -> ¶ùͯ¾«Æ£Á¦½ßʱ£¬¿ÉÄÜ»á´ó·¢Æ¢Æø£¬ÒòΪËû²»ÖªµÀΪÁËʲô£»³ÉÄêÈËÔò»áÁ˽âÊǸöÈ˵ÄÉíÌå×´¿öÎÊÌ⣬ÓëÍâ½çÎ޹أ¬ËµÒ»¾ä¡°Ã»¹ØÏµ£¬ÎÒÖ»ÊÇÀÛÁË¡±¡£ +??????????????? +> ????????????????????????????????????????????????????????????????????????????????????????????????????? -# ÁíÒ»Ìõ· +# ?????¡¤ -»¥ÁªÍøÈí¼þµÄÓŵã +?????????????? -1. ²»ÐèÒªÓû§À´¹ÜÀíϵͳ£¬Òò´Ë²»ÐèҪרÃŵļÆËã»ú֪ʶ£¬Ê¹ÓÃä¯ÀÀÆ÷¼´¿ÉʹÓã» -2. ÐèÒªµÄÓ²¼þ×ÊÔ´ºÜÉÙ£¬Ö»ÐèÒªÄÜÔËÐÐä¯ÀÀÆ÷²¢ÇÒÁªÍøµÄÉ豸¾ÍÐУ» -3. ¸ü·½±ã£¬ËæÊ±ËæµØ¾Í¿ÉÒÔʹÓã» -4. ²»Óõ£ÐÄÊý¾Ý¶ªÊ§£¬ÒòΪÊý¾Ý±£´æÔÚÔÆ¶Ë£» -5. Ò×ÓÚ¶ÔÈí¼þ½øÐÐÉý¼¶£¬¶øÓû§¿ÉÒÔÔÚÍêÈ«²»ÖªÇéµÄÇé¿öϼÌÐøÊ¹Óã» -6. ¸üÈÝÒ×µÄ bug ·¢ÏÖ£¬¸ü¿ìµÄ bug Ð޸ģ» -7. ÓÐרÃŵļ¼ÊõÈËÔ±¹ÜÀí·þÎñÆ÷£¬ÒòΪ¸ü¼Ó°²È«£» +1. ????????????????????????????????????????????????????? +2. ??????????????????????????????????????????õô???§µ? +3. ???????????????????? +4. ??????????????????????????????? +5. ?????????????????????????????????????????????????? +6. ??????? bug ?????????? bug ???? +7. ?????????????????????????????????? -bug Ô½¿ì·¢ÏÖÔ½ºÃ£¬¶ø»¥ÁªÍøÈí¼þÒòΪ·¢²¼ÖÜÆÚ¶Ì£¬Óû§·´À¡¿ì£¬Òò´Ë bug µÄ·¢ÏÖÒ²¸ü¿ì¡£ +bug ????????????????????????????????????????????? bug ?????????? -¸ß¼¶Óû§ºÜÀÖÒâ°ïÖúѰÕÒ bug¡£ -> ÒòΪÈí¼þ·¢²¼ÒԺ󣬴ó¶àÊý bug ¶¼ÊǺ±¼ûÇé¿öϲŻᷢÉúµÄ¸ö°¸£¬Êܵ½Ó°ÏìµÄÓû§ÍùÍù¶¼ÊǸ߼¶Ê¹ÓÃÕߣ¬ËûÃÇϲ»¶ÊÔÑéÄÇЩ²»³£Óõġ¢ÄѶȴóµÄ²Ù×÷¡£¸ß¼¶Ê¹ÓÃÕß¶Ô bug µÄÈÝÈ̶ȱȽϸߣ¬ÓÈÆäÈç¹ûÕâЩ bug ÊÇÔÚ¿ª·¢Ð¹¦ÄܵĹý³ÌÖÐÒýÈëµÄ£¬¶øÕâЩй¦ÄÜÓÖÕýÊÇËûÃÇËùÐèÒªµÄ£¬ËûÃǾ͸üÄÜÀí½âÁË¡£ÊÂʵÉÏ£¬ÒòΪ bug ²»¶à£¬ÄãÖ»Óо­¹ýһЩ¸´ÔӵĹý³ÌÒÔºó²Å»áÓöµ½ËüÃÇ£¬ËùÒԸ߼¶Ê¹ÓÃÕßÍùÍùÒòΪ·¢ÏÖÁË bug ¸Ðµ½ºÜµÃÒâ¡£ËûÃÇ´òµç»°¸ø¿Í·þʱ£¬¶à°ëÊÇÒ»¸±Ê¤ÀûÕߵĿÚÎÇ£¬¶ø²»ÊÇÅ­Æø³å³åµÄÑù×Ó£¬ºÃÏñËûÃÇ»÷°ÜÎÒÃǵ÷ÖÁËÒ»Ñù¡£ +?????????????????? bug?? +> ????????????????? bug ??????????????????????????????????????????????????????????????§»??????????????????????????? bug ????????????????????§» bug ????????????????????????????§»?????????????????????????????????????????????? bug ????????§à????§»?????????????????????????????????????????????? bug ?§Ö???????????´Â???????????????????????????????????????????????????????????¡Â???????? -ºÃµÄ¼¼ÊõÖ§³ÖÊÇ£º¿Í·þÈËÔ±ºÍ¼¼ÊõÈËÔ±ÀëµÃºÜ½ü£¬²¢ÇÒµ±³¡ÐÞ¸´ bug¡£ +????????????????????????????¨²?????????????? bug?? -Ò»¸öºÃµÄÏë·¨ÔÚʵÏÖ¹ý³ÌÖÐÄÜÒýÆð¸ü¶àÏë·¨£¬Òò´Ë¾¡ÔçȥʵÏÖËü±È½«ËüÊøÖ®¸ß¸óÄܹ»´øÀ´¸ü¶àºÃ´¦¡£ +????????????????????????????????????????????????????????????????????? -²»»á¹ºÂòÈí¼þµÄÓû§Ê¹ÓÃÁ˵Á°æÈí¼þÄܹ»ÈÃÈí¼þ¸ü¾ßÓÐÊг¡Ó°ÏìÁ¦¡£ -> Ò»¶¨ÊýÁ¿µÄµÁ°æ¶ÔÈí¼þ¹«Ë¾ÊÇÓкô¦µÄ¡£²»¹ÜÄãµÄÈí¼þ¶¨¼Û¶àÉÙ£¬ÓÐЩÓû§ÓÀÔ¶¶¼²»»á¹ºÂò¡£Èç¹ûÕâÑùµÄÓû§Ê¹ÓõÁ°æ£¬Ä㲢ûÓÐÈκÎËðʧ¡£ÊÂʵÉÏ£¬Äã·´¶ø×¬µ½ÁË£¬ÒòΪÄãµÄÈí¼þÏÖÔÚ¶àÁËÒ»¸öÓû§£¬Êг¡Ó°ÏìÁ¦¾Í¸ü´óÁËһЩ£¬¶øÕâ¸öÓû§¿ÉÄܱÏÒµÒÔºó¾Í»á³öÇ®¹ºÂòÄãµÄÈí¼þ¡£ +????????????????????????????????????????§Ô???????? +> ??????????????????????§Ü?????????????????????????§»???????????????????????????????—¨??????¦Ê???????????????????????????????????????????????§Ô??????????????§»??????????????????????????????????? -# Éè¼ÆÓëÑо¿ +# ??????§à? -Éè¼Æ×·ÇóµÄÊǺ㬶øÑо¿×·ÇóµÄÊÇС£ +??????????????§à?????????? -Óû§ÒªÇóºÍÓû§ÐèÇóÓÐÇø±ð£¬Óû§¿ÉÄܲ¢²»Á˽â×Ô¼ºÒªÊ²Ã´£¬ËùÒÔÓû§ÒªÇóµÄÄÚÈÝÍùÍù²»ÊÇÓû§ÕæÕýÐèÇóµÄ¶«Î÷¡£ +????????????????????????????????????????????????????????????????????????????????? -ÒÕÊõÉè¼ÆÓëÈËΪ±¾£¬¶ø¿ÆÑ§Ñо¿×·Çó¼ò½àÕýÈ·¡£±ÈÈçÊýѧ¼Ò²»»áΪÁËÈöÁÕ߸üÈÝÒ×¶®¶ø²ÉÓÃÒ»ÖÖ¸üÂé·³µÄÖ¤Ã÷£¬¶øÊÇ»áÑ¡Ôñ×îÖ±½Ó¼ò½àµÄÖ¤Ã÷¡£±à³ÌÓïÑÔÒ²ÊÇÓëÈËΪ±¾µÄ£¬Òò´Ë±à³ÌÓïÑÔÒ²ÊÇͨ¹ýÉè¼Æ²úÉúµÄ¡£ +??????????????????????§à????????????????????????????????????????????????ú‘???????????????????????????????????????????????????????????????????????? -´óÀíʯ×ö³öµÄ¶«Î÷ƯÁÁ£¬µ«ÊÇÖÆ×÷¹ý³ÌÈ´ºÜÄÑ£¬ÎÞ·¨²»¶ÏµÄ½øÐеñ×Á¡£±à³ÌÓïÑÔÒ²ÐèÒªÕâÖÖµñ×Á¹ý³Ì£¬Èç¹ûÒ»ÖÖ±à³ÌÓïÑÔÏñ´óÀíʯһÑù£¬Ö»Êǽá¹ûºÃ¿´£¬ÄÇôËü¾Í²»ÊÇÒ»Öֺõıà³ÌÓïÑÔ¡£ +???????????????????????????????????????????????§Ö??????????????????????????????????????????????????????????????????????????????????? -Éè¼ÆÈí¼þÓ¦µ±¾¡¿ìÄóöÔ­ÐÍÀ´¡£¾ÍÏñ»­»­Ò»Ñù£¬ÊÇÏÈÓü¸¸ùÏß»­³öÒ»¸ö´óÖÂ׼ȷµÄÂÖÀª£¬È»ºóÔÙÖð²½¼Ó¹¤¡£ -> »¹ÓÐÁíÒ»ÖÖÈí¼þÉè¼ÆË¼Ï룬ҲÐí¿ÉÒÔ±»³ÆÎª¡°Ê¥Ä¸ÂêÀöÑÇ¡±Ä£Ê½¡£Ëü²»ÒªÇ󾡿ìÄóöÔ­ÐÍ£¬È»ºóÔÙÖð²½ÓÅ»¯£¬ËüµÄ¹ÛµãÊÇÄãÓ¦¸ÃµÈµ½ÍêÕûµÄ³ÉÆ·³öÀ´ÒÔºóÔÙÒ»ÏÂ×ÓÂ¡ÖØµØÍÆÏòÊг¡£¬¾ÍÏñʥĸÂêÀöÑǽµÁÙÒ»Ñù£¬ÄÄÅÂÕû¸ö¹ý³ÌÂþ³¤µÃÏñéÏé­ÇòÔ˶¯Ô±³¤Í¾±¼Ï®Ò²Ã»ÓйØÏµ¡£ÔÚ»¥ÁªÍøÅÝĭʱÆÚ£¬ÎÞÊý´´Òµ¹«Ë¾ÒòΪÏàÐÅÁËÕâÖÖģʽ¶ø×Ô»Ùǰ³Ì¡£ +??????????????¨®???????????????????????¨¹???????????????????????????????????? +> ????????????????????????????????????????????????????¨®???????????????????????????????????????????????????????????????§Ô?????????????????????????????????????????????????????????????§Û???????????????????????????????????????????????????? -Èç¹û¾õµÃ×öij¼þʺܷ¦Î¶£¬ÄÇô×ö³öÀ´µÄ¶«Î÷¾Í»áºÜ·¦Î¶¡£¿ìËÙµÄÔ­ÐÍÄܹ»ÈóÌÐòÔ±Óиü¸ßµÄÊ¿Æø£¬´Ó¶øÈÃËûÃǸüÓÐÐËȤȥʵÏÖ¡£Ò²¿ÉÒÔÀí½âΪ¿ìËÙ·´À¡ºÜÖØÒª¡£ +????????????????¦Æ?????????????????????¦Æ??????????????¨®?????§Ú????????????????????????????????????????????????????