Integer.parseInt 是在 Java 中将 String 转换为 Int 的最佳方法?

Posted

技术标签:

【中文标题】Integer.parseInt 是在 Java 中将 String 转换为 Int 的最佳方法?【英文标题】:Integer.parseInt is best way to convert String to Int in Java? 【发布时间】:2020-02-18 13:11:07 【问题描述】:

JAVA 中,我们通常使用 Integer.parseInt 方法将 String 转换为 Integer,但是当我检查 parseInt 方法的实现时,它会深入到我最初的想法。下面我将分享 parseInt 的深度:

Integer.parseInt(String s) ->  Integer.parseInt(String s, int radix) ->  Character.digit(char ch, int radix) -> Character.digit(int codePoint, int radix) -> (Based on instance call will go to digit(int ch, int radix))

注意:CharacterData 共有 7 个不同的 Instance 定义,其中一个会为 digit 达到峰值。

从上面的细节来看,ParseInt 看起来并不像最初看起来那么容易,那么将 String 转换为 Integer 不是最好的吗?

但是,我关注了一个讨论(我现在丢失了链接),发现下面的方法在性能方面非常快。

 static int getNumber(String number)

     int result = 0;
     int startIndex = 0;


     for(int i=startIndex;i<number.length();i++)
         result = result*10+number.charAt(i)-'0';
     



    return result;

以下是我为这两种方法找到的性能测试结果。

 Value :123456789 , Integer->parseInt Converted in 22000 nanosec.
 Value :123456789 , getNumber Converted in 5000 nanosec.

那么将 String 转换为 Integer、Integer.parseInt 或 getNumber 方法的最佳方法是什么?

【问题讨论】:

提示:你的方法对字符串“这不是一个数字”做了什么,你认为它应该做什么? 如果我通过 "123456785554548884545412212558454545" 你的 getNumber 方法会如何反应?或者如果我通过“aa”? @Simmant 这真的重要吗?您的代码中有比将String 解析为int 更慢的部分。您正在对与程序速度无关的东西进行微优化。作为初学者,您应该专注于正确性而不是速度。 @Simmant:所以你已经编写了自己的代码,它会默默地给出无效的结果,而不是在错误时抛出异常......你有更多的代码需要维护,而且更容易出错.有时这可能是合适的——但只有当您已经证明整数解析实际上是您的应用程序中的一个瓶颈时。你已经证明了吗? @Simmant 仅仅因为您已经看到了 1000 个调用,并不能使其成为性能热点。您需要使用分析器来查看可以改进的部分,而不是猜测。如果您有 1000 个调用需要 22000 纳秒,那么与 10 个调用需要 10 秒相比,这不算什么。重要的是整体性能。 【参考方案1】:

parseInt 是要走的路。 Integer documentation 说

使用 parseInt(String) 将字符串转换为 int 基元,或使用 valueOf(String) 将字符串转换为 Integer 对象。

parseInt 可能会涵盖很多您自己的代码没有考虑过的边缘情况。它已经在许多用户的生产环境中得到了很好的测试。

【讨论】:

【参考方案2】:

我邀请你to look at the source code of the parseInt function。你的幼稚函数更快,但它也做得更少。边缘情况,例如数字太大而无法放入 int 或根本不是数字,使用您的简单函数会产生无法检测到的虚假结果。

最好相信语言设计者已经完成了他们的工作,并且已经产生了解析整数的相当快速的实现。真正的优化可能在别处。

【讨论】:

以上是关于Integer.parseInt 是在 Java 中将 String 转换为 Int 的最佳方法?的主要内容,如果未能解决你的问题,请参考以下文章

java里的 int n=Integer.parseInt(args[0])

java中的语句integer.parseint()是啥意思

Java中Integer.parseInt和Integer.valueOf,你还傻傻分不清吗?

Java将字符串强制转换为整形数据的方法——Integer.parseInt

java.lang.Integer.parseInt 使用最高位的十六进制字符串失败

JAVA中score=Integer.parseInt(args[0]);有啥作用啊?