第一章萌庆、Java 開(kāi)發(fā)中通用的方法和準(zhǔn)則
建議1:不要在常量和變量中出現(xiàn)易混淆的字母佩研;// long i = 1l;
建議2:莫讓常量蛻變成變量;
建議3:三元操作符的類型務(wù)必一致; //三元操作符轉(zhuǎn)換規(guī)則;
建議4:避免帶有可變參數(shù)的方法重載尽狠;
建議5:別讓null值和空值威脅到變長(zhǎng)方法;
建議6:覆寫可變參數(shù)方法規(guī)則
// 1不能縮小訪問(wèn)權(quán)限叶圃;2參數(shù)列表必須相同袄膏;3返回類型相同或其子類;4異常不能超過(guò)父類的范圍或不拋異常
建議7:警惕自增陷阱 //i = i++;
建議8:不要讓舊語(yǔ)法困擾你掺冠;//goto 語(yǔ)法
建議9:少用靜態(tài)導(dǎo)入沉馆;
//靜態(tài)導(dǎo)入規(guī)則:1不使用通配符,除非導(dǎo)入靜態(tài)常量類德崭;
建議10:不要在本類中覆蓋靜態(tài)導(dǎo)入的變量和方法斥黑;
建議11:顯示增加serialVersionUID //序列化 反序列化問(wèn)題
建議12:避免在序列化類中使用構(gòu)造函數(shù)為不變量賦值;//final修飾的變量接癌;
//靜態(tài)變量不會(huì)序列化心赶;
//反序列化時(shí)構(gòu)造函數(shù)不會(huì)執(zhí)行;
建議13:避免未final變量復(fù)雜賦值缺猛;
//序列化文件內(nèi)容:
1、類描述信息:路徑椭符,繼承關(guān)系荔燎,訪問(wèn)權(quán)限,變量描述销钝,變量訪問(wèn)權(quán)限有咨,變量關(guān)聯(lián)類信息等;
2蒸健、非transient 和非static的實(shí)例變量座享;
//反序列化 final變量不被賦值的情況:
1通過(guò)構(gòu)造方法賦值;2通過(guò)方法返還賦值似忧;3final修飾的屬性不是基本數(shù)據(jù)類型
建議14:序列化的私有方法解決部分屬性持久化問(wèn)題 //writeObject readOject
//transient 不能分布式部署渣叛;
建議15:break萬(wàn)萬(wàn)不能忘
建議16:易變業(yè)務(wù)使用腳本語(yǔ)言編寫?
建議17:慎用動(dòng)態(tài)編譯 //Java6支持
建議18:避免instanceof非預(yù)期結(jié)果 //instanceof只能用于對(duì)象類型
建議19:斷言不是雞肋盯捌;//默認(rèn)不啟用淳衙;
不使用斷言情況:對(duì)外公開(kāi)方法中;執(zhí)行邏輯代碼的情況下;
使用assert的情況:私有方法中入?yún)⑿r?yàn)箫攀;流程控制不可達(dá)區(qū)域肠牲;建立程序探針;
建議20:不只要替換一個(gè)類 //整體war包發(fā)布
對(duì)于final修飾的基本類型和String類型靴跛,編譯器認(rèn)為是穩(wěn)定態(tài)缀雳,直接編譯到字節(jié)碼中,避免運(yùn)行期引用梢睛;
本章重點(diǎn):3俏险、4、5扬绪、7 竖独、20序列化:11、12挤牛、13莹痢、14;
第二章墓赴、基本類型
建議21:用偶判斷竞膳,不用奇判斷 // i %2 == 1 ? “奇數(shù)” : “偶數(shù)”
建議22:用整數(shù)類型處理貨幣诫硕;
建議23:不要讓類型自動(dòng)轉(zhuǎn)換坦辟;//主動(dòng)聲明 // int long
建議24:邊界,邊界 // int 數(shù)據(jù)類型邊界
建議25:不要讓四舍五入虧了一方//Math.round — RoundingMode
建議26:堤防包裝類型的null ;//List.add(null); //
包裝類型參數(shù)運(yùn)算時(shí)要校驗(yàn)非null
建議27:謹(jǐn)慎包裝類型的大小比較章办;// ==基本數(shù)據(jù)相等锉走,對(duì)象類型比較地址,包裝類型為對(duì)象
建議28:優(yōu)先使用整型池藕届;//IntegerCache原理 //對(duì)象類型是否相等 使用equals 而非 ==
建議29:優(yōu)先選擇基本類型挪蹭;
//自動(dòng)裝箱的原則:基本類型可以優(yōu)先加寬,在轉(zhuǎn)變成寬類型的包裝類型休偶,不能直接變成寬類型的包裝類型梁厉;
建議30:不要隨便設(shè)置隨機(jī)種子 //Random(); // System.nanoTime
第三章、類踏兜、對(duì)象及方法词顾;
建議31:不要在接口中寫實(shí)現(xiàn)代碼;
建議32:靜態(tài)變量要先聲明后實(shí)現(xiàn)碱妆; //靜態(tài)代碼塊
建議33:不要復(fù)寫靜態(tài)方法 //對(duì)象調(diào)用靜態(tài)方法 肉盹,通過(guò)表面類型找到方法的入口
建議34:構(gòu)造函數(shù)盡量簡(jiǎn)化
建議35:避免在構(gòu)造函數(shù)中初始化其他類
建議36:使用構(gòu)造代碼塊精煉程序 // 構(gòu)造代碼塊 先與 構(gòu)造函數(shù) 代碼
//普通代碼塊 — 方法;靜態(tài)代碼塊static{}山橄;同步代碼塊synchronied{}垮媒;構(gòu)造函數(shù){}舍悯;
//應(yīng)用場(chǎng)景:初始化實(shí)例變量— 每個(gè)構(gòu)造函數(shù)都要初始化;初始化實(shí)例環(huán)境睡雇;
建議37:構(gòu)造代碼塊會(huì)想你所想 //構(gòu)造代碼塊— 構(gòu)造函數(shù)的共同量
如果構(gòu)造函數(shù)調(diào)用構(gòu)造函數(shù)萌衬,構(gòu)造代碼只會(huì)執(zhí)行一次;
建議38:使用靜態(tài)內(nèi)部類提高封裝性
//靜態(tài)內(nèi)部類和內(nèi)部類的區(qū)別:
//1靜態(tài)內(nèi)部類不持有外部?jī)?nèi)的引用;2靜態(tài)內(nèi)部類不依賴外部類它抱;3普通內(nèi)部類不能聲明static的方法和變量秕豫;
建議39:使用匿名類的構(gòu)造函數(shù)
// new ArrayList(){}; //new ArrayList(){{}};
建議40:匿名類的構(gòu)造函數(shù)很特殊 //new A(1,2){{ //….}};
//調(diào)父類同參構(gòu)造函數(shù),然后調(diào)用自己的構(gòu)造代碼塊观蓄;
建議41:讓多繼承成為現(xiàn)實(shí)混移; //繼承 實(shí)現(xiàn)
//內(nèi)部類可以繼承一個(gè)與外部類無(wú)關(guān)的類,保證內(nèi)部類的獨(dú)立性侮穿;
建議42:讓工具類不可實(shí)例化 // 構(gòu)造函數(shù)私有化歌径,并拋異常
建議43:避免對(duì)象的淺拷貝;//Clonealbe接口 clone()方法亲茅;
//拷貝規(guī)則:基本數(shù)據(jù)類型 拷貝值回铛;實(shí)例對(duì)象拷貝地址引用;字符串:修改時(shí)會(huì)從字符串池中重新生成新的字符串克锣;
建議44:推薦使用序列化實(shí)現(xiàn)對(duì)象的拷貝茵肃;//只需要Serializable;
//注意:對(duì)象的內(nèi)部屬性都是可序列化的;方法和屬性的特殊修飾符袭祟;final验残、static問(wèn)題,transient
建議45:覆寫equals方法時(shí)不要識(shí)別不出自己巾乳;
建議46:equals應(yīng)該考慮null值情景您没;
建議47:在equals中使用getClass進(jìn)行類型判斷; // instanceof 類可能被繼承的情況想鹰?紊婉?
建議48:覆寫equals方法必須覆寫hashCode方法;
建議49:推薦覆寫toString方法
建議50:使用package-info類為包服務(wù)辑舷;//??
建議51:不要主動(dòng)進(jìn)行垃圾回收;//System.gc 要停止所有的響應(yīng)才能檢查內(nèi)存中是否有可回收的對(duì)象槽片;
第四章 字符串
建議52:推薦使用String直接量賦值何缓;
建議53:注意方法中的參數(shù)要求;//API 不同版本參數(shù)不一樣还栓;參數(shù)一樣含義不一樣碌廓;
建議54:正確使用String、StringBuffer剩盒、StringBuilder;
建議55:注意字符串的位置谷婆;// 字符串連接 +
建議56:自由選擇字符串的拼接方法 // + | concat | StringBuffer
建議57:復(fù)雜字符串操作中使用正則表達(dá)式;
建議58:建議使用UTF編碼;
建議59:字符串排序纪挎;如果不是關(guān)鍵算法使用Collator類即可期贫;//漢子轉(zhuǎn)拼音在排序;
第5章 數(shù)組和集合
建議60:性能考慮异袄,數(shù)組首選;//集合會(huì)自動(dòng)裝箱拆箱
建議61:若有必要使用變長(zhǎng)數(shù)組烤蜕;//Arrays.copyOf
建議62:警惕數(shù)組的淺拷貝封孙;//Arrays.copyOf
建議63:在明確的場(chǎng)景下,為集合指定初始容量讽营; //擴(kuò)展因子
建議64:最值算法虎忌;//集合最簡(jiǎn)單;數(shù)組效率最高橱鹏;
建議65:避開(kāi)基本類型數(shù)組轉(zhuǎn)換列表陷阱膜蠢;//Arrays.asList(..);基本數(shù)據(jù)類型不能泛型;
建議66:asList方法產(chǎn)生的List對(duì)象不可更改//不能更改長(zhǎng)度蚀瘸;
建議67:不同的列表選擇不同的遍歷方法狡蝶;//實(shí)現(xiàn)RandomAccess 用下標(biāo)遍歷;有序存取用foreach贮勃;//ArrayList
建議68:頻繁插入和刪除時(shí)使用LinkedList;//大量修改元素贪惹,ArrayList效率高;
建議69:列表相等只需關(guān)心元素?cái)?shù)據(jù) //AbstractList equals 比較各個(gè)元素是否相等寂嘉;
建議70:子列表只是原列表的一個(gè)視圖奏瞬;//subLi產(chǎn)生的列表只是一個(gè)視圖;修改動(dòng)作直接作用于原列表泉孩;
建議71:推薦使用sublist處理局部列表硼端;
建議72:生成子列表后不要在操作原列表;
建議73:使用Comparator進(jìn)行排序寓搬;//Comparable接口可作為實(shí)現(xiàn)類的默認(rèn)排序法珍昨;Comparator擴(kuò)展性更強(qiáng);
建議74:不推薦使用binarySearch對(duì)類別進(jìn)行檢索句喷; //二分查找比indexOf遍歷效率高镣典;
建議75:集合中的元素必須做到compareTo和equals同步;//實(shí)現(xiàn)了 compareTo方法就應(yīng)該覆寫equals方法確保兩者同步唾琼;
建議76:集合運(yùn)算時(shí)使用更優(yōu)雅的方式兄春;//并集 addAll retainAll removeAll
建議77:使用shuffle打亂列表;//Collections.shuffle();
建議78:減少HashMap中元素的數(shù)量//HashMap 比ArrayList進(jìn)行封裝
建議79:集合中的哈希碼不要重復(fù)锡溯;
建議80:多線程使用Vector或HashTable;
建議81:非穩(wěn)定排序推薦使用List //TreeSet適用于不變量排序赶舆;
建議82:集合大家族哑姚;
List:ArrayList(動(dòng)態(tài)數(shù)組),LinkedList(雙向鏈表),Vector(線程安全的動(dòng)態(tài)數(shù)組),Stack(對(duì)象棧)
Set:EnumSet(枚舉類型)HashSet,TreeSet(自動(dòng)排序,實(shí)現(xiàn)了SortedSet)
Map:排序Map:TreeMap(根據(jù)Key自動(dòng)排序)非排序Map:HashMap,HashTable,Properties,EnumMap(Key為枚舉類型)
WeakHashMap— 弱鍵實(shí)現(xiàn)Map
Queue:阻塞隊(duì)列:ArrayBlockingQueue(數(shù)組)PriorityBlockingQueue(優(yōu)先級(jí))LinkedBlockingQueue(鏈表)
非阻塞無(wú)邊界隊(duì)列:PriorityQueue;
工具類:Arrays,Array,Collections;
第6章 枚舉和注解
建議83:推薦使用枚舉定義常量
//枚舉常量更簡(jiǎn)單芜茵;枚舉常量屬于穩(wěn)定態(tài)叙量;可以自定義方法
建議84:使用構(gòu)造函數(shù)協(xié)助描述枚舉
建議85:小心switch帶來(lái)的空值異常 //傳入值為空
建議86:在switch的default代碼中增加AssertionError錯(cuò)誤;//避免枚舉類型增加引入問(wèn)題
建議87:使用valueOf前必須進(jìn)行校驗(yàn) // 如果找不到匹配的值會(huì)報(bào)異常夕晓;
//try catch //擴(kuò)展枚舉類 重寫contains方法
建議88:用枚舉實(shí)現(xiàn)共產(chǎn)方法模式更簡(jiǎn)潔
//枚舉非靜態(tài)方法實(shí)現(xiàn)宛乃,switch; //抽象方法生成產(chǎn)品蒸辆; 枚舉實(shí)現(xiàn)抽象方法征炼;
//枚舉共產(chǎn)方法的優(yōu)點(diǎn):避免錯(cuò)誤調(diào)用;性能好躬贡,使用便捷谆奥;減低類間耦合;
建議89:枚舉的數(shù)量限制在64個(gè)以內(nèi)拂玻;//數(shù)量小于64使用RegularEnumSet;對(duì)于64使用JumboEnumSet
建議90:小心注解繼承 //@Inherited 標(biāo)示可以被自動(dòng)繼承酸些;
//利:注解只要標(biāo)注到父類所有的子類都會(huì)自動(dòng)具有父類相同的注解;弊:閱讀子類代碼不能理解邏輯為何會(huì)改變檐蚜;
建議91:枚舉和注解結(jié)合使用威力更大魄懂;//權(quán)限管理
建議92:注意@Override不同版本的區(qū)別;//1.5 父類必須是一個(gè)類不能是接口闯第;1.6做了修正市栗;
第7章 泛型和反射
建議93:Java的泛型是類型擦除的 //編譯時(shí)有效;原因:延續(xù)到運(yùn)行期JVM需要大量重構(gòu)咳短;版本兼容填帽;
//泛型的class對(duì)象時(shí)相同的;泛型數(shù)組初始化時(shí)不能聲明泛型類型咙好;instanceof不允許存在泛型參數(shù)篡腌;
建議94:不能初始化泛型參數(shù)和數(shù)組 //初始化前必須有明確的類型;
建議95:強(qiáng)制聲明泛型的實(shí)際類型 //無(wú)法從代碼中推斷出泛型類型的情況下勾效,即可強(qiáng)制聲明泛型類型嘹悼;
建議96:不同場(chǎng)景使用不同的泛型通配符 // ?; ? supper E ; ? extends E
建議97:警惕泛型是不能協(xié)變和逆變的 // 可以使用通配符;
建議98:建議采用的順序是List<T>,List<?>,List<Object>
建議99:嚴(yán)格限定泛型類型采用多重界限 //只有上邊界才有此限定
使用&符號(hào)設(shè)定多重邊界层宫;<T exteds Staff & Passenger >
建議100:數(shù)組的真實(shí)類型必須是泛型類型的子類型绘迁;
建議101:注意Class類的特殊性 //無(wú)構(gòu)造函數(shù);可以表述基本類型卒密;其對(duì)象都是單例模式;
建議102:適時(shí)選擇getDeclaredXxx 和getXxx
getXxx 獲取所有public訪問(wèn)級(jí)別的棠赛;getDeclaredXxx 獲取自身所有的哮奇;
建議103:反射訪問(wèn)屬性或方法時(shí)將Accessible設(shè)置為true //Accessible 是否進(jìn)行安全檢查
建議104:使用forName動(dòng)態(tài) //只是加載一個(gè)類到內(nèi)存中膛腐,只會(huì)初始化static代碼
建議105:動(dòng)態(tài)加載不適合數(shù)組 //使用Array反射類來(lái)動(dòng)態(tài)加載
建議106:動(dòng)態(tài)代理可以使代理模式更加靈活 //InvocationHandler接口 Proxy
建議107:使用反射增加裝飾模式的普適性
建議108:反射讓模板方法模式更強(qiáng)大
建議109:不需要太多關(guān)注反射效率 // 不要因?yàn)樾实投挥?/p>
第8章 異常
建議110:提倡異常封裝 //一次拋出多個(gè)異常
建議111:采用異常鏈傳遞異常
建議112:受檢異常盡可能轉(zhuǎn)化為非受檢異常
建議113:不要在finally中處理返回值
建議114:不要在構(gòu)造函數(shù)中拋出異常 //錯(cuò)誤(Error)拋出;非受檢異常(RuntimeException)不要拋出鼎俘;受檢異常(Exception)盡量不要拋出
建議115:使用Throwable獲取棧信息
建議116:異常只為異常服務(wù)
建議117:多使用異常哲身,把性能問(wèn)題放一邊
第9章 多線程和并發(fā)
建議118:不推薦覆寫start方法
建議119:?jiǎn)?dòng)線程前stop方法不可靠的
建議120:不使用stop方法停止線程 //stop過(guò)時(shí);stop導(dǎo)致代碼邏輯不完整贸伐;stop方法會(huì)破壞原子邏輯勘天;
//解決辦法:自行編碼實(shí)現(xiàn) run方法;使用線程池捉邢,通過(guò)shutdown關(guān)閉脯丝;
建議121:線程優(yōu)先級(jí)只使用三個(gè)等級(jí) ;//并不是嚴(yán)格按照優(yōu)先級(jí)別來(lái)執(zhí)行伏伐;級(jí)別差距越大運(yùn)行機(jī)會(huì)差別越明顯宠进;
//推薦使用MIN_PRIORITY,NORM_PRIORITY,MAX_PRIORITY
建議122:使用線程異常處理器提升系統(tǒng)可靠性 //TcpServerExceptionHandler
建議123:volatile不能保證數(shù)據(jù)同步 //只能保證線程獲得最新值
建議124:異步運(yùn)算考慮使用Callable接口;//優(yōu)點(diǎn):盡可能多的占用系統(tǒng)資源藐翎;監(jiān)控線程執(zhí)行情況材蹬;
建議125:優(yōu)先選擇線程池
建議126:適時(shí)選擇不同的線程池來(lái)實(shí)現(xiàn) //ThreadPoolExecutor ScheduledThreadPoolExecutor Executores
建議127:Lock與synchronized是不一樣的
//lock支持更細(xì)粒度的鎖控制;Lock是無(wú)阻塞鎖吝镣,synchronized是阻塞鎖堤器;Lock可實(shí)現(xiàn)公平鎖;Lock是代碼級(jí)別的末贾,synchronized是JVM級(jí)的
建議128:預(yù)防線程死鎖 //避免或減少資源共享闸溃;使用自旋鎖;
建議129:適當(dāng)設(shè)置阻塞隊(duì)列長(zhǎng)度 //阻塞隊(duì)列容量是固定的未舟,非阻塞隊(duì)列是變長(zhǎng)的圈暗;
建議130:使用CountDownLatch協(xié)調(diào)子線程
建議131:CyclicBarrier讓多線程起步走
第10章 性能和效率
建議132:提示Java性能的基本方法
1、不要在循環(huán)條件中計(jì)算
2裕膀、盡可能把變量员串、方法生命為final static類型
3、縮小變量的作用范圍昼扛;//能定義在方法內(nèi)就在方法內(nèi)定義寸齐;循環(huán)體,try catch代碼塊都是如此抄谐,加快GC
4渺鹦、頻繁字符串操作使用StringBuilder或者StringBuffer
5、使用非線性檢索
6蛹含、復(fù)寫Exception的fillInStatckTrace方法
7毅厚、不建立冗余對(duì)象
建議133:弱非必要,不要克隆對(duì)象
建議134:“望聞問(wèn)切”方式診斷性能
建議135:定義性能衡量標(biāo)準(zhǔn)
建議136:解決首要系統(tǒng)性能問(wèn)題
建議137:跳轉(zhuǎn)JVM參數(shù)提升性能
建議138:性能是個(gè)大“咕咚”
第11章 開(kāi)源世界
建議139:大膽采用開(kāi)源工具浦箱;
建議140:推薦使用Guava擴(kuò)展工具包
建議141:Apache擴(kuò)展包 //Lang
建議142:推薦使用Joda日期時(shí)間擴(kuò)展包
建議143:選擇多種Collections擴(kuò)展 // fastutil Trove lambdaj
第12章 思想為源
建議144:提倡良好的代碼風(fēng)格 //整潔 統(tǒng)一 流行 便捷
建議145:不要完全依靠單元測(cè)試來(lái)發(fā)現(xiàn)問(wèn)題
建議146:讓注釋正確吸耿、清晰祠锣、簡(jiǎn)潔
建議147:讓接口職責(zé)保持單一 //單一責(zé)任原則
建議148:增強(qiáng)類的可替換性 //里氏替換原則
完全實(shí)現(xiàn)父類的方法;前置條件可以放大(入?yún)ⅲ┭拾玻缓笾脳l件可以被縮邪橥(返回值)
建議149:依賴抽象而不是實(shí)現(xiàn)
建議150:拋棄7條不良的編碼習(xí)慣
自由格式的代碼;不使用抽象的代碼妆棒;彰顯個(gè)性的代碼澡腾;
死代碼;冗余代碼糕珊;拒絕變化的代碼动分;自以為是的代碼;
建議151:以技術(shù)人員自律而不是工人
屬性工具放接;使用IDE刺啦;堅(jiān)持編碼;編碼前思考纠脾;堅(jiān)持重構(gòu)玛瘸;
多寫文檔;保持程序版本的簡(jiǎn)單性苟蹈;做好備份糊渊;做單元測(cè)試;
不要重復(fù)發(fā)明輪子慧脱;不要拷貝渺绒;讓代碼充滿靈性;測(cè)試自動(dòng)化菱鸥;
做壓力測(cè)試宗兼;“剽竊”不可恥;堅(jiān)持向敏捷學(xué)習(xí)氮采;重里更重面殷绍;
分享;刨根問(wèn)底鹊漠;橫向擴(kuò)展主到;