diff --git a/docs/src/array/array.md b/docs/src/array/array.md index 6ba3f550c..710018fd8 100644 --- a/docs/src/array/array.md +++ b/docs/src/array/array.md @@ -12,8 +12,6 @@ head: content: Java, 数组, 创建数组, 初始化数组, 数组操作 --- -# 4.1 数组 - “二哥,我看你公众号的一篇文章里提到,[ArrayList](https://javabetter.cn/collection/arraylist.html) 的内部是用数组实现的,我就对数组非常感兴趣,想深入地了解一下,今天终于到这个环节了,好期待呀!”三妹的语气里显得很兴奋。 “的确是的,看 ArrayList 的源码就一清二楚了。”我一边说,一边打开 Intellij IDEA,并找到了 ArrayList 的源码。 diff --git a/docs/src/array/double-array.md b/docs/src/array/double-array.md index 39dab3d3d..13faaaff1 100644 --- a/docs/src/array/double-array.md +++ b/docs/src/array/double-array.md @@ -12,8 +12,6 @@ head: content: Java, 二维数组, 创建二维数组, 初始化二维数组, 数组操作, 多维数组 --- -# 4.2 二维数组 - “二哥,今天我们简单过一下二维数组吧,挺简单的。”三妹放下手机对我说。 “好啊,本来不打算讲了,因为开发中用的其实不多,也很简单,就从一维到二维,也没啥可讲的,就简单聊聊吧。”我掐灭了手中的华子,长呼一口烟,飘过三妹的头顶,引起一阵轻微的咳嗽声(😂) diff --git a/docs/src/array/print.md b/docs/src/array/print.md index cbb37501c..53324a1ed 100644 --- a/docs/src/array/print.md +++ b/docs/src/array/print.md @@ -12,8 +12,6 @@ head: content: Java, 数组打印, 输出数组, Arrays.toString, Arrays.deepToString --- -# 4.3 打印数组 - “哥,[之前听你说,数组也是一个对象](https://javabetter.cn/array/array.html),但 Java 中并未明确的定义这样一个类。”看来三妹有在用心地学习。 “是的,因此数组也就没有机会覆盖 `Object.toString()` 方法。如果尝试直接打印数组的话,输出的结果并不是我们预期的结果。”我接着三妹的话继续说。 diff --git a/docs/src/basic-extra-meal/48-keywords.md b/docs/src/basic-extra-meal/48-keywords.md index 069fbf246..af73c7023 100644 --- a/docs/src/basic-extra-meal/48-keywords.md +++ b/docs/src/basic-extra-meal/48-keywords.md @@ -12,8 +12,6 @@ head: content: Java, 关键字, 保留字, 编程基础 --- -# 3.1 Java关键字和保留字 - “二哥,就[之前你给我展示的 Java 代码](https://javabetter.cn/overview/hello-world.html)中,有 public、static、void、main 等等,它们应该都是关键字吧?”三妹的脸上泛着甜甜的笑容,我想她在学习 Java 方面已经变得越来越自信了。 “是的,三妹。Java 中的关键字可不少呢!你一下子可能记不了那么多,不过,先保留个印象吧,对以后的学习会很有帮助。这些小代码都很简单,你可以照着瞧一瞧,感受一下。” diff --git a/docs/src/basic-extra-meal/annotation.md b/docs/src/basic-extra-meal/annotation.md index 9406f0847..afd8f34b5 100644 --- a/docs/src/basic-extra-meal/annotation.md +++ b/docs/src/basic-extra-meal/annotation.md @@ -12,8 +12,6 @@ head: content: Java,注解,annotation,java 注解,java annotation --- -# 5.20 Java注解 - “二哥,这节讲注解吗?”三妹问。 “是的。”我说,“注解是 Java 中非常重要的一部分,但经常被忽视也是真的。之所以这么说是因为我们更倾向成为一名注解的使用者而不是创建者。`@Override` 注解用过吧?[方法重写](https://javabetter.cn/basic-extra-meal/override-overload.html)的时候用到过。但你知道怎么自定义一个注解吗?” diff --git a/docs/src/basic-extra-meal/box.md b/docs/src/basic-extra-meal/box.md index 00ef7ab83..c6de6d292 100644 --- a/docs/src/basic-extra-meal/box.md +++ b/docs/src/basic-extra-meal/box.md @@ -13,8 +13,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,装箱,拆箱,包装类型,基本数据类型,自动装箱,自动拆箱 --- -# 13.3 拆箱和装箱 - “哥,听说 Java 的每个[基本数据类型](https://javabetter.cn/basic-grammar/basic-data-type.html)都对应了一个包装类型,比如说 int 的包装类型为 Integer,double 的包装类型为 Double,是这样吗?”从三妹这句话当中,能听得出来,她已经提前预习这块内容了。 “是的,三妹。”我接着三妹的问题回答说。 diff --git a/docs/src/basic-extra-meal/comparable-omparator.md b/docs/src/basic-extra-meal/comparable-omparator.md index 6d60e1041..4d2f7550c 100644 --- a/docs/src/basic-extra-meal/comparable-omparator.md +++ b/docs/src/basic-extra-meal/comparable-omparator.md @@ -12,8 +12,6 @@ head: content: java,Comparable和Comparator,java Comparable, java Comparator,Comparable Comparator --- -# 6.14 Comparable和Comparator的区别 - >在前面学习[优先级队列](https://javabetter.cn/collection/PriorityQueue.html)的时候,我们曾提到过 Comparable和Comparator,那这篇继续以面试官的角度去切入,一起来看。 那天,小二去马蜂窝面试,面试官老王一上来就甩给了他一道面试题:请问Comparable和Comparator有什么区别?小二差点笑出声,因为三年前,也就是 2021 年,他在《[二哥的Java进阶之路](https://javabetter.cn/basic-extra-meal/comparable-omparator.html)》上看到过这题😆。 diff --git a/docs/src/basic-extra-meal/deep-copy.md b/docs/src/basic-extra-meal/deep-copy.md index f2e983c23..bccc2c582 100644 --- a/docs/src/basic-extra-meal/deep-copy.md +++ b/docs/src/basic-extra-meal/deep-copy.md @@ -13,8 +13,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java,深拷贝,浅拷贝 --- -# 13.4 深入理解Java浅拷贝与深拷贝 - “哥,听说浅拷贝和深拷贝是 Java 面试中经常会被问到的一个问题,是这样吗?” “还真的是,而且了解浅拷贝和深拷贝的原理,对 [Java 是值传递还是引用传递](https://javabetter.cn/basic-extra-meal/pass-by-value.html)也会有更深的理解。”我肯定地回答。 diff --git a/docs/src/basic-extra-meal/enum.md b/docs/src/basic-extra-meal/enum.md index 08e894aa6..184bc8f43 100644 --- a/docs/src/basic-extra-meal/enum.md +++ b/docs/src/basic-extra-meal/enum.md @@ -12,8 +12,6 @@ head: content: Java,枚举,enum,java 枚举,java enum --- -# 5.21 Java枚举(enum) - “今天我们来学习枚举吧,三妹!”我说,“同学让你去她家玩了两天,感觉怎么样呀?” “心情放松了不少。”三妹说,“可以开始学 Java 了,二哥。” diff --git a/docs/src/basic-extra-meal/equals-hashcode.md b/docs/src/basic-extra-meal/equals-hashcode.md index 686cd0f78..6f60e47bb 100644 --- a/docs/src/basic-extra-meal/equals-hashcode.md +++ b/docs/src/basic-extra-meal/equals-hashcode.md @@ -12,8 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java,hashcode,equals --- -# 13.5 为什么重写equals的时候必须重写hashCode - “二哥,我在读《Effective Java》 的时候,第 11 条规约说重写 equals 的时候必须要重写 hashCode 方法,这是为什么呀?”三妹单刀直入地问。 “三妹啊,这个问题问得非常好,因为它也是面试中经常考的一个知识点。今天哥就带你来梳理一下。”我说。 diff --git a/docs/src/basic-extra-meal/fanshe.md b/docs/src/basic-extra-meal/fanshe.md index 8a3542074..d06dd216a 100644 --- a/docs/src/basic-extra-meal/fanshe.md +++ b/docs/src/basic-extra-meal/fanshe.md @@ -13,8 +13,6 @@ head: content: Java,java 反射, 运行时, 类, 对象, 方法, 字段, 反射,动态调用 --- -# 12.8 掌握 Java 反射 - “二哥,什么是反射呀?”三妹开门见山地问。 “要想知道什么是反射,就需要先来了解什么是‘正射’。”我笑着对三妹说,“一般情况下,我们在使用某个类之前已经确定它到底是个什么类了,拿到手就直接可以使用 `new` 关键字来调用构造方法进行初始化,之后使用这个类的对象来进行操作。” diff --git a/docs/src/basic-extra-meal/generic.md b/docs/src/basic-extra-meal/generic.md index af8af76e4..f1810c1e7 100644 --- a/docs/src/basic-extra-meal/generic.md +++ b/docs/src/basic-extra-meal/generic.md @@ -12,8 +12,6 @@ head: content: java,泛型,java 泛型,java generic --- -# 6.6 Java泛型,深入解析 - “二哥,为什么要设计泛型啊?”三妹开门见山地问。 “三妹啊,听哥慢慢给你讲啊。”我说。 diff --git a/docs/src/basic-extra-meal/hashcode.md b/docs/src/basic-extra-meal/hashcode.md index c811d9e37..4c0ffd461 100644 --- a/docs/src/basic-extra-meal/hashcode.md +++ b/docs/src/basic-extra-meal/hashcode.md @@ -13,8 +13,6 @@ head: content: java,hashcode,equals --- -# 13.5 Java hashCode方法解析 - 今天我们来谈谈 Java 中的 `hashCode()` 方法。众所周知,Java 是一门面向对象的编程语言,所有的类都会默认继承自 Object 类,而 Object 的中文意思就是“对象”。 Object 类中就包含了 `hashCode()` 方法: diff --git a/docs/src/basic-extra-meal/immutable.md b/docs/src/basic-extra-meal/immutable.md index 1e6727718..50e1bb1aa 100644 --- a/docs/src/basic-extra-meal/immutable.md +++ b/docs/src/basic-extra-meal/immutable.md @@ -12,8 +12,6 @@ head: content: Java,不可变对象,immutable --- -# 5.18 Java不可变对象 - “二哥,你能给我说说为什么 String 是 immutable 类(不可变对象)吗?我想研究它,想知道为什么它就不可变了,这种强烈的愿望就像想研究浩瀚的星空一样。但无奈自身功力有限,始终觉得雾里看花终隔一层。”三妹的这句话里满是彩虹屁的味道。 “既然三妹你说话这么好听,那我们就开始吧!”我愉快的心情就好像吃了两罐蜂蜜一样(😂)。 diff --git a/docs/src/basic-extra-meal/instanceof.md b/docs/src/basic-extra-meal/instanceof.md index e1e980a29..e6a58c709 100644 --- a/docs/src/basic-extra-meal/instanceof.md +++ b/docs/src/basic-extra-meal/instanceof.md @@ -12,8 +12,6 @@ head: content: Java,instanceof,instanceof关键字 --- -# 5.17 Java instanceof关键字 - “三妹,今天我们来过一个非常简单的知识点,instanceof关键字。” “用不着哥你来讲了,今天就换个形式,我来讲给你听。”三妹雄赳赳气昂昂地说。 diff --git a/docs/src/basic-extra-meal/int-cache.md b/docs/src/basic-extra-meal/int-cache.md index 0f6bc5df8..8a2b82cc2 100644 --- a/docs/src/basic-extra-meal/int-cache.md +++ b/docs/src/basic-extra-meal/int-cache.md @@ -12,8 +12,6 @@ head: content: Java, 基本数据类型, 缓存池, 内存优化, 缓存池原理, 缓存池应用, 缓存池实践 --- -# 3.5 基本数据类型缓存池 - “三妹,今天我们来补一个小的知识点:Java 基本数据类型缓存池。”我喝了一口枸杞泡的茶后对三妹说,“考你一个问题哈:`new Integer(18) 与 Integer.valueOf(18)` 的区别是什么?” “难道不一样吗?”三妹有点诧异。 diff --git a/docs/src/basic-extra-meal/java-naming.md b/docs/src/basic-extra-meal/java-naming.md index 17dcba925..5e3adbb79 100644 --- a/docs/src/basic-extra-meal/java-naming.md +++ b/docs/src/basic-extra-meal/java-naming.md @@ -13,8 +13,6 @@ head: content: Java,Java命名规范, 变量命名, 方法命名, 类命名, 接口命名, 代码风格, 代码质量 --- -# 13.1 Java命名规范 - “二哥,Java 中的命名约定都有哪些呢?”三妹的脸上泛着甜甜的笑容,她开始对接下来要学习的内容充满期待了,这正是我感到欣慰的地方。 “对于我们中国人来说,名字也是有讲究的,比如说我叫沉默王二,你就叫沉默王三,哈哈。”我笑着对三妹说。 diff --git a/docs/src/basic-extra-meal/java-unicode.md b/docs/src/basic-extra-meal/java-unicode.md index 12e6d5edb..cfaefbbb3 100644 --- a/docs/src/basic-extra-meal/java-unicode.md +++ b/docs/src/basic-extra-meal/java-unicode.md @@ -13,8 +13,6 @@ head: content: Java,中文乱码, 字符编码, ASCII, Unicode, UTF-8, GB2312, 解决乱码, 编码详解, 编码原理 --- -# 13.2 中文乱码及字符编码全攻略 - 就在昨天,我在[二哥的编程星球](https://javabetter.cn/zhishixingqiu/)里看到这样一张截图,有球友反馈说支付宝的理财页面出现了中文乱码,估计不少小伙伴和我一样,都惊呆了😮!阿里这种大厂还能出现这种低级错误? ![](https://cdn.tobebetterjavaer.com/stutymore/java-unicode-20230408135521.png) diff --git a/docs/src/basic-extra-meal/jdk9-char-byte-string.md b/docs/src/basic-extra-meal/jdk9-char-byte-string.md index 6b4049a73..79375d98c 100644 --- a/docs/src/basic-extra-meal/jdk9-char-byte-string.md +++ b/docs/src/basic-extra-meal/jdk9-char-byte-string.md @@ -12,8 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java,string,char,byte,java string 底层实现,java字符串源码,java string char,java string byte,java string char byte,java --- -# 4.11 String的底层实现为什么由char改成了byte? - “二哥,最近在我阅读 Java 11 的字符串源码,发现和 Java 8 的有很大不同。”三妹的脸上洋溢着青春的微笑😊,甜美地说道:“String 类的源码已经由 `char[]` 优化为了 `byte[]` 来存储字符串内容,为什么要这样做呢?” “开门见山地说,从 `char[]` 到 `byte[]`,最主要的目的是**节省字符串占用的内存空间**。内存占用减少带来的另外一个好处,就是 GC 次数也会减少。”我用右手的大拇指凑了一下眼镜解释道。 diff --git a/docs/src/basic-extra-meal/override-overload.md b/docs/src/basic-extra-meal/override-overload.md index 79a98855f..4bb385cd2 100644 --- a/docs/src/basic-extra-meal/override-overload.md +++ b/docs/src/basic-extra-meal/override-overload.md @@ -12,8 +12,6 @@ head: content: Java,方法重写,方法重载,Override,Overload,java 方法重载 方法重写,java Override Overload,java 方法重载,java 方法重写 --- -# 5.19 Java方法重写和方法重载 - 入冬的夜,总是来得特别的早。我静静地站在阳台,目光所及之处,不过是若隐若现的钢筋混凝土,还有那毫无情调的灯光。 “哥,别站在那发呆了。今天学啥啊,七点半我就要回学校了,留给你的时间不多了,你要抓紧哦。”三妹傲娇的声音一下子把我从游离的状态拉回到了现实。 diff --git a/docs/src/basic-extra-meal/pass-by-value.md b/docs/src/basic-extra-meal/pass-by-value.md index ceb6dcd75..735419166 100644 --- a/docs/src/basic-extra-meal/pass-by-value.md +++ b/docs/src/basic-extra-meal/pass-by-value.md @@ -13,7 +13,6 @@ head: content: Java, 参数传递, 值传递, 引用传递 --- -# 13.6 Java是值传递还是引用传递? “哥,说说 Java 到底是值传递还是引用传递吧?”三妹一脸的困惑,看得出来她被这个问题折磨得不轻。 diff --git a/docs/src/basic-extra-meal/true-generic.md b/docs/src/basic-extra-meal/true-generic.md index 65726c179..f9e17c1d1 100644 --- a/docs/src/basic-extra-meal/true-generic.md +++ b/docs/src/basic-extra-meal/true-generic.md @@ -13,7 +13,6 @@ head: content: Java, 泛型, 类型擦除 --- -# 12.7 Java为什么无法实现真正的泛型 “二哥,为啥 Java 不能实现真正的泛型啊?”三妹开门见山地问。 diff --git a/docs/src/basic-extra-meal/varables.md b/docs/src/basic-extra-meal/varables.md index 3fb730fc2..dd0b45073 100644 --- a/docs/src/basic-extra-meal/varables.md +++ b/docs/src/basic-extra-meal/varables.md @@ -12,7 +12,6 @@ head: content: java,可变参数 --- -# 5.5 Java可变参数 为了让铁粉们能白票到阿里云的服务器,我当了整整两天的客服,真正体验到了什么叫做“为人民群众谋福利”的不易和辛酸。正在我眼睛红肿打算要休息之际,三妹跑过来问:“Java 的可变参数究竟是怎么一回事?”我一下子又清醒了,我爱 Java,我爱传道解惑,也享受三妹的赞许(😂)。 diff --git a/docs/src/basic-grammar/basic-data-type.md b/docs/src/basic-grammar/basic-data-type.md index 45202d99a..8851ced6c 100644 --- a/docs/src/basic-grammar/basic-data-type.md +++ b/docs/src/basic-grammar/basic-data-type.md @@ -12,7 +12,6 @@ head: content: Java, 数据类型, 比特, 字节, 基本数据类型, 引用数据类型, 单精度, 双精度, int, char, 包装器类型, 堆, 栈, 内存模型, 类型转换 --- -# 3.3 Java 数据类型 “Java 是一种静态类型的编程语言,这意味着所有变量必须在使用之前声明好,也就是必须得先指定变量的类型和名称。”我吸了一口麦香可可奶茶后对三妹说。 diff --git a/docs/src/basic-grammar/basic-exercise.md b/docs/src/basic-grammar/basic-exercise.md index 486053cf9..2eb70dff2 100644 --- a/docs/src/basic-grammar/basic-exercise.md +++ b/docs/src/basic-grammar/basic-exercise.md @@ -12,7 +12,6 @@ head: content: Java, Java语法基础, 练习题 --- -# 3.8 Java语法基础练习题 ### 翻转整数 diff --git a/docs/src/basic-grammar/bigdecimal-biginteger.md b/docs/src/basic-grammar/bigdecimal-biginteger.md index e69de29bb..feb28ce83 100644 --- a/docs/src/basic-grammar/bigdecimal-biginteger.md +++ b/docs/src/basic-grammar/bigdecimal-biginteger.md @@ -0,0 +1,206 @@ +--- +title: BigDecimal,非常大的高精度浮点数 +shortTitle: 掌握BigDecimal +description: `BigDecimal`是`Java`中用于浮点数数值计算的类,其主要适合用于处理需要精确表示和运算的场景。 +author: 毅航 +category: + - 微信公众号 +--- + +`BigDecimal`是`Java`中用于浮点数数值计算的类,其主要适合用于处理需要精确表示和运算的场景。**「`BigDecimal`不仅能精确表示非常大的或非常小的数字,同时还提供任意精度的运算。其有效的解决了浮点数(`float`和`double`)在进行精确计算时可能出现的舍入误差问题。」** + +## BigDecimal简介 + +在处理金融、科学等领域的计算时,为了解决`double`或`float`在计算值存在的精度缺失问题`BigDecimal`应运而生。`BigDecimal`在设计之初**「皆在提供更高的精度和准确性,以确保浮点数运算的准确性」**。因此其具有如下特点: + +1. **「高精度」**:`BigDecimal`能够精确表示非常大的或非常小的数字,并且提供任意精度的运算。 +2. **「不可变性」**:`BigDecimal`对象是不可变的。一旦创建,数值就不会改变。所有的算术运算都会返回一个新的`BigDecimal`对象,而不会修改原来的对象。这种设计使得`BigDecimal`是线程安全的。 +3. **「丰富的运算方法」**:`BigDecimal`提供了丰富的算术运算方法,如`add`(加法)、`subtract`(减法)、`multiply`(乘法)和`divide`(除法),以及用于舍入、取整和比较的方法。 +4. **「灵活的舍入模式」**:提供多种舍入模式(如四舍五入、向上取整等),确保结果的精度和舍入行为可控。 + +总的来看,「`BigDecimal`通过其对象的不可变性,从而确保了线程安全;与此同时,其还并提供丰富的算术运算方法(如加法、减法、乘法、除法)和多种舍入模式(如四舍五入、向上取整等),从而满足精确数值计算的需求。」 + +## BigDecimal数据存储的秘密 + +对`BigDecimal`有了基础认识后,接下来我们便通过`Debug`的形式来看看`BigDecimal`内部究竟是如来实现数据的高精度的存储的。为此我们首先通过如下的语句来构建一个`BigDecimal`对象 + +```java +BigDecimal bigDecimal = new BigDecimal("3.1415926"); +``` + +运行代码进入`Idea`的`Debug`模式后,可以看到如下内容: + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin//zhangwbigdecimalxjqyljzjsj-d87c0e82-6ab7-479f-a5fb-6a1c863f5d76.jpg) + +不难发现,对于`BigDecimal`对象而言其内部有 **「`intVal、scal、precision、stringCache、initCompact`等五个重要属性。」**   进一步,翻开`BigDecimal`源码,可以看到这五个属性各自对应的类型: + +```java +public class BigDecimal extends Number implements Comparable { +      +     private final BigInteger intVal; + +     private final int scale;   +                                +     private transient int precision; + +     private transient String stringCache; + +    +     private final transient long intCompact; +``` + +具体来看,**「`intVal`为一个`BigInteger`对象,其主要用于保存超出基本类型的数值。」** 例如:对于`Long`数据类型来看,其最大类型为`0x7fffffffffffffff`即`9223372036854775807`。因此如下的赋值`BigDecimal bigDecimal = new BigDecimal("9223372036854775808")`其已然超出了`Java`中基础类型所能表示的范围,而此时在`bigDecimal`对象中,其内部的`intVal`如下所示,不难发现`9223372036854775808`被赋值给`intVal`。 + +![](http://cdn.tobebetterjavaer.com/tobebetterjavaer/images/nice-article/weixin//zhangwbigdecimalxjqyljzjsj-5d30da6f-c6a4-44cc-9919-8827d027269c.jpg) + +明白了`BigDecimal`中`intVal`属性的存储规则后,再来看其中的`scale、precision`所标示的含义。**「其中`scale`表示小数点后的位数而`precision`则代表`BigDecimal`中数据的总位数,即包括整数和小数部分。」** + +进一步,**「`BigDecimal`的`stringCache`属性则主要用于保存`BigDecimal`数据所转成的字符串信息,而`intCompact`则用于将`long`数值以内的数据转为基本数据类型`long`进行存储。」** + +(注:如果数据类型范围超过`long`所能表示的范围,则会将数据保存至`intVal`中) + +此外还要注意一点,如果是包含小数点的数据其会将其小数点去掉,进而保存其去掉小数点后的数据。例如`new BigDecimal("3.1415926")`在该`BigDecimal`对象中`intCompact = 31415926`。 + +## BigDecimal的最佳实践 + +知晓了`BigDecimal`内部对于`浮点`数据的存储原理后,接下来我们来谈一谈有关`BigDecimal`的几点最佳实践,以避免在使用`BigDecimal`时踩坑。 + +> ❝ +> +> 1.为了避免精度丢失,尽量使用`BigDecimal(String val)`构造方法或者  `BigDecimal.valueOf(double val)` +> +> ❞ + +如果使用`double` 类型的数据来构建一个 `BigDecimal` 对象时,其会出现精度丢失的问题。这主要是因为 `double` 类型本身在表示浮点数时存在精度限制。 + +具体来看,`double` 类型使用 `IEEE 754`标准的双精度浮点数格式,该格式在二进制表示中无法精确地表示所有十进制的小数。例如,十进制数 `0.1` 在二进制浮点数中是一个无限循环小数,只能近似表示为 `0.1000000000000000055511151231257827021181583404541015625`。而使用 `new BigDecimal(double)` 构造函数时`double`类型的数值的会将其近似值传递给 `BigDecimal`,进入导致精度丢失。例如: + +```java +double value = 0.1; +BigDecimal bd = new BigDecimal(value); +System.out.println(bd);  +``` + +上述代码最终会输出:`0.1000000000000000055511151231257827021181583404541015625`而我们所期待的 `BigDecimal` 实际为 `0.1`。因此为了避免构建`BigDecimal`时出现精度丢失的问题,**「推荐使用它的`BigDecimal(String val)`构造方法或者  `BigDecimal.valueOf(double val)` 静态方法来创建对象。」** + +> ❝ +> +> 2.使用 `BigDecimal`进行除法运算时,指明数据结果的精度 +> +> ❞ + +`BigDecimal` 在进行除法运算时,**「如果不指定截取的精度和舍入模式,当出现数据无法整除时,会出现 `ArithmeticException` 异常」**。例如 `1 / 3`时其会得到一个无限循环小数。这时如果没有明确指定精度和舍入方式,`BigDecimal` 将无法完成除法运算并抛出异常。 + +```java +public class BigDecimalDivisionExample { +     public static void main(String[] args) { +         BigDecimal num1 = new BigDecimal("1"); +         BigDecimal num2 = new BigDecimal("3"); +         BigDecimal result = num1.divide(num2); + } +``` + +在上述代码中,`num1 / num2`的结果为一个无限循环小数 `0.333...`。**「由于我们并未在代码中指定精度和舍入模式,所以当执行上述代码时如出现如下异常」**:`Exception: Non-terminating decimal expansion; no exact representable decimal result.` + +为了避免上述异常的发生,可以再执行`divide`显示的指定精度截取方式。具体方式如下:`num1.divide(num2,2, RoundingMode.HALF_UP);`在本例中对数据保留了两位小数,同时使用`RoundingMode.HALF_UP`四舍五入的截取方式。 + +事实上 `BigDecimal`除了外`RoundingMode.HALF_UP`的舍入方式外,还有如下的截取方式: + +- `RoundingMode.HALF_UP`:四舍五入,向上舍入。 +- `RoundingMode.HALF_DOWN`:四舍五入,向下舍入。 +- `RoundingMode.HALF_EVEN`:四舍五入,如果舍弃部分等于 0.5,则舍入到最接近的偶数。 + +> ❝ +> +> 3.根据业务需要,合理的使用`compareTo`和`equals` +> +> ❞ + +由于`BigDecimal` 内部对 `equals`方法逻辑进行了重写,这使得`equals`方法不仅比较数值部分,还比较标度。因此只有数值和标度都相同时`equals` 方法才会返回 `true`。例如: + +```java +public class BigDecimalComparison { +     public static void main(String[] args) { +         BigDecimal bd1 = new BigDecimal("1.0"); +         BigDecimal bd2 = new BigDecimal("1.00"); +          +         System.out.println(bd1.equals(bd2)); // 输出 false +     } + } +``` + +在这个例子中,`bd1 = 1.0`  `bd2 = 1.00` 两个数的数值部分代表的含义是完全相同的,但其精度却不同,此时如果使用`equals` 方法进行比较,则会返回 `false`。如果贸然使用`equals` 是很容易导致出现意料之外的结果。 + +为了保证数值的比较,`BigDecimal` 内部也对`compareTo` 方法进行了重写,使得`compareTo`方法只比较`BigDecimal`的数值部分而不考虑标度。**「因此如果两个 `BigDecimal`对象的数值相等,即使标度不同`compareTo` 方法也会认为它们相等。」** + +```java +public class BigDecimalComparison { +     public static void main(String[] args) { +         BigDecimal bd1 = new BigDecimal("1.0"); +         BigDecimal bd2 = new BigDecimal("1.00"); + +         System.out.println(bd1.compareTo(bd2)); //  +     } + } +``` + +在这个例子中最终的输出结果为`0`,即代表`bd1`和`bd2`相等。这主要是因为`bd1`和`bd2`的数值相等因此`compareTo` 方法返回 `0`。 + +因此对于为了避免不必要的混淆和错误,尽量遵循以下最佳实践: + +- **「明确比较目的」**:在使用 `BigDecimal` 进行比较时,首先明确你的比较目的是检查数值相等还是完全相等(包括标度)。如果仅比较数值,请使用 `compareTo` 方法。如果需要完全相等,请使用 `equals` 方法。 +- **「避免误解」**:理解 `BigDecimal` 的 `equals` 方法会考虑标度,而 `compareTo` 方法只比较数值。在常见的数值比较中,更推荐使用 `compareTo` 方法。 + +> ❝ +> +> 4.慎用`BigDecimal`的`toString`方法 +> +> ❞ + +`BigDecimal`内部对`toString`方法进行`重载`,这使得`BigDecimal` 的 `toString` 方法会自动去除尾随零,并且使用科学计数法表示非常大的或非常小的数值。例如: + +```java +public class BigDecimalToStringExample { +     public static void main(String[] args) { +         BigDecimal bd1 = new BigDecimal("123.4500"); +         BigDecimal bd2 = new BigDecimal("0.00012345"); + +         System.out.println(bd1.toString());  +         System.out.println(bd2.toString());  +     } + } +``` + +上述代码分别会输出`123.45、1.2345E-4`。其中`bd1` 的尾随零被去除,而 `bd2` 使用了科学计数法进行数据的表示。而为了避免这类问题的发生,可以使用 `BigDecimal` 的 `toPlainString` 方法。该方法不会去除尾随零,也不会使用科学计数法。 + +```java +import java.math.BigDecimal; + + public class BigDecimalToPlainStringExample { +     public static void main(String[] args) { +         BigDecimal bd1 = new BigDecimal("123.4500"); +         BigDecimal bd2 = new BigDecimal("0.00012345"); +          + +         System.out.println(bd1.toPlainString()); // 输出 123.4500 +         System.out.println(bd2.toPlainString()); // 输出 0.00012345 + +     } + } +``` + +不难看出,在这个例子中`toPlainString` 方法保留了尾随零,并且没有使用科学计数法,输出格式更加直观。 + +- **「`toString` 方法」**:自动去除尾随零,使用科学计数法表示非常大或非常小的数值。可能导致格式不符合预期。 +- **「`toPlainString` 方法」**:不会去除尾随零,不会使用科学计数法,适合需要保留原始数值格式的场景。 + +## 总结 + +本文主要对`BigDecimal`内部对于浮点数的存储规则进行分析,以加深读者对于`BigDecimal`的理解。同时整理了如下五条`BigDecimal`使用的最佳实践: + +1. 为了避免精度丢失,尽量使用`BigDecimal(String val)`构造方法或者  `BigDecimal.valueOf(double val)` ; +2. 使用 `BigDecimal`进行除法运算时,指明数据结果的精度; +3. 根据业务需要,合理的使用`compareTo`和`equals`; +4. 慎用`BigDecimal`的`toString`方法。 + +> 参考链接:[https://mp.weixin.qq.com/s/ShXkr9KKXsDBvmh5PlUgUA](https://mp.weixin.qq.com/s/ShXkr9KKXsDBvmh5PlUgUA),整理:沉默王二 diff --git a/docs/src/basic-grammar/flow-control.md b/docs/src/basic-grammar/flow-control.md index 4cda22cf3..1ce3157a8 100644 --- a/docs/src/basic-grammar/flow-control.md +++ b/docs/src/basic-grammar/flow-control.md @@ -12,7 +12,6 @@ head: content: Java, 流程控制语句, if, switch, while, for, 控制结构, 编程基础, 语法结构 --- -# 3.7 Java流程控制语句 “二哥,流程控制语句都有哪些呢?”三妹的脸上泛着甜甜的笑容,她开始对接下来要学习的内容充满期待了,这正是我感到欣慰的地方。 diff --git a/docs/src/basic-grammar/javadoc.md b/docs/src/basic-grammar/javadoc.md index 0f6577ec5..2bd584f81 100644 --- a/docs/src/basic-grammar/javadoc.md +++ b/docs/src/basic-grammar/javadoc.md @@ -12,7 +12,6 @@ head: content: Java, 注释, 单行注释, 多行注释, 文档注释 --- -# 3.2 Java注释 “二哥,Java 中的注释好像真没什么可讲的,我已经提前预习了,不过是单行注释,多行注释,还有文档注释。”三妹的脸上泛着甜甜的笑容,她竟然提前预习了接下来要学习的知识,有一种“士别三日,当刮目相看”的感觉。 diff --git a/docs/src/basic-grammar/operator.md b/docs/src/basic-grammar/operator.md index 4387143a3..84cf8d6fe 100644 --- a/docs/src/basic-grammar/operator.md +++ b/docs/src/basic-grammar/operator.md @@ -12,8 +12,6 @@ head: content: Java, 运算符, 算术运算符, 关系运算符, 逻辑运算符, 位运算符, 赋值运算符, 运算符用法, 运算符优先级 --- -# 3.6 Java运算符 - “二哥,让我盲猜一下哈,运算符是不是指的就是加减乘除啊?”三妹的脸上泛着甜甜的笑容,我想她一定对提出的问题很有自信。 “是的,三妹。运算符在 Java 中占据着重要的位置,对程序的执行有着很大的帮助。除了常见的加减乘除,还有许多其他类型的运算符,来看下面这张思维导图。” diff --git a/docs/src/basic-grammar/type-cast.md b/docs/src/basic-grammar/type-cast.md index 39bde1fbf..7cc46d7a1 100644 --- a/docs/src/basic-grammar/type-cast.md +++ b/docs/src/basic-grammar/type-cast.md @@ -12,7 +12,6 @@ head: content: Java, 数据类型转换, 强制类型转换, 自动类型转换 --- -# 3.4 Java数据类型转换 “三妹,今天我们来聊聊 Java 中的数据类型转换。”我开门见山地对三妹说。 diff --git a/docs/src/collection/PriorityQueue.md b/docs/src/collection/PriorityQueue.md index 302bcefd9..1733d6950 100644 --- a/docs/src/collection/PriorityQueue.md +++ b/docs/src/collection/PriorityQueue.md @@ -12,7 +12,6 @@ head: content: Java,优先级队列,PriorityQueue,java 优先级队列,java PriorityQueue, 源码分析, 实现原理 --- -# 6.9 优先级队列PriorityQueue详解 >继续有请王老师,来上台给大家讲讲优先级队列 PriorityQueue。 diff --git a/docs/src/collection/WeakHashMap.md b/docs/src/collection/WeakHashMap.md index d7d67b454..10ccc6373 100644 --- a/docs/src/collection/WeakHashMap.md +++ b/docs/src/collection/WeakHashMap.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,WeakHashMap --- -# 6.11 详解WeakHashMap 在Java中,我们一般都会使用到Map,比如[HashMap](https://javabetter.cn/collection/hashmap.html)这样的具体实现。更高级一点,我们可能会使用WeakHashMap。 diff --git a/docs/src/collection/arraydeque.md b/docs/src/collection/arraydeque.md index 2b3f27d93..a158b55f2 100644 --- a/docs/src/collection/arraydeque.md +++ b/docs/src/collection/arraydeque.md @@ -12,8 +12,6 @@ head: content: Java,ArrayDeque,堆,队列,java 双端队列,java ArrayDeque,源码分析, 实现原理 --- -# 6.8 双端队列ArrayDeque详解 - >好,我们这节继续有请王老师上台来给大家讲 ArrayDeque,鼓掌欢迎了👏🏻。 Java 里有一个叫做*Stack*的类,却没有叫做*Queue*的类(它只是个接口名字,和类还不一样)。 diff --git a/docs/src/collection/arraylist.md b/docs/src/collection/arraylist.md index 453908f14..424127fc4 100644 --- a/docs/src/collection/arraylist.md +++ b/docs/src/collection/arraylist.md @@ -12,8 +12,6 @@ head: content: Java,ArrayList,ArrayList源码,源码分析, java arraylist --- -# 6.3 ArrayList详解(附源码) - “二哥,听说今天我们开讲 ArrayList 了?好期待哦!”三妹明知故问,这个托配合得依然天衣无缝。 “是的呀,三妹。”我肯定地点了点头,继续说道,“ArrayList 可以称得上是集合框架方面最常用的类了,可以和 HashMap 一较高下。” diff --git a/docs/src/collection/comparable-omparator.md b/docs/src/collection/comparable-omparator.md index 28d1f19d4..2f583c190 100644 --- a/docs/src/collection/comparable-omparator.md +++ b/docs/src/collection/comparable-omparator.md @@ -12,8 +12,6 @@ head: content: java,Comparable和Comparator,java Comparable, java Comparator,Comparable Comparator --- -# 6.10 Comparable和Comparator的区别 - >在前面学习[优先级队列](https://javabetter.cn/collection/PriorityQueue.html)的时候,我们曾提到过 Comparable和Comparator,那这篇继续以面试官的角度去切入,一起来看。 那天,小二去马蜂窝面试,面试官老王一上来就甩给了他一道面试题:请问Comparable和Comparator有什么区别?小二差点笑出声,因为三年前,也就是 2021 年,他在《[二哥的Java进阶之路](https://javabetter.cn/basic-extra-meal/comparable-omparator.html)》上看到过这题😆。 diff --git a/docs/src/collection/fail-fast.md b/docs/src/collection/fail-fast.md index 9b5dcb34f..61635d731 100644 --- a/docs/src/collection/fail-fast.md +++ b/docs/src/collection/fail-fast.md @@ -12,7 +12,6 @@ head: content: Java,fail-fast,java foreach 删除元素,foreach 循环, 删除操作, 并发修改异常 --- -# 6.15 Java foreach 循环陷阱 >这篇文章同样采用小二去面试的形式,给大家换个胃口。 diff --git a/docs/src/collection/gailan.md b/docs/src/collection/gailan.md index 99c724e6f..6375eca78 100644 --- a/docs/src/collection/gailan.md +++ b/docs/src/collection/gailan.md @@ -12,7 +12,6 @@ head: content: Java,集合框架,容器,java 集合框架,java集合,java容器, List, Set, Map, 队列 --- -# 6.1 List、Set、Map、队列全面解析 眼瞅着三妹的王者荣耀杀得正嗨,我趁机喊到:“别打了,三妹,我们来一起学习 Java 的集合框架吧。” diff --git a/docs/src/collection/generic.md b/docs/src/collection/generic.md index ded1b2a26..62dca411d 100644 --- a/docs/src/collection/generic.md +++ b/docs/src/collection/generic.md @@ -12,8 +12,6 @@ head: content: java,泛型,java 泛型,java generic --- -# 6.13 Java泛型,深入解析 - “二哥,为什么要设计泛型啊?”三妹开门见山地问。 “三妹啊,听哥慢慢给你讲啊。”我说。 diff --git a/docs/src/collection/hashmap.md b/docs/src/collection/hashmap.md index 7b056f251..e2f1316e7 100644 --- a/docs/src/collection/hashmap.md +++ b/docs/src/collection/hashmap.md @@ -13,7 +13,6 @@ head: content: Java,HashMap,java hashmap, 源码分析, 实现原理 --- -# 6.5 HashMap 详解(附源码) 这篇文章将会详细透彻地讲清楚 Java 的 HashMap,包括 hash 方法的原理、HashMap 的扩容机制、HashMap 的加载因子为什么是 0.75 而不是 0.6、0.8,以及 HashMap 为什么是线程不安全的,基本上 HashMap 的[常见面试题](https://javabebetter.cn/interview/java-hashmap-13.html),都会在这一篇文章里讲明白。 diff --git a/docs/src/collection/iterator-iterable.md b/docs/src/collection/iterator-iterable.md index 5b4282222..e7946e3a0 100644 --- a/docs/src/collection/iterator-iterable.md +++ b/docs/src/collection/iterator-iterable.md @@ -12,7 +12,6 @@ head: content: Java,Iterable,Iterator,java Iterable,java Iterator,Iterable Iterator,java Iterable Iterator,java迭代器 --- -# 6.14 Iterator和Iterable的区别 >PS: 这篇同样来换一个风格,一起来欣赏。 diff --git a/docs/src/collection/linkedhashmap.md b/docs/src/collection/linkedhashmap.md index 78ccf3b78..dbfbb20b1 100644 --- a/docs/src/collection/linkedhashmap.md +++ b/docs/src/collection/linkedhashmap.md @@ -12,7 +12,6 @@ head: content: Java,LinkedHashMap,java LinkedHashMap, 源码分析, 实现原理 --- -# 6.6 LinkedHashMap详解(附源码) >这篇继续换个文风来写,给大家一点新鲜的空气。 diff --git a/docs/src/collection/linkedlist.md b/docs/src/collection/linkedlist.md index 18bcc66d3..e4be36769 100644 --- a/docs/src/collection/linkedlist.md +++ b/docs/src/collection/linkedlist.md @@ -12,7 +12,6 @@ head: content: Java,LinkedList,LinkedList源码,java linkedlist,源码分析 --- -# 6.4 LinkedList详解(附源码) >这篇换个表达方式,一起来欣赏。 diff --git a/docs/src/collection/list-war-2.md b/docs/src/collection/list-war-2.md index ad0b6f39d..6404855e9 100644 --- a/docs/src/collection/list-war-2.md +++ b/docs/src/collection/list-war-2.md @@ -12,7 +12,6 @@ head: content: Java,LinkedList,ArrayList,java arraylist linkedlist, arraylist linkedlist --- -# 6.12 ArrayList和LinkedList的区别 “终于,二哥,我们要聊 [LinkedList](https://javabetter.cn/collection/linkedlist.html) 和 [ArrayList](https://javabetter.cn/collection/arraylist.html) 之间的差别了,我期待了很久。”三妹嘟囔着说。 diff --git a/docs/src/collection/stack.md b/docs/src/collection/stack.md index 2bce282db..b529025d0 100644 --- a/docs/src/collection/stack.md +++ b/docs/src/collection/stack.md @@ -7,7 +7,6 @@ tag: - 集合框架(容器) --- -# 6.4 栈Stack 讲真,Stack 这个类在 Java 应用中并不常用,但栈这个数据结构在整个计算机体系中却十分重要。所以我们还是放到[集合框架](https://javabetter.cn/collection/gailan.html)里来讲一讲。 diff --git a/docs/src/collection/time-complexity.md b/docs/src/collection/time-complexity.md index 7df88346a..4efa585d6 100644 --- a/docs/src/collection/time-complexity.md +++ b/docs/src/collection/time-complexity.md @@ -12,7 +12,6 @@ head: content: Java,时间复杂度,java 时间复杂度,算法性能 大O表示法, 算法评估 --- -# 6.11 时间复杂度 “二哥,为什么要讲时间复杂度呀?”三妹问。 diff --git a/docs/src/collection/treemap.md b/docs/src/collection/treemap.md index 05880b124..147936e96 100644 --- a/docs/src/collection/treemap.md +++ b/docs/src/collection/treemap.md @@ -12,7 +12,6 @@ head: content: Java,TreeMap,java treemap, 源码分析, 实现原理 --- -# 6.7 TreeMap详解(附源码) >下面有请王老师上台,来给大家讲一讲 TreeMap,鼓掌了! diff --git a/docs/src/common-tool/Objects.md b/docs/src/common-tool/Objects.md index 5edcea9a2..0d1b84ae0 100644 --- a/docs/src/common-tool/Objects.md +++ b/docs/src/common-tool/Objects.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java,Objects,java objects --- -# 9.4 Objects工具类 Java 的 Objects 类是一个实用工具类,包含了一系列静态方法,用于处理对象。它位于 java.util 包中,自 Java 7 引入。Objects 类的主要目的是降低代码中的[空指针异常](https://javabetter.cn/exception/npe.html) (NullPointerException) 风险,同时提供一些非常实用的方法供我们使用。 diff --git a/docs/src/common-tool/StringUtils.md b/docs/src/common-tool/StringUtils.md index 15a958efe..53dfe860d 100644 --- a/docs/src/common-tool/StringUtils.md +++ b/docs/src/common-tool/StringUtils.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java,Apache StringUtils,java StringUtils --- -# 9.3 StringUtils工具类 `字符串`([String](https://javabetter.cn/string/immutable.html))在我们的日常工作中,用得非常非常非常多。 diff --git a/docs/src/common-tool/arrays.md b/docs/src/common-tool/arrays.md index d1d92335a..e61122d30 100644 --- a/docs/src/common-tool/arrays.md +++ b/docs/src/common-tool/arrays.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java,Arrays,数组,java arrays,java 数组 --- -# 9.2 Arrays工具类 “哥,数组专用工具类是专门用来操作[数组](https://javabetter.cn/array/array.html)的吗?比如说创建数组、数组排序、数组检索等等。”三妹的提问其实已经把答案说了出来。 diff --git a/docs/src/common-tool/collections.md b/docs/src/common-tool/collections.md index e01e3e9a4..deda0aaef 100644 --- a/docs/src/common-tool/collections.md +++ b/docs/src/common-tool/collections.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java,Collections,集合框架,java Collections --- -# 9.5 Collections工具类 Collections 是 JDK 提供的一个工具类,位于 java.util 包下,提供了一系列的静态方法,方便我们对集合进行各种骚操作,算是集合框架的一个大管家。 diff --git a/docs/src/common-tool/guava.md b/docs/src/common-tool/guava.md index 72bb55cff..3d75cfd26 100644 --- a/docs/src/common-tool/guava.md +++ b/docs/src/common-tool/guava.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java,Guava,java guava,google guava --- -# 9.7 Guava工具库 ### 01、前世今生 diff --git a/docs/src/common-tool/hutool.md b/docs/src/common-tool/hutool.md index 3e5c235a9..a433036ea 100644 --- a/docs/src/common-tool/hutool.md +++ b/docs/src/common-tool/hutool.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java,Hutool,java hutool --- -# 9.6 Hutool工具类库 读者群里有个小伙伴感慨说,“Hutool 这款开源类库太厉害了,基本上该有该的工具类,它里面都有。”讲真的,我平常工作中也经常用 Hutool,它确实可以帮助我们简化每一行代码,使 Java 拥有函数式语言般的优雅,让 Java 语言变得“甜甜的”。 diff --git a/docs/src/common-tool/scanner.md b/docs/src/common-tool/scanner.md index 801e347c0..0903e0ed1 100644 --- a/docs/src/common-tool/scanner.md +++ b/docs/src/common-tool/scanner.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java,Scanner,输入,java Scanner,java 扫描 --- -# 9.1 Scanner工具类 Java 的 Scanner 类是一个方便在控制台扫描用户输入的工具类,虽然它也可以扫描文件内容,但我们通常更喜欢它扮演前面的角色,因为扫描文件可以通过[文件流](https://javabetter.cn/io/file-path.html)来完成。 diff --git a/docs/src/common-tool/utils.md b/docs/src/common-tool/utils.md index 8337441bc..e5cdd6e2a 100644 --- a/docs/src/common-tool/utils.md +++ b/docs/src/common-tool/utils.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java,工具类,轮子,java 工具类,java IPUtil,java CollectionUtils --- -# 9.8 其他常用工具类 除了我们前面提到的 Java 原生工具类,比如说 [Arrays](https://javabetter.cn/common-tool/arrays.html)、[Objects](https://javabetter.cn/common-tool/Objects.html)、[Collections](https://javabetter.cn/common-tool/collections.html)、[Scanner](https://javabetter.cn/common-tool/scanner.html) 等,还有一些第三方的工具类,比如说 [Hutool](https://javabetter.cn/common-tool/hutool.html)、[Guava](https://javabetter.cn/common-tool/guava.html) 等,以及我们今天介绍的 IpUtil、CollectionUtils、StringUtils、MDC、ClassUtils、BeanUtils、ReflectionUtils 等等,在很大程度上能够提高我们的生产效率。 diff --git a/docs/src/exception/gailan.md b/docs/src/exception/gailan.md index dbfd9c22a..27f7c49fb 100644 --- a/docs/src/exception/gailan.md +++ b/docs/src/exception/gailan.md @@ -12,8 +12,6 @@ head: content: Java,Java异常处理, try-catch-finally, throw, throws,异常处理,java 异常处理 --- -# 8.1 Java异常处理全面解析 - ### 01、什么是异常 “二哥,今天就要学习异常了吗?”三妹问。 diff --git a/docs/src/exception/npe.md b/docs/src/exception/npe.md index 5e1b64ac7..a9b02b0ed 100644 --- a/docs/src/exception/npe.md +++ b/docs/src/exception/npe.md @@ -12,7 +12,6 @@ head: content: java,npe,NullPointerException --- -# 8.4 空指针的传说 **空指针**,号称天下最强刺客。 diff --git a/docs/src/exception/shijian.md b/docs/src/exception/shijian.md index 562d7b1c3..d7a632e29 100644 --- a/docs/src/exception/shijian.md +++ b/docs/src/exception/shijian.md @@ -12,8 +12,6 @@ head: content: Java,异常处理,最佳实践 --- -# 8.3 异常处理的20个最佳实践 - “三妹啊,今天我来给你传授 20 个异常处理的最佳实践经验,以免你以后在开发中采坑。”我面带着微笑对三妹说。 “好啊,二哥,我洗耳恭听。”三妹也微微一笑,欣然接受。 diff --git a/docs/src/exception/try-catch-xingneng.md b/docs/src/exception/try-catch-xingneng.md index d5d6e7b0a..180f17a68 100644 --- a/docs/src/exception/try-catch-xingneng.md +++ b/docs/src/exception/try-catch-xingneng.md @@ -12,8 +12,6 @@ head: content: Java,异常处理,java try-catch,捕获异常, 性能影响 --- -# 8.5 try-catch会影响性能吗? - “二哥,你看着这鬼代码,竟然在 for 循环里面搞了个 `try-catch`,不知道`try-catch`有性能损耗吗?” 老王煞有其事地指着屏幕里的代码: ```java diff --git a/docs/src/exception/try-with-resources.md b/docs/src/exception/try-with-resources.md index 48fbd20c3..4c5c44d43 100644 --- a/docs/src/exception/try-with-resources.md +++ b/docs/src/exception/try-with-resources.md @@ -12,8 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java,try-with-resources,java try-with-resources,java try with resources --- -# 8.2 try-with-resources - “二哥,终于等到你讲 try-with-resources 了!”三妹夸张的表情让我有些吃惊。 “三妹,不要激动呀!开讲之前,我们还是要来回顾一下 try–catch-finally,好做个铺垫。”我说,“来看看这段代码吧。” diff --git a/docs/src/git/git-qiyuan.md b/docs/src/git/git-qiyuan.md index cfbacdba8..6eb5e13b8 100644 --- a/docs/src/git/git-qiyuan.md +++ b/docs/src/git/git-qiyuan.md @@ -12,8 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Git入门,Git教程,git --- -# 1小时彻底掌握 Git,(可能是)史上最简单明了的 Git 教程 - ## 一、Git 起源 diff --git a/docs/src/interview/dubbo-17.md b/docs/src/interview/dubbo-17.md index ed7e55d8a..d491e1eca 100644 --- a/docs/src/interview/dubbo-17.md +++ b/docs/src/interview/dubbo-17.md @@ -12,8 +12,6 @@ head: content: dubbo,面试题,八股文 --- -# Dubbo:17道精选高频面试题必看:+1: - **目录** - 1.Dubbo 是什么?RPC 又是什么? diff --git a/docs/src/interview/java-34.md b/docs/src/interview/java-34.md index ed82348d7..c782c2dbb 100644 --- a/docs/src/interview/java-34.md +++ b/docs/src/interview/java-34.md @@ -12,8 +12,6 @@ head: content: Java,java,面试题,八股文 --- -# Java:34道精选高频面试题必看:+1: - ## 1.介绍一下 java 吧 java 是一门**开源的跨平台的面向对象的**计算机语言. diff --git a/docs/src/interview/java-basic-baguwen.md b/docs/src/interview/java-basic-baguwen.md index 2c624278f..015dbe383 100644 --- a/docs/src/interview/java-basic-baguwen.md +++ b/docs/src/interview/java-basic-baguwen.md @@ -12,8 +12,6 @@ head: content: Java,java,面试题,八股文 --- -# Java 基础八股文(背诵版)必看🍉 - ### Java 语言具有哪些特点? - Java 为纯面向对象的语言。它能够直接反应现实生活中的对象。 diff --git a/docs/src/interview/java-hashmap-13.md b/docs/src/interview/java-hashmap-13.md index dac08bece..42aa0e415 100644 --- a/docs/src/interview/java-hashmap-13.md +++ b/docs/src/interview/java-hashmap-13.md @@ -12,8 +12,6 @@ head: content: Java,java,hashmap,面试题,八股文 --- -# Java HashMap精选面试题 - 对于 Java 求职者来说,HashMap 可谓是重中之重,是面试的必考点。然而 HashMap 的知识点非常多,复习起来花费精力很大。 diff --git a/docs/src/interview/java-jvm-baguwen.md b/docs/src/interview/java-jvm-baguwen.md index b00ffe591..31f1b9697 100644 --- a/docs/src/interview/java-jvm-baguwen.md +++ b/docs/src/interview/java-jvm-baguwen.md @@ -12,8 +12,6 @@ head: content: Java,java,jvm,面试题,八股文 --- -# Java 虚拟机八股文(背诵版)必看:+1: - ### 简述JVM内存模型 线程私有的运行时数据区: 程序计数器、Java 虚拟机栈、本地方法栈。 diff --git a/docs/src/interview/java-thread-baguwen.md b/docs/src/interview/java-thread-baguwen.md index 42c79be1b..c1cf2b5cc 100644 --- a/docs/src/interview/java-thread-baguwen.md +++ b/docs/src/interview/java-thread-baguwen.md @@ -12,7 +12,6 @@ head: content: Java,java,thread,面试题,八股文 --- -# Java 并发编程八股文(背诵版)必看:+1: ### 简述Java内存模型(JMM) diff --git a/docs/src/interview/mysql-60.md b/docs/src/interview/mysql-60.md index 7c0230537..03e731e08 100644 --- a/docs/src/interview/mysql-60.md +++ b/docs/src/interview/mysql-60.md @@ -13,8 +13,6 @@ head: --- -# 精选数据库60道面试题必看:+1: - > 图文详解 60 道 MySQL 面试高频题,这次吊打面试官,我觉得稳了(手动 dog)。整理:沉默王二,戳[转载链接](https://mp.weixin.qq.com/s/c-sy7tM0BmrqMUQFW7C65g),里面有局详细的思维导图;作者:herongwei,戳[原文链接](https://mp.weixin.qq.com/s/-SqqKmhZcOlQxM-rHiIpKg)。 diff --git a/docs/src/interview/nginx-40.md b/docs/src/interview/nginx-40.md index f0a4527e1..8402f484e 100644 --- a/docs/src/interview/nginx-40.md +++ b/docs/src/interview/nginx-40.md @@ -12,7 +12,6 @@ head: content: Nginx,nginx,面试题,八股文 --- -# Nginx:40道精选面试题必看:+1: 大家好,我是二哥呀!那天,我徒弟小二偷偷摸摸跑去了一家公司面试,结果回来给我说在 Nginx 上跪了,问我该怎么办? diff --git a/docs/src/interview/redis-12.md b/docs/src/interview/redis-12.md index 720ad6b0c..563b00dba 100644 --- a/docs/src/interview/redis-12.md +++ b/docs/src/interview/redis-12.md @@ -12,7 +12,6 @@ head: content: Redis,redis,面试题,八股文 --- -# Redis:12道精选高频面试题 大家好,我是二哥呀。 diff --git a/docs/src/io/Serializbale.md b/docs/src/io/Serializbale.md index ee357d117..9cb9d9a33 100644 --- a/docs/src/io/Serializbale.md +++ b/docs/src/io/Serializbale.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,Serializable,java Serializable,java 序列化 --- -# 7.9 序列接口Serializable 对于 Java 的序列化,我之前一直停留在最浅层次的认知上——把那个要[序列化](https://javabetter.cn/io/serialize.html)的类实现 `Serializbale` 接口就可以了嘛。 diff --git a/docs/src/io/buffer.md b/docs/src/io/buffer.md index 969af02e2..a1aac38fd 100644 --- a/docs/src/io/buffer.md +++ b/docs/src/io/buffer.md @@ -12,7 +12,6 @@ head: content: Java,IO,缓冲流,Buffered,BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,java 缓冲流,java buffer --- -# 7.5 缓冲流 Java 的缓冲流是对字节流和字符流的一种封装,通过在内存中开辟缓冲区来提高 I/O 操作的效率。Java 通过 BufferedInputStream 和 BufferedOutputStream 来实现字节流的缓冲,通过 BufferedReader 和 BufferedWriter 来实现字符流的缓冲。 diff --git a/docs/src/io/char-byte.md b/docs/src/io/char-byte.md index 650f5a00d..68debd0a0 100644 --- a/docs/src/io/char-byte.md +++ b/docs/src/io/char-byte.md @@ -12,7 +12,6 @@ head: content: Java,Java IO,转换流,InputStreamReader,OutputStreamWriter,乱码,编码,解码,java转换流 --- -# 7.6 转换流 转换流可以将一个[字节流](https://javabetter.cn/io/stream.html)包装成[字符流](https://javabetter.cn/io/reader-writer.html),或者将一个字符流包装成字节流。这种转换通常用于处理文本数据,如读取文本文件或将数据从网络传输到应用程序。 diff --git a/docs/src/io/file-path.md b/docs/src/io/file-path.md index 4a87fe7d8..b93722b7b 100644 --- a/docs/src/io/file-path.md +++ b/docs/src/io/file-path.md @@ -12,7 +12,6 @@ head: content: Java,Java IO,文件流, file,java文件,java目录,java文件增删改查,java file --- -# 7.2 文件流 在 IO 操作中,文件的操作相对来说是比较复杂的,但也是使用频率最高的部分,我们几乎所有的项目中几乎都躺着一个叫做 FileUtil 或者 FileUtils 的工具类。 diff --git a/docs/src/io/print.md b/docs/src/io/print.md index 2e2731bc0..0867a3a56 100644 --- a/docs/src/io/print.md +++ b/docs/src/io/print.md @@ -12,7 +12,6 @@ head: content: Java,Java IO,打印流,PrintStream,PrintWriter,java 打印流,java PrintStream,java PrintWriter --- -# 7.7 打印流 在我的职业生涯中, `System.out.println()` 的使用频率恐怕不亚于 main 方法的使用频率。其中 `System.out` 返回的正是打印流 `PrintStream` 。 diff --git a/docs/src/io/reader-writer.md b/docs/src/io/reader-writer.md index ce737dca3..e517077a6 100644 --- a/docs/src/io/reader-writer.md +++ b/docs/src/io/reader-writer.md @@ -12,7 +12,6 @@ head: content: Java,Java IO,Reader,Writer,字符流,java字符流 --- -# 7.4 字符流 字符流 Reader 和 Writer 的故事要从它们的类关系图开始,来看图。 diff --git a/docs/src/io/serialize.md b/docs/src/io/serialize.md index 1eed2749d..95e23fa64 100644 --- a/docs/src/io/serialize.md +++ b/docs/src/io/serialize.md @@ -12,7 +12,6 @@ head: content: Java,Java IO,序列化流,java序列化,java反序列化,ObjectOutputStream,ObjectInputStream,java 序列流 --- -# 7.8 序列流(序列化和反序列化) Java 的序列流(ObjectInputStream 和 ObjectOutputStream)是一种可以将 Java 对象序列化和反序列化的流。 diff --git a/docs/src/io/shangtou.md b/docs/src/io/shangtou.md index 715dd976c..aa7e04154 100644 --- a/docs/src/io/shangtou.md +++ b/docs/src/io/shangtou.md @@ -12,8 +12,6 @@ head: content: Java,Java IO,io,输入输出流,字节流, 字符流 --- -# 7.1 IO 分类 - “老王,Java IO 也太上头了吧?”新兵蛋子小二向头顶很凉快的老王抱怨道,“你瞧,我就按照传输方式对 IO 进行了一个简单的分类,就能搞出来这么多的玩意!” ![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/io/shangtou-01.png) diff --git a/docs/src/io/stream.md b/docs/src/io/stream.md index 14e75c720..e3a08bf7f 100644 --- a/docs/src/io/stream.md +++ b/docs/src/io/stream.md @@ -12,7 +12,6 @@ head: content: Java,IO,java io,OutputStream,InputStream,字节流,java 字节流, 输入输出 --- -# 7.3 字节流 我们必须得明确一点,一切文件(文本、视频、图片)的数据都是以二进制的形式存储的,传输时也是。所以,字节流可以传输任意类型的文件数据。 diff --git a/docs/src/io/transient.md b/docs/src/io/transient.md index dc3bfcfd1..2f368edb8 100644 --- a/docs/src/io/transient.md +++ b/docs/src/io/transient.md @@ -12,7 +12,6 @@ head: content: Java,transient,java transient,transient关键字 --- -# 7.10 transient关键字 害,小二最熟的是 Java,但很多 Java 基础知识都不知道,比如 transient 关键字以前就没用到过,所以不知道它的作用是什么,今天去招银面试的时候,面试官问到了这个:说说 Java 的 transient 关键字吧,结果小二直接懵逼了。 diff --git a/docs/src/java8/Lambda.md b/docs/src/java8/Lambda.md index 927306f92..061edac24 100644 --- a/docs/src/java8/Lambda.md +++ b/docs/src/java8/Lambda.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java8,lambda,java lambda,Lambda表达式, 函数式编程 --- -# 10.3 深入浅出Lambda表达式 今天分享的主题是《Lambda 表达式入门》,这也是之前一些读者留言强烈要求我写一写的,不好意思,让你们久等了,现在来满足你们,为时不晚吧? diff --git a/docs/src/java8/java14.md b/docs/src/java8/java14.md index 8e17a91cd..19cba81e8 100644 --- a/docs/src/java8/java14.md +++ b/docs/src/java8/java14.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java8,java Record,java instanceof,java switch --- -# 10.4 Java 14 新特性 Java 14 的时候,新增了记录 Record、模式匹配 instanceof 等新特性,转正了 Java 12 时的 switch 表达式,我们一起来过一遍。 diff --git a/docs/src/java8/optional.md b/docs/src/java8/optional.md index 4a523aed7..1938811f6 100644 --- a/docs/src/java8/optional.md +++ b/docs/src/java8/optional.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java8,Optional,java Optional,空指针异常, NullPointerException --- -# 10.2 Optional最佳指南 想学习,永远都不晚,尤其是针对 Java 8 里面的好东西,Optional 就是其中之一,该类提供了一种用于表示可选值而非空引用的类级别解决方案。作为一名 Java 程序员,我真的是烦透了 [NullPointerException(NPE)](https://javabetter.cn/exception/npe.html),尽管和它熟得就像一位老朋友,知道它也是迫不得已——程序正在使用一个对象却发现这个对象的值为 null,于是 Java 虚拟机就怒发冲冠地把它抛了出来当做替罪羊。 diff --git a/docs/src/java8/stream.md b/docs/src/java8/stream.md index 14d83a05a..32db8da61 100644 --- a/docs/src/java8/stream.md +++ b/docs/src/java8/stream.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,java8,stream,java stream,Java 8, Stream流, 流式编程 --- -# 10.1 掌握Stream流 两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:“就想看你写的啊!”你看你看,多么苍白的喜欢啊。那就“勉为其难”写一篇吧,嘻嘻。 diff --git a/docs/src/jvm/arthas.md b/docs/src/jvm/arthas.md index 2509db13c..82d2f61a9 100644 --- a/docs/src/jvm/arthas.md +++ b/docs/src/jvm/arthas.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,arthas --- -# 第十六节:JVM 性能监控之 Arthas 篇 Arthas 是阿里开源的一款线上 Java 诊断神器,通过全局的视角可以查看应用程序的内存、GC、线程等状态信息,并且能够在不修改代码的情况下,对业务问题进行诊断,包括查看方法的参数调用、执行时间、异常堆栈等信息,大大提升了生产环境中问题排查的效率。 diff --git a/docs/src/jvm/asm.md b/docs/src/jvm/asm.md index 1bb0acc05..ecc92b7af 100644 --- a/docs/src/jvm/asm.md +++ b/docs/src/jvm/asm.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,asm --- -# 史上最通俗易懂的ASM教程 ## 一勺思想 diff --git a/docs/src/jvm/bytecode.md b/docs/src/jvm/bytecode.md index 75ac3ec85..7c7e36698 100644 --- a/docs/src/jvm/bytecode.md +++ b/docs/src/jvm/bytecode.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,字节码,javap --- -# 第五节:javap 与字节码 计算机比较“傻”,只认 0 和 1,这意味着我们编写的代码最终都要编译成机器码才能被计算机执行。Java 在诞生之初就提出了一个非常著名的宣传口号: "**一次编写,处处运行**"。 diff --git a/docs/src/jvm/class-file-jiegou.md b/docs/src/jvm/class-file-jiegou.md index 414d143fb..a959adff7 100644 --- a/docs/src/jvm/class-file-jiegou.md +++ b/docs/src/jvm/class-file-jiegou.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,class --- -# 第四节:Java类文件结构 大家好,我是二哥呀,今天我拿了一把小刀,准备带大家解剖一下 Java 的类文件结构,也就是 .class 文件的内容结构,虽然它实际上是一串连续的二进制,由 0 和 1 组成,但我们仍然可以借助一些工具来看清楚它的真面目。 diff --git a/docs/src/jvm/class-load.md b/docs/src/jvm/class-load.md index 88a860940..29171513a 100644 --- a/docs/src/jvm/class-load.md +++ b/docs/src/jvm/class-load.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,类加载机制,类加载器,类加载过程,双亲委派模型 --- -# 第三节:Java的类加载机制 [上一节](https://javabetter.cn/jvm/how-run-java-code.html)在讲 JVM 运行 Java 代码的时候,我们提到,JVM 需要将编译后的字节码文件加载到其内部的运行时数据区域中进行执行。这个过程涉及到了 Java 的类加载机制(面试常问的知识点),所以我们来详细地讲一讲。 diff --git a/docs/src/jvm/compile-jdk.md b/docs/src/jvm/compile-jdk.md index 55e98e86b..d41b935bc 100644 --- a/docs/src/jvm/compile-jdk.md +++ b/docs/src/jvm/compile-jdk.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,JDK --- -# 自己编译JDK 很多小伙伴们做`Java`开发,天天写`Java`代码,肯定离不开`Java`基础环境:`JDK`,毕竟我们写好的`Java`代码也是跑在`JVM`虚拟机上。 diff --git a/docs/src/jvm/console-tools.md b/docs/src/jvm/console-tools.md index 5a24e3196..47c52c089 100644 --- a/docs/src/jvm/console-tools.md +++ b/docs/src/jvm/console-tools.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,性能监控,命令行工具 --- -# 第十四节:JVM 性能监控之命令行篇 记得 2014 年我在写大宗期货交易平台的时候,遇到了一些棘手的问题,可能是因为我的并发编程知识掌握的不够扎实,导致出现了内存泄漏的问题。 diff --git a/docs/src/jvm/cpu-percent-100.md b/docs/src/jvm/cpu-percent-100.md index c66953615..065095a21 100644 --- a/docs/src/jvm/cpu-percent-100.md +++ b/docs/src/jvm/cpu-percent-100.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,cpu --- -# 第十八节:CPU 100%排查优化实战 前面给大家讲过一次 [OOM 的优化排查实战](https://javabetter.cn/jvm/oom.html),今天再给大家讲一个 CPU 100% 优化排查实战。 diff --git a/docs/src/jvm/garbage-collector.md b/docs/src/jvm/garbage-collector.md index f163f5cd3..8ea680098 100644 --- a/docs/src/jvm/garbage-collector.md +++ b/docs/src/jvm/garbage-collector.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,垃圾回收器 --- -## 垃圾回收器性能指标 * 吞吐量:程序运行时间占总运行时间(总运行时间=程序运行时间+垃圾回收时间)的比例,垃圾回收时间越少,吞吐量越高; * 暂停时间:STW的时间; diff --git a/docs/src/jvm/gc-collector.md b/docs/src/jvm/gc-collector.md index eb9e09a74..d7a51104d 100644 --- a/docs/src/jvm/gc-collector.md +++ b/docs/src/jvm/gc-collector.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,CMS,G1,ZGC,垃圾收集器 --- -# 第十一节:垃圾收集器 垃圾回收对于 Java 党来说,是一个绕不开的话题,工作中涉及到的调优工作也经常围绕着垃圾回收器展开。面对不同的业务场景,往往需要不同的垃圾收集器才能保证 GC 性能,因此,对于面大厂或者有远大志向的球友可以卷一下垃圾收集器。 diff --git a/docs/src/jvm/gc.md b/docs/src/jvm/gc.md index 7b954fb7b..652cea9f1 100644 --- a/docs/src/jvm/gc.md +++ b/docs/src/jvm/gc.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,垃圾回收,gc,垃圾回收机制,垃圾回收算法 --- -# 第十节:深入理解垃圾回收机制 记得以前有这样一副动图,用来嘲笑 JVM 的垃圾回收机制,大致的意思就是,JVM 的垃圾回收机制很工业化,但是好像是在做无用功,垃圾回收不彻底(😂)。 diff --git a/docs/src/jvm/how-jvm-run-zijiema-zhiling.md b/docs/src/jvm/how-jvm-run-zijiema-zhiling.md index e026f0047..60020cdf2 100644 --- a/docs/src/jvm/how-jvm-run-zijiema-zhiling.md +++ b/docs/src/jvm/how-jvm-run-zijiema-zhiling.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,字节码指令 --- -# 虚拟机是如何执行字节码指令的? 执行引擎是 Java 虚拟机最核心的组成部分之一。「虚拟机」是相对于「物理机」的概念,这两种机器都有代码执行的能力,区别是物理机的执行引擎是直接建立在处理器、硬件、指令集和操作系统层面上的,而虚拟机执行引擎是由自己实现的,因此可以自行制定指令集与执行引擎的结构体系,并且能够执行那些不被硬件直接支持的指令集格式。 diff --git a/docs/src/jvm/how-run-java-code.md b/docs/src/jvm/how-run-java-code.md index 7fec28ff9..c11a2f729 100644 --- a/docs/src/jvm/how-run-java-code.md +++ b/docs/src/jvm/how-run-java-code.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,字节码,字节码指令,字节码文件,字节码文件结构 --- -# 第二节:JVM如何运行Java代码? “二哥,看了 [Hello World](https://javabetter.cn/overview/hello-world.html) 的代码后,我很好奇,它是怎么在 IDEA 的 Run 面板里打印出‘三妹,少看手机少打游戏,好好学,美美哒’呢?”三妹咪了一口麦香可可奶茶后对我说。 diff --git a/docs/src/jvm/hsdb.md b/docs/src/jvm/hsdb.md index f4c00374e..e24385d32 100644 --- a/docs/src/jvm/hsdb.md +++ b/docs/src/jvm/hsdb.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,HSDB --- -# 第十三节:如何调试 JVM 运行时数据? `HSDB(Hotspot Debugger)`,是一款内置于 SA 中的 GUI 调试工具,可用于调试 JVM 运行时数据,从而进行故障排除。 diff --git a/docs/src/jvm/jit.md b/docs/src/jvm/jit.md index c54f72696..488a0edcb 100644 --- a/docs/src/jvm/jit.md +++ b/docs/src/jvm/jit.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,jit,即时编译器 --- -# 第十三节:深入理解 JIT [前面我们讲了](https://javabetter.cn/jvm/what-is-jvm.html),为了提升 Java 运行时的性能,JVM 引入了 JIT,也就是即时编译(Just In Time)技术。 diff --git a/docs/src/jvm/meituan-9-gc.md b/docs/src/jvm/meituan-9-gc.md index 0e325d0a2..dc043c83f 100644 --- a/docs/src/jvm/meituan-9-gc.md +++ b/docs/src/jvm/meituan-9-gc.md @@ -11,8 +11,6 @@ head: - name: keywords content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,cms --- - -# Java中9种常见的CMS GC问题分析与解决 **1.1 引言** diff --git a/docs/src/jvm/neicun-jiegou.md b/docs/src/jvm/neicun-jiegou.md index c4af5e4d9..efecc8052 100644 --- a/docs/src/jvm/neicun-jiegou.md +++ b/docs/src/jvm/neicun-jiegou.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,内存结构,内存数据区 --- -# 第九节:深入理解运行时数据区 前面我们就讲过,Java 源代码文件经过编译器编译后会生成字节码文件,经过加载器加载完毕后会交给执行引擎执行。在执行的过程中,JVM 会划出来一块空间来存储程序执行期间需要用到的数据,这块空间一般被称为运行时数据区,见下图。 diff --git a/docs/src/jvm/oom.md b/docs/src/jvm/oom.md index 1c4c65b82..d8b3279d6 100644 --- a/docs/src/jvm/oom.md +++ b/docs/src/jvm/oom.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,内存溢出 --- -# 第十七节:内存泄露排查优化实战 `OutOfMemoryError`,也就是臭名昭著的 OOM(内存溢出),相信很多球友都遇到过,相对于常见的业务异常,如[数组越界](https://javabetter.cn/array/array.html)、[空指针](https://javabetter.cn/exception/npe.html)等,OOM 问题更难难定位和解决。 diff --git a/docs/src/jvm/problem-tools.md b/docs/src/jvm/problem-tools.md index 8dafaf5a4..97490e559 100644 --- a/docs/src/jvm/problem-tools.md +++ b/docs/src/jvm/problem-tools.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机 --- -# Java 问题诊断和排查工具(查看 JVM 参数、内存使用情况及分析) ## JDK 自带的工具 diff --git a/docs/src/jvm/readme.md b/docs/src/jvm/readme.md index 415e7b4bb..fb8f21784 100644 --- a/docs/src/jvm/readme.md +++ b/docs/src/jvm/readme.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,简介,github,pdf,二哥的Java进阶之路.pdf,Java进阶之路.pdf,jvm,Java虚拟机 --- -# 第零节:小册简介 大家好,我是二哥呀。 diff --git a/docs/src/jvm/stack-frame.md b/docs/src/jvm/stack-frame.md index 869659c9b..0fd609e21 100644 --- a/docs/src/jvm/stack-frame.md +++ b/docs/src/jvm/stack-frame.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,栈虚拟机,栈帧,局部变量表,操作数栈,动态链接,方法返回地址 --- -# 第八节:深入理解栈帧结构 前面我们讲[栈虚拟机和寄存器虚拟机](https://javabetter.cn/jvm/vm-stack-register.html)的时候,提到过栈帧结构;在讲[字节码指令](https://javabetter.cn/jvm/zijiema-zhiling.html)的时候,又提到了栈帧中的操作数栈,那今天我们就来详细地讲一讲 JVM 的栈帧结构,好让大家对栈帧有一个更加清晰的认知。 diff --git a/docs/src/jvm/tujie-gc.md b/docs/src/jvm/tujie-gc.md index 6eb23c1fa..03fea8a50 100644 --- a/docs/src/jvm/tujie-gc.md +++ b/docs/src/jvm/tujie-gc.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,垃圾回收机制 --- -# 图解Java的垃圾回收机制 垃圾回收是一种在堆内存中找出哪些对象在被使用,还有哪些对象没被使用,并且将后者回收掉的机制。 diff --git a/docs/src/jvm/view-tools.md b/docs/src/jvm/view-tools.md index 428a2669c..38d4b3d4e 100644 --- a/docs/src/jvm/view-tools.md +++ b/docs/src/jvm/view-tools.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,性能监控,可视化工具,JConsole,VisualVM,Java Mission Control --- -# 第十五节:JVM 性能监控之可视化篇 前面我们已经讲了 [JVM 性能监控工具之命令行篇](https://javabetter.cn/jvm/console-tools.html),本篇我们来介绍一些可视化的性能监控工具,包括 JConsole、VisualVM、Java Mission Control 等,阿里的 Arthas 我们留到后面单独去讲。 diff --git a/docs/src/jvm/vm-stack-register.md b/docs/src/jvm/vm-stack-register.md index d72a2d8a2..577a4827c 100644 --- a/docs/src/jvm/vm-stack-register.md +++ b/docs/src/jvm/vm-stack-register.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,栈虚拟机,寄存器虚拟机 --- -# 第六节:栈虚拟机和寄存器虚拟机 本来这节内容是打算直接讲字节码指令的,但讲之前又必须得先讲指令集架构,而指令集架构又分为两种,一种是基于栈的,一种是基于寄存器的。 diff --git a/docs/src/jvm/what-happen-when-javac.md b/docs/src/jvm/what-happen-when-javac.md index 566f026c2..cf143cd7f 100644 --- a/docs/src/jvm/what-happen-when-javac.md +++ b/docs/src/jvm/what-happen-when-javac.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机 --- -# Java程序在编译期发生了什么? “二哥,看了上一篇 [Hello World](https://mp.weixin.qq.com/s/191I_2CVOxVuyfLVtb4jhg) 的程序后,我很好奇,它是怎么在 Run 面板里打印出‘三妹,少看手机少打游戏,好好学,美美哒’呢?”三妹咪了一口麦香可可奶茶后对我说。 diff --git a/docs/src/jvm/what-is-jvm.md b/docs/src/jvm/what-is-jvm.md index 542076f54..513d6b271 100644 --- a/docs/src/jvm/what-is-jvm.md +++ b/docs/src/jvm/what-is-jvm.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机 --- -# 第一节:大白话带你认识 JVM “二哥,之前你讲 Java 的[第一行代码 hello world](https://javabetter.cn/overview/hello-world.html) 的时候就提到了 JVM,那时候我就想知道 JVM 到底是什么,但你说这是一块非常大的内容,会放到后面专门来讲,那学完了 [Java 基础知识](https://javabetter.cn/overview/),又学完了[并发编程](https://javabetter.cn/thread/),今天我们就来学习 JVM 吧?”三妹咪了一口麦香可可奶茶后对我说。 diff --git a/docs/src/jvm/whereis-the-object.md b/docs/src/jvm/whereis-the-object.md index d40d6d2cc..d515f9c83 100644 --- a/docs/src/jvm/whereis-the-object.md +++ b/docs/src/jvm/whereis-the-object.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,对象,堆,新生代,老年代,Eden,From Survivor,To Survivor --- -# 第十二节:Java创建的对象到底放在哪? 经过前面章节的学习,详细大家都知道了,Java 的对象是在堆中创建的,但堆又分为新生代和老年代,新生代又细分为 Eden、From Survivor、To Survivor。**那我们创建的对象到底在哪里**? diff --git a/docs/src/jvm/zijiema-zhiling.md b/docs/src/jvm/zijiema-zhiling.md index 8e3a20052..15a2f3d69 100644 --- a/docs/src/jvm/zijiema-zhiling.md +++ b/docs/src/jvm/zijiema-zhiling.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,字节码,字节码指令 --- -# 第七节:字节码指令详解 大家好,我是二哥呀。字节码指令是 JVM 体系中比较难啃的一块硬骨头,我估计有些[球友](https://javabetter.cn/zhishixingqiu/)会有这样的疑惑,“这么难啃,我还能学会啊?” diff --git a/docs/src/jvm/zongjie.md b/docs/src/jvm/zongjie.md index a77e9b80b..2dd09a2ce 100644 --- a/docs/src/jvm/zongjie.md +++ b/docs/src/jvm/zongjie.md @@ -12,7 +12,6 @@ head: content: Java,JavaSE,教程,二哥的Java进阶之路,jvm,Java虚拟机,Java内存模型,Java内存区域,对象,垃圾收集机制,类加载机制,字节码,JIT,JVM调优 --- -# 第十九节:JVM 核心知识点总结 diff --git a/docs/src/mysql/bin.md b/docs/src/mysql/bin.md index 18f8a5dee..be2b5f817 100644 --- a/docs/src/mysql/bin.md +++ b/docs/src/mysql/bin.md @@ -3,8 +3,6 @@ title: MySQL bin目录下的可执行文件都是用来干嘛的? shortTitle: bin目录下的可执行文件 --- -# MySQL bin目录下的可执行文件 - 这节我们穿插讲一点轻松的内容,关于 MySQL 安装成功后,bin 目录下的一些可执行文件,它们到底是干嘛用的? ![](https://cdn.tobebetterjavaer.com/stutymore/bin-20240205172946.png) diff --git a/docs/src/mysql/charset.md b/docs/src/mysql/charset.md index 1670c0794..3b18877f0 100644 --- a/docs/src/mysql/charset.md +++ b/docs/src/mysql/charset.md @@ -3,8 +3,6 @@ title: (付费)从跟上理解 MySQL,彻底掌握MySQL的字符集和比 shortTitle: 字符集和比较规则(付费) --- -# MySQL 字符集和比较规则 - 当我们创建[数据库](https://javabetter.cn/mysql/database.html)或者[表](https://javabetter.cn/mysql/table.html)的时候,就要指定字符集和比较规则。 那可能一些小伙伴会说,我创建的时候没指定啊,那是 MySQL 已经帮你默认了。 diff --git a/docs/src/mysql/column.md b/docs/src/mysql/column.md index 88042a908..c5e8f7cf7 100644 --- a/docs/src/mysql/column.md +++ b/docs/src/mysql/column.md @@ -3,7 +3,6 @@ title: (付费)一文彻底搞懂 MySQL 字段定义时的属性设置 shortTitle: 字段都有哪些属性(付费) --- -# MySQL字段都有哪些属性? 在[创建表](https://javabetter.cn/mysql/table.html)的时候,我们需要定义表的字段,每个字段都有一些属性,比如说是否有默认值、是否允许为空、是不是主键等等。 diff --git a/docs/src/mysql/data-type.md b/docs/src/mysql/data-type.md index da5fd7ffe..3d37afcaa 100644 --- a/docs/src/mysql/data-type.md +++ b/docs/src/mysql/data-type.md @@ -3,7 +3,6 @@ title: (付费)4000 字 20 张手绘图,结合技术派实战项目,彻 shortTitle: MySQL数据类型(付费) --- -# MySQL数据类型 上一节,我们学了 [MySQL 表的基本操作](https://javabetter.cn/mysql/table.html),知道了表是由不同数据类型的列组成的,然后填充了一行一行的数据。 diff --git a/docs/src/mysql/database.md b/docs/src/mysql/database.md index 9e98de3f3..f85d553fb 100644 --- a/docs/src/mysql/database.md +++ b/docs/src/mysql/database.md @@ -3,7 +3,6 @@ title: 利用Spring Boot实现MySQL数据库的自动创建,666 shortTitle: MySQL 的数据库操作 --- -# MySQL 的数据库操作 [MySQL 安装完成并连接](https://javabetter.cn/mysql/install.html)成功后,就可以创建数据库进行操作了。 diff --git a/docs/src/mysql/install.md b/docs/src/mysql/install.md index 2731c0bc2..ba40c248d 100644 --- a/docs/src/mysql/install.md +++ b/docs/src/mysql/install.md @@ -12,7 +12,6 @@ head: content: mysql,MySQL,MySQL安装 --- -# MySQL 的安装、启动、连接 MySQL 是一个关系型数据库,也是我们国内使用频率最高的一种数据库(没有之一),不管是校招还是社招,都是必考内容,并且考察项目会非常多,属于二哥一直强调的 Java 后端四大件之一。 diff --git a/docs/src/mysql/select-simple.md b/docs/src/mysql/select-simple.md index be55503f3..371190b8b 100644 --- a/docs/src/mysql/select-simple.md +++ b/docs/src/mysql/select-simple.md @@ -3,7 +3,6 @@ title: MySQL 之简单查询:开始踏上 SELECT 之旅 shortTitle: MySQL 之简单查询 --- -# MySQL 之简单查询 前面我们介绍了如何[创建数据库](https://javabetter.cn/mysql/database.html)、[如何创建数据表](https://javabetter.cn/mysql/table.html),那今天我们来结合[技术派实战项目](https://javabetter.cn/zhishixingqiu/paicoding.html)的数据来讲讲 MySQL 查询,也就是 `SELECT` 语句。 diff --git a/docs/src/mysql/select-where.md b/docs/src/mysql/select-where.md index 245575751..97ac00595 100644 --- a/docs/src/mysql/select-where.md +++ b/docs/src/mysql/select-where.md @@ -3,7 +3,6 @@ title: (付费)MySQL WHERE 条件查询,重点搞懂 % 通配符,MyBatis shortTitle: MySQL WHERE条件查询(付费) --- -# MySQL WHERE 条件查询 在[上一篇](https://javabetter.cn/mysql/select-simple.html)中,我们学习了简单的 SELECT 查询,但没有带上查询条件。要知道,真实的业务场景中,数量会非常大,有些甚至会有几百万、几千万条数据,如果不带上查询条件,一次性把全部数据查出来是不太现实的。 diff --git a/docs/src/mysql/table.md b/docs/src/mysql/table.md index ee15659fb..b3d010747 100644 --- a/docs/src/mysql/table.md +++ b/docs/src/mysql/table.md @@ -3,7 +3,6 @@ title: 掌握MySQL表的增删改查,一名真正的 CRUD boy 即将出炉 shortTitle: MySQL 表的增删改查 --- -# MySQL 表的基本操作 有了数据库以后,我们就可以在数据库中对表进行增删改查了,这也就意味着,一名真正的 CRUD Boy 即将到来(😁)。 diff --git a/docs/src/nice-article/itmind/shangwang.md b/docs/src/nice-article/itmind/shangwang.md index e7112e7f5..cc5ec63a7 100644 --- a/docs/src/nice-article/itmind/shangwang.md +++ b/docs/src/nice-article/itmind/shangwang.md @@ -12,8 +12,6 @@ head: content: 上网 --- -# 四种上网的方式 - 一般情况下,作为开发者,我推荐大家至少学会使用 Google 搜索,这样能解决开发中的绝大多数问题。 Google>Bing>微信搜索>百度搜索 diff --git a/docs/src/nice-article/other/guanyjsjzyjggdwnkw.md b/docs/src/nice-article/other/guanyjsjzyjggdwnkw.md index ef49367d1..2ca0357db 100644 --- a/docs/src/nice-article/other/guanyjsjzyjggdwnkw.md +++ b/docs/src/nice-article/other/guanyjsjzyjggdwnkw.md @@ -12,7 +12,6 @@ head: content: 国家电网,求职过程,其他求职讨论,软件开发,电网,国企 --- -# 关于计算机专业进国家电网? 研究生即将毕业,即将入职电网,现分享一下计算机专业学生进入国家电网的经验。 diff --git a/docs/src/nice-article/other/zhitszqzzjnkw.md b/docs/src/nice-article/other/zhitszqzzjnkw.md index 47d671a92..e0bd9d7fb 100644 --- a/docs/src/nice-article/other/zhitszqzzjnkw.md +++ b/docs/src/nice-article/other/zhitszqzzjnkw.md @@ -12,7 +12,6 @@ head: content: 平安人寿,招银网络,比亚迪,中国邮政储蓄银行,中国银行,快手,求职过程,投递记录,软件开发,后端开发,晒一晒我的offer,你的秋招进展怎么样了,我的求职思考,24届秋招同行攻略分享,你的秋招进行到哪一步了 --- -# 只投深圳,秋招总结 收到了招银回寄的协议和大礼包,**确定要去招银了**,秋招也基本结束了,写篇总结回顾一下这焦虑的两个月。也会列出我投的深圳的企业,给明年秋招春招的朋友一个参考。 diff --git a/docs/src/nio/BIONIOAIO.md b/docs/src/nio/BIONIOAIO.md index 4e97e2d89..8032de8d5 100644 --- a/docs/src/nio/BIONIOAIO.md +++ b/docs/src/nio/BIONIOAIO.md @@ -13,7 +13,6 @@ head: content: java,nio,bio,aio --- -# 12.2 BIO、NIO 和 AIO 的区别 > 上篇,我们了解了 [NIO 和传统 IO 的区别](https://javabetter.cn/nio/nio-better-io.html),那这篇我们来了解 BIO、NIO 和 AIO 的区别,新手也很容易混淆,我们换一个方式来讲,讲给女朋友听👂。 diff --git a/docs/src/nio/buffer-channel.md b/docs/src/nio/buffer-channel.md index e4b1e010f..d5d094685 100644 --- a/docs/src/nio/buffer-channel.md +++ b/docs/src/nio/buffer-channel.md @@ -13,7 +13,6 @@ head: content: java,Channel,Buffer,nio --- -# 12.3 Buffer和Channel 首先我们再来回顾一下 [IO 和 NIO 的区别](https://javabetter.cn/nio/nio-better-io.html): diff --git a/docs/src/nio/moxing.md b/docs/src/nio/moxing.md index f7c54849c..3ffc714df 100644 --- a/docs/src/nio/moxing.md +++ b/docs/src/nio/moxing.md @@ -13,7 +13,6 @@ head: content: IO模型, 阻塞IO, 非阻塞IO, 多路复用, 信号驱动, 异步IO,java,nio --- -# 12.6 Java IO模型 Java 的 IO 分为两大类,一类是[传统的 IO](https://javabetter.cn/io/shangtou.html)(Blocking IO),一类是 [NIO](https://javabetter.cn/nio/nio-better-io.html) (New IO)。 diff --git a/docs/src/nio/network-connect.md b/docs/src/nio/network-connect.md index a2be29dc8..dc517a617 100644 --- a/docs/src/nio/network-connect.md +++ b/docs/src/nio/network-connect.md @@ -13,7 +13,6 @@ head: content: java,nio,网络编程,SocketChannel,ServerSocketChannel,AsynchronousSocketChannel,AsynchronousServerSocketChannel,聊天室 --- -# 12.5 NIO 实现简易版聊天室 在此之前,我们曾利用 Java 的套接字 Socket 和 ServerSocket 完成[网络编程](https://javabetter.cn/socket/socket.html),但 Socket 和 ServerSocket 是基于 Java IO 的,在网络编程方面,性能会比较差。[原因我们在之前也讲过](https://javabetter.cn/nio/nio-better-io.html)。 diff --git a/docs/src/nio/nio-better-io.md b/docs/src/nio/nio-better-io.md index 347e9c9f2..9f90f7fb1 100644 --- a/docs/src/nio/nio-better-io.md +++ b/docs/src/nio/nio-better-io.md @@ -13,7 +13,6 @@ head: content: java,nio,io,Java NIO, 传统IO, 非阻塞模式, 缓冲区, 通道, 选择器 --- -# 12.1 NIO比IO强在哪? 我花了几天时间去了解**NIO 的核心知识**,期间看了《Java 编程思想》和《疯狂 Java 讲义》中的 NIO 模块。**但是**,看完之后还是很**迷**,不知道 NIO 是干嘛用的,网上的资料和书上的知识点没有很好地对应上。 diff --git a/docs/src/nio/paths-files.md b/docs/src/nio/paths-files.md index 3212fd7dd..1f6708c5f 100644 --- a/docs/src/nio/paths-files.md +++ b/docs/src/nio/paths-files.md @@ -13,7 +13,6 @@ head: content: Java,nio,paths,files,path --- -# 12.4 Paths 和 Files Paths 和 Files 在 Java 7 的时候引入,作为对 [`java.io.File` 类](https://javabetter.cn/io/file-path.html)的补充和改进。 diff --git a/docs/src/oo/abstract-vs-interface.md b/docs/src/oo/abstract-vs-interface.md index da56e8e2f..57049364a 100644 --- a/docs/src/oo/abstract-vs-interface.md +++ b/docs/src/oo/abstract-vs-interface.md @@ -12,7 +12,6 @@ head: content: Java,java 抽象类 接口,java interface abstract,抽象类, 接口 --- -# 5.12 Java 抽象类和接口的区别 “三妹,通过前面两篇,我们已经深入地了解了 Java [抽象类](https://javabetter.cn/oo/abstract.html)和 Java [接口](https://javabetter.cn/oo/interface.html),那这篇我们来重点说一下抽象类和接口之间的区别。”我放下手中的鼠标和键盘,转向右手边,对三妹说。 diff --git a/docs/src/oo/abstract.md b/docs/src/oo/abstract.md index f5e9751b8..125573022 100644 --- a/docs/src/oo/abstract.md +++ b/docs/src/oo/abstract.md @@ -12,7 +12,6 @@ head: content: Java,Java抽象类,抽象类,抽象方法, 继承 --- -# 5.10 Java抽象类 “二哥,你这明显加快了更新的频率呀!”三妹对于我最近的肝劲由衷的佩服了起来。 diff --git a/docs/src/oo/access-control.md b/docs/src/oo/access-control.md index 6861432c9..cd497f071 100644 --- a/docs/src/oo/access-control.md +++ b/docs/src/oo/access-control.md @@ -12,8 +12,6 @@ head: content: Java,访问权限修饰符,public,private,protected --- -# 5.8 Java访问权限修饰符 - “我们先来讨论一下为什么需要访问权限控制。其实之前我们在讲[类和对象](https://javabetter.cn/oo/object-class.html)的时候有提到,今天我们来详细地聊一聊,三妹。”我开门见山地说,“三妹,你打开思维导图,记得做笔记哦。” “好的。”三妹应声回答。 diff --git a/docs/src/oo/code-init.md b/docs/src/oo/code-init.md index 1f815810c..11a7fb052 100644 --- a/docs/src/oo/code-init.md +++ b/docs/src/oo/code-init.md @@ -12,7 +12,6 @@ head: content: Java,代码初始化块, 实例初始化, 静态初始化 --- -# 5.9 Java代码初始化块 “哥,今天我们要学习的内容是‘代码初始化块’,对吧?”看来三妹已经提前预习了我上次留给她的作业。 diff --git a/docs/src/oo/construct.md b/docs/src/oo/construct.md index bd085d539..fc7f4d675 100644 --- a/docs/src/oo/construct.md +++ b/docs/src/oo/construct.md @@ -8,7 +8,6 @@ tag: - 面向对象编程 --- -# 5.7 Java构造方法 “三妹,[上一节](https://javabetter.cn/oo/method.html)学了 Java 中的方法,接着学构造方法的话,难度就小很多了。”刚吃完中午饭,虽然有些困意,但趁机学个 10 分钟也是不错的,睡眠会更心满意足一些,于是我面露微笑地对三妹说。 diff --git a/docs/src/oo/encapsulation-inheritance-polymorphism.md b/docs/src/oo/encapsulation-inheritance-polymorphism.md index 26754446b..9cce63554 100644 --- a/docs/src/oo/encapsulation-inheritance-polymorphism.md +++ b/docs/src/oo/encapsulation-inheritance-polymorphism.md @@ -12,7 +12,6 @@ head: content: Java, 封装, 继承, 多态, 面向对象编程 --- -# 5.13 Java 封装继承多态 在谈 Java 面向对象的时候,不得不提到面向对象的三大特征:[封装](https://javabetter.cn/oo/encapsulation.html)、[继承](https://javabetter.cn/oo/extends-bigsai.html)、[多态](https://javabetter.cn/oo/polymorphism.html)。三大特征紧密联系而又有区别,合理使用继承能大大减少重复代码,**提高代码复用性。** diff --git a/docs/src/oo/encapsulation.md b/docs/src/oo/encapsulation.md index f59660558..9ec3002ac 100644 --- a/docs/src/oo/encapsulation.md +++ b/docs/src/oo/encapsulation.md @@ -12,7 +12,6 @@ head: content: Java,封装 --- -# 5.13 Java封装 “三妹,准备好了没,我们这节来讲 Java 封装,算是 Java 的三大特征之一,理清楚了,对以后的编程有较大的帮助。”我对三妹说。 diff --git a/docs/src/oo/extends-bigsai.md b/docs/src/oo/extends-bigsai.md index 28dea8267..15b43d423 100644 --- a/docs/src/oo/extends-bigsai.md +++ b/docs/src/oo/extends-bigsai.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,继承,inheritance --- -# 5.14 Java封装继承多态 “三妹,今天我们继续来学习 Java 的三大特征之一:继承,之前学习[抽象类](https://javabetter.cn/oo/abstract.html)的时候我们已经接触过这个概念,不过,我们今天我们来认真地聊一聊。”慢吞吞说完这句开篇词后,我对三妹做了一个打开 XMind 的手势提醒(其实就是瞎比划)。 diff --git a/docs/src/oo/final.md b/docs/src/oo/final.md index e2dfac863..5b3487b12 100644 --- a/docs/src/oo/final.md +++ b/docs/src/oo/final.md @@ -12,7 +12,6 @@ head: content: Java,final,final关键字 --- -# 5.16 Java final关键字 “哥,今天学什么呢?” diff --git a/docs/src/oo/inner-class.md b/docs/src/oo/inner-class.md index 3ec854c23..36445f8bd 100644 --- a/docs/src/oo/inner-class.md +++ b/docs/src/oo/inner-class.md @@ -12,8 +12,6 @@ head: content: Java,内部类,成员内部类,局部内部类,匿名内部类,静态内部类,java 内部类 --- -# 5.12 Java内部类 - “在 Java 中,可以将一个类定义在另外一个类里面或者一个方法里面,这样的类叫做内部类。”我放下手中的枸杞杯,对三妹说,“一般来说,内部类分为成员内部类、局部内部类、匿名内部类和静态内部类。” ### **1)成员内部类** diff --git a/docs/src/oo/interface.md b/docs/src/oo/interface.md index e92455cb6..67eb63e5e 100644 --- a/docs/src/oo/interface.md +++ b/docs/src/oo/interface.md @@ -12,7 +12,6 @@ head: content: Java,接口,java interface --- -# 5.11 Java接口 “今天开始讲 Java 的接口。”我对三妹说,“对于面向对象编程来说,抽象是一个极具魅力的特征。如果一个程序员的抽象思维很差,那他在编程中就会遇到很多困难,无法把业务变成具体的代码。在 Java 中,可以通过两种形式来达到抽象的目的,一种上一篇的主角——[抽象类](https://javabetter.cn/oo/abstract.html),另外一种就是今天的主角——[接口](https://javabetter.cn/oo/interface.html)。” diff --git a/docs/src/oo/method.md b/docs/src/oo/method.md index 5a19d5ddd..3d928caf2 100644 --- a/docs/src/oo/method.md +++ b/docs/src/oo/method.md @@ -12,7 +12,6 @@ head: content: Java,方法,实例方法,静态方法,抽象方法,java方法 --- -# 5.4 Java中的方法 “二哥,这一节我们学什么呢?”三妹满是期待的问我。 diff --git a/docs/src/oo/native-method.md b/docs/src/oo/native-method.md index cb4d8d86c..c1af03beb 100644 --- a/docs/src/oo/native-method.md +++ b/docs/src/oo/native-method.md @@ -12,7 +12,6 @@ head: content: Java, C语言, Native方法, JNI,native,本地方法,java native method --- -# 5.6 Java native方法 “三妹,之前我们学习了 Java 中的[基本方法](https://javabetter.cn/oo/method.html),其实 Java 还有一种方法,本地方法,或者叫 native 方法,它与之前的方法有很大的不同。”我放下手中的手机,扭过脸来对三妹说。 diff --git a/docs/src/oo/object-class.md b/docs/src/oo/object-class.md index e867b3038..06e91c478 100644 --- a/docs/src/oo/object-class.md +++ b/docs/src/oo/object-class.md @@ -12,7 +12,6 @@ head: content: Java,类和对象, 面向对象编程 --- -# 5.1 Java中的类和对象 “二哥,那天我在图书馆复习《Java进阶之路》的时候,刚好碰见一个学长,他问我有没有‘对象’,我说还没有啊。结果你猜他说什么,‘要不要我给你 new 一个啊?’我当时就懵了,new 是啥意思啊,二哥?”三妹满是疑惑的问我。 diff --git a/docs/src/oo/package.md b/docs/src/oo/package.md index ba29694cd..c33e8d48d 100644 --- a/docs/src/oo/package.md +++ b/docs/src/oo/package.md @@ -12,7 +12,6 @@ head: content: Java,Java编程, 包, 代码组织, 代码管理, 包创建, 包导入,包,import,package --- -# 5.2 Java中的包 “三妹,这一节,我们简单过一下 Java 中的包,也就是 package,这个一点就透,很好掌握。”我放下手中的雪碧,翻开笔记本,登上 GitHub,点开《二哥的 Java 进阶之路》,找到这篇「Java 中的包」,开始滔滔不绝起来。 diff --git a/docs/src/oo/polymorphism.md b/docs/src/oo/polymorphism.md index 46de7a5b3..5401c1612 100644 --- a/docs/src/oo/polymorphism.md +++ b/docs/src/oo/polymorphism.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,Java多态,多态 --- -# 5.16 Java多态 “三妹啊,前面聊完了 Java 的[封装](https://javabetter.cn/oo/encapsulation.html)、[继承](https://javabetter.cn/oo/extends-bigsai.html),今天我们来继续聊多态,也是 Java 三大特性的最后一个特性,搞懂它,Java 面向对象编程基本上就能轻松拿捏了。”我对三妹说。 diff --git a/docs/src/oo/static.md b/docs/src/oo/static.md index 043679006..90ce4539c 100644 --- a/docs/src/oo/static.md +++ b/docs/src/oo/static.md @@ -12,7 +12,6 @@ head: content: Java,static,静态变量,静态方法,静态代码块,静态内部类,java static,static关键字 --- -# 5.15 Java static关键字 “哥,你牙龈肿痛轻点没?周一的《教妹学 Java》(二哥的Java进阶之路前身)你都没有更新,偷懒了呀!”三妹关心地问我。 diff --git a/docs/src/oo/this-super.md b/docs/src/oo/this-super.md index d695cfb37..356b33f90 100644 --- a/docs/src/oo/this-super.md +++ b/docs/src/oo/this-super.md @@ -12,7 +12,6 @@ head: content: Java,this,super,java this super,java this,java super,this super,this关键字, super关键字 --- -# 5.14 Java this和super关键字 “哥,被喊大舅子的感觉怎么样啊?”三妹不怀好意地对我说,她眼睛里充满着不屑。 diff --git a/docs/src/oo/var.md b/docs/src/oo/var.md index 2102e9ba8..53ed9f26a 100644 --- a/docs/src/oo/var.md +++ b/docs/src/oo/var.md @@ -12,8 +12,6 @@ head: content: Java,Java变量,局部变量,成员变量,静态变量,常量,变量 --- -# 5.3 Java中的变量 - “二哥,听说 Java 变量在以后的日子里经常用,能不能提前给我透露透露?”三妹咪了一口麦香可可奶茶后对我说。 “三妹啊,搬个凳子坐我旁边,听二哥来给你慢慢说啊。” diff --git a/docs/src/overview/IDEA-install-config.md b/docs/src/overview/IDEA-install-config.md index 630004cee..019eb719c 100644 --- a/docs/src/overview/IDEA-install-config.md +++ b/docs/src/overview/IDEA-install-config.md @@ -12,7 +12,6 @@ head: content: Java,Intellij IDEA, 安装教程, macOS, Windows, Java开发环境, 配置, 跨平台IDE --- -# 2.3 安装 IDEA IntelliJ IDEA 简称 IDEA,是业界公认为最好的 Java 集成开发工具,尤其是在代码自动提示、代码重构、代码版本管理、单元测试、代码分析等方面有着亮眼的发挥。 diff --git a/docs/src/overview/hello-world.md b/docs/src/overview/hello-world.md index 277a57096..7535cafce 100644 --- a/docs/src/overview/hello-world.md +++ b/docs/src/overview/hello-world.md @@ -12,7 +12,6 @@ head: content: Java,Intellij IDEA, Java程序, Hello World, 编写, 运行, Java新手, 入门教程 --- -# 2.4 第一个 Java 程序 “三妹,今天,我们来编写第一个 Java 程序,Hello World 期待吗?” diff --git a/docs/src/overview/java-can-do-what.md b/docs/src/overview/java-can-do-what.md index 38c1c45e8..6d7d19474 100644 --- a/docs/src/overview/java-can-do-what.md +++ b/docs/src/overview/java-can-do-what.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,Java 优势,特点,java前途 --- -# 2.3 学 Java 还有前途吗? 尽管 Java 已经 25 岁了,但仍然“宝刀未老”。在 Stack Overflow 2019 年流行编程语言调查报告中,Java 位居第 5 位,有 41% 的受调开发者认为 Java 仍然是一门受欢迎的编程语言。 diff --git a/docs/src/overview/java-history.md b/docs/src/overview/java-history.md index a400a0ad8..0c7449e59 100644 --- a/docs/src/overview/java-history.md +++ b/docs/src/overview/java-history.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,Java简史 --- -# 2.2 Java发展简史 20 世纪 90 年代,单片式计算机系统诞生。单片式计算机系统不仅廉价(之前的计算机非常庞大,并且昂贵),而且功能强大,可以大幅度提升消费性电子产品的智能化程度。 diff --git a/docs/src/overview/jdk-install-config.md b/docs/src/overview/jdk-install-config.md index 9251137d8..05a5031cf 100644 --- a/docs/src/overview/jdk-install-config.md +++ b/docs/src/overview/jdk-install-config.md @@ -12,7 +12,6 @@ head: content: JDK安装, Windows, macOS, Chocolatey, Homebrew, 环境变量, Java开发环境, 包管理器 --- -# 2.2 安装 JDK 因为 Java 程序必须运行在 JVM 之上,所以我们 Java 程序员在学习 Java 之前,要做的第一件事情就是安装 JDK。 diff --git a/docs/src/overview/readme.md b/docs/src/overview/readme.md index 62a12e485..879411266 100644 --- a/docs/src/overview/readme.md +++ b/docs/src/overview/readme.md @@ -14,7 +14,6 @@ head: ![](https://cdn.tobebetterjavaer.com/stutymore/README-20240130071411.png) -# 第一章:小册简介 以上就是《二哥的 Java 进阶之路》小册的封面了,自我感觉还不错哈,简洁大方,但包含的信息又足够的丰富: diff --git a/docs/src/overview/what-is-java.md b/docs/src/overview/what-is-java.md index ee953e04e..c6c0b78eb 100644 --- a/docs/src/overview/what-is-java.md +++ b/docs/src/overview/what-is-java.md @@ -12,7 +12,6 @@ head: content: Java,Java 由来, Java 发展简史, Java 特性,Java 学习前景 --- -# 2.1 Java简介 “二哥,到底什么是 Java?给我说说呗。” diff --git a/docs/src/pdf/readme.md b/docs/src/pdf/readme.md index 1491139c1..bde863ae4 100644 --- a/docs/src/pdf/readme.md +++ b/docs/src/pdf/readme.md @@ -7,7 +7,6 @@ tag: - PDF --- -# 📚PDF干货笔记,附下载地址 - [👏下载→Linux速查备忘手册.pdf](linux.md) - [👏下载→超1000本计算机经典书籍分享](java.md) diff --git a/docs/src/sidebar/kusen/javase.md b/docs/src/sidebar/kusen/javase.md index e0b9f0b93..e44d6b022 100644 --- a/docs/src/sidebar/kusen/javase.md +++ b/docs/src/sidebar/kusen/javase.md @@ -1,4 +1,4 @@ -## Java 基础 +# Java 基础 ### Java 概述 diff --git a/docs/src/socket/http.md b/docs/src/socket/http.md index 6a969bc2b..e03583904 100644 --- a/docs/src/socket/http.md +++ b/docs/src/socket/http.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,JavaSocket,java网络编程,网络编程,http,socket http,http 服务器,java 服务器,HTTP服务器 --- -# 11.3 用Socket实现一个HTTP服务器 作为一个 Java 后端,提供 HTTP 服务可以说是基本技能之一了,但是你真的了解 HTTP 协议么?你知道知道如何手撸一个 HTTP 服务器么?Tomcat 的底层是怎么支持 HTTP 服务的呢?大名鼎鼎的 Servlet 又是什么东西呢,该怎么使用呢? diff --git a/docs/src/socket/network-base.md b/docs/src/socket/network-base.md index 5ae6171b4..44c07b245 100644 --- a/docs/src/socket/network-base.md +++ b/docs/src/socket/network-base.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,JavaSocket,java网络编程,网络编程,java 计算机网络,计算机网络 --- -# 11.1 了解网络编程的基础知识 在学习 Java 网络编程之前,我们先来了解什么是计算机网络。 diff --git a/docs/src/socket/socket.md b/docs/src/socket/socket.md index 156af4d09..1b36a4984 100644 --- a/docs/src/socket/socket.md +++ b/docs/src/socket/socket.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,Java入门,教程,JavaSocket,java网络编程,socket,网络编程,java socket,java 网络编程 --- -# 11.2 网络编程的核心套接字Socket 在古代,由于通信不便利,一些聪明的人就利用鸽子会飞且飞得比较快、会辨认方向的优点,对其进行了驯化,用来进行消息的传递——也就是所谓的“飞鸽传书”。而在 Java 中,网络套接字(Socket)扮演了同样的角色。 diff --git a/docs/src/springboot/cors.md b/docs/src/springboot/cors.md index aef902df3..2ad305f86 100644 --- a/docs/src/springboot/cors.md +++ b/docs/src/springboot/cors.md @@ -1,4 +1,4 @@ -## 前后端分离项目,如何解决跨域问题? +# 前后端分离项目,如何解决跨域问题? 跨域问题是前后端分离项目中非常常见的一个问题,举例来说,编程猫([codingmore](https://github.com/itwanger/coding-more))学习网站的前端服务跑在 8080 端口下,后端服务跑在 9002 端口下,那么前端在请求后端接口的时候就会出现跨域问题。 diff --git a/docs/src/springboot/jwt.md b/docs/src/springboot/jwt.md index 6b08cc0a8..7f5de4cd9 100644 --- a/docs/src/springboot/jwt.md +++ b/docs/src/springboot/jwt.md @@ -1,4 +1,4 @@ -## 干掉Session?这个跨域认证解决方案真的优雅! +# 干掉Session?这个跨域认证解决方案真的优雅! 用户登录认证是 Web 应用中非常常见的一个业务,一般的流程是这样的: diff --git a/docs/src/springboot/lombok.md b/docs/src/springboot/lombok.md index 033ee12d6..ec47ab4f4 100644 --- a/docs/src/springboot/lombok.md +++ b/docs/src/springboot/lombok.md @@ -8,7 +8,6 @@ subTitle: 整合 Lombok discription: Lombok 是一个流行的 Java 库,旨在通过注解的方式简化 Java 代码,减少模板代码的编写。它通过在编译时自动生成常用的 Java 代码(如 getters、setters、constructors、toString、equals、hashCode 等方法),使得源代码更加简洁。 --- -# 第二节:整合 Lombok Spring Boot 早在 2.1.x 版本后就在 starter 中内置了 Lombok 依赖,Intellij IDEA 也早在 IDEA 2020.3 版本的时候内置了 Lombok 插件。为什么它们都要支持 Lombok 呢?Lombok 到底有啥牛皮的?今天我们就来补上这一课。 diff --git a/docs/src/springboot/readme.md b/docs/src/springboot/readme.md index 9e275f0c7..d230685b6 100644 --- a/docs/src/springboot/readme.md +++ b/docs/src/springboot/readme.md @@ -1 +1 @@ -二哥的 Spring Boot 进阶之路 \ No newline at end of file +# 二哥的 Spring Boot 进阶之路 \ No newline at end of file diff --git a/docs/src/string/builder-buffer.md b/docs/src/string/builder-buffer.md index e4426eb90..664232c48 100644 --- a/docs/src/string/builder-buffer.md +++ b/docs/src/string/builder-buffer.md @@ -12,7 +12,6 @@ head: content: Java,String,StringBuilder,StringBuffer --- -# 4.8 StringBuilder和StringBuffer “哥,[上一篇深入理解 String.intern()](https://javabetter.cn/string/intern.html) 讲到了 StringBuilder,这一节我们就来聊聊吧!”三妹很期待。 diff --git a/docs/src/string/constant-pool.md b/docs/src/string/constant-pool.md index ff3ac7bfe..6e82d280f 100644 --- a/docs/src/string/constant-pool.md +++ b/docs/src/string/constant-pool.md @@ -12,7 +12,6 @@ head: content: Java,java字符串,java String,java常量池,java字符串常量池,string常量池,字符串常量池 --- -# 4.6 字符串常量池 “三妹,今天我们来学习一下字符串常量池,这是字符串中非常关键的一个知识点。”我话音未落,青岛路小学那边传来了嘹亮的歌声就钻进了我的耳朵,“唱 ~ 山 ~ 歌 ~”,我都有点情不自禁地哼唱起来了。 diff --git a/docs/src/string/equals.md b/docs/src/string/equals.md index fb1a4c512..ca377bafa 100644 --- a/docs/src/string/equals.md +++ b/docs/src/string/equals.md @@ -12,7 +12,6 @@ head: content: Java,string,Java字符串, 字符串比较, equals, ==, 字符串相等 --- -# 4.9 如何判断字符串相等 “二哥,如何比较两个字符串相等啊?”三妹问。 diff --git a/docs/src/string/immutable.md b/docs/src/string/immutable.md index f0c9f991a..13bc1f37e 100644 --- a/docs/src/string/immutable.md +++ b/docs/src/string/immutable.md @@ -12,7 +12,6 @@ head: content: Java, String, 不可变, 字符串 --- -# 4.5 字符串为什么不可变 String 可能是 Java 中使用频率最高的引用类型了,因此 String 类的设计者可以说是用心良苦。 diff --git a/docs/src/string/intern.md b/docs/src/string/intern.md index 2900563ca..7cc4112b0 100644 --- a/docs/src/string/intern.md +++ b/docs/src/string/intern.md @@ -12,7 +12,6 @@ head: content: Java,字符串,String,intern,string intern,java intern,java string intern,String.intern --- -# 4.7 String.intern详解 “哥,你发给我的那篇文章我看了,结果直接把我给看得不想学 Java 了!”三妹气冲冲地说。 diff --git a/docs/src/string/join.md b/docs/src/string/join.md index a1b5f1685..df17e1614 100644 --- a/docs/src/string/join.md +++ b/docs/src/string/join.md @@ -12,7 +12,6 @@ head: content: Java,字符串,String,字符串拼接,java字符串拼接,java string拼接 --- -# 4.10 如何拼接字符串 “哥,你让我看的《[Java 开发手册](https://javabetter.cn/pdf/ali-java-shouce.html)》上有这么一段内容:循环体内,拼接字符串最好使用 StringBuilder 的 `append()` 方法,而不是 + 号操作符。这是为什么呀?”三妹疑惑地问。 diff --git a/docs/src/string/split.md b/docs/src/string/split.md index 38e138068..36b78c63e 100644 --- a/docs/src/string/split.md +++ b/docs/src/string/split.md @@ -12,7 +12,6 @@ head: content: Java,字符串,String,字符串拆分 --- -# 4.11 如何拆分字符串 “哥,我感觉字符串拆分没什么可讲的呀,直接上 String 类的 `split()` 方法不就可以了!”三妹毫不客气地说。 diff --git a/docs/src/string/string-source.md b/docs/src/string/string-source.md index 8c767d8f4..352e45eaf 100644 --- a/docs/src/string/string-source.md +++ b/docs/src/string/string-source.md @@ -12,7 +12,6 @@ head: content: Java, String类, 源码, 源码解析, 字符串操作,String --- -# 4.4 字符串源码解读 我正坐在沙发上津津有味地读刘欣大佬的《码农翻身》——Java 帝国这一章,门铃响了。起身打开门一看,是三妹,她从学校回来了。 diff --git a/docs/src/szjy/tupian-zhuanlian.md b/docs/src/szjy/tupian-zhuanlian.md index d3c295260..7b404ab65 100644 --- a/docs/src/szjy/tupian-zhuanlian.md +++ b/docs/src/szjy/tupian-zhuanlian.md @@ -1,3 +1,5 @@ +# 图片转链 + 作为一名技术博主,经常需要把同一份 MD 文件同步到不同的博客平台,以求获得更多的曝光,从而帮助到更多的小伙伴——瞧我这“达则兼济天下”的雄心壮志。像 CSDN 和掘金这两个博客平台都有自己的外链图片解析功能。 当我把 MD 源文档复制到 CSDN 或者掘金的编辑器中,它们会自动地帮我把外链转成内链,这样我就不用再重新上传图片,也不需要配置自己的图床了,否则图片会因为防盗链的原因显示不出来。 diff --git a/docs/src/thread/BlockingQueue.md b/docs/src/thread/BlockingQueue.md index b729ae01c..f239958a1 100644 --- a/docs/src/thread/BlockingQueue.md +++ b/docs/src/thread/BlockingQueue.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,BlockingQueue --- -# 第二十二节:阻塞队列 BlockingQueue BlockingQueue 是 Java 中的一个接口,它代表了一个线程安全的队列,不仅可以由多个线程并发访问,还添加了等待/通知机制,以便在队列为空时阻塞获取元素的线程,直到队列变得可用,或者在队列满时阻塞插入元素的线程,直到队列变得可用。 diff --git a/docs/src/thread/ConcurrentHashMap.md b/docs/src/thread/ConcurrentHashMap.md index bf7d361f2..29ef8766f 100644 --- a/docs/src/thread/ConcurrentHashMap.md +++ b/docs/src/thread/ConcurrentHashMap.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,ConcurrentHashMap --- -# 第二十节:并发容器 ConcurrentHashMap ConcurrentHashMap 是 Java 并发包 (java.util.concurrent) 中的一种线程安全的哈希表实现。 diff --git a/docs/src/thread/ConcurrentLinkedQueue.md b/docs/src/thread/ConcurrentLinkedQueue.md index edb12ded2..ef45e478e 100644 --- a/docs/src/thread/ConcurrentLinkedQueue.md +++ b/docs/src/thread/ConcurrentLinkedQueue.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,ConcurrentLinkedQueue --- -# 第二十一节:非阻塞队列ConcurrentLinkedQueue ConcurrentLinkedQueue 是 `java.util.concurrent`(JUC) 包下的一个线程安全的队列实现。基于非阻塞算法(Michael-Scott 非阻塞算法的一种变体),这意味着 ConcurrentLinkedQueue 不再使用传统的锁机制来保护数据安全,而是依靠底层原子的操作(如 [CAS](https://javabetter.cn/thread/cas.html))来实现。 diff --git a/docs/src/thread/CopyOnWriteArrayList.md b/docs/src/thread/CopyOnWriteArrayList.md index 426b357b3..230e8fe59 100644 --- a/docs/src/thread/CopyOnWriteArrayList.md +++ b/docs/src/thread/CopyOnWriteArrayList.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,CopyOnWriteArrayList --- -# 第二十三节:并发容器 CopyOnWriteArrayList 学过 [ArrayList](https://javabetter.cn/collection/arraylist.html) 的小伙伴应该记得,ArrayList 是一个线程不安全的容器,如果在多线程环境下使用,需要手动加锁,或者使用 `Collections.synchronizedList()` 方法将其转换为线程安全的容器。 diff --git a/docs/src/thread/LockSupport.md b/docs/src/thread/LockSupport.md index 23aef92da..0c4ed3592 100644 --- a/docs/src/thread/LockSupport.md +++ b/docs/src/thread/LockSupport.md @@ -12,8 +12,6 @@ head: content: Java,并发编程,多线程,Thread,LockSupport --- -# 第十八节:线程阻塞唤醒类 LockSupport - LockSupprot 用来阻塞和唤醒线程,底层实现依赖于 [Unsafe 类](https://javabetter.cn/thread/Unsafe.html)(后面会细讲)。 该类包含一组用于阻塞和唤醒线程的静态方法,这些方法主要是围绕 park 和 unpark 展开,话不多说,直接来看一个简单的例子吧。 diff --git a/docs/src/thread/ReentrantReadWriteLock.md b/docs/src/thread/ReentrantReadWriteLock.md index 7987d32c3..a2856f8b4 100644 --- a/docs/src/thread/ReentrantReadWriteLock.md +++ b/docs/src/thread/ReentrantReadWriteLock.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,读写锁,ReentrantReadWriteLock --- -# 第十六节:读写锁 ReentrantReadWriteLock ReentrantReadWriteLock 是 Java 的一种读写锁,它允许多个读线程同时访问,但只允许一个写线程访问(会阻塞所有的读写线程)。这种锁的设计可以提高性能,特别是在读操作的数量远远超过写操作的情况下。 diff --git a/docs/src/thread/ScheduledThreadPoolExecutor.md b/docs/src/thread/ScheduledThreadPoolExecutor.md index 5cf1d43fd..8c58e12ba 100644 --- a/docs/src/thread/ScheduledThreadPoolExecutor.md +++ b/docs/src/thread/ScheduledThreadPoolExecutor.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,ScheduledThreadPoolExecutor,定时任务 --- -# 第二十六节:定时任务 ScheduledThreadPoolExecutor 定时任务 `ScheduledThreadPoolExecutor` 类有两个用途:指定时间延迟后执行任务;周期性重复执行任务。 diff --git a/docs/src/thread/ThreadLocal.md b/docs/src/thread/ThreadLocal.md index 934dd0d1d..1b49251cd 100644 --- a/docs/src/thread/ThreadLocal.md +++ b/docs/src/thread/ThreadLocal.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,ThreadLocal --- -# 第二十四节:本地变量 ThreadLocal 是 Java 中提供的一种用于实现线程局部变量的工具类。它允许每个线程都拥有自己的独立副本,从而实现线程隔离,用于解决多线程中共享对象的线程安全问题。 diff --git a/docs/src/thread/Unsafe.md b/docs/src/thread/Unsafe.md index cc6b1a530..4f8c84d5f 100644 --- a/docs/src/thread/Unsafe.md +++ b/docs/src/thread/Unsafe.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,Unsafe --- -# 第二十八节:魔法类 Unsafe 前面我们在讲 [CAS](https://javabetter.cn/thread/cas.html) 和[原子操作 atomic 类](https://javabetter.cn/thread/atomic.html)的时候,都讲到了 Unsafe。 diff --git a/docs/src/thread/ali-executors.md b/docs/src/thread/ali-executors.md index 57f6bbfde..4918cdca5 100644 --- a/docs/src/thread/ali-executors.md +++ b/docs/src/thread/ali-executors.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,Executors,线程池 --- -# 为什么阿里巴巴要禁用Executors创建线程池? 看阿里巴巴开发手册并发编程这块有一条:**线程池不允许使用 Executors 去创建,而是通过 ThreadPoolExecutor 的方式**,今天我们来通过源码分析一下禁用的原因。 diff --git a/docs/src/thread/aqs.md b/docs/src/thread/aqs.md index 0a71015d2..d11783dd4 100644 --- a/docs/src/thread/aqs.md +++ b/docs/src/thread/aqs.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,AQS,抽象队列同步器 --- -# 第十三节:抽象队列同步器 AQS **AQS**是`AbstractQueuedSynchronizer`的简称,即`抽象队列同步器`,从字面上可以这样理解: diff --git a/docs/src/thread/atomic.md b/docs/src/thread/atomic.md index 7603799f7..df4ac1e4e 100644 --- a/docs/src/thread/atomic.md +++ b/docs/src/thread/atomic.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,atomic,原子类,AtomicInteger,AtomicIntegerArray,LongAdder,AtomicReference --- -# 第二十七节:原子操作类 Atomic 我们前面讲过 [CAS](https://javabetter.cn/thread/cas.html),相信大家都还有印象,Java 中的原子操作类,如 AtomicInteger 和 AtomicLong,底层就是利用 CAS 来确保变量更新的原子性的。 diff --git a/docs/src/thread/callable-future-futuretask.md b/docs/src/thread/callable-future-futuretask.md index 89256b05f..a4e50dcf3 100644 --- a/docs/src/thread/callable-future-futuretask.md +++ b/docs/src/thread/callable-future-futuretask.md @@ -12,7 +12,6 @@ head: content: Java, 多线程, Callable, Future, FutureTask, 线程执行结果 --- -# 第二节:获取线程的执行结果 [在第一节:初步掌握 Java 多线程中](https://javabetter.cn/thread/wangzhe-thread.html),我们讲述了创建线程的 3 种方式,一种是直接继承 Thread,一种是实现 Runnable 接口,另外一种是实现 Callable 接口。 diff --git a/docs/src/thread/cas.md b/docs/src/thread/cas.md index 85abf8611..1fe54bacb 100644 --- a/docs/src/thread/cas.md +++ b/docs/src/thread/cas.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,cas --- -# 第十二节:乐观锁 CAS CAS(Compare-and-Swap)是一种乐观锁的实现方式,全称为“比较并交换”,是一种无锁的原子操作。 diff --git a/docs/src/thread/completable-future.md b/docs/src/thread/completable-future.md index 2648cebf5..c1163e07b 100644 --- a/docs/src/thread/completable-future.md +++ b/docs/src/thread/completable-future.md @@ -13,7 +13,6 @@ head: content: Java,并发编程,多线程,Thread,CompletableFuture --- -# 第三十二节:CompletableFuture ![](https://cdn.tobebetterjavaer.com/paicoding/f03e03c886766e6c0f4aaf4602271a0d.jpg) diff --git a/docs/src/thread/condition.md b/docs/src/thread/condition.md index c53993914..b94cde14b 100644 --- a/docs/src/thread/condition.md +++ b/docs/src/thread/condition.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,Condition --- -# 第十七节:等待通知条件 Condition 关于等待通知条件 Condition 我们在前面讲 [ReentrantLock](https://javabetter.cn/thread/reentrantLock.html) 的时候提到过,不知道大家还记得不? diff --git a/docs/src/thread/fork-join.md b/docs/src/thread/fork-join.md index bf7984cdc..55358dda3 100644 --- a/docs/src/thread/fork-join.md +++ b/docs/src/thread/fork-join.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,ForkJoin,ForkJoinPool,ForkJoinTask --- -# 第三十节:Fork/Join 并发编程领域的任务可以分为三种:简单并行任务、聚合任务和批量并行任务,见下图。 diff --git a/docs/src/thread/jmm.md b/docs/src/thread/jmm.md index bf6d97833..4c114378a 100644 --- a/docs/src/thread/jmm.md +++ b/docs/src/thread/jmm.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,内存模型,JMM --- -# 第七节:Java的内存模型(JMM) 某年某月的某一天,小二去蚂蚁金服面试了,一上来,面试官老王就问他:『说说什么是 Java 的内存模型(JMM)吧?』 diff --git a/docs/src/thread/lock.md b/docs/src/thread/lock.md index 014312619..b05abd4d8 100644 --- a/docs/src/thread/lock.md +++ b/docs/src/thread/lock.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,锁,JUC,ReentrantLock,StampedLock,ReadWriteLock,Condition,锁分类 --- -# 第十四节:锁分类和 JUC 前面我们介绍了基于对象的原生锁——[synchronized](https://javabetter.cn/thread/synchronized-1.html),实际上,Java 在`java.util.concurrent`(JUC)包下,还为我们提供了更多的锁类和锁接口(尤其是子包 locks 下),它们有更强大的功能或更牛逼的性能。 diff --git a/docs/src/thread/map.md b/docs/src/thread/map.md index ba60fa2a2..70f297760 100644 --- a/docs/src/thread/map.md +++ b/docs/src/thread/map.md @@ -12,8 +12,6 @@ head: content: Java,并发编程,多线程,Thread,并发集合容器 --- -# 第十九节:Java的并发容器 - Java 的并发集合容器提供了在多线程环境中高效访问和操作的数据结构。这些容器通过内部的同步机制实现了线程安全,使得开发者无需显式同步代码就能在并发环境下安全使用,比如说:ConcurrentHashMap、阻塞队列和 CopyOnWrite 容器等。 java.util 包下提供了一些容器类([集合框架](https://javabetter.cn/collection/gailan.html)),其中 Vector 和 Hashtable 是线程安全的,但实现方式比较粗暴,通过在方法上加「[sychronized](https://javabetter.cn/thread/synchronized-1.html)」关键字实现。 diff --git a/docs/src/thread/pianxiangsuo.md b/docs/src/thread/pianxiangsuo.md index 59b05dabe..c29ee3c67 100644 --- a/docs/src/thread/pianxiangsuo.md +++ b/docs/src/thread/pianxiangsuo.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,偏向锁 --- -# 第十一节:深入浅出偏向锁 在 JDK 1.5 之前,面对 Java 并发问题, [synchronized](https://javabetter.cn/thread/synchronized-1.html) 是一招鲜的解决方案: diff --git a/docs/src/thread/pool.md b/docs/src/thread/pool.md index b52b1c073..97608c0d4 100644 --- a/docs/src/thread/pool.md +++ b/docs/src/thread/pool.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,线程池,ThreadPoolExecutor,Executors --- -# 第二十五节:线程池 好,终于到 Java 的线程池了,这是 Java 并发编程中非常重要的一块内容,今天我们就通过图文的方式来彻底弄懂线程池的工作原理,以及在实际项目中该如何自定义适合业务的线程池。 diff --git a/docs/src/thread/readme.md b/docs/src/thread/readme.md index 1d83f8b38..4eb95ffc8 100644 --- a/docs/src/thread/readme.md +++ b/docs/src/thread/readme.md @@ -12,7 +12,6 @@ head: content: Java,Java SE,Java基础,Java教程,二哥的Java进阶之路,Java进阶之路,简介,github,pdf,二哥的Java进阶之路.pdf,Java进阶之路.pdf,并发编程 --- -# 第零节:小册简介 大家好,我是二哥呀。 diff --git a/docs/src/thread/reentrantLock.md b/docs/src/thread/reentrantLock.md index b843c06a8..6abcba809 100644 --- a/docs/src/thread/reentrantLock.md +++ b/docs/src/thread/reentrantLock.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,锁,ReentrantLock --- -# 第十五节:重入锁 ReentrantLock ReentrantLock 重入锁,是实现[Lock 接口](https://javabetter.cn/thread/suo.html)的一个类,也是在实际编程中使用频率很高的一个锁,**支持重入性,表示能够对共享资源重复加锁,即当前线程获取该锁后再次获取不会被阻塞**。 diff --git a/docs/src/thread/shengchanzhe-xiaofeizhe.md b/docs/src/thread/shengchanzhe-xiaofeizhe.md index dbd59ae40..abe64ccef 100644 --- a/docs/src/thread/shengchanzhe-xiaofeizhe.md +++ b/docs/src/thread/shengchanzhe-xiaofeizhe.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,生产者-消费者,生产者消费者,生产者,消费者 --- -# 第三十一节:生产者-消费者模式 生产者-消费者模式是一个十分经典的多线程并发协作模式,弄懂生产者-消费者问题能够让我们对并发编程的理解加深。 diff --git a/docs/src/thread/synchronized-1.md b/docs/src/thread/synchronized-1.md index 4a7a7af4b..340b805b9 100644 --- a/docs/src/thread/synchronized-1.md +++ b/docs/src/thread/synchronized-1.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,synchronized --- -# 第九节:synchronized关键字 “三妹,今天我们来学习 synchronized 关键字吧。”我瞅了一眼坐在沙发上的三妹说,她正在王者荣耀呢。 diff --git a/docs/src/thread/synchronized.md b/docs/src/thread/synchronized.md index b15c645c7..181ae51ba 100644 --- a/docs/src/thread/synchronized.md +++ b/docs/src/thread/synchronized.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,synchronized,偏向锁,轻量级锁,重量级锁,锁 --- -# 第十节:synchronized的四种锁状态 前面一节我们讲了 [synchronized 关键字的基本使用](https://javabetter.cn/thread/synchronized-1.html),它能用来同步方法和代码块,那 synchronized 到底锁的是什么呢?随着 JDK 版本的升级,synchronized 又做出了哪些改变呢?“synchronized 性能很差”的谣言真的存在吗? diff --git a/docs/src/thread/thread-bring-some-problem.md b/docs/src/thread/thread-bring-some-problem.md index 0c1bbe81c..9dea5f02f 100644 --- a/docs/src/thread/thread-bring-some-problem.md +++ b/docs/src/thread/thread-bring-some-problem.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread --- -# 第六节:线程的安全性问题 前面我们了解到,[多线程技术有很多好处](https://tobebetterjavaer.com/thread/why-need-thread.html),比如说多线程可以充分利用多核 CPU 的计算能力,那多线程难道就没有一点缺点吗? diff --git a/docs/src/thread/thread-group-and-thread-priority.md b/docs/src/thread/thread-group-and-thread-priority.md index 0066c8466..44e0a663f 100644 --- a/docs/src/thread/thread-group-and-thread-priority.md +++ b/docs/src/thread/thread-group-and-thread-priority.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,线程组,线程优先级 --- -# 第四节:线程组和线程优先级 Java 提供了 ThreadGroup 类来创建一组相关的线程,使线程组管理更方便。每个 Java 线程都有一个优先级,这个优先级会影响到操作系统为这个线程分配处理器时间的顺序。 diff --git a/docs/src/thread/thread-state-and-method.md b/docs/src/thread/thread-state-and-method.md index 92ab2dbb5..731f0c513 100644 --- a/docs/src/thread/thread-state-and-method.md +++ b/docs/src/thread/thread-state-and-method.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,线程状态 --- -# 第三节:Java 线程的 6 种状态 我们先来看看操作系统中的线程状态转换。在[操作系统](https://javabetter.cn/xuexiluxian/os.html)中,线程被视为轻量级的进程,所以**线程状态其实和进程状态是一致的**。 diff --git a/docs/src/thread/volatile.md b/docs/src/thread/volatile.md index 6c53c3504..ddcaa6e8e 100644 --- a/docs/src/thread/volatile.md +++ b/docs/src/thread/volatile.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,volatile --- -# 第八节:volatile 关键字 “三妹啊,这节我们来学习 Java 中的 volatile 关键字吧,以及容易遇到的坑。”看着三妹好学的样子,我倍感欣慰。 diff --git a/docs/src/thread/wangzhe-thread.md b/docs/src/thread/wangzhe-thread.md index b2304fe31..1178e57c5 100644 --- a/docs/src/thread/wangzhe-thread.md +++ b/docs/src/thread/wangzhe-thread.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread --- -# 第一节:Java多线程入门 对于 Java 初学者来说,多线程的很多概念听起来就很难理解。比方说: diff --git a/docs/src/thread/why-need-thread.md b/docs/src/thread/why-need-thread.md index 0ff0c8dfc..795b3d50e 100644 --- a/docs/src/thread/why-need-thread.md +++ b/docs/src/thread/why-need-thread.md @@ -12,7 +12,6 @@ head: content: Java,并发编程,多线程,Thread,进程,线程 --- -# 第五节:进程与线程的区别 经过前面几章的学习,我们对线程的基本概念和使用方式已经有了比较充分的了解,那么接下来我们就来分析一下,线程是如何从进程进化而来的,它们之间又有哪些区别,搞清楚两者之间的差别对接下来的学习也是至关重要的,甚至有些公司的面试官也喜欢问这个。 diff --git a/docs/src/xianliaolaoke/aliyun-shuaiguo-gongchengshi.md b/docs/src/xianliaolaoke/aliyun-shuaiguo-gongchengshi.md index 6e409079c..eaba8d3b5 100644 --- a/docs/src/xianliaolaoke/aliyun-shuaiguo-gongchengshi.md +++ b/docs/src/xianliaolaoke/aliyun-shuaiguo-gongchengshi.md @@ -1,3 +1,5 @@ +# 阿里云的售后工程师真的垃圾 + 真不是我有意要黑这个阿里云工程师,而是他冷漠的态度,超级高水平的甩锅能力,彻彻底底把我给打败了! 给大家看一下我们的第一波交锋。从在线沟通转工单的时候,为了给这位阿里云的售后工程师加油打气,我还特意准备了一句“辛苦了”,就差跪下了。 diff --git a/docs/src/xianliaolaoke/chadiansanhuo.md b/docs/src/xianliaolaoke/chadiansanhuo.md index 415e5a953..ebc954f6a 100644 --- a/docs/src/xianliaolaoke/chadiansanhuo.md +++ b/docs/src/xianliaolaoke/chadiansanhuo.md @@ -1,3 +1,5 @@ +# 编程喵差点散伙了。 + 大家好,我是二哥呀! 今天和两个合伙人开了个腾讯会议,没想到差点因为一个功能上的分歧散了伙!!好在大家都是奔三的男人了,吵归吵,但都是奔着做事去的。 diff --git a/docs/src/xianliaolaoke/chengxuyuannv-chonghui-java.md b/docs/src/xianliaolaoke/chengxuyuannv-chonghui-java.md index abe6e0696..9824cb58f 100644 --- a/docs/src/xianliaolaoke/chengxuyuannv-chonghui-java.md +++ b/docs/src/xianliaolaoke/chengxuyuannv-chonghui-java.md @@ -1,4 +1,4 @@ - +# 实体店小姐姐想转行学Java 大家好,我是二哥呀!前几天一个91年的小姐姐给我发私信说,她19年回老家创业开了个实体店做建材生意,但受困于疫情,生意越来越不好做,**于是就萌生重回软件开发 base 武汉**的想法,问我有什么建议。 diff --git a/docs/src/xianliaolaoke/daxue-nuli-jisuanji.md b/docs/src/xianliaolaoke/daxue-nuli-jisuanji.md index 1cbeb7625..778b394d5 100644 --- a/docs/src/xianliaolaoke/daxue-nuli-jisuanji.md +++ b/docs/src/xianliaolaoke/daxue-nuli-jisuanji.md @@ -1,3 +1,5 @@ +# 大学计算机系最努力的同学都是如何学习的? + 过年的时候,在知乎上刷到这样一个话题:**大学计算机系最努力的同学都是如何学习的**? 我一下子就想起了 10 年前的自己,非清北复交 985 牛逼学历,智商平平,就靠一个人的努力,毕业的时候竟然也拿到了心仪的 offer。 diff --git a/docs/src/xianliaolaoke/fumutuanju.md b/docs/src/xianliaolaoke/fumutuanju.md index 77fca638c..35dbad81c 100644 --- a/docs/src/xianliaolaoke/fumutuanju.md +++ b/docs/src/xianliaolaoke/fumutuanju.md @@ -1,3 +1,5 @@ +# 二哥的家乡之行:父母团聚的意义 + 大家好,我是二哥呀!刚好趁着周末,就带老婆、女儿、妹妹一起从洛阳来三门峡和父母小聚了一下。洛阳到三门峡的距离,大概就 11 个小时的骑行时间,开车大概 2 个小时。 ![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/xianliaolaoke/fumutuanju-1.png) diff --git a/docs/src/xuexijianyi/benkesheng-ali-tengxun.md b/docs/src/xuexijianyi/benkesheng-ali-tengxun.md index 66a7219ce..23b581484 100644 --- a/docs/src/xuexijianyi/benkesheng-ali-tengxun.md +++ b/docs/src/xuexijianyi/benkesheng-ali-tengxun.md @@ -12,8 +12,7 @@ head: --- -前言 ------- +## 前言 diff --git a/docs/src/xuexiluxian/java/jvm.md b/docs/src/xuexiluxian/java/jvm.md index 4628d04c4..263000f81 100644 --- a/docs/src/xuexiluxian/java/jvm.md +++ b/docs/src/xuexiluxian/java/jvm.md @@ -13,7 +13,6 @@ head: content: Java,JVM,Java虚拟机,Java虚拟机学习路线,Java学习路线,Java教程,Java开发,Java入门 --- -# JVM学习路线 2020 年的时候,通读了一遍周志明老师的《深入理解 Java 虚拟机:JVM 高级特性与最佳实践》第三版,读完之后受益匪浅,这让我对 Java 虚拟机有了一个更完整的认识。毫无疑问,《深入理解 Java 虚拟机》是 JVM 书籍中最好的一本书了,国产技术书的天花板。 diff --git a/docs/src/xuexiluxian/java/thread.md b/docs/src/xuexiluxian/java/thread.md index 03f7f205f..27e611d6c 100644 --- a/docs/src/xuexiluxian/java/thread.md +++ b/docs/src/xuexiluxian/java/thread.md @@ -13,7 +13,6 @@ head: content: Java,并发编程,并发编程学习路线,Java多线程,学习路线,Java学习路线,Java教程,Java开发,Java入门 --- -# Java并发编程 众所周知,Java 并发是 Java 程序员必须懂但又很难懂的一块知识点。一般来说,很少有人敢说自己精通 Java 并发的,一是容易被面试官吊打,二是并发编程涉及到操作系统、内存、CPU 等计算机专业比较核心的内容,比较考验一个程序员的内功。