String型変数が数字である(0から9で構成されている)かチェックする方法がいくつかあります。この記事では以下の方法の速さを比較しました。
- Character#isDigit()メソッドを使う。
- Integer#parseInt()メソッドを使う。
- String#matches()メソッドを使う。
実行環境は以下の通りです。
- DELL VOSTRO 1540
- Windows 10 Pro 32bit
- Intel Celelron 2.00 GHZ
- メモリ 2.0GB
- HDは約300GB
#ソースと実行結果
以下のソースを使って比較しました。引数が数字で構成されているかのチェックです。各チェック方法を300000回ずつ繰り返し、経過したミリ秒を出力しています。
ソース
package test;
import java.util.function.BooleanSupplier;
public class Test {
private final static String reg = "\\d+";
private static String input;
// --計測用--
private void printProcessingTime(BooleanSupplier f) {
int count = 300000;
long start, end;
start = System.currentTimeMillis();
for (int i = 0; i < count; i++) {
f.getAsBoolean();
}
end = System.currentTimeMillis();
System.out.printf("出力確認:%s, 計測 %3d: ", f.getAsBoolean(), end - start);
System.out.println();
}
// --計測--
public static void main(String[] args) {
input = args[0];
System.out.println("入力値:" + input);
new Test().test();
}
private void test() {
System.out.println("test1");
printProcessingTime(() -> {
boolean isDigit = true;
for (int i = 0; i < input.length(); i++) {
isDigit = Character.isDigit(input.charAt(i));
if (!isDigit) {
break;
}
}
return isDigit;
});
System.out.println("test2");
printProcessingTime(() -> {
boolean isDigit = true;
try {
Integer.parseInt(input);
} catch (Exception e) {
isDigit = false;
}
return isDigit;
});
System.out.println("test3");
printProcessingTime(() -> {
return input.matches(reg);
});
}
}
数字のみでの結果
入力値:1234567
test1
出力確認:true, 計測 31:
test2
出力確認:true, 計測 46:
test3
出力確認:true, 計測 271:
文字を含めた結果
入力値:123456a
test1
出力確認:false, 計測 31:
test2
出力確認:false, 計測 778:
test3
出力確認:false, 計測 272:
Character#isDigit()メソッドを使うのが一番早いという結果が出ました。文字を含めた場合は特に差が付きました。
##全角数字についての追記
@saka1029 さんからコメントを頂いた通り、上記の場合、正規表現は半角数値のみでした。正規表現を以下に変えて再実施しました。
正規表現定義の箇所
private final static String reg = "[\\d0-9]+";
全角数字のみ
入力値:1234567890
test1
出力確認:true, 計測 57:
test2
出力確認:true, 計測 74:
test3
出力確認:true, 計測 508:
最後「あ」
入力値:1234567890あ
test1
出力確認:false, 計測 64:
test2
出力確認:false, 計測 851:
test3
出力確認:false, 計測 476:
#修正履歴
20161009
- ソースを修正し、java.util.functionを使用。
- 出力結果も再実施。