Javaで末尾の全角/半角スペースをトリムする
夜も遅いっていうか、もう朝なので簡単にメモ。
Javaで文末の全角半角スペースをトリムするという、実に簡単な実装なんだけど、いくつか実装方法があって、性能としてどれが最も優れているか気になったので、テストしてみました。実装方法は以下の3つ。
- 正規表現(String#replaceAll)
- StringBuilderで後方から走査して、半角/全角スペースの場合は削除する
- char配列で後方から走査して、半角/全角スペースでない場合は新しいchar配列に格納する。
上記の実装をstaticメソッドにして、それぞれ1000回ずつ呼び出して、プロファイルしてみました。環境はMac OS 10.5、JDK1.5、NetBeans 6.5です。
結果は、3>2>1の順で高速に動きました。1は正規表現を使っているので最も遅かったですね。
- 正規表現:7.85ms
- StringBuilder:2.45ms
- char配列:0.464ms
正直、StringBuilderとchar配列でここまで差が出るとは思わなかった。配列とStringでインスタンスを2回作るので2と3はそんなに差が出ないと思ったんですけどね。何事もやってみるもんです。
以下はソース。乱暴に書いてます。
public class Main {
private static final String VALUE = "あいう ";
public static void main(String[] args) {
for(int i = 0; i < 1000; i++) {
trim1(VALUE);
}
for(int i = 0; i < 1000; i++) {
trim2(VALUE);
}
for(int i = 0; i < 1000; i++) {
trim3(VALUE);
}
}
public static String trim1(String value) {
return value.replaceAll("( | )+\\z", "");
}
public static String trim2(String value) {
StringBuilder sb = new StringBuilder(value);
for(int i = sb.length()-1; 0 <= i; i--) {
char c = sb.charAt(i);
if(c == ' ' || c == ' ') sb.deleteCharAt(i);
else break;
}
return sb.toString();
}
public static String trim3(String value) {
char[] ary = value.toCharArray();
char[] trimed = new char[ary.length];
for(int i = ary.length-1; 0 <= i; i--) {
if(ary[i] == ' ' || ary[i] == ' ') continue;
else trimed[i] = ary[i];
}
return new String(trimed);
}
}