第45條:將局部變量的作用域最小化
要使局部變量的作用域最小化,最有力的方法就是在第一次使用它的時(shí)候聲明。
第46條:for-each循環(huán)優(yōu)先于傳統(tǒng)的for循環(huán)
Java1.5發(fā)行版本引進(jìn)了的for-each循環(huán),通過完全隱藏迭代器或者索引變量,避免了混亂和出錯(cuò)的可能。這種模式適用于集合和數(shù)組:
for(Element e : elements){
doSomething(e);
}
for-each循環(huán)可以遍歷集合和數(shù)組,還讓你遍歷任何實(shí)現(xiàn)Iterable接口的對(duì)象。
有三種情況無法使用for-each:
1.過濾——如果需要遍歷集合,并刪除選定的元素,就需要使用顯式的迭代器,以便可以使用remove方法。
2.轉(zhuǎn)化——如果需要遍歷列表或者數(shù)組,并取代它部分或者全部的元素值,就需要列表迭代器或者數(shù)組索引,以便設(shè)定元素的值。
3.平行迭代——如果需要并行地遍歷多個(gè)集合,就需要顯式地控制迭代器或者索引變量,以便所有迭代器或者索引變量都可以得到同步前移。
第47條:了解和使用類庫(kù)
集合、字符串、多線程、文件IO
熟悉java.lang、java.util、java.io
第48條:如果需要精確的答案,請(qǐng)避免使用float和double
使用BigDecimal類型來代替double,但是性能不好。
第49條:基本類型優(yōu)先于裝箱基本類型
每一個(gè)基本類型都對(duì)應(yīng)一個(gè)引用類型,稱為基本裝箱類型。
自動(dòng)裝箱和自動(dòng)拆箱
基本類型和裝箱類型的區(qū)別:
1.基本類型只有值,而裝箱類型則具有與它們的值不同的同一性。(兩個(gè)裝箱基本類型可以具有相同的值,但是不同的同一性,也就是說引用不同)
2.基本類型只有功能完備的值,而每個(gè)裝箱基本類型除了它對(duì)應(yīng)基本類型的所有功能之外,還有一個(gè)非功能值:null。
3.基本類型通常比裝箱基本類型更節(jié)省時(shí)間和空間。
什么時(shí)候應(yīng)該使用裝箱基本類型?
1.作為集合中的元素、鍵和值。
2.在進(jìn)行反射的方法調(diào)用
總之,基本類型要優(yōu)于裝箱基本類型。基本類型更加簡(jiǎn)單,也更加快速。
第50條:如果其他類型更合適,則盡量避免使用字符串
字符串不適合代替其他的值類型。
字符串不適合代替枚舉類型。
字符串不適合代替聚集類型。
字符串不適合代替能力表。
第51條:當(dāng)心字符串連接的性能
當(dāng)兩個(gè)字符串被連接在一起時(shí),它們的內(nèi)容都要被拷貝。
使用StringBuilder代替。
編譯器會(huì)優(yōu)化。
第52條:通過接口引用對(duì)象
應(yīng)該優(yōu)先使用接口而不是類來引用對(duì)象。
List<String> lists = new ArrayList<String>();
可以方便的改變實(shí)現(xiàn)。
第53條:接口優(yōu)先于反射機(jī)制
反射機(jī)制:通過程序訪問類的成員名稱、域類型、方法簽名等信息
反射機(jī)制允許一個(gè)類使用另一個(gè)類,即使當(dāng)前者類被編譯的時(shí)候,后者根本不存在。但是,這種能力是需要付出代價(jià)的:
喪失了編譯時(shí)類型檢查的好處;
執(zhí)行反射訪問所需要的代碼非常笨拙和冗長(zhǎng);
性能損失。
第54條:謹(jǐn)慎地使用本地方法
使用本地方法來提高性能的做法不值得提倡
本地方法是不安全的。
如果你必須要使用本地方法來訪問底層的資源,或者遺留代碼庫(kù),也要盡可能少用本地代碼,并且要全面進(jìn)行測(cè)試。
第55條:謹(jǐn)慎地進(jìn)行優(yōu)化
在優(yōu)化方面,我們應(yīng)該遵守兩條規(guī)則:
1.不要進(jìn)行優(yōu)化
2.還是不要進(jìn)行優(yōu)化
第56條:遵守普遍接受的命名規(guī)則
標(biāo)識(shí)符類型 | 例子 |
---|---|
包 | com.google.inject |
類或者方法 | Timer,FutureTask |
方法或者域 | remove,ensureCapacity |
常量域 | MIN_VALUE |
局部變量 | i, xref |
類型參數(shù) | T,K |