JDK源码学习阅读-Integer类中的parseInt方法分析

原文: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. 正数的边界值为1至0x7fffffff;负数的边界值为-1至0x80000000;
  2. 代码中将所有数据当做负数(正数)来处理,最后处理符号问题;
  3. 方法中multmin这个变量是为了在循环中result*=radix不会发生越界;
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值