編輯推薦
淘寶網Java技術專家,CSDN 超人氣博主作品,全面提升Java單兵作戰能力!
該書“雕琢”的系統,為阿里超大規模的資料庫集群服務!
完全突破Java圖書從環境搭建到語法點羅列再到案例總結的寫作慣例,直逼底層,懂原理,看源碼,奠定Java老A的堅實基礎!
沒有數頁代碼的簡單堆砌,有的是新穎的思考方法;沒有各類語法的無聊羅列,更多的是在探索技術背後的思路; 沒有難懂術語的枯燥晦澀,用的是對話和探討;輕鬆,愉快,讀來不忍釋卷,要學Java,這本書不容錯過!
內容簡介
《Java特種兵(上冊)(含CD光碟1張)》分上、下冊,上冊強調個人修為的提升,也是本書主旨所在,希望能幫助各位讀者朋友提升“功力”;下冊將基於上冊的內容融入設計、實現的細節。
《Java特種兵(上冊)(含CD光碟1張)》上冊共10章,主要內容包括:從簡單的角度來驗證功底,通過一些簡單的例子來說明我們應當如何去掌握Java的基礎;關於計算機的工作原理和Java虛擬機的基礎知識;Java通信;Java並發;資料庫知識;源碼基礎,說明Java常見的框架基礎知識,比如反射、AOP、ORM、Annotation和配置檔案的原理;JDBC、Spring的源碼講解,通過幾種不同類型的框架源碼,希望讀者能體會源碼之中的思維方式、設計、架構,以及了解到不同源碼的區別所在;最後是知識總結。
《Java特種兵(上冊)(含CD光碟1張)》既適合有一定Java基礎,並希望能在Java技術上有所成長的人閱讀,也適合能靜心看書的初學者,以及以自我提升為主要目的的讀者閱讀,還適合工作一段時間,對知識和發展的方向很迷茫,甚至對某些觀念也比較迷茫,但是又渴望去解決這些問題,渴望自己成長,渴望自己能找到道路的人閱讀。
目錄
第1篇 Java功底篇
第1章 扎馬:看看功底如何 2
1.1 String的例子,見證下我們的功底 2
1.1.1 關於“==” 3
1.1.2 關於“equals()” 3
1.1.3 編譯時最佳化方案 6
1.1.4 補充一個例子 6
1.1.5 跟String較上勁了 8
1.1.6 intern()/equals() 9
1.1.7 StringBuilder.append()與String“+”的PK 11
1.2 一些簡單算法,你會如何理解 15
1.2.1 從一堆數據中找max和min 16
1.2.2 從100萬個數字中找最大的10個數字 17
1.2.3 關於排序,實際場景很重要 17
1.2.4 資料庫是怎么找數據的 18
1.2.5 Hash算法的形象概念 18
1.3 簡單數字遊戲玩一玩 20
1.3.1 變數A、B交換有幾種方式 20
1.3.2 將無序數據Hash到指定的板塊 20
1.3.3 大量判定“是|否”的操作 21
1.3.4 簡單的數據轉換 22
1.3.5 數字太大,long都存放不下 23
1.4 功底概述 25
1.4.1 什麼是功底 25
1.4.2 功底有何用途 25
1.4.3 如何磨練功底 26
1.5 功底補充 27
1.5.1 原生態類型 27
1.5.2 集合類 30
1.6 常見的目錄與工具包 32
1.7 面對技術,我們糾結的那些事兒 34
1.7.1 為什麼我這裡好用,哪裡不好用 34
1.7.2 你的程式不好用,你會不會用,環境有問題 35
1.7.3 經驗是否能當飯吃 36
1.8 老A是在逆境中迎難而上者 37
第2章 Java程式設計師要知道計算機工作原理 41
2.1 Java程式設計師需要知道計算機工作原理嗎 41
2.2 CPU的那些事兒 42
2.2.1 從CPU聯繫到Java 42
2.2.2 多核 46
2.2.3 Cache line 47
2.2.4 快取一致性協定 49
2.2.5 上下文切換 50
2.2.6 並發與徵用 51
2.3 記憶體 54
2.4 磁碟 57
2.5 快取 60
2.5.1 快取的相對性 60
2.5.2 快取的用途和場景 62
2.6 關於網路與資料庫 63
2.6.1 Java基本I/O 63
2.6.2 Java的網路基本原則 64
2.6.3 Java與資料庫的互動 71
2.7 總結 72
第3章 JVM,Java程式設計師的OS 73
3.1 學習Java虛擬機對我們有什麼好處 73
3.2 跨平台與位元組碼基本原理 74
3.2.1 javap命令工具 74
3.2.2 Java位元組碼結構 85
3.2.3 Class位元組碼的載入 93
3.2.4 位元組碼增強 98
3.3 從虛擬機的板塊開始 108
3.3.1 Hotspot VM板塊劃分 108
3.3.2 “對象存放位置”小總結 114
3.3.3 關於永久代 115
3.4 常見的虛擬機回收算法 116
3.4.1 串列GC 117
3.4.2 ParallelGC與ParallelOldGC 118
3.4.3 CMS GC與未來的G1 121
3.4.4 簡單總結 124
3.4.5 小小補充 125
3.5 淺析Java對象的記憶體結構 126
3.5.1 原始類型與對象的自動拆裝箱 126
3.5.2 對象記憶體結構 127
3.5.3 對象嵌套 130
3.5.4 常見類型 & 集合類的記憶體結構 131
3.5.5 程式中記憶體拷貝和垃圾 134
3.5.6 如何計算對象大小 134
3.5.7 輕鬆玩一玩int[2][100] PK int[100][2] 135
3.6 常見的OOM現象 136
3.6.1 HeapSize OOM 136
3.6.2 PermGen OOM 139
3.6.3 DirectBuffer OOM 142
3.6.4 StackOverflowError 144
3.6.5 其他的一些記憶體溢出現象 146
3.7 常見的Java工具 146
3.7.1 jps 147
3.7.2 jstat 147
3.7.3 jmap 148
3.7.4 jstack 148
3.7.5 jinfo 149
3.7.6 JConsole 150
3.7.7 Visual VM 154
3.7.8 MAT(Memory Analyzer Tool) 156
3.7.9 BTrace 160
3.7.10 HSDB 165
3.7.11 工具總結 166
3.8 總結 167
3.8.1 寫代碼 167
3.8.2 心理上戰勝虛擬機帶來的恐懼 170
第4章 Java通信,互動就需要通信 171
4.1 通信概述 171
4.1.1 Java通信的基本過程 171
4.1.2 Java通信的協定包裝 173
4.1.3 編寫自定義通信協定 173
4.1.4 Java的I/O流是不是很難學 186
4.2 Java I/O與記憶體的那些事 191
4.2.1 常規I/O操作的運作過程 191
4.2.2 DirectBuffer的使用 191
4.2.3 關於Buffer 195
4.2.4 FileChannel的加鎖 197
4.3 通信調度方式 197
4.3.1 同步與異步 197
4.3.2 阻塞與非阻塞 198
4.3.3 Linux OS調度IO模型 199
4.3.4 Java中的BIO、NIO 199
4.3.5 Java AIO 210
4.4 Tomcat中對I/O的請求處理 214
4.4.1 Tomcat的配置&一個請求的回響 214
4.4.2 Request、Response對象生成 221
4.4.3 拉與推 226
第5章 Java並發,你會遇到嗎 228
5.1 基礎介紹 228
5.1.1 執行緒基礎 228
5.1.2 多執行緒 231
5.1.3 執行緒狀態 231
5.1.4 反面教材suspend()、
resume()、stop() 236
5.1.5 調度優先權 238
5.1.6 執行緒合併(Join) 239
5.1.7 執行緒補充小知識 241
5.2 執行緒安全 243
5.2.1 並發記憶體模型概述 243
5.2.2 一些並發問題描述 246
5.2.3 volatile 248
5.2.4 final 251
5.2.5 棧封閉 254
5.2.6 ThreadLocal 255
5.3 原子性與鎖 261
5.3.1 synchronized 261
5.3.2 什麼是樂觀鎖 262
5.3.3 並發與鎖 263
5.3.4 Atomic 264
5.3.5 Lock 272
5.3.6 並發編程核心AQS原理 273
5.3.7 鎖的自身最佳化方法 281
5.4 JDK 1.6並發編程的一些集合類 282
5.5 常見的並發編程工具 284
5.5.1 CountDownLatch 284
5.5.2 CyclicBarrier 286
5.5.3 Semaphor 288
5.5.4 其他工具簡介 290
5.6 執行緒池&調度池 293
5.6.1 阻塞佇列模型 293
5.6.2 ThreadPoolExecutor 294
5.6.3 調度器ScheduleThread PoolExecutor 306
5.7 總結:編寫並發程式要注意些什麼 317
5.7.1 鎖粒度 317
5.7.2 死鎖 321
5.7.3 “坑”很多 323
5.7.4 並發效率一定高嗎 329
5.8 其他的並發編程知識 330
5.8.1 ShutdownHook(鉤子執行緒) 330
5.8.2 Future 332
5.8.3 異步並不等價於多執行緒 333
第6章 好的程式設計師應當知道資料庫基本原理 335
6.1 開發人員為什麼要知道資料庫原理 335
6.2 從開發人員角度看資料庫原理 337
6.2.1 實例與存儲 338
6.2.2 資料庫基本原理 339
6.2.3 索引基本原理 348
6.2.4 資料庫主從基本原理 354
6.2.5 我們經常相信的那些經驗 354
6.3 從程式設計師角度看資料庫最佳化方法 355
6.3.1 不同領域的SQL區別 355
6.3.2 執行計畫 356
6.3.3 SQL邏輯的例子 365
6.3.4 模型結構設計的最佳化 366
6.3.5 臨時表 367
6.3.6 分頁知識補充 368
6.3.7 計算count值 369
6.3.8 分散式事務探討 369
6.3.9 其他 371
6.4 學會最基本的性能診斷 372
6.4.1 進入雲資料庫時代 372
6.4.2 從程式設計師角度關注的資料庫診斷信息 373
6.5 數風流存儲,還看今朝 373
第2篇 源碼篇
第7章 源碼基礎 380
7.1 為何會出現框架 380
7.2 閱讀框架前的技術儲備 384
7.2.1 反射基礎知識 384
7.2.2 AOP基礎 390
7.2.3 ORM基礎 395
7.2.4 Annotation與配置檔案 398
第8章 部分JDBC源碼講解 403
8.1 JDBC通用接口規範 403
8.2 JDBC Driver註冊 404
8.3 創建Connection 411
8.4 SQL執行及處理 417
8.4.1 創建Statement 417
8.4.2 Batch設定批處理 419
8.4.3 fetchSize與maxRows 424
8.4.4 setQueryTimeout()與cancel() 429
第9章 部分Spring源碼講解 433
9.1 Spring MVC 433
9.1.1 Spring載入 433
9.1.2 Spring MVC處理一個簡單請求 443
9.2 Spring事務管理器 447
9.2.1 JDBC事務的基本思想 447
9.2.2 Spring事務管理器的基本架構 448
9.2.3 Spring如何保存Connection 449
9.2.4 Spring如何保證程式中多次獲取到的連線是同一個 451
9.3 思考:自己做框架有眉目了嗎 454
第10章 看源碼的一些總結 457
10.1 高手看API的能力 457
10.2 通過源碼能否量化性能與穩定性 461
10.3 思考相似方案和技術的優缺點 463
10.4 明確場景和業務,不做技術控 464
10.4.1 談談技術控的那些事 464
10.4.2 明確業務背景的例子 466
10.5 胖哥對框架的淺析 468
10.5.1 框架由來的一個補充 468
10.5.2 開源框架與擴展 469
10.5.3 框架與解決問題 473
10.6 學海無涯,心境無限 474
媒體評論
在阿里,成為老A,特別是成為作者這樣技術專家的level,其“雕琢”的系統必須是經歷雙十一的洗禮和摧殘而巍然鼎立的系統。本書從Java功底基礎、源碼介紹(特別是JDBC和Spring方面)、Java設計模式、Java實現方面,介紹Java後端開發需要的一個一個的核心點,所以非常合適在網際網路公司、軟體公司等從事java核心繫統開發的小夥伴們。全書內容充實,並附有大量的代碼、數據和圖表,比較符合大多數程式設計師的喜好,也非常具有指導實踐落地的能力,另值一提的是,作者充分使用業餘時間編撰,已經年載有餘,期間更是數易其稿,且精工細雕,充分體現了技術人員的完美追求。本書的主題一則是java特種兵的成長曆程,二則是希望此歷程的“得道”思想為導向,讓讀者形成自身的獨自思考和總結的能力。
朱金清(阿里花名:穆公)
本書全面地描述了一個合格的Java程式設計師所必須理解的基本知識,內容深入淺出,語言幽默詼諧,知識點覆蓋面廣,闡述理論又不拘泥於理論,例子豐富,實戰性極強,顯示出小胖哥對JVM的深入理解和豐富的Java實踐經驗,非常適合Java初學者作為入門教程。對有一定的Java編程經驗,但是渴望對Java代碼背後隱藏的JVM基礎知識有更深入理解的同學來說,更是一本不可多得的好書。同時,本書也凝聚了小胖哥和他的同事們對Java系統架構與設計的獨特理解,處處體現了Java程式設計師應有的工作和學習方法。相信讀者在讀完此書後,學到的不僅僅是紮實JVM及Java基礎知識,迅速成為Java開發領域的老A,更能學到胖哥的追根究底的學習態度,受益終生。
洪熙
資深Java工程師,主要從事JVM核心研發工作
阿里雲-核心繫統研發部-專用計算組
入職不久,就聽說謝宇在寫一本面向Java開發人員的書籍,那個時候在想市場上JAVA方面的書籍已經夠多了,還有什麼內容可以寫的呢?但在不久後當我拿到前面幾章的手稿的時候,就迫不及待地閱讀,我發現,對於已經在這個行業內從事多年研發的從業人員來說,有很多知識點在過去的時間都沒有重視而被忽略,而作者不但用一種詼諧幽默的方式表達出來,而且還引導讀者一起思考,無處不體現出作者深厚的功底。
銳意(真名:廖科)
資深Java工程師
多年SNS開發的經驗
阿里資料庫方案-iDB組擔任leader
如果想要一本普及Java基礎的書,這本可能並不合適;這本書適合有一些Java基礎,想要深入的同學;內容涵蓋了作者多年使用Java的經驗,對初學者,猶如中國人寫的Think In Java,內容廣泛深入而又不拖沓,專注Java排雷避坑;期間還穿插了一些作者對於程式設計師職業生涯的感悟,如果你初入IT這行感到迷茫,在這本書里可以找到方向。
頊陽(真名:許飛飛)
數據方案-大數據方案,資深資料庫工程師
Hbase方面有較深的造詣。
淘寶80%的開發工程師都在使用Java,書中很多的技術問題在淘寶的業務場景下均已遇到。全書不僅介紹了各種Java的技術,還融入了作者在淘寶多年的學習心得和想法,非常適合初學者業餘閱讀和技術提升。這是我讀過的最有意思,最輕鬆愉快的一本Java基礎書籍。
方騰飛
並發編程網網站主編
支付寶資深Java工程師
前言
本書書名為《Java特種兵》,又名《Java老A》,目的很簡單,希望作為讀者朋友的你,有一天能夠成為一個單兵作戰能力極度強悍的Java程式設計師。眾所周知,Java程式設計師多如牛毛,我希望學習本書的讀者有志者事竟成、出類拔萃,練就一身好本領,成為Java界的特種兵。
關於本書
冰凍三尺,非一日之寒。本書不是什麼神功秘籍,所以它無法讓你在短時間內從一個小鳥變成一個牛人,更無法讓你從牛人成為大師,這本書是希望讀者朋友能夠在糾結的時候想起還可依賴它。因為本書不僅僅在講解一些知識,同時也包含了作者以及作者同事的一些工作經歷,以及工作經歷中的那些痛苦與糾結,我們希望在這本書的陪伴下,你在糾結之時選擇的不是放棄自我,而是堅持到勝利的那一刻。
作者本人也不是什麼牛人,更不是絕頂高手,只能說我們經歷的某些事情也許值得去分享,這些內容不僅僅包含一些知識,同時也包含了很多思想、方法和面對問題的態度,注重功底和修為的提升。如果有一天你發現這本書帶給你更多的是方法,從而讓你建立起自己的許多思路,能夠快速學習和成長,那么本書的一個重要目的就達到了;如果有一天你發現再去看某些“牛人秘籍”會比以前輕鬆和愉悅,那么也許這本書有點小功勞。
本書不是什麼代碼大全,也不是專門講解某些指定的知識板塊的書籍(例如JVM),並不會針對某些專門的知識板塊去做過細的說明,也不會去說明詳細的API,更不會全面地說明它們的源碼,這是沒有意義的。通過本書,希望你能從內心認識到“知識無涯”,我們總會遇到自己沒有見過的問題,需要學會的就是如何面對這些問題,即如何去思考和定位,如何去學習和成長。
在本書中,可能會以各種“換位思考”的方式來探討一些技術內容,從技術本身的角度來講,側重於講解技術之中蘊藏的各種奧秘以及探索奧秘的一些思路,而不是講解一些技術的使用,希望讀者在這個過程中開始有意識地去理解知識應有深淺之分,並同時真正掌握Java基礎,提升自我的功底,同時還能找到提升功底的方法。
本書中許多對話和探討的模式,適合像小說一樣來靜心品味,我相信如果你能靜心,那么不論是初學者還是有一定功底的人,都能從本書中受益。作者本人在剛進入大學的時候,是一個連計算機是什麼都不知道的人,也曾經有過為了通過C語言考試而死記硬背代碼的經歷,後來通過不斷努力,才有能力寫出這本書。因此,本書會結合當時胖哥從一個計算機界的“文盲”開始成長的過程中所擁有的一些“可愛”的思想經歷,如果你有類似的思想經歷,希望這本書能夠幫助你,也同時希望你理解到:只要你願意,你就一定行的!
本書有的內容風格會偏於娛樂,這些內容所描述的技術肯定不會那么嚴謹,由於不嚴謹,可能會讓不同的讀者產生仁者見仁、智者見智的情況。對於某些有著同樣工作經歷的人看來,也許會有著發自內心的共鳴,對於初學者可以是一個大概的形象理解。雖然書中的許多解釋並不是技術點上的準確解釋,但我不希望初學者“小夥伴們”僅僅注重娛樂本身的話題,而要想想這種娛樂的例子所帶給自己的一些感性認識。
本書會談到一些成長性的內容,因此我們可以先大概定位一下一些不同層次的人會怎樣思考,怎樣做事情,讓大家有個形象上的認識。
Java學習三段位
許多初學者,就像是無頭蒼蠅,四處亂撞,什麼都想學,學了就丟,而且喜歡鑽牛角尖,甚至沒有獨立思考的習慣,遇到問題總是先問,再解決問題。他們經常會問:“為什麼我的東西在這好用,在那不好用?”因為你還根本不知道問題的原因,當然不知道這么多的為什麼了,任何問題都需要定位分析,再解決,再總結。面對問題要靜下心來通過自己對基礎的認識來分析可能的原因,然後逐步縮小範圍,再定位問題。如果拋出一個錯誤就能知道原因,那么直接設計一個答題的機器就可以了,而不需要任何人為的介入。
學到一定程度的人,懂得思考,懂得換位思考,能解決大多實際問題,他們不僅僅能開始自己定位問題,而且開始具有“前瞻性”,思考一些問題未來可能存在的潛在情況,也開始逐步關注一些內在原理。不過,可能是藝高人膽大,這些人有可能會犯一些不該犯的錯誤,他們通常是一些十分優秀的程式設計者,很多時候可能是為了展現自己的技術能力,會將一些不值得去做的事情不斷細化和最佳化,或者去做一些別人做過的事情,如果因為這樣丟掉主業務,則通常說它是過度最佳化、過度設計、重複製造。作者本身也有同樣的親身經歷,而矛盾在於是否真的是過度設計,在不同的場景下會有不同的看法和評價,因此這個階段的同學,通常會有一個糾結期。在這個階段的人開始講究內外雙修,也同樣是一個積土成山、積水成淵的過程,因為有一定的功底,學習很多知識都很快,在知識面上會有很大的突破,在知識點上也會逐步加深,可能在工作中不論是業務還是技術上都有了很多的選擇,被認為是工作能力很強的人。一些很“牛”的開發人員就會開始意識到很多代碼如何去編寫會更優雅、更加高效,用更簡單的代碼搞定更多的問題,但還未上升到系統級別和架構級別。
可能更高級別的人開始具有很強的全局觀,讓系統全局更加具有可維護性和伸縮性,系統性能良好,穩定性十足,能搞定各類架構、部署、規範化等相關的問題,在某些領域上也是說話很有分量的人物。他們可能會花很多時間去寫通用模型和設計,將難題簡單化,解決大家解決不了的難題。通常會儘量讓系統的維護變成一條配置或是幾條簡單代碼,但是可以頂得上一群人寫一堆代碼,這就是特種兵程式設計師的“快”、“準”、“狠”、“穩”。
這裡的各種級別僅僅是作者“自言自語”,並不代表什麼,要做到沒有級別在心中才能真正讓自己快速成長。另外,看了這些級別並不代表今天我是初學者,明天將不好的習慣改掉後就“脫胎換骨”了,也並不代表自己在某件小事情上有了大師的風範就代表自己是大師了。這些東西都是經歷一些事情後才會形成一些自然意識,我們只是有意識地去學習他們為什麼會這樣做事情,為什麼年輕人比老員工有活力,但通常來講“薑還是老的辣”。
本書讀者對象
□ 適合對象
(1)有一定Java基礎,並希望能在Java技術上有所成長的人。
本書學習有一定門檻,如果是初學者,則可以先以書中的一些例子為引導,希望了解為什麼的時候,再來看其中的解釋。
(2)對於能靜心看書的初學者,可以疊代著看本書。
雖然有一定門檻,不過初學者只要能靜心地疊代著讀幾次後,你或許也能體會出裡面有很多思想、方法、解決問題的手段、看問題的側面,甚至面對問題的心態,那么也可以受益良多。
(3)本書是一個載體,一個推崇自我修為、內外雙修的載體,修行看個人,所以適合於想要以自我提升為主要目的的讀者。
(4)工作一段時間,對知識和發展的方向很迷茫,甚至對某些觀念也比較迷茫,但是又渴望去解決這些問題,渴望自己成長,渴望自己能找到道路的人。
□ 不適合對象
(1)Java方面的高手和牛人,因為這本書並不能助你從牛人變成大師。
(2)做客戶端(如Android)或嵌入式的Java程式設計師,因為書中大多內容是以伺服器端Java來講解的,極少考慮客戶端的問題。
(3)如果你對自己或周圍的一切很絕望,看到的所有東西都是邪惡、虛偽的,也沒有想過要讓自己進步。
(4)希望這本書成為技術字典的同學不適合讀,因為這本書不是代碼大全,也不是知識點精準解釋的匯聚,更不是API的列表。
(5)希望系統性學習某些專業知識的同學不適合看本書,因為本書講解的是一種“碎片化”學習方式,或者說是以一些小例子為基礎,進一步處理相關問題的方式。
如何閱讀本書
作為書籍的作者,希望讀者能夠快樂地學到知識,每天空餘時間看看而不是一種壓力,面對技術擁有獨自思考問題的能力,而並非掌握某種技術本身,通過輕鬆地接觸很多知識並且能有所體會,不斷地去總結、抽象,能得出自己的分析問題、解決問題的方法,磨鍊出超越普通程式設計師的功底,最終成為Java老A。
本書其實是一本Java的野書、雜談,會儘量用通俗易懂的方式來講解一些複雜的問題和技術。不過,這畢竟不是一本娛樂的書,某些內容胖哥還是會說得比較嚴謹。書中除了講解一些“功底類”的技術,大部分技術不會講得太深,大多只是拋磚引玉給你一個思路,當你需要去接觸更深的技術的時候,在這本書中可能會有一個較為形象的例子供你參考,也許就大概知道了如何去理解。若功底夠好,就會發現萬變不離其宗,一切都可以歸於基礎,而且大多複雜的思路都源自於生活的靈感。
如果是初學者,希望你不要期望每天看太多內容,而是希望你看了後儘量去思考,不用完全看懂,每天能夠有一個心得,當你在實踐中遇到某些問題開始擁有靈感時,本書或許會印證這一切。
本書提到的技術僅僅是一個引導、一種探討、一種思路,在闡述一件事情好與不好的時候,通常會以多種角度去看待問題的不同側面,再來說明為什麼會有這樣的經驗,同時也可能會探討這些經驗是否能夠受用終身。因為技術的時代在不斷革命,現在的技術十分泛濫,但都殊途同歸,我們要跟上時代又要歸納總結,也許很多時候我們沒有精力去學習所有的知識,但有精力讓自己提升學習能力從而來學習更多的東西,也有精力來探索工作領域內的知識奧秘,而前提是應當有探索奧秘的習慣以及足夠的功底。
本書的目的在於個人成長,極少談到關於團隊合作與規範化等方面的知識,當然作為一個單兵作戰能力極強的人,應當有這方面的意識和思維,即使本書中沒有提及,大家也應當去掌握。同時也請讀者朋友注意本書所提倡的單兵作戰能力,並不是期望大家去做一個技術上的孤獨者,而是為了更好地去工作。
約定
□ 本書將採用Hotspot VM 1.6作為講解的例子(可通過命令“java –version”得到JVM版本),而測試的例子如果是在具體的OS環境下測試,則會單獨說明。書中也會提到JDK 1.7的內容,相應的代碼如果要運行,也要選擇JDK 1.7。
□ 本書中“部分例子”,必須採用-server模式來運行和模擬,尤其是第5章並發編程中的許多例子,在例子中通常會有專門的備註和說明,請讀者注意參看。
□ 篇幅所限,本書中的例子大多只是片段,以說明實際的問題為主,需要完整的例子,請參看配書光碟中的相關demo信息,書中的例子都有與之對應的實際代碼,除十分複雜的代碼外,從demo中獲取的代碼進行相關的配置後,均可直接在對應平台上按照指定結果運行。
□ 本書的代碼分源碼和代碼兩種,源碼為第三方源碼,可以到官方網站下載參看,書中會介紹源碼的版本和思路,並貼出部分關鍵源碼的功能和設計思路。
□ 本書從第2篇開始,每一篇都會有“致讀者言”,目的是讓讀者更好地了解這部分內容應該從何種角度去理解,它會說些什麼,會給你帶來什麼,你為什麼需要這些。
□ 網路上大家都稱作者為“小胖哥”或“胖哥”,所以在本書中,也會以這兩個稱呼作為作者本人的代名詞。
內容簡介
本書分上、下冊,總共5篇,上冊兩篇內容分別是Java功底篇和源碼篇,強調個人修為的提升,也是本書主旨所在,希望能幫助各位讀者朋友提升“功力”;下冊中,將基於上冊的內容融入設計、實現的細節。
上冊
第1篇 Java功底篇
建議所有本書的讀者朋友都讀一下本篇的內容,所謂“練武不練功,到老一場空”,你若要成為一個老A級程式設計師,功底的提升是十分重要的。通過對第1篇的學習,希望讀者能知道如何驗證自己的功底,如何提升自己的功底,而能提升多少,完全要靠你自己的屬性喔!
第1章從簡單的角度來驗證功底,通過一些簡單的例子來說明我們應當如何去掌握Java的基礎,同時也包含一個“老A級程式設計師”除功底外還需要有面對逆境的心態。
第2章和第3章分別介紹關於計算機的工作原理和Java虛擬機的基礎知識。胖哥認為一個優秀的Java程式設計師,應當知道自己的程式在計算機內部是如何運行的,更需要知道虛擬機是如何運行的,效率對比怎樣,此好比“習武之人,需要知道何為武學”。
第4章講解Java通信,在了解了運行基本原理後,你應當了解很多網路互動已經被Java的框架包裝得不再像通信程式了,就像是“被裝修後的房子,你不再知道房屋本身是用什麼建造的”。但如果你是老A,就應當知道這些,這樣才能知道遇到各種怪異的問題時如何去解決,你會發現:“一切源自基礎,偶然問題隱藏必然”。
第5章講解Java並發,如果讀者朋友確實遇不到,則可以跳過,但要成為Java的老A,這應該算是基礎知識,老A應該知道Java並發是怎么樣的。除了客戶端程式及單片機等,Java並發程式處理其實無處不在,就好比“一個城市的交通,很多的車輛需要通信,應當如何調度來提高流量,避免交通事故”。
第6章講解資料庫知識,大部分程式設計師都應該使用過資料庫、檔案,通過學習第4章通信方面的內容,應該會有一些概念,但是面對存儲,你是否想要了解一些內在,了解一個程式設計師所需要知道的內在,這樣可能會使得你的工作更加得心應手。說了這么多,你是否發覺學習Java為何要了解如此多的東西?是的,你需要知道“多個門派的武學,面對不同的思想碰撞來切磋,才會有更多的體會”。作為一個老A,才會擁有單兵作戰能力極強的作戰素質。
第2篇 源碼篇
達到一定程度的程式設計師一般會開始對實現本身感興趣,想了解為什麼,了解別人是如何設計和實現的。
起初在面對框架的時候,可能會去猜測或測試它是如何實現的,但逐漸發現猜測和測試並不那么靠譜,因為版本和環境影響因素太大,我們開始想要知道一些內在,看源碼成為一個必然。源碼面前沒有秘密可言,看過源碼,你會對問題定位和編寫代碼擁有自信,開始對技術本身有量化的認識。
本篇並不是網羅天下源碼,也不會對某種源碼做全面講解,而是通過閱讀源碼來說明我們應當如何閱讀源碼。
在本篇開始部分會先介紹為何要閱讀源碼,講解哪些源碼,如何閱讀源碼,請有疑問的小夥伴們關注一下喔。
第7章講解源碼基礎,說明Java常見的框架基礎知識,主要包括:反射、AOP、ORM、Annotation和配置檔案的原理。在這裡不僅僅會闡述技術本身,同時也會聯繫一些實際框架的可能實現方法。老A一定要:知其然,知其所以然。
第8章和第9章分別講解JDBC、Spring的源碼,這裡不會說明這些三方包的所有源碼和關鍵點。但通過幾種不同類型的框架源碼,希望讀者能體會源碼之中的“思維方式、設計、架構”,以及了解到不同源碼的區別所在。雖然區別很多,但如果你有一些“百川納海、源自同門”的感受,那么小夥伴們就成長了很多。
第10章是對第2篇的知識總結,在閱讀源碼後不是讀完就完了,而是應當有所體會。通過對源碼基礎知識的初步了解和對一些源碼的閱讀,我們逐步有能力在接觸一個自己從未見到的框架時,可以大概知道它的大致內在,並且大多數情況下可以輕鬆搞定它,即使有一定難度也會從根本的角度去看待這些技術問題,進一步快速地通過看它的代碼了解內在,而不會被浮於表面的使用所迷惑。這就好比雖然魔術師的表演眼花繚亂,但是在他們同行眼中都是知根見底的,因為我們也是專業的,所以不應當被一些東西所迷惑。
下冊
第1篇 設計篇
老A雖然不像軍師那樣:“運籌帷幄之中,決勝千里之外”,但也同樣需要有全局的部署思想,對臨場應變以及撤退方案和路徑要有全局把控,能“在萬軍之中取上將首級”,使用最低犧牲得到最高的成果。
在設計篇中,胖哥希望給你帶來的不僅僅是現有老A的技術,也包含了他們的許多思想。既然是思想,自然是結合場景最佳,它需要融入老A的智慧,不限於表達的形式,因為這些形式只是一種思想傳承的載體。
在第1章中,胖哥會用平時工作中的例子說明一些常用的設計模式,但並不會將Java所有的設計模式全部詳細講解,因為這不是本書的主旨,而且那樣並沒有多大意義。在實際的套用中,場景是非常重要的,變化遠遠大於這些設計模式本身所提供的“招式”。模式本身提供一種建議性的設計方法,就好比武學中的“招式是死的,人是活的”,不同年齡段修煉同樣的武學,與不同的對手較量,不論是招式的順序還是臨場的動作都會有很大的變化。如果在實戰對決中一再用套路來較量,就會被套路牽引著走,也會被對手打亂節奏,而套路本身給我們提供了一種處理場景的方法,靈活套用才能用以實戰,這樣才能達到“無招勝有招”的境界。
第2章和第3章介紹兩個實例的設計,它們是兩種完全不同類型的程式,在這個過程中嘗試套用設計模式中的一些知識和思路,也就是需要知道如何利用招式來對敵。但大家不要僅僅局限於這兩章所給出的例子,因為實際場景可以千變萬化,針對自己所遇到的場景,需要去揣摩和思考。我們的例子通常不會寫到實現部分,到設計部分基本結束,希望你能理解到“思想和方法應當源於生活和自然”。
第2篇 實現篇
在原計畫中胖哥並沒有打算寫關於“實現”方面的內容,不過胖哥發現在實際工作中,小白“童鞋”們所面對的可能最多是實現,於是增加了這部分內容。但是在實現篇並不是拿一個業務實例來寫代碼,談什麼呢?
第4章談談項目中各種工作人的互動、開發模式、心態、技術上的思維方式、一些最佳化思路。第5章簡單談談UI的一些用途、繁雜的點在那裡。第6章談談實際工作中經常會遇到的“坑”,這些坑不容易被發現,但是我們經常容易掉進去,希望大家知道的不僅僅是這些坑,而是通過這些坑了解到,眾多技術都是一把“雙刃劍,有好處必有壞處”,只有最佳的場景選擇最合適的技術,學會如何去量化與選擇,同時需要了解到現在的工作對個人素質的要求越來越高。
第3篇 擴展篇之論道
擴展篇為雜談,也是論道篇,讀者可以先看第5篇的內容,本篇是對知識面和思想的一個擴展。一個老A,應當知道業界的一些技術,所謂:“知己知彼,百戰百勝”,接觸任何一種問題,都要有相應的解決方案。
第7章和第8章以走馬觀花的方式來介紹一些集群知識、分散式知識(但並不意味著實際的技術和走馬觀花那樣簡單)。作為老A程式設計師,胖哥認為需要知道這些,這樣才能更好地做好一些事情,或者說有機會去做更有挑戰的事情。也許你今天用不到這些,但當你用到時,便能更加得心應手。
第9章講解技術量化與權衡的一些事情,會談一些時間管理、團隊合作、過度最佳化、預知問題、不同項目的實現思路等。這裡闡述的中心思想是,我們應當在技術追求的道路上,考慮各種成本與價值的問題,從個人做起,再看看團隊協作。
第10章是完結章,主要是探討一些心態以及勵志,有興趣的小夥伴們可以看看,沒有興趣的無須關注本章。現代老A,除素質過硬外,更要擁有智慧,智慧包含了豐富的知識面,同時也包含了對於世界的理解,靜心做好當下,有機會去做好創新,在芸芸眾生之中脫穎而出。
下冊即將出版,敬請期待!
聯繫作者
寫代碼是邏輯的,代碼寫出來就會有漏洞和Bug,寫書更多是感性的,問題自然會更多,作為剛開始寫書的我,會盡我所能將書中的錯誤儘量減少,但不能減少書中內容的含金量。
本書以灌輸思想為導向,更多的是希望讀者通過自身獨自思考和總結的能力,在一定基礎之上進行進一步提升。
鳴謝
胖哥第一次寫書,而且這本書大部分內容是從鍵盤上敲出來的,所以深感寫書也是不容易的事情,尤其是在炎熱的夏天,幾次想要放棄,不過最終能夠堅持下來,我內心之中想要感謝家人、朋友、同事、與我一起玩Java的小夥伴們的支持和鼓勵,感謝老婆背後默默的付出,再謝謝2013年剛出生的女兒,你的每一個依依哇哇的古怪表情都讓爸爸有了動力與靈感,最後謝謝電子工業出版社給予我出版本書的機會,特別感謝出版社孫老師對我的指導與鼓勵,以及葛娜編輯在這個過程中所付出的努力。