将String转为int

对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(重点)

源码分析

将String转为int_第1张图片
image.png
  • 555行为最终返回的结果
  • 556行为一个标志量(是否是负数),默认为false
  • 560行digit变量为使用Character.digit(s.charAt(i++),radix)`获取字符(Unicode代码点)的数值
将String转为int_第2张图片
image.png
  • 这个设计挺好的,初始长度为0,如果第一位有符号位,则i++,如果为0的话说明是没有符号位的
将String转为int_第3张图片
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_第4张图片

你可能感兴趣的:(将String转为int)