美文网首页
Integer.parseInt(s)和Integer.valu

Integer.parseInt(s)和Integer.valu

作者: 飞走的光年 | 来源:发表于2020-01-15 13:39 被阅读0次

    前言

    今天再看Integer源码的时候,发现了一个问题, Integer.parseInt(s)和Integer.valueOf(s)都可以将字符串解析成int类型。那为啥要提供两个不同的方法了,于是去看了一下他们两个方法的源代码实现

    Integer.parseInt(s)

    返回值是int类型

    public static int parseInt(String s) throws NumberFormatException {
        return parseInt(s,10);
    }
    

    这里可以看出还有一个重载的方法,如果传入一个参数,那么第二个参数就是默认是10,这里10代表的是10进制。当然可以自己选择进制。

        String a = "11";
        System.out.println(Integer.parseInt(a)); //默认十进制 结果是 11
        System.out.println(Integer.parseInt(a,2)); //选择2进制 结果是3
    

    所以咱们这里也不深入研究源码,这个不是本篇文章讨论的范围,现在就是知道最终调用的是paseInt()方法。

    Integer.valueOf(s)

    话不多说,先看源码

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

    从源码可以看出valueOf方法也是调用的parseInt()方法,也同样可以选择进制,不选就默认十进制。所以两个方法之间的区别就在于valueOf封装的那一层方法了。我们来看下这个方法。
    这里的参数int i 就是parseInt返回的结果,首先对i做了判断,如果i在-128到127之间,那么就返回缓存的Integer对象,说明源码里面再加载Integer类的时候就缓存了从-128到127的Integer对象,用到的时候直接返回对象,如果不在这个范围之间就重新生成一个Integer对象。

    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
    

    结论

    从上面的分析可以看出
    Integer.valueOf(s)在Integer.parseInt(s)的计算的基础上,将int类型的数值转换成了Integer类型,这样转换的意义大家也应该都知道,就是基本类型的包装类型是引用类型。所以单单为了为了得到一个int值,就用Integer.parseInt(s)就行了。如果为了得到包装类型就用Integer.valueOf(s)。毕竟缓存了一部分数值,可以加强点儿性能。

    相关文章

      网友评论

          本文标题:Integer.parseInt(s)和Integer.valu

          本文链接:https://www.haomeiwen.com/subject/igdtzctx.html