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:
parent
46b48e2786
commit
42119f5276
@ -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;" />
|
||||||
|
@ -24,6 +24,11 @@ tag:
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
上图存在错误:
|
||||||
|
|
||||||
|
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)
|
||||||
|
|
||||||
|
@ -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 优秀的地方**:
|
||||||
|
@ -147,11 +147,13 @@ null
|
|||||||
|
|
||||||
**List 实现消息队列功能太简单,像消息确认机制等功能还需要我们自己实现,最要命的是没有广播机制,消息也只能被消费一次。**
|
**List 实现消息队列功能太简单,像消息确认机制等功能还需要我们自己实现,最要命的是没有广播机制,消息也只能被消费一次。**
|
||||||
|
|
||||||
**Redis 2.0 引入了 发布订阅 (pub/sub) 解决了 List 实现消息队列没有广播机制的问题。**
|
**Redis 2.0 引入了发布订阅 (pub/sub) 功能,解决了 List 实现消息队列没有广播机制的问题。**
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
pub/sub 中引入了一个概念叫 **channel(频道)**,发布订阅机制的实现就是基于这个 channel 来做的。
|
pub/sub 中引入了一个概念叫 **channel(频道)**,发布订阅机制的实现就是基于这个 channel 来做的。
|
||||||
|
|
||||||
pub/sub 涉及发布者和订阅者(也叫消费者)两个角色:
|
pub/sub 涉及发布者(Publisher)和订阅者(Subscriber,也叫消费者)两个角色:
|
||||||
|
|
||||||
- 发布者通过 `PUBLISH` 投递消息给指定 channel。
|
- 发布者通过 `PUBLISH` 投递消息给指定 channel。
|
||||||
- 订阅者通过`SUBSCRIBE`订阅它关心的 channel。并且,订阅者可以订阅一个或者多个 channel。
|
- 订阅者通过`SUBSCRIBE`订阅它关心的 channel。并且,订阅者可以订阅一个或者多个 channel。
|
||||||
|
@ -7,8 +7,9 @@ title: JavaGuide(Java学习&&面试指南)
|
|||||||
|
|
||||||
- **面试专版**:准备 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 原创,转载请在文首注明出处。如发现恶意抄袭/搬运,会动用法律武器维护自己的权益。让我们一起维护一个良好的技术创作环境!
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
@ -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
|
||||||
|
|
||||||
|
@ -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 {
|
||||||
|
@ -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 核心源码解读
|
||||||
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: 食用建议
|
title: 使用建议
|
||||||
category: 走近项目
|
category: 走近项目
|
||||||
icon: star
|
icon: star
|
||||||
---
|
---
|
||||||
|
@ -129,7 +129,7 @@ Spring Boot 只是简化了配置,如果你需要构建 MVC 架构的 Web 程
|
|||||||
|
|
||||||
Spring 时代我们一般通过 XML 文件来配置 Bean,后来开发人员觉得 XML 文件来配置不太好,于是 SpringBoot 注解配置就慢慢开始流行起来。
|
Spring 时代我们一般通过 XML 文件来配置 Bean,后来开发人员觉得 XML 文件来配置不太好,于是 SpringBoot 注解配置就慢慢开始流行起来。
|
||||||
|
|
||||||
相关阅读:
|
相关阅读:
|
||||||
|
|
||||||
- [IoC 源码阅读](https://javadoop.com/post/spring-ioc)
|
- [IoC 源码阅读](https://javadoop.com/post/spring-ioc)
|
||||||
- [面试被问了几百遍的 IoC 和 AOP ,还在傻傻搞不清楚?](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486938&idx=1&sn=c99ef0233f39a5ffc1b98c81e02dfcd4&chksm=cea24211f9d5cb07fa901183ba4d96187820713a72387788408040822ffb2ed575d28e953ce7&token=1736772241&lang=zh_CN#rd)
|
- [面试被问了几百遍的 IoC 和 AOP ,还在傻傻搞不清楚?](https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486938&idx=1&sn=c99ef0233f39a5ffc1b98c81e02dfcd4&chksm=cea24211f9d5cb07fa901183ba4d96187820713a72387788408040822ffb2ed575d28e953ce7&token=1736772241&lang=zh_CN#rd)
|
||||||
@ -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()`方法设置一些属性值。
|
||||||
|
Loading…
x
Reference in New Issue
Block a user