Integer valueOf(String s)源码分析。

本文深入解析Java中Integer.parseInt方法的工作原理,包括如何将字符串转换为整数,处理不同进制输入,以及避免数字溢出的策略。通过源码分析,揭示了该方法在处理正负数、边界值和非十进制数时的内部机制。

Integer valueOf(String s)

解析string,转成整数。

贴代码上:

 public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }

默认调用解析,是10进制数:就是string是10进制的,这个时候如果传入是的16进制数,如果包含a到f会报错的。
原型方法为:

public static int parseInt(String s, int radix){//radix 最小是2,最大是36
 if (s == null) {
            throw new NumberFormatException("s == null");
        }

        if (radix < Character.MIN_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " less than Character.MIN_RADIX");
        }

        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }
// 字符串判空和进制必须在2和36制间
if (len > 0) {
            char firstChar = s.charAt(0);
            if (firstChar < '0') { // Possible leading "+" or "-"
                if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);

                if (len == 1) // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            multmin = limit / radix;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                digit = Character.digit(s.charAt(i++),radix);
                if (digit < 0) {
                    throw NumberFormatException.forInputString(s);
                }
                if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }
                result *= radix;
                if (result < limit + digit) {
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;
            }
        } else {
            throw NumberFormatException.forInputString(s);
        }
        return negative ? result : -result;
   
}

先判空,然后是进制范围这是基础。
首位可以是“+”/“-”正负判断,没有的话就当成正数。
关键方法第一个:

        digit = Character.digit(s.charAt(i++),radix);//从字符解析出真正的数字

这里Android和Java不一样。
Android 26 如果小于128,就是ascii码,直接取数字和字符换算,其他字符都是非法的。大于128走一个native方法。
java走的是CharacterDataLatin1,一个字节。更多的有其他类。都是CharacterData的子类。

这里面主要是取出实际值,如果大于进制或者不合法返回-1。
取到的digit如果是负数,则直接包数字不合法的异常,所以解析的最好有个try catch。

判断逻辑来了:

if (result < multmin) {
                    throw NumberFormatException.forInputString(s);
                }

result初始化是0,multmin呢?
如果传入是取正数:multmin=-Integer.MAX_VALUE/进制,
如果是负数:multmin=Integer.MIN_VALUE/进制。
所以multmin都是负值,为什么?看后续。
为什么加这个判断?这个判断是决定result能不能更进一位,如果不能证明数字超过最大值,Integer表示不了。

  result *= radix;
                if (result < limit + digit) {//这步也是,证明数字超标。。。。。limit一直都是负数。这部是因为正负数大小不一样处理的。
                Integer区间是:-2147483648 至 2147483647
         
                    throw NumberFormatException.forInputString(s);
                }
                result -= digit;

正常就把上一个结果乘以进制再减去,都是负数,所以后面类似直接放在个位。
循环处理,最后返回结果:

return negative ? result : -result;

为什么用负数转化?因为负数更大。。。。这个思路我个人觉得很惊艳,至少我没想到,我想得就是正数负数自己来。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值