MindMap

JMM

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
mindmap
root((JMM<br/>Java Memory Model))
本质
并发访问共享变量的规则
不是JVM物理内存分区
解决线程间可见性与有序性问题
核心目标
原子性
可见性
有序性
抽象模型
主内存
存共享变量
工作内存
每个线程私有副本
线程先读副本再写回主内存
问题来源
缓存不一致
指令重排
并发交错执行
关键机制
volatile
保证可见性
禁止部分指令重排
不能保证复合操作原子性
synchronized
保证原子性
保证可见性
保证有序性
final
构造完成后安全发布
对final字段有特殊可见性保障
Happens-Before
程序次序规则
锁规则
volatile规则
start规则
join规则
传递性
重排序
编译器优化
CPU乱序执行
单线程遵守as-if-serial
多线程可能出问题
经典场景
volatile标志位
DCL单例
i++线程不安全

JUC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
mindmap
root((JUC<br/>Java Util Concurrent))
本质
Java并发编程工具箱
高层并发组件
覆盖任务执行 锁 容器 协作 异步
包结构
java.util.concurrent
java.util.concurrent.locks
java.util.concurrent.atomic
任务执行
Executor
ExecutorService
ScheduledExecutorService
ThreadPoolExecutor
Future
锁体系
Lock
ReentrantLock
ReadWriteLock
ReentrantReadWriteLock
Condition
底层支撑
AQS
LockSupport
CAS
volatile
原子类
AtomicInteger
AtomicLong
AtomicReference
AtomicStampedReference
LongAdder
并发容器
ConcurrentHashMap
ConcurrentLinkedQueue
CopyOnWriteArrayList
ConcurrentSkipListMap
ConcurrentSkipListSet
阻塞队列
BlockingQueue
ArrayBlockingQueue
LinkedBlockingQueue
PriorityBlockingQueue
SynchronousQueue
同步器
CountDownLatch
Semaphore
CyclicBarrier
Phaser
异步与并行
ForkJoinPool
ForkJoinTask
CompletableFuture
CompletionStage
面试主线
线程池参数与拒绝策略
AQS原理
CAS与ABA
ConcurrentHashMap
BlockingQueue生产者消费者
CountDownLatch与CyclicBarrier区别
CompletableFuture链式编排

设计模式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
mindmap
root((设计模式 Design Patterns))
设计目标
提高可维护性
提高可复用性
提高可扩展性
降低耦合
提升沟通效率

设计原则
SOLID
SRP["单一职责原则 SRP
一个类只做一类事"]
OCP["开闭原则 OCP
对扩展开放 对修改关闭"]
LSP["里氏替换原则 LSP
子类可替换父类"]
ISP["接口隔离原则 ISP
接口要小而专"]
DIP["依赖倒置原则 DIP
面向抽象编程"]
其他原则
CARP["合成复用原则
多用组合 少用继承"]
LoD["迪米特法则
只和直接朋友通信"]

分类
创建型模式
核心["关注对象怎么创建"]
简单工厂
工厂方法
抽象工厂
单例
建造者
原型
结构型模式
核心["关注类和对象如何组合"]
适配器
代理
装饰器
外观
桥接
组合
享元
行为型模式
核心["关注对象如何协作和分配职责"]
观察者
责任链
策略
状态
模板方法
命令
迭代器
中介者
备忘录
访问者
解释器

创建型高频
工厂模式家族
简单工厂
优点["创建逻辑集中"]
缺点["新增产品要改工厂
违反开闭原则"]
工厂方法
优点["扩展新产品更方便
符合开闭原则"]
缺点["类数量增加"]
抽象工厂
核心["创建一整套产品族"]
优点["同一风格产品统一切换"]
缺点["新增产品等级结构困难"]
单例模式
核心["一个类只有一个实例"]
写法
饿汉式
懒汉式
同步方法懒汉式
DCL["双重检查锁 DCL"]
静态内部类["推荐"]
枚举单例["推荐"]
关注点
线程安全
懒加载
防反射破坏
防反序列化破坏

结构型高频
适配器模式
核心["接口不兼容时做转换"]
角色
Target["目标接口"]
Adaptee["被适配者"]
Adapter["适配器"]
实现
类适配器["继承实现"]
对象适配器["组合实现 更推荐"]
代理模式
核心["控制对目标对象的访问"]
作用
权限控制
日志
事务
延迟加载
远程调用
Java实现
静态代理
JDK动态代理
CGLIB代理
装饰器模式
核心["不改原类前提下动态增强功能"]
对比代理
装饰器更强调功能增强
代理更强调控制访问

行为型高频
观察者模式
核心["一对多通知机制"]
适用
事件发布订阅
消息通知
状态变化广播
责任链模式
核心["多个处理器串成链逐个处理"]
适用
过滤器链
拦截器链
审批流
策略模式
核心["封装可替换算法"]
优点
消除大量 if else
算法可自由切换
符合开闭原则
适用
支付方式
促销计算
负载均衡
状态模式
核心["状态不同 行为不同"]
适用
订单状态流转
工作流状态机
对比策略
策略["重点在算法替换"]
状态["重点在状态驱动行为变化"]

面试回答主线
第一步["先说属于哪一类模式"]
第二步["再说解决什么问题"]
第三步["讲核心角色和结构"]
第四步["补优缺点"]
第五步["结合框架或项目举例"]

框架里的影子
Spring
工厂["BeanFactory"]
代理["AOP 事务"]
观察者["事件机制"]
JDK
单例["Runtime"]
工厂["Calendar getInstance"]
迭代器["Iterator"]
Netty
责任链["Pipeline"]
Dubbo
代理
装饰器
策略
责任链

API

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
mindmap
root((Java 刷题常用 API))
输入输出
BufferedReader
readLine
配合StringTokenizer快读
StringTokenizer
nextToken
hasMoreTokens
Scanner
nextInt
next
nextLine
写法简单
大数据较慢
System.out
println
print

基本常量与包装类
Integer
MAX_VALUE
MIN_VALUE
parseInt
valueOf
compare
bitCount
Long
MAX_VALUE
MIN_VALUE
parseLong
compare
Double
compare
Character
isDigit
isLetter
toLowerCase
toUpperCase
Boolean
parseBoolean

Math与数值
Math
max
min
abs
sqrt
pow
ceil
floor
round
random
BigInteger
超大整数
BigDecimal
少数题会用
精度控制
常见意识
初始化最大最小值
注意int溢出转long

数组 Arrays
常用操作
length
二维数组
clone
Arrays工具类
sort
binarySearch
fill
copyOf
equals
compare
toString
deepToString
高频场景
排序
二分
初始化
拷贝

字符串 String
基本操作
length
charAt
substring
indexOf
lastIndexOf
startsWith
endsWith
contains
转换
toCharArray
valueOf
split
替换与比较
replace
replaceAll
equals
compareTo
高频注意
不可变
拼接多时少用加号

可变字符串
StringBuilder
append
insert
delete
deleteCharAt
reverse
setCharAt
charAt
length
toString
StringBuffer
线程安全
刷题少用

List与动态数组
ArrayList
add
get
set
remove
size
isEmpty
contains
常见用法
存答案
邻接表
二维List
注意
remove重载
按下标与按对象区别

哈希结构
HashMap
put
get
getOrDefault
containsKey
remove
putIfAbsent
computeIfAbsent
merge
keySet
values
entrySet
HashSet
add
contains
remove
高频场景
计数
去重
前缀和
图与映射
易忘好用
getOrDefault
computeIfAbsent
merge

有序结构
TreeMap
put
get
floorKey
ceilingKey
lowerKey
higherKey
firstKey
lastKey
TreeSet
add
contains
floor
ceiling
lower
higher
适用
有序去重
最近值
区间问题

队列栈双端队列
ArrayDeque
addLast
pollLast
peekLast
addFirst
pollFirst
peekFirst
push
pop
Queue接口
offer
poll
peek
常见用途
单调栈
单调队列
BFS
普通栈
注意
Stack老旧
刷题优先ArrayDeque

优先队列堆
PriorityQueue
offer
poll
peek
size
isEmpty
默认
小根堆
自定义比较器
大根堆
按数组某列排序
高频场景
TopK
贪心
Dijkstra

链表与节点
LinkedList
addFirst
addLast
pollFirst
pollLast
刷题定位
能用
但队列栈更推荐ArrayDeque
自定义ListNode
next
val

排序与比较器
Arrays.sort
基本类型数组
二维数组加比较器
Collections.sort
List排序
Comparator
comparingInt
comparingLong
reversed
Comparable
自然排序
常见写法
lambda比较器
多关键字排序

位运算
运算符


异或
取反
左移
右移
无符号右移
Integer位工具
bitCount
highestOneBit
lowestOneBit
numberOfLeadingZeros
numberOfTrailingZeros
高频场景
状压
判奇偶
lowbit

其他常用
Collections
reverse
swap
max
min
frequency
Objects
equals
hash
System
arraycopy
currentTimeMillis
StringTokenizer加BufferedReader
ACM快读模板核心

数据结构总览
数组
int
long
char
字符串
String
StringBuilder
哈希
HashMap
HashSet
有序
TreeMap
TreeSet
线性表
ArrayList
栈队列
ArrayDeque

PriorityQueue

最该记住
Math.max min abs
Integer.MAX_VALUE MIN_VALUE
Long.MAX_VALUE MIN_VALUE
Arrays.sort fill binarySearch
HashMap.getOrDefault
HashMap.computeIfAbsent
HashMap.merge
ArrayDeque做栈和队列
PriorityQueue默认小根堆
StringBuilder处理拼接

Spring

SpringMVC

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
mindmap
root((SpringMVC))
核心定位
Web层框架
基于Servlet
处理请求与响应
属于Spring生态

核心目标
请求分发
参数绑定
返回响应
视图解析
统一异常处理

核心组件
DispatcherServlet
前端控制器
统一接收请求
统一调度流程
HandlerMapping
查找处理器
根据请求路径匹配方法
HandlerAdapter
适配调用处理器
屏蔽不同Handler差异
Controller
编写业务入口
接收参数返回结果
ViewResolver
解析视图名
定位页面资源
View
页面渲染
输出响应
Interceptor
前后置拦截
登录校验
日志统计
ExceptionResolver
统一异常处理

请求处理流程
用户发送请求
DispatcherServlet接收
HandlerMapping找Controller方法
HandlerAdapter执行目标方法
Controller处理业务
返回结果
结果分流
返回视图名
ViewResolver解析
View渲染页面
返回数据
HttpMessageConverter转换
输出Json或Xml
响应给客户端

常用注解
Controller
返回视图
RestController
返回数据
等于Controller加ResponseBody
RequestMapping
通用映射
GetMapping
PostMapping
PutMapping
DeleteMapping
RequestParam
接收请求参数
PathVariable
接收路径参数
RequestBody
接收Json请求体
ResponseBody
返回Json数据
RequestHeader
取请求头
CookieValue
取Cookie

参数绑定
基本类型
包装类型
数组
集合
JavaBean
日期类型
Json对象
文件上传
常见来源
请求参数
路径变量
请求头
请求体

返回值处理
String
视图名
ModelAndView
模型加视图
对象
转Json
List
转Json数组
ResponseEntity
自定义状态码响应头响应体
void
直接操作response

域对象与数据传递
Model
ModelMap
Map
ModelAndView
作用域
request
session
application

视图体系
JSP
Thymeleaf
重定向
redirect
转发
forward
前后端分离
多数直接返回Json

拦截器
作用
登录校验
权限控制
日志埋点
性能统计
方法
preHandle
postHandle
afterCompletion
对比Filter
Filter属于Servlet规范
Interceptor属于SpringMVC

异常处理
ExceptionHandler
局部异常处理
ControllerAdvice
全局异常处理
HandlerExceptionResolver
底层异常解析机制

数据转换
HttpMessageConverter
Json转换
字符串转换
表单数据转换
类型转换器
Converter
Formatter

上传下载
MultipartFile
单文件上传
多文件上传
文件下载
设置响应头
输出文件流

高频面试点
DispatcherServlet作用
HandlerMapping和HandlerAdapter作用
Controller和RestController区别
RequestParam和RequestBody区别
转发和重定向区别
Filter和Interceptor区别
SpringMVC执行流程
Json返回底层是谁做转换

与SpringBoot关系
SpringBoot自动配置SpringMVC
内嵌Tomcat
默认消息转换器
默认静态资源映射
开发更省配置

注解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
mindmap
root((SpringMVC 常用注解))
控制器
Controller
返回视图
RestController
返回Json
等于Controller加ResponseBody

请求映射
RequestMapping
类上做模块前缀
方法上做接口映射
GetMapping
PostMapping
PutMapping
DeleteMapping
PatchMapping

参数获取
RequestParam
接收查询参数
适合name=xx
PathVariable
接收路径参数
适合user或id这类路径值
RequestBody
接收Json请求体
RequestHeader
取请求头
CookieValue
取Cookie
ModelAttribute
表单对象绑定

返回响应
ResponseBody
返回Json
ResponseStatus
指定响应状态码

结果传递
RequestAttribute
取request域数据
SessionAttribute
取session域数据

异常处理
ExceptionHandler
当前类异常处理
ControllerAdvice
全局增强
RestControllerAdvice
全局异常加Json返回

数据绑定
InitBinder
自定义参数绑定
DateTimeFormat
时间格式转换
Valid
参数校验
Validated
分组校验

跨域与会话
CrossOrigin
允许跨域
SessionAttributes
往session存模型数据

高频组合
前后端分离
RestController
GetMapping
PostMapping
RequestBody
传统页面
Controller
RequestMapping
全局异常
RestControllerAdvice
ExceptionHandler

Spring

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
mindmap
root((Spring 常用注解))
组件注册
Component
通用组件
Service
业务层
Repository
持久层
Controller
控制层
Scope
singleton
prototype
request
session
Lazy
懒加载

依赖注入
Autowired
按类型注入
Qualifier
指定Bean名称
Resource
先按名称再按类型
Value
注入普通值
读取配置

配置类
Configuration
配置类
Bean
注册第三方Bean
方法名默认Bean名
ComponentScan
扫描组件
PropertySource
加载配置文件
Import
导入配置类
导入组件
ImportResource
导入xml配置

生命周期
PostConstruct
初始化后执行
PreDestroy
销毁前执行
DependsOn
指定先初始化谁

AOP相关
Aspect
切面类
Pointcut
切点
Before
前置通知
After
后置通知
AfterReturning
返回后通知
AfterThrowing
异常后通知
Around
环绕通知
EnableAspectJAutoProxy
开启AOP

事务
Transactional
开启事务
作用在类
作用在方法
EnableTransactionManagement
开启事务管理

异步与定时
EnableAsync
开启异步
Async
异步方法
EnableScheduling
开启定时任务
Scheduled
fixedRate
fixedDelay
cron

缓存
EnableCaching
开启缓存
Cacheable
查缓存
CachePut
更新缓存
CacheEvict
删除缓存

环境与配置读取
ConfigurationProperties
批量绑定配置
EnableConfigurationProperties
开启配置绑定
Profile
环境切换
Primary
默认优先Bean

常见组合
注册Bean
Component
Configuration
Bean
注入Bean
Autowired
Resource
Qualifier
配置读取
Value
ConfigurationProperties
横切增强
Aspect
Transactional
Async
Cacheable

高频记忆
Component负责注册
Autowired负责注入
Bean负责第三方对象
Configuration负责配置类
Transactional负责事务
Aspect负责切面
Value负责单个配置
ConfigurationProperties负责批量配置