Skip to content

Commit 596dce2

Browse files
authored
Merge pull request #2 from CyC2018/master
merge from master
2 parents 4ea9a47 + 98dd1ee commit 596dce2

27 files changed

+353
-330
lines changed

README.md

Lines changed: 16 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
11
<!-- ![](https://img.shields.io/badge/update-today-blue.svg) ![](https://img.shields.io/badge/gitbook-making-lightgrey.svg)</br> -->
22
|||||||||||
33
| :--------: | :---------: | :---------: | :---------: | :---------: | :---------:| :---------: | :-------: | :-------:| :------:|
4-
|网络[:cloud:](#网络-cloud) |操作系统[:computer:](#操作系统-computer)| 算法[:pencil2:](#数据结构与算法-pencil2)| 面向对象[:couple:](#面向对象-couple) |数据库[:floppy_disk:](#数据库-floppy_disk)| Java [:coffee:](#java-coffee)| 分布式[:sweat_drops:](#分布式-sweat_drops)| 工具[:hammer:](#工具-hammer)| 编码实践[:speak_no_evil:](#编码实践-speak_no_evil)| 后记[:memo:](#后记-memo) |
4+
| 算法[:pencil2:](#算法-pencil2) | 操作系统[:computer:](#操作系统-computer)|网络[:cloud:](#网络-cloud) | 面向对象[:couple:](#面向对象-couple) |数据库[:floppy_disk:](#数据库-floppy_disk)| Java [:coffee:](#java-coffee)| 分布式[:sweat_drops:](#分布式-sweat_drops)| 工具[:hammer:](#工具-hammer)| 编码实践[:speak_no_evil:](#编码实践-speak_no_evil)| 后记[:memo:](#后记-memo) |
55
</br>
66

77
:loudspeaker: 本仓库不参与商业行为,不向读者收取任何费用。
88

99
:loudspeaker: This repository is not engaging in business activities, and does not charge readers any fee.
1010
</br></br>
1111

12-
## 网络 :cloud:
12+
## 算法 :pencil2:
1313

14-
> [计算机网络](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/计算机网络.md)
1514

16-
整理自《计算机网络 第七版》,重点内容会在标题后面加 \*
15+
> [剑指 Offer 题解](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/剑指%20offer%20题解.md)
1716
18-
> [HTTP](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/HTTP.md)
17+
《剑指 Offer 第二版》的最优解,在牛客网在线编程中出现的题目都已 AC。
1918

20-
整理自《图解 HTTP》
19+
> [Leetcode 题解](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Leetcode%20题解.md)
20+
21+
对题目做了一个分类,并对每种题型的解题思路做了总结。
22+
23+
> [算法](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/算法.md)
24+
25+
整理自《算法 第四版》
2126

2227
## 操作系统 :computer:
2328

@@ -29,19 +34,17 @@
2934
3035
整理自《鸟哥的 Linux 私房菜》
3136

32-
## 数据结构与算法 :pencil2:
3337

34-
> [算法](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/算法.md)
38+
## 网络 :cloud:
3539

36-
整理自《算法 第四版》
40+
> [计算机网络](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/计算机网络.md)
3741
38-
> [剑指 Offer 题解](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/剑指%20offer%20题解.md)
42+
整理自《计算机网络 第七版》,重点内容会在标题后面加 \*
3943

40-
《剑指 Offer 第二版》的最优解,在牛客网在线编程中出现的题目都已 AC。
44+
> [HTTP](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/HTTP.md)
4145
42-
> [Leetcode 题解](https://github.com/CyC2018/InnterviewNotes/blob/master/notes/Leetcode%20题解.md)
46+
整理自《图解 HTTP》
4347

44-
对题目做了一个分类,并对每种题型的解题思路做了总结。
4548

4649
## 面向对象 :couple:
4750

notes/HTTP.md

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@ HTTP/1.1 使用虚拟主机技术,使得一台服务器拥有多个域名,
507507

508508
### 3. 隧道
509509

510-
使用 SSL 等加密手段,为客户端和服务器之间建立一条安全的通信线路。隧道本身不去解析 HTTP 请求。
510+
使用 SSL 等加密手段,为客户端和服务器之间建立一条安全的通信线路。
511511

512512
# 六、HTTPs
513513

@@ -803,32 +803,34 @@ DELETE /idX/delete HTTP/1.1 -> Returns 404
803803
2. HTTP/1.1 支持管线化处理
804804
3. HTTP/1.1 支持虚拟主机
805805
4. HTTP/1.1 新增状态码 100
806-
5. HTTP/1.1 只是分块传输编码
806+
5. HTTP/1.1 支持分块传输编码
807807
6. HTTP/1.1 新增缓存处理指令 max-age
808808

809809
具体内容见上文
810810

811811
## HTTP/1.1 与 HTTP/2.0 的区别
812812

813+
> [HTTP/2 简介](https://developers.google.com/web/fundamentals/performance/http2/?hl=zh-cn)
814+
813815
### 1. 多路复用
814816

815-
HTTP/2.0 使用多路复用技术,使用同一个 TCP 连接来处理多个请求
817+
HTTP/2.0 使用多路复用技术,同一个 TCP 连接可以处理多个请求
816818

817819
### 2. 首部压缩
818820

819821
HTTP/1.1 的首部带有大量信息,而且每次都要重复发送。HTTP/2.0 要求通讯双方各自缓存一份首部字段表,从而避免了重复传输。
820822

821823
### 3. 服务端推送
822824

823-
在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 index.html 页面,服务端就把 index.js 一起发给客户端。
825+
HTTP/2.0 在客户端请求一个资源时,会把相关的资源一起发送给客户端,客户端就不需要再次发起请求了。例如客户端请求 index.html 页面,服务端就把 index.js 一起发给客户端。
824826

825827
### 4. 二进制格式
826828

827829
HTTP/1.1 的解析是基于文本的,而 HTTP/2.0 采用二进制格式。
828830

829831
# 参考资料
830832

831-
- 上野宣. 图解 HTTP[M]. Ren min you dian chu ban she, 2014.
833+
- 上野宣. 图解 HTTP[M]. 人民邮电出版社, 2014.
832834
- [MDN : HTTP](https://developer.mozilla.org/en-US/docs/Web/HTTP)
833835
- [Are http:// and www really necessary?](https://www.webdancers.com/are-http-and-www-necesary/)
834836
- [HTTP (HyperText Transfer Protocol)](https://www.ntu.edu.sg/home/ehchua/programming/webprogramming/HTTP_Basics.html)
@@ -848,3 +850,5 @@ HTTP/1.1 的解析是基于文本的,而 HTTP/2.0 采用二进制格式。
848850
- [XMLHttpRequest](https://developer.mozilla.org/zh-CN/docs/Web/API/XMLHttpRequest)
849851
- [XMLHttpRequest (XHR) Uses Multiple Packets for HTTP POST?](https://blog.josephscott.org/2009/08/27/xmlhttprequest-xhr-uses-multiple-packets-for-http-post/)
850852
- [Symmetric vs. Asymmetric Encryption – What are differences?](https://www.ssl2buy.com/wiki/symmetric-vs-asymmetric-encryption-what-are-differences)
853+
- [Web 性能优化与 HTTP/2](https://www.kancloud.cn/digest/web-performance-http2)
854+
- [HTTP/2 简介](https://developers.google.com/web/fundamentals/performance/http2/?hl=zh-cn)

notes/JDK 中的设计模式.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -44,11 +44,11 @@ java.awt.Desktop#getDesktop()
4444

4545
## 2. 简单工厂模式
4646

47-
在不对用户暴露对象内部逻辑的前提下创建对象;使用通用的接口来创建对象;
47+
在不对用户暴露对象内部逻辑的前提下创建对象
4848

4949
## 3. 工厂方法模式
5050

51-
定义创建对象的接口,但是让子类来决定应该使用哪个类来创建;使用通用的接口来创建对象;
51+
定义创建对象的接口,但是让子类来决定应该使用哪个类来创建
5252

5353
```java
5454
java.lang.Proxy#newProxyInstance()
@@ -120,7 +120,7 @@ javax.swing.Action
120120
## 3. 解释器模式
121121

122122
为语言创建解释器,通常由语言的语法和语法分析来定义。
123-
123+
124124
```java
125125
java.util.Pattern
126126
java.text.Normalizer
@@ -229,7 +229,7 @@ JDBC
229229

230230
## 3. 组合模式
231231

232-
将对象组合成树形结构来表示整理-部分层次关系,允许用户以相同的方式处理单独对象和组合对象。
232+
将对象组合成树形结构来表示整体-部分层次关系,允许用户以相同的方式处理单独对象和组合对象。
233233

234234
```java
235235
javax.swing.JComponent#add(Component)

notes/Java 基础.md

Lines changed: 37 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
* [访问权限](#访问权限)
1313
* [抽象类与接口](#抽象类与接口)
1414
* [super](#super)
15-
* [重载与重写](#重载与重写)
15+
* [覆盖与重载](#覆盖与重载)
1616
* [五、String](#五string)
1717
* [String, StringBuffer and StringBuilder](#string,-stringbuffer-and-stringbuilder)
1818
* [String 不可变的原因](#string-不可变的原因)
@@ -55,7 +55,7 @@ y.a = 1;
5555

5656
声明方法不能被子类覆盖。
5757

58-
private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是覆盖基类方法,而是重载了
58+
private 方法隐式地被指定为 final,如果在子类中定义的方法和基类中的一个 private 方法签名相同,此时子类的方法不是覆盖基类方法,而是在子类中定义了一个新的方法
5959

6060
**3. 类**
6161

@@ -65,7 +65,7 @@ private 方法隐式地被指定为 final,如果在子类中定义的方法和
6565

6666
**1. 静态变量**
6767

68-
静态变量在内存中只存在一份,只在类第一次实例化时初始化一次
68+
静态变量在内存中只存在一份,只在类初始化时赋值一次
6969

7070
- 静态变量:类所有的实例都共享静态变量,可以直接通过类名来访问它;
7171
- 实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。
@@ -83,11 +83,23 @@ public class A {
8383

8484
**3. 静态语句块**
8585

86-
静态语句块和静态变量一样在类第一次实例化时运行一次
86+
静态语句块在类初始化时运行一次
8787

88-
**4. 初始化顺序**
88+
**4. 静态内部类**
8989

90-
静态数据优先于其它数据的初始化,静态变量和静态语句块哪个先运行取决于它们在代码中的顺序。
90+
内部类的一种,静态内部类不依赖外部类,且不能访问外部类的非 static 变量和方法。
91+
92+
**5. 静态导包**
93+
94+
```source-java
95+
import static com.xxx.ClassName.*
96+
```
97+
98+
在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。
99+
100+
**6. 变量赋值顺序**
101+
102+
静态变量的赋值和静态语句块的运行优先于实例变量的赋值和普通语句块的运行,静态变量的赋值和静态语句块的运行哪个先执行取决于它们在代码中的顺序。
91103

92104
```java
93105
public static String staticField = "静态变量";
@@ -99,8 +111,6 @@ static {
99111
}
100112
```
101113

102-
实例变量和普通语句块的初始化在静态变量和静态语句块初始化结束之后。
103-
104114
```java
105115
public String field = "实例变量";
106116
```
@@ -111,7 +121,7 @@ public String field = "实例变量";
111121
}
112122
```
113123

114-
最后才是构造函数中的数据进行初始化
124+
最后才运行构造函数
115125

116126
```java
117127
public InitialOrderTest() {
@@ -121,25 +131,13 @@ public InitialOrderTest() {
121131

122132
存在继承的情况下,初始化顺序为:
123133

124-
1. 父类(静态变量、静态语句块块
134+
1. 父类(静态变量、静态语句块
125135
2. 子类(静态变量、静态语句块)
126136
3. 父类(实例变量、普通语句块)
127137
4. 父类(构造函数)
128138
5. 子类(实例变量、普通语句块)
129139
6. 子类(构造函数)
130140

131-
**5. 静态内部类**
132-
133-
内部类的一种,静态内部类不依赖外部类,且不能访问外部类的非 static 变量和方法。
134-
135-
**6. 静态导包**
136-
137-
```source-java
138-
import static com.xxx.ClassName.*
139-
```
140-
141-
在使用静态变量和方法时不用再指明 ClassName,从而简化代码,但可读性大大降低。
142-
143141
# 二、Object 通用方法
144142

145143
## 概览
@@ -255,9 +253,9 @@ public class EqualExample {
255253

256254
## hashCode()
257255

258-
hasCode() 返回散列值,而 equals() 是用来判断两个实例是否相等。相等的两个实例散列值一定要相同,但是散列值相同的两个实例不一定相等
256+
hasCode() 返回散列值,而 equals() 是用来判断两个实例是否等价。等价的两个实例散列值一定要相同,但是散列值相同的两个实例不一定等价
259257

260-
在覆盖 equals() 方法时应当总是覆盖 hashCode() 方法,保证相等的两个实例散列值也相等
258+
在覆盖 equals() 方法时应当总是覆盖 hashCode() 方法,保证相等的两个实例散列值也等价
261259

262260
下面的代码中,新建了两个等价的实例,并将它们添加到 HashSet 中。我们希望将这两个实例当成一样的,只在集合中添加一个实例,但是因为 EqualExample 没有实现 hasCode() 方法,因此这两个实例的散列值是不同的,最终导致集合添加了两个等价的实例。
263261

@@ -313,7 +311,7 @@ ToStringExample@4554617c
313311

314312
**1. cloneable**
315313

316-
clone() 是 Object 的受保护方法,这意味着,如果一个类不显式去重载 clone() 就没有这个方法。
314+
clone() 是 Object 的受保护方法,这意味着,如果一个类不显式去覆盖 clone() 就没有这个方法。
317315

318316
```java
319317
public class CloneExample {
@@ -324,10 +322,10 @@ public class CloneExample {
324322

325323
```java
326324
CloneExample e1 = new CloneExample();
327-
CloneExample e2 = e1.clone(); // 'clone()' has protected access in 'java.lang.Object'
325+
// CloneExample e2 = e1.clone(); // 'clone()' has protected access in 'java.lang.Object'
328326
```
329327

330-
接下来重载 Object 的 clone() 得到以下实现:
328+
接下来覆盖 Object 的 clone() 得到以下实现:
331329

332330
```java
333331
public class CloneExample {
@@ -510,7 +508,7 @@ protected 用于修饰成员,表示在继承体系中成员对于子类可见
510508

511509
如果子类的方法覆盖了父类的方法,那么子类中该方法的访问级别不允许低于父类的访问级别。这是为了确保可以使用父类实例的地方都可以使用子类实例,也就是确保满足里式替换原则。
512510

513-
字段决不能是公有的,因为这么做的话就失去了对这个实例域修改行为的控制,客户端可以对其随意修改。可以使用共有的 getter 和 setter 方法来替换共有字段
511+
字段决不能是公有的,因为这么做的话就失去了对这个字段修改行为的控制,客户端可以对其随意修改。可以使用公有的 getter 和 setter 方法来替换公有字段
514512

515513
```java
516514
public class AccessExample {
@@ -595,7 +593,7 @@ ac2.func1();
595593

596594
从 Java 8 开始,接口也可以拥有默认的方法实现,这是因为不支持默认方法的接口的维护成本太高了。在 Java 8 之前,如果一个接口想要添加新的方法,那么要修改所有实现了该接口的类。
597595

598-
接口也可以包含域,并且这些域隐式都是 static 和 final 的。
596+
接口也可以包含字段,并且这些字段隐式都是 static 和 final 的。
599597

600598
接口中的方法默认都是 public 的,并且不允许定义为 private 或者 protected。
601599

@@ -634,16 +632,16 @@ System.out.println(InterfaceExample.x);
634632

635633
**3. 比较**
636634

637-
- 从设计层面上看,抽象类提供了一种 IS-A 关系,那么就必须满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求子类和父类具有 IS-A 关系
635+
- 从设计层面上看,抽象类提供了一种 IS-A 关系,那么就必须满足里式替换原则,即子类对象必须能够替换掉所有父类对象。而接口更像是一种 LIKE-A 关系,它只是提供一种方法实现契约,并不要求接口和实现接口的类具有 IS-A 关系
638636
- 从使用上来看,一个类可以实现多个接口,但是不能继承多个抽象类。
639-
- 接口的域只能是 static 和 final 类型的,而抽象类的域可以有多种访问权限
637+
- 接口的字段只能是 static 和 final 类型的,而抽象类的字段没有这种限制
640638
- 接口的方法只能是 public 的,而抽象类的方法可以由多种访问权限。
641639

642640
**4. 使用选择**
643641

644642
使用抽象类:
645643

646-
- 需要在几个相关的类中共享代码
644+
- 需要在几个相关的类中共享代码
647645
- 需要能控制继承来的方法和域的访问权限,而不是都为 public。
648646
- 需要继承非静态(non-static)和非常量(non-final)字段。
649647

@@ -652,7 +650,7 @@ System.out.println(InterfaceExample.x);
652650
- 需要让不相关的类都实现一个方法,例如不相关的类都可以实现 Compareable 接口中的 compareTo() 方法;
653651
- 需要使用多重继承。
654652

655-
在很多情况下,接口优先于抽象类,因为接口没有抽象类严格的类层次接口要求,可以灵活地为一个类添加行为。并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。
653+
在很多情况下,接口优先于抽象类,因为接口没有抽象类严格的类层次结构要求,可以灵活地为一个类添加行为。并且从 Java 8 开始,接口也可以有默认的方法实现,使得修改接口的成本也变的很低。
656654

657655
> [深入理解 abstract class 和 interface](https://www.ibm.com/developerworks/cn/java/l-javainterface-abstract/) </br> [When to Use Abstract Class and Interface](https://dzone.com/articles/when-to-use-abstract-class-and-intreface)
658656
@@ -706,11 +704,11 @@ SuperExtendExample.func()
706704

707705
> [Using the Keyword super](https://docs.oracle.com/javase/tutorial/java/IandI/super.html)
708706
709-
## 重载与重写
707+
## 覆盖与重载
710708

711-
- 重写存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法;
709+
- 覆盖(Override)存在于继承体系中,指子类实现了一个与父类在方法声明上完全相同的一个方法;
712710

713-
- 重载即存在于继承体系中,也存在于同一个类中,指一个方法与已经存在的方法或者父类的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。应该注意的是,返回值不同,其它都相同不算是重载。
711+
- 重载(Overload)存在于同一个类中,指一个方法与已经存在的方法名称上相同,但是参数类型、个数、顺序至少有一个不同。应该注意的是,返回值不同,其它都相同不算是重载。
714712

715713
# 五、String
716714

@@ -739,7 +737,7 @@ SuperExtendExample.func()
739737

740738
如果一个 String 对象已经被创建过了,那么就会从 String Pool 中取得引用。只有 String 是不可变的,才可能使用 String Pool。
741739

742-
<div align="center"> <img src="../pics//f76067a5-7d5f-4135-9549-8199c77d8f1c.jpg"/> </div><br>
740+
<div align="center"> <img src="../pics//f76067a5-7d5f-4135-9549-8199c77d8f1c.jpg" width=""/> </div><br>
743741

744742
**3. 安全性**
745743

@@ -773,7 +771,7 @@ String s5 = "bbb";
773771
System.out.println(s4 == s5); // true
774772
```
775773

776-
Java 虚拟机将堆划分成新生代、老年代和永久代(PermGen Space)。在 Java 6 之前,字符串常量池被放在永久代中,而在 Java 7 时,它被放在堆的其它位置。这是因为永久代的空间有限,如果大量使用字符串的场景下会导致 OutOfMemoryError 错误。
774+
在 Java 7 之前,字符串常量池被放在运行时常量池中,它属于永久代。而在 Java 7,字符串常量池被放在堆中。这是因为永久代的空间有限,在大量使用字符串的场景下会导致 OutOfMemoryError 错误。
777775

778776
> [What is String interning?](https://stackoverflow.com/questions/10578984/what-is-string-interning) </br> [深入解析 String#intern](https://tech.meituan.com/in_depth_understanding_string_intern.html)
779777
@@ -946,7 +944,7 @@ Throwable 可以用来表示任何可以作为异常抛出的类,分为两种
946944
1. **受检异常** :需要用 try...catch... 语句捕获并进行处理,并且可以从异常中恢复;
947945
2. **非受检异常** :是程序运行时错误,例如除 0 会引发 Arithmetic Exception,此时程序奔溃并且无法恢复。
948946

949-
<div align="center"> <img src="../pics//PPjwP.png"/> </div><br>
947+
<div align="center"> <img src="../pics//PPjwP.png" width="600"/> </div><br>
950948

951949
> [Java 入门之异常处理](https://www.tianmaying.com/tutorial/Java-Exception) </br> [Java 异常的面试问题及答案 -Part 1](http://www.importnew.com/7383.html)
952950

0 commit comments

Comments
 (0)