Java里Integer.valueOf与Integer.parseInnt的区别

shangcunshanfu 2017-09-24 01:53:28
Java里Integer.valueOf()与Integer.parseInnt()这两个方法都可以将非数值型转化为数值型,但它们的区别是什么呢?
...全文
4843 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
HelloWordliu 2019-10-31
  • 打赏
  • 举报
回复
学到了
点点滴滴的
程序员杰森 2019-06-30
  • 打赏
  • 举报
回复
大佬们,6啊
幻乐星空 2017-09-26
  • 打赏
  • 举报
回复
引用 10 楼 galiniur0u 的回复:
个人还是比较喜欢这种帖的,比较有意思,撕撕挺好,要不哪来的交流,有交流才能进步。
我是最近觉得自己基础太差,开始恶补和做深入研究的,我是非常赞同你的这种思路,但是对你所说的观点,其实是不太认同的,不想在这帖子里继续探讨了,所以没有继续说,。既然你也喜欢交流讨论,我觉得我们可以私下讨论下,互相进步!!
mr_wangb 2017-09-26
  • 打赏
  • 举报
回复
引用 9 楼 dannil00 的回复:
[quote=引用 7 楼 galiniur0u 的回复:] [quote=引用 6 楼 dannil00 的回复:] [quote=引用 5 楼 galiniur0u 的回复:] 我什么都不说,上源码,源码是最好的说明,该源码取自jdk1.8

    public static Integer valueOf(String s, int radix) throws NumberFormatException {
        return Integer.valueOf(parseInt(s,radix));
    }
    public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
parserInt的源码有点长,这里就不贴了。如果4楼觉得区别是返回值是Integer或int我也没啥说的,返回值确实不同。
本来不想说的,既然你都贴了源码,那我也就把源码解释下好了。 首先楼主问的是2种方法都可以把非数值型转为数值型,二者有什么区别?ok,那么我就假设,入参是String,这点没问题吧。那么你所说的parseInt方法更复杂又从何说起呢?因为valueOf方法已经调用了parseInt了呀,如此说来,应该valueOf方法更复杂啊,因为他不仅走了parseInt的方法,还有自己额外的部分,而且他加入了IntegerCache缓存,-128到127之间的都缓存了,存在一个数组里,直接返回,这个范围外的对象是新建的new Integer(),鉴于此,我认为二者的区别就是不同的返回值类型,有错? 再强调,valueOf方法是先调用parseInt的,得到int后,再进行封装,换句话说,valueOf就是对parseInt得到的值的封装。[/quote] 既然4楼这么喜欢撕,那么就在说说: 咱们首先需要解决楼主问题,Integer.valueOf\Integer.parserInt,首先这两个函数针对的方式就不相同,parserInt主要针对的是字符串型的整形转换,而valueof主要是针对int,只是在设计时为了提供统一的接口对parserInt进行了简单的封装。parser在java设计中多数的都是string转为其他类型,所以为了统一才没有使用parserInt,而是用valueof进行了简单的封装。难道说当初设计者就是为了返回Integer、int两种类型就设计这两个函数么? 所以说区别主要是在函数功能上,parserInt主要是针对String,而valueof主要是针对int(顺便对String进行了简单的封装)。面向对象语言设计之初针对于重载就不考虑函数返回值,所以对于函数返回值来说,其实是次要考虑。 然后再说4楼: 1、如果说函数A调用了函数B,就说函数A更复杂。这就像是牛顿发现了三大定律,然后我们使用三大定律算了一个物体的加速度,哇塞,我们比牛顿还牛逼。函数的复杂度不是说你调用了这个函数就说明你复杂,而是说你的函数本身设计的包括算法等等具有更多有价值的代码才叫复杂。 2、IntegerCache这个缓存,这个缓存跟valueof有啥关系,你随便new一个Integer对象就会有这个缓存的使用。 3、确实返回值不同,这个我也承认并同意了这个方法,不过这是本质的区别么。[/quote] 你这么说,我是非常赞同的,你之前的回答跟这个完全是两码事,不是我爱撕逼,不针对人。[/quote] 向二位致敬!!!技术上的争论是很好做学问的态度。
galiniur0u 2017-09-26
  • 打赏
  • 举报
回复
个人还是比较喜欢这种帖的,比较有意思,撕撕挺好,要不哪来的交流,有交流才能进步。
幻乐星空 2017-09-26
  • 打赏
  • 举报
回复
引用 7 楼 galiniur0u 的回复:
[quote=引用 6 楼 dannil00 的回复:] [quote=引用 5 楼 galiniur0u 的回复:] 我什么都不说,上源码,源码是最好的说明,该源码取自jdk1.8

    public static Integer valueOf(String s, int radix) throws NumberFormatException {
        return Integer.valueOf(parseInt(s,radix));
    }
    public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
parserInt的源码有点长,这里就不贴了。如果4楼觉得区别是返回值是Integer或int我也没啥说的,返回值确实不同。
本来不想说的,既然你都贴了源码,那我也就把源码解释下好了。 首先楼主问的是2种方法都可以把非数值型转为数值型,二者有什么区别?ok,那么我就假设,入参是String,这点没问题吧。那么你所说的parseInt方法更复杂又从何说起呢?因为valueOf方法已经调用了parseInt了呀,如此说来,应该valueOf方法更复杂啊,因为他不仅走了parseInt的方法,还有自己额外的部分,而且他加入了IntegerCache缓存,-128到127之间的都缓存了,存在一个数组里,直接返回,这个范围外的对象是新建的new Integer(),鉴于此,我认为二者的区别就是不同的返回值类型,有错? 再强调,valueOf方法是先调用parseInt的,得到int后,再进行封装,换句话说,valueOf就是对parseInt得到的值的封装。[/quote] 既然4楼这么喜欢撕,那么就在说说: 咱们首先需要解决楼主问题,Integer.valueOf\Integer.parserInt,首先这两个函数针对的方式就不相同,parserInt主要针对的是字符串型的整形转换,而valueof主要是针对int,只是在设计时为了提供统一的接口对parserInt进行了简单的封装。parser在java设计中多数的都是string转为其他类型,所以为了统一才没有使用parserInt,而是用valueof进行了简单的封装。难道说当初设计者就是为了返回Integer、int两种类型就设计这两个函数么? 所以说区别主要是在函数功能上,parserInt主要是针对String,而valueof主要是针对int(顺便对String进行了简单的封装)。面向对象语言设计之初针对于重载就不考虑函数返回值,所以对于函数返回值来说,其实是次要考虑。 然后再说4楼: 1、如果说函数A调用了函数B,就说函数A更复杂。这就像是牛顿发现了三大定律,然后我们使用三大定律算了一个物体的加速度,哇塞,我们比牛顿还牛逼。函数的复杂度不是说你调用了这个函数就说明你复杂,而是说你的函数本身设计的包括算法等等具有更多有价值的代码才叫复杂。 2、IntegerCache这个缓存,这个缓存跟valueof有啥关系,你随便new一个Integer对象就会有这个缓存的使用。 3、确实返回值不同,这个我也承认并同意了这个方法,不过这是本质的区别么。[/quote] 你这么说,我是非常赞同的,你之前的回答跟这个完全是两码事,不是我爱撕逼,不针对人。
_jant 2017-09-26
  • 打赏
  • 举报
回复
说实话7楼理解的比较深入,我觉得这才是一个技术人的态度,6楼理解的太表面,真的呆萌。
galiniur0u 2017-09-26
  • 打赏
  • 举报
回复
引用 6 楼 dannil00 的回复:
[quote=引用 5 楼 galiniur0u 的回复:] 我什么都不说,上源码,源码是最好的说明,该源码取自jdk1.8

    public static Integer valueOf(String s, int radix) throws NumberFormatException {
        return Integer.valueOf(parseInt(s,radix));
    }
    public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
parserInt的源码有点长,这里就不贴了。如果4楼觉得区别是返回值是Integer或int我也没啥说的,返回值确实不同。
本来不想说的,既然你都贴了源码,那我也就把源码解释下好了。 首先楼主问的是2种方法都可以把非数值型转为数值型,二者有什么区别?ok,那么我就假设,入参是String,这点没问题吧。那么你所说的parseInt方法更复杂又从何说起呢?因为valueOf方法已经调用了parseInt了呀,如此说来,应该valueOf方法更复杂啊,因为他不仅走了parseInt的方法,还有自己额外的部分,而且他加入了IntegerCache缓存,-128到127之间的都缓存了,存在一个数组里,直接返回,这个范围外的对象是新建的new Integer(),鉴于此,我认为二者的区别就是不同的返回值类型,有错? 再强调,valueOf方法是先调用parseInt的,得到int后,再进行封装,换句话说,valueOf就是对parseInt得到的值的封装。[/quote] 既然4楼这么喜欢撕,那么就在说说: 咱们首先需要解决楼主问题,Integer.valueOf\Integer.parserInt,首先这两个函数针对的方式就不相同,parserInt主要针对的是字符串型的整形转换,而valueof主要是针对int,只是在设计时为了提供统一的接口对parserInt进行了简单的封装。parser在java设计中多数的都是string转为其他类型,所以为了统一才没有使用parserInt,而是用valueof进行了简单的封装。难道说当初设计者就是为了返回Integer、int两种类型就设计这两个函数么? 所以说区别主要是在函数功能上,parserInt主要是针对String,而valueof主要是针对int(顺便对String进行了简单的封装)。面向对象语言设计之初针对于重载就不考虑函数返回值,所以对于函数返回值来说,其实是次要考虑。 然后再说4楼: 1、如果说函数A调用了函数B,就说函数A更复杂。这就像是牛顿发现了三大定律,然后我们使用三大定律算了一个物体的加速度,哇塞,我们比牛顿还牛逼。函数的复杂度不是说你调用了这个函数就说明你复杂,而是说你的函数本身设计的包括算法等等具有更多有价值的代码才叫复杂。 2、IntegerCache这个缓存,这个缓存跟valueof有啥关系,你随便new一个Integer对象就会有这个缓存的使用。 3、确实返回值不同,这个我也承认并同意了这个方法,不过这是本质的区别么。
幻乐星空 2017-09-26
  • 打赏
  • 举报
回复
引用 5 楼 galiniur0u 的回复:
我什么都不说,上源码,源码是最好的说明,该源码取自jdk1.8

    public static Integer valueOf(String s, int radix) throws NumberFormatException {
        return Integer.valueOf(parseInt(s,radix));
    }
    public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
parserInt的源码有点长,这里就不贴了。如果4楼觉得区别是返回值是Integer或int我也没啥说的,返回值确实不同。
本来不想说的,既然你都贴了源码,那我也就把源码解释下好了。 首先楼主问的是2种方法都可以把非数值型转为数值型,二者有什么区别?ok,那么我就假设,入参是String,这点没问题吧。那么你所说的parseInt方法更复杂又从何说起呢?因为valueOf方法已经调用了parseInt了呀,如此说来,应该valueOf方法更复杂啊,因为他不仅走了parseInt的方法,还有自己额外的部分,而且他加入了IntegerCache缓存,-128到127之间的都缓存了,存在一个数组里,直接返回,这个范围外的对象是新建的new Integer(),鉴于此,我认为二者的区别就是不同的返回值类型,有错? 再强调,valueOf方法是先调用parseInt的,得到int后,再进行封装,换句话说,valueOf就是对parseInt得到的值的封装。
huatian5 2017-09-26
  • 打赏
  • 举报
回复
感觉争论的很有意义啊,学到了
galiniur0u 2017-09-25
  • 打赏
  • 举报
回复
parserint更为复杂,可以配置转换的类型是10进制或者16进制。valueof除了直接转化int外,其他的都是调用了parserint函数。
galiniur0u 2017-09-25
  • 打赏
  • 举报
回复
我什么都不说,上源码,源码是最好的说明,该源码取自jdk1.8

    public static Integer valueOf(String s, int radix) throws NumberFormatException {
        return Integer.valueOf(parseInt(s,radix));
    }
    public static Integer valueOf(String s) throws NumberFormatException {
        return Integer.valueOf(parseInt(s, 10));
    }
    public static Integer valueOf(int i) {
        if (i >= IntegerCache.low && i <= IntegerCache.high)
            return IntegerCache.cache[i + (-IntegerCache.low)];
        return new Integer(i);
    }
parserInt的源码有点长,这里就不贴了。如果4楼觉得区别是返回值是Integer或int我也没啥说的,返回值确实不同。
幻乐星空 2017-09-25
  • 打赏
  • 举报
回复
引用 3 楼 galiniur0u 的回复:
parserint更为复杂,可以配置转换的类型是10进制或者16进制。valueof除了直接转化int外,其他的都是调用了parserint函数。
如果是参数是字符串,那么确实valueOf会调用parseInt,至于你说的10进制,16进制,valueOf和parseInt都有重载,valueOf最后返回的是new Integer(). 所以他俩主要区别还是一个返回包装类Integer,一个返回基本类型int。
small小阮 2017-09-24
  • 打赏
  • 举报
回复
返回类型不一样。一个是返回基本数据类型,一个是引用数据类型。
幻乐星空 2017-09-24
  • 打赏
  • 举报
回复
一个返回Integer,一个返回int

62,628

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧