Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 5 additions & 12 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
**开始阅读之前必看** :

1. [完结撒花!JavaGuide面试突击版来啦!](./docs/javaguide面试突击版.md)
2. [JavaGuide重大更新记录](./docs/update-history.md)

更多原创内容和干货分享:

1. [公众号—JavaGuide](#公众号) : 最新原创文章+免费领取本文档配套的《Java面试突击》以及Java工程师必备学习资源)
Expand Down Expand Up @@ -337,18 +342,6 @@ SSO(Single Sign On)即单点登录说的是用户登陆多个子系统的其中
* **[【备战面试6】美团面试常见问题总结(附详解答案)](docs/essential-content-for-interview/PreparingForInterview/美团面试常见问题总结.md)**
* **[【备战面试7】一些刁难的面试问题总结](https://xiaozhuanlan.com/topic/9056431872)**

### 真实面试经历分析

- **[我和阿里面试官的一次“邂逅”(附问题详解)](docs/essential-content-for-interview/real-interview-experience-analysis/alibaba-1.md)**

### 面经

- [5面阿里,终获offer(2018年秋招)](docs/essential-content-for-interview/BATJrealInterviewExperience/5面阿里,终获offer.md)
- [蚂蚁金服2019实习生面经总结(已拿口头offer)](docs/essential-content-for-interview/BATJrealInterviewExperience/蚂蚁金服实习生面经总结(已拿口头offer).md)
- [2019年蚂蚁金服、头条、拼多多的面试总结](docs/essential-content-for-interview/BATJrealInterviewExperience/2019alipay-pinduoduo-toutiao.md)
- [Bigo的Java面试,我挂在了第三轮技术面上.........](docs/essential-content-for-interview/BATJrealInterviewExperience/bingo-interview.md)
- [2020 字节跳动后端面经分享!已拿 offer!](docs/essential-content-for-interview/BATJrealInterviewExperience/2020-zijietiaodong.md)

## Java学习常见问题汇总

1. [Java学习路线和方法推荐](docs/questions/java-learning-path-and-methods.md)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,11 +15,13 @@
<!-- /MarkdownTOC -->


## 说明

- 本文作者:wwwxmu
- 原文地址:https://www.weiweiblog.cn/13string/
- 作者的博客站点:https://www.weiweiblog.cn/ (推荐哦!)
> 授权转载!
>
> - 本文作者:wwwxmu
> - 原文地址:https://www.weiweiblog.cn/13string/


考虑到篇幅问题,我会分两次更新这个内容。本篇文章只是原文的一部分,我在原文的基础上增加了部分内容以及修改了部分代码和注释。另外,我增加了爱奇艺 2018 秋招 Java:`求给定合法括号序列的深度` 这道题。所有代码均编译成功,并带有注释,欢迎各位享用!

Expand Down
9 changes: 0 additions & 9 deletions docs/dataStructures-algorithms/剑指offer部分编程题.md
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,6 @@ n<=39
}
```

#### **运行时间对比:**

假设n为40我们分别使用迭代法和递归法计算,计算结果如下:

1. 迭代法
![迭代法](https://ws1.sinaimg.cn/large/006rNwoDgy1fpydt5as85j308a025dfl.jpg)
2. 递归法
![递归法](https://ws1.sinaimg.cn/large/006rNwoDgy1fpydt2d1k3j30ed02kt8i.jpg)

### 二 跳台阶问题

#### **题目描述:**
Expand Down
138 changes: 75 additions & 63 deletions docs/dataStructures-algorithms/数据结构.md
Original file line number Diff line number Diff line change
Expand Up @@ -98,87 +98,99 @@ Set 继承于 Collection 接口,是一个不允许出现重复元素,并且
- [ConcurrentHashMap 实现原理及源码分析](https://link.juejin.im/?target=http%3A%2F%2Fwww.cnblogs.com%2Fchengxiao%2Fp%2F6842045.html)

## 树
* ### 1 二叉树

[二叉树](https://baike.baidu.com/item/%E4%BA%8C%E5%8F%89%E6%A0%91)(百度百科)

(1)[完全二叉树](https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91)——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。

(2)[满二叉树](https://baike.baidu.com/item/%E6%BB%A1%E4%BA%8C%E5%8F%89%E6%A0%91)——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。

(3)[平衡二叉树](https://baike.baidu.com/item/%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91/10421057)——平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。
### 1 二叉树

* ### 2 完全二叉树
[二叉树](https://baike.baidu.com/item/%E4%BA%8C%E5%8F%89%E6%A0%91)(百度百科)

[完全二叉树](https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91)(百度百科)
(1)[完全二叉树](https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91)——若设二叉树的高度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数,第h层有叶子结点,并且叶子结点都是从左到右依次排布,这就是完全二叉树。

完全二叉树:叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。
* ### 3 满二叉树
(2)[满二叉树](https://baike.baidu.com/item/%E6%BB%A1%E4%BA%8C%E5%8F%89%E6%A0%91)——除了叶结点外每一个结点都有左右子叶且叶子结点都处在最底层的二叉树。

[满二叉树](https://baike.baidu.com/item/%E6%BB%A1%E4%BA%8C%E5%8F%89%E6%A0%91)(百度百科,国内外的定义不同)
(3)[平衡二叉树](https://baike.baidu.com/item/%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91/10421057)——平衡二叉树又被称为AVL树(区别于AVL算法),它是一棵二叉排序树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。

国内教程定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。
* ### 堆

[数据结构之堆的定义](https://blog.csdn.net/qq_33186366/article/details/51876191)
### 2 完全二叉树

堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。
* ### 4 二叉查找树(BST)
[完全二叉树](https://baike.baidu.com/item/%E5%AE%8C%E5%85%A8%E4%BA%8C%E5%8F%89%E6%A0%91)(百度百科)

[浅谈算法和数据结构: 七 二叉查找树](http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html)
完全二叉树:叶节点只能出现在最下层和次下层,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。

二叉查找树的特点:
### 3 满二叉树

1. 若任意节点的左子树不空,则左子树上所有结点的 值均小于它的根结点的值;
2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3. 任意节点的左、右子树也分别为二叉查找树;
4. 没有键值相等的节点(no duplicate nodes)。
[满二叉树](https://baike.baidu.com/item/%E6%BB%A1%E4%BA%8C%E5%8F%89%E6%A0%91)(百度百科,国内外的定义不同)

* ### 5 平衡二叉树(Self-balancing binary search tree)

[ 平衡二叉树](https://baike.baidu.com/item/%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91)(百度百科,平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等)
* ### 6 红黑树

- 红黑树特点:
1. 每个节点非红即黑;
2. 根节点总是黑色的;
3. 每个叶子节点都是黑色的空节点(NIL节点);
4. 如果节点是红色的,则它的子节点必须是黑色的(反之不一定);
5. 从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)。

- 红黑树的应用:
国内教程定义:一个二叉树,如果每一个层的结点数都达到最大值,则这个二叉树就是满二叉树。也就是说,如果一个二叉树的层数为K,且结点总数是(2^k) -1 ,则它就是满二叉树。

### 堆

[数据结构之堆的定义](https://blog.csdn.net/qq_33186366/article/details/51876191)

堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。

### 4 二叉查找树(BST)

[浅谈算法和数据结构: 七 二叉查找树](http://www.cnblogs.com/yangecnu/p/Introduce-Binary-Search-Tree.html)

二叉查找树的特点:

1. 若任意节点的左子树不空,则左子树上所有结点的 值均小于它的根结点的值;
2. 若任意节点的右子树不空,则右子树上所有结点的值均大于它的根结点的值;
3. 任意节点的左、右子树也分别为二叉查找树;
4. 没有键值相等的节点(no duplicate nodes)。

### 5 平衡二叉树(Self-balancing binary search tree)

[ 平衡二叉树](https://baike.baidu.com/item/%E5%B9%B3%E8%A1%A1%E4%BA%8C%E5%8F%89%E6%A0%91)(百度百科,平衡二叉树的常用实现方法有红黑树、AVL、替罪羊树、Treap、伸展树等)

### 6 红黑树

红黑树特点:

1. 每个节点非红即黑;
2. 根节点总是黑色的;
3. 每个叶子节点都是黑色的空节点(NIL节点);
4. 如果节点是红色的,则它的子节点必须是黑色的(反之不一定);
5. 从根节点到叶节点或空子节点的每条路径,必须包含相同数目的黑色节点(即相同的黑色高度)。


红黑树的应用:

TreeMap、TreeSet以及JDK1.8之后的HashMap底层都用到了红黑树。
TreeMap、TreeSet以及JDK1.8之后的HashMap底层都用到了红黑树。

- 为什么要用红黑树
**为什么要用红黑树?**

简单来说红黑树就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线性结构。详细了解可以查看 [漫画:什么是红黑树?](https://juejin.im/post/5a27c6946fb9a04509096248#comment)(也介绍到了二叉查找树,非常推荐)

简单来说红黑树就是为了解决二叉查找树的缺陷,因为二叉查找树在某些情况下会退化成一个线性结构。详细了解可以查看 [漫画:什么是红黑树?](https://juejin.im/post/5a27c6946fb9a04509096248#comment)(也介绍到了二叉查找树,非常推荐)

- 推荐文章:
- [漫画:什么是红黑树?](https://juejin.im/post/5a27c6946fb9a04509096248#comment)(也介绍到了二叉查找树,非常推荐)
- [寻找红黑树的操作手册](http://dandanlove.com/2018/03/18/red-black-tree/)(文章排版以及思路真的不错)
- [红黑树深入剖析及Java实现](https://zhuanlan.zhihu.com/p/24367771)(美团点评技术团队)
* ### 7 B-,B+,B*树

[二叉树学习笔记之B树、B+树、B*树 ](https://yq.aliyun.com/articles/38345)

[《B-树,B+树,B*树详解》](https://blog.csdn.net/aqzwss/article/details/53074186)

[《B-树,B+树与B*树的优缺点比较》](https://blog.csdn.net/bigtree_3721/article/details/73632405)

B-树(或B树)是一种平衡的多路查找(又称排序)树,在文件系统中有所应用。主要用作文件的索引。其中的B就表示平衡(Balance)
1. B+ 树的叶子节点链表结构相比于 B- 树便于扫库,和范围检索。
2. B+树支持range-query(区间查询)非常方便,而B树不支持。这是数据库选用B+树的最主要原因。
3. B\*树 是B+树的变体,B\*树分配新结点的概率比B+树要低,空间使用率更高;
* ### 8 LSM 树
推荐文章:

- [漫画:什么是红黑树?](https://juejin.im/post/5a27c6946fb9a04509096248#comment)(也介绍到了二叉查找树,非常推荐)
- [寻找红黑树的操作手册](http://dandanlove.com/2018/03/18/red-black-tree/)(文章排版以及思路真的不错)
- [红黑树深入剖析及Java实现](https://zhuanlan.zhihu.com/p/24367771)(美团点评技术团队)

### 7 B-,B+,B*树

[二叉树学习笔记之B树、B+树、B*树 ](https://yq.aliyun.com/articles/38345)

[《B-树,B+树,B*树详解》](https://blog.csdn.net/aqzwss/article/details/53074186)

[《B-树,B+树与B*树的优缺点比较》](https://blog.csdn.net/bigtree_3721/article/details/73632405)

B-树(或B树)是一种平衡的多路查找(又称排序)树,在文件系统中有所应用。主要用作文件的索引。其中的B就表示平衡(Balance)

[[HBase] LSM树 VS B+树](https://blog.csdn.net/dbanote/article/details/8897599)
1. B+ 树的叶子节点链表结构相比于 B- 树便于扫库,和范围检索。
2. B+树支持range-query(区间查询)非常方便,而B树不支持。这是数据库选用B+树的最主要原因。
3. B\*树 是B+树的变体,B\*树分配新结点的概率比B+树要低,空间使用率更高;

### 8 LSM 树

[[HBase] LSM树 VS B+树](https://blog.csdn.net/dbanote/article/details/8897599)

B+树最大的性能问题是会产生大量的随机IO
B+树最大的性能问题是会产生大量的随机IO

为了克服B+树的弱点,HBase引入了LSM树的概念,即Log-Structured Merge-Trees。
[LSM树由来、设计思想以及应用到HBase的索引](http://www.cnblogs.com/yanghuahui/p/3483754.html)
为了克服B+树的弱点,HBase引入了LSM树的概念,即Log-Structured Merge-Trees。

[LSM树由来、设计思想以及应用到HBase的索引](http://www.cnblogs.com/yanghuahui/p/3483754.html)


## 图
Expand Down
6 changes: 5 additions & 1 deletion docs/java/Java基础知识.md
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,11 @@ Constructor 不能被 override(重写),但是可以 overload(重载),所

**可变性**

简单的来说:String 类中使用 final 关键字修饰字符数组来保存字符串,`private final char value[]`,所以 String 对象是不可变的。而 StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串`char[]value` 但是没有用 final 关键字修饰,所以这两种对象都是可变的。
简单的来说:String 类中使用 final 关键字修饰字符数组来保存字符串,`private final char value[]`,所以 String 对象是不可变的。

> 补充(来自[issue 675](https://github.com/Snailclimb/JavaGuide/issues/675)):在 Java 9 之后,String 类的实现改用 byte 数组存储字符串 `private final byte[] value`;

而 StringBuilder 与 StringBuffer 都继承自 AbstractStringBuilder 类,在 AbstractStringBuilder 中也是使用字符数组保存字符串`char[]value` 但是没有用 final 关键字修饰,所以这两种对象都是可变的。

StringBuilder 与 StringBuffer 的构造方法都是调用父类构造方法也就是 AbstractStringBuilder 实现的,大家可以自行查阅源码。

Expand Down
2 changes: 1 addition & 1 deletion docs/java/Java程序设计题.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ public class MyStack {

//TODO:返回栈顶元素并出栈
private int pop() {
if (count == -1)
if (count == 0)
throw new IllegalArgumentException("Stack is empty.");
count--;
return storage[count];
Expand Down
Original file line number Diff line number Diff line change
@@ -1,27 +1,3 @@
点击关注[公众号](#公众号 "公众号")及时获取笔主最新更新文章,并可免费领取本文档配套的《Java 面试突击》以及 Java 工程师必备学习资源。


- [Java 并发基础常见面试题总结](#java-并发基础常见面试题总结)
- [1. 什么是线程和进程?](#1-什么是线程和进程)
- [1.1. 何为进程?](#11-何为进程)
- [1.2. 何为线程?](#12-何为线程)
- [2. 请简要描述线程与进程的关系,区别及优缺点?](#2-请简要描述线程与进程的关系区别及优缺点)
- [2.1. 图解进程和线程的关系](#21-图解进程和线程的关系)
- [2.2. 程序计数器为什么是私有的?](#22-程序计数器为什么是私有的)
- [2.3. 虚拟机栈和本地方法栈为什么是私有的?](#23-虚拟机栈和本地方法栈为什么是私有的)
- [2.4. 一句话简单了解堆和方法区](#24-一句话简单了解堆和方法区)
- [3. 说说并发与并行的区别?](#3-说说并发与并行的区别)
- [4. 为什么要使用多线程呢?](#4-为什么要使用多线程呢)
- [5. 使用多线程可能带来什么问题?](#5-使用多线程可能带来什么问题)
- [6. 说说线程的生命周期和状态?](#6-说说线程的生命周期和状态)
- [7. 什么是上下文切换?](#7-什么是上下文切换)
- [8. 什么是线程死锁?如何避免死锁?](#8-什么是线程死锁如何避免死锁)
- [8.1. 认识线程死锁](#81-认识线程死锁)
- [8.2. 如何避免线程死锁?](#82-如何避免线程死锁)
- [9. 说说 sleep() 方法和 wait() 方法区别和共同点?](#9-说说-sleep-方法和-wait-方法区别和共同点)
- [10. 为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法?](#10-为什么我们调用-start-方法时会执行-run-方法为什么我们不能直接调用-run-方法)
- [公众号](#公众号)


# Java 并发基础常见面试题总结

Expand Down
Loading