非常详细的Java的Integer类的parseInt方法源代码解析(JDK1.8,逐行解释,包括注释)

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进制表示方法,这个是需要特别注意的地方(我验证过了)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值