從《Java開發手冊》面世以來,從最開始的版本到現在的泰山版,每一個版本我都學習過。如果說要我從中總結出一些經驗來,那麼我對《Java開發手冊》的學習分成了三個階段:閱讀、實操與理解。
一、閱讀階段
所謂的閱讀階段,在我看來就是之前從沒遇到過、也從未了解過的規約,通過《Java開發手冊》的閱讀瞭解到相關知識,之後在項目中遇到了,再返回來閱讀,以避免開發中可能存在的問題。比如編碼規則中關於併發處理處理的這部分規則,在項目開發中我還未曾真正使用到併發和線程。那麼我在看併發處理這部分規則時,我只是能大致閱讀,知道有這部分規約的存在。以後項目中如果有用到併發和線程時,我再回過頭來再次閱讀這部分規約,以避免開發中可能存在的問題。
二、實操階段
所謂的實操階段,也就是在閱讀規約之後,在項目中確實遇到規約中的問題,運用規約中的知識進行項目開發的過程。舉例來說,在編程規約的集合處理中有這麼一條
【推薦】集合初始化時,指定集合初始值大小。 說明:HashMap使用HashMap(int initialCapacity) 初始化,如果暫時無法確定集合大小,那麼指定默認值(16)即可。
看到這條規約之後,在之後的項目開發中就不自覺的會在新建 Map 對象時加上初始化大小。例如:
Map<String, Object> resultMap = new HashMap<>(8);
到了這一步,閱讀《Java開發手冊》也就開始出現成效了。
三、理解階段
所謂的理解階段,就是在實操之後,再次閱讀《Java開發手冊》時,發現原先的代碼與現在的理解有出路,甚至是發現原先的理解是錯誤的。回到實操階段的例子,沒有再次閱讀規約的時候,我覺得給新建 Map 對象進行初始化大小是沒錯的。於是當我有四個元素需要放在 Map 對象中時,我是這麼創建 Map 對象的。
Map<String, Object> resultMap = new HashMap<>(4);
即,Map 初始化大小就是元素的個數。
而當我這次回過頭來重新閱讀規約時,我注意到了負載因子這四個字。規約上是這麼寫的:
正例:initialCapacity = (需要存儲的元素個數 / 負載因子) + 1。注意負載因子(即loader factor)默認為0.75,如果暫時無法確定初始值大小,請設置為16(即默認值)。
所謂負載因子就是當容量到達一個數值之後,容量就開始擴大。比如,設置初始化大小為8,負載因子為0.75,0.75 * 8 = 6,那麼當容量到達6的時候,容量就會開始擴大,而不是元素數量到達8的時候才進行擴大。理解負載因子之後,我發現當初設置初始化大小的時候出現了錯誤,應該設置更大一些。舉個例子,默認負載因子為0.75,Map 中需要放置的元素個數為 4,那麼需要設置 Map 的初始化大小為 5.33。之前看過《碼出高效》,建議初始化大小的數值為2的倍數,即此次初始化大小應該為 8。
總結:我認為從閱讀到實操再到理解是一個過程,是一個從學習到成長的過程。只要勇於邁出第一步,接下來就會有驚喜和收穫。