Skip to content

Commit 5608f55

Browse files
committed
auto commit
1 parent 65fe30f commit 5608f55

18 files changed

+546
-546
lines changed

notes/HTTP.md

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -61,11 +61,11 @@ URI 包含 URL 和 URN,目前 WEB 只有 URL 比较流行,所以见到的基
6161

6262
## 请求和响应报文
6363

64-
**请求报文**
64+
**请求报文**
6565

6666
<br><div align="center"> <img src="https://github.com/CyC2018/InterviewNotes/blob/master/pics//22b39f77-ac47-4978-91ed-84aaf457644c.jpg"/> </div><br>
6767

68-
**响应报文**
68+
**响应报文**
6969

7070
<br><div align="center"> <img src="https://github.com/CyC2018/InterviewNotes/blob/master/pics//00d8d345-cd4a-48af-919e-209d2788eca7.jpg"/> </div><br>
7171

@@ -142,43 +142,43 @@ TRACE 一般不会使用,并且它容易受到 XST 攻击(Cross-Site Tracing
142142

143143
## 2XX 成功
144144

145-
- **200 OK**
145+
- **200 OK**
146146

147-
- **204 No Content**:请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
147+
- **204 No Content** :请求已经成功处理,但是返回的响应报文不包含实体的主体部分。一般在只需要从客户端往服务器发送信息,而不需要返回数据时使用。
148148

149-
- **206 Partial Content**
149+
- **206 Partial Content**
150150

151151
## 3XX 重定向
152152

153-
- **301 Moved Permanently**:永久性重定向
153+
- **301 Moved Permanently** :永久性重定向
154154

155-
- **302 Found**:临时性重定向
155+
- **302 Found** :临时性重定向
156156

157-
- **303 See Other**
157+
- **303 See Other**
158158

159159
- 注:虽然 HTTP 协议规定 301、302 状态下重定向时不允许把 POST 方法改成 GET 方法,但是大多数浏览器都会 在 301、302 和 303 状态下的重定向把 POST 方法改成 GET 方法。
160160

161-
- **304 Not Modified**:如果请求报文首部包含一些条件,例如:If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since,但是不满足条件,则服务器会返回 304 状态码。
161+
- **304 Not Modified** :如果请求报文首部包含一些条件,例如:If-Match,If-ModifiedSince,If-None-Match,If-Range,If-Unmodified-Since,但是不满足条件,则服务器会返回 304 状态码。
162162

163-
- **307 Temporary Redirect**:临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。
163+
- **307 Temporary Redirect** :临时重定向,与 302 的含义类似,但是 307 要求浏览器不会把重定向请求的 POST 方法改成 GET 方法。
164164

165165
## 4XX 客户端错误
166166

167-
- **400 Bad Request**:请求报文中存在语法错误
167+
- **400 Bad Request** :请求报文中存在语法错误
168168

169-
- **401 Unauthorized**:该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。如果之前已进行过一次请求,则表示用户认证失败。
169+
- **401 Unauthorized** :该状态码表示发送的请求需要有通过 HTTP 认证(BASIC 认证、DIGEST 认证)的认证信息。如果之前已进行过一次请求,则表示用户认证失败。
170170

171171
<br><div align="center"> <img src="https://github.com/CyC2018/InterviewNotes/blob/master/pics//b1b4cf7d-c54a-4ff1-9741-cd2eea331123.jpg"/> </div><br>
172172

173-
- **403 Forbidden**:请求被拒绝,服务器端没有必要给出拒绝的详细理由。
173+
- **403 Forbidden** :请求被拒绝,服务器端没有必要给出拒绝的详细理由。
174174

175-
- **404 Not Found**
175+
- **404 Not Found**
176176

177177
## 5XX 服务器错误
178178

179-
- **500 Internal Server Error**:服务器正在执行请求时发生错误
179+
- **500 Internal Server Error** :服务器正在执行请求时发生错误
180180

181-
- **503 Service Unavilable**:该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
181+
- **503 Service Unavilable** :该状态码表明服务器暂时处于超负载或正在进行停机维护,现在无法处理请求。
182182

183183
# HTTP 首部
184184

@@ -274,15 +274,15 @@ Set-Cookie 字段有以下属性:
274274
| Secure | 仅在 HTTPS 安全通信时才会发送 Cookie |
275275
| HttpOnly | 加以限制,使 Cookie 不能被 JavaScript 脚本访问 |
276276

277-
**Session 和 Cookie 区别**
277+
**Session 和 Cookie 区别**
278278

279279
Session 是服务器用来跟踪用户的一种手段,每个 Session 都有一个唯一标识:Session ID。当服务器创建了一个 Session 时,给客户端发送的响应报文就包含了 Set-Cookie 字段,其中有一个名为 sid 的键值对,这个键值对就是 Session ID。客户端收到后就把 Cookie 保存在浏览器中,并且之后发送的请求报文都包含 Session ID。HTTP 就是通过 Session 和 Cookie 这两种方式一起合作来实现跟踪用户状态的,Session 用于服务器端,Cookie 用于客户端。
280280

281-
**浏览器禁用 Cookie 的情况**
281+
**浏览器禁用 Cookie 的情况**
282282

283283
会使用 URL 重写技术,在 URL 后面加上 sid=xxx 。
284284

285-
**使用 Cookie 实现用户名和密码的自动填写**
285+
**使用 Cookie 实现用户名和密码的自动填写**
286286

287287
网站脚本会自动从 Cookie 中读取用户名和密码,从而实现自动填写。
288288

@@ -296,7 +296,7 @@ Expires 字段可以用于告知缓存服务器该资源什么时候会过期。
296296

297297
## 持久连接
298298

299-
当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问 HTML 页面资源,还会请求图片资源,如果每进行一次 HTTP 通信就要断开一次 TCP 连接,连接建立和断开的开销会很大。**持久连接** 只需要进行一次 TCP 连接就能进行多次 HTTP 通信。HTTP/1.1 开始,所有的连接默认都是持久连接。
299+
当浏览器访问一个包含多张图片的 HTML 页面时,除了请求访问 HTML 页面资源,还会请求图片资源,如果每进行一次 HTTP 通信就要断开一次 TCP 连接,连接建立和断开的开销会很大。 **持久连接** 只需要进行一次 TCP 连接就能进行多次 HTTP 通信。HTTP/1.1 开始,所有的连接默认都是持久连接。
300300

301301
<br><div align="center"> <img src="https://github.com/CyC2018/InterviewNotes/blob/master/pics//c73a0b78-5f46-4d2d-a009-dab2a999b5d8.jpg"/> </div><br>
302302

@@ -340,7 +340,7 @@ Expires 字段可以用于告知缓存服务器该资源什么时候会过期。
340340

341341
## 通信数据转发
342342

343-
**代理**
343+
**代理**
344344

345345
代理服务器接受客户端的请求,并且转发给其它服务器。
346346

@@ -350,13 +350,13 @@ Expires 字段可以用于告知缓存服务器该资源什么时候会过期。
350350

351351
<br><div align="center"> <img src="https://github.com/CyC2018/InterviewNotes/blob/master/pics//c07035c3-a9ba-4508-8e3c-d8ae4c6ee9ee.jpg"/> </div><br>
352352

353-
**网关**
353+
**网关**
354354

355355
与代理服务器不同的是,网关服务器会将 HTTP 转化为其它协议进行通信,从而请求其它非 HTTP 服务器的服务。
356356

357357
<br><div align="center"> <img src="https://github.com/CyC2018/InterviewNotes/blob/master/pics//81375888-6be1-476f-9521-42eea3e3154f.jpg"/> </div><br>
358358

359-
**隧道**
359+
**隧道**
360360

361361
使用 SSL 等加密手段,为客户端和服务器之间建立一条安全的通信线路。
362362

@@ -378,13 +378,13 @@ HTTPs 并不是新协议,而是 HTTP 先和 SSL(Secure Socket Layer)通信
378378

379379
对称密钥加密的缺点:无法安全传输密钥;公开密钥加密的缺点:相对来说更耗时。
380380

381-
HTTPs 采用 **混合的加密机制**,使用公开密钥加密用于传输对称密钥,之后使用对称密钥加密进行通信。(下图中,共享密钥即对称密钥)
381+
HTTPs 采用 **混合的加密机制** ,使用公开密钥加密用于传输对称密钥,之后使用对称密钥加密进行通信。(下图中,共享密钥即对称密钥)
382382

383383
<br><div align="center"> <img src="https://github.com/CyC2018/InterviewNotes/blob/master/pics//110b1a9b-87cd-45c3-a21d-824623715b33.jpg"/> </div><br>
384384

385385
## 认证
386386

387-
通过使用 **证书** 来对通信方进行认证。证书中有公开密钥数据,如果可以验证公开密钥的确属于通信方的,那么就可以确定通信方是可靠的。
387+
通过使用 **证书** 来对通信方进行认证。证书中有公开密钥数据,如果可以验证公开密钥的确属于通信方的,那么就可以确定通信方是可靠的。
388388

389389
数字证书认证机构(CA,Certificate Authority)可以对其颁发的公开密钥证书对其进行验证。
390390

notes/JVM.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -371,13 +371,13 @@ Region 不可能是孤立的,一个对象分配在某个 Region 中,可以
371371

372372
| 收集器 | 串行、并行 or 并发 | 新生代 / 老年代 | 算法 | 目标 | 适用场景 |
373373
| --- | --- | --- | --- | --- | --- |
374-
| **Serial** | 串行 | 新生代 | 复制算法 | 响应速度优先 | 单 CPU 环境下的 Client 模式 |
375-
| **Serial Old** | 串行 | 老年代 | 标记 - 整理 | 响应速度优先 | 单 CPU 环境下的 Client 模式、CMS 的后备预案 |
376-
| **ParNew** | 并行 | 新生代 | 复制算法 | 响应速度优先 | 多 CPU 环境时在 Server 模式下与 CMS 配合 |
377-
| **Parallel Scavenge** | 并行 | 新生代 | 复制算法 | 吞吐量优先 | 在后台运算而不需要太多交互的任务 |
378-
| **Parallel Old** | 并行 | 老年代 | 标记 - 整理 | 吞吐量优先 | 在后台运算而不需要太多交互的任务 |
379-
| **CMS** | 并发 | 老年代 | 标记 - 清除 | 响应速度优先 | 集中在互联网站或 B/S 系统服务端上的 Java 应用 |
380-
| **G1** | 并发 | both | 标记 - 整理 + 复制算法 | 响应速度优先 | 面向服务端应用,将来替换 CMS |
374+
| **Serial** | 串行 | 新生代 | 复制算法 | 响应速度优先 | 单 CPU 环境下的 Client 模式 |
375+
| **Serial Old** | 串行 | 老年代 | 标记 - 整理 | 响应速度优先 | 单 CPU 环境下的 Client 模式、CMS 的后备预案 |
376+
| **ParNew** | 并行 | 新生代 | 复制算法 | 响应速度优先 | 多 CPU 环境时在 Server 模式下与 CMS 配合 |
377+
| **Parallel Scavenge** | 并行 | 新生代 | 复制算法 | 吞吐量优先 | 在后台运算而不需要太多交互的任务 |
378+
| **Parallel Old** | 并行 | 老年代 | 标记 - 整理 | 吞吐量优先 | 在后台运算而不需要太多交互的任务 |
379+
| **CMS** | 并发 | 老年代 | 标记 - 清除 | 响应速度优先 | 集中在互联网站或 B/S 系统服务端上的 Java 应用 |
380+
| **G1** | 并发 | both | 标记 - 整理 + 复制算法 | 响应速度优先 | 面向服务端应用,将来替换 CMS |
381381

382382
## 4. 内存分配与回收策略
383383

@@ -437,11 +437,11 @@ JVM 为对象定义年龄计数器,经过 Minor GC 依然存活且被 Survivor
437437

438438
包括以下 7 个阶段:
439439

440-
- **加载(Loading)**
441-
- **验证(Verification)**
442-
- **准备(Preparation)**
443-
- **解析(Resolution)**
444-
- **初始化(Initialization)**
440+
- **加载(Loading)**
441+
- **验证(Verification)**
442+
- **准备(Preparation)**
443+
- **解析(Resolution)**
444+
- **初始化(Initialization)**
445445
- 使用(Using)
446446
- 卸载(Unloading)
447447

@@ -612,15 +612,15 @@ public static void main(String[] args) {
612612

613613
<br><div align="center"> <img src="https://github.com/CyC2018/InterviewNotes/blob/master/pics//2cdc3ce2-fa82-4c22-baaa-000c07d10473.jpg"/> </div><br>
614614

615-
**工作过程**
615+
**工作过程**
616616

617617
如果一个类加载器收到了类加载的请求,它首先不会自己去尝试加载,而是把这个请求委派给父类加载器,每一个层次的加载器都是如此,依次递归,因此所有的加载请求最终都应该传送到顶层的启动类加载器中,只有当父加载器反馈自己无法完成此加载请求(它搜索范围中没有找到所需类)时,子加载器才会尝试自己加载。
618618

619-
**好处**
619+
**好处**
620620

621621
使用双亲委派模型来组织类加载器之间的关系,使得 Java 类随着它的类加载器一起具备了一种带有优先级的层次关系。例如类 java.lang.Object,它存放再 rt.jar 中,无论哪个类加载器要加载这个类,最终都是委派给处于模型最顶端的启动类加载器进行加载,因此 Object 类在程序的各种类加载器环境中都是同一个类。相反,如果没有双亲委派模型,由各个类加载器自行加载的话,如果用户编写了一个称为`java.lang.Object 的类,并放在程序的 ClassPath 中,那系统中将会出现多个不同的 Object 类,程序将变得一片混乱。如果开发者尝试编写一个与 rt.jar 类库中已有类重名的 Java 类,将会发现可以正常编译,但是永远无法被加载运行。
622622

623-
**实现**
623+
**实现**
624624

625625
```java
626626
protected synchronized Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException{

notes/Java IO.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,7 @@ GBK 编码中,中文占 2 个字节,英文占 1 个字节;UTF-8 编码中
9898

9999
transient 关键字可以使一些属性不会被序列化。
100100

101-
**ArrayList 序列化和反序列化的实现**:ArrayList 中存储数据的数组是用 transient 修饰的,因为这个数组是动态扩展的,并不是所有的空间都被使用,因此就不需要所有的内容都被序列化。通过重写序列化和反序列化方法,使得可以只序列化数组中有内容的那部分数据。
101+
**ArrayList 序列化和反序列化的实现** :ArrayList 中存储数据的数组是用 transient 修饰的,因为这个数组是动态扩展的,并不是所有的空间都被使用,因此就不需要所有的内容都被序列化。通过重写序列化和反序列化方法,使得可以只序列化数组中有内容的那部分数据。
102102

103103
```
104104
private transient Object[] elementData;

notes/Java 基础.md

Lines changed: 19 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -33,39 +33,39 @@
3333

3434
## 1. final
3535

36-
**数据**
36+
**数据**
3737

3838
声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。
3939

4040
对于基本类型,final 使数值不变;对于引用对象,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
4141

42-
**方法**
42+
**方法**
4343

4444
声明方法不能被子类覆盖。
4545

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

48-
****
48+
****
4949

5050
声明类不允许被继承。
5151

5252
## 2. static
5353

54-
**变量**
54+
**变量**
5555

5656
静态变量在内存中只存在一份,只在类第一次实例化时初始化一次,同时类所有的实例都共享静态变量,可以直接通过类名来访问它。
5757

5858
但是实例变量则不同,它是伴随着实例的,每创建一个实例就会产生一个实例变量,它与该实例同生共死。
5959

60-
**方法**
60+
**方法**
6161

6262
静态方法在类加载的时候就存在了,它不依赖于任何实例,所以 static 方法必须实现,也就是说他不能是抽象方法 abstract。
6363

64-
**静态语句块**
64+
**静态语句块**
6565

6666
静态语句块和静态变量一样在类第一次实例化时运行一次。
6767

68-
**初始化顺序**
68+
**初始化顺序**
6969

7070
静态数据优先于其它数据的初始化,静态变量和静态语句块哪个先运行取决于它们在代码中的顺序。
7171

@@ -127,13 +127,13 @@ public InitialOrderTest() {
127127

128128
## 2. clone()
129129

130-
**浅拷贝**
130+
**浅拷贝**
131131

132132
引用类型引用的是同一个对象,clone() 方法默认就是浅拷贝实现。
133133

134134
<br><div align="center"> <img src="https://github.com/CyC2018/InterviewNotes/blob/master/pics//d990c0e7-64d1-4ba3-8356-111bc91e53c5.png"/> </div><br>
135135

136-
**深拷贝**
136+
**深拷贝**
137137

138138
可以使用序列化实现。
139139

@@ -213,11 +213,11 @@ public class Subclass extends Superclass {
213213

214214
## 1. String, StringBuffer and StringBuilder
215215

216-
**是否可变**
216+
**是否可变**
217217

218218
String 不可变,StringBuffer 和 StringBuilder 可变。
219219

220-
**是否线程安全**
220+
**是否线程安全**
221221

222222
String 不可变,因此是线程安全的。
223223

@@ -227,21 +227,21 @@ StringBuilder 不是线程安全的;StringBuffer 是线程安全的,使用 s
227227

228228
## 2. String 不可变的原因
229229

230-
**可以缓存 hash 值**
230+
**可以缓存 hash 值**
231231

232232
因为 String 的 hash 值经常被使用,例如 String 用做 HashMap 等。不可变的特性可以使得 hash 值也不可变,因此就只需要进行一次计算。
233233

234-
**String Pool 的需要**
234+
**String Pool 的需要**
235235

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

238238
<br><div align="center"> <img src="https://github.com/CyC2018/InterviewNotes/blob/master/pics//f76067a5-7d5f-4135-9549-8199c77d8f1c.jpg"/> </div><br>
239239

240-
**安全性**
240+
**安全性**
241241

242242
String 经常作为参数,例如网络连接参数等,在作为网络连接参数的情况下,如果 String 是可变的,那么在网络连接过程中,String 被改变,改变 String 对象的那一方以为现在连接的是其它主机,而实际情况却不一定是。String 不可变性可以保证参数不可变。
243243

244-
**线程安全**
244+
**线程安全**
245245

246246
String 不可变性天生具备线程安全,可以在多个线程中使用。
247247

@@ -363,23 +363,23 @@ public static void main(java.lang.String[]);
363363

364364
# 反射
365365

366-
每个类都有一个 **Class** 对象,包含了与类有关的信息。当编译一个新类时,会产生一个同名的 .class 文件,该文件内容保存着 Class 对象。
366+
每个类都有一个 **Class** 对象,包含了与类有关的信息。当编译一个新类时,会产生一个同名的 .class 文件,该文件内容保存着 Class 对象。
367367

368368
类加载相当于 Class 对象的加载。类在第一次使用时才动态加载到 JVM 中,可以使用 Class.forName('com.mysql.jdbc.Driver.class') 这种方式来控制类的加载,该方法会返回一个 Class 对象。
369369

370370
反射可以提供运行时的类信息,并且这个类可以在运行时才加载进来,甚至在编译时期该类的 .class 不存在也可以加载进来。
371371

372-
Class 和 java.lang.reflect 一起对反射提供了支持,java.lang.reflect 类库包含了 **Field**、**Method** 以及 **Constructor** 类。可以使用 get() 和 set() 方法读取和修改 Field 对象关联的字段,可以使用 invoke() 方法调用与 Method 对象关联的方法,可以用 Constructor 创建新的对象。
372+
Class 和 java.lang.reflect 一起对反射提供了支持,java.lang.reflect 类库包含了 **Field** 、**Method** 以及 **Constructor** 类。可以使用 get() 和 set() 方法读取和修改 Field 对象关联的字段,可以使用 invoke() 方法调用与 Method 对象关联的方法,可以用 Constructor 创建新的对象。
373373

374374
IDE 使用反射机制获取类的信息,在使用一个类的对象时,能够把类的字段、方法和构造函数等信息列出来供用户选择。
375375

376376
更详细的内容:[ 深入解析 Java 反射(1)- 基础 ](http://www.sczyh30.com/posts/Java/java-reflection-1/)
377377

378378
# 异常
379379

380-
Throwable 可以用来表示任何可以作为异常抛出的类,分为两种:**Error** 和 **Exception**,其中 Error 用来表示编译时系统错误。
380+
Throwable 可以用来表示任何可以作为异常抛出的类,分为两种: **Error** 和 **Exception**,其中 Error 用来表示编译时系统错误。
381381

382-
Exception 分为两种:**受检异常** 和 **非受检异常**。受检异常需要用 try...catch... 语句捕获并进行处理,并且可以从异常中恢复;非受检异常是程序运行时错误,例如除 0 会引发 Arithmetic Exception,此时程序奔溃并且无法恢复。
382+
Exception 分为两种: **受检异常** 和 **非受检异常**。受检异常需要用 try...catch... 语句捕获并进行处理,并且可以从异常中恢复;非受检异常是程序运行时错误,例如除 0 会引发 Arithmetic Exception,此时程序奔溃并且无法恢复。
383383

384384
<br><div align="center"> <img src="https://github.com/CyC2018/InterviewNotes/blob/master/pics//48f8f98e-8dfd-450d-8b5b-df4688f0d377.jpg"/> </div><br>
385385

0 commit comments

Comments
 (0)