Skip to content

Commit 0a99b09

Browse files
committed
Update Java Notes
1 parent 211f1c8 commit 0a99b09

File tree

3 files changed

+819
-212
lines changed

3 files changed

+819
-212
lines changed

DB.md

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8192,7 +8192,7 @@ Redis ACL 是 Access Control List(访问控制列表)的缩写,该功能
81928192
81938193
#### 简介
81948194
8195-
存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型,实质上是存一个字符串,String 类型是二进制安全的,意味着 Redis 的 string 可以包含任何数据,比如图片或者序列化的对象
8195+
存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型,实质上是存一个字符串,string 类型是二进制安全的,意味着 Redis 的 string 可以包含任何数据,比如图片或者序列化的对象
81968196
81978197
存储数据的格式:一个存储空间保存一个数据,每一个空间中只能保存一个字符串信息
81988198
@@ -8275,8 +8275,8 @@ Redis 所有操作都是**原子性**的,采用**单线程**机制,命令是
82758275
82768276
单数据和多数据的选择:
82778277
8278-
* 单数据执行3条指令的过程:3 次发送 + 3 次处理 + 3次返回
8279-
* 多数据执行1条指令的过程:1 次发送 + 3 次处理 + 1次返回(发送和返回的事件略高于单数据)
8278+
* 单数据执行 3 条指令的过程:3 次发送 + 3 次处理 + 3次返回
8279+
* 多数据执行 1 条指令的过程:1 次发送 + 3 次处理 + 1次返回(发送和返回的事件略高于单数据)
82808280
82818281
<img src="https://gitee.com/seazean/images/raw/master/DB/string单数据与多数据操作.png" style="zoom: 33%;" />
82828282
@@ -8611,8 +8611,8 @@ typedef struct listNode
86118611
86128612
![](https://gitee.com/seazean/images/raw/master/DB/Redis-链表数据结构.png)
86138613
8614-
- 双向:链表节点带有前驱、后继指针,获取某个节点的前驱、后继节点的时间复杂度为O(1)
8615-
- 无环:链表为非循环链表,表头节点的前驱指针和表尾节点的后继指针都指向NULL,对链表的访问以 NULL 为终点
8614+
- 双向:链表节点带有前驱、后继指针,获取某个节点的前驱、后继节点的时间复杂度为 O(1)
8615+
- 无环:链表为非循环链表,表头节点的前驱指针和表尾节点的后继指针都指向 NULL,对链表的访问以 NULL 为终点
86168616
86178617
86188618
@@ -8719,7 +8719,7 @@ set 类型:与 hash 存储结构哈希表完全相同,只是仅存储键不
87198719
解决方案:
87208720

87218721
* 设定用户鉴别规则,周期性更新满足规则的黑名单加入 set 集合,用户行为信息达到后与黑名单进行对比
8722-
* 黑名单过滤IP地址:应用于开放游客访问权限的信息源
8722+
* 黑名单过滤 IP 地址:应用于开放游客访问权限的信息源
87238723
* 黑名单过滤设备信息:应用于限定访问设备的信息源
87248724
* 黑名单过滤用户:应用于基于访问权限的信息源
87258725

@@ -8733,7 +8733,7 @@ set 类型:与 hash 存储结构哈希表完全相同,只是仅存储键不
87338733

87348734
集合类型的内部编码有两种:
87358735

8736-
* intset(整数集合):当集合中的元素都是整数且元素个数小于 set-maxintset-entries配置(默认512个)时,Redis 会选用 intset 来作为集合的内部实现,从而减少内存的使用
8736+
* intset(整数集合):当集合中的元素都是整数且元素个数小于 set-maxintset-entries配置(默认 512 个)时,Redis 会选用 intset 来作为集合的内部实现,从而减少内存的使用
87378737

87388738
* hashtable(哈希表,字典):当无法满足 intset 条件时,Redis 会使用 hashtable 作为集合的内部实现
87398739

Java.md

Lines changed: 11 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -748,7 +748,7 @@ public static 返回值类型 方法名(参数) {
748748

749749
重载仅对应方法的定义,与方法的调用无关,调用方式参照标准格式
750750

751-
重载仅针对**同一个类**中方法的名称与参数进行识别,**与返回值无关**,不能通过返回值来判定两个方法是否构成重载
751+
重载仅针对同一个类中方法的名称与参数进行识别,与返回值无关,**不能通过返回值来判定两个方法是否构成重载**
752752

753753
原理:JVM → 运行机制 → 方法调用 → 多态原理
754754

@@ -4426,7 +4426,7 @@ public class Student implements Comparable<Student>{
44264426

44274427
Queue:队列,先进先出的特性
44284428

4429-
PriorityQueue 是优先级队列,底层存储结构为 Object[],默认实现为小顶堆
4429+
PriorityQueue 是优先级队列,底层存储结构为 Object[],默认实现为小顶堆,每次出队最小的元素
44304430

44314431
构造方法:
44324432

@@ -8057,7 +8057,7 @@ public class UserServiceTest {
80578057

80588058
反射提供了一个Class类型:HelloWorld.java → javac → HelloWorld.class
80598059

8060-
* `Class c = HelloWorld.class;`
8060+
* `Class c = HelloWorld.class`
80618061

80628062
注意:反射是工作在**运行时**的技术,只有运行之后才会有 class 类对象
80638063

@@ -9544,7 +9544,7 @@ Java 编译器输入的指令流是一种基于栈的指令集架构。因为跨
95449544

95459545
### 生命周期
95469546

9547-
JVM的生命周期分为三个阶段,分别为:启动、运行、死亡。
9547+
JVM 的生命周期分为三个阶段,分别为:启动、运行、死亡。
95489548

95499549
- **启动**:当启动一个 Java 程序时,通过引导类加载器(bootstrap class loader)创建一个初始类(initial class),对于拥有 main 函数的类就是 JVM 实例运行的起点
95509550
- **运行**:
@@ -11645,7 +11645,7 @@ Java 对象创建时机:
1164511645

1164611646
* 实例初始化不一定要在类初始化结束之后才开始
1164711647

11648-
* 在同一个类加载器下,一个类型只会被初始化一次。所以一旦开始初始化一个类,无论是否完成后续都不会再重新触发该类型的初始化阶段了(只考虑在同一个类加载器下的情形。因此,在实例化上述程序中的st变量时,**实际上是把实例初始化嵌入到了静态初始化流程中,并且在上面的程序中,嵌入到了静态初始化的起始位置**,这就导致了实例初始化完全发生在静态初始化之前,这也是导致a为110 b为0的原因
11648+
* 在同一个类加载器下,一个类型只会被初始化一次。所以一旦开始初始化一个类,无论是否完成后续都不会再重新触发该类型的初始化阶段了(只考虑在同一个类加载器下的情形。因此,在实例化上述程序中的 st 变量时,**实际上是把实例初始化嵌入到了静态初始化流程中,并且在上面的程序中,嵌入到了静态初始化的起始位置**,这就导致了实例初始化完全发生在静态初始化之前,这也是导致 a 为 110,b 为 0 的原因
1164911649

1165011650
代码等价于:
1165111651

@@ -11783,7 +11783,6 @@ Java 对象创建时机:
1178311783

1178411784
类变量初始化:
1178511785

11786-
* static 变量在 JDK 7 之前存储于 instanceKlass 末尾,从 JDK 7 开始,存储于 _java_mirror 末尾
1178711786
* static 变量分配空间和赋值是两个步骤:**分配空间在准备阶段完成,赋值在初始化阶段完成**
1178811787
* 如果 static 变量是 final 的基本类型以及字符串常量,那么编译阶段值就确定了,准备阶段会显式初始化
1178911788
* 如果 static 变量是 final 的,但属于引用类型或者构造器方法的字符串,赋值在初始化阶段完成
@@ -11814,14 +11813,14 @@ Java 对象创建时机:
1181411813

1181511814
将常量池中类、接口、字段、方法的**符号引用替换为直接引用**(内存地址)的过程:
1181611815

11817-
* 符号引用:一组符号来描述目标,可以是任何字面量,属于编译原理方面的概念如:包括类和接口的全限名、字段的名称和描述符、方法的名称和**方法描述符**
11816+
* 符号引用:一组符号来描述目标,可以是任何字面量,属于编译原理方面的概念,如:包括类和接口的全限名、字段的名称和描述符、方法的名称和**方法描述符**
1181811817
* 直接引用:直接指向目标的指针、相对偏移量或一个间接定位到目标的句柄,如果有了直接引用,那说明引用的目标必定已经存在于内存之中
1181911818

1182011819
解析动作主要针对类或接口、字段、类方法、接口方法、方法类型等
1182111820

1182211821
* 在类加载阶段解析的是非虚方法,静态绑定
1182311822
* 也可以在初始化阶段之后再开始解析,这是为了支持 Java 的**动态绑定**
11824-
* 通过解析操作,符号引用就可以转变为目标方法在类中虚方法表中的位置,从而使得方法被成功调用
11823+
* 通过解析操作,符号引用就可以转变为目标方法在类的虚方法表中的位置,从而使得方法被成功调用
1182511824

1182611825
```java
1182711826
public class Load2 {
@@ -11853,7 +11852,7 @@ class D {
1185311852

1185411853
初始化阶段才真正开始执行类中定义的 Java 程序代码,在准备阶段,类变量已经赋过一次系统要求的初始值;在初始化阶段,通过程序制定的计划去初始化类变量和其它资源,执行 <clinit>
1185511854

11856-
在编译生成 class 文件时,编译器会产生两个方法加于 class 文件中,一个是类的初始化方法 clinit, 另一个是实例的初始化方法 init
11855+
在编译生成 class 文件时,编译器会产生两个方法加于 class 文件中,一个是类的初始化方法 clinit另一个是实例的初始化方法 init
1185711856

1185811857
类构造器 <clinit>() 与实例构造器 <init>() 不同,它不需要程序员进行显式调用,在一个类的生命周期中,类构造器最多被虚拟机**调用一次**,而实例构造器则会被虚拟机调用多次,只要程序员创建对象
1185911858

@@ -12010,7 +12009,7 @@ init 指的是实例构造器,主要作用是在类实例化过程中执行,
1201012009
从 Java 虚拟机规范来讲,只存在以下两种不同的类加载器:
1201112010

1201212011
- 启动类加载器(Bootstrap ClassLoader):使用 C++ 实现,是虚拟机自身的一部分
12013-
- 自定义类加载器(User-Defined ClassLoader):Java虚拟机规范**将所有派生于抽象类 ClassLoader 的类加载器都划分为自定义类加载器**,使用 Java 语言实现,独立于虚拟机
12012+
- 自定义类加载器(User-Defined ClassLoader):Java 虚拟机规范**将所有派生于抽象类 ClassLoader 的类加载器都划分为自定义类加载器**,使用 Java 语言实现,独立于虚拟机
1201412013

1201512014
从 Java 开发人员的角度看:
1201612015

@@ -13599,7 +13598,7 @@ VM 参数设置:
1359913598

1360013599
Java 虚拟机识别方法的关键在于类名、方法名以及方法描述符(method descriptor)
1360113600

13602-
* 方法描述符是由方法的参数类型以及返回类型所构成,也叫方法特征签名
13601+
* **方法描述符是由方法的参数类型以及返回类型所构成**,Java 层面叫方法特征签名
1360313602
* 在同一个类中,如果同时出现多个名字相同且描述符也相同的方法,那么 Java 虚拟机会在类的验证阶段报错
1360413603

1360513604
JVM 根据名字和描述符来判断的,只要返回值不一样,其它完全一样,在 JVM 中是允许的,但 Java 语言不允许
@@ -15514,7 +15513,7 @@ public class SelectSort {
1551415513

1551515514
实现思路:
1551615515

15517-
1. 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,并通过上浮对堆进行调整,此堆为初始的无序区,堆顶为最大数
15516+
1. 将初始待排序关键字序列(R1,R2….Rn)构建成大顶堆,并通过上浮对堆进行调整,此堆为初始的无序区,**堆顶为最大数**
1551815517

1551915518
2. 将堆顶元素 R[1] 与最后一个元素 R[n] 交换,此时得到新的无序区(R1,R2,……Rn-1)和新的有序区 Rn,且满足 R[1,2…n-1]<=R[n]
1552015519

0 commit comments

Comments
 (0)