Merge pull request #1 from CyC2018/master

Update
This commit is contained in:
Xie Wei 2019-02-17 20:25:16 +08:00 committed by GitHub
commit 8381ca00b2
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
220 changed files with 234 additions and 181 deletions

View File

@ -9,11 +9,11 @@
<br> <br>
<div align="center"> <div align="center">
<img src="other/LogoMakr_0zpEzN.png" width="200px"> <img src="assets/LogoMakr_0zpEzN.png" width="200px">
<br> <br>
<a href="https://cyc2018.github.io/CS-Notes"> <img src="https://img.shields.io/badge/>-read-4ab8a1.svg"></a> <a href="https://xiaozhuanlan.com/CyC2018"> <img src="https://img.shields.io/badge/_-more-4ab8a1.svg"></a> <a href="https://cyc2018.github.io/CS-Notes"> <img src="https://img.shields.io/badge/>-read-4ab8a1.svg"></a> <a href="https://xiaozhuanlan.com/CyC2018"> <img src="https://img.shields.io/badge/_-more-4ab8a1.svg"></a>
<br> <br> <br> <br>
本项目包含了技术面试必备的基础知识,浅显易懂,你不需要花很长的时间去阅读和理解成堆的技术书籍就可以快速掌握这些知识,从而节省宝贵的面试复习时间。你也可以<a href="https://xiaozhuanlan.com/CyC2018">面试进阶专栏</a>,包含了学习指导和面试技巧,让你更轻松拿到满意的 Offer。 本项目包含了技术面试必备的基础知识,浅显易懂,你不需要花很长的时间去阅读和理解成堆的技术书籍就可以快速掌握这些知识,从而节省宝贵的面试复习时间。你也可以阅 <a href="https://github.com/CyC2018/Backend-Interview-Guide">面试进阶指南</a>,包含了学习指导和面试技巧,让你更轻松拿到满意的 Offer。
</div> </div>
<br> <br>
@ -83,21 +83,23 @@
[Job-Recommend](https://github.com/CyC2018/Job-Recommend) [Job-Recommend](https://github.com/CyC2018/Job-Recommend)
### 专栏
[面试进阶指南](https://xiaozhuanlan.com/CyC2018)
### 知识星球
想要向我提问关于学习和求职方面的建议?来知识星球,你的每个提问我都会认真回答。
[知识星球](other/Planet.md)
### QQ 群 ### QQ 群
为大家提供一个学习交流平台,在这里你可以自由地讨论技术问题。 为大家提供一个学习交流平台,在这里你可以自由地讨论技术问题。
<img src="https://github.com/CyC2018/CS-Notes/raw/master/other/group1.png" width="200px"></br> <img src="assets/group1.png" width="150px"></br>
### 关于我
<a href="https://www.zhihu.com/people/xiao-shi-guang-33/activities">
<img src="assets/知乎.jpg" width="60px">
</a> &nbsp;&nbsp;
<a href="https://xiaozhuanlan.com/CyC2018">
<img src="assets/小专栏.jpg" width="60px">
</a> &nbsp;&nbsp;
<a href="https://shimo.im/docs/1Vuo5GeWCHMnxMtF/">
<img src="assets/知识星球.png" width="60px">
</a>
### 排版 ### 排版
@ -113,18 +115,17 @@
### License ### License
学习笔记不是从网上到处拼凑而来,除了少部分引用书上和技术文档的原文,其余都是笔者的原创。在您引用本仓库内容或者对内容进行修改演绎时,请署名并以相同方式共享,谢谢。 学习笔记不是从网上到处拼凑而来,除了少部分引用书上和技术文档的原文,其余都是的原创。在您引用本仓库内容或者对内容进行修改演绎时,请署名并以相同方式共享,谢谢。
<a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a> <a rel="license" href="http://creativecommons.org/licenses/by-nc-sa/4.0/"><img alt="知识共享许可协议" style="border-width:0" src="https://i.creativecommons.org/l/by-nc-sa/4.0/88x31.png" /></a>
### Logo ### Logo
Power by [logomakr](https://logomakr.com/). Power by [logomakr](https://logomakr.com/).
### 致谢 ### 致谢
感谢以下人员对本仓库做出的贡献,当然不仅仅只有这些贡献者,这里就不一一列举了。如果你希望被添加到这个名单中,并且提交过 Issue 或者 PR请与笔者联系。 感谢以下人员对本仓库做出的贡献,当然不仅仅只有这些贡献者,这里就不一一列举了。如果你希望被添加到这个名单中,并且提交过 Issue 或者 PR请与联系。
<a href="https://github.com/linw7"> <a href="https://github.com/linw7">
<img src="https://avatars3.githubusercontent.com/u/21679154?s=400&v=4" width="50px"> <img src="https://avatars3.githubusercontent.com/u/21679154?s=400&v=4" width="50px">
@ -154,19 +155,3 @@ Power by [logomakr](https://logomakr.com/).
<img src="https://avatars1.githubusercontent.com/u/21008209?s=400&v=4" width="50px"> <img src="https://avatars1.githubusercontent.com/u/21008209?s=400&v=4" width="50px">
</a> </a>
<!-- | | Ⅱ | Ⅲ | Ⅳ | | Ⅵ | Ⅶ | Ⅷ | Ⅸ | |
| :--------: | :---------: | :---------: | :---------: | :---------: | :---------:| :---------: | :-------: | :-------:| :------:|
| 算法[:pencil2:](#pencil2-算法) | 操作系统[:computer:](#computer-操作系统)|网络[:cloud:](#cloud-网络) | 面向对象[:couple:](#couple-面向对象) |数据库[:floppy_disk:](#floppy_disk-数据库)| Java [:coffee:](#coffee-java)| 系统设计[:bulb:](#bulb-系统设计)| 工具[:hammer:](#hammer-工具)| 编码实践[:speak_no_evil:](#speak_no_evil-编码实践)| 后记[:memo:](#memo-后记) | -->
<!-- | | Ⅱ | Ⅲ | Ⅳ | |
| :--------: | :---------: | :---------: | :---------: | :---------: |
| &emsp;&emsp;&emsp;算法&emsp;&emsp;&emsp;<br>[:pencil2:](#pencil2-算法) | &emsp;&emsp;&emsp;操作系统&emsp;&emsp;&emsp;<br>[:computer:](#computer-操作系统) | &emsp;&emsp;&emsp;&emsp;网络&emsp;&emsp;&emsp;&emsp;<br>[:cloud:](#cloud-网络) | &emsp;&emsp;&emsp;面向对象&emsp;&emsp;&emsp;<br>[:couple:](#couple-面向对象) | &emsp;&emsp;&emsp;数据库&emsp;&emsp;<br>[:floppy_disk:](#floppy_disk-数据库)|
| Ⅵ | Ⅶ | Ⅷ | Ⅸ | |
|:---------:| :---------: | :-------: | :-------:| :------:|
| &emsp;&emsp;&emsp;Java&emsp;&emsp;&emsp;<br>[:coffee:](#coffee-java) | &emsp;&emsp;&emsp;系统设计&emsp;&emsp;&emsp;<br>[:bulb:](#bulb-系统设计) | &emsp;&emsp;&emsp;&emsp;工具&emsp;&emsp;&emsp;&emsp;<br>[:hammer:](#hammer-工具) | &emsp;&emsp;&emsp;编码实践&emsp;&emsp;&emsp;<br>[:speak_no_evil:](#speak_no_evil-编码实践) | &emsp;&emsp;&emsp;后记 &emsp;&emsp;&emsp;<br>[:memo:](#memo-后记) |
-->
<br>

View File

Before

Width:  |  Height:  |  Size: 33 KiB

After

Width:  |  Height:  |  Size: 33 KiB

View File

Before

Width:  |  Height:  |  Size: 5.1 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

Before

Width:  |  Height:  |  Size: 31 KiB

After

Width:  |  Height:  |  Size: 31 KiB

BIN
assets/小专栏.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 628 KiB

BIN
assets/牛客网.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

BIN
assets/知乎.jpg Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

BIN
assets/知识星球.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@ -1,5 +1,5 @@
> [🍉 点击订阅面试进阶专栏](https://xiaozhuanlan.com/CyC2018) > [🍉 点击阅读面试进阶指南](https://github.com/CyC2018/Backend-Interview-Guide)
## ✏️ 算法 ## ✏️ 算法

View File

@ -2,7 +2,7 @@
# CS-Notes # CS-Notes
- 本项目包含了技术面试必备的基础知识,浅显易懂,你不需要花很长的时间去阅读和理解成堆的技术书籍就可以快速掌握这些知识,从而节省宝贵的面试复习时间。你也可以<a href="https://xiaozhuanlan.com/CyC2018">面试进阶专栏</a>,包含了学习指导和面试技巧,让你更轻松拿到满意的 Offer。 - 本项目包含了技术面试必备的基础知识,浅显易懂,你不需要花很长的时间去阅读和理解成堆的技术书籍就可以快速掌握这些知识,从而节省宝贵的面试复习时间。你也可以阅 <a href="https://github.com/CyC2018/Backend-Interview-Guide">面试进阶指南</a>,包含了学习指导和面试技巧,让你更轻松拿到满意的 Offer。
<span id="busuanzi_container_site_pv">Site View : <span id="busuanzi_value_site_pv"> <span id="busuanzi_container_site_pv">Site View : <span id="busuanzi_value_site_pv">

View File

@ -49,3 +49,27 @@ section.cover h1 {
body>section>div.cover-main>ul>li>a { body>section>div.cover-main>ul>li>a {
color: #42b983; color: #42b983;
} }
.markdown-section img {
box-shadow: 7px 9px 10px #aaa !important;
}
pre {
background-color: #f3f2ee !important;
}
@media (min-width:600px) {
pre code {
box-shadow: 2px 1px 20px 2px #aaa;
/*border-radius: 10px !important;*/
padding-left: 20px !important;
}
}
@media (max-width:600px) {
pre {
padding-left: 0px !important;
padding-right: 0px !important;
}
}

View File

@ -1,4 +1,4 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [一、解决的问题](#一解决的问题) * [一、解决的问题](#一解决的问题)
* [二、与虚拟机的比较](#二与虚拟机的比较) * [二、与虚拟机的比较](#二与虚拟机的比较)

View File

@ -1,4 +1,4 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [集中式与分布式](#集中式与分布式) * [集中式与分布式](#集中式与分布式)
* [中心服务器](#中心服务器) * [中心服务器](#中心服务器)

View File

@ -1,4 +1,4 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [一 、基础概念](#一-基础概念) * [一 、基础概念](#一-基础概念)
* [URI](#uri) * [URI](#uri)

View File

@ -1,4 +1,4 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [一、概览](#一概览) * [一、概览](#一概览)
* [二、磁盘操作](#二磁盘操作) * [二、磁盘操作](#二磁盘操作)
@ -98,7 +98,7 @@ Java I/O 使用了装饰者模式来实现。以 InputStream 为例,
- FileInputStream 是 InputStream 的子类,属于具体组件,提供了字节流的输入操作; - FileInputStream 是 InputStream 的子类,属于具体组件,提供了字节流的输入操作;
- FilterInputStream 属于抽象装饰者,装饰者用于装饰组件,为组件提供额外的功能。例如 BufferedInputStream 为 FileInputStream 提供缓存的功能。 - FilterInputStream 属于抽象装饰者,装饰者用于装饰组件,为组件提供额外的功能。例如 BufferedInputStream 为 FileInputStream 提供缓存的功能。
<div align="center"> <img src="pics/DP-Decorator-java.io.png" width="500"/> </div><br> <div align="center"> <img src="pics/9bae24e9-d2f5-4e1d-af42-1a868a5847cf.jpg"/> </div><br>
实例化一个具有缓存功能的字节流对象时,只需要在 FileInputStream 对象上再套一层 BufferedInputStream 对象即可。 实例化一个具有缓存功能的字节流对象时,只需要在 FileInputStream 对象上再套一层 BufferedInputStream 对象即可。
@ -278,7 +278,7 @@ public static void main(String[] args) throws IOException {
- Socket客户端类 - Socket客户端类
- 服务器和客户端通过 InputStream 和 OutputStream 进行输入输出。 - 服务器和客户端通过 InputStream 和 OutputStream 进行输入输出。
<div align="center"> <img src="pics/ClienteServidorSockets1521731145260.jpg"/> </div><br> <div align="center"> <img src="pics/f77f06b6-7359-4066-b85d-3f6c09ddf425.jpg"/> </div><br>
## Datagram ## Datagram
@ -414,7 +414,7 @@ NIO 实现了 IO 多路复用中的 Reactor 模型,一个线程 Thread 使用
应该注意的是,只有套接字 Channel 才能配置为非阻塞,而 FileChannel 不能,为 FileChannel 配置非阻塞也没有意义。 应该注意的是,只有套接字 Channel 才能配置为非阻塞,而 FileChannel 不能,为 FileChannel 配置非阻塞也没有意义。
<div align="center"> <img src="pics/4d930e22-f493-49ae-8dff-ea21cd6895dc.png"/> </div><br> <div align="center"> <img src="pics/8fdbb8f5-2cf8-41dc-b5f1-99d98abb52d9.jpg"/> </div><br>
### 1. 创建选择器 ### 1. 创建选择器

View File

@ -1,6 +1,7 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [一、数据类型](#一数据类型) * [一、数据类型](#一数据类型)
* [基本类型](#基本类型)
* [包装类型](#包装类型) * [包装类型](#包装类型)
* [缓存池](#缓存池) * [缓存池](#缓存池)
* [二、String](#二string) * [二、String](#二string)
@ -42,11 +43,8 @@
# 一、数据类型 # 一、数据类型
## 包装类型 ## 基本类型
八个基本类型:
- boolean/1
- byte/8 - byte/8
- char/16 - char/16
- short/16 - short/16
@ -54,6 +52,14 @@
- float/32 - float/32
- long/64 - long/64
- double/64 - double/64
- boolean/\~
boolean 只有两个值true、false可以使用 1 bit 来存储但是具体大小没有明确规定。JVM 会在编译时期将 boolean 类型的数据转换为 int使用 1 来表示 true0 表示 false。JVM 并不支持 boolean 数组,而是使用 byte 数组来表示 int 数组来表示。
- [Primitive Data Types](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)
- [The Java® Virtual Machine Specification](https://docs.oracle.com/javase/specs/jvms/se8/jvms8.pdf)
## 包装类型
基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。 基本类型都有对应的包装类型,基本类型与其对应的包装类型之间的赋值使用自动装箱与拆箱完成。
@ -184,7 +190,7 @@ value 数组被声明为 final这意味着 value 数组初始化之后就不
如果一个 String 对象已经被创建过了,那么就会从 String Pool 中取得引用。只有 String 是不可变的,才可能使用 String Pool。 如果一个 String 对象已经被创建过了,那么就会从 String Pool 中取得引用。只有 String 是不可变的,才可能使用 String Pool。
<div align="center"> <img src="pics/f76067a5-7d5f-4135-9549-8199c77d8f1c.jpg" width=""/> </div><br> <div align="center"> <img src="pics/474e5579-38b1-47d2-8f76-a13ae086b039.jpg"/> </div><br>
**3. 安全性** **3. 安全性**
@ -676,6 +682,65 @@ SuperExtendExample.func()
应该注意的是,返回值不同,其它都相同不算是重载。 应该注意的是,返回值不同,其它都相同不算是重载。
**3. 实例**
```java
class A {
public String show(D obj) {
return ("A and D");
}
public String show(A obj) {
return ("A and A");
}
}
class B extends A {
public String show(B obj) {
return ("B and B");
}
public String show(A obj) {
return ("B and A");
}
}
class C extends B {
}
class D extends B {
}
```
```java
public class Test {
public static void main(String[] args) {
A a1 = new A();
A a2 = new B();
B b = new B();
C c = new C();
D d = new D();
System.out.println(a1.show(b)); // A and A
System.out.println(a1.show(c)); // A and A
System.out.println(a1.show(d)); // A and D
System.out.println(a2.show(b)); // B and A
System.out.println(a2.show(c)); // B and A
System.out.println(a2.show(d)); // A and D
System.out.println(b.show(b)); // B and B
System.out.println(b.show(c)); // B and B
System.out.println(b.show(d)); // A and D
}
}
```
涉及到重写时,方法调用的优先级为:
- this.show(O)
- super.show(O)
- this.show((super)O)
- super.show((super)O)
# 五、Object 通用方法 # 五、Object 通用方法
## 概览 ## 概览

View File

@ -1,4 +1,4 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [一、概览](#一概览) * [一、概览](#一概览)
* [Collection](#collection) * [Collection](#collection)
@ -26,7 +26,7 @@
## Collection ## Collection
<div align="center"> <img src="pics/VP6n3i8W48Ptde8NQ9_0eSR5eOD6uqx.png"/> </div><br> <div align="center"> <img src="pics/6_200.png"/> </div><br>
### 1. Set ### 1. Set
@ -52,7 +52,7 @@
## Map ## Map
<div align="center"> <img src="pics/SoWkIImgAStDuUBAp2j9BKfBJ4vLy4q.png"/> </div><br> <div align="center"> <img src="pics/7_200.png"/> </div><br>
- TreeMap基于红黑树实现。 - TreeMap基于红黑树实现。
@ -67,7 +67,7 @@
## 迭代器模式 ## 迭代器模式
<div align="center"> <img src="pics/SoWkIImgAStDuUBAp2j9BKfBJ4vLy0G.png"/> </div><br> <div align="center"> <img src="pics/5_200.png"/> </div><br>
Collection 继承了 Iterable 接口,其中的 iterator() 方法能够产生一个 Iterator 对象,通过这个对象就可以迭代遍历 Collection 中的元素。 Collection 继承了 Iterable 接口,其中的 iterator() 方法能够产生一个 Iterator 对象,通过这个对象就可以迭代遍历 Collection 中的元素。
@ -112,6 +112,7 @@ List list = Arrays.asList(1, 2, 3);
## ArrayList ## ArrayList
### 1. 概览 ### 1. 概览
实现了 RandomAccess 接口,因此支持随机访问。这是理所当然的,因为 ArrayList 是基于数组实现的。 实现了 RandomAccess 接口,因此支持随机访问。这是理所当然的,因为 ArrayList 是基于数组实现的。
@ -127,6 +128,9 @@ public class ArrayList<E> extends AbstractList<E>
private static final int DEFAULT_CAPACITY = 10; private static final int DEFAULT_CAPACITY = 10;
``` ```
<div align="center"> <img src="pics/7935be3d-c2b3-4213-90c9-1e68ec4ac4e7.png"/> </div><br>
### 2. 扩容 ### 2. 扩容
添加元素时使用 ensureCapacityInternal() 方法来保证容量足够,如果不够时,需要使用 grow() 方法进行扩容,新容量的大小为 `oldCapacity + (oldCapacity >> 1)`,也就是旧容量的 1.5 倍。 添加元素时使用 ensureCapacityInternal() 方法来保证容量足够,如果不够时,需要使用 grow() 方法进行扩容,新容量的大小为 `oldCapacity + (oldCapacity >> 1)`,也就是旧容量的 1.5 倍。
@ -388,7 +392,7 @@ transient Node<E> first;
transient Node<E> last; transient Node<E> last;
``` ```
<div align="center"> <img src="pics/49495c95-52e5-4c9a-b27b-92cf235ff5ec.png" width="500"/> </div><br> <div align="center"> <img src="pics/09184175-9bf2-40ff-8a68-3b467c77216a.png"/> </div><br>
### 2. 与 ArrayList 的比较 ### 2. 与 ArrayList 的比较
@ -410,7 +414,7 @@ transient Entry[] table;
Entry 存储着键值对。它包含了四个字段,从 next 字段我们可以看出 Entry 是一个链表。即数组中的每个位置被当成一个桶一个桶存放一个链表。HashMap 使用拉链法来解决冲突,同一个链表中存放哈希值相同的 Entry。 Entry 存储着键值对。它包含了四个字段,从 next 字段我们可以看出 Entry 是一个链表。即数组中的每个位置被当成一个桶一个桶存放一个链表。HashMap 使用拉链法来解决冲突,同一个链表中存放哈希值相同的 Entry。
<div align="center"> <img src="pics/8fe838e3-ef77-4f63-bf45-417b6bc5c6bb.png" width="600"/> </div><br> <div align="center"> <img src="pics/1d2719d5-8d60-4c9b-a4ad-b2df7c7615af.jpg"/> </div><br>
```java ```java
static class Entry<K,V> implements Map.Entry<K,V> { static class Entry<K,V> implements Map.Entry<K,V> {
@ -486,7 +490,7 @@ map.put("K3", "V3");
- 计算键值对所在的桶; - 计算键值对所在的桶;
- 在链表上顺序查找,时间复杂度显然和链表的长度成正比。 - 在链表上顺序查找,时间复杂度显然和链表的长度成正比。
<div align="center"> <img src="pics/49d6de7b-0d0d-425c-9e49-a1559dc23b10.png" width="600"/> </div><br> <div align="center"> <img src="pics/cf779e26-0382-4495-8463-f1e19e2e38a0.jpg"/> </div><br>
### 3. put 操作 ### 3. put 操作
@ -822,7 +826,7 @@ final Segment<K,V>[] segments;
static final int DEFAULT_CONCURRENCY_LEVEL = 16; static final int DEFAULT_CONCURRENCY_LEVEL = 16;
``` ```
<div align="center"> <img src="pics/3fdfc89d-719e-4d93-b518-29fa612b3b18.png"/> </div><br> <div align="center"> <img src="pics/deb18bdb-b3b3-4660-b778-b0823a48db12.jpg"/> </div><br>
### 2. size 操作 ### 2. size 操作

View File

@ -1,4 +1,4 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [一、线程状态转换](#一线程状态转换) * [一、线程状态转换](#一线程状态转换)
* [新建New](#新建new) * [新建New](#新建new)
@ -31,7 +31,7 @@
* [wait() notify() notifyAll()](#wait-notify-notifyall) * [wait() notify() notifyAll()](#wait-notify-notifyall)
* [await() signal() signalAll()](#await-signal-signalall) * [await() signal() signalAll()](#await-signal-signalall)
* [七、J.U.C - AQS](#七juc---aqs) * [七、J.U.C - AQS](#七juc---aqs)
* [CountdownLatch](#countdownlatch) * [CountDownLatch](#countdownlatch)
* [CyclicBarrier](#cyclicbarrier) * [CyclicBarrier](#cyclicbarrier)
* [Semaphore](#semaphore) * [Semaphore](#semaphore)
* [八、J.U.C - 其它组件](#八juc---其它组件) * [八、J.U.C - 其它组件](#八juc---其它组件)
@ -62,7 +62,7 @@
# 一、线程状态转换 # 一、线程状态转换
<div align="center"> <img src="pics/ace830df-9919-48ca-91b5-60b193f593d2.png" width=""/> </div><br> <div align="center"> <img src="pics/96706658-b3f8-4f32-8eb3-dcb7fc8d5381.jpg"/> </div><br>
## 新建New ## 新建New
@ -86,7 +86,7 @@
| --- | --- | | --- | --- |
| 没有设置 Timeout 参数的 Object.wait() 方法 | Object.notify() / Object.notifyAll() | | 没有设置 Timeout 参数的 Object.wait() 方法 | Object.notify() / Object.notifyAll() |
| 没有设置 Timeout 参数的 Thread.join() 方法 | 被调用的线程执行完毕 | | 没有设置 Timeout 参数的 Thread.join() 方法 | 被调用的线程执行完毕 |
| LockSupport.park() 方法 | - | | LockSupport.park() 方法 | LockSupport.unpark(Thread) |
## 限期等待Timed Waiting ## 限期等待Timed Waiting
@ -105,8 +105,8 @@
| Thread.sleep() 方法 | 时间结束 | | Thread.sleep() 方法 | 时间结束 |
| 设置了 Timeout 参数的 Object.wait() 方法 | 时间结束 / Object.notify() / Object.notifyAll() | | 设置了 Timeout 参数的 Object.wait() 方法 | 时间结束 / Object.notify() / Object.notifyAll() |
| 设置了 Timeout 参数的 Thread.join() 方法 | 时间结束 / 被调用的线程执行完毕 | | 设置了 Timeout 参数的 Thread.join() 方法 | 时间结束 / 被调用的线程执行完毕 |
| LockSupport.parkNanos() 方法 | - | | LockSupport.parkNanos() 方法 | LockSupport.unpark(Thread) |
| LockSupport.parkUntil() 方法 | - | | LockSupport.parkUntil() 方法 | LockSupport.unpark(Thread) |
## 死亡Terminated ## 死亡Terminated
@ -731,13 +731,13 @@ after
java.util.concurrentJ.U.C大大提高了并发性能AQS 被认为是 J.U.C 的核心。 java.util.concurrentJ.U.C大大提高了并发性能AQS 被认为是 J.U.C 的核心。
## CountdownLatch ## CountDownLatch
用来控制一个线程等待多个线程。 用来控制一个线程等待多个线程。
维护了一个计数器 cnt每次调用 countDown() 方法会让计数器的值减 1减到 0 的时候,那些因为调用 await() 方法而在等待的线程就会被唤醒。 维护了一个计数器 cnt每次调用 countDown() 方法会让计数器的值减 1减到 0 的时候,那些因为调用 await() 方法而在等待的线程就会被唤醒。
<div align="center"> <img src="pics/CountdownLatch.png" width=""/> </div><br> <div align="center"> <img src="pics/912a7886-fb1d-4a05-902d-ab17ea17007f.jpg"/> </div><br>
```java ```java
public class CountdownLatchExample { public class CountdownLatchExample {
@ -786,7 +786,7 @@ public CyclicBarrier(int parties) {
} }
``` ```
<div align="center"> <img src="pics/CyclicBarrier.png" width=""/> </div><br> <div align="center"> <img src="pics/f944fac3-482b-4ca3-9447-17aec4a3cca0.png"/> </div><br>
```java ```java
public class CyclicBarrierExample { public class CyclicBarrierExample {
@ -819,8 +819,6 @@ before..before..before..before..before..before..before..before..before..before..
Semaphore 类似于操作系统中的信号量,可以控制对互斥资源的访问线程数。 Semaphore 类似于操作系统中的信号量,可以控制对互斥资源的访问线程数。
<div align="center"> <img src="pics/Semaphore.png" width=""/> </div><br>
以下代码模拟了对某个服务的并发请求,每次只能有 3 个客户端同时访问,请求总数为 10。 以下代码模拟了对某个服务的并发请求,每次只能有 3 个客户端同时访问,请求总数为 10。
```java ```java
@ -1025,7 +1023,7 @@ public class ForkJoinPool extends AbstractExecutorService
ForkJoinPool 实现了工作窃取算法来提高 CPU 的利用率。每个线程都维护了一个双端队列用来存储需要执行的任务。工作窃取算法允许空闲的线程从其它线程的双端队列中窃取一个任务来执行。窃取的任务必须是最晚的任务避免和队列所属线程发生竞争。例如下图中Thread2 从 Thread1 的队列中拿出最晚的 Task1 任务Thread1 会拿出 Task2 来执行,这样就避免发生竞争。但是如果队列中只有一个任务时还是会发生竞争。 ForkJoinPool 实现了工作窃取算法来提高 CPU 的利用率。每个线程都维护了一个双端队列用来存储需要执行的任务。工作窃取算法允许空闲的线程从其它线程的双端队列中窃取一个任务来执行。窃取的任务必须是最晚的任务避免和队列所属线程发生竞争。例如下图中Thread2 从 Thread1 的队列中拿出最晚的 Task1 任务Thread1 会拿出 Task2 来执行,这样就避免发生竞争。但是如果队列中只有一个任务时还是会发生竞争。
<div align="center"> <img src="pics/15b45dc6-27aa-4519-9194-f4acfa2b077f.jpg" width=""/> </div><br> <div align="center"> <img src="pics/e19452dd-220a-4a6b-bcb0-91ad5e5c4706.png"/> </div><br>
# 九、线程不安全示例 # 九、线程不安全示例
@ -1080,19 +1078,19 @@ Java 内存模型试图屏蔽各种硬件和操作系统的内存访问差异,
加入高速缓存带来了一个新的问题:缓存一致性。如果多个缓存共享同一块主内存区域,那么多个缓存的数据可能会不一致,需要一些协议来解决这个问题。 加入高速缓存带来了一个新的问题:缓存一致性。如果多个缓存共享同一块主内存区域,那么多个缓存的数据可能会不一致,需要一些协议来解决这个问题。
<div align="center"> <img src="pics/68778c1b-15ab-4826-99c0-3b4fd38cb9e9.png" width=""/> </div><br> <div align="center"> <img src="pics/d2a12961-2b36-4463-b017-ca46a3308b8e.png"/> </div><br>
所有的变量都存储在主内存中,每个线程还有自己的工作内存,工作内存存储在高速缓存或者寄存器中,保存了该线程使用的变量的主内存副本拷贝。 所有的变量都存储在主内存中,每个线程还有自己的工作内存,工作内存存储在高速缓存或者寄存器中,保存了该线程使用的变量的主内存副本拷贝。
线程只能直接操作工作内存中的变量,不同线程之间的变量值传递需要通过主内存来完成。 线程只能直接操作工作内存中的变量,不同线程之间的变量值传递需要通过主内存来完成。
<div align="center"> <img src="pics/47358f87-bc4c-496f-9a90-8d696de94cee.png" width=""/> </div><br> <div align="center"> <img src="pics/8162aebb-8fd2-4620-b771-e65751ba7e41.png"/> </div><br>
## 内存间交互操作 ## 内存间交互操作
Java 内存模型定义了 8 个操作来完成主内存和工作内存的交互操作。 Java 内存模型定义了 8 个操作来完成主内存和工作内存的交互操作。
<div align="center"> <img src="pics/536c6dfd-305a-4b95-b12c-28ca5e8aa043.png" width=""/> </div><br> <div align="center"> <img src="pics/b6a7e8af-91bf-44b2-8874-ccc6d9d52afc.jpg"/> </div><br>
- read把一个变量的值从主内存传输到工作内存中 - read把一个变量的值从主内存传输到工作内存中
- load在 read 之后执行,把 read 得到的值放入工作内存的变量副本中 - load在 read 之后执行,把 read 得到的值放入工作内存的变量副本中
@ -1115,11 +1113,11 @@ Java 内存模型保证了 read、load、use、assign、store、write、lock 和
下图演示了两个线程同时对 cnt 进行操作load、assign、store 这一系列操作整体上看不具备原子性,那么在 T1 修改 cnt 并且还没有将修改后的值写入主内存T2 依然可以读入旧值。可以看出,这两个线程虽然执行了两次自增运算,但是主内存中 cnt 的值最后为 1 而不是 2。因此对 int 类型读写操作满足原子性只是说明 load、assign、store 这些单个操作具备原子性。 下图演示了两个线程同时对 cnt 进行操作load、assign、store 这一系列操作整体上看不具备原子性,那么在 T1 修改 cnt 并且还没有将修改后的值写入主内存T2 依然可以读入旧值。可以看出,这两个线程虽然执行了两次自增运算,但是主内存中 cnt 的值最后为 1 而不是 2。因此对 int 类型读写操作满足原子性只是说明 load、assign、store 这些单个操作具备原子性。
<div align="center"> <img src="pics/ef8eab00-1d5e-4d99-a7c2-d6d68ea7fe92.png" width=""/> </div><br> <div align="center"> <img src="pics/847b9ba1-b3cd-4e52-aa72-dee0222ae09f.jpg"/> </div><br>
AtomicInteger 能保证多个线程修改的原子性。 AtomicInteger 能保证多个线程修改的原子性。
<div align="center"> <img src="pics/952afa9a-458b-44ce-bba9-463e60162945.png" width=""/> </div><br> <div align="center"> <img src="pics/3144015c-dcfb-47ac-94a5-bab3b78b0f14.jpg"/> </div><br>
使用 AtomicInteger 重写之前线程不安全的代码之后得到以下线程安全实现: 使用 AtomicInteger 重写之前线程不安全的代码之后得到以下线程安全实现:
@ -1227,7 +1225,7 @@ volatile 关键字通过添加内存屏障的方式来禁止指令重排,即
在一个线程内,在程序前面的操作先行发生于后面的操作。 在一个线程内,在程序前面的操作先行发生于后面的操作。
<div align="center"> <img src="pics/single-thread-rule.png" width=""/> </div><br> <div align="center"> <img src="pics/94414cd3-5db9-4aca-a2af-539140955c62.jpg"/> </div><br>
### 2. 管程锁定规则 ### 2. 管程锁定规则
@ -1235,7 +1233,7 @@ volatile 关键字通过添加内存屏障的方式来禁止指令重排,即
一个 unlock 操作先行发生于后面对同一个锁的 lock 操作。 一个 unlock 操作先行发生于后面对同一个锁的 lock 操作。
<div align="center"> <img src="pics/monitor-lock-rule.png" width=""/> </div><br> <div align="center"> <img src="pics/de9d8133-4c98-4e07-b39c-302e162784ea.jpg"/> </div><br>
### 3. volatile 变量规则 ### 3. volatile 变量规则
@ -1243,7 +1241,7 @@ volatile 关键字通过添加内存屏障的方式来禁止指令重排,即
对一个 volatile 变量的写操作先行发生于后面对这个变量的读操作。 对一个 volatile 变量的写操作先行发生于后面对这个变量的读操作。
<div align="center"> <img src="pics/volatile-variable-rule.png" width=""/> </div><br> <div align="center"> <img src="pics/5e6e05d6-1028-4f5c-b9bd-1a40b90d6070.jpg"/> </div><br>
### 4. 线程启动规则 ### 4. 线程启动规则
@ -1251,7 +1249,7 @@ volatile 关键字通过添加内存屏障的方式来禁止指令重排,即
Thread 对象的 start() 方法调用先行发生于此线程的每一个动作。 Thread 对象的 start() 方法调用先行发生于此线程的每一个动作。
<div align="center"> <img src="pics/thread-start-rule.png" width=""/> </div><br> <div align="center"> <img src="pics/bc5826f5-014d-47b4-9a76-d86b80968643.jpg"/> </div><br>
### 5. 线程加入规则 ### 5. 线程加入规则
@ -1259,7 +1257,7 @@ Thread 对象的 start() 方法调用先行发生于此线程的每一个动作
Thread 对象的结束先行发生于 join() 方法返回。 Thread 对象的结束先行发生于 join() 方法返回。
<div align="center"> <img src="pics/thread-join-rule.png" width=""/> </div><br> <div align="center"> <img src="pics/54e6d499-80df-488e-aa7e-081766c41538.jpg"/> </div><br>
### 6. 线程中断规则 ### 6. 线程中断规则
@ -1477,7 +1475,7 @@ public class ThreadLocalExample1 {
它所对应的底层结构图为: 它所对应的底层结构图为:
<div align="center"> <img src="pics/3646544a-cb57-451d-9e03-d3c4f5e4434a.png" width=""/> </div><br> <div align="center"> <img src="pics/066f9c11-0154-42c3-8685-301a70e9bd39.jpg"/> </div><br>
每个 Thread 都有一个 ThreadLocal.ThreadLocalMap 对象。 每个 Thread 都有一个 ThreadLocal.ThreadLocalMap 对象。

View File

@ -1,4 +1,4 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [一、运行时数据区域](#一运行时数据区域) * [一、运行时数据区域](#一运行时数据区域)
* [程序计数器](#程序计数器) * [程序计数器](#程序计数器)
@ -31,7 +31,7 @@
# 一、运行时数据区域 # 一、运行时数据区域
<div align="center"> <img src="pics/11548742157520.gif" width="450"/> </div><br> <div align="center"> <img src="pics/b01e12b7-6cfc-485b-a03e-a575e6f7b773.jpg"/> </div><br>
## 程序计数器 ## 程序计数器
@ -41,7 +41,7 @@
每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。 每个 Java 方法在执行的同时会创建一个栈帧用于存储局部变量表、操作数栈、常量池引用等信息。从方法调用直至执行完成的过程,就对应着一个栈帧在 Java 虚拟机栈中入栈和出栈的过程。
<div align="center"> <img src="pics/11548741556940.gif" width="500"/> </div><br> <div align="center"> <img src="pics/ff5b89ac-798e-4fbc-b0ce-da2fc2358570.jpg"/> </div><br>
可以通过 -Xss 这个虚拟机参数来指定每个线程的 Java 虚拟机栈内存大小: 可以通过 -Xss 这个虚拟机参数来指定每个线程的 Java 虚拟机栈内存大小:
@ -60,8 +60,7 @@ java -Xss512M HackTheJava
本地方法一般是用其它语言C、C++ 或汇编语言等)编写的,并且被编译为基于本机硬件和操作系统的程序,对待这些方法需要特别处理。 本地方法一般是用其它语言C、C++ 或汇编语言等)编写的,并且被编译为基于本机硬件和操作系统的程序,对待这些方法需要特别处理。
<div align="center"> <img src="pics/3034859c-eb5a-402b-b65a-974dcc0c4a46.png"/> </div><br>
<div align="center"> <img src="pics/11548742010310.gif"/> </div><br>
## 堆 ## 堆
@ -141,7 +140,7 @@ Java 虚拟机使用该算法来判断对象是否可被回收,在 Java 中 GC
- 方法区中类静态属性引用的对象 - 方法区中类静态属性引用的对象
- 方法区中的常量引用的对象 - 方法区中的常量引用的对象
<div align="center"> <img src="pics/11548742505541.gif"/> </div><br> <div align="center"> <img src="pics/6dd28bfc-6ef7-47cb-af50-a681ebc1bbaa.png"/> </div><br>
### 3. 方法区的回收 ### 3. 方法区的回收
@ -221,7 +220,7 @@ obj = null;
### 1. 标记 - 清除 ### 1. 标记 - 清除
<div align="center"> <img src="pics/11548743021625.gif"/> </div><br> <div align="center"> <img src="pics/3fb6e997-0fc9-4178-a691-5907b67bbeae.png"/> </div><br>
标记要回收的对象,然后清除。 标记要回收的对象,然后清除。
@ -232,13 +231,13 @@ obj = null;
### 2. 标记 - 整理 ### 2. 标记 - 整理
<div align="center"> <img src="pics/11548743193273.gif"/> </div><br> <div align="center"> <img src="pics/fb14b808-734c-4634-9c87-e598b1937996.png"/> </div><br>
让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。 让所有存活的对象都向一端移动,然后直接清理掉端边界以外的内存。
### 3. 复制 ### 3. 复制
<div align="center"> <img src="pics/11548743457272.gif"/> </div><br> <div align="center"> <img src="pics/3f04455c-f4ac-4038-a69f-21df133389e1.png"/> </div><br>
将内存划分为大小相等的两块,每次只使用其中一块,当这一块内存用完了就将还存活的对象复制到另一块上面,然后再把使用过的内存空间进行一次清理。 将内存划分为大小相等的两块,每次只使用其中一块,当这一块内存用完了就将还存活的对象复制到另一块上面,然后再把使用过的内存空间进行一次清理。
@ -440,7 +439,7 @@ G1 把堆划分成多个大小相等的独立区域Region新生代和
## 类的生命周期 ## 类的生命周期
<div align="center"> <img src="pics/11548744140733.gif"/> </div><br> <div align="center"> <img src="pics/303873db-0d11-4683-a43c-f319b7aef2b6.jpg"/> </div><br>
包括以下 7 个阶段: 包括以下 7 个阶段:

View File

@ -1,4 +1,4 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [算法思想](#算法思想) * [算法思想](#算法思想)
* [双指针](#双指针) * [双指针](#双指针)

View File

@ -1,4 +1,4 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [595. Big Countries](#595-big-countries) * [595. Big Countries](#595-big-countries)
* [627. Swap Salary](#627-swap-salary) * [627. Swap Salary](#627-swap-salary)

View File

@ -1,4 +1,4 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [一、常用操作以及概念](#一常用操作以及概念) * [一、常用操作以及概念](#一常用操作以及概念)
* [快捷键](#快捷键) * [快捷键](#快捷键)

View File

@ -1,4 +1,4 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [一、索引](#一索引) * [一、索引](#一索引)
* [B+ Tree 原理](#b-tree-原理) * [B+ Tree 原理](#b-tree-原理)
@ -43,7 +43,7 @@ B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具
在 B+ Tree 中,一个节点中的 key 从左到右非递减排列,如果某个指针的左右相邻 key 分别是 key<sub>i</sub> 和 key<sub>i+1</sub>,且不为 null则该指针指向节点的所有 key 大于等于 key<sub>i</sub> 且小于等于 key<sub>i+1</sub> 在 B+ Tree 中,一个节点中的 key 从左到右非递减排列,如果某个指针的左右相邻 key 分别是 key<sub>i</sub> 和 key<sub>i+1</sub>,且不为 null则该指针指向节点的所有 key 大于等于 key<sub>i</sub> 且小于等于 key<sub>i+1</sub>
<div align="center"> <img src="pics/d5ce91a7-45f9-4560-9917-0dccd4900826.png" width="400px"> </div><br> <div align="center"> <img src="pics/10a6d3ee-04b2-46b4-b171-d596e5ab0f84.jpg"/> </div><br>
### 2. 操作 ### 2. 操作
@ -85,11 +85,11 @@ B+ Tree 是基于 B Tree 和叶子节点顺序访问指针进行实现,它具
InnoDB 的 B+Tree 索引分为主索引和辅助索引。主索引的叶子节点 data 域记录着完整的数据记录,这种索引方式被称为聚簇索引。因为无法把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。 InnoDB 的 B+Tree 索引分为主索引和辅助索引。主索引的叶子节点 data 域记录着完整的数据记录,这种索引方式被称为聚簇索引。因为无法把数据行存放在两个不同的地方,所以一个表只能有一个聚簇索引。
<div align="center"> <img src="pics/0f6f92e8-f15e-4c09-8562-b9c6114df9ce.png" width="400px"> </div><br> <div align="center"> <img src="pics/4f151e62-6160-47f1-9eff-47b1f4dea4e9.jpg"/> </div><br>
辅助索引的叶子节点的 data 域记录着主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主索引中进行查找。 辅助索引的叶子节点的 data 域记录着主键的值,因此在使用辅助索引进行查找时,需要先查找到主键值,然后再到主索引中进行查找。
<div align="center"> <img src="pics/1e74234e-d70b-411c-9333-226bcbb9c8f0.png" width="400px"> </div><br> <div align="center"> <img src="pics/40f29839-fd56-4ed0-9353-39dfe6f0bba5.jpg"/> </div><br>
### 2. 哈希索引 ### 2. 哈希索引

View File

@ -1,4 +1,4 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [一、概述](#一概述) * [一、概述](#一概述)
* [二、数据类型](#二数据类型) * [二、数据类型](#二数据类型)

View File

@ -1,4 +1,4 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [一、基础](#一基础) * [一、基础](#一基础)
* [二、创建表](#二创建表) * [二、创建表](#二创建表)

View File

@ -1,4 +1,4 @@
[🍉 点击订阅面试进阶专栏 ](https://xiaozhuanlan.com/CyC2018) [🍉 点击阅读面试进阶指南 ](https://github.com/CyC2018/Backend-Interview-Guide)
<!-- GFM-TOC --> <!-- GFM-TOC -->
* [一、I/O 模型](#一io-模型) * [一、I/O 模型](#一io-模型)
* [阻塞式 I/O](#阻塞式-io) * [阻塞式 I/O](#阻塞式-io)

Binary file not shown.

After

Width:  |  Height:  |  Size: 50 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

BIN
docs/notes/pics/1_200.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 72 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 30 KiB

BIN
docs/notes/pics/2_200.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

BIN
docs/notes/pics/3_200.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

BIN
docs/notes/pics/5_200.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 53 KiB

BIN
docs/notes/pics/6_200.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 94 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

BIN
docs/notes/pics/7_200.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 45 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 29 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 54 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 34 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 63 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 66 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 37 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 51 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 48 KiB

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