提交 2fc4aea9 编写于 作者: 沉默王二's avatar 沉默王二 💬

重要知识点

上级 7fba4269
......@@ -157,7 +157,7 @@
## 集合框架(容器)
- [聊聊Java的集合框架](docs/collection/gailan.md)
- [聊聊Java的集合框架的构成(概览)](docs/collection/gailan.md)
- [简单聊一下时间复杂度](docs/collection/time-complexity.md)
- [Java ArrayList详解(附源码分析)](docs/collection/arraylist.md)
- [Java LinkedList详解(附源码分析)](docs/collection/linkedlist.md)
......@@ -210,7 +210,7 @@
- [Java 8 Optional最佳指南](docs/java8/optional.md)
- [深入浅出Java 8 Lambda表达式](docs/java8/Lambda.md)
## Java重要知识点
## 重要知识点
- [Java命名规范](docs/basic-extra-meal/java-naming.md)
- [彻底弄懂Java中的Unicode和UTF-8编码](docs/basic-extra-meal/java-unicode.md)
......
---
title: Comparable和Comparator的区别
title: Java 中Comparable和Comparator的区别
shortTitle: Comparable和Comparator
category:
- Java核心
......
---
title: 深入理解Java中的泛型
shortTitle: 泛型
shortTitle: 关于Java泛型
category:
- Java核心
tag:
......@@ -12,7 +12,7 @@ head:
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,java,泛型,java 泛型,java generic
---
# 6.6 泛型
# 6.6 关于Java泛型
“二哥,为什么要设计泛型啊?”三妹开门见山地问。
......
---
title: Java 9为什么要将String的底层实现由char数组改成了byte数组?
shortTitle: String的底层实现由char改成了byte?
shortTitle: String的底层实现为什么由char改成了byte?
category:
- Java核心
tag:
......@@ -12,7 +12,7 @@ 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 Java 9为什么要将String的底层实现由char数组改成了byte数组?
# 4.11 String的底层实现为什么由char改成了byte?
“二哥,最近在我阅读 Java 11 的字符串源码,发现和 Java 8 的有很大不同。”三妹的脸上洋溢着青春的微笑😊,甜美地说道:“String 类的源码已经由 `char[]` 优化为了 `byte[]` 来存储字符串内容,为什么要这样做呢?”
......
---
title: 详解 Java 中的优先级队列(PriorityQueue 附源码分析)
shortTitle: PriorityQueue
shortTitle: 优先级队列PriorityQueue
category:
- Java核心
tag:
......@@ -12,7 +12,7 @@ head:
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,优先级队列,PriorityQueue,java 优先级队列,java PriorityQueue
---
# 6.13 PriorityQueue
# 6.13 优先级队列PriorityQueue
>继续有请王老师,来上台给大家讲讲优先级队列 PriorityQueue。
......
---
title: 详解 Java 中的双端队列(ArrayDeque附源码分析)
shortTitle: ArrayDeque
shortTitle: 双端队列ArrayDeque
category:
- Java核心
tag:
......@@ -12,7 +12,7 @@ head:
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,ArrayDeque,堆,队列,java 双端队列,java ArrayDeque
---
# 6.12 ArrayDeque
# 6.12 双端队列ArrayDeque
>好,我们这节继续有请王老师上台来给大家讲 ArrayDeque,鼓掌欢迎了👏🏻。
......
---
title: Java ArrayList详解(附源码分析)
shortTitle: ArrayList
shortTitle: ArrayList详解(附源码)
category:
- Java核心
tag:
......@@ -12,7 +12,7 @@ head:
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,ArrayList,ArrayList源码,java arraylist
---
# 6.3 ArrayList
# 6.3 ArrayList详解(附源码)
“二哥,听说今天我们开讲 ArrayList 了?好期待哦!”三妹明知故问,这个托配合得依然天衣无缝。
......
---
title: 为什么不能在foreach里执行删除操作?
title: Java为什么不能在foreach里执行删除操作?
shortTitle: 为什么不能在foreach里删除元素?
category:
- Java核心
......
---
title: 聊聊Java的集合框架
shortTitle: Java的集合框架
title: 聊聊Java的集合框架的构成(概览)
shortTitle: 集合框架的构成
category:
- Java核心
tag:
......@@ -12,7 +12,7 @@ head:
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,集合框架,容器,java 集合框架,java集合,java容器
---
# 6.1 Java的集合框架
# 6.1 集合框架的构成
眼瞅着三妹的王者荣耀杀得正嗨,我趁机喊到:“别打了,三妹,我们来一起学习 Java 的集合框架吧。”
......
---
title: Java HashMap详解(附源码分析)
shortTitle: HashMap
shortTitle: HashMap详解(附源码)
category:
- Java核心
tag:
......@@ -12,7 +12,7 @@ head:
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,HashMap,java hashmap
---
# 6.9 HashMap
# 6.9 HashMap详解(附源码)
这篇文章将通过源码的方式,详细透彻地讲清楚 Java 的 HashMap,包括 hash 方法的原理、HashMap 的扩容机制、HashMap的加载因子为什么是 0.75 而不是 0.6、0.8,以及 HashMap 为什么是线程不安全的,基本上 HashMap 的[常见面试题](https://tobebetterjavaer.com/interview/java-hashmap-13.html),都会在这一篇文章里讲明白。
......
---
title: 迭代器Iterator和Iterable有什么区别?
title: Java迭代器Iterator和Iterable有什么区别?
shortTitle: 迭代器Iterator和Iterable
category:
- Java核心
......
---
title: Java LinkedHashMap详解(附源码分析)
shortTitle: LinkedHashMap
shortTitle: LinkedHashMap详解(附源码)
category:
- Java核心
tag:
......@@ -12,7 +12,7 @@ head:
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,LinkedHashMap,java LinkedHashMap
---
# 6.10 LinkedHashMap
# 6.10 LinkedHashMap详解(附源码)
>这篇继续换个文风来写,给大家一点新鲜的空气。
......
---
title: Java LinkedList详解(附源码分析)
shortTitle: LinkedList
shortTitle: LinkedList详解(附源码)
category:
- Java核心
tag:
......@@ -12,7 +12,7 @@ head:
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,LinkedList,LinkedList源码,java linkedlist
---
# 6.4 LinkedList
# 6.4 LinkedList详解(附源码)
>这篇换个表达方式,一起来欣赏。
......
---
title: 聊聊ArrayList和LinkedList的区别
title: 聊聊Java中ArrayList和LinkedList的区别
shortTitle: ArrayList和LinkedList的区别
category:
- Java核心
......
---
title: 简单聊一下时间复杂度
shortTitle: 时间复杂度
shortTitle: 关于时间复杂度
category:
- Java核心
tag:
......@@ -12,7 +12,7 @@ head:
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,时间复杂度,java 时间复杂度
---
# 6.2 时间复杂度
# 6.2 关于时间复杂度
“二哥,为什么要讲时间复杂度呀?”三妹问。
......
---
title: Java TreeMap详解(附源码分析)
shortTitle: TreeMap
shortTitle: TreeMap详解(附源码)
category:
- Java核心
tag:
......@@ -12,7 +12,7 @@ head:
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,TreeMap,java treemap
---
# 6.11 TreeMap
# 6.11 TreeMap详解(附源码)
>下面有请王老师上台,来给大家讲一讲 TreeMap,鼓掌了!
......
......@@ -167,7 +167,7 @@ head:
### 集合框架(容器)
- [聊聊Java的集合框架](collection/gailan.md)
- [聊聊Java的集合框架的构成(概览)](collection/gailan.md)
- [简单聊一下时间复杂度](collection/time-complexity.md)
- [Java ArrayList详解(附源码分析)](collection/arraylist.md)
- [Java LinkedList详解(附源码分析)](collection/linkedlist.md)
......@@ -221,7 +221,7 @@ head:
- [Java 8 Optional最佳指南](java8/optional.md)
- [深入浅出Java 8 Lambda表达式](java8/Lambda.md)
### Java重要知识点
### 重要知识点
- [Java命名规范](basic-extra-meal/java-naming.md)
- [彻底弄懂Java中的Unicode和UTF-8编码](basic-extra-meal/java-unicode.md)
......
---
title: Java File:IO 流的开始与结束
shortTitle: File
shortTitle: 关于File
category:
- Java核心
tag:
......@@ -12,7 +12,7 @@ head:
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,Java IO,file,java文件,java目录,java文件增删改查,java file
---
# 7.2 File
# 7.2 关于File
在 IO 操作中,文件的操作相对来说是比较复杂的,但也是使用频率最高的部分,我们几乎所有的项目中几乎都躺着一个叫做 FileUtil 或者 FileUtils 的工具类。那么 File 类可以说是其基石,我们必须得先来了解下。
......
---
title: Java IO 的分类
shortTitle: IO 分类
title: 一文彻底搞清楚Java IO 的分类
shortTitle: IO分类
category:
- Java核心
tag:
......@@ -12,7 +12,7 @@ head:
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,Java IO,io,输入输出流
---
# 7.1 IO 分类
# 7.1 IO分类
“老王,Java IO 也太上头了吧?”新兵蛋子小二向头顶很凉快的老王抱怨道,“你瞧,我就按照传输方式对 IO 进行了一个简单的分类,就能搞出来这么多的玩意!”
......
......@@ -9,15 +9,16 @@ description: Java程序员进阶之路,小白的零基础Java教程,从入
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,java8,lambda
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,java8,lambda,java lambda
---
# 10.3 Lambda表达式
今天分享的主题是《Lambda 表达式入门》,这也是之前一些读者留言强烈要求我写一写的,不好意思,让你们久等了,现在来满足你们,为时不晚吧?
![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/java8/Lambda-1.jpg)
## 01、初识 Lambda
### 01、初识 Lambda
Lambda 表达式描述了一个代码块(或者叫匿名方法),可以将其作为参数传递给构造方法或者普通方法以便后续执行。考虑下面这段代码:
......@@ -74,7 +75,7 @@ public class LamadaTest {
![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/java8/Lambda-2.jpg)
## 02、Lambda 语法
### 02、Lambda 语法
每个 Lambda 表达式都遵循以下法则:
......@@ -141,6 +142,7 @@ public static void main(String[] args) {
和匿名内部类一样,不要在 Lambda 表达式主体内对方法内的局部变量进行修改,否则编译也不会通过:Lambda 表达式中使用的变量必须是 final 的。
![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/java8/Lambda-3.jpg)
这个问题发生的原因是因为 Java 规范中是这样规定的:
>Any local variable, formal parameter, or exception parameter used but not declared in a lambda expression
......@@ -181,7 +183,7 @@ c = 2;
下面我们来详细地一一介绍下。
### 01)把 limit 变量声明为 static
#### 01)把 limit 变量声明为 static
要想把 limit 变量声明为 static,就必须将 limit 变量放在 `main()` 方法外部,因为 `main()` 方法本身是 static 的。完整的代码示例如下所示。
......@@ -212,7 +214,7 @@ public class ModifyVariable2StaticInsideLambda {
OK,该方案是可行的。
### 02)把 limit 变量声明为 AtomicInteger
#### 02)把 limit 变量声明为 AtomicInteger
AtomicInteger 可以确保 int 值的修改是原子性的,可以使用 `set()` 方法设置一个新的 int 值,`get()` 方法获取当前的 int 值。
......@@ -243,7 +245,7 @@ public class ModifyVariable2AtomicInsideLambda {
OK,该方案也是可行的。
### 03)使用数组
#### 03)使用数组
使用数组的方式略带一些欺骗的性质,在声明数组的时候设置为 final,但更改 int 的值时却修改的是数组的一个元素。
......@@ -274,7 +276,7 @@ public class ModifyVariable2ArrayInsideLambda {
OK,该方案也是可行的。
## 03、Lambda 和 this 关键字
### 03、Lambda 和 this 关键字
Lambda 表达式并不会引入新的作用域,这一点和匿名内部类是不同的。也就是说,Lambda 表达式主体内使用的 this 关键字和其所在的类实例相同。
......@@ -346,7 +348,7 @@ this = com.cmower.java_demo.journal.LamadaTest@3feba861
![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/java8/Lambda-4.jpg)
## 04、最后
### 04、最后
尽管 Lambda 表达式在简化 Java 编程方面做了很多令人惊讶的努力,但在某些情况下,不当的使用仍然会导致不必要的混乱,大家伙慎用。
......
......@@ -9,18 +9,19 @@ description: Java程序员进阶之路,小白的零基础Java教程,从入
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,java8,Optional
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,java8,Optional,java Optional
---
# 10.2 Optional最佳指南
想学习,永远都不晚,尤其是针对 Java 8 里面的好东西,Optional 就是其中之一,该类提供了一种用于表示可选值而非空引用的类级别解决方案。作为一名 Java 程序员,我真的是烦透了 NullPointerException(NPE),尽管和它熟得就像一位老朋友,知道它也是迫不得已——程序正在使用一个对象却发现这个对象的值为 null,于是 Java 虚拟机就怒发冲冠地把它抛了出来当做替罪羊。
想学习,永远都不晚,尤其是针对 Java 8 里面的好东西,Optional 就是其中之一,该类提供了一种用于表示可选值而非空引用的类级别解决方案。作为一名 Java 程序员,我真的是烦透了 [NullPointerException(NPE)](https://tobebetterjavaer.com/exception/npe.html),尽管和它熟得就像一位老朋友,知道它也是迫不得已——程序正在使用一个对象却发现这个对象的值为 null,于是 Java 虚拟机就怒发冲冠地把它抛了出来当做替罪羊。
当然了,我们程序员是富有责任心的,不会坐视不管,于是就有了大量的 null 值检查。尽管有时候这种检查完全没有必要,但我们已经习惯了例行公事。终于,Java 8 看不下去了,就引入了 Optional,以便我们编写的代码不再那么刻薄呆板。
![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/java8/optional-1.jpg)
![](https://cdn.tobebetterjavaer.com/stutymore/guava-20230329172935.png)
## 01、没有 Optional 会有什么问题
### 01、没有 Optional 会有什么问题
我们来模拟一个实际的应用场景。小王第一天上班,领导老马就给他安排了一个任务,要他从数据库中根据会员 ID 拉取一个会员的姓名,然后将姓名打印到控制台。虽然是新来的,但这个任务难不倒小王,于是他花了 10 分钟写下了这段代码:
......@@ -59,7 +60,7 @@ Exception in thread "main" java.lang.NullPointerException
at com.cmower.dzone.optional.WithoutOptionalDemo.main(WithoutOptionalDemo.java:24)
```
## 02、Optional 是如何解决这个问题的
### 02、Optional 是如何解决这个问题的
小王把代码提交后,就兴高采烈地去找老马要新的任务了。本着虚心学习的态度,小王请求老马看一下自己的代码,于是老王就告诉他应该尝试一下 Optional,可以避免没有必要的 null 值检查。现在,让我们来看看小王是如何通过 Optional 来解决上述问题的。
......@@ -95,7 +96,7 @@ class Member {
Optional 之所以可以解决 NPE 的问题,是因为它明确的告诉我们,不需要对它进行判空。它就好像十字路口的路标,明确地告诉你该往哪走。
## 03、创建 Optional 对象
### 03、创建 Optional 对象
1)可以使用静态方法 `empty()` 创建一个空的 Optional 对象
......@@ -128,7 +129,7 @@ System.out.println(optOrNull); // 输出:Optional.empty
`ofNullable()` 方法内部有一个三元表达式,如果为参数为 null,则返回私有常量 EMPTY;否则使用 new 关键字创建了一个新的 Optional 对象——不会再抛出 NPE 异常了。
## 04、判断值是否存在
### 04、判断值是否存在
可以通过方法 `isPresent()` 判断一个 Optional 对象是否存在,如果存在,该方法返回 true,否则返回 false——取代了 `obj != null` 的判断。
......@@ -150,7 +151,7 @@ Optional<String> optOrNull = Optional.ofNullable(null);
System.out.println(opt.isPresent()); // 输出:true
```
## 05、非空表达式
### 05、非空表达式
Optional 类有一个非常现代化的方法——`ifPresent()`,允许我们使用函数式编程的方式执行一些代码,因此,我把它称为非空表达式。如果没有该方法的话,我们通常需要先通过 `isPresent()` 方法对 Optional 对象进行判空后再执行相应的代码:
......@@ -175,7 +176,7 @@ Optional<String> opt = Optional.of("沉默王二");
opt.ifPresentOrElse(str -> System.out.println(str.length()), () -> System.out.println("为空"));
```
## 06、设置(获取)默认值
### 06、设置(获取)默认值
有时候,我们在创建(获取) Optional 对象的时候,需要一个默认值,`orElse()``orElseGet()` 方法就派上用场了。
......@@ -254,7 +255,7 @@ orElseGet
咦,`orElseGet()` 没有去调用 `getDefaultValue()`。哪个方法的性能更佳,你明白了吧?
## 07、获取值
### 07、获取值
直观从语义上来看,`get()` 方法才是最正宗的获取 Optional 对象值的方法,但很遗憾,该方法是有缺陷的,因为假如 Optional 对象的值为 null,该方法会抛出 NoSuchElementException 异常。这完全与我们使用 Optional 类的初衷相悖。
......@@ -278,7 +279,7 @@ Exception in thread "main" java.util.NoSuchElementException: No value present
尽管抛出的异常是 NoSuchElementException 而不是 NPE,但在我们看来,显然是在“五十步笑百步”。建议 `orElseGet()` 方法获取 Optional 对象的值。
## 08、过滤值
### 08、过滤值
小王通过 Optional 类对之前的代码进行了升级,完成后又兴高采烈地跑去找老马要任务了。老马觉得这小伙子不错,头脑灵活,又干活积极,很值得培养,就又交给了小王一个新的任务:用户注册时对密码的长度进行检查。
......@@ -311,7 +312,7 @@ System.out.println(result);
这次程序输出的结果为 true,因为密码变成了 7 位,在 6 到 10 位之间。想象一下,假如小王使用 if-else 来完成这个任务,代码该有多冗长。
## 09、转换值
### 09、转换值
小王检查完了密码的长度,仍然觉得不够尽兴,觉得要对密码的强度也进行检查,比如说密码不能是“password”,这样的密码太弱了。于是他又开始研究起了 `map()` 方法,该方法可以按照一定的规则将原有 Optional 对象转换为一个新的 Optional 对象,原有的 Optional 对象不会更改。
......@@ -350,10 +351,6 @@ public class OptionalMapFilterDemo {
}
```
![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/java8/optional-2.jpg)
好了,我亲爱的读者朋友,以上就是本文的全部内容了——可以说是史上最佳 Optional 指南了,能看到这里的都是最优秀的程序员,二哥必须要伸出大拇指为你点个赞。
......
---
title: Java 8 Stream流详细用法
shortTitle: Stream流详细用法
shortTitle: Stream流
category:
- Java核心
tag:
......@@ -9,9 +9,11 @@ description: Java程序员进阶之路,小白的零基础Java教程,从入
head:
- - meta
- name: keywords
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,java8,stream
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,java8,stream,java stream
---
# 10.1 Stream流
两个星期以前,就有读者强烈要求我写一篇 Java Stream 流的文章,我说市面上不是已经有很多了吗,结果你猜他怎么说:“就想看你写的啊!”你看你看,多么苍白的喜欢啊。那就“勉为其难”写一篇吧,嘻嘻。
![](https://cdn.tobebetterjavaer.com/tobebetterjavaer/images/java8/stream-1.jpg)
......@@ -55,12 +57,11 @@ Stream<T> distinct();
long count();
```
中间操作不会立即执行,只有等到终端操作的时候,流才开始真正地遍历,用于映射、过滤等。通俗点说,就是一次遍历执行多个操作,性能就大大提高了。
理论部分就扯这么多,下面直接进入实战部分。
## 01、创建流
### 01、创建流
如果是数组的话,可以使用 `Arrays.stream()` 或者 `Stream.of()` 创建流;如果是集合的话,可以直接使用 `stream()` 方法创建流,因为该方法已经添加到 Collection 接口中。
......@@ -96,11 +97,11 @@ List<Long> aList = new ArrayList<>();
Stream<Long> parallelStream = aList.parallelStream();
```
## 02、操作流
### 02、操作流
Stream 类提供了很多有用的操作流的方法,我来挑一些常用的给你介绍一下。
### 1)过滤
#### 1)过滤
通过 `filter()` 方法可以从流中筛选出我们想要的元素。
......@@ -136,7 +137,7 @@ for (String s : strs) {
王力宏
```
### 2)映射
#### 2)映射
如果想通过某种操作把一个流中的元素转化成新的流中的元素,可以使用 `map()` 方法。
......@@ -165,7 +166,7 @@ public class MapStreamDemo {
3
```
### 3)匹配
#### 3)匹配
Stream 类提供了三个方法可供进行元素匹配,它们分别是:
......@@ -204,7 +205,7 @@ true
true
```
### 4)组合
#### 4)组合
`reduce()` 方法的主要作用是把 Stream 中的元素组合起来,它有两种用法:
......@@ -250,7 +251,7 @@ public class ReduceStreamDemo {
0、1、2、3 在没有起始值相加的时候结果为 6;有起始值 6 的时候结果为 12。
## 03、转换流
### 03、转换流
既然可以把集合或者数组转成流,那么也应该有对应的方法,将流转换回去——`collect()` 方法就满足了这种需求。
......
---
title: 聊聊 Java 字符串,以及为什么String是不可变的?
shortTitle: 聊聊字符串以及为什么不可变
shortTitle: 字符串为什么不可变
category:
- Java核心
tag:
......@@ -12,7 +12,7 @@ head:
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,java字符串,String,不可变
---
# 4.4 Java字符串及不可变性
# 4.4 字符串为什么不可变
我正坐在沙发上津津有味地读刘欣大佬的《码农翻身》——Java 帝国这一章,门铃响了。起身打开门一看,是三妹,她从学校回来了。
......
......@@ -12,7 +12,7 @@ head:
content: Java,Java SE,Java基础,Java教程,Java程序员进阶之路,Java进阶之路,Java入门,教程,java字符串,String,intern,string intern,java intern,java string intern
---
# 4.6 深入解析String.intern()方法
# 4.6 String.intern()方法
“哥,你发给我的那篇文章我看了,结果直接把我给看得不想学 Java 了!”三妹气冲冲地说。
......
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册