【问题标题】:Fastest way to convert numeric chars to int将数字字符转换为 int 的最快方法
【发布时间】:2020-01-20 08:54:00
【问题描述】:

通过查看此处和其他网站,我知道有两种常用方法可以将数字 char 值(如 '5')转换为 int 值:

  1. 使用Character.getNumericValue()

  2. '0'的ASCII值减去数字;即int number = num - '0',其中numchar 值。

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

【问题讨论】:

  • 您在这里尝试进行微优化是否有特定原因?让我留个便条,一般来说这可能是一件坏事。通常,您更喜欢可读性而不是提高 1 纳秒的速度。
  • 过早优化是万恶之源。
  • Character.getNumericValue() 应该较慢,因为它考虑了 Unicode,例如Character.getNumericValue((char) 0x00B3) 返回3 因为0x00B3 对应于“上标3”,当num - '0' 只是减去两个ints
  • 首先Character.toNumericValue()不是一个方法。是Character.getNumericValue(),其次你为什么要找微优化?
  • @Zabuza 不,我只是想知道一个是否比另一个慢得多。我经常使用它,所以想知道我是否使用的是最有效的。

标签: java char data-conversion


【解决方案1】:
  1. 两个版本不等价:

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

  3. 虽然相对而言差异很大,但绝对而言却非常小。


我同意 cmets 的说法,他们认为这很可能是一种过早的优化。

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


我经常使用它,所以想知道我是否使用了最有效的一个。

这绝对是过早的优化:-)

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

【讨论】:

    【解决方案2】:

    好吧,Character.getNumericValue() 考虑了 Unicoderadixcaseculture

     '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
    

    同时

    number - '0'
    

    只是两个ints 的减法。这就是为什么Character.getNumericValue() 不可避免地变慢(几纳秒,值得优化吗?)。但是,请注意,在'A', 'f', '³', '*' 等情况下,number - '0' 代码会出现错误

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-08
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      • 2013-05-25
      • 2013-02-17
      • 2016-05-20
      • 1970-01-01
      相关资源
      最近更新 更多