13
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2016-08-25

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を使用。
  • 出力結果も再実施。
13
14
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
14

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?