当前位置: 代码迷 >> 综合 >> Integer valueOf(String s)源码分析。
  详细解决方案

Integer valueOf(String s)源码分析。

热度:47   发布时间:2023-12-13 04:59:17.0

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,最大是36if (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_VALUEdigit = 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 至 2147483647throw NumberFormatException.forInputString(s);}result -= digit;

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

return negative ? result : -result;

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

  相关解决方案