Help us understand the problem. What is going on with this article?

String型変数が数字であるかチェックする方法の速さ比較

More than 3 years have passed since last update.

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を使用。
  • 出力結果も再実施。
java-beginner
ハンドルネーム「Javaを復習する初心者」です。
http://java-beginner.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away