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;
为什么用负数转化?因为负数更大。。。。这个思路我个人觉得很惊艳,至少我没想到,我想得就是正数负数自己来。。。。
本文深入解析Java中Integer.parseInt方法的工作原理,包括如何将字符串转换为整数,处理不同进制输入,以及避免数字溢出的策略。通过源码分析,揭示了该方法在处理正负数、边界值和非十进制数时的内部机制。

811

被折叠的 条评论
为什么被折叠?



