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. 正数的边界值为1至0x7fffffff;负数的边界值为-1至0x80000000;
  2. 代码中将所有数据当做负数(正数)来处理,最后处理符号问题;
  3. 方法中multmin这个变量是为了在循环中result*=radix不会发生越界;

以上是关于JDK源码学习阅读-Integer类中的parseInt方法分析(转)的主要内容,如果未能解决你的问题,请参考以下文章

学习JDK源码:Integer

JDK源码阅读指南

JDK源码解读之Integer

JDK源码学习--String篇 关于String采用final修饰的思考

0008JDK源码分析之一分钟看透自动装箱和拆箱

JDK:java.lang.Integer源码解析