源码浅谈(二):java中的 Integer.parseInt(String str)方法

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

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

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

二、parseInt(String s, int radix)

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

     // 第三步,判断基数是否大于最大基数 为36
        if (radix > Character.MAX_RADIX) {
            throw new NumberFormatException("radix " + radix +
                                            " greater than Character.MAX_RADIX");
        }

        int result = 0;

     // 标识,是否为负数,默认false
        boolean negative = false;
        // 字符串转换为char数组后的 下标和数组长度
        int i = 0, len = s.length();
        int limit = -Integer.MAX_VALUE;
        int multmin;
        int digit;
        
        // 第四步,判断字符串长度是不大于0
        if (len > 0) {
        // 取第一个字符
            char firstChar = s.charAt(0);
        // 字符ASCII是否小于'0' ,可能为 '+' '-' , 如果不是<'0' ,则为数组 ,略过该if{}
            if (firstChar < '0') { // Possible leading "+" or "-"
                // 如果第一个字符是'-' ,说明是负数,则负数标识改为true ,限制改为最小标识
          if (firstChar == '-') {
                    negative = true;
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+')
            // 如果第一个字符不是'-' 也不是'+' ,异常
                    throw NumberFormatException.forInputString(s);
          // 第一字符<'0' 且长度为1  则不是数字 异常
                if (len == 1) // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s);
                i++;
            }
            multmin = limit / radix;
       // 遍历字符串转为的字符数组,将每一个字符转为10进制值,并拼接
            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;
    }

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏顶级程序员

为什么1000 == 1000返回为False,而100 == 100会返回为True?

这是我们今天要讨论的话题,因为我觉得它非常的有趣。 如果你运行如下代码: Integer a = 1000, b = 1000; System.out.pr...

39250
来自专栏java 成神之路

Java 自动装箱与拆箱的实现原理

450170
来自专栏java一日一条

一个以前没有注意的问题:java构造函数的执行顺序

昨天在改一处代码时发现执行的过程和预想的不一样,仔细探究才发现是构造器执行顺序问题.(汗自己一下,基础不够扎实) 特地做了一些尝试然后把java构造器的执行顺...

10220
来自专栏十月梦想

js对象创建

16130
来自专栏微信公众号:Java团长

Java动态代理机制详解

在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来...

14910
来自专栏小樱的经验随笔

【Java学习笔记之三十二】浅谈Java中throw与throws的用法及异常抛出处理机制剖析

异常处理机制 异常处理是对可能出现的异常进行处理,以防止程序遇到异常时被卡死,处于一直等待,或死循环。 异常有两个过程,一个是抛出异常;一个是捕捉异常。 抛出异...

36460
来自专栏java一日一条

一个以前没有注意的问题:java构造函数的执行顺序

昨天在改一处代码时发现执行的过程和预想的不一样,仔细探究才发现是构造器执行顺序问题.(汗自己一下,基础不够扎实) 特地做了一些尝试然后把java构造器的执行顺...

27820
来自专栏技术博文

JS编码解码

一、定义和用法 encodeURI() 函数可把字符串作为 URI 进行编码。 语法 encodeURI(URIstring) 参数描述 URIstrin...

61150
来自专栏Python小屋

Python版双链表结构与有关操作

接昨天文章详解Python变量作用域最后的思考题。 class Node: '''节点结构''' def __init__(self, data, left...

31190
来自专栏Java编程

Java动态代理机制详解

在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来...

48810

扫码关注云+社区

领取腾讯云代金券