Skip to content

Commit 3dc6b21

Browse files
committed
update:java基础和集合部分的面试问题标注重点
1 parent 3973ee5 commit 3dc6b21

File tree

9 files changed

+64
-65
lines changed

9 files changed

+64
-65
lines changed

docs/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ footer: |-
1818

1919
## 关于网站
2020

21-
JavaGuide 已经持续维护 6 年多了,累计提交了 **5600+** commit ,共有 **550+** 多位贡献者共同参与维护和完善。真心希望能够把这个项目做好,真正能够帮助到有需要的朋友!
21+
JavaGuide 已经持续维护 6 年多了,累计提交了接近 **6000** commit ,共有 **570+** 多位贡献者共同参与维护和完善。真心希望能够把这个项目做好,真正能够帮助到有需要的朋友!
2222

2323
如果觉得 JavaGuide 的内容对你有帮助的话,还请点个免费的 Star(绝不强制点 Star,觉得内容不错有收获再点赞就好),这是对我最大的鼓励,感谢各位一路同行,共勉!传送门:[GitHub](https://github.com/Snailclimb/JavaGuide) | [Gitee](https://gitee.com/SnailClimb/JavaGuide)
2424

docs/cs-basics/operating-system/linux-intro.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -361,7 +361,7 @@ Linux 系统是一个多用户多任务的分时操作系统,任何一个要
361361
### 其他
362362

363363
- `sudo + 其他命令`:以系统管理者的身份执行指令,也就是说,经由 sudo 所执行的指令就好像是 root 亲自执行。
364-
- `grep 要搜索的字符串 要搜索的文件 --color`:搜索命令,--color 代表高亮显示
364+
- `grep [选项] "搜索内容" 文件路径`:非常强大且常用的文本搜索命令,它可以根据指定的字符串或正则表达式,在文件或命令输出中进行匹配查找,适用于日志分析、文本过滤、快速定位等多种场景。示例:忽略大小写搜索 syslog 中所有包含 error 的行:`grep -i "error" /var/log/syslog`,查找所有与 java 相关的进程:`ps -ef | grep "java"`
365365
- `kill -9 进程的pid`:杀死进程(-9 表示强制终止)先用 ps 查找进程,然后用 kill 杀掉。
366366
- `shutdown``shutdown -h now`:指定现在立即关机;`shutdown +5 "System will shutdown after 5 minutes"`:指定 5 分钟后关机,同时送出警告信息给登入用户。
367367
- `reboot``reboot`:重开机。`reboot -w`:做个重开机的模拟(只有纪录并不会真的重开机)。

docs/java/basis/java-basic-questions-01.md

Lines changed: 16 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ head:
4444

4545
除了 Java SE 和 Java EE,还有一个 Java ME(Java Platform,Micro Edition)。Java ME 是 Java 的微型版本,主要用于开发嵌入式消费电子设备的应用程序,例如手机、PDA、机顶盒、冰箱、空调等。Java ME 无需重点关注,知道有这个东西就好了,现在已经用不上了。
4646

47-
### JVM vs JDK vs JRE
47+
### ⭐️JVM vs JDK vs JRE
4848

4949
#### JVM
5050

@@ -87,7 +87,7 @@ JRE 是运行已编译 Java 程序所需的环境,主要包含以下两个部
8787

8888
定制的、模块化的 Java 运行时映像有助于简化 Java 应用的部署和节省内存并增强安全性和可维护性。这对于满足现代应用程序架构的需求,如虚拟化、容器化、微服务和云原生开发,是非常重要的。
8989

90-
### 什么是字节码?采用字节码的好处是什么?
90+
### ⭐️什么是字节码?采用字节码的好处是什么?
9191

9292
在 Java 中,JVM 可以理解的代码就叫做字节码(即扩展名为 `.class` 的文件),它不面向任何特定的处理器,只面向虚拟机。Java 语言通过字节码的方式,在一定程度上解决了传统解释型语言执行效率低的问题,同时又保留了解释型语言可移植的特点。所以, Java 程序运行时相对来说还是高效的(不过,和 C、 C++,Rust,Go 等语言还是有一定差距的),而且,由于字节码并不针对一种特定的机器,因此,Java 程序无须重新编译便可在多种不同操作系统的计算机上运行。
9393

@@ -114,7 +114,7 @@ JDK、JRE、JVM、JIT 这四者的关系如下图所示。
114114

115115
![JVM 的大致结构模型](https://oss.javaguide.cn/github/javaguide/java/basis/jvm-rough-structure-model.png)
116116

117-
### 为什么说 Java 语言“编译与解释并存”?
117+
### ⭐️为什么说 Java 语言“编译与解释并存”?
118118

119119
其实这个问题我们讲字节码的时候已经提到过,因为比较重要,所以我们这里再提一下。
120120

@@ -282,7 +282,7 @@ Java 中的注释有三种:
282282
283283
官方文档:[https://docs.oracle.com/javase/tutorial/java/nutsandbolts/\_keywords.html](https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html)
284284
285-
### 自增自减运算符
285+
### ⭐️自增自减运算符
286286
287287
在写代码的过程中,常见的一种情况是需要某个整数类型变量增加 1 或减少 1Java 提供了自增运算符 (`++`) 和自减运算符 (`--`) 来简化这种操作。
288288
@@ -305,7 +305,7 @@ int e = --d;
305305
306306
答案:`a = 11` 、`b = 9` 、 `c = 10` 、 `d = 10` 、 `e = 10`。
307307
308-
### 移位运算符
308+
### ⭐️移位运算符
309309
310310
移位运算符是最基本的运算符之一,几乎每种编程语言都包含这一运算符。移位操作中,被操作的数据被视为二进制数,移位就是将其向左或向右移动若干位的运算。
311311
@@ -442,7 +442,7 @@ xixi
442442
haha
443443
```
444444
445-
## 基本数据类型
445+
## ⭐️基本数据类型
446446
447447
### Java 中的几种基本数据类型了解么?
448448
@@ -736,7 +736,7 @@ System.out.println(l + 1 == Long.MIN_VALUE); // true
736736
737737
## 变量
738738
739-
### 成员变量与局部变量的区别
739+
### ⭐️成员变量与局部变量的区别
740740
741741
- **语法形式**:从语法形式上看,成员变量是属于类的,而局部变量是在代码块或方法中定义的变量或是方法的参数;成员变量可以被 `public`,`private`,`static` 等修饰符所修饰,而局部变量不能被访问控制修饰符及 `static` 所修饰;但是,成员变量和局部变量都能被 `final` 所修饰。
742742
- **存储方式**:从变量在内存中的存储方式来看,如果成员变量是使用 `static` 修饰的,那么这个成员变量是属于类的,如果没有使用 `static` 修饰,这个成员变量是属于实例的。而对象存在于堆内存,局部变量则存在于栈内存。
@@ -914,7 +914,7 @@ public class Example {
914914
}
915915
```
916916
917-
### 静态方法和实例方法有何不同
917+
### ⭐️静态方法和实例方法有何不同
918918
919919
**1、调用方式**
920920
@@ -947,7 +947,7 @@ public class Person {
947947
948948
静态方法在访问本类的成员时,只允许访问静态成员(即静态成员变量和静态方法),不允许访问实例成员(即实例成员变量和实例方法),而实例方法不存在这个限制。
949949
950-
### 重载和重写有什么区别
950+
### ⭐️重载和重写有什么区别
951951
952952
> 重载就是同样的一个方法能够根据输入数据的不同,做出不同的处理
953953
>
@@ -984,14 +984,13 @@ public class Person {
984984
985985
综上:**重写就是子类对父类方法的重新改造,外部样子不能改变,内部逻辑可以改变。**
986986
987-
| 区别点 | 重载方法 | 重写方法 |
988-
| :--------- | :------- | :--------------------------------------------------------------- |
989-
| 发生范围 | 同一个类 | 子类 |
990-
| 参数列表 | 必须修改 | 一定不能修改 |
991-
| 返回类型 | 可修改 | 子类方法返回值类型应比父类方法返回值类型更小或相等 |
992-
| 异常 | 可修改 | 子类方法声明抛出的异常类应比父类方法声明抛出的异常类更小或相等; |
993-
| 访问修饰符 | 可修改 | 一定不能做更严格的限制(可以降低限制) |
994-
| 发生阶段 | 编译期 | 运行期 |
987+
| 区别点 | 重载 (Overloading) | 重写 (Overriding) |
988+
| -------------- | ------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------- |
989+
| **发生范围** | 同一个类中。 | 父类与子类之间(存在继承关系)。 |
990+
| **方法签名** | 方法名**必须相同**,但**参数列表必须不同**(参数的类型、个数或顺序至少有一项不同)。 | 方法名、参数列表**必须完全相同**|
991+
| **返回类型** | 与返回值类型**无关**,可以任意修改。 | 子类方法的返回类型必须与父类方法的返回类型**相同**,或者是其**子类**|
992+
| **访问修饰符** | 与访问修饰符**无关**,可以任意修改。 | 子类方法的访问权限**不能低于**父类方法的访问权限。(public > protected > default > private|
993+
| **绑定时期** | 编译时绑定或称静态绑定 | 运行时绑定 (Run-time Binding) 或称动态绑定 |
995994
996995
**方法的重写要遵循“两同两小一大”**(以下内容摘录自《疯狂 Java 讲义》,[issue#892](https://github.com/Snailclimb/JavaGuide/issues/892) ):
997996

docs/java/basis/java-basic-questions-02.md

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ head:
1616

1717
## 面向对象基础
1818

19-
### 面向对象和面向过程的区别
19+
### ⭐️面向对象和面向过程的区别
2020

2121
面向过程编程(Procedural-Oriented Programming,POP)和面向对象编程(Object-Oriented Programming,OOP)是两种常见的编程范式,两者的主要区别在于解决问题的方式不同:
2222

@@ -104,7 +104,7 @@ new 运算符,new 创建对象实例(对象实例在堆内存中),对象
104104
- 一个对象引用可以指向 0 个或 1 个对象(一根绳子可以不系气球,也可以系一个气球);
105105
- 一个对象可以有 n 个引用指向它(可以用 n 条绳子系住一个气球)。
106106

107-
### 对象的相等和引用相等的区别
107+
### ⭐️对象的相等和引用相等的区别
108108

109109
- 对象的相等一般比较的是内存中存放的内容是否相等。
110110
- 引用相等一般比较的是他们指向的内存地址是否相等。
@@ -156,7 +156,7 @@ true
156156

157157
构造方法**不能被重写(override)**,但**可以被重载(overload)**。因此,一个类中可以有多个构造方法,这些构造方法可以具有不同的参数列表,以提供不同的对象初始化方式。
158158

159-
### 面向对象三大特征
159+
### ⭐️面向对象三大特征
160160

161161
#### 封装
162162

@@ -210,7 +210,7 @@ public class Student {
210210
- 多态不能调用“只在子类存在但在父类不存在”的方法;
211211
- 如果子类重写了父类的方法,真正执行的是子类重写的方法,如果子类没有重写父类的方法,执行的是父类的方法。
212212

213-
### 接口和抽象类有什么共同点和区别
213+
### ⭐️接口和抽象类有什么共同点和区别
214214

215215
#### 接口和抽象类的共同点
216216

@@ -363,7 +363,7 @@ System.out.println(person1.getAddress() == person1Copy.getAddress());
363363

364364
![shallow&deep-copy](https://oss.javaguide.cn/github/javaguide/java/basis/shallow&deep-copy.png)
365365

366-
## Object
366+
## ⭐️Object
367367

368368
### Object 类的常见方法有哪些?
369369

@@ -551,7 +551,7 @@ public native int hashCode();
551551

552552
## String
553553

554-
### String、StringBuffer、StringBuilder 的区别?
554+
### ⭐️String、StringBuffer、StringBuilder 的区别?
555555

556556
**可变性**
557557

@@ -589,7 +589,7 @@ abstract class AbstractStringBuilder implements Appendable, CharSequence {
589589
- 单线程操作字符串缓冲区下操作大量数据: 适用 `StringBuilder`
590590
- 多线程操作字符串缓冲区下操作大量数据: 适用 `StringBuffer`
591591

592-
### String 为什么是不可变的?
592+
### ⭐️String 为什么是不可变的?
593593

594594
`String` 类中使用 `final` 关键字修饰字符数组来保存字符串,~~所以`String` 对象是不可变的。~~
595595

@@ -636,7 +636,7 @@ public final class String implements java.io.Serializable, Comparable<String>, C
636636
>
637637
> 这是官方的介绍:<https://openjdk.java.net/jeps/254> 。
638638
639-
### 字符串拼接用+” 还是 StringBuilder?
639+
### ⭐️字符串拼接用+” 还是 StringBuilder?
640640
641641
Java 语言本身并不支持运算符重载,“+”和“+=”是专门为 String 类重载过的运算符,也是 Java 中仅有的两个重载过的运算符。
642642
@@ -689,7 +689,7 @@ System.out.println(s);
689689
690690
`String` 中的 `equals` 方法是被重写过的,比较的是 String 字符串的值是否相等。 `Object` 的 `equals` 方法是比较的对象的内存地址。
691691
692-
### 字符串常量池的作用了解吗
692+
### ⭐️字符串常量池的作用了解吗
693693
694694
**字符串常量池**JVM 为了提升性能和减少内存消耗针对字符串(String 类)专门开辟的一块区域,主要目的是为了避免字符串的重复创建。
695695
@@ -704,7 +704,7 @@ System.out.println(aa==bb); // true
704704
705705
更多关于字符串常量池的介绍可以看一下 [Java 内存区域详解](https://javaguide.cn/java/jvm/memory-area.html) 这篇文章。
706706
707-
### String s1 = new String("abc");这句话创建了几个字符串对象?
707+
### ⭐️String s1 = new String("abc");这句话创建了几个字符串对象?
708708
709709
先说答案:会创建 12 个字符串对象。
710710

docs/java/basis/java-basic-questions-03.md

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ head:
2727
- **`Exception`** :程序本身可以处理的异常,可以通过 `catch` 来进行捕获。`Exception` 又可以分为 Checked Exception (受检查异常,必须处理) 和 Unchecked Exception (不受检查异常,可以不处理)。
2828
- **`Error`**`Error` 属于程序无法处理的错误 ,~~我们没办法通过 `catch` 来进行捕获~~不建议通过`catch`捕获 。例如 Java 虚拟机运行错误(`Virtual MachineError`)、虚拟机内存不够错误(`OutOfMemoryError`)、类定义错误(`NoClassDefFoundError`)等 。这些异常发生时,Java 虚拟机(JVM)一般会选择线程终止。
2929

30-
### Checked Exception 和 Unchecked Exception 有什么区别?
30+
### ⭐️Checked Exception 和 Unchecked Exception 有什么区别?
3131

3232
**Checked Exception** 即 受检查异常 ,Java 代码在编译过程中,如果受检查异常没有被 `catch`或者`throws` 关键字处理的话,就没办法通过编译。
3333

@@ -205,7 +205,7 @@ catch (IOException e) {
205205
}
206206
```
207207

208-
### 异常使用有哪些需要注意的地方
208+
### ⭐️异常使用有哪些需要注意的地方
209209

210210
- 不要把异常定义为静态变量,因为这样会导致异常栈信息错乱。每次手动抛出异常,我们都需要手动 new 一个异常对象抛出。
211211
- 抛出的异常信息一定要有意义。
@@ -317,9 +317,9 @@ printArray( stringArray );
317317
- 构建集合工具类(参考 `Collections` 中的 `sort`, `binarySearch` 方法)。
318318
- ……
319319

320-
## 反射
320+
## ⭐️反射
321321

322-
关于反射的详细解读,请看这篇文章 [Java 反射机制详解](./reflection.md)
322+
关于反射的详细解读,请看这篇文章 [Java 反射机制详解](https://javaguide.cn/java/basis/reflection.html)
323323

324324
### 什么是反射?
325325

@@ -413,9 +413,9 @@ JDK 提供了很多内置的注解(比如 `@Override`、`@Deprecated`),同
413413
- **编译期直接扫描**:编译器在编译 Java 代码的时候扫描对应的注解并处理,比如某个方法使用`@Override` 注解,编译器在编译的时候就会检测当前的方法是否重写了父类对应的方法。
414414
- **运行期通过反射处理**:像框架中自带的注解(比如 Spring 框架的 `@Value``@Component`)都是通过反射来进行处理的。
415415

416-
## SPI
416+
## ⭐️SPI
417417

418-
关于 SPI 的详细解读,请看这篇文章 [Java SPI 机制详解](./spi.md)
418+
关于 SPI 的详细解读,请看这篇文章 [Java SPI 机制详解](https://javaguide.cn/java/basis/spi.html)
419419

420420
### 何谓 SPI?
421421

@@ -449,9 +449,9 @@ SPI 将服务接口和具体的服务实现分离开来,将服务调用方和
449449
- 需要遍历加载所有的实现类,不能做到按需加载,这样效率还是相对较低的。
450450
- 当多个 `ServiceLoader` 同时 `load` 时,会有并发问题。
451451

452-
## 序列化和反序列化
452+
## ⭐️序列化和反序列化
453453

454-
关于序列化和反序列化的详细解读,请看这篇文章 [Java 序列化详解](./serialization.md) ,里面涉及到的知识点和面试题更全面。
454+
关于序列化和反序列化的详细解读,请看这篇文章 [Java 序列化详解](https://javaguide.cn/java/basis/serialization.html) ,里面涉及到的知识点和面试题更全面。
455455

456456
### 什么是序列化?什么是反序列化?
457457

@@ -526,9 +526,9 @@ JDK 自带的序列化方式一般不会用 ,因为序列化效率低并且存
526526

527527
关于 I/O 的详细解读,请看下面这几篇文章,里面涉及到的知识点和面试题更全面。
528528

529-
- [Java IO 基础知识总结](../io/io-basis.md)
530-
- [Java IO 设计模式总结](../io/io-design-patterns.md)
531-
- [Java IO 模型详解](../io/io-model.md)
529+
- [Java IO 基础知识总结](https://javaguide.cn/java/io/io-basis.html)
530+
- [Java IO 设计模式总结](https://javaguide.cn/java/io/io-design-patterns.html)
531+
- [Java IO 模型详解](https://javaguide.cn/java/io/io-model.html)
532532

533533
### Java IO 流了解吗?
534534

@@ -550,11 +550,11 @@ Java IO 流的 40 多个类都是从如下 4 个抽象类基类中派生出来
550550

551551
### Java IO 中的设计模式有哪些?
552552

553-
参考答案:[Java IO 设计模式总结](../io/io-design-patterns.md)
553+
参考答案:[Java IO 设计模式总结](https://javaguide.cn/java/io/io-design-patterns.html)
554554

555555
### BIO、NIO 和 AIO 的区别?
556556

557-
参考答案:[Java IO 模型详解](../io/io-model.md)
557+
参考答案:[Java IO 模型详解](https://javaguide.cn/java/io/io-model.html)
558558

559559
## 语法糖
560560

0 commit comments

Comments
 (0)