JDK源码学习阅读-Integer类中的parseInt方法分析(转)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JDK源码学习阅读-Integer类中的parseInt方法分析(转)相关的知识,希望对你有一定的参考价值。
方法原型:
public static int parseInt(String s,int radix);
输入:s表示待转换的字符串;radix表示需要转换成几进制的整数;
输出:返回一个32位整数。
算法流程图:
JDK中的代码实现:
1 /** 2 * 字符串转换成整数 3 * @param s 待转换字符串 4 * @param radix 进制 5 * @return 6 */ 7 public static int parseInt(String s,int radix){ 8 //边界值处理 9 if(s==null) 10 throw new NumberFormatException("null"); 11 if(radix<Character.MIN_RADIX){ 12 throw new NumberFormatException("radix "+radix+" less than Character.MIN_RADIX"); 13 } 14 if(radix>Character.MAX_RADIX){ 15 throw new NumberFormatException("radix "+radix+" greater than Character.MAX_RADIX"); 16 } 17 18 int result=0; 19 20 //符号位判断 21 boolean negative=false; 22 23 //字符串偏移指针 24 int i=0; 25 26 int digit; 27 28 int max=s.length(); 29 30 //最大边界值 31 int limit; 32 33 //最大边界值右移一位 34 int multmin; 35 36 if(max>0){ 37 //处理符号 38 if(s.charAt(0)==‘-‘){ 39 negative=true; 40 //边界值为0x80000000 41 limit=Integer.MIN_VALUE; 42 i++; 43 } 44 else{ 45 //边界值为-0x7fffffff 46 limit=-Integer.MAX_VALUE; 47 } 48 49 multmin=limit/radix; 50 if(i<max){ 51 digit=Character.digit(s.charAt(i++), radix); 52 if(digit<0){ 53 throw NumberFormatException.forInputString(s); 54 } 55 else{ 56 result=-digit; 57 } 58 } 59 while(i<max){ 60 //将字符转换成对应进制的整数 61 digit=Character.digit(s.charAt(i++), radix); 62 if(digit<0){ 63 throw NumberFormatException.forInputString(s); 64 } 65 66 if(result<multmin){ 67 throw NumberFormatException.forInputString(s); 68 } 69 result*=radix; 70 //result-digit<limit 71 if(result<limit+digit){ 72 throw NumberFormatException.forInputString(s); 73 } 74 result-=digit; 75 } 76 } 77 else{ 78 throw NumberFormatException.forInputString(s); 79 } 80 if(negative){ 81 if(i>1){ 82 return result; 83 } 84 else{ 85 throw NumberFormatException.forInputString(s); 86 } 87 } 88 else{ 89 return -result; 90 } 91 }
关键点:
- 正数的边界值为1至0x7fffffff;负数的边界值为-1至0x80000000;
- 代码中将所有数据当做负数(正数)来处理,最后处理符号问题;
- 方法中multmin这个变量是为了在循环中result*=radix不会发生越界;
以上是关于JDK源码学习阅读-Integer类中的parseInt方法分析(转)的主要内容,如果未能解决你的问题,请参考以下文章