@@ -137,11 +137,21 @@ JDK、JRE、JVM、JIT 这四者的关系如下图所示。
137137
138138JDK 9 引入了一种新的编译模式 ** AOT(Ahead of Time Compilation)** 。和 JIT 不同的是,这种编译模式会在程序被执行前就将其编译成机器码,属于静态编译(C、 C++,Rust,Go 等语言就是静态编译)。AOT 避免了 JIT 预热等各方面的开销,可以提高 Java 程序的启动速度,避免预热时间长。并且,AOT 还能减少内存占用和增强 Java 程序的安全性(AOT 编译后的代码不容易被反编译和修改),特别适合云原生场景。
139139
140- ** JIT 与 AOT 两者的关键指标对比** :
140+ ** JIT 与 AOT 两者的关键指标对比** :
141+
142+ | 对比维度 | JIT(即时编译) | AOT(提前编译) |
143+ | ---------------- | ------------------ | ---------------------------- |
144+ | ** 编译时机** | 运行时编译 | 运行前编译 |
145+ | ** 启动速度** | 较慢(需要预热) | 快(无需预热) |
146+ | ** 峰值性能** | 更高(运行时优化) | 较低(缺少运行时信息) |
147+ | ** 内存占用** | 较高 | 较低 |
148+ | ** 打包体积** | 较小 | 较大(包含机器码) |
149+ | ** 动态特性支持** | 完全支持 | 受限(反射、动态代理等) |
150+ | ** 适用场景** | 长时间运行的服务 | 云原生、Serverless、CLI 工具 |
141151
142152<img src =" https://oss.javaguide.cn/github/javaguide/java/basis/jit-vs-aot.png " alt =" JIT vs AOT " style =" zoom : 25% ;" />
143153
144- 可以看出,AOT 的主要优势在于启动时间、内存占用和打包体积。 JIT 的主要优势在于具备更高的极限处理能力,可以降低请求的最大延迟。
154+ 可以看出,** AOT 的主要优势在于启动时间、内存占用和打包体积** 。 ** JIT 的主要优势在于具备更高的极限处理能力** ,可以降低请求的最大延迟。
145155
146156提到 AOT 就不得不提 [ GraalVM] ( https://www.graalvm.org/ ) 了!GraalVM 是一种高性能的 JDK(完整的 JDK 发行版本),它可以运行 Java 和其他 JVM 语言,以及 JavaScript、Python 等非 JVM 语言。 GraalVM 不仅能提供 AOT 编译,还能提供 JIT 编译。感兴趣的同学,可以去看看 GraalVM 的官方文档:< https://www.graalvm.org/latest/docs/ > 。如果觉得官方文档看着比较难理解的话,也可以找一些文章来看看,比如:
147157
@@ -291,6 +301,29 @@ Java 中的注释有三种:
291301
292302为了方便记忆,可以使用下面的口诀:** 符号在前就先加/ 减,符号在后就后加/ 减** 。
293303
304+ ```mermaid
305+ flowchart LR
306+ subgraph Prefix [" 前缀形式 ++a / --a" ]
307+ direction TB
308+ P1 [" 第一步:变量自增/自减" ] -- > P2 [" 第二步:使用新值参与运算" ]
309+ P3 [" 示例:b = ++a<br/>先 a=a+1,再 b=a" ]
310+ end
311+
312+ subgraph Suffix [" 后缀形式 a++ / a--" ]
313+ direction TB
314+ S1 [" 第一步:使用当前值参与运算" ] -- > S2 [" 第二步:变量自增/自减" ]
315+ S3 [" 示例:b = a++<br/>先 b=a,再 a=a+1" ]
316+ end
317+
318+ classDef prefix fill: #4CA497,stroke: #333 ,color: #fff
319+ classDef suffix fill: #00838F,stroke: #333 ,color: #fff
320+ classDef example fill: #E99151 ,stroke: #333 ,color: #333
321+
322+ class P1 ,P2 prefix
323+ class S1 ,S2 suffix
324+ class P3 ,S3 example
325+ ```
326+
294327下面来看一个考察自增自减运算符的高频笔试题:执行下面的代码后,`a` 、`b` 、 `c` 、`d`和`e`的值是?
295328
296329```java
@@ -335,6 +368,42 @@ static final int hash(Object key) {
335368
336369掌握最基本的移位运算符知识还是很有必要的,这不光可以帮助我们在代码中使用,还可以帮助我们理解源码中涉及到移位运算符的代码。
337370
371+ ```mermaid
372+ flowchart TB
373+ subgraph ShiftOps [" Java 三种移位运算符" ]
374+ direction TB
375+
376+ subgraph Left [" 左移 <<" ]
377+ L1 [" 操作:向左移动 n 位" ]
378+ L2 [" 规则:高位丢弃,低位补 0" ]
379+ L3 [" 效果:相当于 × 2^n" ]
380+ L4 [" 示例:8 << 2 = 32" ]
381+ end
382+
383+ subgraph Right [" 带符号右移 >>" ]
384+ R1 [" 操作:向右移动 n 位" ]
385+ R2 [" 规则:低位丢弃,高位补符号位" ]
386+ R3 [" 效果:相当于 ÷ 2^n" ]
387+ R4 [" 示例:-8 >> 2 = -2" ]
388+ end
389+
390+ subgraph URight [" 无符号右移 >>>" ]
391+ U1 [" 操作:向右移动 n 位" ]
392+ U2 [" 规则:低位丢弃,高位补 0" ]
393+ U3 [" 效果:逻辑右移" ]
394+ U4 [" 示例:-8 >>> 2 = 1073741822" ]
395+ end
396+ end
397+
398+ classDef left fill: #4CA497,stroke: #333 ,color: #fff
399+ classDef right fill: #00838F,stroke: #333 ,color: #fff
400+ classDef uright fill: #E99151 ,stroke: #333 ,color: #333
401+
402+ class L1 ,L2,L3,L4 left
403+ class R1 ,R2,R3,R4 right
404+ class U1 ,U2,U3,U4 uright
405+ ```
406+
338407Java 中有三种移位运算符:
339408
340409- `<<` :左移运算符,向左移若干位,高位丢弃,低位补零。`x << n`,相当于 x 乘以 2 的 n 次方(不溢出的情况下)。
@@ -398,6 +467,40 @@ System.out.println("左移 10 位后的数据对应的二进制字符 " + Intege
3984671. `return;`:直接使用 return 结束方法执行,用于没有返回值函数的方法
3994682. `return value;`:return 一个特定值,用于有返回值函数的方法
400469
470+ ```mermaid
471+ flowchart TB
472+ subgraph Method["方法体"]
473+ direction TB
474+ Start["方法开始"] --> Loop
475+
476+ subgraph Loop["循环体 for/while"]
477+ direction TB
478+ L1["循环条件判断"] -->|"满足"| L2["执行循环体"]
479+ L2 --> L3{{" 遇到关键字?" }}
480+ L3 -- > | " continue" | Continue [" 跳过本次<br/>继续下一次循环" ]
481+ L3 -- > | " break" | Break [" 跳出整个循环" ]
482+ L3 -- > | " 无" | L1
483+ Continue -- > L1
484+ end
485+
486+ Break -- > AfterLoop [" 循环后的代码" ]
487+ L1 -- > | " 不满足" | AfterLoop
488+ AfterLoop -- > L4 {{" 遇到 return?" }}
489+ L4 -- > | " 是" | Return [" 结束整个方法" ]
490+ L4 -- > | " 否" | End [" 方法正常结束" ]
491+ end
492+
493+ classDef start fill: #E99151 ,stroke: #333 ,color: #fff
494+ classDef loop fill: #4CA497,stroke: #333 ,color: #fff
495+ classDef decision fill: #00838F,stroke: #333 ,color: #fff
496+ classDef alert fill: #C44545 ,stroke: #333 ,color: #fff
497+
498+ class Start ,End start
499+ class L1 ,L2,AfterLoop loop
500+ class L3 ,L4 decision
501+ class Continue ,Break,Return alert
502+ ```
503+
401504思考一下:下列语句的运行结果是什么?
402505
403506```java
@@ -452,6 +555,35 @@ Java 中有 8 种基本数据类型,分别为:
452555- 1 种字符类型:`char `
453556- 1 种布尔型:`boolean `。
454557
558+ ```mermaid
559+ flowchart TB
560+ Root [" Java 8种基本数据类型" ] -- > Numeric [" 数字类型(6种)" ]
561+ Root -- > Char [" 字符类型" ]
562+ Root -- > Bool [" 布尔类型" ]
563+
564+ Numeric -- > IntType [" 整数型(4种)" ]
565+ Numeric -- > FloatType [" 浮点型(2种)" ]
566+
567+ IntType -- > byte [" byte<br/>8位" ]
568+ IntType -- > short [" short<br/>16位" ]
569+ IntType -- > int [" int<br/>32位" ]
570+ IntType -- > long [" long<br/>64位" ]
571+
572+ FloatType -- > float [" float<br/>32位" ]
573+ FloatType -- > double [" double<br/>64位" ]
574+
575+ Char -- > char [" char<br/>16位" ]
576+ Bool -- > boolean [" boolean<br/>1位" ]
577+
578+ classDef root fill: #E99151 ,stroke: #333 ,color: #fff
579+ classDef category fill: #00838F,stroke: #333 ,color: #fff
580+ classDef type fill: #4CA497,stroke: #333 ,color: #fff
581+
582+ class Root root
583+ class Numeric ,Char,Bool,IntType,FloatType category
584+ class byte ,short,int,long,float,double,char,boolean type
585+ ```
586+
455587这 8 种基本数据类型的默认值以及所占空间的大小如下:
456588
457589| 基本类型 | 位数 | 字节 | 默认值 | 取值范围 |
@@ -602,8 +734,33 @@ System.out.println(i1==i2);
602734
603735** 什么是自动拆装箱?**
604736
605- - ** 装箱** :将基本类型用它们对应的引用类型包装起来;
606- - ** 拆箱** :将包装类型转换为基本数据类型;
737+ - ** 装箱(Boxing )** :将基本类型用它们对应的引用类型包装起来;
738+ - ** 拆箱(Unboxing )** :将包装类型转换为基本数据类型;
739+
740+ ```mermaid
741+ flowchart LR
742+ subgraph Row [" 装箱与拆箱对比" ]
743+ direction LR
744+
745+ subgraph Unboxing [" 拆箱过程" ]
746+ direction LR
747+ D [" Integer obj" ] -- > | " 自动拆箱" | E [" obj.intValue()" ]
748+ E -- > F [" int 基本类型" ]
749+ end
750+
751+ subgraph Boxing [" 装箱过程" ]
752+ direction LR
753+ A [" int i = 10" ] -- > | " 自动装箱" | B [" Integer.valueOf(10)" ]
754+ B -- > C [" Integer 对象" ]
755+ end
756+ end
757+
758+ classDef core fill: #4CA497,stroke: #333 ,color: #fff
759+ classDef highlight fill: #E99151 ,stroke: #333 ,color: #fff
760+
761+ class A ,D core
762+ class C ,F highlight
763+ ```
607764
608765举例:
609766
0 commit comments