Skip to content

Commit 503df1e

Browse files
committed
增加jvm、集合、redis面试题
1 parent 2898273 commit 503df1e

File tree

8 files changed

+2526
-267
lines changed

8 files changed

+2526
-267
lines changed

Java/JVM高频面试题.md

Lines changed: 796 additions & 0 deletions
Large diffs are not rendered by default.

Java/Java并发面试题.md

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1151,4 +1151,3 @@ public final void lazySet(int i, int newValue)//最终 将index=i 位置的元
11511151
- AtomicStampedReference:带有版本号的引用类型原子类。该类将整数值与引用关联起来,可用于解决原子的更新数据和数据的版本号,可以解决使用 CAS 进行原子更新时可能出现的 ABA 问题。
11521152
- AtomicMarkableReference :原子更新带有标记的引用类型。该类将 boolean 标记与引用关联起来
11531153

1154-

Java/Java集合面试题.md

Lines changed: 597 additions & 0 deletions
Large diffs are not rendered by default.

README.md

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@
5151

5252
## 容器
5353

54+
[Java集合高频面试题,牛客高赞!](Java/Java集合面试题.md)(必看 :+1:)
55+
5456
[Java常见容器总结](Java/集合.md)(必看 :+1:)
5557

5658
## 并发
@@ -61,6 +63,8 @@
6163

6264
## JVM
6365

66+
[JVM高频面试题](Java/JVM高频面试题.md)(必看 :+1:)
67+
6468
[一万多字!Java虚拟机总结](Java/JVM.md)(必看 :+1:)
6569

6670
# 数据库
@@ -73,9 +77,10 @@
7377

7478
## Redis
7579

76-
1. [Redis基础](中间件/Redis入门指南总结.md)(必看 :+1:)
77-
2. [Redis分布式锁(必看 :+1:)](中间件/Redis分布式锁.md)
78-
3. [缓存穿透、缓存雪崩、缓存击穿](中间件/缓存穿透、缓存雪崩、缓存击穿.md)
80+
1. [面试八股文——Redis30问](中间件/Redis面试题.md)(必看 :+1:)
81+
2. [Redis基础](中间件/Redis入门指南总结.md)(必看 :+1:)
82+
3. [Redis分布式锁(必看 :+1:)](中间件/Redis分布式锁.md)
83+
4. [缓存穿透、缓存雪崩、缓存击穿](中间件/缓存穿透、缓存雪崩、缓存击穿.md)
7984

8085
# 框架
8186

中间件/Redis面试题.md

Lines changed: 632 additions & 0 deletions
Large diffs are not rendered by default.

数据库/MySQL高频面试题.md

Lines changed: 94 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<!-- START doctoc generated TOC please keep comment here to allow auto update -->
22
<!-- DON'T EDIT THIS SECTION, INSTEAD RE-RUN doctoc TO UPDATE -->
33

4+
45
- [事务的四大特性?](#%E4%BA%8B%E5%8A%A1%E7%9A%84%E5%9B%9B%E5%A4%A7%E7%89%B9%E6%80%A7)
56
- [数据库的三大范式](#%E6%95%B0%E6%8D%AE%E5%BA%93%E7%9A%84%E4%B8%89%E5%A4%A7%E8%8C%83%E5%BC%8F)
67
- [事务隔离级别有哪些?](#%E4%BA%8B%E5%8A%A1%E9%9A%94%E7%A6%BB%E7%BA%A7%E5%88%AB%E6%9C%89%E5%93%AA%E4%BA%9B)
@@ -222,18 +223,18 @@ Index_comment:
222223

223224
### 索引有什么分类?
224225

225-
1. 主键索引:名为primary的唯一非空索引,不允许有空值。
226+
1主键索引:名为primary的唯一非空索引,不允许有空值。
226227

227-
2. 唯一索引:索引列中的值必须是唯一的,但是允许为空值。唯一索引和主键索引的区别是:UNIQUE 约束的列可以为null且可以存在多个null值。UNIQUE KEY的用途:唯一标识数据库表中的每条记录,主要是用来防止数据重复插入。创建唯一索引的SQL语句如下:
228+
2唯一索引:索引列中的值必须是唯一的,但是允许为空值。唯一索引和主键索引的区别是:UNIQUE 约束的列可以为null且可以存在多个null值。UNIQUE KEY的用途:唯一标识数据库表中的每条记录,主要是用来防止数据重复插入。创建唯一索引的SQL语句如下:
228229

229-
```mysql
230-
ALTER TABLE table_name
231-
ADD CONSTRAINT constraint_name UNIQUE KEY(column_1,column_2,...);
232-
```
230+
```mysql
231+
ALTER TABLE table_name
232+
ADD CONSTRAINT constraint_name UNIQUE KEY(column_1,column_2,...);
233+
```
233234

234-
3. 组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀原则。
235+
3组合索引:在表中的多个字段组合上创建的索引,只有在查询条件中使用了这些字段的左边字段时,索引才会被使用,使用组合索引时遵循最左前缀原则。
235236

236-
4. 全文索引:只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引。
237+
4全文索引:只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT类型字段上使用全文索引。
237238

238239
### 什么是最左匹配原则?
239240

@@ -411,19 +412,19 @@ MVCC 的实现依赖于版本链,版本链是通过表的三个隐藏字段实
411412

412413
下面举个例子方便大家理解。
413414

414-
1. 初始数据如下,其中DB_ROW_ID和DB_ROLL_PTR为空。
415+
1初始数据如下,其中DB_ROW_ID和DB_ROLL_PTR为空。
415416

416-
![](https://gitee.com/tysondai/img/raw/master/mvcc2.png)
417+
![](https://gitee.com/tysondai/img/raw/master/mvcc2.png)
417418

418-
2. 事务A对该行数据做了修改,将age修改为12,效果如下:
419+
2事务A对该行数据做了修改,将age修改为12,效果如下:
419420

420-
![](https://gitee.com/tysondai/img/raw/master/mvcc7.png)
421+
![](https://gitee.com/tysondai/img/raw/master/mvcc7.png)
421422

422-
3. 之后事务B也对该行记录做了修改,将age修改为8,效果如下:
423+
3之后事务B也对该行记录做了修改,将age修改为8,效果如下:
423424

424-
![](https://gitee.com/tysondai/img/raw/master/mvcc11.png)
425+
![](https://gitee.com/tysondai/img/raw/master/mvcc11.png)
425426

426-
4. 此时undo log有两行记录,并且通过回滚指针连在一起。
427+
4此时undo log有两行记录,并且通过回滚指针连在一起。
427428

428429
**接下来了解下read view的概念。**
429430

@@ -464,27 +465,27 @@ MVCC 的实现依赖于版本链,版本链是通过表的三个隐藏字段实
464465

465466
下面举个例子说明下:
466467

467-
1. 首先,user表只有两条记录,具体如下:
468+
1首先,user表只有两条记录,具体如下:
468469

469-
![](https://gitee.com/tysondai/img/raw/master/image-20210922232259664.png)
470+
![](https://gitee.com/tysondai/img/raw/master/image-20210922232259664.png)
470471

471-
2. 事务a和事务b同时开启事务`start transaction`
472+
2事务a和事务b同时开启事务`start transaction`
472473

473-
3. 事务a插入数据然后提交;
474+
3事务a插入数据然后提交;
474475

475-
```mysql
476-
insert into user(user_name, user_password, user_mail, user_state) values('tyson', 'a', 'a', 0);
477-
```
476+
```mysql
477+
insert into user(user_name, user_password, user_mail, user_state) values('tyson', 'a', 'a', 0);
478+
```
478479

479-
4. 事务b执行全表的update;
480+
4事务b执行全表的update;
480481

481-
```mysql
482-
update user set user_name = 'a';
483-
```
482+
```mysql
483+
update user set user_name = 'a';
484+
```
484485

485-
5. 事务b然后执行查询,查到了事务a中插入的数据。(下图左边是事务b,右边是事务a)
486+
5事务b然后执行查询,查到了事务a中插入的数据。(下图左边是事务b,右边是事务a)
486487

487-
![](https://gitee.com/tysondai/img/raw/master/幻读1.png)
488+
![](https://gitee.com/tysondai/img/raw/master/幻读1.png)
488489

489490
以上就是当前读出现的幻读现象。
490491

@@ -621,67 +622,71 @@ MySQL主要分为 Server 层和存储引擎层:
621622

622623
## 分区表类型
623624

624-
1. 按照范围分区。
625-
626-
```mysql
627-
CREATE TABLE test_range_partition(
628-
id INT auto_increment,
629-
createdate DATETIME,
630-
primary key (id,createdate)
631-
)
632-
PARTITION BY RANGE (TO_DAYS(createdate) ) (
633-
PARTITION p201801 VALUES LESS THAN ( TO_DAYS('20180201') ),
634-
PARTITION p201802 VALUES LESS THAN ( TO_DAYS('20180301') ),
635-
PARTITION p201803 VALUES LESS THAN ( TO_DAYS('20180401') ),
636-
PARTITION p201804 VALUES LESS THAN ( TO_DAYS('20180501') ),
637-
PARTITION p201805 VALUES LESS THAN ( TO_DAYS('20180601') ),
638-
PARTITION p201806 VALUES LESS THAN ( TO_DAYS('20180701') ),
639-
PARTITION p201807 VALUES LESS THAN ( TO_DAYS('20180801') ),
640-
PARTITION p201808 VALUES LESS THAN ( TO_DAYS('20180901') ),
641-
PARTITION p201809 VALUES LESS THAN ( TO_DAYS('20181001') ),
642-
PARTITION p201810 VALUES LESS THAN ( TO_DAYS('20181101') ),
643-
PARTITION p201811 VALUES LESS THAN ( TO_DAYS('20181201') ),
644-
PARTITION p201812 VALUES LESS THAN ( TO_DAYS('20190101') )
645-
);
646-
```
647-
648-
`/var/lib/mysql/data/`可以找到对应的数据文件,每个分区表都有一个使用#分隔命名的表文件:
649-
650-
```
651-
-rw-r----- 1 MySQL MySQL 65 Mar 14 21:47 db.opt
652-
-rw-r----- 1 MySQL MySQL 8598 Mar 14 21:50 test_range_partition.frm
653-
-rw-r----- 1 MySQL MySQL 98304 Mar 14 21:50 test_range_partition#P#p201801.ibd
654-
-rw-r----- 1 MySQL MySQL 98304 Mar 14 21:50 test_range_partition#P#p201802.ibd
655-
-rw-r----- 1 MySQL MySQL 98304 Mar 14 21:50 test_range_partition#P#p201803.ibd
656-
...
657-
```
658-
659-
2. list分区。对于List分区,分区字段必须是已知的,如果插入的字段不在分区时枚举值中,将无法插入。
660-
661-
```mysql
662-
create table test_list_partiotion
663-
(
664-
id int auto_increment,
665-
data_type tinyint,
666-
primary key(id,data_type)
667-
)partition by list(data_type)
668-
(
669-
partition p0 values in (0,1,2,3,4,5,6),
670-
partition p1 values in (7,8,9,10,11,12),
671-
partition p2 values in (13,14,15,16,17)
672-
);
673-
```
674-
675-
3. hash分区,可以将数据均匀地分布到预先定义的分区中。
676-
677-
```mysql
678-
create table test_hash_partiotion
679-
(
680-
id int auto_increment,
681-
create_date datetime,
682-
primary key(id,create_date)
683-
)partition by hash(year(create_date)) partitions 10;
684-
```
625+
**按照范围分区。**
626+
627+
```java
628+
CREATE TABLE test_range_partition(
629+
id INT auto_increment,
630+
createdate DATETIME,
631+
primary key (id,createdate)
632+
)
633+
PARTITION BY RANGE (TO_DAYS(createdate) ) (
634+
PARTITION p201801 VALUES LESS THAN ( TO_DAYS('20180201') ),
635+
PARTITION p201802 VALUES LESS THAN ( TO_DAYS('20180301') ),
636+
PARTITION p201803 VALUES LESS THAN ( TO_DAYS('20180401') ),
637+
PARTITION p201804 VALUES LESS THAN ( TO_DAYS('20180501') ),
638+
PARTITION p201805 VALUES LESS THAN ( TO_DAYS('20180601') ),
639+
PARTITION p201806 VALUES LESS THAN ( TO_DAYS('20180701') ),
640+
PARTITION p201807 VALUES LESS THAN ( TO_DAYS('20180801') ),
641+
PARTITION p201808 VALUES LESS THAN ( TO_DAYS('20180901') ),
642+
PARTITION p201809 VALUES LESS THAN ( TO_DAYS('20181001') ),
643+
PARTITION p201810 VALUES LESS THAN ( TO_DAYS('20181101') ),
644+
PARTITION p201811 VALUES LESS THAN ( TO_DAYS('20181201') ),
645+
PARTITION p201812 VALUES LESS THAN ( TO_DAYS('20190101') )
646+
);
647+
```
648+
649+
`/var/lib/mysql/data/`可以找到对应的数据文件,每个分区表都有一个使用#分隔命名的表文件:
650+
651+
```java
652+
-rw-r----- 1 MySQL MySQL 65 Mar 14 21:47 db.opt
653+
-rw-r----- 1 MySQL MySQL 8598 Mar 14 21:50 test_range_partition.frm
654+
-rw-r----- 1 MySQL MySQL 98304 Mar 14 21:50 test_range_partition#P#p201801.ibd
655+
-rw-r----- 1 MySQL MySQL 98304 Mar 14 21:50 test_range_partition#P#p201802.ibd
656+
-rw-r----- 1 MySQL MySQL 98304 Mar 14 21:50 test_range_partition#P#p201803.ibd
657+
...
658+
```
659+
660+
**list分区**
661+
662+
对于List分区,分区字段必须是已知的,如果插入的字段不在分区时枚举值中,将无法插入。
663+
664+
```java
665+
create table test_list_partiotion
666+
(
667+
id int auto_increment,
668+
data_type tinyint,
669+
primary key(id,data_type)
670+
)partition by list(data_type)
671+
(
672+
partition p0 values in (0,1,2,3,4,5,6),
673+
partition p1 values in (7,8,9,10,11,12),
674+
partition p2 values in (13,14,15,16,17)
675+
);
676+
```
677+
678+
**hash分区**
679+
680+
可以将数据均匀地分布到预先定义的分区中。
681+
682+
```java
683+
create table test_hash_partiotion
684+
(
685+
id int auto_increment,
686+
create_date datetime,
687+
primary key(id,create_date)
688+
)partition by hash(year(create_date)) partitions 10;
689+
```
685690

686691
## 分区的问题?
687692

0 commit comments

Comments
 (0)