【问题标题】:Fastest way to concatenate an integer into a string将整数连接成字符串的最快方法
【发布时间】:2021-07-09 14:55:38
【问题描述】:

我有一个对象,它在初始化时接受一个字符串来识别它的名称。

String name = "MyObject" + Integer.toString(objectNum);
object = new Object(name);

在上面的示例中,名称遵循一个约定,即整数与字符串“MyObject”连接。一位同事抱怨说,从性能的角度来看,我编写这段代码的方式实际上很糟糕,因为 int 到 string 的转换。该数字作为 int 接收,对此我无能为力。对象参数必须采用字符串。我怎样才能更快地做到这一点?使用字符串格式会有帮助吗?

【问题讨论】:

  • "MyObject" + objectNum。注重可读性。
  • 如果你想快速,不要做一大堆字符串操作,使用Java。不要担心过早的优化。首先让代码可维护。
  • 如果你使用一个不错的 IDE(例如,我刚刚查看了 intellij),它会告诉你使用 "MyObject" + objectNum
  • 字符串名称 = "MyObject" + objectNum
  • “一位同事抱怨说我写这段代码的方式实际上从性能的角度来看很糟糕”你应该请同事解释一下。我同意他们的观点,但如果他们有强烈的意见将其描述为“可怕”,他们应该能够用一些东西来支持这一点。

标签: java string type-conversion


【解决方案1】:
"MyObject" + objectNum

最好。 objectNum 会自动有效地转换为 String

专注于可读性,让 Java 操心最好的连接方式。


"MyObject" + Integer.toString(objectNum) 的性能问题在于它显式地从int 创建了一个String,然后将其连接到前面的String。它往往被编译为:

new StringBuilder("MyObject").append(Integer.toString(objectNum)).toString()

这是……一种可行的方法。

但是,StringBuilderappend(int),如果它知道参数是int,它就能更有效地做事。 "MyObject" + objectNum 还是会变成这样:

new StringBuilder("MyObject").append(objectNum).toString()

这只是避免为objectNum 创建String


话虽如此,JIT 可以很好地识别"MyObject" + Integer.toString(objectNum) 模式,并像"MyObject" + objectNum 一样有效地执行它(反之亦然,ofc,如果它确定这样做更有效),因此可能没有实际性能区别。

鉴于此,您应该使用更易于阅读的表单,并相信 JIT 会尽其所能并尽可能快地执行代码。

【讨论】:

    【解决方案2】:

    我想说你的代码很好,因为它从性能的角度来看。 “MyObject”字面量将被保留,然后只是重用,每次分配“name”时,无论如何都会创建一个新字符串,所以我真的不知道如何让它运行得更快。 (也许将 objectNum 存储在对象中而不是名称中,然后仅在您想打印整个标识符时才进行连接?我想您这样可以节省几飞秒...)

    就我个人而言,我会使用这种方法(主要是为了可读性,而且它在执行方面并不是最快的): 字符串名称 = String.format("MyObject%d", objectNum);

    【讨论】:

    • String.format 几乎肯定会比直接连接慢,因为它必须做很多工作来解析每次执行时的格式字符串(即使它是文字),然后构建结果;远远超过StringBuilder 所做的工作。
    • 纯粹看性能,你是对的。我编辑了答案以更好地解释我的建议。
    猜你喜欢
    • 1970-01-01
    • 2012-02-04
    • 2023-03-03
    • 1970-01-01
    • 2015-12-18
    • 2013-07-23
    • 2014-03-19
    • 2010-09-19
    • 1970-01-01
    相关资源
    最近更新 更多