第一章 對(duì)象導(dǎo)論
1.1抽象過程
所有編程語言都是在提供對(duì)問題的抽象。匯編語言是對(duì)底層機(jī)器的抽象;命令式語言(如c)更加高級(jí),但是它們的抽象仍舊基于計(jì)算機(jī)的結(jié)構(gòu);面向?qū)ο筇峁┝吮硎尽皢栴}空間”元素的能力,可以基于問題進(jìn)行抽象,而不是計(jì)算機(jī)。
面向?qū)ο蟮奶攸c(diǎn):
- 萬物皆為對(duì)象
- 程序是對(duì)象的集合,它們通過發(fā)送消息告知彼此所要做的(即java中方法)。
- 每個(gè)對(duì)象都有由其他對(duì)象所構(gòu)成的存儲(chǔ)(即java中成員變量)。
- 每個(gè)對(duì)象都擁有其類型(即java中class)。
- 某一個(gè)特定類型的對(duì)象可以接受同樣的消息(即同class)。
1.2 每個(gè)對(duì)象都有一個(gè)接口
類是描述具有相同特性和行為的對(duì)象集合。面向?qū)ο缶幊痰倪^程,是為問題空間的元素和解空間的元素創(chuàng)建一一映射。
基于對(duì)象的特點(diǎn)來說
接口確定了某一個(gè)對(duì)象可以發(fā)送的請(qǐng)求,或者可以說成某一個(gè)對(duì)象具有的行為。
1.3 每個(gè)對(duì)象都提供服務(wù)
基于設(shè)計(jì)者的角度來說
將對(duì)象看作“服務(wù)提供者”。設(shè)計(jì)程序的過程,即考慮怎樣創(chuàng)建提供理想服務(wù)的一系列對(duì)象。
1.4 被隱藏的具體實(shí)現(xiàn)
一個(gè)完整的程序(如點(diǎn)餐)可能需要基于多套服務(wù)(如定位,圖片加載框架等)。
在設(shè)計(jì)類的時(shí)候,要從一個(gè)服務(wù)提供者的角度,考慮哪些接口是需要對(duì)外暴露的,哪些是需要隱藏的。
1.5 復(fù)用具體實(shí)現(xiàn)
代碼復(fù)用方式
- 組合
- 聚合(動(dòng)態(tài)發(fā)生的組合)
- 繼承
組合比繼承更靈活
1.6 繼承
導(dǎo)出類和基類具有相同接口,導(dǎo)出類可以新增接口,也可以覆蓋(override)基類的接口。
1.7 多態(tài)
實(shí)現(xiàn)方式:后期綁定
1.8 單根繼承結(jié)構(gòu)
1.9 容器
- 不同容器提供不同接口和外部行為;
- 不同容器對(duì)于某些操作具有不同效率。
1.9.1 參數(shù)化類型
泛型
1.10 對(duì)象的創(chuàng)建和生命期
垃圾回收機(jī)制
1.11 異常處理:處理錯(cuò)誤
1.12并發(fā)編程
第二章 一切都是對(duì)象
- 引用
- new
存儲(chǔ)到哪里
1). 寄存器
2). 堆棧 - 對(duì)象引用和基本類型存在堆棧中。java編譯器需要知道堆>棧中所有元素的生命周期。
3). 堆 - 對(duì)象實(shí)體存在堆中
4). 常量池
5). 磁盤存儲(chǔ)
- 基本類型
boolean char byte short int long float double void
BigInteger
BingDecimal - 數(shù)組
基本類型數(shù)組
引用類型數(shù)組 - 作用域
- 創(chuàng)建新的數(shù)據(jù)類型: 類
成員變量和方法
成員變量默認(rèn)值
“局部變量”沒有默認(rèn)值 - 方法,參數(shù)和返回值
參數(shù)列表 - import
- static
- 編譯和運(yùn)行
- 注釋
@see等
第三章 操作符
- 操作符
+,-,*,/,== ,= - 優(yōu)先級(jí)
- 賦值
引用賦值 - i++,++i
- == 比較的是對(duì)象的引用,覆蓋equals
- &&,||是短路操作符
- 直接常量
十六進(jìn)制:0x
八進(jìn)制:0
float:F
long;L
指數(shù)計(jì)數(shù):e - 按位操作符 & | ~ ^
- 移位操作符 >>, << ,>>> ,<<<
- 三元操作符 ?:
- 字符串操作符 + +=
- java中的位數(shù)溢出
第四章 控制執(zhí)行流程
第五章 初始化與清理
- 構(gòu)造器
- 重載
- 默認(rèn)構(gòu)造器
- this關(guān)鍵字
- 清理 finalize()
finalize的一個(gè)用法:回收對(duì)象前檢查狀態(tài),拋出異常
常見垃圾回收機(jī)制
- 引用計(jì)數(shù) - 缺陷:循環(huán)引用;
- "活對(duì)象查找存留" - 自適應(yīng)“停止-復(fù)制” + “標(biāo)記-清掃” + “分代”
從堆棧和靜態(tài)存儲(chǔ)區(qū)出發(fā),遍歷引用,找到存活的對(duì)象;
- 初始化
初始化順序
1). 查找 .class文件
2). 加載.class(創(chuàng)建class對(duì)象),進(jìn)行靜態(tài)初始化
3). 用new創(chuàng)建對(duì)象時(shí),在堆上為對(duì)象分配足夠的空間
4). 將分配的空間清零,初始化成員變量為默認(rèn)值
5). 初始化基類非靜態(tài)部分
6). 按照申明順序初始化成員變量
7). 非靜態(tài)代碼塊
8). 構(gòu)造器
第六章 訪問權(quán)限控制
第七章 復(fù)用類
- 方式:組合,繼承
- final關(guān)鍵字的作用
第八章 多態(tài)
- 后期綁定
- 用多態(tài)進(jìn)行程序設(shè)計(jì)
第九章 接口
- 接口多實(shí)現(xiàn)(同名方法)
- 策略模式
- 嵌套接口
第十章 內(nèi)部類
- 內(nèi)部類持有外部類引用
- .this和.new
- 靜態(tài)內(nèi)部類->嵌套類
- 為什么需要內(nèi)部類
多繼承
語法上沒有is-a的歧義 - 閉包
閉包是一個(gè)可調(diào)用的對(duì)象,記錄類創(chuàng)建它的作用域的一些信息。
內(nèi)部類是面向?qū)ο蟮拈]包。 - 內(nèi)部類的繼承
導(dǎo)出類的構(gòu)造器攜帶參數(shù)外部類enclosingClassReference
必須在導(dǎo)出類構(gòu)造器中調(diào)用enclosingClassReference.super()
第十一章 持有對(duì)象
- Collection,Map
- ArrayList,LinkedList
- TreeSet(紅黑樹),HashSet(散列),LinkedHashSet(散列+鏈表)
- TreeMap,HashMap,LinkedHashMap
- Stack,Queue,PriorityQueue
第十二章 異常處理
- 將“描述正常執(zhí)行過程中做什么事”和“發(fā)生問題怎么辦”的代碼隔離開。
- try-catch-finally
- 編譯時(shí)異常,Error,RuntimeException
- 異常鏈,嵌套異常
- 覆寫方法時(shí)候,只能拋出基類方法申明的異常
- 構(gòu)造器中發(fā)生異常,finally不一定起作用
第十三章 字符串
- String是不可變的對(duì)象
- +低效的原因:創(chuàng)建多個(gè)StringBuilder
- StringBuilder(非線程安全),StringBuffer(線程安全)
- Formatter
- 正則表達(dá)式
java正則表達(dá)式的轉(zhuǎn)義使用\,特殊字符表示也使用\,例如:
通常,
\d表示數(shù)字,正則中\\d匹配一位數(shù)字
通常,\\表示\,正則中\\\\匹配反斜線\
正則中換行\n\t不需要兩個(gè)反斜線
(-|\\+)?表示以一個(gè)加號(hào)或者減號(hào)開頭
量詞
貪婪型 所有量詞
非貪婪型 量詞后加問號(hào)
占有型(java特有) 量詞后加加號(hào)
如
| 貪婪型 | 貪婪 | 占有 |
|---|---|---|
| X? | X?? | X?+ |
| X* | X*? | X*+ |
| X+ | X+? | X++ |
X通常需要用圓括號(hào)擴(kuò)起來
第十四章 類型信息
- RTTI:Run-Time Type Information
- Class對(duì)象
- 類加載器
- instance of
- 反射
- 動(dòng)態(tài)代理 InvocatoinHandler
第十五章 泛型
- 定義泛型類,泛型方法
- 泛型擦除
- 在泛型代碼內(nèi)部,無法獲得任何有關(guān)泛型參數(shù)類型的信息
- 泛型類型只在靜態(tài)類型檢查期間出現(xiàn),之后被替換為非泛型上界
- 不能是實(shí)例化具有參數(shù)類型的數(shù)組
- 不能協(xié)變
- 通配符 <? extend T>
- 超類型通配符 <? super T>
- 無界通配符 <?>
- 指定上界(extend T)不能set->T;指定下界,get->obj
- 自限定類型
Class SelfB<T extends SelfB<T>>
第十六章 數(shù)組
- 多維數(shù)組
- Arrays常用方法:
deepEquals(),sort(),binarySearch(),fill()
其他
System.arraycopy()
第十七章 容器深入研究
- Collection/Map常用方法
- 數(shù)據(jù)結(jié)構(gòu)
| 容器 | 原理 | 特點(diǎn) |
|---|---|---|
HashMap |
散列表 | 無序,查找快 |
LinkedHashMap |
散列,鏈表 | 有序( 插入/LRU),迭代快 |
TreeMap |
紅黑樹 | 有序(指定順序) |
- 散列碼和散列函數(shù)
計(jì)算散列碼,散列碼將被映射為下標(biāo)(受容量和負(fù)載因子影響),Entry作為value,保存到數(shù)組中;為了解決散列沖突,數(shù)組中保存list(拉鏈法) - 生成有意義的
hashCode - 負(fù)載因子 =
size()/容量 - 持有引用
SoftRefenence,WeakRefenence,PhantomRefenence
第十八章 I/O系統(tǒng)
第十九章 枚舉類型
- 定義枚舉
- 枚舉實(shí)際都繼承自
java.lang.Enum -
values()方法是由編譯器添加的靜態(tài)方法 - 嵌套枚舉
-
EnumSet,EnumMap -
Enum內(nèi)定義抽象方法,由具體枚舉實(shí)現(xiàn) - 多路分發(fā)
第二十章 注解
- 定義注解
- 元注解
-
Target: 作用域 -
Retention: 生命周期 -
Documented: 注解包含在javadoc中 -
Inherited: 允許子類繼承父類的注解
- 編寫注解處理器
第二十一章 并發(fā)
- “效率”,“阻塞”
- 定義Tread
- 共享資源
所有對(duì)象自動(dòng)含有單一的鎖
sychronized
lock
volatile - 生命周期
新建,就緒,阻塞,死亡 - 進(jìn)入阻塞狀態(tài)
- sleep
- wait
- 阻塞式方法(io)
- 等待鎖