Skip to content

Commit 70e163b

Browse files
committed
对 issue 进行回应,已经在新版中升级和迭代。感谢老铁们的指正。
1 parent 57a9ba2 commit 70e163b

File tree

12 files changed

+72
-41
lines changed

12 files changed

+72
-41
lines changed

docs/array/array.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,15 @@ for (int element : anArray) {
193193
List<Integer> aList = Arrays.asList(anArray);
194194
```
195195

196-
不过需要注意的是,Arrays.asList 的参数需要是 Integer 数组,而 anArray 目前是 int 类型,我们需要换另外一种方式。
196+
不过需要注意的是,Arrays.asList 的参数需要是 Integer 数组,而 anArray 目前是 int 类型。
197+
198+
可以这样写:
199+
200+
```java
201+
List<Integer> aList1 = Arrays.asList(1, 2, 3, 4, 5);
202+
```
203+
204+
或者换另外一种方式。
197205

198206
```java
199207
List<Integer> aList = Arrays.stream(anArray).boxed().collect(Collectors.toList());

docs/basic-extra-meal/fanshe.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -314,8 +314,8 @@ for (Constructor c : constructors1) {
314314
大体上和获取构造方法类似,把关键字 Constructor 换成 Field 即可。
315315

316316
```java
317-
Method setNameMethod = clazz.getMethod("setName", String.class);
318-
Method getNameMethod = clazz.getMethod("getName");
317+
Field[] fields1 = System.class.getFields();
318+
Field fields2 = System.class.getField("out");
319319
```
320320

321321
**5)获取方法**

docs/basic-extra-meal/override-overload.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ public class OverloadingTypePromotion1 {
189189
}
190190
```
191191

192-
“执行 `obj.sum(20, 20)` 的时候,发现有 `sum(int a, int b)` 的方法,所以就不会向上转型为 long,调用 `sum(long a, long b)`。”
192+
“执行 `obj.sum(20, 20)` 的时候,发现有 `sum(int a, int b)` 的方法,所以就不会向上转型为 long。”
193193

194194
“来看一下程序的输出结果。”
195195

@@ -219,6 +219,7 @@ public class OverloadingTypePromotion2 {
219219
“二哥,我又想到一个问题。当有两个方法 `sum(long a, int b)``sum(int a, long b)`,参数个数相同,参数类型相同,只不过位置不同的时候,会发生什么呢?”
220220

221221
“当通过 `obj.sum(20, 20)` 来调用 sum 方法的时候,编译器会提示错误。”
222+
222223
![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/core-points/21-04.png)
223224

224225
“不明确,编译器会很为难,究竟是把第一个 20 从 int 转成 long 呢,还是把第二个 20 从 int 转成 long,智障了!所以,不能写这样让编译器左右为难的代码。”

docs/interview/java-thread-baguwen.md

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,19 @@ head:
1515
# Java 并发编程八股文(背诵版)必看:+1:
1616

1717
### 简述Java内存模型(JMM)
18+
1819
Java内存模型定义了程序中各种变量的访问规则:
1920

2021
- 所有变量都存储在主存,每个线程都有自己的工作内存。
2122
- 工作内存中保存了被该线程使用的变量的主存副本,线程对变量的所有操作都必须在工作空间进行,不能直接读写主内存数据。
2223
- 操作完成后,线程的工作内存通过缓存一致性协议将操作完的数据刷回主存。
2324

2425
### 简述as-if-serial
26+
2527
编译器会对原始的程序进行指令重排序和优化。但不管怎么重排序,其结果都必须和用户原始程序输出的预定结果保持一致。
2628

2729
### 简述happens-before八大规则
30+
2831
- 程序次序规则:一个线程内,按照代码顺序,书写在前面的操作先行发生于书写在后面的操作;
2932
- 锁定规则:一个unLock操作先行发生于后面对同一个锁的lock操作;
3033
- volatile变量规则:对一个变量的写操作先行发生于后面对这个变量的读操作;
@@ -35,26 +38,34 @@ Java内存模型定义了程序中各种变量的访问规则:
3538
- 对象终结规则:一个对象的初始化完成先行发生于他的finalize()方法的开始;
3639

3740
### as-if-serial 和 happens-before 的区别
41+
3842
as-if-serial 保证单线程程序的执行结果不变,happens-before 保证正确同步的多线程程序的执行结果不变。
3943

4044
### 简述原子性操作
45+
4146
一个操作或者多个操作,要么全部执行并且执行的过程不会被任何因素打断,要么就都不执行,这就是原子性操作。
4247

4348
### 简述线程的可见性
49+
4450
可见性指当一个线程修改了共享变量时,其他线程能够立即得知修改。volatile、synchronized、final 关键字都能保证可见性。
4551

4652
### 简述有序性
53+
4754
虽然多线程存在并发和指令优化等操作,但在本线程内观察该线程的所有执行操作是有序的。
4855

4956
### 简述Java中volatile关键字作用
57+
5058
- 保证变量对所有线程的可见性。当一个线程修改了变量值,新值对于其他线程来说是立即可以得知的。
5159
- 禁止指令重排。使用 volatile 变量进行写操作,编译器在生成字节码时,会在指令序列中插入内存屏障来禁止特定类型的处理器进行重排序。
5260

5361
### Java线程的实现方式
62+
5463
- 实现Runnable接口
5564
- 继承Thread类
5665
- 实现Callable接口
66+
5767
### 简述Java线程的状态
68+
5869
线程状态有 NEW、RUNNABLE、BLOCK、WAITING、TIMED_WAITING、THERMINATED
5970

6071
- NEW:新建状态,线程被创建且未启动,此时还未调用 start 方法。
@@ -65,11 +76,14 @@ as-if-serial 保证单线程程序的执行结果不变,happens-before 保证
6576
- TERMINATED:结束状态。线程调用完run方法进入该状态。
6677

6778
### 简述线程通信的方式
79+
6880
- volatile 关键词修饰变量,保证所有线程对变量访问的可见性。
6981
- synchronized关键词。确保多个线程在同一时刻只能有一个处于方法或同步块中。
7082
- wait/notify方法
7183
- IO通信
84+
7285
### 简述线程池
86+
7387
没有线程池的情况下,多次创建,销毁线程开销比较大。如果在开辟的线程执行完当前任务后复用已创建的线程,可以降低开销、控制最大并发数。
7488

7589
线程池创建线程时,会将线程封装成工作线程 Worker,Worker 在执行完任务后还会循环获取工作队列中的任务来执行。
@@ -99,17 +113,20 @@ as-if-serial 保证单线程程序的执行结果不变,happens-before 保证
99113

100114

101115
### 简述Executor框架
116+
102117
Executor框架目的是将任务提交和任务如何运行分离开来的机制。用户不再需要从代码层考虑设计任务的提交运行,只需要调用Executor框架实现类的Execute方法就可以提交任务。
103118

104119
### 简述Executor的继承关系
120+
105121
- Executor:一个接口,其定义了一个接收Runnable对象的方法executor,该方法接收一个Runable实例执行这个任务。
106122
- ExecutorService:Executor的子类接口,其定义了一个接收Callable对象的方法,返回 Future 对象,同时提供execute方法。
107123
- ScheduledExecutorService:ExecutorService的子类接口,支持定期执行任务。
108124
- AbstractExecutorService:抽象类,提供 ExecutorService 执行方法的默认实现。
109125
- Executors:实现ExecutorService接口的静态工厂类,提供了一系列工厂方法用于创建线程池。
110126
- ThreadPoolExecutor:继承AbstractExecutorService,用于创建线程池。
111127
- ForkJoinPool: 继承AbstractExecutorService,Fork 将大任务分叉为多个小任务,然后让小任务执行,Join 是获得小任务的结果,类似于map reduce。
112-
- ThreadPoolExecutor:继承ThreadPoolExecutor,实现ScheduledExecutorService,用于创建带定时任务的线程池。
128+
- ScheduledThreadPoolExecutor:继承ThreadPoolExecutor,实现ScheduledExecutorService,用于创建带定时任务的线程池。
129+
113130
### 简述线程池的状态
114131
- Running:能接受新提交的任务,也可以处理阻塞队列的任务。
115132
- Shutdown:不再接受新提交的任务,但可以处理存量任务,线程池处于running时调用shutdown方法,会进入该状态。

docs/oo/method.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -230,7 +230,7 @@ Hutool 的存在就是为了减少代码搜索成本,避免网络上参差不
230230

231231
### 06、什么是抽象方法?
232232

233-
没有方法体的方法被称为抽象方法,它总是在[抽象类](https://javabetter.cn/oo/abstract.html)中声明。这意味着如果类有抽象方法的话,这个类就必须是抽象的。可以使用 atstract 关键字创建抽象方法和抽象类。
233+
没有方法体的方法被称为抽象方法,它总是在[抽象类](https://javabetter.cn/oo/abstract.html)中声明。这意味着如果类有抽象方法的话,这个类就必须是抽象的。可以使用 abstract 关键字创建抽象方法和抽象类。
234234

235235
```java
236236
/**

docs/sidebar/sanfene/javase.md

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,9 @@ head:
1919

2020
### 1.什么是 Java?
2121

22-
![下辈子还学Java](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/javase-1.png)
22+
![三分恶面渣逆袭:下辈子还学Java](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/javase-1.png)
2323

24-
PS:碎怂 Java,有啥好介绍的。哦,面试啊。
24+
>PS:碎怂 Java,有啥好介绍的。哦,面试啊。
2525
2626
Java 是一门面向对象的编程语言,不仅吸收了 C++语言的各种优点,还摒弃了 C++里难以理解的多继承、指针等概念,因此 Java 语言具有功能强大和简单易用两个特征。Java 语言作为静态面向对象编程语言的优秀代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程 。
2727

@@ -123,9 +123,9 @@ Java 基本数据类型范围和默认值:
123123
- [接口](https://javabetter.cn/oo/interface.html)(interface)
124124
- [数组](https://javabetter.cn/array/array.html)`[]`
125125

126-
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的用友金融一面原题:Java 有哪些基本数据类型?
126+
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的用友金融一面原题:Java 有哪些基本数据类型?
127127
128-
### 54.float 是怎么表示小数的?
128+
### 23.float 是怎么表示小数的?
129129

130130
推荐阅读:[计算机系统基础(四)浮点数](http://kaito-kidd.com/2018/08/08/computer-system-float-point/)
131131

@@ -410,7 +410,7 @@ class Wanger {
410410
}
411411
```
412412

413-
### 55.多态解决了什么问题?(补充)
413+
### 17.多态解决了什么问题?(补充)
414414

415415
> 2024 年 03 月 26 日增补
416416
@@ -451,7 +451,7 @@ class Wanger {
451451
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为面经同学 8 技术二面面试原题:多态的目的,解决了什么问题?
452452
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的美团面经同学 16 暑期实习一面面试原题:请说说多态、重载和重写
453453
454-
### 17.重载和重写的区别?
454+
### 18.重载和重写的区别?
455455

456456
推荐阅读:[方法重写 Override 和方法重载 Overload 有什么区别?](https://javabetter.cn/basic-extra-meal/override-overload.html)
457457

@@ -512,7 +512,7 @@ class Ostrich extends Bird {
512512
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的帆软同学 3 Java 后端一面的原题:设计方法,李氏原则,还了解哪些设计原则
513513
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的美团面经同学 16 暑期实习一面面试原题:请说说多态、重载和重写
514514
515-
### 18.访问修饰符 public、private、protected、以及不写(默认)时的区别?
515+
### 19.访问修饰符 public、private、protected、以及不写(默认)时的区别?
516516

517517
Java 中,可以使用访问控制符来保护对类、变量、方法和构造方法的访问。Java 支持 4 种不同的访问权限。
518518

@@ -523,7 +523,7 @@ Java 中,可以使用访问控制符来保护对类、变量、方法和构造
523523

524524
![访问修饰符和可见性](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/javase-12.png)
525525

526-
### 19.this 关键字有什么作用?
526+
### 20.this 关键字有什么作用?
527527

528528
this 是自身的一个对象,代表对象本身,可以理解为:**指向对象本身的一个指针**
529529

@@ -542,9 +542,9 @@ public Person(String name,int age){
542542

543543
3. 引用本类的构造函数
544544

545-
### 20.抽象类(abstract class)和接口(interface)有什么区别?
545+
### 21.抽象类(abstract class)和接口(interface)有什么区别?
546546

547-
1. 接⼝的⽅法默认是 public ,所有⽅法在接⼝中不能有实现(Java 8 开始接⼝⽅法可以有默认实现),⽽抽象类可以有⾮抽象的⽅法。
547+
1. 接⼝的⽅法默认是 public ,所有⽅法在接⼝中不能有实现Java 8 开始接⼝⽅法可以有默认实现),⽽抽象类可以有⾮抽象的⽅法。
548548

549549
2. 接⼝中除了 static 、 final 变量,不能有其他变量,⽽抽象类中则不⼀定。
550550

@@ -566,7 +566,7 @@ public Person(String name,int age){
566566

567567
3. jdk 9 在接⼝中引⼊了私有⽅法和私有静态⽅法。
568568

569-
### 21.成员变量与局部变量的区别有哪些?
569+
### 22.成员变量与局部变量的区别有哪些?
570570

571571
1. **从语法形式上看**:成员变量是属于类的,⽽局部变量是在⽅法中定义的变量或是⽅法的参数;成员变量可以被 public , private , static 等修饰符所修饰,⽽局部变量不能被访问控制修饰符及 static 所修饰;但是,成员变量和局部变量都能被 final 所修饰。
572572

@@ -576,7 +576,7 @@ public Person(String name,int age){
576576

577577
4. **成员变量如果没有被赋初值**:则会⾃动以类型的默认值⽽赋值(⼀种情况例外:被 final 修饰的成员变量也必须显式地赋值),⽽局部变量则不会⾃动赋值。
578578

579-
### 22.静态变量和实例变量的区别?静态方法、实例方法呢?
579+
### 23.静态变量和实例变量的区别?静态方法、实例方法呢?
580580

581581
> 静态变量和实例变量的区别?
582582

docs/sidebar/sanfene/javathread.md

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -185,13 +185,13 @@ JVM 执行 start 方法,会先创建一条线程,由创建出来的新线程
185185

186186
![三分恶面渣逆袭:线程常用调度方法](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/javathread-6.png)
187187

188-
#### 线程等待与通知
188+
#### 说说线程等待与通知?
189189

190190
在 Object 类中有一些方法可以用于线程的等待与通知。
191191

192-
①、`wait()`:当一个线程 A 调用一个共享变量的 `wait()` 方法时, 线程 A 会被阻塞挂起,直到发生下面几种情况才会返回 :
192+
①、`wait()`:当一个线程 A 调用一个共享变量的 `wait()` 方法时,线程 A 会被阻塞挂起,直到发生下面几种情况才会返回 :
193193

194-
- 线程 A 调用了共享对象 `notify()`或者 `notifyAll()` 方法;
194+
- 线程 B 调用了共享对象 `notify()`或者 `notifyAll()` 方法;
195195
- 其他线程调用了线程 A 的 `interrupt()` 方法,线程 A 抛出 InterruptedException 异常返回。
196196

197197
②、`wait(long timeout)` :这个方法相比 `wait()` 方法多了一个超时参数,它的不同之处在于,如果线程 A 调用共享对象的 `wait(long timeout)`方法后,没有在指定的 timeout 时间内被其它线程唤醒,那么这个方法还是会因为超时而返回。
@@ -208,17 +208,17 @@ JVM 执行 start 方法,会先创建一条线程,由创建出来的新线程
208208

209209
Thread 类还提供了一个 `join()` 方法,意思是如果一个线程 A 执行了 `thread.join()`,当前线程 A 会等待 thread 线程终止之后才从 `thread.join()` 返回。
210210

211-
#### 线程休眠
211+
#### 说说线程休眠
212212

213213
`sleep(long millis)`:Thread 类中的静态方法,当一个执行中的线程 A 调用了 Thread 的 sleep 方法后,线程 A 会暂时让出指定时间的执行权。
214214

215215
但是线程 A 所拥有的监视器资源,比如锁,还是持有不让出的。指定的睡眠时间到了后该方法会正常返回,接着参与 CPU 的调度,获取到 CPU 资源后就可以继续运行。
216216

217-
#### 让出优先权
217+
#### 说说让出优先权
218218

219219
`yield()`:Thread 类中的静态方法,当一个线程调用 yield 方法时,实际是在暗示线程调度器,当前线程请求让出自己的 CPU,但是线程调度器可能会“装看不见”忽略这个暗示。
220220

221-
#### 线程中断
221+
#### 说说线程中断
222222

223223
推荐阅读:[interrupt 方法](https://www.cnblogs.com/myseries/p/10918819.html)
224224

@@ -2464,6 +2464,7 @@ handler = ThreadPoolExecutor.AbortPolicy()
24642464

24652465
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的小米春招同学 K 一面面试原题:说一下为什么项目中使用线程池,重要参数,举个例子说一下这些参数的变化
24662466
> 2. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的美团面经同学 16 暑期实习一面面试原题:线程池核心参数,线程池工作模型
2467+
> 3. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为 OD 面经同学 1 一面面试原题:线程池创建的几个核心参数?
24672468
24682469
### 48.线程池的拒绝策略有哪些?
24692470

docs/sidebar/sanfene/mysql.md

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ head:
3030
- 内连接(inner join):取得两张表中满足存在连接匹配关系的记录。
3131
- 外连接(outer join):不只取得两张表中满足存在连接匹配关系的记录,还包括某张表(或两张表)中不满足匹配关系的记录。
3232
- 交叉连接(cross join):显示两张表所有记录一一对应,没有匹配关系进行筛选,它是笛卡尔积在 SQL 中的实现,如果 A 表有 m 行,B 表有 n 行,那么 A 和 B 交叉连接的结果就有 m\*n 行。
33-
- 笛卡尔积:是数学中的一个概念,例如集合 A={a,b},集合 B={0,1,2},那么 A✖️B=`{<a,o>,<a,1>,<a,2>,<b,0>,<b,1>,<b,2>,}`
33+
- 笛卡尔积:是数学中的一个概念,例如集合 A={a,b},集合 B={0,1,2},那么 A✖️B=`{<a,0>,<a,1>,<a,2>,<b,0>,<b,1>,<b,2>,}`
3434

3535
### 2. MySQL 的内连接、左连接、右连接有什么区别?
3636

@@ -183,7 +183,7 @@ alter table blogs modify content text CHARACTER SET utf8mb4 COLLATE ut
183183

184184
三者都表示删除,但是三者有一些差别:
185185

186-
| delete | truncate | drop |
186+
| 区别 | delete | truncate | drop |
187187
| -------- | ---------------------------------------- | ------------------------------ | -------------------------------------------------- |
188188
| 类型 | 属于 DML | 属于 DDL | 属于 DDL |
189189
| 回滚 | 可回滚 | 不可回滚 | 不可回滚 |
@@ -421,11 +421,11 @@ SELECT * FROM table_name LIMIT 2, 8;
421421

422422
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的美团面经同学 16 暑期实习一面面试原题:MySQL 第 3-10 条记录怎么查?
423423
424-
### 73.用过哪些MySQL函数?(补充)
424+
### 73.用过哪些 MySQL 函数?(补充)
425425

426-
>2024年04月12日增补
426+
> 2024 年 04 月 12 日增补
427427
428-
MySQL支持很多内置函数,包括执行计算、格式转换、日期处理等。我说一些自己常用的(~~挑一些自己熟悉的~~)。
428+
MySQL 支持很多内置函数,包括执行计算、格式转换、日期处理等。我说一些自己常用的(~~挑一些自己熟悉的~~)。
429429

430430
#### 用过哪些字符串函数来处理文本?
431431

@@ -549,7 +549,7 @@ SELECT MAX(sales_amount) AS max_sale, MIN(sales_amount) AS min_sale FROM sales;
549549

550550
- `IF()`: 如果条件为真,则返回一个值;否则返回另一个值。
551551
- `CASE`: 根据一系列条件返回值。
552-
- `COALESCE()`: 返回参数列表中的第一个非NULL值
552+
- `COALESCE()`: 返回参数列表中的第一个非 NULL 值
553553

554554
```sql
555555
-- IF函数
@@ -584,8 +584,7 @@ SELECT CAST('2024-01-01' AS DATE) AS casted_date;
584584
SELECT CONVERT('123', SIGNED INTEGER) AS converted_number;
585585
```
586586

587-
588-
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为 OD 面经同学 1 一面面试原题:用过哪些MySQL函数?
587+
> 1. [Java 面试指南(付费)](https://javabetter.cn/zhishixingqiu/mianshi.html)收录的华为 OD 面经同学 1 一面面试原题:用过哪些 MySQL 函数?
589588
590589
## 数据库架构
591590

docs/sidebar/sanfene/os.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ GitHub 上标星 10000+ 的开源知识库《[二哥的 Java 进阶之路](https
429429

430430
![多级页表示意图](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/sidebar/sanfene/os-3021f22f-b9a3-49d9-9e80-6d3abaf5a61a.png)
431431

432-
### 25、什么是块表
432+
### 25、什么是快表
433433

434434
同样利用了`局部性原理`,即在⼀段时间内,整个程序的执⾏仅限于程序中的某⼀部分。相应地,执⾏所访问的存储空间也局限于某个内存区域。
435435

0 commit comments

Comments
 (0)