What's the best way to check if a String represents an integer in Java?

后端 未结 30 1477
野趣味
野趣味 2020-11-22 05:45

I normally use the following idiom to check if a String can be converted to an integer.

public boolean isInteger( String input ) {
    try {
        Integer.         


        
30条回答
  •  醉酒成梦
    2020-11-22 06:30

    Since there's possibility that people still visit here and will be biased against Regex after the benchmarks... So i'm gonna give an updated version of the benchmark, with a compiled version of the Regex. Which opposed to the previous benchmarks, this one shows Regex solution actually has consistently good performance.

    Copied from Bill the Lizard and updated with compiled version:

    private final Pattern pattern = Pattern.compile("^-?\\d+$");
    
    public void runTests() {
        String big_int = "1234567890";
        String non_int = "1234XY7890";
    
        long startTime = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++)
                IsInt_ByException(big_int);
        long endTime = System.currentTimeMillis();
        System.out.print("ByException - integer data: ");
        System.out.println(endTime - startTime);
    
        startTime = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++)
                IsInt_ByException(non_int);
        endTime = System.currentTimeMillis();
        System.out.print("ByException - non-integer data: ");
        System.out.println(endTime - startTime);
    
        startTime = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++)
                IsInt_ByRegex(big_int);
        endTime = System.currentTimeMillis();
        System.out.print("\nByRegex - integer data: ");
        System.out.println(endTime - startTime);
    
        startTime = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++)
                IsInt_ByRegex(non_int);
        endTime = System.currentTimeMillis();
        System.out.print("ByRegex - non-integer data: ");
        System.out.println(endTime - startTime);
    
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++)
                IsInt_ByCompiledRegex(big_int);
        endTime = System.currentTimeMillis();
        System.out.print("\nByCompiledRegex - integer data: ");
        System.out.println(endTime - startTime);
    
        startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000; i++)
                IsInt_ByCompiledRegex(non_int);
        endTime = System.currentTimeMillis();
        System.out.print("ByCompiledRegex - non-integer data: ");
        System.out.println(endTime - startTime);
    
    
        startTime = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++)
                IsInt_ByJonas(big_int);
        endTime = System.currentTimeMillis();
        System.out.print("\nByJonas - integer data: ");
        System.out.println(endTime - startTime);
    
        startTime = System.currentTimeMillis();
        for(int i = 0; i < 100000; i++)
                IsInt_ByJonas(non_int);
        endTime = System.currentTimeMillis();
        System.out.print("ByJonas - non-integer data: ");
        System.out.println(endTime - startTime);
    }
    
    private boolean IsInt_ByException(String str)
    {
        try
        {
            Integer.parseInt(str);
            return true;
        }
        catch(NumberFormatException nfe)
        {
            return false;
        }
    }
    
    private boolean IsInt_ByRegex(String str)
    {
        return str.matches("^-?\\d+$");
    }
    
    private boolean IsInt_ByCompiledRegex(String str) {
        return pattern.matcher(str).find();
    }
    
    public boolean IsInt_ByJonas(String str)
    {
        if (str == null) {
                return false;
        }
        int length = str.length();
        if (length == 0) {
                return false;
        }
        int i = 0;
        if (str.charAt(0) == '-') {
                if (length == 1) {
                        return false;
                }
                i = 1;
        }
        for (; i < length; i++) {
                char c = str.charAt(i);
                if (c <= '/' || c >= ':') {
                        return false;
                }
        }
        return true;
    }
    

    Results:

    ByException - integer data: 45
    ByException - non-integer data: 465
    
    ByRegex - integer data: 272
    ByRegex - non-integer data: 131
    
    ByCompiledRegex - integer data: 45
    ByCompiledRegex - non-integer data: 26
    
    ByJonas - integer data: 8
    ByJonas - non-integer data: 2
    

提交回复
热议问题