java - Integer.parseInt 是在 Java 中将 String 转换为 Int 的最佳方法?
问题描述
我们通常使用 Integer.parseInt 方法String
来Integer
转换 in JAVA
,但是当我检查 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 方法的最佳方法是什么?
解决方案
我邀请您查看 parseInt 函数的源代码。你的幼稚函数更快,但它的作用也更少。边缘情况,例如数字太大而无法放入一个int
数字或根本不是一个数字,将使用您的简单函数产生无法检测到的虚假结果。
最好相信语言设计者已经完成了他们的工作,并且已经产生了一个相当快速的解析整数的实现。真正的优化可能在别处。
推荐阅读
- c# - 如何将变量存储在数组中
- c# - 使用 ClosedXML 重命名工作表及其引用
- sql - 我可以在 where 子句中引用 IIF 值吗
- php - 如果数组有重复项,则键的空值
- google-apps-script - 为什么 Google 表格在发送电子邮件时缺少最后一封电子邮件?
- java - 防止应用程序从 java.io.IOException 崩溃:写入失败:ENOSPC(设备上没有剩余空间)
- generics - 为什么kotin在使用中缀时不能推断出类型?
- c# - 如何使用 AD 帐户保持我的应用程序“经过身份验证”?C#
- snakemake - Snakemake 运行子工作流程,但不运行我的工作流程的其余部分(直接转到全部规则)
- c++ - 如何从随机值范围内删除某个元素?