经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » Java相关 » Java » 查看文章
源码浅谈(二):java中的 Integer.parseInt(String str)方法
来源:cnblogs  作者:听着music睡  时间:2018/11/6 10:22:18  对本文有异议

这个方法是将字符串转换为整型

 

一、parseInt方法 ,可以看到默认又调用了parseInt(s,10) ,  第二个参数为基数,默认10 ,当然也可以自己设置 

  1. public static int parseInt(String s) throws NumberFormatException {
  2. return parseInt(s,10);
  3. }

 

二、parseInt(String s, int radix)

 

  1. public static int parseInt(String s, int radix)
  2. throws NumberFormatException
  3. {
  4. /*
  5. * WARNING: This method may be invoked early during VM initialization
  6. * before IntegerCache is initialized. Care must be taken to not use
  7. * the valueOf method.
  8. */
  9.      // 第一步、判断字符串参数是否为null
  10. if (s == null) {
  11. throw new NumberFormatException("null");
  12. }
  13.      
         // 第二步,判断基数是否小于最小基数 为2
  14. if (radix < Character.MIN_RADIX) {
  15. throw new NumberFormatException("radix " + radix +
  16. " less than Character.MIN_RADIX");
  17. }

  18.      // 第三步,判断基数是否大于最大基数 为36
  19. if (radix > Character.MAX_RADIX) {
  20. throw new NumberFormatException("radix " + radix +
  21. " greater than Character.MAX_RADIX");
  22. }
  23. int result = 0;

         // 标识,是否为负数,默认false
  24. boolean negative = false;
    // 字符串转换为char数组后的 下标和数组长度
  25. int i = 0, len = s.length();
  26. int limit = -Integer.MAX_VALUE;
  27. int multmin;
  28. int digit;

  29. // 第四步,判断字符串长度是不大于0
  30. if (len > 0) {
            // 取第一个字符
  31. char firstChar = s.charAt(0);
           // 字符ASCII是否小于'0' ,可能为 '+' '-' , 如果不是<'0' ,则为数组 ,略过该if{}
  32. if (firstChar < '0') { // Possible leading "+" or "-"
  33. // 如果第一个字符是'-' ,说明是负数,则负数标识改为true ,限制改为最小标识
              if (firstChar == '-') {
  34. negative = true;
  35. limit = Integer.MIN_VALUE;
  36. } else if (firstChar != '+')
                // 如果第一个字符不是'-' 也不是'+' ,异常
  37. throw NumberFormatException.forInputString(s);
  38.           // 第一字符<'0' 且长度为1 则不是数字 异常
  39. if (len == 1) // Cannot have lone "+" or "-"
  40. throw NumberFormatException.forInputString(s);
  41. i++;
  42. }
  43. multmin = limit / radix;
           // 遍历字符串转为的字符数组,将每一个字符转为10进制值,并拼接
  44. while (i < len) {
  45. // Accumulating negatively avoids surprises near MAX_VALUE
  46. digit = Character.digit(s.charAt(i++),radix);
  47. if (digit < 0) {
  48. throw NumberFormatException.forInputString(s);
  49. }
  50. if (result < multmin) {
  51. throw NumberFormatException.forInputString(s);
  52. }
  53. result *= radix;
  54. if (result < limit + digit) {
  55. throw NumberFormatException.forInputString(s);
  56. }
  57. result -= digit;
  58. }
  59. } else {
  60. throw NumberFormatException.forInputString(s);
  61. }
         // 返回拼接数据
  62. return negative ? result : -result;
  63. }

 

 

综上,该方法源码的执行流程:

  

  1. 1parseInt(String s)--内部调用parseInt(s,10)(默认为10进制)
  2. 2、判断字符串参数是否不为null,否则异常
    3、判断基数是否在最小基数和最大基数之间,否则异常
    4、判断字符串长度是否>0
  3. 5、判断第一个字符是否是符号位,是的话判断+-符号,不是的话则第一位不是字符,直接下一步遍历每一个字符
  4. 6、循环遍历确定每个字符的十进制值
  5. 7、通过*= 和-= 进行计算拼接
  6. 8、判断是否为负值 返回结果

 

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号