Date: Thu, 11 Apr 2019 23:26:04 +0800
Subject: [PATCH 042/903] =?UTF-8?q?Add=20=E4=B8=83=E7=89=9B=E4=BA=91CEO?=
=?UTF-8?q?=E8=80=81=E8=AE=B8=E7=9A=84=E6=9E=B6=E6=9E=84=E4=B8=93=E6=A0=8F?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
README.md | 9 +++++++++
1 file changed, 9 insertions(+)
diff --git a/README.md b/README.md
index 81c488cc9c5..63ca1b59ce7 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,7 @@
Java后端技术交流群(限工作一年及以上,架构视频免费领取) :[](https://jq.qq.com/?_wv=1027&k=5QqyxIx)
+强烈推荐七牛云CEO老许的[架构专栏](#架构),微信扫描二维码购买后,[加我好友](#联系我)私聊我领取24元返现。129元的课程相当于75入手。
+
Java 学习/面试指南
@@ -279,6 +281,13 @@ Markdown 格式参考:[Github Markdown格式](https://guides.github.com/featur

+
+### 架构
+
+
+
+
+
### Contributor
下面是笔主收集的一些对本仓库提过有价值的pr或者issue的朋友,人数较多,如果你也对本仓库提过不错的pr或者issue的话,你可以加我的微信与我联系。下面的排名不分先后!
From 280e920dcb9f9fd4d9f607173ab4a2c078cdd927 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E5=8A=A0=E9=91=AB/Jason=20Won?=
<1670162477@qq.com>
Date: Fri, 12 Apr 2019 09:23:40 +0800
Subject: [PATCH 043/903] =?UTF-8?q?Update=20Java=E7=BC=96=E7=A8=8B?=
=?UTF-8?q?=E8=A7=84=E8=8C=83.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
增加一个实际工程操作的总结,来自https://xwjie.github.io/rule/
---
...Java\347\274\226\347\250\213\350\247\204\350\214\203.md" | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git "a/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md" "b/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
index b96a6726d77..a1c746fa7fe 100644
--- "a/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
+++ "b/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
@@ -1,6 +1,8 @@
根据各位建议加上了这部分内容,我暂时只是给出了两个资源,后续可能会对重要的点进行总结,然后更新在这里,如果你总结过这类东西,欢迎与我联系!
-
+团队
- **阿里巴巴Java开发手册(详尽版)**
-- **Google Java编程风格指南:**
\ No newline at end of file
+- **Google Java编程风格指南:**
+个人
+- **程序员你为什么这么累: **
From 9e1c25cdd5e621e9838e2618b6ce18931f37ee31 Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Fri, 12 Apr 2019 11:33:55 +0800
Subject: [PATCH 044/903] =?UTF-8?q?Update=20Java=E7=BC=96=E7=A8=8B?=
=?UTF-8?q?=E8=A7=84=E8=8C=83.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Java\347\274\226\347\250\213\350\247\204\350\214\203.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md" "b/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
index a1c746fa7fe..13651cfd271 100644
--- "a/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
+++ "b/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
@@ -5,4 +5,4 @@
- **阿里巴巴Java开发手册(详尽版)**
- **Google Java编程风格指南:**
个人
-- **程序员你为什么这么累: **
+- **程序员你为什么这么累:**
From 7e3e18f77e9f4d06e96c4b409d316ce87754b89c Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Fri, 12 Apr 2019 11:34:32 +0800
Subject: [PATCH 045/903] =?UTF-8?q?Update=20Java=E7=BC=96=E7=A8=8B?=
=?UTF-8?q?=E8=A7=84=E8=8C=83.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...va\347\274\226\347\250\213\350\247\204\350\214\203.md" | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)
diff --git "a/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md" "b/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
index 13651cfd271..0845c21b0a3 100644
--- "a/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
+++ "b/docs/java/Java\347\274\226\347\250\213\350\247\204\350\214\203.md"
@@ -1,8 +1,12 @@
根据各位建议加上了这部分内容,我暂时只是给出了两个资源,后续可能会对重要的点进行总结,然后更新在这里,如果你总结过这类东西,欢迎与我联系!
-团队
+
+### 团队
+
- **阿里巴巴Java开发手册(详尽版)**
- **Google Java编程风格指南:**
-个人
+
+### 个人
+
- **程序员你为什么这么累:**
From 423fe3025ca28f8bd7a5d94b75654239a50e77fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E7=8E=8B=E5=8A=A0=E9=91=AB/Jason=20Won?=
<1670162477@qq.com>
Date: Fri, 12 Apr 2019 13:44:19 +0800
Subject: [PATCH 046/903] =?UTF-8?q?Update=20=E4=BA=8B=E5=8A=A1=E9=9A=94?=
=?UTF-8?q?=E7=A6=BB=E7=BA=A7=E5=88=AB(=E5=9B=BE=E6=96=87=E8=AF=A6?=
=?UTF-8?q?=E8=A7=A3).md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
1. 错别字修正
2. 加了一个对比表格
3. 加了2个链接,数据库锁和隔离级别的关系,建议完善这一部分的知识
---
...6\346\226\207\350\257\246\350\247\243).md" | 19 +++++++++++++++----
1 file changed, 15 insertions(+), 4 deletions(-)
diff --git "a/docs/database/\344\272\213\345\212\241\351\232\224\347\246\273\347\272\247\345\210\253(\345\233\276\346\226\207\350\257\246\350\247\243).md" "b/docs/database/\344\272\213\345\212\241\351\232\224\347\246\273\347\272\247\345\210\253(\345\233\276\346\226\207\350\257\246\350\247\243).md"
index cf94512e7c1..800534d781a 100644
--- "a/docs/database/\344\272\213\345\212\241\351\232\224\347\246\273\347\272\247\345\210\253(\345\233\276\346\226\207\350\257\246\350\247\243).md"
+++ "b/docs/database/\344\272\213\345\212\241\351\232\224\347\246\273\347\272\247\345\210\253(\345\233\276\346\226\207\350\257\246\350\247\243).md"
@@ -31,13 +31,13 @@
1. **原子性:** 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用;
-2. **一致性:** 执行事务前后,数据保持一致;
-3. **隔离性:** 并发访问数据库时,一个用户的事物不被其他事物所干扰,各并发事务之间数据库是独立的;
+2. **一致性:** 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的;
+3. **隔离性:** 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的;
4. **持久性:** 一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
### 并发事务带来的问题
-在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致一下的问题。
+在典型的应用程序中,多个事务并发运行,经常会操作相同的数据来完成各自的任务(多个用户对统一数据进行操作)。并发虽然是必须的,但可能会导致以下的问题。
- **脏读(Dirty read):** 当一个事务正在访问数据并且对数据进行了修改,而这种修改还没有提交到数据库中,这时另外一个事务也访问了这个数据,然后使用了这个数据。因为这个数据是还没有提交的数据,那么另外一个事务读到的这个数据是“脏数据”,依据“脏数据”所做的操作可能是不正确的。
- **丢失修改(Lost to modify):** 指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。这样第一个事务内的修改结果就被丢失,因此称为丢失修改。 例如:事务1读取某表中的数据A=20,事务2也读取A=20,事务1修改A=A-1,事务2也修改A=A-1,最终结果A=19,事务1的修改被丢失。
@@ -58,9 +58,18 @@
- **READ-UNCOMMITTED(读取未提交):** 最低的隔离级别,允许读取尚未提交的数据变更,**可能会导致脏读、幻读或不可重复读**
- **READ-COMMITTED(读取已提交):** 允许读取并发事务已经提交的数据,**可以阻止脏读,但是幻读或不可重复读仍有可能发生**
-- **REPEATABLE-READ(可重读):** 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,**可以阻止脏读和不可重复读,但幻读仍有可能发生。**
+- **REPEATABLE-READ(可重复读):** 对同一字段的多次读取结果都是一致的,除非数据是被本身事务自己所修改,**可以阻止脏读和不可重复读,但幻读仍有可能发生。**
- **SERIALIZABLE(可串行化):** 最高的隔离级别,完全服从ACID的隔离级别。所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰,也就是说,**该级别可以防止脏读、不可重复读以及幻读**。
+----
+
+| 隔离级别 | 脏读 | 不可重复读 | 幻影读 |
+| :---: | :---: | :---:| :---: |
+| READ-UNCOMMITTED | √ | √ | √ |
+| READ-COMMITTED | × | √ | √ |
+| REPEATABLE-READ | × | × | √ |
+| SERIALIZABLE | × | × | × |
+
MySQL InnoDB 存储引擎的默认支持的隔离级别是 **REPEATABLE-READ(可重读)**。我们可以通过`SELECT @@tx_isolation;`命令来查看
```sql
@@ -136,3 +145,5 @@ SET [SESSION|GLOBAL] TRANSACTION ISOLATION LEVEL [READ UNCOMMITTED|READ COMMITTE
- 《MySQL技术内幕:InnoDB存储引擎》
-
+- [Mysql 锁:灵魂七拷问](https://tech.youzan.com/seven-questions-about-the-lock-of-mysql/)
+- [Innodb 中的事务隔离级别和锁的关系](https://tech.meituan.com/2014/08/20/innodb-lock.html)
From aa436412337feeb1532b4b7723e05901ba2b4950 Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Sun, 14 Apr 2019 08:28:20 +0800
Subject: [PATCH 047/903] Update HomePage.md
---
docs/HomePage.md | 15 +++++++++++++++
1 file changed, 15 insertions(+)
diff --git a/docs/HomePage.md b/docs/HomePage.md
index 33f8ad3f2da..4fccd1651e8 100644
--- a/docs/HomePage.md
+++ b/docs/HomePage.md
@@ -1,5 +1,7 @@
Java后端技术交流群(限工作一年及以上,架构视频免费领取) :[](https://jq.qq.com/?_wv=1027&k=5QqyxIx)
+强烈推荐七牛云CEO老许的[架构专栏](#架构),微信扫描二维码购买后,[加我好友](#联系我)私聊我领取24元返现。129元的课程相当于75入手。
+
Java 学习/面试指南
@@ -193,6 +195,19 @@ Java后端技术交流群(限工作一年及以上,架构视频免费领取)
- [ ] Netty 总结(---正在进行中---)
- [ ] 数据结构总结重构(---正在进行中---)
+## 联系我
+
+添加我的微信备注“Github”,回复关键字 **“加群”** 即可入群。
+
+
+
+
+## 架构
+
+
+
+
+
## 公众号
- 如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。
From 70b6ebe585e3f3a88a5d2fb3bc5a8756f50a7619 Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Mon, 15 Apr 2019 08:32:25 +0800
Subject: [PATCH 048/903] Fix typo
---
...\214\226\350\247\204\350\214\203\345\273\272\350\256\256.md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/docs/database/MySQL\351\253\230\346\200\247\350\203\275\344\274\230\345\214\226\350\247\204\350\214\203\345\273\272\350\256\256.md" "b/docs/database/MySQL\351\253\230\346\200\247\350\203\275\344\274\230\345\214\226\350\247\204\350\214\203\345\273\272\350\256\256.md"
index 335241796e9..dcfc2edd210 100644
--- "a/docs/database/MySQL\351\253\230\346\200\247\350\203\275\344\274\230\345\214\226\350\247\204\350\214\203\345\273\272\350\256\256.md"
+++ "b/docs/database/MySQL\351\253\230\346\200\247\350\203\275\344\274\230\345\214\226\350\247\204\350\214\203\345\273\272\350\256\256.md"
@@ -120,7 +120,7 @@ Innodb 支持事务,支持行级锁,更好的恢复性,高并发下性能
### 9. 禁止在线上做数据库压力测试
-### 10. 禁止从开发环境,测试环境直接连接生成环境数据库
+### 10. 禁止从开发环境,测试环境直接连接生产环境数据库
------
From ad9467090204b1578ee1e9df31d78bfd9df4459d Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Mon, 15 Apr 2019 09:32:17 +0800
Subject: [PATCH 049/903] =?UTF-8?q?Update=20=E8=BF=99=E5=87=A0=E9=81=93Jav?=
=?UTF-8?q?a=E9=9B=86=E5=90=88=E6=A1=86=E6=9E=B6=E9=9D=A2=E8=AF=95?=
=?UTF-8?q?=E9=A2=98=E5=87=A0=E4=B9=8E=E5=BF=85=E9=97=AE.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
修改“HashMap 多线程操作导致死循环问题”的答案
---
...40\344\271\216\345\277\205\351\227\256.md" | 25 ++++---------------
1 file changed, 5 insertions(+), 20 deletions(-)
diff --git "a/docs/java/\350\277\231\345\207\240\351\201\223Java\351\233\206\345\220\210\346\241\206\346\236\266\351\235\242\350\257\225\351\242\230\345\207\240\344\271\216\345\277\205\351\227\256.md" "b/docs/java/\350\277\231\345\207\240\351\201\223Java\351\233\206\345\220\210\346\241\206\346\236\266\351\235\242\350\257\225\351\242\230\345\207\240\344\271\216\345\277\205\351\227\256.md"
index af094e46b5b..45522c474e6 100644
--- "a/docs/java/\350\277\231\345\207\240\351\201\223Java\351\233\206\345\220\210\346\241\206\346\236\266\351\235\242\350\257\225\351\242\230\345\207\240\344\271\216\345\277\205\351\227\256.md"
+++ "b/docs/java/\350\277\231\345\207\240\351\201\223Java\351\233\206\345\220\210\346\241\206\346\236\266\351\235\242\350\257\225\351\242\230\345\207\240\344\271\216\345\277\205\351\227\256.md"
@@ -185,24 +185,9 @@ static int hash(int h) {
## HashMap 多线程操作导致死循环问题
-在多线程下,进行 put 操作会导致 HashMap 死循环,原因在于 HashMap 的扩容 resize()方法。由于扩容是新建一个数组,复制原数据到数组。由于数组下标挂有链表,所以需要复制链表,但是多线程操作有可能导致环形链表。复制链表过程如下:
-以下模拟2个线程同时扩容。假设,当前 HashMap 的空间为2(临界值为1),hashcode 分别为 0 和 1,在散列地址 0 处有元素 A 和 B,这时候要添加元素 C,C 经过 hash 运算,得到散列地址为 1,这时候由于超过了临界值,空间不够,需要调用 resize 方法进行扩容,那么在多线程条件下,会出现条件竞争,模拟过程如下:
+主要原因在于 并发下的Rehash 会造成元素之间会形成一个循环链表。不过,jdk 1.8 后解决了这个问题,但是还是不建议在多线程下使用 HashMap,因为多线程下使用 HashMap 还是会存在其他问题比如数据丢失。并发环境下推荐使用 ConcurrentHashMap 。
- 线程一:读取到当前的 HashMap 情况,在准备扩容时,线程二介入
-
-
-
-线程二:读取 HashMap,进行扩容
-
-
-
-线程一:继续执行
-
-
-
-这个过程为,先将 A 复制到新的 hash 表中,然后接着复制 B 到链头(A 的前边:B.next=A),本来 B.next=null,到此也就结束了(跟线程二一样的过程),但是,由于线程二扩容的原因,将 B.next=A,所以,这里继续复制A,让 A.next=B,由此,环形链表出现:B.next=A; A.next=B
-
-**注意:jdk1.8已经解决了死循环的问题。**详细信息请阅读[jdk1.8 hashmap多线程put不会造成死循环](https://blog.csdn.net/qq_27007251/article/details/71403647)
+详情请查看:
## HashSet 和 HashMap 区别
@@ -258,12 +243,12 @@ synchronized只锁定当前链表或红黑二叉树的首节点,这样只要ha
## 集合框架底层数据结构总结
### Collection
-
+
#### 1. List
- **Arraylist:** Object数组
- **Vector:** Object数组
- **LinkedList:** 双向链表(JDK1.6之前为循环链表,JDK1.7取消了循环)
- 详细可阅读[JDK1.7-LinkedList循环链表优化](https://www.cnblogs.com/xingele0917/p/3696593.html)
+ 详细可阅读[JDK1.7-LinkedList循环链表优化](https://www.cnblogs.com/xingele0917/p/3696593.html)
#### 2. Set
- **HashSet(无序,唯一):** 基于 HashMap 实现的,底层采用 HashMap 来保存元素
@@ -275,7 +260,7 @@ synchronized只锁定当前链表或红黑二叉树的首节点,这样只要ha
- **LinkedHashMap:** LinkedHashMap 继承自 HashMap,所以它的底层仍然是基于拉链式散列结构即由数组和链表或红黑树组成。另外,LinkedHashMap 在上面结构的基础上,增加了一条双向链表,使得上面的结构可以保持键值对的插入顺序。同时通过对链表进行相应的操作,实现了访问顺序相关逻辑。详细可以查看:[《LinkedHashMap 源码详细分析(JDK1.8)》](https://www.imooc.com/article/22931)
- **HashTable:** 数组+链表组成的,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突而存在的
- **TreeMap:** 红黑树(自平衡的排序二叉树)
-
+
From e0d663948994b6b3e1c020416beaef9520f8b2a8 Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Mon, 15 Apr 2019 10:12:02 +0800
Subject: [PATCH 050/903] =?UTF-8?q?Update=20=E5=8F=AF=E8=83=BD=E6=98=AF?=
=?UTF-8?q?=E6=8A=8AJava=E5=86=85=E5=AD=98=E5=8C=BA=E5=9F=9F=E8=AE=B2?=
=?UTF-8?q?=E7=9A=84=E6=9C=80=E6=B8=85=E6=A5=9A=E7=9A=84=E4=B8=80=E7=AF=87?=
=?UTF-8?q?=E6=96=87=E7=AB=A0.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
修改 :String 类和常量池
---
...00\347\257\207\346\226\207\347\253\240.md" | 27 ++++++++++---------
1 file changed, 15 insertions(+), 12 deletions(-)
diff --git "a/docs/java/\345\217\257\350\203\275\346\230\257\346\212\212Java\345\206\205\345\255\230\345\214\272\345\237\237\350\256\262\347\232\204\346\234\200\346\270\205\346\245\232\347\232\204\344\270\200\347\257\207\346\226\207\347\253\240.md" "b/docs/java/\345\217\257\350\203\275\346\230\257\346\212\212Java\345\206\205\345\255\230\345\214\272\345\237\237\350\256\262\347\232\204\346\234\200\346\270\205\346\245\232\347\232\204\344\270\200\347\257\207\346\226\207\347\253\240.md"
index d5b756c99ef..68c4bd5b6c6 100644
--- "a/docs/java/\345\217\257\350\203\275\346\230\257\346\212\212Java\345\206\205\345\255\230\345\214\272\345\237\237\350\256\262\347\232\204\346\234\200\346\270\205\346\245\232\347\232\204\344\270\200\347\257\207\346\226\207\347\253\240.md"
+++ "b/docs/java/\345\217\257\350\203\275\346\230\257\346\212\212Java\345\206\205\345\255\230\345\214\272\345\237\237\350\256\262\347\232\204\346\234\200\346\270\205\346\245\232\347\232\204\344\270\200\347\257\207\346\226\207\347\253\240.md"
@@ -254,16 +254,23 @@ JDK1.4 中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**
**1 String 对象的两种创建方式:**
```java
- String str1 = "abcd";
- String str2 = new String("abcd");
- System.out.println(str1==str2);//false
+String str1 = "abcd";//先检查字符串常量池中有没有"abcd",如果字符串常量池中没有,则创建一个,然后str1指向字符串常量池中的对象,如果有,则直接将str1指向"abcd"";
+String str2 = new String("abcd");//堆中创建一个新的对象
+String str3 = new String("abcd");//堆中创建一个新的对象
+System.out.println(str1==str2);//false
+System.out.println(str2==str3);//false
```
-这两种不同的创建方法是有差别的,第一种方式是在常量池中拿对象,第二种方式是直接在堆内存空间创建一个新的对象。
-
-记住:只要使用new方法,便需要创建新的对象。
+这两种不同的创建方法是有差别的。
+- 第一种方式是在常量池中拿对象;
+- 第二种方式是直接在堆内存空间创建一个新的对象。
+记住一点:**只要使用new方法,便需要创建新的对象。**
+
+再给大家一个图应该更容易理解,图片来源::
+
+
**2 String 类型的常量池比较特殊。它的主要使用方法有两种:**
@@ -293,9 +300,9 @@ JDK1.4 中新加入的 **NIO(New Input/Output) 类**,引入了一种基于**

尽量避免多个字符串拼接,因为这样会重新创建对象。如果需要改变字符串的话,可以使用 StringBuilder 或者 StringBuffer。
-### String s1 = new String("abc");这句话创建了几个对象?
+### String s1 = new String("abc");这句话创建了几个字符串对象?
-**创建了两个对象。**
+**将创建1或2个字符串。如果池中已存在字符串文字“abc”,则池中只会创建一个字符串“s1”。如果池中没有字符串文字“abc”,那么它将首先在池中创建,然后在堆空间中创建,因此将创建总共2个字符串对象。**
**验证:**
@@ -313,10 +320,6 @@ false
true
```
-**解释:**
-
-先有字符串"abc"放入常量池,然后 new 了一份字符串"abc"放入Java堆(字符串常量"abc"在编译期就已经确定放入常量池,而 Java 堆上的"abc"是在运行期初始化阶段才确定),然后 Java 栈的 str1 指向Java堆上的"abc"。
-
### 8种基本类型的包装类和常量池
- **Java 基本类型的包装类的大部分都实现了常量池技术,即Byte,Short,Integer,Long,Character,Boolean;这5种包装类默认创建了数值[-128,127]的相应类型的缓存数据,但是超出此范围仍然会去创建新的对象。**
From f7e84b963c91e59e9714eaf3cbb6dc98dc54825b Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Mon, 15 Apr 2019 12:46:01 +0800
Subject: [PATCH 051/903] =?UTF-8?q?Create=20=E8=9A=82=E8=9A=81=E9=87=91?=
=?UTF-8?q?=E6=9C=8D=E5=AE=9E=E4=B9=A0=E7=94=9F=E9=9D=A2=E7=BB=8F=E6=80=BB?=
=?UTF-8?q?=E7=BB=93(=E5=B7=B2=E6=8B=BF=E5=8F=A3=E5=A4=B4offer).md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\213\277\345\217\243\345\244\264offer).md" | 241 ++++++++++++++++++
1 file changed, 241 insertions(+)
create mode 100644 "docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
diff --git "a/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md" "b/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
new file mode 100644
index 00000000000..edc56de6273
--- /dev/null
+++ "b/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
@@ -0,0 +1,241 @@
+- [一面(37分钟左右)](#一面37分钟左右)
+- [二面(33分钟左右)](#二面33分钟左右)
+- [三面(46分钟)](#三面46分钟)
+- [HR面](#hr面)
+
+### 一面(37分钟左右)
+
+一面是上海的小哥打来的,3.12号中午确认的内推,下午就打来约时间了,也是唯一一个约时间的面试官。约的晚上八点。紧张的一比,人生第一次面试就献给了阿里。
+
+幸运的是一面的小哥特温柔。好像是个海归?口语中夹杂着英文。废话不多说,上干货:
+
+**面试官:** 先自我介绍下吧!
+
+**我:** 巴拉巴拉...。
+
+> 关于自我介绍:从HR面、技术面到高管面/部门主管面,面试官一般会让你先自我介绍一下,所以好好准备自己的自我介绍真的非常重要。网上一般建议的是准备好两份自我介绍:一份对HR说的,主要讲能突出自己的经历,会的编程技术一语带过;另一份对技术面试官说的,主要讲自己会的技术细节,项目经验,经历那些就一语带过。
+
+**面试官:** 我看你简历上写你做了个秒杀系统?我们就从这个项目开始吧,先介绍下你的项目。
+
+> 关于项目介绍:如果有项目的话,技术面试第一步,面试官一般都是让你自己介绍一下你的项目。你可以从下面几个方向来考虑:
+>
+> 1. 对项目整体设计的一个感受(面试官可能会让你画系统的架构图)
+> 2. 在这个项目中你负责了什么、做了什么、担任了什么角色
+> 3. 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用
+> 4. 另外项目描述中,最好可以体现自己的综合素质,比如你是如何协调项目组成员协同开发的或者在遇到某一个棘手的问题的时候你是如何解决的又或者说你在这个项目用了什么技术实现了什么功能比如:用redis做缓存提高访问速度和并发量、使用消息队列削峰和降流等等。
+
+**我:** 我说了我是如何考虑它的需求(秒杀地址隐藏,记录订单,减库存),一开始简单的用sycHRonized锁住方法,出现了问题,后来乐观锁改进,又有瓶颈,再上缓存,出现了缓存雪崩,于是缓存预热,错开缓存失效时间。最后,发现先记录订单再减库存会减少行级锁等待时间。
+
+> 一面面试官很耐心地听,并给了我一些指导,问了我乐观锁是怎么实现的,我说是基于sql语句,在减库存操作的where条件里加剩余库存数>0,他说这应该不算是一种乐观锁,应该先查库存,在减库存的时候判断当前库存是否与读到的库存一样(可这样不是多一次查询操作吗?不是很理解,不过我没有反驳,只是说理解您的意思。事实证明千万别怼面试官,即使你觉得他说的不对)
+
+**面试官:** 我缓存雪崩什么情况下会发生?如何避免?
+
+**我:** 当多个商品缓存同时失效时会雪崩,导致大量查询数据库。还有就是秒杀刚开始的时候缓存里没有数据。解决方案:缓存预热,错开缓存失效时间
+
+**面试官:** 问我更新数据库的同时为什么不马上更新缓存,而是删除缓存?
+
+**我:** 因为考虑到更新数据库后更新缓存可能会因为多线程下导致写入脏数据(比如线程A先更新数据库成功,接下来要取更新缓存,接着线程B更新数据库,但B又更新了缓存,接着B的时间片用完了,线程A更新了缓存)
+
+逼逼了将近30分钟,面试官居然用周杰伦的语气对我说:
+
+
+
+我突然受宠若惊,连忙说谢谢,也正是因为第一次面试得到了面试官的肯定,才让我信心大增,二三面稳定发挥。
+
+**面试官又曰:** 我看你还懂数据库是吧,答:略懂略懂。。。那我问个简单的吧!
+
+**我:** 因为这个问题太简单了,所以我忘记它是什么了。
+
+**面试官:** 你还会啥数据库知识?
+
+**我:** 我一听,问的这么随意的吗。。。都让我选题了,我就说我了解索引,慢查询优化,巴拉巴拉
+
+**面试官:** 等等,你说索引是吧,那你能说下索引的存储数据结构吗?
+
+**我:** 我心想这简单啊,我就说B+树,还说了为什么用B+树
+
+**面试官:** 你简历上写的这个J.U.C包是什么啊?(他居然不知道JUC)
+
+**我:** 就是java多线程的那个包啊。。。
+
+**面试官:** 那你都了解里面的哪些东西呢?
+
+**我:** 哈哈哈!这可是我的强项,从ConcurrentHashMap,ConcurrentLinkedQueue说到CountDownLatch,CyclicBarrier,又说到线程池,分别说了底层实现和项目中的应用。
+
+**面试官:** 我觉得差不多了,那我再问个与技术无关的问题哈,虽然这个问题可能不应该我问,就是你是如何考虑你的项目架构的呢?
+
+**我:** 先用最简单的方式实现它,再去发掘系统的问题和瓶颈,于是查资料改进架构。。。
+
+**面试官:** 好,那我给你介绍下我这边的情况吧
+
+
+
+**总结:** 一面可能是简历面吧,问的比较简单,我在讲项目中说出了我做项目时的学习历程和思考,赢得了面试官的好感,感觉他应该给我的评价很好。
+
+### 二面(33分钟左右)
+
+然而开心了没一会,内推人问我面的怎么样啊?看我流程已经到大大boss那了。我一听二面不是主管吗???怎么直接跳了一面。于是瞬间慌了,赶紧(下床)学习准备二面。
+
+隔了一天,3.14的早上10:56分,杭州的大大boss给我打来了电话,卧槽我当时在上毛概课,万恶的毛概课每节课都点名,我还在最后一排不敢跑出去。于是接起电话来怂怂地说不好意思我在上课,晚上可以面试吗?大大boss看来很忙啊,跟我说晚上没时间啊,再说吧!
+
+于是又隔了一天,3.16中午我收到了北京的电话,当时心里小失望,我的大大boss呢???接起电话来,就是一番狂轰乱炸。。。
+
+第一步还是先自我介绍,这个就不多说了,提前准备好要说的重点就没问题!
+
+**面试官:** 我们还是从你的项目开始吧,说说你的秒杀系统。
+
+**我:** 一面时的套路。。。我考虑到秒杀地址在开始前不应暴露给用户。。。
+
+**面试官:** 等下啊,为什么要这样呢?暴露给用户会怎么样?
+
+**我:** 用户提前知道秒杀地址就可以写脚本来抢购了,这样不公平
+
+**面试官:** 那比如说啊,我现在是个黑客,我在秒杀开始时写好了脚本,运行一万个线程获取秒杀地址,这样是不是也不公平呢?
+
+**我:** 我考虑到了这方面,于是我**自己写了个LRU缓存(划重点,这么多好用的缓存我为啥不用偏要自己写?就是为了让面试官上钩问我是怎么写的,这样我就可以逼逼准备好的内容了!)**,用这个缓存存储请求的ip和用户名,一个ip和用户名只能同时透过3个请求。
+
+**面试官:** 那我可不可以创建一个ip代理池和很多用户来抢购呢?假设我有很多手机号的账户。
+
+**我:** 这就是在为难我胖虎啊,我说这种情况跟真实用户操作太像了。。。我没法区别,不过我觉得可以通过地理位置信息或者机器学习算法来做吧。。。
+
+**面试官:** 好的这个问题就到这吧,你接着说
+
+**我:**我把生成订单和减库存两条sql语句放在一个事务里,都操作成功了则认为秒杀成功。
+
+**面试官:** 等等,你这个订单表和商品库存表是在一个数据库的吧,那如果在不同的数据库中呢?
+
+**我:** 这面试官好变态啊,我只是个本科生?!?!我觉得应该要用分布式锁来实现吧。。。
+
+**面试官:** 有没有更轻量级的做法?
+
+**我:** 不知道了。后来查资料发现可以用消息队列来实现。使用消息队列主要能带来两个好处:(1) 通过异步处理提高系统性能(削峰、减少响应所需时间);(2) 降低系统耦合性。关于消息队列的更多内容可以查看这篇文章:
+
+后来发现消息队列作用好大,于是现在在学手写一个消息队列。
+
+**面试官:** 好的你接着说项目吧。
+
+**我:** 我考虑到了缓存雪崩问题,于是。。。
+
+**面试官:** 等等,你有没有考虑到一种情况,假如说你的缓存刚刚失效,大量流量就来查缓存,你的数据库会不会炸?
+
+**我:** 我不知道数据库会不会炸,反正我快炸了。当时说没考虑这么高的并发量,后来发现也是可以用消息队列来解决,对流量削峰填谷。
+
+**面试官:** 好项目聊(怼)完了,我们来说说别的,操作系统了解吧,你能说说NIO吗?
+
+**我:** NIO是。。。
+
+**面试官:** 那你知道NIO的系统调用有哪些吗,具体是怎么实现的?
+
+**我:** 当时复习NIO的时候就知道是咋回事,不知道咋实现。最近在补这方面的知识,可见NIO还是很重要的!
+
+**面试官:** 说说进程切换时操作系统都会发生什么?
+
+**我:** 不如杀了我,我最讨厌操作系统了。简单说了下,可能不对,需要答案自行百度。
+
+**面试官:** 说说线程池?
+
+**答:** 卧槽这我熟啊,把Java并发编程的艺术里讲的都说出来了,说了得有十分钟,自夸一波,毕竟这本书我看了五遍😂
+
+**面试官:** 好问问计网吧如果设计一个聊天系统,应该用TCP还是UDP?为什么
+
+**我:** 当然是TCP!原因如下:
+
+
+
+**面试官:** 好的,你有什么要问我的吗?
+
+**我:** 我还有下一次面试吗?
+
+**面试官:** 应该。应该有的,一周内吧。还告诉我居然转正前要实习三个月?wtf,一个大三满课的本科生让我如何在八月底前实习三个月?
+
+**我:** 面试官再见
+
+
+
+### 三面(46分钟)
+
+3.18号,三面来了,这次又是那个大大boss!
+
+第一步还是先自我介绍,这个就不多说了,提前准备好要说的重点就没问题!
+
+**面试官:** 聊聊你的项目?
+
+**我:** 经过二面的教训,我迅速学习了一下分布式的理论知识,并应用到了我的项目(吹牛逼)中。
+
+**面试官:** 看你用到了Spring的事务机制,你能说下Spring的事务传播吗?
+
+**我:** 完了这个问题好像没准备,虽然之前刷知乎看到过。。。我就只说出来一条,面试官说其实这个有很多机制的,比如事务嵌套,内事务回滚外事务回滚都会有不同情况,你可以回去看看。
+
+**面试官:** 说说你的分布式事务解决方案?
+
+**我:** 我叭叭的照着资料查到的解决方案说了一通,面试官怎么好像没大听懂???
+
+> 阿里巴巴之前开源了一个分布式 Fescar(一种易于使用,高性能,基于Java的开源分布式事务解决方案),后来,Ant Financial 加入Fescar,使其成为一个更加中立和开放的分布式交易社区,Fescar 重命名为Seata。Github 地址:
+
+**面试官:** 好,我们聊聊其他项目,说说你这个 MapReduce项目?MapReduce原理了解过吗?
+
+**我:** 我叭叭地说了一通,面试官好像觉得这个项目太简单了。要不是没项目,我会把我的实验写上吗???
+
+**面试官:** 你这个手写BP神经网络是干了啥?
+
+**我:** 这是我选修机器学习课程时的一个作业,我又对它进行了扩展。
+
+**面试官:** 你能说说为什么调整权值时要沿着梯度下降的方向?
+
+**我:** 老大,你太厉害了,怎么什么都懂。我压根没准备这个项目。。。没想到会问,做过去好几个月了,加上当时一紧张就忘了,后来想起来大概是....。
+
+**面试官:** 好我们问问基础知识吧,说说什么叫xisuo?
+
+**我:**???xisuo,您说什么,不好意思我没听清。(这面试官有点口音。。。)就是xisuo啊!xisuo你不知道吗?。。。尴尬了十几秒后我终于意识到,他在说死锁!!!
+
+**面试官:** 假如A账户给B账户转钱,会发生xisuo吗?能具体说说吗?
+
+**我:** 当时答的不好,后来发现面试官又是想问分布式,具体答案参考这个:
+
+**面试官:** 为什么不考研?
+
+**我:** 不喜欢学术氛围,巴拉巴拉。
+
+**面试官:** 你有什么问题吗?
+
+**我:** 我还有下一面吗。。。面试官说让我等,一周内答复。
+
+------
+
+等了十天,一度以为我凉了,内推人说我流程到HR了,让我等着吧可能HR太忙了,3.28号HR打来了电话,当时在教室,我直接飞了出去。
+
+### HR面
+
+**面试官:** 你好啊,先自我介绍下吧
+
+**我:** 巴拉巴拉....HR面的技术面试和技术面的还是有所区别的!
+
+面试官人特别好,一听就是很会说话的小姐姐!说我这里给你悄悄透露下,你的评级是 A 哦!
+
+
+
+接下来就是几个经典HR面挂人的问题,什么难给我来什么,我看别人的HR面怎么都是聊聊天。。。
+
+**面试官:** 你为什么选择支付宝呢,你怎么看待支付宝?
+
+**我:** 我从个人情怀,公司理念,环境氛围,市场价值,趋势导向分析了一波(说白了就是疯狂夸支付宝,不过说实话我说的那些一点都没撒谎,阿里确实做到了。比如我举了个雷军和格力打赌5年2000亿销售额,大部分企业家关注的是利益,而马云更关注的是真的为人类为世界做一些事情,利益不是第一位的。)
+
+**面试官:** 明白了解,那你的优点我们都很明了了,你能说说你的缺点吗?
+
+**我:** 据说这是HR面最难的一个问题。。。我当时翻了好几天的知乎才找到一个合适的,也符合我的答案:我有时候会表现的不太自信,比如阿里的内推二月份就开始了,其实我当时已经复习了很久了,但是老是觉得自己还不行,不敢投简历,于是又把书看了一遍才投的,当时也是舍友怂恿一波才投的,面了之后发现其实自己也没有很差。(划重点,一定要把自己的缺点圆回来)。
+
+**面试官:** HR好像不太满意我的答案,继续问我还有缺点吗?
+
+**我:** 我说比较容易紧张吧,举了自己大一面实验室因为紧张没进去的例子,后来不断调整心态,现在已经好很多了。
+
+接下来又是个好难的问题。
+
+**面试官:** BAT都给你offer了,你怎么选?
+
+其实我当时好想说,BT 是什么?不好意思我只知道阿里。
+
+**我 :** 哈哈哈哈开玩笑,就说了阿里的文化,支付宝给我们带来很多便利,想加入支付宝为人类做贡献!
+
+最后HR问了我实习时间,现在大几之类的问题,说肯定会给我发offer的,让我等着就好了,希望过两天能收到好的结果。
+
+
\ No newline at end of file
From a8d3111c1d4b3df4f0b3ba05de16a74e1c9fe484 Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Mon, 15 Apr 2019 12:46:54 +0800
Subject: [PATCH 052/903] =?UTF-8?q?Update=20=E8=9A=82=E8=9A=81=E9=87=91?=
=?UTF-8?q?=E6=9C=8D=E5=AE=9E=E4=B9=A0=E7=94=9F=E9=9D=A2=E7=BB=8F=E6=80=BB?=
=?UTF-8?q?=E7=BB=93(=E5=B7=B2=E6=8B=BF=E5=8F=A3=E5=A4=B4offer).md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...3(\345\267\262\346\213\277\345\217\243\345\244\264offer).md" | 2 ++
1 file changed, 2 insertions(+)
diff --git "a/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md" "b/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
index edc56de6273..02b483c19e6 100644
--- "a/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
+++ "b/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
@@ -1,3 +1,5 @@
+本文来自 Anonymous 的投稿,原文地址: 。
+
- [一面(37分钟左右)](#一面37分钟左右)
- [二面(33分钟左右)](#二面33分钟左右)
- [三面(46分钟)](#三面46分钟)
From 82e845cc259f01376c11f7f3fe1c79713fbe8025 Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Mon, 15 Apr 2019 12:50:14 +0800
Subject: [PATCH 053/903] Fix type
---
...3(\345\267\262\346\213\277\345\217\243\345\244\264offer).md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md" "b/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
index 02b483c19e6..7daf331ce06 100644
--- "a/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
+++ "b/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
@@ -102,7 +102,7 @@
**面试官:** 好的这个问题就到这吧,你接着说
-**我:**我把生成订单和减库存两条sql语句放在一个事务里,都操作成功了则认为秒杀成功。
+**我:** 我把生成订单和减库存两条sql语句放在一个事务里,都操作成功了则认为秒杀成功。
**面试官:** 等等,你这个订单表和商品库存表是在一个数据库的吧,那如果在不同的数据库中呢?
From 8a2856c865b800937a36525e9c885d38c3f91046 Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Mon, 15 Apr 2019 16:16:31 +0800
Subject: [PATCH 054/903] =?UTF-8?q?Update=20=E8=9A=82=E8=9A=81=E9=87=91?=
=?UTF-8?q?=E6=9C=8D=E5=AE=9E=E4=B9=A0=E7=94=9F=E9=9D=A2=E7=BB=8F=E6=80=BB?=
=?UTF-8?q?=E7=BB=93(=E5=B7=B2=E6=8B=BF=E5=8F=A3=E5=A4=B4offer).md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...\213\277\345\217\243\345\244\264offer).md" | 100 +++++++++---------
1 file changed, 52 insertions(+), 48 deletions(-)
diff --git "a/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md" "b/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
index 7daf331ce06..612c2df1bf2 100644
--- "a/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
+++ "b/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
@@ -1,13 +1,13 @@
本文来自 Anonymous 的投稿,原文地址: 。
-- [一面(37分钟左右)](#一面37分钟左右)
-- [二面(33分钟左右)](#二面33分钟左右)
-- [三面(46分钟)](#三面46分钟)
-- [HR面](#hr面)
+- [一面 (37 分钟左右)](#一面 37 分钟左右)
+- [二面 (33 分钟左右)](#二面 33 分钟左右)
+- [三面 (46 分钟)](#三面 46 分钟)
+- [HR 面 ](#hr 面)
-### 一面(37分钟左右)
+### 一面 (37 分钟左右)
-一面是上海的小哥打来的,3.12号中午确认的内推,下午就打来约时间了,也是唯一一个约时间的面试官。约的晚上八点。紧张的一比,人生第一次面试就献给了阿里。
+一面是上海的小哥打来的,3.12 号中午确认的内推,下午就打来约时间了,也是唯一一个约时间的面试官。约的晚上八点。紧张的一比,人生第一次面试就献给了阿里。
幸运的是一面的小哥特温柔。好像是个海归?口语中夹杂着英文。废话不多说,上干货:
@@ -15,7 +15,7 @@
**我:** 巴拉巴拉...。
-> 关于自我介绍:从HR面、技术面到高管面/部门主管面,面试官一般会让你先自我介绍一下,所以好好准备自己的自我介绍真的非常重要。网上一般建议的是准备好两份自我介绍:一份对HR说的,主要讲能突出自己的经历,会的编程技术一语带过;另一份对技术面试官说的,主要讲自己会的技术细节,项目经验,经历那些就一语带过。
+> 关于自我介绍:从 HR 面、技术面到高管面/部门主管面,面试官一般会让你先自我介绍一下,所以好好准备自己的自我介绍真的非常重要。网上一般建议的是准备好两份自我介绍:一份对 HR 说的,主要讲能突出自己的经历,会的编程技术一语带过;另一份对技术面试官说的,主要讲自己会的技术细节,项目经验,经历那些就一语带过。
**面试官:** 我看你简历上写你做了个秒杀系统?我们就从这个项目开始吧,先介绍下你的项目。
@@ -24,11 +24,11 @@
> 1. 对项目整体设计的一个感受(面试官可能会让你画系统的架构图)
> 2. 在这个项目中你负责了什么、做了什么、担任了什么角色
> 3. 从这个项目中你学会了那些东西,使用到了那些技术,学会了那些新技术的使用
-> 4. 另外项目描述中,最好可以体现自己的综合素质,比如你是如何协调项目组成员协同开发的或者在遇到某一个棘手的问题的时候你是如何解决的又或者说你在这个项目用了什么技术实现了什么功能比如:用redis做缓存提高访问速度和并发量、使用消息队列削峰和降流等等。
+> 4. 另外项目描述中,最好可以体现自己的综合素质,比如你是如何协调项目组成员协同开发的或者在遇到某一个棘手的问题的时候你是如何解决的又或者说你在这个项目用了什么技术实现了什么功能比如:用 redis 做缓存提高访问速度和并发量、使用消息队列削峰和降流等等。
-**我:** 我说了我是如何考虑它的需求(秒杀地址隐藏,记录订单,减库存),一开始简单的用sycHRonized锁住方法,出现了问题,后来乐观锁改进,又有瓶颈,再上缓存,出现了缓存雪崩,于是缓存预热,错开缓存失效时间。最后,发现先记录订单再减库存会减少行级锁等待时间。
+**我:** 我说了我是如何考虑它的需求(秒杀地址隐藏,记录订单,减库存),一开始简单的用 synchronized 锁住方法,出现了问题,后来乐观锁改进,又有瓶颈,再上缓存,出现了缓存雪崩,于是缓存预热,错开缓存失效时间。最后,发现先记录订单再减库存会减少行级锁等待时间。
-> 一面面试官很耐心地听,并给了我一些指导,问了我乐观锁是怎么实现的,我说是基于sql语句,在减库存操作的where条件里加剩余库存数>0,他说这应该不算是一种乐观锁,应该先查库存,在减库存的时候判断当前库存是否与读到的库存一样(可这样不是多一次查询操作吗?不是很理解,不过我没有反驳,只是说理解您的意思。事实证明千万别怼面试官,即使你觉得他说的不对)
+> 一面面试官很耐心地听,并给了我一些指导,问了我乐观锁是怎么实现的,我说是基于 sql 语句,在减库存操作的 where 条件里加剩余库存数>0,他说这应该不算是一种乐观锁,应该先查库存,在减库存的时候判断当前库存是否与读到的库存一样(可这样不是多一次查询操作吗?不是很理解,不过我没有反驳,只是说理解您的意思。事实证明千万别怼面试官,即使你觉得他说的不对)
**面试官:** 我缓存雪崩什么情况下会发生?如何避免?
@@ -36,9 +36,9 @@
**面试官:** 问我更新数据库的同时为什么不马上更新缓存,而是删除缓存?
-**我:** 因为考虑到更新数据库后更新缓存可能会因为多线程下导致写入脏数据(比如线程A先更新数据库成功,接下来要取更新缓存,接着线程B更新数据库,但B又更新了缓存,接着B的时间片用完了,线程A更新了缓存)
+**我:** 因为考虑到更新数据库后更新缓存可能会因为多线程下导致写入脏数据(比如线程 A 先更新数据库成功,接下来要取更新缓存,接着线程 B 更新数据库,但 B 又更新了缓存,接着 B 的时间片用完了,线程 A 更新了缓存)
-逼逼了将近30分钟,面试官居然用周杰伦的语气对我说:
+逼逼了将近 30 分钟,面试官居然用周杰伦的语气对我说:

@@ -54,15 +54,15 @@
**面试官:** 等等,你说索引是吧,那你能说下索引的存储数据结构吗?
-**我:** 我心想这简单啊,我就说B+树,还说了为什么用B+树
+**我:** 我心想这简单啊,我就说 B+树,还说了为什么用 B+树
-**面试官:** 你简历上写的这个J.U.C包是什么啊?(他居然不知道JUC)
+**面试官:** 你简历上写的这个 J.U.C 包是什么啊?(他居然不知道 JUC)
-**我:** 就是java多线程的那个包啊。。。
+**我:** 就是 java 多线程的那个包啊。。。
**面试官:** 那你都了解里面的哪些东西呢?
-**我:** 哈哈哈!这可是我的强项,从ConcurrentHashMap,ConcurrentLinkedQueue说到CountDownLatch,CyclicBarrier,又说到线程池,分别说了底层实现和项目中的应用。
+**我:** 哈哈哈!这可是我的强项,从 ConcurrentHashMap,ConcurrentLinkedQueue 说到 CountDownLatch,CyclicBarrier,又说到线程池,分别说了底层实现和项目中的应用。
**面试官:** 我觉得差不多了,那我再问个与技术无关的问题哈,虽然这个问题可能不应该我问,就是你是如何考虑你的项目架构的呢?
@@ -74,13 +74,13 @@
**总结:** 一面可能是简历面吧,问的比较简单,我在讲项目中说出了我做项目时的学习历程和思考,赢得了面试官的好感,感觉他应该给我的评价很好。
-### 二面(33分钟左右)
+### 二面 (33 分钟左右)
-然而开心了没一会,内推人问我面的怎么样啊?看我流程已经到大大boss那了。我一听二面不是主管吗???怎么直接跳了一面。于是瞬间慌了,赶紧(下床)学习准备二面。
+然而开心了没一会,内推人问我面的怎么样啊?看我流程已经到大大 boss 那了。我一听二面不是主管吗???怎么直接跳了一面。于是瞬间慌了,赶紧(下床)学习准备二面。
-隔了一天,3.14的早上10:56分,杭州的大大boss给我打来了电话,卧槽我当时在上毛概课,万恶的毛概课每节课都点名,我还在最后一排不敢跑出去。于是接起电话来怂怂地说不好意思我在上课,晚上可以面试吗?大大boss看来很忙啊,跟我说晚上没时间啊,再说吧!
+隔了一天,3.14 的早上 10:56 分,杭州的大大 boss 给我打来了电话,卧槽我当时在上毛概课,万恶的毛概课每节课都点名,我还在最后一排不敢跑出去。于是接起电话来怂怂地说不好意思我在上课,晚上可以面试吗?大大 boss 看来很忙啊,跟我说晚上没时间啊,再说吧!
-于是又隔了一天,3.16中午我收到了北京的电话,当时心里小失望,我的大大boss呢???接起电话来,就是一番狂轰乱炸。。。
+于是又隔了一天,3.16 中午我收到了北京的电话,当时心里小失望,我的大大 boss 呢???接起电话来,就是一番狂轰乱炸。。。
第一步还是先自我介绍,这个就不多说了,提前准备好要说的重点就没问题!
@@ -94,15 +94,15 @@
**面试官:** 那比如说啊,我现在是个黑客,我在秒杀开始时写好了脚本,运行一万个线程获取秒杀地址,这样是不是也不公平呢?
-**我:** 我考虑到了这方面,于是我**自己写了个LRU缓存(划重点,这么多好用的缓存我为啥不用偏要自己写?就是为了让面试官上钩问我是怎么写的,这样我就可以逼逼准备好的内容了!)**,用这个缓存存储请求的ip和用户名,一个ip和用户名只能同时透过3个请求。
+**我:** 我考虑到了这方面,于是我自己写了个 LRU 缓存(划重点,这么多好用的缓存我为啥不用偏要自己写?就是为了让面试官上钩问我是怎么写的,这样我就可以逼逼准备好的内容了!),用这个缓存存储请求的 ip 和用户名,一个 ip 和用户名只能同时透过 3 个请求。
-**面试官:** 那我可不可以创建一个ip代理池和很多用户来抢购呢?假设我有很多手机号的账户。
+**面试官:** 那我可不可以创建一个 ip 代理池和很多用户来抢购呢?假设我有很多手机号的账户。
**我:** 这就是在为难我胖虎啊,我说这种情况跟真实用户操作太像了。。。我没法区别,不过我觉得可以通过地理位置信息或者机器学习算法来做吧。。。
**面试官:** 好的这个问题就到这吧,你接着说
-**我:** 我把生成订单和减库存两条sql语句放在一个事务里,都操作成功了则认为秒杀成功。
+**我:** 我把生成订单和减库存两条 sql 语句放在一个事务里,都操作成功了则认为秒杀成功。
**面试官:** 等等,你这个订单表和商品库存表是在一个数据库的吧,那如果在不同的数据库中呢?
@@ -122,13 +122,13 @@
**我:** 我不知道数据库会不会炸,反正我快炸了。当时说没考虑这么高的并发量,后来发现也是可以用消息队列来解决,对流量削峰填谷。
-**面试官:** 好项目聊(怼)完了,我们来说说别的,操作系统了解吧,你能说说NIO吗?
+**面试官:** 好项目聊(怼)完了,我们来说说别的,操作系统了解吧,你能说说 NIO 吗?
-**我:** NIO是。。。
+**我:** NIO 是。。。
-**面试官:** 那你知道NIO的系统调用有哪些吗,具体是怎么实现的?
+**面试官:** 那你知道 NIO 的系统调用有哪些吗,具体是怎么实现的?
-**我:** 当时复习NIO的时候就知道是咋回事,不知道咋实现。最近在补这方面的知识,可见NIO还是很重要的!
+**我:** 当时复习 NIO 的时候就知道是咋回事,不知道咋实现。最近在补这方面的知识,可见 NIO 还是很重要的!
**面试官:** 说说进程切换时操作系统都会发生什么?
@@ -136,11 +136,11 @@
**面试官:** 说说线程池?
-**答:** 卧槽这我熟啊,把Java并发编程的艺术里讲的都说出来了,说了得有十分钟,自夸一波,毕竟这本书我看了五遍😂
+**答:** 卧槽这我熟啊,把 Java 并发编程的艺术里讲的都说出来了,说了得有十分钟,自夸一波,毕竟这本书我看了五遍😂
-**面试官:** 好问问计网吧如果设计一个聊天系统,应该用TCP还是UDP?为什么
+**面试官:** 好问问计网吧如果设计一个聊天系统,应该用 TCP 还是 UDP?为什么
-**我:** 当然是TCP!原因如下:
+**我:** 当然是 TCP!原因如下:

@@ -154,9 +154,9 @@

-### 三面(46分钟)
+### 三面 (46 分钟)
-3.18号,三面来了,这次又是那个大大boss!
+3.18 号,三面来了,这次又是那个大大 boss!
第一步还是先自我介绍,这个就不多说了,提前准备好要说的重点就没问题!
@@ -164,7 +164,7 @@
**我:** 经过二面的教训,我迅速学习了一下分布式的理论知识,并应用到了我的项目(吹牛逼)中。
-**面试官:** 看你用到了Spring的事务机制,你能说下Spring的事务传播吗?
+**面试官:** 看你用到了 Spring 的事务机制,你能说下 Spring 的事务传播吗?
**我:** 完了这个问题好像没准备,虽然之前刷知乎看到过。。。我就只说出来一条,面试官说其实这个有很多机制的,比如事务嵌套,内事务回滚外事务回滚都会有不同情况,你可以回去看看。
@@ -172,13 +172,13 @@
**我:** 我叭叭的照着资料查到的解决方案说了一通,面试官怎么好像没大听懂???
-> 阿里巴巴之前开源了一个分布式 Fescar(一种易于使用,高性能,基于Java的开源分布式事务解决方案),后来,Ant Financial 加入Fescar,使其成为一个更加中立和开放的分布式交易社区,Fescar 重命名为Seata。Github 地址:
+> 阿里巴巴之前开源了一个分布式 Fescar(一种易于使用,高性能,基于 Java 的开源分布式事务解决方案),后来,Ant Financial 加入 Fescar,使其成为一个更加中立和开放的分布式交易社区,Fescar 重命名为 Seata。Github 地址:
-**面试官:** 好,我们聊聊其他项目,说说你这个 MapReduce项目?MapReduce原理了解过吗?
+**面试官:** 好,我们聊聊其他项目,说说你这个 MapReduce 项目?MapReduce 原理了解过吗?
**我:** 我叭叭地说了一通,面试官好像觉得这个项目太简单了。要不是没项目,我会把我的实验写上吗???
-**面试官:** 你这个手写BP神经网络是干了啥?
+**面试官:** 你这个手写 BP 神经网络是干了啥?
**我:** 这是我选修机器学习课程时的一个作业,我又对它进行了扩展。
@@ -186,11 +186,11 @@
**我:** 老大,你太厉害了,怎么什么都懂。我压根没准备这个项目。。。没想到会问,做过去好几个月了,加上当时一紧张就忘了,后来想起来大概是....。
-**面试官:** 好我们问问基础知识吧,说说什么叫xisuo?
+**面试官:** 好我们问问基础知识吧,说说什么叫 xisuo?
-**我:**???xisuo,您说什么,不好意思我没听清。(这面试官有点口音。。。)就是xisuo啊!xisuo你不知道吗?。。。尴尬了十几秒后我终于意识到,他在说死锁!!!
+**我:**???xisuo,您说什么,不好意思我没听清。(这面试官有点口音。。。)就是 xisuo 啊!xisuo 你不知道吗?。。。尴尬了十几秒后我终于意识到,他在说死锁!!!
-**面试官:** 假如A账户给B账户转钱,会发生xisuo吗?能具体说说吗?
+**面试官:** 假如 A 账户给 B 账户转钱,会发生 xisuo 吗?能具体说说吗?
**我:** 当时答的不好,后来发现面试官又是想问分布式,具体答案参考这个:
@@ -204,40 +204,44 @@
------
-等了十天,一度以为我凉了,内推人说我流程到HR了,让我等着吧可能HR太忙了,3.28号HR打来了电话,当时在教室,我直接飞了出去。
+等了十天,一度以为我凉了,内推人说我流程到 HR 了,让我等着吧可能 HR 太忙了,3.28 号 HR 打来了电话,当时在教室,我直接飞了出去。
-### HR面
+### HR 面
**面试官:** 你好啊,先自我介绍下吧
-**我:** 巴拉巴拉....HR面的技术面试和技术面的还是有所区别的!
+**我:** 巴拉巴拉....HR 面的技术面试和技术面的还是有所区别的!
面试官人特别好,一听就是很会说话的小姐姐!说我这里给你悄悄透露下,你的评级是 A 哦!

-接下来就是几个经典HR面挂人的问题,什么难给我来什么,我看别人的HR面怎么都是聊聊天。。。
+接下来就是几个经典 HR 面挂人的问题,什么难给我来什么,我看别人的 HR 面怎么都是聊聊天。。。
**面试官:** 你为什么选择支付宝呢,你怎么看待支付宝?
-**我:** 我从个人情怀,公司理念,环境氛围,市场价值,趋势导向分析了一波(说白了就是疯狂夸支付宝,不过说实话我说的那些一点都没撒谎,阿里确实做到了。比如我举了个雷军和格力打赌5年2000亿销售额,大部分企业家关注的是利益,而马云更关注的是真的为人类为世界做一些事情,利益不是第一位的。)
+**我:** 我从个人情怀,公司理念,环境氛围,市场价值,趋势导向分析了一波(说白了就是疯狂夸支付宝,不过说实话我说的那些一点都没撒谎,阿里确实做到了。比如我举了个雷军和格力打赌 5 年 2000 亿销售额,大部分企业家关注的是利益,而马云更关注的是真的为人类为世界做一些事情,利益不是第一位的。)
**面试官:** 明白了解,那你的优点我们都很明了了,你能说说你的缺点吗?
-**我:** 据说这是HR面最难的一个问题。。。我当时翻了好几天的知乎才找到一个合适的,也符合我的答案:我有时候会表现的不太自信,比如阿里的内推二月份就开始了,其实我当时已经复习了很久了,但是老是觉得自己还不行,不敢投简历,于是又把书看了一遍才投的,当时也是舍友怂恿一波才投的,面了之后发现其实自己也没有很差。(划重点,一定要把自己的缺点圆回来)。
+> 缺点肯定不能是目标岗位需要的关键能力!!!
+>
+> 总之,记住一点,面试官问你这个问题的话,你可以说一些不影响你这个职位工作需要的一些缺点。比如你面试后端工程师,面试官问你的缺点是什么的话,你可以这样说:自己比较内向,平时不太爱与人交流,但是考虑到以后可能要和客户沟通,自己正在努力改。
+
+**我:** 据说这是 HR 面最难的一个问题。。。我当时翻了好几天的知乎才找到一个合适的,也符合我的答案:我有时候会表现的不太自信,比如阿里的内推二月份就开始了,其实我当时已经复习了很久了,但是老是觉得自己还不行,不敢投简历,于是又把书看了一遍才投的,当时也是舍友怂恿一波才投的,面了之后发现其实自己也没有很差。(划重点,一定要把自己的缺点圆回来)。
-**面试官:** HR好像不太满意我的答案,继续问我还有缺点吗?
+**面试官:** HR 好像不太满意我的答案,继续问我还有缺点吗?
**我:** 我说比较容易紧张吧,举了自己大一面实验室因为紧张没进去的例子,后来不断调整心态,现在已经好很多了。
接下来又是个好难的问题。
-**面试官:** BAT都给你offer了,你怎么选?
+**面试官:** BAT 都给你 offer 了,你怎么选?
其实我当时好想说,BT 是什么?不好意思我只知道阿里。
**我 :** 哈哈哈哈开玩笑,就说了阿里的文化,支付宝给我们带来很多便利,想加入支付宝为人类做贡献!
-最后HR问了我实习时间,现在大几之类的问题,说肯定会给我发offer的,让我等着就好了,希望过两天能收到好的结果。
+最后 HR 问了我实习时间,现在大几之类的问题,说肯定会给我发 offer 的,让我等着就好了,希望过两天能收到好的结果。

\ No newline at end of file
From 0b9767574db9a8dced4d1181e1aa9af8e6dd57c4 Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Mon, 15 Apr 2019 16:24:48 +0800
Subject: [PATCH 055/903] =?UTF-8?q?Update=20=E8=9A=82=E8=9A=81=E9=87=91?=
=?UTF-8?q?=E6=9C=8D=E5=AE=9E=E4=B9=A0=E7=94=9F=E9=9D=A2=E7=BB=8F=E6=80=BB?=
=?UTF-8?q?=E7=BB=93(=E5=B7=B2=E6=8B=BF=E5=8F=A3=E5=A4=B4offer).md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...2\346\213\277\345\217\243\345\244\264offer).md" | 14 +++++++++-----
1 file changed, 9 insertions(+), 5 deletions(-)
diff --git "a/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md" "b/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
index 612c2df1bf2..24e071624a3 100644
--- "a/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
+++ "b/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
@@ -1,9 +1,13 @@
本文来自 Anonymous 的投稿,原文地址: 。
-- [一面 (37 分钟左右)](#一面 37 分钟左右)
-- [二面 (33 分钟左右)](#二面 33 分钟左右)
-- [三面 (46 分钟)](#三面 46 分钟)
-- [HR 面 ](#hr 面)
+
+
+- [一面 (37 分钟左右)](#一面-37-分钟左右)
+- [二面 (33 分钟左右)](#二面-33-分钟左右)
+- [三面 (46 分钟)](#三面-46-分钟)
+- [HR 面](#hr-面)
+
+
### 一面 (37 分钟左右)
@@ -244,4 +248,4 @@
最后 HR 问了我实习时间,现在大几之类的问题,说肯定会给我发 offer 的,让我等着就好了,希望过两天能收到好的结果。
-
\ No newline at end of file
+
From c5b4495f11b6e9bed9866b76b66d2677d962371d Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Mon, 15 Apr 2019 16:28:15 +0800
Subject: [PATCH 056/903] Update content
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
增加蚂蚁金服2019实习生面经总结(已拿口头offer)
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 63ca1b59ce7..cac3659f5bc 100644
--- a/README.md
+++ b/README.md
@@ -212,6 +212,7 @@ Java后端技术交流群(限工作一年及以上,架构视频免费领取)
### 面经
- [5面阿里,终获offer(2018年秋招)](docs/essential-content-for-interview/BATJrealInterviewExperience/5面阿里,终获offer.md)
+- [蚂蚁金服2019实习生面经总结(已拿口头offer)](docs/essential-content-for-interview/BATJrealInterviewExperience/蚂蚁金服实习生面经总结(已拿口头offer).md)
## 工具
From 78bb739f7260ecde162a9dd4a7ebe7fdd2277fa4 Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Mon, 15 Apr 2019 17:02:45 +0800
Subject: [PATCH 057/903] =?UTF-8?q?Update=20=E8=9A=82=E8=9A=81=E9=87=91?=
=?UTF-8?q?=E6=9C=8D=E5=AE=9E=E4=B9=A0=E7=94=9F=E9=9D=A2=E7=BB=8F=E6=80=BB?=
=?UTF-8?q?=E7=BB=93(=E5=B7=B2=E6=8B=BF=E5=8F=A3=E5=A4=B4offer).md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...3(\345\267\262\346\213\277\345\217\243\345\244\264offer).md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md" "b/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
index 612c2df1bf2..aff0da7ce6d 100644
--- "a/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
+++ "b/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
@@ -1,4 +1,4 @@
-本文来自 Anonymous 的投稿,原文地址: 。
+本文来自 Anonymous 的投稿,原文地址: ,JavaGuide 对原文进行了重新排版和一点完善。
- [一面 (37 分钟左右)](#一面 37 分钟左右)
- [二面 (33 分钟左右)](#二面 33 分钟左右)
From 18b13cfc8ff9499d1e6b8fd7eb6227ea8e095734 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=9D=B3=E9=98=B3?= <260893248@qq.com>
Date: Tue, 16 Apr 2019 13:21:12 +0800
Subject: [PATCH 058/903] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E4=B8=80=E5=A4=84?=
=?UTF-8?q?=E6=8B=BC=E5=86=99=E9=94=99=E8=AF=AF+=E4=BF=AE=E5=A4=8D?=
=?UTF-8?q?=E4=B8=80=E4=B8=AA=E9=81=97=E6=BC=8F=E6=9D=A1=E7=9B=AE?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
修复一处拼写错误+修复一个遗漏条目
---
docs/java/Basis/Arrays,CollectionsCommonMethods.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/java/Basis/Arrays,CollectionsCommonMethods.md b/docs/java/Basis/Arrays,CollectionsCommonMethods.md
index f3b97c5eb40..b08df836790 100644
--- a/docs/java/Basis/Arrays,CollectionsCommonMethods.md
+++ b/docs/java/Basis/Arrays,CollectionsCommonMethods.md
@@ -142,7 +142,7 @@ boolean replaceAll(List list, Object oldVal, Object newVal), 用新元素替换
### 同步控制
-Collectons提供了多个`synchronizedXxx()`方法·,该方法可以将指定集合包装成线程同步的集合,从而解决多线程并发访问集合时的线程安全问题。
+Collections提供了多个`synchronizedXxx()`方法·,该方法可以将指定集合包装成线程同步的集合,从而解决多线程并发访问集合时的线程安全问题。
我们知道 HashSet,TreeSet,ArrayList,LinkedList,HashMap,TreeMap 都是线程不安全的。Collections提供了多个静态方法可以把他们包装成线程同步的集合。
@@ -224,7 +224,7 @@ unmodifiableXxx(): 返回指定集合对象的不可变视图,此处的集合
4. 填充 : `fill()`
5. 转列表: `asList()`
6. 转字符串 : `toString()`
-7.
+7. 复制: `copyOf()`
### 排序 : `sort()`
From 29028809cb4d172fa86d0c7dd2353ed47e63174c Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Tue, 16 Apr 2019 18:23:22 +0800
Subject: [PATCH 059/903] =?UTF-8?q?Update=20Java=E5=9F=BA=E7=A1=80?=
=?UTF-8?q?=E7=9F=A5=E8=AF=86.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...72\347\241\200\347\237\245\350\257\206.md" | 23 +++++++++++++------
1 file changed, 16 insertions(+), 7 deletions(-)
diff --git "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md"
index c7d57e342ca..835f9c71e66 100644
--- "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md"
+++ "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md"
@@ -50,7 +50,7 @@
- [33 Java序列化中如果有些字段不想进行序列化 怎么办](#33-java序列化中如果有些字段不想进行序列化-怎么办)
- [34 获取用键盘输入常用的的两种方法](#34-获取用键盘输入常用的的两种方法)
- [参考](#参考)
-
+- [公众号](#公众号)
@@ -233,7 +233,7 @@ String 中的对象是不可变的,也就可以理解为常量,线程安全
由于静态方法可以不通过对象进行调用,因此在静态方法里,不能调用其他非静态变量,也不可以访问非静态变量成员。
## 15. 在 Java 中定义一个不做事且没有参数的构造方法的作用
- Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。
+Java 程序在执行子类的构造方法之前,如果没有用 super() 来调用父类特定的构造方法,则会调用父类中“没有参数的构造方法”。因此,如果父类中只定义了有参数的构造方法,而在子类的构造方法中又没有用 super() 来调用父类中特定的构造方法,则编译时将发生错误,因为 Java 程序在父类中找不到没有参数的构造方法可供执行。解决办法是在父类里加上一个不做事且没有参数的构造方法。
## 16. import java和javax有什么区别?
@@ -338,12 +338,9 @@ hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返
### 为什么要有 hashCode
+**我们先以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:** 当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 `equals()`方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head first java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。
-**我们以“HashSet 如何检查重复”为例子来说明为什么要有 hashCode:**
-
-当你把对象加入 HashSet 时,HashSet 会先计算对象的 hashcode 值来判断对象加入的位置,同时也会与其他已经加入的对象的 hashcode 值作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现。但是如果发现有相同 hashcode 值的对象,这时会调用 equals()方法来检查 hashcode 相等的对象是否真的相同。如果两者相同,HashSet 就不会让其加入操作成功。如果不同的话,就会重新散列到其他位置。(摘自我的Java启蒙书《Head first java》第二版)。这样我们就大大减少了 equals 的次数,相应就大大提高了执行速度。
-
-
+通过我们可以看出:`hashCode()` 的作用就是**获取哈希码**,也称为散列码;它实际上是返回一个int整数。这个**哈希码的作用**是确定该对象在哈希表中的索引位置。**`hashCode() `在散列表中才有用,在其它情况下没用。**在散列表中hashCode() 的作用是获取对象的散列码,进而确定该对象在散列表中的位置。
### hashCode()与equals()的相关规定
@@ -353,6 +350,8 @@ hashCode() 的作用是获取哈希码,也称为散列码;它实际上是返
4. **因此,equals 方法被覆盖过,则 hashCode 方法也必须被覆盖**
5. hashCode() 的默认行为是对堆上的对象产生独特值。如果没有重写 hashCode(),则该 class 的两个对象无论如何都不会相等(即使这两个对象指向相同的数据)
+推荐阅读:[Java hashCode() 和 equals()的若干问题解答](https://www.cnblogs.com/skywang12345/p/3324958.html)
+
## 28. 为什么Java中只有值传递?
@@ -473,3 +472,13 @@ String s = input.readLine();
- https://stackoverflow.com/questions/1906445/what-is-the-difference-between-jdk-and-jre
- https://www.educba.com/oracle-vs-openjdk/
- https://stackoverflow.com/questions/22358071/differences-between-oracle-jdk-and-openjdk?answertab=active#tab-top
+
+## 公众号
+
+如果大家想要实时关注我更新的文章以及分享的干货的话,可以关注我的公众号。
+
+**《Java面试突击》:** 由本文档衍生的专为面试而生的《Java面试突击》V2.0 PDF 版本[公众号](#公众号)后台回复 **"Java面试突击"** 即可免费领取!
+
+**Java工程师必备学习资源:** 一些Java工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。
+
+
\ No newline at end of file
From 32456ca43e057686499cd439fd97c72b3204edf8 Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Tue, 16 Apr 2019 18:33:37 +0800
Subject: [PATCH 060/903] Fix link error
---
docs/system-design/framework/ZooKeeper.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/docs/system-design/framework/ZooKeeper.md b/docs/system-design/framework/ZooKeeper.md
index fa6d2b6568f..aa97a456e77 100644
--- a/docs/system-design/framework/ZooKeeper.md
+++ b/docs/system-design/framework/ZooKeeper.md
@@ -165,8 +165,8 @@ ZAB协议包括两种基本的模式,分别是 **崩溃恢复和消息广播**
关于 **ZAB 协议&Paxos算法** 需要讲和理解的东西太多了,说实话,笔主到现在不太清楚这俩兄弟的具体原理和实现过程。推荐阅读下面两篇文章:
-- [图解 Paxos 一致性协议](http://blog.xiaohansong.com/2016/09/30/Paxos/)
-- [Zookeeper ZAB 协议分析](http://blog.xiaohansong.com/2016/08/25/zab/)
+- [图解 Paxos 一致性协议](http://codemacro.com/2014/10/15/explain-poxos/)
+- [Zookeeper ZAB 协议分析](https://dbaplus.cn/news-141-1875-1.html)
关于如何使用 zookeeper 实现分布式锁,可以查看下面这篇文章:
From ce9c4417cbfa8168c341a6f15dba2e7e11c816d2 Mon Sep 17 00:00:00 2001
From: lancelot
Date: Tue, 16 Apr 2019 21:29:50 +0800
Subject: [PATCH 061/903] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E9=94=99=E8=AF=AF?=
=?UTF-8?q?=E5=B9=B6=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3=E7=A0=81?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../Basis/Arrays,CollectionsCommonMethods.md | 44 ++++++++++---------
1 file changed, 23 insertions(+), 21 deletions(-)
diff --git a/docs/java/Basis/Arrays,CollectionsCommonMethods.md b/docs/java/Basis/Arrays,CollectionsCommonMethods.md
index f3b97c5eb40..d49f3ce9fbc 100644
--- a/docs/java/Basis/Arrays,CollectionsCommonMethods.md
+++ b/docs/java/Basis/Arrays,CollectionsCommonMethods.md
@@ -54,12 +54,12 @@ void rotate(List list, int distance)//旋转。当distance为正数时,将list
Collections.reverse(arrayList);
System.out.println("Collections.reverse(arrayList):");
System.out.println(arrayList);
-
-
+
+
Collections.rotate(arrayList, 4);
System.out.println("Collections.rotate(arrayList, 4):");
System.out.println(arrayList);
-
+
// void sort(List list),按自然排序的升序排序
Collections.sort(arrayList);
System.out.println("Collections.sort(arrayList):");
@@ -69,7 +69,7 @@ void rotate(List list, int distance)//旋转。当distance为正数时,将list
Collections.shuffle(arrayList);
System.out.println("Collections.shuffle(arrayList):");
System.out.println(arrayList);
-
+
// void swap(List list, int i , int j),交换两个索引位置的元素
Collections.swap(arrayList, 2, 5);
System.out.println("Collections.swap(arrayList, 2, 5):");
@@ -93,7 +93,7 @@ void rotate(List list, int distance)//旋转。当distance为正数时,将list
int binarySearch(List list, Object key)//对List进行二分查找,返回索引,注意List必须是有序的
int max(Collection coll)//根据元素的自然顺序,返回最大的元素。 类比int min(Collection coll)
int max(Collection coll, Comparator c)//根据定制排序,返回最大元素,排序规则由Comparatator类控制。类比int min(Collection coll, Comparator c)
-void fill(List list, Object obj)//用指定的元素代替指定list中的所有元素。
+void fill(List list, Object obj)//用指定的元素代替指定list中的所有元素。
int frequency(Collection c, Object o)//统计元素出现次数
int indexOfSubList(List list, List target)//统计target在list中第一次出现的索引,找不到则返回-1,类比int lastIndexOfSubList(List source, list target).
boolean replaceAll(List list, Object oldVal, Object newVal), 用新元素替换旧元素
@@ -152,9 +152,9 @@ Collectons提供了多个`synchronizedXxx()`方法·,该方法可以将指定
```java
synchronizedCollection(Collection c) //返回指定 collection 支持的同步(线程安全的)collection。
-synchronizedList(List list)//返回指定列表支持的同步(线程安全的)List。
+synchronizedList(List list)//返回指定列表支持的同步(线程安全的)List。
synchronizedMap(Map m) //返回由指定映射支持的同步(线程安全的)Map。
-synchronizedSet(Set s) //返回指定 set 支持的同步(线程安全的)set。
+synchronizedSet(Set s) //返回指定 set 支持的同步(线程安全的)set。
```
### Collections还可以设置不可变集合,提供了如下三类方法:
@@ -224,7 +224,7 @@ unmodifiableXxx(): 返回指定集合对象的不可变视图,此处的集合
4. 填充 : `fill()`
5. 转列表: `asList()`
6. 转字符串 : `toString()`
-7.
+7.
### 排序 : `sort()`
@@ -251,7 +251,7 @@ unmodifiableXxx(): 返回指定集合对象的不可变视图,此处的集合
System.out.println();
int c[] = { 1, 3, 2, 7, 6, 5, 4, 9 };
- // parallelSort(int[] a) 按照数字顺序排列指定的数组。同sort方法一样也有按范围的排序
+ // parallelSort(int[] a) 按照数字顺序排列指定的数组(并行的)。同sort方法一样也有按范围的排序
Arrays.parallelSort(c);
System.out.println("Arrays.parallelSort(c):");
for (int i : c) {
@@ -285,6 +285,9 @@ System.out.println(Arrays.toString(strs));//[abcdeag, abcdefg, abcdehg]
```java
// *************查找 binarySearch()****************
char[] e = { 'a', 'f', 'b', 'c', 'e', 'A', 'C', 'B' };
+ // 排序后再进行二分查找,否则找不到
+ Arrays.sort(e);
+ System.out.println("Arrays.sort(e)" + Arrays.toString(e));
System.out.println("Arrays.binarySearch(e, 'c'):");
int s = Arrays.binarySearch(e, 'c');
System.out.println("字符c在数组的位置:" + s);
@@ -293,12 +296,12 @@ System.out.println(Arrays.toString(strs));//[abcdeag, abcdefg, abcdehg]
### 比较: `equals()`
```java
- // *************比较 equals****************
- char[] e = { 'a', 'f', 'b', 'c', 'e', 'A', 'C', 'B' };
+ // *************比较 equals****************
+ char[] e = { 'a', 'f', 'b', 'c', 'e', 'A', 'C', 'B' };
char[] f = { 'a', 'f', 'b', 'c', 'e', 'A', 'C', 'B' };
/*
- * 元素数量相同,并且相同位置的元素相同。 另外,如果两个数组引用都是null,则它们被认为是相等的 。
- */
+ * 元素数量相同,并且相同位置的元素相同。 另外,如果两个数组引用都是null,则它们被认为是相等的 。
+ */
// 输出true
System.out.println("Arrays.equals(e, f):" + Arrays.equals(e, f));
```
@@ -345,12 +348,12 @@ System.out.println(Arrays.toString(strs));//[abcdeag, abcdefg, abcdehg]
### 转字符串 `toString()`
```java
- // *************转字符串 toString()****************
- /*
- * 返回指定数组的内容的字符串表示形式。
- */
- char[] k = { 'a', 'f', 'b', 'c', 'e', 'A', 'C', 'B' };
- System.out.println(Arrays.toString(k));// [a, f, b, c, e, A, C, B]
+ // *************转字符串 toString()****************
+ /*
+ * 返回指定数组的内容的字符串表示形式。
+ */
+ char[] k = { 'a', 'f', 'b', 'c', 'e', 'A', 'C', 'B' };
+ System.out.println(Arrays.toString(k));// [a, f, b, c, e, A, C, B]
```
### 复制 `copyOf()`
@@ -358,7 +361,7 @@ System.out.println(Arrays.toString(strs));//[abcdeag, abcdefg, abcdehg]
```java
// *************复制 copy****************
// copyOf 方法实现数组复制,h为数组,6为复制的长度
- int[] h = { 1, 2, 3, 3, 3, 3, 6, 6, 6, };
+ int[] h = { 1, 2, 3, 3, 3, 3, 6, 6, 6, };
int i[] = Arrays.copyOf(h, 6);
System.out.println("Arrays.copyOf(h, 6);:");
// 输出结果:123333
@@ -377,4 +380,3 @@ System.out.println(Arrays.toString(strs));//[abcdeag, abcdefg, abcdehg]
// 换行
System.out.println();
```
-
From b823e43ef5f00eeb2d93201fbc8727cc78ffc1a4 Mon Sep 17 00:00:00 2001
From: Fenmu <42839671+Fenmul@users.noreply.github.com>
Date: Wed, 17 Apr 2019 10:58:39 +0800
Subject: [PATCH 062/903] =?UTF-8?q?Update=20Java=E5=9F=BA=E7=A1=80?=
=?UTF-8?q?=E7=9F=A5=E8=AF=86.md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
修改了关于继承的知识点
「子类拥有父类对象所有的属性和方法(包括私有属性和私有方法)但是父类中的私有属性和方法子类是无法访问,只是拥有。」
---
.../Java\345\237\272\347\241\200\347\237\245\350\257\206.md" | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md" "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md"
index 835f9c71e66..7d57c0828e5 100644
--- "a/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md"
+++ "b/docs/java/Java\345\237\272\347\241\200\347\237\245\350\257\206.md"
@@ -176,7 +176,7 @@ JRE 是 Java运行时环境。它是运行已编译 Java 程序所需的所有
**关于继承如下 3 点请记住:**
-1. 子类拥有父类非 private 的属性和方法。
+1. 子类拥有父类对象所有的属性和方法(包括私有属性和私有方法),但是父类中的私有属性和方法子类是无法访问,**只是拥有**。
2. 子类可以拥有自己属性和方法,即子类可以对父类进行扩展。
3. 子类可以用自己的方式实现父类的方法。(以后介绍)。
@@ -481,4 +481,4 @@ String s = input.readLine();
**Java工程师必备学习资源:** 一些Java工程师常用学习资源公众号后台回复关键字 **“1”** 即可免费无套路获取。
-
\ No newline at end of file
+
From 96e07c8bab4fb8bdb8a5207e93447e9f7b083830 Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Wed, 17 Apr 2019 16:19:56 +0800
Subject: [PATCH 063/903] =?UTF-8?q?Update=20=E8=9A=82=E8=9A=81=E9=87=91?=
=?UTF-8?q?=E6=9C=8D=E5=AE=9E=E4=B9=A0=E7=94=9F=E9=9D=A2=E7=BB=8F=E6=80=BB?=
=?UTF-8?q?=E7=BB=93(=E5=B7=B2=E6=8B=BF=E5=8F=A3=E5=A4=B4offer).md?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
...3(\345\267\262\346\213\277\345\217\243\345\244\264offer).md" | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git "a/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md" "b/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
index 1a8b289b149..2e2df23b941 100644
--- "a/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
+++ "b/docs/essential-content-for-interview/BATJrealInterviewExperience/\350\232\202\350\232\201\351\207\221\346\234\215\345\256\236\344\271\240\347\224\237\351\235\242\347\273\217\346\200\273\347\273\223(\345\267\262\346\213\277\345\217\243\345\244\264offer).md"
@@ -1,4 +1,4 @@
-本文来自 Anonymous 的投稿,原文地址: ,JavaGuide 对原文进行了重新排版和一点完善。
+本文来自 Anonymous 的投稿 ,JavaGuide 对原文进行了重新排版和一点完善。
From 89413e979d47b82be3e47e9c208099dbd6e1413d Mon Sep 17 00:00:00 2001
From: SnailClimb
Date: Wed, 17 Apr 2019 20:06:59 +0800
Subject: [PATCH 064/903] Update README.md
---
README.md | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/README.md b/README.md
index cac3659f5bc..e10b4ecd11b 100644
--- a/README.md
+++ b/README.md
@@ -24,7 +24,7 @@ Java后端技术交流群(限工作一年及以上,架构视频免费领取)