将String转为int

作者: 橙小张 | 来源:发表于2017-07-05 15:58 被阅读24次

    对Integer.parseInt(String s, int radix)分析。

    • 思路:
    • radix范围:2-36
    • s校验:
      • 必须是数字类型,例如:123,-123,可以是二进制,八进制,十进制等
      • 必须符合当前进制的规则,例如8进制不能出现9,2进制不能出现3,4等
      • 不能超过int最大和最小值
    • 算法分析:
      • 解析字符串第一位,解析符号位
      • 如果有符号位,从第二位开始遍历,否则从第一位开始遍历,使用digit = Character.digit(s.charAt(i++),radix)获取字符(Unicode代码点)的数值。
      • 返回值result初始化为0,每次遍历result*radix用于进位
      • 在result的基础上减去digit(重点)

    源码分析

    image.png
    • 555行为最终返回的结果
    • 556行为一个标志量(是否是负数),默认为false
    • 560行digit变量为使用Character.digit(s.charAt(i++),radix)`获取字符(Unicode代码点)的数值
    image.png
    • 这个设计挺好的,初始长度为0,如果第一位有符号位,则i++,如果为0的话说明是没有符号位的
    image.png
    • 这里主要说一下578行:digit方法,它的意思是在指定的基数返回指定字符(Unicode代码点)的数值,这也是String转为int的一个关键点,首先将string转为char,然后再由char获取到int,要注意的有一点:

      • 如果基数是不在范围内MIN_RADIX≤基数≤MAX_RADIX或如果字符是不是一个有效的数字在指定的基数-1,其他返回正确值。
    • 其实思路也是比较简单的:例如123,就是((1*10+2)*10+3)*10这个思路。

    • 这里有个疑惑点是589行为什么一定要采用-=运算,而不是+=运算呢?我改为+=之后尝试了几个值计算也是OK的。

    相关文章

      网友评论

        本文标题:将String转为int

        本文链接:https://www.haomeiwen.com/subject/xnjqhxtx.html