Skip to content

Commit 9d93a9f

Browse files
authored
Merge pull request #1 from CyC2018/master
日常更新
2 parents 12e529f + f4e0c8b commit 9d93a9f

7 files changed

+17
-18
lines changed

docs/notes/Java 虚拟机.md

+6-14
Original file line numberDiff line numberDiff line change
@@ -442,7 +442,7 @@ G1 把堆划分成多个大小相等的独立区域(Region),新生代和
442442

443443
# 四、类加载机制
444444

445-
类是在运行期间第一次使用时动态加载的,而不是编译时期一次性加载。因为如果在编译时期一次性加载,那么会占用很多的内存。
445+
类是在运行期间第一次使用时动态加载的,而不是一次性加载。因为如果一次性加载,那么会占用很多的内存。
446446

447447
## 类的生命周期
448448

@@ -511,13 +511,9 @@ public static final int value = 123;
511511

512512
### 5. 初始化
513513

514-
初始化阶段才真正开始执行类中定义的 Java 程序代码。初始化阶段即虚拟机执行类构造器 <clinit>() 方法的过程。
514+
初始化阶段才真正开始执行类中定义的 Java 程序代码。初始化阶段即虚拟机执行类构造器 <clinit>() 方法的过程。在准备阶段,类变量已经赋过一次系统要求的初始值,而在初始化阶段,根据程序员通过程序制定的主观计划去初始化类变量和其它资源。
515515

516-
在准备阶段,类变量已经赋过一次系统要求的初始值,而在初始化阶段,根据程序员通过程序制定的主观计划去初始化类变量和其它资源。
517-
518-
<clinit>() 方法具有以下特点:
519-
520-
- 是由编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并产生的,编译器收集的顺序由语句在源文件中出现的顺序决定。特别注意的是,静态语句块只能访问到定义在它之前的类变量,定义在它之后的类变量只能赋值,不能访问。例如以下代码:
516+
<clinit>() 是由编译器自动收集类中所有类变量的赋值动作和静态语句块中的语句合并产生的,编译器收集的顺序由语句在源文件中出现的顺序决定。特别注意的是,静态语句块只能访问到定义在它之前的类变量,定义在它之后的类变量只能赋值,不能访问。例如以下代码:
521517

522518
```java
523519
public class Test {
@@ -529,9 +525,7 @@ public class Test {
529525
}
530526
```
531527

532-
- 与类的构造函数(或者说实例构造器 <init>())不同,不需要显式的调用父类的构造器。虚拟机会自动保证在子类的 <clinit>() 方法运行之前,父类的 <clinit>() 方法已经执行结束。因此虚拟机中第一个执行 <clinit>() 方法的类肯定为 java.lang.Object。
533-
534-
- 由于父类的 <clinit>() 方法先执行,也就意味着父类中定义的静态语句块的执行要优先于子类。例如以下代码:
528+
由于父类的 <clinit>() 方法先执行,也就意味着父类中定义的静态语句块的执行要优先于子类。例如以下代码:
535529

536530
```java
537531
static class Parent {
@@ -550,11 +544,9 @@ public static void main(String[] args) {
550544
}
551545
```
552546

553-
- <clinit>() 方法对于类或接口不是必须的,如果一个类中不包含静态语句块,也没有对类变量的赋值操作,编译器可以不为该类生成 <clinit>() 方法。
554-
555-
- 接口中不可以使用静态语句块,但仍然有类变量初始化的赋值操作,因此接口与类一样都会生成 <clinit>() 方法。但接口与类不同的是,执行接口的 <clinit>() 方法不需要先执行父接口的 <clinit>() 方法。只有当父接口中定义的变量使用时,父接口才会初始化。另外,接口的实现类在初始化时也一样不会执行接口的 <clinit>() 方法。
547+
接口中不可以使用静态语句块,但仍然有类变量初始化的赋值操作,因此接口与类一样都会生成 <clinit>() 方法。但接口与类不同的是,执行接口的 <clinit>() 方法不需要先执行父接口的 <clinit>() 方法。只有当父接口中定义的变量使用时,父接口才会初始化。另外,接口的实现类在初始化时也一样不会执行接口的 <clinit>() 方法。
556548

557-
- 虚拟机会保证一个类的 <clinit>() 方法在多线程环境下被正确的加锁和同步,如果多个线程同时初始化一个类,只会有一个线程执行这个类的 <clinit>() 方法,其它线程都会阻塞等待,直到活动线程执行 <clinit>() 方法完毕。如果在一个类的 <clinit>() 方法中有耗时的操作,就可能造成多个线程阻塞,在实际过程中此种阻塞很隐蔽。
549+
虚拟机会保证一个类的 <clinit>() 方法在多线程环境下被正确的加锁和同步,如果多个线程同时初始化一个类,只会有一个线程执行这个类的 <clinit>() 方法,其它线程都会阻塞等待,直到活动线程执行 <clinit>() 方法完毕。如果在一个类的 <clinit>() 方法中有耗时的操作,就可能造成多个线程阻塞,在实际过程中此种阻塞很隐蔽。
558550

559551
## 类初始化时机
560552

docs/notes/Leetcode 题解.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ Output:
256256
"apple"
257257
```
258258

259-
题目描述:删除 s 中的一些字符,使得它构成字符串列表 d 中的一个字符串,找出能构成的最长字符串。如果有多个相同长度的结果,返回字典序的最大字符串
259+
题目描述:删除 s 中的一些字符,使得它构成字符串列表 d 中的一个字符串,找出能构成的最长字符串。如果有多个相同长度的结果,返回字典序的最小字符串
260260

261261
```java
262262
public String findLongestWord(String s, List<String> d) {
@@ -4243,7 +4243,7 @@ public boolean isPalindrome(ListNode head) {
42434243
slow = slow.next;
42444244
fast = fast.next.next;
42454245
}
4246-
if (fast != null) slow = slow.next; // 链表节点个数为奇数,让 slow 指向下一个节点
4246+
if (fast != null) slow = slow.next; // 偶数节点,让 slow 指向下一个节点
42474247
cut(head, slow); // 切成两个链表
42484248
return isEqual(head, reverse(slow));
42494249
}
Loading

docs/notes/剑指 offer 题解.md

+5-1
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,10 @@
8888
- [ProcessOn](https://www.processon.com/view/5a3e4c7be4b0909c1aa18b49)
8989
- [DrawIO](https://drive.google.com/file/d/1nSSCpPUC05MFoeFuf_aeTtkm7dG5-bJ1/view?usp=sharing)
9090

91+
本文内容可在微信小程序中阅读:
92+
93+
<div align="center"> <img src="pics/gh_a68199af85d6_258_20_282_29.jpg"/> </div><br>
94+
9195
# 2. 实现 Singleton
9296

9397
[单例模式](设计模式.md)
@@ -1853,7 +1857,7 @@ private void backtracking(char[] chars, boolean[] hasUsed, StringBuilder s) {
18531857

18541858
多数投票问题,可以利用 Boyer-Moore Majority Vote Algorithm 来解决这个问题,使得时间复杂度为 O(N)。
18551859

1856-
使用 cnt 来统计一个元素出现的次数,cnt 初始为 0。算法依次遍历数组中的数字,遍历到一个元素时,若 cnt 为 0,则令统计元素为遍历到的该元素,并置 cnt 为 1。若 cnt 不为 0,且当遍历到的元素和统计元素相等时,令 cnt++,否则令 cnt--。如果前面查找了 i 个元素,且 cnt == 0,说明前 i 个元素没有 majority,或者有 majority,但是出现的次数少于 i / 2 ,因为如果多于 i / 2 的话 cnt 就一定不会为 0 。此时剩下的 n - i 个元素中,majority 的数目依然多于 (n - i) / 2,因此继续查找就能找出 majority。
1860+
使用 cnt 来统计一个元素出现的次数,当遍历到的元素和统计元素相等时,令 cnt++,否则令 cnt--。如果前面查找了 i 个元素,且 cnt == 0,说明前 i 个元素没有 majority,或者有 majority,但是出现的次数少于 i / 2 ,因为如果多于 i / 2 的话 cnt 就一定不会为 0 。此时剩下的 n - i 个元素中,majority 的数目依然多于 (n - i) / 2,因此继续查找就能找出 majority。
18571861

18581862
```java
18591863
public int MoreThanHalfNum_Solution(int[] nums) {

docs/notes/计算机操作系统.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@
4646

4747
并发是指宏观上在一段时间内能同时运行多个程序,而并行则指同一时刻能运行多个指令。
4848

49-
并行需要硬件支持,如多流水线或者多处理器
49+
并行需要硬件支持,如多流水线、多核处理器或则分布式计算系统
5050

5151
操作系统通过引入进程和线程,使得程序能够并发运行。
5252

other/6.gif

2.23 MB
Loading

other/剑指 Offer 题解小程序.md

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
<div align="center">
2+
<img src="https://github.com/CyC2018/CS-Notes/blob/master/other/6.gif" width="250px">
3+
</div>

0 commit comments

Comments
 (0)