本書通過探討Java開發(fā)工作中常會(huì)遇到的問題及相關(guān)解決方案,介紹了涉及字符串、數(shù)字、數(shù)組、集合、數(shù)據(jù)結(jié)構(gòu)、日期和時(shí)間、對(duì)象、不可變性、Switch表達(dá)式、類型推斷、Java I/O、Java反射、函數(shù)式編程、并發(fā)、HTTP Client API和Websocket等方面的核心知識(shí)與實(shí)用技巧。
這些簡單或復(fù)雜的問題,將幫助你提升解決現(xiàn)實(shí)問題的編程能力,使你了解相關(guān)問題基于Java 8~12的最佳實(shí)踐,同時(shí)還可以檢測你對(duì)相關(guān)技術(shù)的掌握程度。
本書可供初級(jí)和中級(jí)Java開發(fā)人員參考,同樣也適合正為相關(guān)技術(shù)面試做準(zhǔn)備的求職者閱讀。
第1章 字符串、數(shù)字和數(shù)學(xué) 1
問題 1
解決方案 2
1.統(tǒng)計(jì)重復(fù)字符的數(shù)量 3
2.尋找第一個(gè)非重復(fù)字符 5
3.反轉(zhuǎn)字母和單詞 7
4.檢查字符串是否僅包含數(shù)字 7
5.統(tǒng)計(jì)元音和輔音的數(shù)量 8
6.統(tǒng)計(jì)某個(gè)特定字符的出現(xiàn)次數(shù) 10
7.將String轉(zhuǎn)換為int、long、float或double類型 11
8.去除字符串中的空格 12
9.用分隔符連接多個(gè)字符串 12
10.生成全部排列組合 13
11.檢查字符串是否為回文 15
12.刪除重復(fù)的字符 16
13.刪除給定的字符 17
14.找到出現(xiàn)次數(shù)最多的字符 19
15.按長度對(duì)字符串?dāng)?shù)組排序 20
16.檢查字符串是否包含子串 22
17.計(jì)算字符串中子串的出現(xiàn)次數(shù) 22
18.判斷兩個(gè)字符串是否互為變位詞 23
19.聲明多行字符串(文本塊) 24
20.重復(fù)拼接同一個(gè)字符串n次 25
21.刪除首尾空格 27
22.尋找最長公共前綴 27
23.應(yīng)用縮進(jìn) 28
24.字符串轉(zhuǎn)換 30
25.求最小值與最大值 30
26.求兩個(gè)大數(shù)之和(int/long)并處理運(yùn)算溢出的情況 31
27.解析特定進(jìn)制下的無符號(hào)數(shù) 32
28.通過無符號(hào)轉(zhuǎn)換轉(zhuǎn)變數(shù)字 33
29.比較兩個(gè)無符號(hào)數(shù) 33
30.無符號(hào)數(shù)的除法和取模 34
31.判斷float/double是否為有限浮點(diǎn)數(shù) 34
32.對(duì)兩個(gè)布爾表達(dá)式執(zhí)行邏輯AND / OR / XOR運(yùn)算 35
33.將BigInteger轉(zhuǎn)換為基本類型 36
34.將long類型轉(zhuǎn)換為int類型 37
35.計(jì)算取整除和模數(shù) 37
36.相鄰浮點(diǎn)數(shù) 38
37.求兩個(gè)大數(shù)的乘積(int/long)并處理運(yùn)算溢出的情況 39
38.融合乘加(FMA) 40
39.緊湊數(shù)字格式化 41
小結(jié) 44
第2章 對(duì)象、不可變性和Switch表達(dá)式 45
問題 45
解決方案 46
40.用函數(shù)式和命令式風(fēng)格的代碼檢查空引用 46
41.檢查空引用并拋出自定義的NullPointerException異常 48
42.檢查空引用并拋出指定的異常 50
43.檢查空引用并返回非空默認(rèn)引用 51
44.檢查索引是否在[0, length)范圍內(nèi) 52
45.檢查子區(qū)間是否在[0, length)范圍內(nèi) 54
46. equals()和hashCode() 55
47.簡述不可變對(duì)象 59
48.不可變字符串 59
49.編寫一個(gè)不可變類 62
50.在不可變類中傳遞/返回可變對(duì)象 63
51.使用建造者模式編寫不可變類 65
52.避免在不可變對(duì)象中出現(xiàn)錯(cuò)誤數(shù)據(jù) 68
53.克隆對(duì)象 69
54.重寫toString() 73
55.新版Switch表達(dá)式 75
56.多個(gè)case標(biāo)簽 77
57.語句塊 77
小結(jié) 78
第3章 處理日期和時(shí)間 79
問題 79
解決方案 80
58.字符串與日期時(shí)間的轉(zhuǎn)換 80
59.格式化日期和時(shí)間 83
60.獲取當(dāng)前日期/時(shí)間(不含時(shí)間/日期) 86
61.基于LocalDate和LocalTime構(gòu)建LocalDateTime 86
62.通過Instant類獲取機(jī)器時(shí)間 86
63.使用基于日期的值(Period)定義時(shí)間段;使用基于時(shí)間的值(Duration)表示一小段時(shí)間 89
64.提取日期和時(shí)間單位 93
65.加減日期時(shí)間 94
66.獲取所有時(shí)區(qū)的UTC和GMT 95
67.獲取所有可用時(shí)區(qū)的本地日期時(shí)間 96
68.顯示有關(guān)航班的日期時(shí)間信息 97
69.將Unix時(shí)間戳轉(zhuǎn)換為日期時(shí)間 99
70.查找某月的第一天/最后一天 99
71.定義/提取時(shí)區(qū)偏移 102
72.在Date和Temporal之間轉(zhuǎn)換 103
73.遍歷一段日期范圍 106
74.計(jì)算年齡 108
75.獲得一天的起始和結(jié)束時(shí)間 108
76.兩個(gè)日期之間的差異 111
77.實(shí)現(xiàn)一個(gè)國際象棋計(jì)時(shí)器 113
小結(jié) 116
第4章 類型推斷 117
問題 117
解決方案 118
78.簡單的var示例 118
79.使用var與基本類型 120
80.使用var和隱式類型轉(zhuǎn)換來提高代碼的可維護(hù)性 121
81.顯式向下轉(zhuǎn)型(downcast)應(yīng)避免使用var 122
82.在變量名沒有足夠的類型信息保障可讀性時(shí)應(yīng)避免使用var 123
83.結(jié)合LVTI和面向接口編程技術(shù) 124
84.結(jié)合LVTI和鉆石操作符 124
85.將數(shù)組賦值給var 125
86.在多變量聲明中使用LVTI 126
87. LVTI和變量作用域 127
88. LVTI和三元操作符 128
89. LVTI和for循環(huán) 129
90. LVTI和流 130
91.使用LVTI拆分嵌套/大型表達(dá)式鏈 130
92. LVTI和方法返回值及參數(shù)類型 131
93. LVTI和匿名類 132
94. LVTI可以是final變量或effectively final變量 132
95. LVTI和Lambda表達(dá)式 134
96. LVTI和空初始化器、實(shí)例變量以及catch塊變量 134
97. LVTI和泛型類型 135
98. LVTI、通配符、協(xié)變和逆變 136
小結(jié) 138
第5章 數(shù)組、集合和數(shù)據(jù)結(jié)構(gòu) 139
問題 139
解決方案 140
99.對(duì)數(shù)組進(jìn)行排序 140
100.查找數(shù)組元素 149
101.檢查兩個(gè)數(shù)組是否相等或不匹配 153
102.按字典序比較兩個(gè)數(shù)組 156
103.用數(shù)組創(chuàng)建流 158
104.計(jì)算數(shù)組的最小值、最大值和平均值 159
105.反轉(zhuǎn)數(shù)組 162
106.填充和設(shè)置數(shù)組 164
107.下一個(gè)更大的元素(NGE) 165
108.改變數(shù)組大小 166
109.創(chuàng)建不可修改/不可變的集合 167
110.映射默認(rèn)值 172
111.判斷Map中鍵是否存在或缺失 173
112.從Map中移除元素 177
113.替換Map條目 178
114.比較兩個(gè)Map 179
115.對(duì)Map進(jìn)行排序 180
116.復(fù)制HashMap 182
117.合并兩個(gè)Map 183
118.移除集合中所有符合謂詞條件的元素 184
119.將集合轉(zhuǎn)換為數(shù)組 186
120.使用列表篩選集合 187
121.替換列表元素 188
122.線程安全的集合、棧和隊(duì)列 189
123.廣度優(yōu)先搜索(BFS) 193
124.前綴樹(Trie) 195
125.元組(Tuple) 198
126.并查集 200
127.芬威克樹或二進(jìn)制索引樹 203
128.布隆過濾器 206
小結(jié) 209
第6章 Java I/O路徑、文件、緩存、掃描和格式化 210
問題 210
解決方案 211
129.創(chuàng)建文件路徑 211
130.變換文件路徑 214
131.拼接文件路徑 215
132.通過兩個(gè)路徑創(chuàng)建相對(duì)路徑 216
133.比較文件路徑 217
134.輪詢路徑 218
135.監(jiān)聽路徑 225
136.流式獲取文件文本內(nèi)容 228
137.在文件樹中搜索文件或文件夾 228
138.高效讀寫文本文件 230
139.高效讀寫二進(jìn)制文件 235
140.大文件搜索 239
141.將一個(gè)JSON/CSV文件作為一個(gè)對(duì)象讀取 241
142.處理臨時(shí)文件和文件夾 245
143.過濾文件 249
144.判斷兩個(gè)文件是否不匹配 252
145.循環(huán)字節(jié)緩沖區(qū) 254
146.標(biāo)記解析文件 259
147.將格式化輸出直接寫入文件 263
148.使用Scanner 265
小結(jié) 268
第7章 Java反射類、接口、構(gòu)造函數(shù)、方法和字段 269
問題 269
解決方案 270
149.檢查包 270
150.檢查類和超類 273
151.通過反射構(gòu)造函數(shù)實(shí)例化 279
152.獲取參數(shù)上的注解 282
153.獲取合成構(gòu)造函數(shù) 283
154.檢查可變參數(shù) 284
155.檢查默認(rèn)方法 285
156.通過反射實(shí)現(xiàn)基于嵌套的訪問控制 285
157.面向getter和setter使用反射 288
158.反射與注解 294
159.調(diào)用實(shí)例方法 299
160.獲取靜態(tài)方法 300
161.獲取方法、字段和異常的泛型 301
162.獲取公共字段和私有字段 304
163.處理數(shù)組 305
164.檢查模塊 306
165.動(dòng)態(tài)代理 307
小結(jié) 310
第8章 函數(shù)式編程:基礎(chǔ)與設(shè)計(jì)模式 311
問題 311
解決方案 311
166.編寫函數(shù)式接口 312
167. Lambda簡介 317
168.實(shí)現(xiàn)環(huán)繞執(zhí)行模式 318
169.實(shí)現(xiàn)工廠模式 320
170.實(shí)現(xiàn)策略模式 322
171.實(shí)現(xiàn)模板方法模式 323
172.實(shí)現(xiàn)觀察者模式 325
173.實(shí)現(xiàn)貸出模式 327
174.實(shí)現(xiàn)裝飾器模式 329
175.實(shí)現(xiàn)級(jí)聯(lián)建造者模式 332
176.實(shí)現(xiàn)命令模式 333
小結(jié) 335
第9章 函數(shù)式編程:進(jìn)階 336
問題 336
解決方案 337
177.測試高階函數(shù) 337
178.測試使用Lambda表達(dá)式的方法 338
179.調(diào)試Lambda表達(dá)式 340
180.過濾流中的非0元素 342
181.無限流、takeWhile()和dropWhile() 344
182.映射流中的元素 351
183.找出流中的元素 356
184.匹配流中元素 357
185.流中的sum、max和min操作 359
186.收集流的返回結(jié)果 362
187.連接流的返回結(jié)果 364
188.聚合收集器 365
189.分組(grouping) 369
190.分區(qū)(partitioning) 376
191. filtering、flattening和mapping收集器 379
192. teeing 382
193.編寫自定義收集器 385
194.方法引用 389
195.并行處理流 391
196. null-safe流 395
197.組合方法、謂詞和比較器 397
198.默認(rèn)方法 402
小結(jié) 403
第10章 并發(fā):線程池、Callable接口以及同步器 404
問題 404
解決方案 405
199.線程生命周期狀態(tài) 405
200.對(duì)象級(jí)鎖與類級(jí)鎖的對(duì)比 410
201. Java中的線程池 413
202.單線程的線程池 417
203.擁有固定線程數(shù)量的線程池 423
204.帶緩存和調(diào)度的線程池 424
205.工作竊。╳ork-stealing)線程池 430
206. Callable和Future 435
207.調(diào)用多個(gè)Callable任務(wù) 440
208.鎖存器(latch) 442
209.屏障(barrier) 445
210.交換器(exchanger) 448
211.信號(hào)量(semaphore) 451
212.移相器(phaser) 453
小結(jié) 458
第11章 并發(fā):深入探討 459
問題 459
解決方案 460
213.可中斷方法 460
214. fork/join框架 463
215. fork/join框架和compareAndSetForkJoinTaskTag() 469
216. CompletableFuture 472
217.組合多個(gè)CompletableFuture實(shí)例 486
218.優(yōu)化忙等待 490
219.任務(wù)的取消 491
220.線程局部存儲(chǔ)(ThreadLocal) 492
221.原子變量 496
222.可重入鎖(ReentrantLock) 500
223.可重入讀寫鎖(ReentrantReadWriteLock) 503
224.郵戳鎖(StampedLock) 505
225.死鎖(哲學(xué)家就餐問題) 508
小結(jié) 511
第12章 Optional 512
問題 512
解決方案 513
226.初始化Optional 513
227. Optional.get()和值丟失 514
228.返回一個(gè)預(yù)先構(gòu)造的默認(rèn)值 514
229.返回一個(gè)不存在的默認(rèn)值 515
230.拋出NoSuchElementException異常 516
231. Optional和null引用 517
232.消費(fèi)一個(gè)存在內(nèi)容的Optional類 518
233.根據(jù)情況返回一個(gè)給定的Optional類(或另一個(gè)Optional類) 519
234.通過orElseFoo()鏈接多個(gè)Lambda表達(dá)式 519
235.不要只是為了獲取一個(gè)值而使用Optional 521
236.不要將Optional用于字段 521
237.不要將Optional用于構(gòu)造函數(shù)的參數(shù) 522
238.不要將Optional用于setter類方法的參數(shù) 523
239.不要將Optional用于方法的參數(shù) 524
240.不要將Optional用于返回空的或者null的集合或數(shù)組 526
241.避免在集合中使用Optional 527
242.將of()和ofNullable()搞混淆 528
243. Optional與OptionalInt 529
244.確定Optional的相等性 529
245.通過map()和flatMap()轉(zhuǎn)換值 530
246.通過Optional.filter()過濾值 532
247.鏈接Optional和Stream API 532
248. Optional和識(shí)別敏感類操作 534
249.在Optional的內(nèi)容為空時(shí)返回布爾值 535
小結(jié) 535
第13章 HTTP Client和WebSocket API 536
問題 536
解決方案 537
250. HTTP/2 537
251.觸發(fā)一次異步GET請(qǐng)求 538
252.設(shè)置一個(gè)代理 540
253.設(shè)置/獲取請(qǐng)求頭 540
254.指定HTTP方式 542
255.設(shè)置請(qǐng)求體 543
256.設(shè)置連接身份認(rèn)證 545
257.設(shè)置請(qǐng)求超時(shí) 546
258.設(shè)置重定向策略 546
259.發(fā)送同步和異步請(qǐng)求 547
260.處理cookie 549
261.獲取響應(yīng)信息 550
262.處理響應(yīng)的請(qǐng)求體類型 550
263.獲取、更新和保存JSON 552
264.壓縮 555
265.處理表單數(shù)據(jù) 556
266.下載資源 557
267.使用multipart上傳 558
268. HTTP/2的服務(wù)器端推送 561
269. WebSocket 564
小結(jié) 566