首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 性能優化實戰(二):字符串過濾極致優化之路

     編輯:Java 相關知識

需求

給定字符串,過濾非數字字符,要求耗時最小。測試環境:JDK 1.5.0_09,輸入 "D186783E36B721651E8AF96AB1C4000B",循環 1048576 次。

五個版本演進

版本核心優化耗時(秒)提升倍數
filter1String += char(最差)8.81-8.90基準
filter2StringBuffer.append()2.14-2.18~4x
filter3局部變量緩存 charAt/length1.48-1.52~30%
filter4StringBuffer 預分配容量1.33-1.39~10%
filter5char[] 直接操作 + 最後 new String0.72-0.78~50% (vs v4)

代碼對比

filter1(反面教材)

String strNew = "";
for (int i=0; i<strOld.length(); i++) {
    if ('0' <= strOld.charAt(i) && strOld.charAt(i) <= '9')
        strNew += strOld.charAt(i);  // 每次創建新 String 對象
}

filter5(極致版)

int nLen = strOld.length();
char[] chArray = new char[nLen];
int nPos = 0;
for (int i=0; i<nLen; i++) {
    char ch = strOld.charAt(i);
    if ('0' <= ch && ch <= '9') {
        chArray[nPos++] = ch;
    }
}
return new String(chArray, 0, nPos);

深度原理解析

  • filter1→2:避免字符串拼接產生大量臨時對象(堆分配 + GC 壓力)
  • filter2→3:消除重複方法調用開銷(微優化)
  • filter3→4:預分配內部 char[],避免擴容複製
  • filter4→5:省去 StringBuffer 對象本身(堆分配 + 初始化 + 後續 toString 複製),直接操作 char[],最終一次性構建結果 String

空間換時間的權衡

  • v4/v5 分配最大可能數組(輸入長度),若數字比例極低(<10%),空間浪費大
  • v4 可調整:new StringBuffer(nLen/10) 平衡空間
  • v5 難以動態調整,適合數字比例高(>50%)且極度追求速度場景
  • 通用建議:優先用 filter4,極端性能敏感且數據特徵明確時用 filter5

核心感悟

filter1→5 耗時相差 **12 倍**,除 filter3 是減少調用外,其餘均在 **減少內存分配**。可見堆內存分配對性能影響之大——這正是上一篇「基本類型 vs 引用類型」強調的棧 vs 堆差異。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved