Skip to content

Commit 33a57f1

Browse files
committed
Update Java Notes
1 parent 9b2e066 commit 33a57f1

File tree

6 files changed

+85
-83
lines changed

6 files changed

+85
-83
lines changed

DB.md

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -385,7 +385,7 @@ mysqlshow -uroot -p1234 test book --count
385385

386386
SHOW PROCESSLIST:查看当前 MySQL 在进行的线程,可以实时地查看 SQL 的执行情况,其中的 Command 列显示为 Sleep 的这一行,就表示现在系统里面有一个空闲连接
387387

388-
![](https://gitee.com/seazean/images/raw/master/DB/MySQL-SHOW PROCESSLIST命令.png)
388+
![](https://gitee.com/seazean/images/raw/master/DB/MySQL-SHOW_PROCESSLIST命令.png)
389389

390390
| 参数 | 含义 |
391391
| ------- | ------------------------------------------------------------ |
@@ -4139,12 +4139,12 @@ MySQL 官方对索引的定义为:索引(index)是帮助 MySQL 高效获
41394139
- R-tree 索引(空间索引):空间索引是 MyISAM 引擎的一个特殊索引类型,主要用于地理空间数据类型
41404140
- Full-text 索引(全文索引):快速匹配全部文档的方式。MyISAM 支持, InnoDB 不支持 FULLTEXT 类型的索引,但是 InnoDB 可以使用 sphinx 插件支持全文索引,MEMORY 引擎不支持
41414141

4142-
| 索引 | InnoDB引擎 | MyISAM引擎 | Memory引擎 |
4143-
| --------- | --------------- | ---------- | ---------- |
4144-
| BTREE | 支持 | 支持 | 支持 |
4145-
| HASH | 不支持 | 不支持 | 支持 |
4146-
| R-tree | 不支持 | 支持 | 不支持 |
4147-
| Full-text | 5.6版本之后支持 | 支持 | 不支持 |
4142+
| 索引 | InnoDB | MyISAM | Memory |
4143+
| --------- | ---------------- | ------ | ------ |
4144+
| BTREE | 支持 | 支持 | 支持 |
4145+
| HASH | 不支持 | 不支持 | 支持 |
4146+
| R-tree | 不支持 | 支持 | 不支持 |
4147+
| Full-text | 5.6 版本之后支持 | 支持 | 不支持 |
41484148

41494149
联合索引图示:根据身高年龄建立的组合索引(height,age)
41504150

@@ -5894,21 +5894,21 @@ MySQL 的主从之间维持了一个长连接。主库内部有一个线程,
58945894

58955895
coordinator 就是原来的 sql_thread,并行复制中它不再直接更新数据,只**负责读取中转日志和分发事务**
58965896

5897-
* 线程分配完成并不是立即执行,为了防止造成更新覆盖,更新同一行的两个事务必须被分发到同一个工作线程
5897+
* 线程分配完成并不是立即执行,为了防止造成更新覆盖,更新同一 DB 的两个事务必须被分发到同一个工作线程
58985898
* 同一个事务不能被拆开,必须放到同一个工作线程
58995899

59005900
MySQL 5.6 版本的策略:每个线程对应一个 hash 表,用于保存当前这个线程的执行队列里的事务所涉及的表,hash 表的 key 是数据库 名,value 是一个数字,表示队列中有多少个事务修改这个库,适用于主库上有多个 DB 的情况
59015901

59025902
每个事务在分发的时候,跟线程的冲突(事务操作的是同一个 DB)关系包括以下三种情况:
59035903

59045904
* 如果跟所有线程都不冲突,coordinator 线程就会把这个事务分配给最空闲的线程
5905-
* 如果跟多于一个线程冲突,coordinator 线程就进入等待状态,直到和这个事务存在冲突关系的线程只剩下 1
59065905
* 如果只跟一个线程冲突,coordinator 线程就会把这个事务分配给这个存在冲突关系的线程
5906+
* 如果跟多于一个线程冲突,coordinator 线程就进入等待状态,直到和这个事务存在冲突关系的线程只剩下 1
59075907

59085908
优缺点:
59095909

59105910
* 构造 hash 值的时候很快,只需要库名,而且一个实例上 DB 数也不会很多,不会出现需要构造很多个项的情况
5911-
* 不要求 binlog 的格式,statement 格式的 binlog 也可以很容易拿到库名
5911+
* 不要求 binlog 的格式,statement 格式的 binlog 也可以很容易拿到库名(日志章节详解了 binlog)
59125912
* 主库上的表都放在同一个 DB 里面,这个策略就没有效果了;或者不同 DB 的热点不同,比如一个是业务逻辑库,一个是系统配置库,那也起不到并行的效果,需要**把相同热度的表均匀分到这些不同的 DB 中**,才可以使用这个策略
59135913

59145914

@@ -5965,7 +5965,7 @@ MySQL 5.7.22 的并行复制策略在通用性上是有保证的,但是对于
59655965
* 主库不建查询的索引,从库建查询的索引。因为索引需要维护的,比如插入一条数据,不仅要在聚簇索引上面插入,对应的二级索引也得插入
59665966
* 将读操作分到从库了之后,可以在主库把查询要用的索引删了,减少写操作对主库的影响
59675967

5968-
读写分离产生了读写延迟,造成数据的不一致性。假如客户端执行完一个更新事务后马上发起查询,如果查询选择的是从库的话,可能读到的还是以前的数据,叫过期读
5968+
读写分离产生了读写延迟,造成数据的不一致性。假如客户端执行完一个更新事务后马上发起查询,如果查询选择的是从库的话,可能读到的还是以前的数据,叫过期读
59695969

59705970
解决方案:
59715971

@@ -6221,7 +6221,7 @@ FLUSH TABLES WITH READ LOCK 简称(FTWRL),全局读锁,让整个库处
62216221

62226222
MySQL 里面表级别的锁有两种:一种是表锁,一种是元数据锁(meta data lock,MDL)
62236223

6224-
MDL 叫元数据锁,主要用来保护 MySQL内部对象的元数据,保证数据读写的正确性,通过 MDL 机制保证 DDL、DML、SELECT 操作的并发,**当对一个表做增删改查操作的时候,加 MDL 读锁;当要对表做结构变更操作的时候,加 MDL 写锁**
6224+
MDL 叫元数据锁,主要用来保护 MySQL内部对象的元数据,保证数据读写的正确性,通过 MDL 机制保证 DDL、DML、DQL 操作的并发,**当对一个表做增删改查操作的时候,加 MDL 读锁;当要对表做结构变更操作的时候,加 MDL 写锁**
62256225

62266226
* MDL 锁不需要显式使用,在访问一个表的时候会被自动加上,事务中的 MDL 锁,在语句执行开始时申请,在整个事务提交后释放
62276227

@@ -6852,7 +6852,7 @@ binlog_format=STATEMENT
68526852

68536853
缺点:记录的数据比较多,占用很多的存储空间
68546854

6855-
* MIXED:这是 MySQL 默认的日志格式,混合了STATEMENT 和 ROW两种格式。MIXED 格式能尽量利用两种模式的优点,而避开它们的缺点
6855+
* MIXED:这是 MySQL 默认的日志格式,混合了STATEMENT 和 ROW 两种格式。MIXED 格式能尽量利用两种模式的优点,而避开它们的缺点
68566856

68576857

68586858

@@ -7035,10 +7035,10 @@ long_query_time=10
70357035

70367036
## 范式
70377037

7038-
建立科学的,规范的数据库就需要满足一些规则来优化数据的设计和存储,这些规则就称为范式。
7039-
70407038
### 第一范式
70417039

7040+
建立科学的,**规范的数据表**就需要满足一些规则来优化数据的设计和存储,这些规则就称为范式
7041+
70427042
**1NF:**数据库表的每一列都是不可分割的原子数据项,不能是集合、数组等非原子数据项。即表中的某个列有多个值时,必须拆分为不同的列。简而言之,**第一范式每一列不可再拆分,称为原子性**
70437043

70447044
基本表:
@@ -8513,7 +8513,7 @@ Redis 基于 Reactor 模式开发了网络事件处理器,这个处理器被
85138513

85148514
* 文件事件处理器使用 I/O 多路复用(multiplexing)程序来同时监听多个套接字,并根据套接字目前执行的任务来为套接字关联不同的事件处理器
85158515

8516-
* 当被监听的套接字准备好执行连接应答 (accept)、读取 (read)、写入 (write)、关闭 (close) 等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器会调用套接字之前关联好的事件处理器来处理事件
8516+
* 当被监听的套接字准备好执行连接应答 (accept)、读取 (read)、写入 (write)、关闭 (close) 等操作时,与操作相对应的文件事件就会产生,这时文件事件处理器会将处理请求放入**单线程的执行队列**中,等待调用套接字关联好的事件处理器来处理事件
85178517

85188518
**Redis 单线程也能高效的原因**
85198519

@@ -11524,7 +11524,7 @@ Read-Through Pattern 也存在首次不命中的问题,采用缓存预热解
1152411524

1152511525
缓存不一致的方法:
1152611526

11527-
* 数据库和缓存数据强一致场景
11527+
* 数据库和缓存数据强一致场景:
1152811528
* 更新 DB 时同样更新 cache,加一个锁来保证更新 cache 时不存在线程安全问题,这样可以增加命中率
1152911529
* 延迟双删:先淘汰缓存再写数据库,休眠 1 秒再次淘汰缓存,可以将 1 秒内造成的缓存脏数据再次删除
1153011530
* CDC 同步:通过 canal 订阅 MySQL binlog 的变更上报给 Kafka,系统监听 Kafka 消息触发缓存失效

Java.md

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1559,6 +1559,7 @@ public class FinalDemo {
15591559
> 父类知道子类要完成某个功能,但是每个子类实现情况不一样。
15601560

15611561
抽象方法:没有方法体,只有方法签名,必须用**abstract**修饰的方法就是抽象方法
1562+
15621563
抽象类:拥有抽象方法的类必须定义成抽象类,必须用**abstract**修饰,抽象类是为了被继承
15631564

15641565
一个类继承抽象类,**必须重写抽象类的全部抽象方法**,否则这个类必须定义成抽象类,因为拥有抽象方法的类必须定义成抽象类
@@ -1618,6 +1619,7 @@ abstract class Animal{
16181619
```
16191620

16201621
二、static 与 abstract 能同时使用吗?
1622+
16211623
答:不能,被 static 修饰的方法属于类,是类自己的东西,不是给子类来继承的,而抽象方法本身没有实现,就是用来给子类继承
16221624

16231625

@@ -1833,12 +1835,12 @@ interface InterfaceJDK8{
18331835

18341836
| **参数** | **抽象类** | **接口** |
18351837
| ------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ |
1836-
| 默认的方法实现 | 可以有默认的方法实现 | 接口完全是抽象的,jdk8以后有默认的实现 |
1837-
| 实现 | 子类使用**extends**关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字**implements**来实现接口。它需要提供接口中所有声明的方法的实现 |
1838+
| 默认的方法实现 | 可以有默认的方法实现 | 接口完全是抽象的,jdk8 以后有默认的实现 |
1839+
| 实现 | 子类使用 **extends** 关键字来继承抽象类。如果子类不是抽象类的话,它需要提供抽象类中所有声明的方法的实现。 | 子类使用关键字 **implements** 来实现接口。它需要提供接口中所有声明的方法的实现 |
18381840
| 构造器 | 抽象类可以有构造器 | 接口不能有构造器 |
1839-
| 与正常Java类的区别 | 除了不能实例化抽象类之外,和普通Java类没有任何区别 | 接口是完全不同的类型 |
1840-
| 访问修饰符 | 抽象方法可以有**public**、**protected****default**这些修饰符 | 接口方法默认修饰符是**public**,别的修饰符需要有方法体 |
1841-
| main方法 | 抽象方法可以有main方法并且我们可以运行它 | jdk8以前接口没有main方法,不能运行;jdk8以后接口可以有default和static方法,可以运行main方法 |
1841+
| 与正常Java类的区别 | 除了不能实例化抽象类之外,和普通 Java 类没有任何区别 | 接口是完全不同的类型 |
1842+
| 访问修饰符 | 抽象方法有 **public**、**protected****default** 这些修饰符 | 接口方法默认修饰符是 **public**,别的修饰符需要有方法体 |
1843+
| main方法 | 抽象方法可以有 main 方法并且我们可以运行它 | jdk8 以前接口没有 main 方法,不能运行;jdk8 以后接口可以有 default 和 static 方法,可以运行 main 方法 |
18421844
| 多继承 | 抽象方法可以继承一个类和实现多个接口 | 接口可以继承一个或多个其它接口,接口不可继承类 |
18431845
| 速度 | 比接口速度要快 | 接口是稍微有点慢的,因为它需要时间去寻找在类中实现的方法 |
18441846
| 添加新方法 | 如果往抽象类中添加新的方法,可以给它提供默认的实现,因此不需要改变现在的代码 | 如果往接口中添加方法,那么必须改变实现该接口的类 |
@@ -2777,7 +2779,7 @@ StringBuffer sb1 = new StringBuffer();//new byte[16]
27772779
sb1.append('a'); //value[0] = 'a';
27782780
```
27792781

2780-
append 源码:
2782+
append 源码:扩容为二倍
27812783

27822784
```java
27832785
public AbstractStringBuilder append(String str) {
@@ -5319,8 +5321,8 @@ HashMap继承关系如下图所示:
53195321

53205322
5. 时间复杂度 O(1)
53215323

5322-
* 若为树,则在树中通过key.equals(k)查找,**O(logn)**
5323-
* 若为链表,则在链表中通过key.equals(k)查找,**O(n)**
5324+
* 若为树,则在树中通过 key.equals(k) 查找,**O(logn)**
5325+
* 若为链表,则在链表中通过 key.equals(k) 查找,**O(n)**
53245326

53255327

53265328

@@ -5402,6 +5404,7 @@ abstract class HashIterator {
54025404
// 同步expectedModCount
54035405
expectedModCount = modCount;
54045406
}
5407+
}
54055408
```
54065409

54075410

@@ -16551,13 +16554,13 @@ public class Kmp {
1655116554

1655216555
* 每一个节点可以是红或者黑
1655316556

16554-
+ 红黑树不是高度平衡的,它的平衡是通过"自己的红黑规则"进行实现的
16557+
+ 红黑树不是高度平衡的,它的平衡是通过自己的红黑规则进行实现的
1655516558

1655616559
红黑树的红黑规则有哪些:
1655716560

1655816561
1. 每一个节点或是红色的,或者是黑色的
1655916562
2. 根节点必须是黑色
16560-
3. 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为 Nil,这些 Nil 视为叶节点,每个叶节点(Nil) 是黑色的
16563+
3. 如果一个节点没有子节点或者父节点,则该节点相应的指针属性值为 Nil,这些 Nil 视为叶节点,每个叶节点 (Nil) 是黑色的
1656116564
4. 如果某一个节点是红色,那么它的子节点必须是黑色(不能出现两个红色节点相连的情况)
1656216565
5. 对每一个节点,从该节点到其所有后代叶节点的简单路径上,均包含相同数目的黑色节点
1656316566

@@ -18680,9 +18683,7 @@ Java 中提供了一个动态代理类 Proxy,Proxy 并不是代理对象的类
1868018683

1868118684
`static Object newProxyInstance(ClassLoader loader,Class[] interfaces,InvocationHandler h) `
1868218685

18683-
* 参数一:类加载器,负责加载代理类
18684-
18685-
传入类加载器,代理和被代理对象要用一个类加载器才是父子关系,不同类加载器加载相同的类在 JVM 中都不是同一个类对象
18686+
* 参数一:类加载器,负责加载代理类。传入类加载器,代理和被代理对象要用一个类加载器才是父子关系,不同类加载器加载相同的类在 JVM 中都不是同一个类对象
1868618687

1868718688
* 参数二:被代理业务对象的**全部实现的接口**,代理对象与真实对象实现相同接口,知道为哪些方法做代理
1868818689

@@ -18912,7 +18913,7 @@ private static final class ProxyClassFactory {
1891218913

1891318914
// 【生成二进制字节码,这个字节码写入到文件内】,就是编译好的 class 文件
1891418915
byte[] proxyClassFile = ProxyGenerator.generateProxyClass(
18915-
proxyName, interfaces, accessFlags);
18916+
proxyName, interfaces, accessFlags);
1891618917
try {
1891718918
// 【使用加载器加载二进制到 jvm】,并且返回 class
1891818919
return defineClass0(loader, proxyName,

0 commit comments

Comments
 (0)