java效能優化方案2——避免使用正規表示式

kele2014發表於2017-12-16

2、避免使用正規表示式
正規表示式給人的印象是快捷簡便。但是在 N.O.P.E 分支中使用正規表示式將是最糟糕的決定。如果萬不得已非要在計算密集型程式碼中使用正規表示式的話,至少要將 Pattern 快取下來,避免反覆編譯Pattern。
static final Pattern HEAVY_REGEX =

Pattern.compile("(((X)*Y)*Z)*");

如果僅使用到了如下這樣簡單的正規表示式的話:
1 String[] parts = ipAddress.split(“.”);
這是最好還是用普通的 char[] 陣列或者是基於索引的操作。比如下面這段可讀性比較差的程式碼其實起到了相同的作用。
int length = ipAddress.length();
int offset = 0;
int part = 0;
for (int i = 0; i < length; i++) {

if (i == length - 1 ||
        ipAddress.charAt(i + 1) == `.`) {
    parts[part] =
        ipAddress.substring(offset, i + 1);
    part++;
    offset = i + 2;
}

}
上面的程式碼同時表明了過早的優化是沒有意義的。雖然與 split() 方法相比較,這段程式碼的可維護性比較差。
挑戰:聰明的小夥伴能想出更快的演算法嗎?
小結
正規表示式是十分有用,但是在使用時也要付出代價。尤其是在 N.O.P.E 分支深處時,要不惜一切程式碼避免使用正規表示式。還要小心各種使用到正規表示式的JDK字串方法,比如 String.replaceAll() 或 String.split()。可以選擇用比較流行的開發庫,比如 Apache Commons Lang 來進行字串操作。


相關文章