dyl
2014-05-18 18:15:48
JDK源码学习阅读-Integer类中的parseInt方法分析
方法原型:
public static int parseInt(String s,int radix);
输入:s表示待转换的字符串;radix表示需要转换成几进制的整数;
输出:返回一个32位整数。
算法流程图:
JDK中的代码实现:
/** * 字符串转换成整数 * @param s 待转换字符串 * @param radix 进制 * @return */ public static int parseInt(String s,int radix){ //边界值处理 if(s==null) throw new NumberFormatException("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"); } int result=0; //符号位判断 boolean negative=false; //字符串偏移指针 int i=0; int digit; int max=s.length(); //最大边界值 int limit; //最大边界值右移一位 int multmin; if(max>0){ //处理符号 if(s.charAt(0)=='-'){ negative=true; //边界值为0x80000000 limit=Integer.MIN_VALUE; i++; } else{ //边界值为-0x7fffffff limit=-Integer.MAX_VALUE; } multmin=limit/radix; if(i<max){ digit=Character.digit(s.charAt(i++), radix); if(digit<0){ throw NumberFormatException.forInputString(s); } else{ result=-digit; } } while(i<max){ //将字符转换成对应进制的整数 digit=Character.digit(s.charAt(i++), radix); if(digit<0){ throw NumberFormatException.forInputString(s); } if(result<multmin){ throw NumberFormatException.forInputString(s); } result*=radix; //result-digit<limit if(result<limit+digit){ throw NumberFormatException.forInputString(s); } result-=digit; } } else{ throw NumberFormatException.forInputString(s); } if(negative){ if(i>1){ return result; } else{ throw NumberFormatException.forInputString(s); } } else{ return -result; } }
关键点:
- 正数的边界值为1至0x7fffffff;负数的边界值为-1至0x80000000;
- 代码中将所有数据当做负数(正数)来处理,最后处理符号问题;
- 方法中multmin这个变量是为了在循环中result*=radix不会发生越界;
由最代码官方编辑于2016-8-6 14:46:02
猜你喜欢
- JDK1.8 部分不向下兼容JDK1.7处理(类似maven编译找不到符号sun.org.mozilla.javascript.internal)
- grails代码学习教程
- Flex MenuBar的使用学习
- android service学习实例
- vue.js框架初学者学习教程
- java代码实现的jdk工具native2ascii.exe
- spring mvc 学习使用模板 基础教程
- jQuery基本语法学习代码实例
- java多线程编程代码学习实例
- Spring学习笔记之Spring MVC 入门教程
- spring mvc入门学习的实例demo
- Spring MVC+Mybatis入门学习小项目实例
请下载代码后再发表评论
相关代码
最近下载
最近浏览
long123_356 LV7
5月18日
微信网友_5765729692274688
2022年9月20日
暂无贡献等级
suiyibawokeyi
2022年6月5日
暂无贡献等级
squarefive LV2
2020年12月26日
562650727 LV10
2020年9月25日
shuilianbing LV6
2020年6月8日
moomin709 LV24
2020年2月10日
1157648539
2020年1月2日
暂无贡献等级
luohaipeng LV23
2019年11月19日
hmj792001010 LV12
2019年10月9日