字符串转整数 Java版 Integet.parseInt()源码分析

一哥们面腾讯的时候面试官让他手写一个字符串转数组的代码,后来他说写的不大好。我想这就是《剑指offer》讲到过的一个题目。何海涛老师的博客也讲过,这是传送门:C++版字符串转整数
我平时用Java比较多,在Java里面有个Integet.parseInt(string)函数可以 让字符串转整数。今天我们就进去它的源码分析一下是怎么做的。
在进去之前,我们先想一下字符串转整数这道题会有什么,需要考虑什么特殊情况:

  • 字符串为空
  • 正负号
  • 字符串里面除了数组和正负号还有其他字符
  • 溢出
  • 字符串里面的数字是几进制的

所以我们在写代码的时候要把这些都考虑上去。
现在我们来看下Integet.parseInt(string)是怎么处理的:

    public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);//将s转化为10进制的整数,其中第二个参数“10”是代表s原本是10进制的
    }

它是调用parseInt(s,10)这个函数,再进去这个函数看看,相应的解释已经在注释里面了:

    public static int parseInt(String s, int radix)
                throws NumberFormatException
    {
        /*
         * 将整数字符串s转换成10进制的整数
         * radix用来指明s是几进制
         */

        if (s == null) { //处理字符串s为空的情况
            throw new NumberFormatException("null");
        }

        //Character.MIN_RADIX为2,就是进制数radix小于2进制的话也是无效的
        if (radix < Character.MIN_RADIX) { 
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");
        }

        //Character.MAX_RADIX为36,就是进制数radix大于36进制的话也是无效的
        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }

        int result = 0; //最后的结果
        boolean negative = false; //判断正负号的标记,先初始化为正(negative = false),
        int i = 0, len = s.length();
        //初始化limit 为负的(MAX_VALUE = 0x7fffffff),因为下面每次的result是相减的形式,所以这里是﹣的
        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;
                    //若是字符串的符号是﹣,因为下面每次的result是相减的形式,所以这里是﹢的
                    limit = Integer.MIN_VALUE; 
                } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);

                if (len == 1) // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            multmin = limit / radix; 
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                // 返回使用指定radix进制的字符 s.charAt(i++) 的数值
                digit = Character.digit(s.charAt(i++),radix);
                if (digit < 0) { // s.charAt(i++)的值是一个使用指定radix进制的无效数字,则返回 -1,异常
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                result *= radix; //上一次的结果乘以radix进制
                if (result < limit + digit) { //处理溢出情况
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit; //和 return negative ? result : -result; 有关系
            }
        } else { //长度小于0的话,异常
            throw NumberFormatException.forInputString(s);
        }
        //negative是true的话,此整数是负的,上面result是减形式的(result -= digit),所以直接输出result 
        //negative是false的话,此整数是正的,输出-result
        return negative ? result : -result; 
    }

这就是Java里面的处理方式。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值