Skip to content

Commit 5059e39

Browse files
committed
Update Java Notes
1 parent 930c577 commit 5059e39

File tree

5 files changed

+15
-17
lines changed

5 files changed

+15
-17
lines changed

DB.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -4418,7 +4418,7 @@ B+Tree 优点:提高查询速度,减少磁盘的 IO 次数,树形结构较
44184418

44194419
##### 索引维护
44204420

4421-
B+ 树为了维护索引有序性,在插入新值的时候需要做必要的维护
4421+
B+ 树为了保持索引的有序性,在插入新值的时候需要做相应的维护
44224422

44234423
每个索引中每个块存储在磁盘页中,可能会出现以下两种情况:
44244424

@@ -5400,15 +5400,15 @@ INSERT INTO `emp` (`id`, `name`, `age`, `salary`) VALUES('1','Tom','25','2300');
54005400
CREATE INDEX idx_emp_age_salary ON emp(age,salary);
54015401
```
54025402

5403-
* 第一种是通过对返回数据进行排序,所有不是通过索引直接返回排序结果的排序都叫 FileSort 排序,会在内存中重新排序
5403+
* 第一种是通过对返回数据进行排序,所有不通过索引直接返回结果的排序都叫 FileSort 排序,会在内存中重新排序
54045404

54055405
```mysql
54065406
EXPLAIN SELECT * FROM emp ORDER BY age DESC; -- 年龄降序
54075407
```
54085408

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

5411-
* 第二种通过有序索引顺序扫描直接返回有序数据,这种情况为 Using index,不需要额外排序,操作效率高
5411+
* 第二种通过有序索引顺序扫描直接返回**有序数据**,这种情况为 Using index,不需要额外排序,操作效率高
54125412

54135413
```mysql
54145414
EXPLAIN SELECT id, age, salary FROM emp ORDER BY age DESC;
@@ -5588,7 +5588,7 @@ MySQL 4.1 版本之后,开始支持 SQL 的子查询
55885588

55895589
```mysql
55905590
EXPLAIN SELECT * FROM tb_user_1 WHERE id > 200000 LIMIT 10; -- 写法 1
5591-
EXPLAIN SELECT * FROM tb_user_1 WHERE id BETWEEN 200000 and 200010; -- 写法 2
5591+
EXPLAIN SELECT * FROM tb_user_1 WHERE id BETWEEN 200000 and 200010; -- 写法 2
55925592
```
55935593

55945594
![](https://gitee.com/seazean/images/raw/master/DB/MySQL-优化SQL分页查询3.png)

Frame.md

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3241,7 +3241,7 @@ HTTP 协议是无状态的,浏览器和服务器间的请求响应一次,下
32413241
});
32423242

32433243
//启动服务器
3244-
ChannelFuture channelFuture = serverBootstrap.bind(7000).sync();
3244+
ChannelFuture channelFuture = serverBootstrap.bind(8080).sync();
32453245
channelFuture.channel().closeFuture().sync();
32463246

32473247
} finally {
@@ -3300,7 +3300,7 @@ HTTP 协议是无状态的,浏览器和服务器间的请求响应一次,下
33003300
// 判断当前浏览器是否支持websocket
33013301
if(window.WebSocket) {
33023302
//go on
3303-
socket = new WebSocket("ws://localhost:7000/hello2");
3303+
socket = new WebSocket("ws://localhost:8080/hello");
33043304
//相当于channelReado, ev 收到服务器端回送的消息
33053305
socket.onmessage = function (ev) {
33063306
var rt = document.getElementById("responseText");
@@ -3325,11 +3325,12 @@ HTTP 协议是无状态的,浏览器和服务器间的请求响应一次,下
33253325

33263326
// 发送消息到服务器
33273327
function send(message) {
3328-
if(!window.socket) { //先判断socket是否创建好
3328+
// 先判断socket是否创建好
3329+
if(!window.socket) {
33293330
return;
33303331
}
33313332
if(socket.readyState == WebSocket.OPEN) {
3332-
//通过socket 发送消息
3333+
// 通过socket 发送消息
33333334
socket.send(message)
33343335
} else {
33353336
alert("连接没有开启");
@@ -3438,10 +3439,6 @@ RCVBUF_ALLOCATOR:属于 SocketChannal 参数
34383439

34393440

34403441

3441-
# Tail
3442-
3443-
3444-
34453442

34463443

34473444

Java.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6780,7 +6780,7 @@ list.stream().filter(s -> s.startsWith("张"));
67806780
Collection<String> c = new ArrayList<>();
67816781
Stream<String> listStream = c.stream();
67826782

6783-
//Map集合获取流
6783+
// Map集合获取流
67846784
// 先获取键的Stream流。
67856785
Stream<String> keysStream = map.keySet().stream();
67866786
// 在获取值的Stream流
@@ -8579,6 +8579,7 @@ public class ReflectDemo {
85798579
* 注解是 JDK1.5 的新特性
85808580
* 注解是给编译器或 JVM 看的,编译器或 JVM 可以根据注解来完成对应的功能
85818581
* 注解类似修饰符,应用于包、类型、构造方法、方法、成员变量、参数及本地变量的声明语句中
8582+
* 父类中的注解是不能被子类继承的
85828583

85838584
注解作用:
85848585

@@ -8757,9 +8758,9 @@ Class 类 API :
87578758
* `boolean isAnnotationPresent(Class<Annotation> class)`:判断对象是否使用了指定的注解
87588759
* `boolean isAnnotation()`:此 Class 对象是否表示注释类型
87598760

8760-
注解原理:注解本质是一个继承了 `Annotation` 的特殊接口,其具体实现类是 Java 运行时生成的**动态代理类**,通过反射获取注解时,返回的是运行时生成的动态代理对象 `$Proxy1`,通过代理对象调用自定义注解(接口)的方法,回调 `AnnotationInvocationHandler` 的 `invoke` 方法,该方法会从 `memberValues` 这个Map 中找出对应的值,而 `memberValues` 的来源是 Java 常量池
8761+
注解原理:注解本质是**特殊接口**,继承了 `Annotation` ,其具体实现类是 Java 运行时生成的**动态代理类**,通过反射获取注解时,返回的是运行时生成的动态代理对象 `$Proxy1`,通过代理对象调用自定义注解(接口)的方法,回调 `AnnotationInvocationHandler` 的 `invoke` 方法,该方法会从 `memberValues` 这个 Map 中找出对应的值,而 `memberValues` 的来源是 Java 常量池
87618762

8762-
解析注解数据的原理:注解在哪个成分上,就先拿哪个成分对象,比如注解作用在类上,则要该类的Class对象,再来拿上面的注解
8763+
解析注解数据的原理:注解在哪个成分上,就先拿哪个成分对象,比如注解作用在类上,则要该类的 Class 对象,再来拿上面的注解
87638764

87648765
```java
87658766
public class AnnotationDemo{

Prog.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13422,7 +13422,7 @@ epoll 的特点:
1342213422

1342313423
* epoll 仅适用于 Linux 系统
1342413424
* epoll 使用**一个文件描述符管理多个描述符**,将用户关系的文件描述符的事件存放到内核的一个事件表(个人理解成哑元节点)
13425-
* 没有最大描述符数量(并发连接)的限制,打开 fd 的上限远大于1024(1G 内存能监听约10万个端口
13425+
* 没有最大描述符数量(并发连接)的限制,打开 fd 的上限远大于1024(1G 内存能监听约 10 万个端口
1342613426
* epoll 的时间复杂度 O(1),epoll 理解为 event poll,不同于忙轮询和无差别轮询,调用 epoll_wait **只是轮询就绪链表**。当监听列表有设备就绪时调用回调函数,把就绪 fd 放入就绪链表中,并唤醒在 epoll_wait 中阻塞的进程,所以 epoll 实际上是**事件驱动**(每个事件关联上fd)的,降低了 system call 的时间复杂度
1342713427
* epoll 内核中根据每个 fd 上的 callback 函数来实现,只有活跃的 socket 才会主动调用 callback,所以使用 epoll 没有前面两者的线性下降的性能问题,效率提高
1342813428

SSM.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7412,7 +7412,7 @@ public void addAccount{}
74127412

74137413
* 情况 6:Spring 的事务传播策略在**内部方法**调用时将不起作用,在一个 Service 内部,事务方法之间的嵌套调用,普通方法和事务方法之间的嵌套调用,都不会开启新的事务,事务注解要加到调用方法上才生效
74147414

7415-
原因:Spring 的事务都是使用 AOP 代理的模式,动态代理最终是要调用原始对象,而原始对象在去调用方法时是不会触发拦截器,就是**一个方法调用本对象的另一个方法**,所以事务也就无法生效
7415+
原因:Spring 的事务都是使用 AOP 代理的模式,动态代理 invoke 后会调用原始对象,而原始对象在去调用方法时是不会触发拦截器,就是**一个方法调用本对象的另一个方法**,所以事务也就无法生效
74167416

74177417
```java
74187418
@Transactional

0 commit comments

Comments
 (0)