Integer.valueOf()与Integer.getInteger()源码分析

Integer.valueOf()与Integer.getInteger()源码分析


Integer.valueOf():

    • static IntegervalueOf(int i) 返回一个 Integer指定的 int值的 Integer实例。
      static IntegervalueOf(String s) 返回一个 Integer对象,保存指定的值为 String
      static IntegervalueOf(String s, int radix) 返回一个 Integer对象,保存从指定的String中 String的值,当用第二个参数给出的进制进行解析时。

Integer.getInteger():

    • static IntegergetInteger(String nm) 确定具有指定名称的系统属性的整数值。
      static IntegergetInteger(String nm, int val) 确定具有指定名称的系统属性的整数值。

Integer.valueOf()

例子是这样婶的

public static void main(String[] args) {
        String s = "105";
        int i = Integer.valueOf(s);
        System.out.println(i);//输出105
    }

首先我们点进valueOf方法

public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }

发现它把praseInt函数的返回值作为参数,调用自己的重载方法返回结果

那下一步我们点进praseInt去看一看究竟。

//俩参数,一个是待转字符串的值,一个是进制。 
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");
        }

    //保证radix进制在字符允许的进制2-36进制之间,否则抛异常
        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; //设置限制,-2^32+1
        int multmin;
        int digit;

        if (len > 0) {
            char firstChar = s.charAt(0);
            //第一步取首字符,判断是否为正负号,ASCII码分别是'+':43;		'-':45;		'0':48,至于为什么取‘0’作为比较的标准,没理解设计者的意思,或者设计者就是这样随便一比吧。
            if (firstChar < '0') { // Possible leading "+" or "-"
                if (firstChar == '-') {
                    //如果是负数,就将限制设置为最小的int数
                    negative = true;
                    limit = Integer.MIN_VALUE;
                } else if (firstChar != '+')
                    throw NumberFormatException.forInputString(s);

                if (len == 1) // Cannot have lone "+" or "-"
                    throw NumberFormatException.forInputString(s);
                //标记开始位置需要往后移一位
                i++;
            }
            //此处用来限制字符串转换为的整数是否超出范围
            multmin = limit / radix;
            while (i < len) {
                // Accumulating negatively avoids surprises near MAX_VALUE
                //digit函数是将一个字符转换为数字 如'2'-->2
                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;
    }

细节部分都在代码注释里面,下面来个课代表总结一下整个流程:

中间省去了很多抛异常的情况

在这里插入图片描述

这里的累加求和跟常规思路不太一样

int result = 0,i = 0,len = s.length();
while (i < len) {
                digit = Character.digit(s.charAt(i++),radix);
    //先乘以进制,然后通过负数相减,将结果统计起来。
                result *= radix;
                result -= digit;
            }

到此valueOf就看完了,为了保证程序的健壮性,里面考虑了大量的细节,是值得自己学习的,所以摘录下来。

Integer.getInteger()


老套路,先点进getInteger()函数中去

 public static Integer getInteger(String nm) {
        return getInteger(nm, null);
    }

发现函数调用自身的重载函数,找到重载函数的位置

public static Integer getInteger(String nm, Integer val) {
        String v = null;
        try {
            v = System.getProperty(nm);
        } catch (IllegalArgumentException | NullPointerException e) {
        }
        if (v != null) {
            try {
                return Integer.decode(v);
            } catch (NumberFormatException e) {
            }
        }
        return val;
    }

发现这个函数是用来获取确定具有指定名称的系统属性的整数值。

详细参看这位大佬的博客:(2条消息) 区分Integer.getInteger和Integer.valueOf使用方法_nosxcy的专栏-CSDN博客_getinteger

附录:System.getProperty()参数大全

java.version Java 运行时环境版本
java.vendor Java 运行时环境供应商
java.vendor.url Java 供应商的 URL
java.home Java 安装目录
java.vm.specification.version Java 虚拟机规范版本
java.vm.specification.vendor Java 虚拟机规范供应商
java.vm.specification.name Java 虚拟机规范名称
java.vm.version Java 虚拟机实现版本
java.vm.vendor Java 虚拟机实现供应商
java.vm.name Java 虚拟机实现名称
java.specification.version Java 运行时环境规范版本
java.specification.vendor Java 运行时环境规范供应商
java.specification.name Java 运行时环境规范名称
java.class.version Java 类格式版本号
java.class.path Java 类路径
java.library.path 加载库时搜索的路径列表
java.io.tmpdir 默认的临时文件路径
java.compiler 要使用的 JIT 编译器的名称
java.ext.dirs 一个或多个扩展目录的路径
os.name 操作系统的名称
os.arch 操作系统的架构
os.version 操作系统的版本
file.separator 文件分隔符(在 UNIX 系统中是“/”)
path.separator 路径分隔符(在 UNIX 系统中是“:”)
line.separator 行分隔符(在 UNIX 系统中是“/n”)
user.name 用户的账户名称
user.home 用户的主目录
user.dir 用户的当前工作目录
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值