1
0
mirror of https://github.com/Snailclimb/JavaGuide synced 2025-06-16 18:10:13 +08:00

[docs update]partial content improvement

This commit is contained in:
Guide 2023-05-31 23:38:14 +08:00
parent 46b48e2786
commit 42119f5276
10 changed files with 58 additions and 28 deletions

View File

@ -18,10 +18,11 @@
</div> </div>
> 1. **面试专版**:准备面试的小伙伴可以考虑面试专版:[《Java 面试指北 》](https://javaguide.cn/zhuanlan/java-mian-shi-zhi-bei.html) (质量很高,专为面试打造,配合 JavaGuide 食用)。 > - **面试专版**:准备 Java 面试的小伙伴可以考虑面试专版:**[《Java 面试指北 》](./zhuanlan/java-mian-shi-zhi-bei.md)** (质量很高,专为面试打造,配合 JavaGuide 食用)。
> 1. **知识星球**:专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入 [JavaGuide 知识星球](https://javaguide.cn/about-the-author/zhishixingqiu-two-years.html)(点击链接即可查看星球的详细介绍,一定一定一定确定自己真的需要再加入,一定一定要看完详细介绍之后再加我)。 > - **知识星球**:专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入 **[JavaGuide 知识星球](./about-the-author/zhishixingqiu-two-years.md)**(点击链接即可查看星球的详细介绍,一定确定自己真的需要再加入)。
> 1. **学习建议** :有水平的面试官都是顺着项目经历挖掘问题。一定不要死记硬背技术八股文! > - **使用建议** :有水平的面试官都是顺着项目经历挖掘技术问题。一定不要死记硬背技术八股文!详细的学习建议请参考:[JavaGuide 使用建议](./javaguide/use-suggestion.md)。
> 1. **转载须知**以下所有文章如非文首说明为转载皆为我Guide的原创转载在文首注明出处如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! > - **求个Star**:如果觉得 JavaGuide 的内容对你有帮助的话,还请点个免费的 Star这是对我最大的鼓励感谢各位一起同行共勉Github 地址:[https://github.com/Snailclimb/JavaGuide](https://github.com/Snailclimb/JavaGuide) 。
> - **转载须知**:以下所有文章如非文首说明为转载皆为 JavaGuide 原创,转载请在文首注明出处。如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!
<div align="center"> <div align="center">
<img src="https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png" style="margin: 0 auto;" /> <img src="https://oss.javaguide.cn/github/javaguide/gongzhonghaoxuanchuan.png" style="margin: 0 auto;" />

View File

@ -24,6 +24,11 @@ tag:
![十大排序算法](https://oss.javaguide.cn/github/javaguide/cs-basics/sorting-algorithms/sort1.png) ![十大排序算法](https://oss.javaguide.cn/github/javaguide/cs-basics/sorting-algorithms/sort1.png)
上图存在错误:
1. 插入排序的最好时间复杂度为 O(n) 而不是 O(n^2) 。
2.
**图片名词解释:** **图片名词解释:**
- **n**:数据规模 - **n**:数据规模
@ -397,7 +402,7 @@ public static void quickSort(int[] array, int low, int high) {
- **稳定性**:不稳定 - **稳定性**:不稳定
- **时间复杂度**最佳O(nlogn) 最差O(nlogn)平均O(nlogn) - **时间复杂度**最佳O(nlogn) 最差O(nlogn)平均O(nlogn)
- **空间复杂度**O(nlogn) - **空间复杂度**O(logn)
## 堆排序 (Heap Sort) ## 堆排序 (Heap Sort)
@ -649,7 +654,7 @@ public static List<Integer> bucketSort(List<Integer> arr, int bucket_size) {
- **稳定性**:稳定 - **稳定性**:稳定
- **时间复杂度**:最佳:`O(n+k)` 最差:`O(n²)` 平均:`O(n+k)` - **时间复杂度**:最佳:`O(n+k)` 最差:`O(n²)` 平均:`O(n+k)`
- **空间复杂度**`O(k)` - **空间复杂度**`O(n+k)`
## 基数排序 (Radix Sort) ## 基数排序 (Radix Sort)

View File

@ -173,7 +173,7 @@ AOF 校验机制是 Redis 在启动时对 AOF 文件进行检查,以判断文
**RDB 比 AOF 优秀的地方** **RDB 比 AOF 优秀的地方**
- RDB 文件存储的内容是经过压缩的二进制数据, 保存着某个时间点的数据集文件很小适合做数据的备份灾难恢复。AOF 文件存储的是每一次写命令,类似于 MySQL 的 binlog 日志,通常会 RDB 文件大很多。当 AOF 变得太大时Redis 能够在后台自动重写 AOF。新的 AOF 文件和原有的 AOF 文件所保存的数据库状态一样,但体积更小。不过, Redis 7.0 版本之前如果在重写期间有写入命令AOF 可能会使用大量内存,重写期间到达的所有写入命令都会写入磁盘两次。 - RDB 文件存储的内容是经过压缩的二进制数据, 保存着某个时间点的数据集文件很小适合做数据的备份灾难恢复。AOF 文件存储的是每一次写命令,类似于 MySQL 的 binlog 日志,通常会 RDB 文件大很多。当 AOF 变得太大时Redis 能够在后台自动重写 AOF。新的 AOF 文件和原有的 AOF 文件所保存的数据库状态一样,但体积更小。不过, Redis 7.0 版本之前如果在重写期间有写入命令AOF 可能会使用大量内存,重写期间到达的所有写入命令都会写入磁盘两次。
- 使用 RDB 文件恢复数据,直接解析还原数据即可,不需要一条一条地执行命令,速度非常快。而 AOF 则需要依次执行每个写命令,速度非常慢。也就是说,与 AOF 相比恢复大数据集的时候RDB 速度更快。 - 使用 RDB 文件恢复数据,直接解析还原数据即可,不需要一条一条地执行命令,速度非常快。而 AOF 则需要依次执行每个写命令,速度非常慢。也就是说,与 AOF 相比恢复大数据集的时候RDB 速度更快。
**AOF 比 RDB 优秀的地方** **AOF 比 RDB 优秀的地方**

View File

@ -147,11 +147,13 @@ null
**List 实现消息队列功能太简单,像消息确认机制等功能还需要我们自己实现,最要命的是没有广播机制,消息也只能被消费一次。** **List 实现消息队列功能太简单,像消息确认机制等功能还需要我们自己实现,最要命的是没有广播机制,消息也只能被消费一次。**
**Redis 2.0 引入了 发布订阅 (pub/sub) 解决了 List 实现消息队列没有广播机制的问题。** **Redis 2.0 引入了发布订阅 (pub/sub) 功能,解决了 List 实现消息队列没有广播机制的问题。**
![Redis 发布订阅 (pub/sub) 功能](https://oss.javaguide.cn/github/javaguide/database/redis/redis-pub-sub.png)
pub/sub 中引入了一个概念叫 **channel频道**,发布订阅机制的实现就是基于这个 channel 来做的。 pub/sub 中引入了一个概念叫 **channel频道**,发布订阅机制的实现就是基于这个 channel 来做的。
pub/sub 涉及发布者和订阅者(也叫消费者)两个角色: pub/sub 涉及发布者Publisher和订阅者(Subscriber也叫消费者)两个角色:
- 发布者通过 `PUBLISH` 投递消息给指定 channel。 - 发布者通过 `PUBLISH` 投递消息给指定 channel。
- 订阅者通过`SUBSCRIBE`订阅它关心的 channel。并且订阅者可以订阅一个或者多个 channel。 - 订阅者通过`SUBSCRIBE`订阅它关心的 channel。并且订阅者可以订阅一个或者多个 channel。

View File

@ -7,8 +7,9 @@ title: JavaGuideJava学习&&面试指南)
- **面试专版**:准备 Java 面试的小伙伴可以考虑面试专版:**[《Java 面试指北 》](./zhuanlan/java-mian-shi-zhi-bei.md)** (质量很高,专为面试打造,配合 JavaGuide 食用)。 - **面试专版**:准备 Java 面试的小伙伴可以考虑面试专版:**[《Java 面试指北 》](./zhuanlan/java-mian-shi-zhi-bei.md)** (质量很高,专为面试打造,配合 JavaGuide 食用)。
- **知识星球**:专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入 **[JavaGuide 知识星球](./about-the-author/zhishixingqiu-two-years.md)**(点击链接即可查看星球的详细介绍,一定确定自己真的需要再加入)。 - **知识星球**:专属面试小册/一对一交流/简历修改/专属求职指南,欢迎加入 **[JavaGuide 知识星球](./about-the-author/zhishixingqiu-two-years.md)**(点击链接即可查看星球的详细介绍,一定确定自己真的需要再加入)。
- **学习建议** :有水平的面试官都是顺着项目经历挖掘问题。一定不要死记硬背技术八股文! - **使用建议** :有水平的面试官都是顺着项目经历挖掘技术问题。一定不要死记硬背技术八股文!详细的学习建议请参考:[JavaGuide 使用建议](./javaguide/use-suggestion.md)。
- **转载须知**:以下所有文章如非文首说明为转载皆为 JavaGuide 原创,转载在文首注明出处,如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境! - **求个Star**:如果觉得 JavaGuide 的内容对你有帮助的话,还请点个免费的 Star这是对我最大的鼓励感谢各位一起同行共勉Github 地址:[https://github.com/Snailclimb/JavaGuide](https://github.com/Snailclimb/JavaGuide) 。
- **转载须知**:以下所有文章如非文首说明为转载皆为 JavaGuide 原创,转载请在文首注明出处。如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!
::: :::

View File

@ -22,10 +22,12 @@ head:
2. 面向对象(封装,继承,多态); 2. 面向对象(封装,继承,多态);
3. 平台无关性( Java 虚拟机实现平台无关性); 3. 平台无关性( Java 虚拟机实现平台无关性);
4. 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持); 4. 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操作系统的多线程功能来进行多线程程序设计,而 Java 语言却提供了多线程支持);
5. 可靠性; 5. 可靠性(具备异常处理和自动内存管理机制);
6. 安全性; 6. 安全性Java 语言本身的设计就提供了多重安全防护机制如访问权限修饰符、限制程序直接访问操作系统资源);
7. 支持网络编程并且很方便( Java 语言诞生本身就是为简化网络编程设计的,因此 Java 语言不仅支持网络编程而且很方便); 7. 高效性(通过 Just In Time 编译器等技术的优化Java 语言的运行效率还是非常不错的);
8. 编译与解释并存; 8. 支持网络编程并且很方便;
9. 编译与解释并存;
10. ......
> **🐛 修正(参见:[issue#544](https://github.com/Snailclimb/JavaGuide/issues/544)**C++11 开始2011 年的时候),C++就引入了多线程库,在 windows、linux、macos 都可以使用`std::thread``std::async`来创建线程。参考链接http://www.cplusplus.com/reference/thread/thread/?kw=thread > **🐛 修正(参见:[issue#544](https://github.com/Snailclimb/JavaGuide/issues/544)**C++11 开始2011 年的时候),C++就引入了多线程库,在 windows、linux、macos 都可以使用`std::thread``std::async`来创建线程。参考链接http://www.cplusplus.com/reference/thread/thread/?kw=thread

View File

@ -46,7 +46,7 @@ Java 中最常用的语法糖主要有泛型、变长参数、条件编译、自
在开始之前先科普下Java 中的`switch`自身原本就支持基本类型。比如`int``char`等。对于`int`类型,直接进行数值的比较。对于`char`类型则是比较其 ascii 码。所以,对于编译器来说,`switch`中其实只能使用整型,任何类型的比较都要转换成整型。比如`byte``short``char`(ascii 码是整型)以及`int` 在开始之前先科普下Java 中的`switch`自身原本就支持基本类型。比如`int``char`等。对于`int`类型,直接进行数值的比较。对于`char`类型则是比较其 ascii 码。所以,对于编译器来说,`switch`中其实只能使用整型,任何类型的比较都要转换成整型。比如`byte``short``char`(ascii 码是整型)以及`int`
那么接下来看下`switch``String`支持,有以下代码: 那么接下来看下`switch``String`支持,有以下代码:
```java ```java
public class switchDemoString { public class switchDemoString {

View File

@ -23,18 +23,39 @@ public class ArrayList<E> extends AbstractList<E>
- `ArrayList` 实现了 **`Cloneable` 接口** ,即覆盖了函数`clone()`,能被克隆。 - `ArrayList` 实现了 **`Cloneable` 接口** ,即覆盖了函数`clone()`,能被克隆。
- `ArrayList` 实现了 `java.io.Serializable`接口,这意味着`ArrayList`支持序列化,能通过序列化去传输。 - `ArrayList` 实现了 `java.io.Serializable`接口,这意味着`ArrayList`支持序列化,能通过序列化去传输。
### Arraylist 和 Vector 的区别? ### ArrayList 和 Vector 的区别?(了解即可)
1. `ArrayList``List` 的主要实现类,底层使用 `Object[ ]`存储,适用于频繁的查找工作,线程不安全 - `ArrayList``List` 的主要实现类,底层使用 `Object[]`存储,适用于频繁的查找工作,线程不安全 。
2. `Vector``List` 的古老实现类,底层使用 `Object[ ]`存储,线程安全的。 - `Vector``List` 的古老实现类,底层使用`Object[]` 存储,线程安全。
### ArrayList 可以添加 null 值吗?
`ArrayList` 中可以存储任何类型的对象,包括 `null` 值。不过,不建议向`ArrayList` 中添加 `null` 值, `null` 值无意义,会让代码难以维护比如忘记做判空处理就会导致空指针异常。
示例代码:
```java
ArrayList<String> listOfStrings = new ArrayList<>();
listOfStrings.add(null);
listOfStrings.add("java");
System.out.println(listOfStrings);
```
输出:
```
[null, java]
```
### Arraylist 与 LinkedList 区别? ### Arraylist 与 LinkedList 区别?
1. **是否保证线程安全:** `ArrayList``LinkedList` 都是不同步的,也就是不保证线程安全; - **是否保证线程安全:** `ArrayList``LinkedList` 都是不同步的,也就是不保证线程安全;
2. **底层数据结构:** `Arraylist` 底层使用的是 **`Object` 数组**`LinkedList` 底层使用的是 **双向链表** 数据结构JDK1.6 之前为循环链表JDK1.7 取消了循环。注意双向链表和双向循环链表的区别,下面有介绍到!) - **底层数据结构:** `ArrayList` 底层使用的是 **`Object` 数组**`LinkedList` 底层使用的是 **双向链表** 数据结构JDK1.6 之前为循环链表JDK1.7 取消了循环。注意双向链表和双向循环链表的区别,下面有介绍到!)
3. **插入和删除是否受元素位置的影响:****`ArrayList` 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。** 比如:执行`add(E e)`方法的时候, `ArrayList` 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是 O(1)。但是如果要在指定位置 i 插入和删除元素的话(`add(int index, E element)`)时间复杂度就为 O(n-i)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。 ② **`LinkedList` 采用链表存储,所以对于`add(E e)`方法的插入,删除元素时间复杂度不受元素位置的影响,近似 O(1),如果是要在指定位置`i`插入和删除元素的话(`(add(int index, E element)` 时间复杂度近似为`o(n))`因为需要先移动到指定位置再插入。** - **插入和删除是否受元素位置的影响:**
4. **是否支持快速随机访问:** `LinkedList` 不支持高效的随机元素访问,而 `ArrayList` 支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于`get(int index)`方法)。 - `ArrayList` 采用数组存储,所以插入和删除元素的时间复杂度受元素位置的影响。 比如:执行`add(E e)`方法的时候, `ArrayList` 会默认在将指定的元素追加到此列表的末尾,这种情况时间复杂度就是 O(1)。但是如果要在指定位置 i 插入和删除元素的话(`add(int index, E element)`),时间复杂度就为 O(n)。因为在进行上述操作的时候集合中第 i 和第 i 个元素之后的(n-i)个元素都要执行向后位/向前移一位的操作。
5. **内存空间占用:** `ArrayList` 的空 间浪费主要体现在在 list 列表的结尾会预留一定的容量空间,而 `LinkedList` 的空间花费则体现在它的每一个元素都需要消耗比 `ArrayList` 更多的空间(因为要存放直接后继和直接前驱以及数据)。 - `LinkedList` 采用链表存储,所以在头尾插入或者删除元素不受元素位置的影响(`add(E e)``addFirst(E e)``addLast(E e)``removeFirst()``removeLast()`),时间复杂度为 O(1),如果是要在指定位置 `i` 插入和删除元素的话(`add(int index, E element)``remove(Object o)`,`remove(int index)` 时间复杂度为 O(n) ,因为需要先移动到指定位置再插入和删除。
- **是否支持快速随机访问:** `LinkedList` 不支持高效的随机元素访问,而 `ArrayList`(实现了 `RandomAccess` 接口) 支持。快速随机访问就是通过元素的序号快速获取元素对象(对应于`get(int index)`方法)。
- **内存空间占用:** `ArrayList` 的空间浪费主要体现在在 list 列表的结尾会预留一定的容量空间,而 LinkedList 的空间花费则体现在它的每一个元素都需要消耗比 ArrayList 更多的空间(因为要存放直接后继和直接前驱以及数据)。
## ArrayList 核心源码解读 ## ArrayList 核心源码解读

View File

@ -1,5 +1,5 @@
--- ---
title: 用建议 title: 使用建议
category: 走近项目 category: 走近项目
icon: star icon: star
--- ---

View File

@ -320,8 +320,6 @@ public Person personPrototype() {
### Bean 的生命周期了解么? ### Bean 的生命周期了解么?
> 下面的内容整理自:<https://yemengying.com/2016/07/14/spring-bean-life-cycle/> ,除了这篇文章,再推荐一篇很不错的文章:<https://www.cnblogs.com/zrtqsk/p/3735273.html>
- Bean 容器找到配置文件中 Spring Bean 的定义。 - Bean 容器找到配置文件中 Spring Bean 的定义。
- Bean 容器利用 Java Reflection API 创建一个 Bean 的实例。 - Bean 容器利用 Java Reflection API 创建一个 Bean 的实例。
- 如果涉及到一些属性值 利用 `set()`方法设置一些属性值。 - 如果涉及到一些属性值 利用 `set()`方法设置一些属性值。