Skip to content

Commit 861f518

Browse files
committed
Update Java Notes
1 parent 236479f commit 861f518

3 files changed

Lines changed: 53 additions & 97 deletions

File tree

DB.md

Lines changed: 21 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1696,7 +1696,7 @@ WHERE
16961696

16971697
#### 子查询
16981698

1699-
* 子查询概念:查询语句中嵌套了查询语句,**将嵌套查询称为子查询**
1699+
子查询概念:查询语句中嵌套了查询语句,**将嵌套查询称为子查询**
17001700

17011701
* 结果是单行单列:可以将查询的结果作为另一条语句的查询条件,使用运算符判断
17021702

@@ -3669,7 +3669,7 @@ MySQL官方对索引的定义为:索引(index)是帮助 MySQL 高效获取
36693669
索引的缺点:
36703670

36713671
* 一般来说索引本身也很大,不可能全部存储在内存中,因此索引往往以索引文件的形式**存储在磁盘**
3672-
* 虽然索引大大提高了查询效率,同时却也降低更新表的速度。对表进行 INSERT、UPDATE、DELETE 操作,MySQL 不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,还会调整因为更新所带来的键值变化后的索引信息
3672+
* 虽然索引大大提高了查询效率,同时却也降低更新表的速度。对表进行 INSERT、UPDATE、DELETE 操作,MySQL 不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,还会调整因为更新所带来的键值变化后的索引信息**但是更新数据也需要先从数据库中获取**,索引加快了获取速度,所以可以相互抵消一下。
36733673
* 索引会影响到 WHERE 的查询条件和排序 ORDER BY 两大功能
36743674

36753675

@@ -4137,7 +4137,7 @@ B+Tree 优点:提高查询速度,减少磁盘的 IO 次数,树形结构较
41374137

41384138
适用条件:
41394139

4140-
* 需要存储引擎将索引中的数据与条件进行判断,所以优化是基于存储引擎的,只有特定引擎可以使用,适用于InnoDB 和 MyISAM 引擎
4140+
* 需要存储引擎将索引中的数据与条件进行判断,所以优化是基于存储引擎的,只有特定引擎可以使用,适用于 InnoDB 和 MyISAM
41414141
* 存储引擎没有调用跨存储引擎的能力,跨存储引擎的功能有存储过程、触发器、视图,所以调用这些功能的不可以进行索引下推优化
41424142
* 对于 InnoDB 引擎只适用于二级索引,InnoDB 的聚簇索引会将整行数据读到缓冲区,因为数据已经在内存中了,不再需要去读取了,索引下推的目的减少 IO 次数也就失去了意义
41434143

@@ -4928,7 +4928,7 @@ CREATE INDEX idx_emp_age_salary ON emp(age,salary);
49284928
* 第二种通过有序索引顺序扫描直接返回有序数据,这种情况为 Using index,不需要额外排序,操作效率高
49294929

49304930
```mysql
4931-
EXPLAIN SELECT id,age,salary FROM emp ORDER BY age DESC;
4931+
EXPLAIN SELECT id, age, salary FROM emp ORDER BY age DESC;
49324932
```
49334933

49344934
![](https://gitee.com/seazean/images/raw/master/DB/MySQL-优化SQL ORDER BY排序2.png)
@@ -4943,7 +4943,7 @@ CREATE INDEX idx_emp_age_salary ON emp(age,salary);
49434943

49444944
![](https://gitee.com/seazean/images/raw/master/DB/MySQL-优化SQL ORDER BY排序3.png)
49454945

4946-
尽量减少额外的排序,通过索引直接返回有序数据。需要满足 Order by 使用相同的索引、Order By 的顺序和索引顺序相同、Order by 的字段都是升序或都是降序,否则需要额外的操作,就会出现 FileSort
4946+
尽量减少额外的排序,通过索引直接返回有序数据。需要**满足 Order by 使用相同的索引、Order By 的顺序和索引顺序相同、Order by 的字段都是升序或都是降序**,否则需要额外的操作,就会出现 FileSort
49474947

49484948
Filesort 的优化:通过创建合适的索引,能够减少 Filesort 的出现,但是在某些情况,条件限制不能让 Filesort 消失,就需要加快 Filesort 的排序操作。
49494949

@@ -4971,7 +4971,7 @@ SHOW VARIABLES LIKE 'sort_buffer_size'; -- 默认262114
49714971

49724972
#### GROUP BY
49734973

4974-
GROUP BY 也会进行排序操作,与 ORDER BY 相比,GROUP BY 主要只是多了排序之后的分组操作,所以在GROUP BY 的实现过程中,与 ORDER BY 一样也可以利用到索引
4974+
GROUP BY 也会进行排序操作,与 ORDER BY 相比,GROUP BY 主要只是多了排序之后的分组操作,所以在 GROUP BY 的实现过程中,与 ORDER BY 一样也可以利用到索引
49754975

49764976
* 分组查询:
49774977

@@ -8453,7 +8453,7 @@ user:id:3506728370 → {"name":"春晚","fans":12210862,"blogs":83}
84538453
- 当键值对个数小于 hash-max-ziplist-entries 配置(默认512个)
84548454
- 所有键值都小于 hash-max-ziplist-value 配置(默认64字节)
84558455
8456-
ziplist 使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比 hashtable 更加优秀,当 ziplist 无法满足哈希类型时,Redis 会使用 hashtable 作为哈希的内部实现,因为此时 ziplist 的读写效率会下降,而hashtable 的读写时间复杂度为 O(1)
8456+
ziplist 使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比 hashtable 更加优秀,当 ziplist 无法满足哈希类型时,Redis 会使用 hashtable 作为哈希的内部实现,因为此时 ziplist 的读写效率会下降,而 hashtable 的读写时间复杂度为 O(1)
84578457
84588458
84598459
@@ -8463,7 +8463,7 @@ ziplist 使用更加紧凑的结构实现多个元素的连续存储,所以在
84638463
84648464
##### 压缩列表
84658465
8466-
压缩列表(ziplist)是列表和哈希的底层实现之一,压缩列表用来紧凑数据存储,节省内存:
8466+
压缩列表(ziplist)是列表和哈希的底层实现之一,压缩列表用来紧凑数据存储,节省内存,有序
84678467
84688468
<img src="https://gitee.com/seazean/images/raw/master/DB/Redis-压缩列表数据结构.png" style="zoom:67%;" />
84698469
@@ -8854,7 +8854,7 @@ Redis 使用跳跃表作为有序集合键的底层实现之一,如果一个
88548854
* 基于单向链表加索引的方式实现
88558855

88568856
- Redis 的跳跃表实现由 zskiplist 和 zskiplistnode 两个结构组成,其中 zskiplist 用于保存跳跃表信息(比如表头节点、表尾节点、长度),而 zskiplistnode 则用于表示跳跃表节点
8857-
- Redis 每个跳跃表节点的层高都是 1 至 32 之间的随机数(Redis5 之后最大层数为64
8857+
- Redis 每个跳跃表节点的层高都是 1 至 32 之间的随机数(Redis5 之后最大层数为 64
88588858
- 在同一个跳跃表中,多个节点可以包含相同的分值,但每个节点的成员对象必须是唯一的。跳跃表中的节点按照分值大小进行排序,当分值相同时节点按照成员对象的大小进行排序
88598859

88608860
![](https://gitee.com/seazean/images/raw/master/DB/Redis-跳跃表数据结构.png)
@@ -9014,13 +9014,13 @@ redis 应用于地理位置计算
90149014

90159015
### 基本使用
90169016

9017-
Jedis用于Java语言连接redis服务,并提供对应的操作API
9017+
Jedis 用于 Java 语言连接 redis 服务,并提供对应的操作 API
90189018

9019-
1. jar包导入
9019+
1. jar 包导入
90209020

90219021
* 下载地址:https://mvnrepository.com/artifact/redis.clients/jedis
90229022

9023-
* 基于maven
9023+
* 基于 maven
90249024

90259025
```xml
90269026
<dependency>
@@ -9030,12 +9030,12 @@ Jedis用于Java语言连接redis服务,并提供对应的操作API
90309030
</dependency>
90319031
```
90329032

9033-
2. 客户端连接redis
9034-
API文档:http://xetorthio.github.io/jedis/
9033+
2. 客户端连接 redis
9034+
API 文档:http://xetorthio.github.io/jedis/
90359035

9036-
连接redis`Jedis jedis = new Jedis("192.168.0.185", 6379);`
9037-
操作redis`jedis.set("name", "seazean"); jedis.get("name");`
9038-
关闭redis:`jedis.close();`
9036+
连接 redis`Jedis jedis = new Jedis("192.168.0.185", 6379);`
9037+
操作 redis`jedis.set("name", "seazean"); jedis.get("name");`
9038+
关闭 redis:`jedis.close();`
90399039
90409040
代码实现:
90419041
@@ -9071,12 +9071,12 @@ public class JedisTest {
90719071
### 工具类
90729072
90739073
连接池对象:
9074-
JedisPool:Jedis提供的连接池技术
9074+
JedisPool:Jedis 提供的连接池技术
90759075
poolConfig:连接池配置对象
9076-
host:redis服务地址
9077-
port:redis服务端口号
9076+
host:redis 服务地址
9077+
port:redis 服务端口号
90789078
9079-
JedisPool的构造器如下
9079+
JedisPool 的构造器如下
90809080
90819081
```java
90829082
public JedisPool(GenericObjectPoolConfig poolConfig, String host, int port) {

Java.md

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1058,11 +1058,11 @@ public class ClassDemo {
10581058

10591059
### 包
10601060

1061-
包:分门别类的管理各种不同的技术,便于管理技术,扩展技术,阅读技术
1061+
包:分门别类的管理各种不同的技术,便于管理技术,扩展技术,阅读技术
10621062

1063-
定义包的格式:`package 包名; `,必须放在类名的最上面
1063+
定义包的格式:`package 包名`,必须放在类名的最上面
10641064

1065-
导包格式:`import 包名.类名;`
1065+
导包格式:`import 包名.类名`
10661066

10671067
相同包下的类可以直接访问;不同包下的类必须导包才可以使用
10681068

@@ -3757,14 +3757,15 @@ Collection集合的体系:
37573757
LinkedHashSet<>(实现类)
37583758
```
37593759

3760-
**集合的特点:**(非常重要)
3761-
Set系列集合:添加的元素是无序,不重复,无索引的。
3762-
-- HashSet: 添加的元素是无序,不重复,无索引的。
3763-
-- LinkedHashSet: 添加的元素是有序,不重复,无索引的。
3764-
-- TreeSet: 不重复,无索引,按照大小默认升序排序!!
3765-
List系列集合:添加的元素是有序,可重复,有索引。
3766-
-- ArrayList:添加的元素是有序,可重复,有索引。
3767-
-- LinekdList:添加的元素是有序,可重复,有索引。
3760+
**集合的特点:**
3761+
3762+
* Set系列集合:添加的元素是无序,不重复,无索引的
3763+
* HashSet:添加的元素是无序,不重复,无索引的
3764+
* LinkedHashSet:添加的元素是有序,不重复,无索引的
3765+
* TreeSet:不重复,无索引,按照大小默认升序排序
3766+
* List系列集合:添加的元素是有序,可重复,有索引
3767+
* ArrayList:添加的元素是有序,可重复,有索引
3768+
* LinekdList:添加的元素是有序,可重复,有索引
37683769

37693770

37703771

@@ -3774,9 +3775,9 @@ LinkedHashSet<>(实现类)
37743775

37753776
#### API
37763777

3777-
Collection是集合的祖宗类,它的功能是全部集合都可以继承使用的,所以要学习它。
3778+
Collection 是集合的祖宗类,它的功能是全部集合都可以继承使用的,所以要学习它。
37783779

3779-
Collection子类的构造器都有可以包装其他子类的构造方法,如:
3780+
Collection 子类的构造器都有可以包装其他子类的构造方法,如:
37803781
`public ArrayList(Collection<? extends E> c)` : 构造新集合,元素按照由集合的迭代器返回的顺序
37813782
`public HashSet(Collection<? extends E> c)` : 构造一个包含指定集合中的元素的新集合
37823783

@@ -9770,7 +9771,7 @@ Heap 堆:是JVM内存中最大的一块,由所有线程共享,由垃圾回
97709771

97719772
* Young 区被划分为三部分,Eden 区和两个大小严格相同的 Survivor 区。Survivo r区间,某一时刻只有其中一个是被使用的,另外一个留做垃圾回收时复制对象。在 Eden 区变满的时候, GC 就会将存活的对象移到空闲的 Survivor 区间中,根据JVM的策略,在经过几次垃圾回收后,仍然存活于 Survivor 的对象将被移动到 Tenured 区间
97729773
* Tenured 区主要保存生命周期长的对象,一般是一些老的对象,当一些对象在 Young 复制转移一定的次数以后,对象就会被转移到 Tenured 区
9773-
* Perm 代主要保存**Class、ClassLoader、静态变量、常量、编译后的代码**,在 java7 中堆内方法区会受到 GC 的管理
9774+
* Perm 代主要保存 **Class、ClassLoader、静态变量、常量、编译后的代码**,在 java7 中堆内方法区会受到 GC 的管理
97749775

97759776
分代原因:不同对象的生命周期不同,70%-99% 的对象都是临时对象,优化 GC 性能
97769777

@@ -9802,11 +9803,11 @@ public static void main(String[] args) {
98029803

98039804
方法区的 GC:针对常量池的回收及对类型的卸载,比较难实现
98049805

9805-
为了**避免方法区出现OOM**,在JDK8中将堆内的方法区(永久代)移动到了本地内存上,重新开辟了一块空间,叫做元空间,元空间存储类的元信息,静态变量和字符串常量池等放入堆中
9806+
为了**避免方法区出现OOM**,在 JDK8 中将堆内的方法区(永久代)移动到了本地内存上,重新开辟了一块空间,叫做元空间,元空间存储类的元信息,静态变量和字符串常量池等放入堆中
98069807

98079808
类元信息:在类编译期间放入方法区,存放了类的基本信息,包括类的方法、参数、接口以及常量池表
98089809

9809-
常量池表(Constant Pool Table)是Class文件的一部分,存储了类在编译期间生成的**字面量、符号引用**,JVM为每个已加载的类维护一个常量池
9810+
常量池表(Constant Pool Table)是 Class 文件的一部分,存储了类在编译期间生成的**字面量、符号引用**,JVM 为每个已加载的类维护一个常量池
98109811

98119812
- 字面量:基本数据类型、字符串类型常量、声明为 final 的常量值等
98129813
- 符号引用:类、字段、方法、接口等的符号引用

SSM.md

Lines changed: 15 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,7 @@
22

33
## 基本介绍
44

5-
框架是一款半成品软件,我们可以基于这个半成品软件继续开发,来完成我们个性化的需求!
6-
7-
ORM(Object Relational Mapping): 对象关系映射
8-
指的是持久化数据和实体对象的映射模式,解决面向对象与关系型数据库存在的互不匹配的现象
5+
ORM(Object Relational Mapping): 对象关系映射,指的是持久化数据和实体对象的映射模式,解决面向对象与关系型数据库存在的互不匹配的现象
96

107
![](https://gitee.com/seazean/images/raw/master/Frame/ORM介绍.png)
118

@@ -4191,9 +4188,9 @@ private UserDao userDao;
41914188

41924189
相关属性:
41934190

4194-
- required:为 true (默认)表示注入 bean 时该 bean 必须存在,不然就会注入失败;为 true 表示注入 false 时该 bean 存在就注入,不存在就忽略跳过
4191+
- required:为 true (默认)表示注入 bean 时该 bean 必须存在,不然就会注入失败;为 false 表示注入时该 bean 存在就注入,不存在就忽略跳过
41954192

4196-
注意:在使用 @Autowired 时,首先在容器中查询对应类型的 bean,如果查询结果刚好为一个,就将该 bean 装配给 @Autowired 指定的数据,如果查询的结果不止一个,那么 @Autowired 会根据名称来查找。如果查询的结果为空,那么会抛出异常。解决方法:使用 required=false
4193+
注意:在使用 @Autowired 时,首先在容器中查询对应类型的 bean,如果查询结果刚好为一个,就将该 bean 装配给 @Autowired 指定的数据,如果查询的结果不止一个,那么 @Autowired 会根据名称来查找。如果查询的结果为空,那么会抛出异常。解决方法:使用 required = false
41974194

41984195

41994196

@@ -4570,7 +4567,7 @@ UserService userService = (UserService)bf.getBean("userService");
45704567

45714568
FactoryBean与 BeanFactory 区别:
45724569

4573-
- FactoryBean:封装单个 bean 的创建过程
4570+
- FactoryBean:封装单个 bean 的创建过程,就是工厂的 Bean
45744571

45754572
- BeanFactory:Spring 容器顶层接口,定义了 bean 相关的获取操作
45764573

@@ -6533,23 +6530,23 @@ MySQL InnoDB 存储引擎的默认支持的隔离级别是 **REPEATABLE-READ(
65336530
}
65346531
```
65356532
6536-
**支持当前事务的情况:**
6533+
**支持当前事务**的情况:
65376534
6538-
* TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务
6535+
* TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则**加入该事务**;如果当前没有事务,则创建一个新的事务
65396536
* 内外层是相同的事务
65406537
* 在 aMethod 或者在 bMethod 内的任何地方出现异常,事务都会被回滚
6541-
* TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行
6542-
* TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常
6538+
* TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则**加入该事务**;如果当前没有事务,则以非事务的方式继续运行
6539+
* TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则**加入该事务**;如果当前没有事务,则抛出异常
65436540
6544-
**不支持当前事务的情况:**
6541+
**不支持当前事务**的情况:
65456542
65466543
- TransactionDefinition.PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。
65476544
- 内外层是不同的事务,如果 bMethod 已经提交,如果 aMethod 失败回滚 ,bMethod 不会回滚
65486545
- 如果 bMethod 失败回滚,ServiceB 抛出的异常被 ServiceA 捕获,如果 B 抛出的异常是 A 会回滚的异常,aMethod 事务需要回滚,否则仍然可以提交
6549-
- TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起
6550-
- TransactionDefinition.PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常
6546+
- TransactionDefinition.PROPAGATION_NOT_SUPPORTED: **以非事务方式运行**,如果当前存在事务,则把当前事务挂起
6547+
- TransactionDefinition.PROPAGATION_NEVER: **以非事务方式运行**,如果当前存在事务,则抛出异常
65516548
6552-
**其他情况:**
6549+
其他情况:
65536550
65546551
* TransactionDefinition.PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于 PROPAGATION_REQUIRED
65556552
* 如果 ServiceB 异常回滚,可以通过 try-catch 机制执行 ServiceC
@@ -12773,36 +12770,6 @@ jsp:
1277312770

1277412771
## XML
1277512772

12776-
### 整合流程
12777-
12778-
整合步骤分析:
12779-
12780-
SSMSpring+SpringMVC+MyBatis
12781-
12782-
* Spring:框架基础
12783-
12784-
* MyBatis:mysql+druid+pagehelper
12785-
12786-
* Spring 整合 MyBatis
12787-
12788-
* junit 测试业务层接口
12789-
12790-
* SpringMVC
12791-
* rest 风格(postman 测试请求结果)
12792-
* 数据封装 json(jackson)
12793-
12794-
* Spring 整合 SpringMVC
12795-
12796-
* Controller 调用 Service
12797-
12798-
* 其他
12799-
12800-
* 表现层数据封装
12801-
12802-
* 自定义异常
12803-
12804-
12805-
1280612773
### 结构搭建
1280712774

1280812775
* 创建项目,组织项目结构,创建包
@@ -13088,13 +13055,7 @@ SSM(Spring+SpringMVC+MyBatis)
1308813055
<?xml version="1.0" encoding="UTF-8"?>
1308913056
<beans xmlns="http://www.springframework.org/schema/beans"
1309013057
xmlns:context="http://www.springframework.org/schema/context"
13091-
xmlns:mvc="http://www.springframework.org/schema/mvc"
13092-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
1309313058
xsi:schemaLocation="
13094-
http://www.springframework.org/schema/beans
13095-
http://www.springframework.org/schema/beans/spring-beans.xsd
13096-
http://www.springframework.org/schema/mvc
13097-
http://www.springframework.org/schema/mvc/spring-mvc.xsd
1309813059
http://www.springframework.org/schema/context
1309913060
http://www.springframework.org/schema/context/spring-context.xsd">
1310013061
<!--开启注解驱动,提供Controller请求转发,json自动转换等功能-->
@@ -13103,7 +13064,7 @@ SSM(Spring+SpringMVC+MyBatis)
1310313064
<context:component-scan base-package="controller"/>
1310413065
</beans>
1310513066
```
13106-
13067+
1310713068
* MyBatis映射:resources.dao.UserDao.xml
1310813069

1310913070
```xml
@@ -13145,21 +13106,15 @@ SSM(Spring+SpringMVC+MyBatis)
1314513106
</mapper>
1314613107
```
1314713108

13148-
* Mybatis核心配置:resouces.applicationContext.xml
13109+
* Mybatis 核心配置:resouces.applicationContext.xml
1314913110

1315013111
```xml
1315113112
<?xml version="1.0" encoding="UTF-8"?>
1315213113
<beans xmlns="http://www.springframework.org/schema/beans"
1315313114
xmlns:context="http://www.springframework.org/schema/context"
13154-
xmlns:tx="http://www.springframework.org/schema/tx"
13155-
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
1315613115
xsi:schemaLocation="
13157-
http://www.springframework.org/schema/beans
13158-
http://www.springframework.org/schema/beans/spring-beans.xsd
1315913116
http://www.springframework.org/schema/context
13160-
http://www.springframework.org/schema/context/spring-context.xsd
13161-
http://www.springframework.org/schema/tx
13162-
http://www.springframework.org/schema/tx/spring-tx.xsd">
13117+
http://www.springframework.org/schema/context/spring-context.xsdd">
1316313118
<!--开启bean-->
1316413119
<context:component-scan base-package="dao,domain,service">
1316513120
<context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>

0 commit comments

Comments
 (0)