統計一段字串中每個字元出現的次數,使用 HashMap<Character, Integer> 是最直觀的寫法,但真的是最簡單、最高效的嗎?
由於字元本質上是整數 (ASCII/Unicode 碼點),利用整數陣列直接以字元碼值為索引計數,避免了 HashMap 的雜湊計算、物件封裝與自動裝箱拆箱開銷,效能顯著優於 Map。
public class CharCountDemo {
public static void main(String[] args) {
int[] counts = new int[256]; // 涵蓋擴展 ASCII
String text = "fdasjfksajfklsajfldas.asdfsadfjpiwe]wqdsafdsa][]afsda.fsafsa21341234";
for (char c : text.toCharArray()) {
counts[c]++; // 直接以字元當索引遞增
}
for (int i = 0; i < 256; i++) {
if (counts[i] != 0) {
System.out.println((char)i + " : " + counts[i]);
}
}
}
}
new int[Character.MAX_VALUE + 1]) 即可覆蓋所有 char 值。codePointAt 遍歷,搭配 Map<Integer, Long> 或外部庫 (如 FastUtil) 處理稀疏分佈。結論:對於固定字元集的計數任務,陣列索引法在時間與空間效率上完勝 Map,是首選實作。