JDK 原始碼 閱讀

2021-06-29 05:41:23 字數 878 閱讀 6353

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。

jdk原始碼閱讀 linkedlist

首先還是從建構函式開始 constructs an empty list.public linkedlist 是乙個空的 然後我們從add看 public boolean add e e 定位到linklast void linklast e e 觀察發現這個node是乙個雙向鍊錶,每乙個節點指著自...

JDK原始碼閱讀 Integer

先上一版字串轉數值的幾個方法的區別 parseint string s 解析字串數,10進製,返回int parseint string s,int radix 解析字串數,radix為指定進製,支援2 36進製 decode string nm 解析字串數,0開頭的為8進製,如010解析為2 0x...

JDK原始碼閱讀(三) LinkedHashMap

一 linkedhashmap原理 static class entryextends hashmap.node 二 hashmap分析 1 關鍵的屬性 表示linkedhashmap的頭節點 transient linkedhashmap.entryhead 表示尾節點 transient lin...