将数字字符转换为int的最快方法

Pep*_*val 6 java char data-conversion

从这里望过去和其他网站我知道有转换数字两种常用的方法char类似值'5'一个int值:

  1. 使用 Character.getNumericValue()

  2. 用ASCII值减去数字'0';即int number = num - '0',在这里num是一个char值。

这两种方法中哪一种是最快,最有效的?

Ste*_*n C 6

  1. 这两个版本不相等:

    • Character.getNumericalValue(...)方法适用于表示数字或数字的各种字符,并且将返回-1-2在字符不表示非负整数的情况下返回。
    • num - '0'方法只给出了对应的ASCII字符码点的正确答案'0'通过'9'。对于所有其他代码点或代码单元,它给出了无意义的值。
  2. num - '0'版本将更快。通过查看的源代码可以清楚地看出这一点getNumericalValue(...)

  3. 尽管相对而言差异显着,但绝对差异很小。


我同意这样的说法:这很可能是过早的优化。

在某些情况下,这也是不正确的优化。


我经常使用它,所以想知道我是否使用了最高效的工具。

绝对是过早的优化:-)

您编写特定代码序列的次数与该代码序列的执行次数无关。后者决定了优化是否值得付出努力。


Dmi*_*nko 5

好吧,Character.getNumericValue()考虑到Unicoderadixcase文化

 '0' ->  0 // Same as number - '0'
 '9' ->  9 // Same as number - '0'
 'A' -> 10 // Hexadecimal 0xA == 10
 'f' -> 15 // Hexadecimal 0xF == 15
 '³' ->  3 // Unicode superscript 3
 '?'-> 20 // Unicode enclosed alphanumeric 20 
 '?' ->  5 // Persian digit 5
 '*' -> -1 // Doesn't have any corresponding integer value
 '?' -> -2 // Even if 5/6 fraction Unicode character is a number, it's not integer
Run Code Online (Sandbox Code Playgroud)

number - '0'
Run Code Online (Sandbox Code Playgroud)

只是两个int秒的减法。这就是为什么Character.getNumericValue()不可避免地要慢一些(为什么优化几纳秒?)。但是,请注意,在'A', 'f', '³', '*'等情况下,你将不得不错asnwersnumber - '0'代码。