源码浅谈(二):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、判断是否为负值 返回结果
作者:听着music睡
出处:http://www.cnblogs.com/xqxacm/
Android交流群:38197636
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2015-11-05 Android项目实战(七):Dialog主题Activity实现自定义对话框效果