JDK 源碼 閱讀 - 1

To be continuing....... 

持續修改中。。。。


1. StringBuffer

所處類層次


易忽略點:

- 這個類是線程安全的。 所有的method直接或間接加synchronized。 所以我們如果是單線程情況下也考慮到這個會不會影響到效率。當然可能JIT可以進行這個優化,待我接下來驗證。

- 默認情況下一個長爲16個字符的數組被創建來存儲字符串。



相關學習點:

- 當我們把Long, Integer 加到其中時。我們要先技術這個數字要多少個字符來存放。 這裏的小技巧即使 用正數來求,負數加一。在求正數時,從1位開始比較1位必定小於10,接下來2位的必定小於100,以此類推。在計算integer要佔的字符數時,邊界值是直接緩存於數組中的。


2. Integer/Long

相關學習點:

- 在 Long 的package 方法getChars中有一整數乘法的爲計算轉化。   例如 a * 100 可以轉化爲 (a<<6) + (a<<5) + (a<<2) 。 原因就是 100的二進制爲 1100100 。

- 在小於65536(10000 0000 0000 0000)的整數除10的整數運算中。我們可以把這個運算轉換爲快速的位運算。 a/10(整數運算)  --->  (a * 52429) >>> (16+3)。 這裏 1<< 19 = 524288.   52429/524288 = 0.10000038146972...   說到這就明白了。  但還是有一點是爲什麼選擇19,不是20也不是18. 原因是 52429 < 65536 ,  所以a 是16位內的數 52429乘上後不會越過整型的正數的界。同時取小於19的值 計算精度會低於取19。


3.TreeMap

存儲結構是紅黑二叉樹, 紅黑二叉樹是一種自平衡二叉樹。

  • 找到一個給定節點的後續節點

    如果這個給定節點有右子樹,很好說,後續節點就是右子樹的最大節點。也就是右子樹的最左的節點。

    如果這個節點沒有右子樹,那我們只能往他的父親節點回溯來找後續節點了。父節點如果左上,那父節點一定不是後續節點,因爲左上的節點是排序靠前的節點。那我們就一直往上追溯,直到能找到往右上發展的前輩節點。這樣給定的節點落在找到的前輩節點的左子樹裏。給定節點沒有右子樹,那麼給定節點就是找到的前輩節點的左子樹中最大的節點。這個找到的前輩節點就是給定的節點的後繼。

    在找往右上發展的節點時, 我們看程序裏分配了兩個變量, p , ch.  p指向父節點,ch指向兒子節點。 用p.right == ch來判斷p是不是左上父節點, 如果p.right == ch是true. 那p是在左上方向,我們還得往上追溯。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章