parseInt()方法是将字符串转换成整数的方法,下面剖析它的源代码:
首先,方法的定义如下:
这是一个类方法,意味着可以直接通过Integer类调用
参数s是要被转化的字符串,参数radix是进制,比如10表示将s按照10进制去理解。
step1:先看注释
以第二个参数进制为基准,将string参数解析为有符号整数。在该进制的情况下,这个字符串必须全部是数字(就是说10进制必须全部是数字,16进制只能是数字加abcdef),除非第一个字符是'-'(表明这是一个负数)或者第一个字符是'+'(表明这是一个正数),转换后的整数将作为这个函数的结果返回。
函数将会抛出NumberFormatException异常,如果下列情况发生了:
第一个参数为null或者是一个长度为0的字符串。
第二个参数小于MIN_RADIX或者大于MAX_RADIX
在指定进制的情况下含有非数字,除了第一个字符是'-'或'+'的情况(字符串长度大于1)
这个字符串代表的值并不是一个整数
例子:
(里不翻译了)
参数:s,需要被转换为整数的字符串
参数:radix,转换的时候用到的进制
返回值:字符串s表示的整数
异常:NumberFormatException如果字符串s不含有能够转换的整数
注释就这么多,其实不难,需要大家有耐心看
step2:解释代码
如果输入的是null,抛出NumberFormatException异常
如果进制大于最大进制或者小于最小进制,同样抛出NumberFormatException异常
result是返回值
negative表示整数的正负性
i后面会用到
len是字符串s的长度
limit是-(2的31次方),再减去1
mulimin和digit后面会用到
首先是一个if-else语句,表明只处理长度大于0的字符串,长度等于0则抛出NumberFormatException异常
563:获得第一个字符
564-574:如果第一个字符小于'0'(可能是'-'或者'+'符号),则判断第一个字符是不是'-'符号,是的话negative置于false,表示这是一个负数。同时limit重新赋值为最小的整数。如果第一个字符不是'-'也不是'+',抛出异常。如果整个字符串长度是1,抛出异常。i前进1位(据此推测i表示当前遍历到的字符的索引)
575:multmin赋值为limit除以进制,推测是进制对应的最大值或者最小值
576-590:这是一个while循环,每经过一次循环需要遍历字符串中的一个字符
其中有三个地方会抛出异常,为了理解起来简单,我们先考虑一个不会抛出异常的s,比如我们假定s的值是"123"
第1个循环,digit = 1,result = 0,result = -1
第2个循环,digit = 2,result = -10,result = -12
第三个循环,digit = 3,result = -120,result = -123
我们得到了-123!然而输入明明是正数???
别急,看一下最后一行,因为我们的negative是false,所以最后返回的时候会取反。
从宏观上理解一下这个while循环,我们先获得当前的数字,然后把上一个循环的结果乘以10,这就相当于把个位空出来了,最后把个位再补上。
如果让我来处理这个问题,肯定是从字符串的最后一位开始计算:即个位乘以1,加上十位乘以10.。。。
所以这个代码还是很牛逼的
至于中间的三个异常,这里不解释了
step3:Attention
代码看完了,不知道你有没有发现一个问题:这个parseInt是处理不了类似于字符串”0xff"这样的16进制表示方法的,只能处理"ff"这样的16进制表示方法,这个是需要特别注意的地方(我验证过了)