parseInt的源码阅读
parseInt的源码阅读
Integer.parseInt()这个方法的功能小巧又实用,实现起来困难不大,没有很复杂。这里就来看一下Java的源码是怎么写的吧,走一边大婶写过的代码,应该会有点收获吧。
其中一条就是,为了考虑程序的健壮性,往往非核心代码占得比较少,相反各种条件判断很多。
/**
 * Parses the string argument as a signed integer in the radix
 * specified by the second argument.
 *
 * <p>Examples:
 * <blockquote><pre>
 * parseInt("0", 10) returns 0
 * parseInt("473", 10) returns 473
 * parseInt("+42", 10) returns 42
 * parseInt("-0", 10) returns 0
 * parseInt("-FF", 16) returns -255
 * parseInt("1100110", 2) returns 102
 * parseInt("2147483647", 10) returns 2147483647
 * parseInt("-2147483648", 10) returns -2147483648
 * parseInt("2147483648", 10) throws a NumberFormatException
 * parseInt("99", 8) throws a NumberFormatException
 * parseInt("Kona", 10) throws a NumberFormatException
 * parseInt("Kona", 27) returns 411787
 * </pre></blockquote>
 */
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.
     */
    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, len = s.length();    // 设置初始位置和字符串的长度
    int limit = -Integer.MAX_VALUE;
    int multmin;
    int digit;
    if (len > 0) {      // 字符串的长度必须大于零
        char firstChar = s.charAt(0);   // 获得字符串的第一个字符
        if (firstChar < '0') { // Possible leading "+" or "-"
            if (firstChar == '-') {
                negative = true;
                limit = Integer.MIN_VALUE;
            } else if (firstChar != '+') // 如果不为++的话就报错
                throw NumberFormatException.forInputString(s);
            // 字符串的长度为1但是又不是数字, 那肯定就出错了
            if (len == 1) // Cannot have lone "+" or "-"
                throw NumberFormatException.forInputString(s);
            i++;
        }
        multmin = limit / radix;
        /*
         * 下面的过程其实很好理解, 以8进制的"534"为例
         * (-5*8-3)*8-4 = -348, 根据符号位判断返回的是348
         */
        while (i < len) {
            // Accumulating negatively avoids surprises near MAX_VALUE
            // 除了前面的判断这里的也有点复杂, 因为要考虑到各种进位
            // 这个将i位置上的字符根据基数转为实际的值, A->11
            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;     // 根据符号位来判断返回哪一个
}
- 没想通的一点是,常理来说(至少我是这样的哈)是考虑用加法,然后再根据符号位判断正负,但是源码中用的是减法。这点没想通是为什么,虽然也没差,感觉怪怪的。 
- digit = Character.digit(s.charAt(i++),radix); 
 这里的函数调用里面的代码也挺多的。根据该位上的字符和基数来得到对应的数字。
parseInt的源码阅读的更多相关文章
- jdk源码阅读笔记-Integer
		public final class Integer extends Number implements Comparable<Integer> Integer 由final修饰了,所以该 ... 
- SpringMVC源码阅读:属性编辑器、数据绑定
		1.前言 SpringMVC是目前J2EE平台的主流Web框架,不熟悉的园友可以看SpringMVC源码阅读入门,它交代了SpringMVC的基础知识和源码阅读的技巧 本文将通过源码(基于Spring ... 
- Java源码阅读-Integer(基于jdk1.8)
		public final class Integer extends Number implements Comparable<Integer> Integer 由final修饰了,所以该 ... 
- Spring源码阅读 之 配置的读取,解析
		在上文中我们已经知道了Spring如何从我们给定的位置加载到配置文件,并将文件包装成一个Resource对象.这篇文章我们将要探讨的就是,如何从这个Resouce对象中加载到我们的容器?加载到容器后又 ... 
- 【原】FMDB源码阅读(三)
		[原]FMDB源码阅读(三) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 FMDB比较优秀的地方就在于对多线程的处理.所以这一篇主要是研究FMDB的多线程处理的实现.而 ... 
- 【原】FMDB源码阅读(二)
		[原]FMDB源码阅读(二) 本文转载请注明出处 -- polobymulberry-博客园 1. 前言 上一篇只是简单地过了一下FMDB一个简单例子的基本流程,并没有涉及到FMDB的所有方方面面,比 ... 
- 【原】FMDB源码阅读(一)
		[原]FMDB源码阅读(一) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 说实话,之前的SDWebImage和AFNetworking这两个组件我还是使用过的,但是对于 ... 
- 【原】AFNetworking源码阅读(六)
		[原]AFNetworking源码阅读(六) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 这一篇的想讲的,一个就是分析一下AFSecurityPolicy文件,看看AF ... 
- 【原】AFNetworking源码阅读(五)
		[原]AFNetworking源码阅读(五) 本文转载请注明出处 —— polobymulberry-博客园 1. 前言 上一篇中提及到了Multipart Request的构建方法- [AFHTTP ... 
随机推荐
- CentOS 6.6 安装 PHP Memcached 扩展
			PHP 的 Memcached扩展使用了 libmemcached 库提供的 api 与 memcached 服务端进行交互.它同样提供了一个 session 处理器(memcached). PHP ... 
- Eclipse Android开发环境搭建
			要点: 1)已经安装配置好eclipse和jdk环境 2)给eclipse安装ADT插件(支持android开发) 3)安装配置android sdk环境(类似jdk) 4)eclipse中配置and ... 
- 服务设计模式一:Web服务概述
			目录 1. Web服务是什么 2.为什么要使用Web服务 3.Web服务考虑的因素和替代方案 4.SOA是什么 Web服务是什么? 所谓服务,通俗的理解就是别人帮你做一些事情,比如说,腰酸背痛了,找个 ... 
- Python基础二. 数据结构、控制流、运算符、真值测试
			一.概述 数据结构上广义上有两种,单一类型和集合类型 单一类型,表示一种对象 集合类型,表示包含多种对象 Python 中的内建的数据类型有str.list.tuple.dict.set.number ... 
- 【转】Ubuntu网卡配置
			一.网卡地址配置Ubuntu的网络配置文件是:/etc/network/interfaces1.以DHCP 方式配置网卡 auto eth0 iface eth0 inet dhcp用sudo ... 
- 一个iOS项目中包含多个xcodeproj文件,如何运行其中的一个项目
			从GitHub上下载的Masonry的iOS源码,打开发现有多个项目,直接运行,模拟器没反应.由于Masonry是一个多工程的项目,每个项目都依赖Masonry的源码,所以要运行Masonry的Exa ... 
- Velocity(5)——#set指令
			引用可以让模板设计者生成动态内容,而指令允许设计者真正的负责页面的展现和内容. 指令是以#开头,后面紧跟一个关键字,比如if,else,foreach等.而这个关键字,是可以被放在{}中间的.这是规范 ... 
- 学习OpenCV——绘制彩色直方图(HSV2BGR)
			#include <cv.h> #include <highgui.h> #include <iostream> using namespace std; int ... 
- struts2实现文件上传、多文件上传和文件下载
			总结的两个问题,就是struts2上传下载的时候对属性名配置要求非常严格: 第一:上传的时候 private File file; private String fileContentType; pr ... 
- 使用plsql执行计划进行sql调优(转载)
			一段SQL代码写好以后,可以通过查看SQL的执行计划,初步预测该SQL在运行时的性能好坏,尤其是在发现某个SQL语句的效率较差时,我们可以通过查看执行计划,分析出该SQL代码的问题所在. 那么,作为开 ... 
