auto commit

This commit is contained in:
CyC2018
2018-02-22 14:47:22 +08:00
parent c40ef3cf25
commit 7e4d5152f7
84 changed files with 29405 additions and 4615 deletions
File diff suppressed because it is too large Load Diff
+216 -216
View File
File diff suppressed because it is too large Load Diff
+321 -321
View File
File diff suppressed because it is too large Load Diff
+141 -141
View File
File diff suppressed because it is too large Load Diff
+59 -59
View File
@@ -1,140 +1,140 @@
<!-- GFM-TOC -->
* [基础](#基础)
* [????](#????)
* [ final](#-final)
* [初始化顺序](#初始化顺序)
* [访问权限](#访问权限)
* [容器](#容器)
* [????????](#????????)
* [???????](#???????)
* [????](#????)
* [Set](#set)
* [Queue](#queue)
* [Map](#map)
* [反射](#反射)
* [异常](#异常)
* [参考资料](#参考资料)
* [????](#????)
* [??](#??)
* [?¦Ï?????](#?¦Ï?????)
<!-- GFM-TOC -->
# 基础
# ????
## final
**final 数据**
**final ????**
声明数据为常量,可以是编译时常量,也可以是在运行时被初始化后不能被改变的常量。
??????????????????????????????????????????????????????????????????
对于基本类型,final 使数值不变;对于引用对象,final 使引用不变,也就不能引用其它对象,但是被引用的对象本身是可以修改的。
????????????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???????????????¦Ç???????????????
可以对类或类中的成员(字段以及方法)加上访问修饰符。成员可见表示其它类可以用成员所在类的对象访问到该成员;类可见表示其它类可以用这个类创建对象,可以把类当做包中的一个成员,然后包表示一个类,这样就好理解了。
???????????§Ö???????????????????????????¦Ç??????????????????????¨®?????????????????¨®????????????????????????????????????????????§Ö??????????????????????????????????
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:使用树实现,保持有序,但是查找效率不如 HashSet;
- TreeSet?????????????????????????§¹????? HashSet??
- LinkedListHashSet:具有 HashSet 的查找效率,且内部使用链表维护元素的插入顺序,因此具有有序性。
- 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... 语句捕获并进行处理,并且可以从异常中恢复;非受检异常是程序运行时错误,例如除 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)
+70 -70
View File
File diff suppressed because it is too large Load Diff
+610 -610
View File
File diff suppressed because it is too large Load Diff
+426 -426
View File
File diff suppressed because it is too large Load Diff
+198 -198
View File
File diff suppressed because it is too large Load Diff
+250 -250
View File
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1 @@
File diff suppressed because it is too large Load Diff
+164
View File
@@ -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
+143
View File
@@ -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/)
+29
View File
@@ -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 采用二进制格式。
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff

Some files were not shown because too many files have changed in this diff Show More