2011年7月12日 星期二

Effective Java 讀書筆記: Item 38 - 注意串接字串的效率

最近發覺不少人沒注意到這件事, 寫一下心得。

Joel 有寫一篇很長的描述, 說明串接字串的效率問題, 有興趣的話值得一讀。結論是, 若一直用 "+=" 的寫法 (或是 C 的 strcat ) 串接 N 個字串, 效率是 O(N^2)。Java 有提供 class StringBuffer 和 StringBuilder 提供 O(N) 的實作。做法是每次要 reallocate array 時就要兩倍的空間, 這樣 amortized time 就會是 O(N)。並且最多只浪費一半的空間。

StringBuffer 和 StringBuilder 都是繼承 AbstractStringBuilder, 將主要運算轉包給父類別。兩者的差別是 StringBuffer 的方法有加上 synchronized, 也就是說, StringBuffer 是 thread-safe, 而 StringBuilder 不是。所以, 在使用單一 thread 的情況下 (通常如此), 應該使用 StringBuilder 以獲得較快的時間。

附帶一提, 若目的是 join 的話, 用 Apache Commons LangStringUtils.join() 會比自己用 StringBuilder 刻來得省事。

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...