将String转为int
2017-07-05 本文已影响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代码点)的数值
- 这个设计挺好的,初始长度为0,如果第一位有符号位,则i++,如果为0的话说明是没有符号位的
-
这里主要说一下578行:
digit
方法,它的意思是在指定的基数返回指定字符(Unicode代码点)的数值,这也是String转为int的一个关键点,首先将string转为char,然后再由char获取到int,要注意的有一点:- 如果基数是不在范围内MIN_RADIX≤基数≤MAX_RADIX或如果字符是不是一个有效的数字在指定的基数-1,其他返回正确值。
-
其实思路也是比较简单的:例如123,就是
((1*10+2)*10+3)*10
这个思路。 -
这里有个疑惑点是589行为什么一定要采用
-=
运算,而不是+=
运算呢?我改为+=
之后尝试了几个值计算也是OK的。