Integer.parseInt解读

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/bdmh/article/details/90168916
int I = Integer.parseInt("123456");

当我们要把字符串转成整数时,最常用的就是上面的一行代码,现在就看看 parseInt 是如何实现的

当执行上述代码时,系统默认按照十进制转换

    public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
    }

系统会继续调用 parseInt(s,10),第二个参数是进制数,支持2-36进制

继续进入

    public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        //输入为null,报错
        if (s == null) {
            throw new NumberFormatException("null");
        }

        //小于2进制数,报错
        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");
        }

        //大于36进制数,报错
        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }

        int result = 0;

        //是否为负数
        boolean negative = false;
        int i = 0, len = s.length();

        //数值界限
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;

        if (len > 0) {
            char firstChar = s.charAt(0);

            //判断正负号
            if (firstChar < '0') { // Possible leading "+" or "-"
                if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);

                if (len == 1) // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s);

                //转换起始位置加1
                i++;
            }
            multmin = limit / radix;
            while (i < len) {
                //把每一个字符,转换成对应的数字
                digit = Character.digit(s.charAt(i++),radix);
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }

                //乘以进制数
                result *= radix;
                //判断是非越界
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                //乘以进制数后,减去digit,以负数形式进行累加
                result -= digit;
            }
        } else {
            throw NumberFormatException.forInputString(s);
        }
        return negative ? result : -result;
    }

以parseInt("123")为例,看看执行步骤

digit		result		result*radix		result -=digit
1		0		0			   -1
2		-1		-10			   -12
3		-12		-120                        -123

因为是正数,所以negative = false,返回 -result = 123

代码相对比较好理解,可能开始会被 multmin 变量搞晕,这里简单说一下。

以正数为例,multmin是最大整数除以10,循环中,每次都要检测result是否小于multmin,因为每次都有一个result*radix的操作,为了保证乘radix后,位数不超过整数的最大位数,所以提前判断一下result是否小于multmin,multmin就是防止result*radix之后,超出了整数边界而存在的。

展开阅读全文

没有更多推荐了,返回首页