我正在尝试检查特定的字符串是否是Int
(或Boolean
或Long
等),但实际上并不需要将其解析为Int
(或其他)。我可以想到两个选择。首先,要做一个var.toInt.toString
,或者如果它是toInt
,则只返回在其上调用了Int
的实际字符串。虽然两者都可以正常工作,但我想知道前者是否比后者便宜得多。仅供参考,我不会以这种方式解析很长的字符串,但是我将遍历数TB的数据。
最佳答案
首先,要回答确切的问题:.toString
在我的机器上花费了几十ns,详细信息取决于机器,当然还取决于int的字符串表示形式有多长时间(最短和最长之间的差约为2倍)。 .toInt
花费更少(大约是toString
时间的1/2到3/4)。
这有关系吗?好吧,超过TB的数据(我想大概是数字),您将拥有数万亿个数十毫微秒或数万秒。所以也许是这样;这将需要数小时的额外计算时间。
但这不是要发生的事情。如果对非整数使用toInt
,则将引发异常。异常真的很慢-通常至少是几微秒。如果您所假设的整数中大约有1/1000并非真正的整数,那么您将花费大量时间来为解析异常创建大型堆栈跟踪,然后将其丢弃。
您可以尝试使用正则表达式。通常,这比仅进行解析要贵10倍,但比引发异常要便宜10倍。除非您还有额外的计算时间来解决该问题,否则它仍然不是一个好选择,尤其是因为正则表达式只会告诉您它是否是int式的,而不是它是否在范围内,因此无论如何您都必须解析它(并捕获异常或进行边界检查)。
因此,如果您真的希望它很快,那么最终您将不得不手动进行验证,对字符串进行索引,使用charAt
捕获字符,等等。是的,这很痛苦。但是,如果您自己解析它,它将和单个.toInt
一样快。这是一大堆丑陋的代码。如果人们可能在其他字符集中使用数字值,通常使用java.lang.Character.digit
的方式(您可以捕获-1的返回和保释)。不要忘记对正负的处理略有不同(由于范围不同)。
附录:您可能会认为java.util.Scanner
只是票证。它遍历数据并具有hasNextInt
方法。不幸的是,它的速度非常慢。
另请参见What's the best way to check to see if a String represents an integer in Java?,以获取有关该问题的Java答案(都不是IMO想法)。
关于scala - Scala中String到Int到String转换的价格是多少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32893428/