将整数连接成字符串的最快方法
Fastest way to concatenate an integer into a string
我有一个对象,在初始化时它接受一个字符串来标识它的名称。
String name = "MyObject" + Integer.toString(objectNum);
object = new Object(name);
在上面的示例中,名称遵循这样的约定,即整数与字符串“MyObject”连接。一位同事抱怨说,从性能的角度来看,我编写这段代码的方式实际上很糟糕,因为 int 到 string 的转换。该号码作为 int 接收,对此我无能为力。对象参数必须包含一个字符串。我怎样才能让它更快?使用字符串格式会有帮助吗?
"MyObject" + objectNum
最好。 objectNum
自动有效地转换为 String
.
关注可读性,让Java担心连接它的最佳方式。
"MyObject" + Integer.toString(objectNum)
的性能问题在于它显式地从 int
创建了一个 String
,然后将其连接到前面的 String
。它往往被编译成类似的东西:
new StringBuilder("MyObject").append(Integer.toString(objectNum)).toString()
这是...一种可行的方法。
但是,StringBuilder
有 append(int)
,如果它知道参数是 int
,它可以更有效地做事。 "MyObject" + objectNum
仍然变成这样:
new StringBuilder("MyObject").append(objectNum).toString()
这只是避免为 objectNum
.
创建 String
综上所述,JIT 可以很好地识别 "MyObject" + Integer.toString(objectNum)
模式,并像 "MyObject" + objectNum
一样有效地执行它(反之亦然,ofc,如果它确定效率更高),所以可能没有实际性能差异。
鉴于此,您应该使用更易于阅读的表单,并相信 JIT 会完成它的工作并尽可能快地执行代码。
从性能的角度来看,我认为您的代码很好。
“MyObject”字面量将被保留,然后重新使用,每次您分配“名称”时,您都会创建一个新字符串,所以我真的不知道如何才能更快地 运行 。 (也许将 objectNum 存储在对象中而不是名称中,然后仅在你想打印整个标识符时才连接?我想你会这样节省几飞秒...)
就我个人而言,我会使用这种方法(主要是为了可读性,而且它在执行方面并不是最快的):
字符串名称 = String.format("MyObject%d", objectNum);
我有一个对象,在初始化时它接受一个字符串来标识它的名称。
String name = "MyObject" + Integer.toString(objectNum);
object = new Object(name);
在上面的示例中,名称遵循这样的约定,即整数与字符串“MyObject”连接。一位同事抱怨说,从性能的角度来看,我编写这段代码的方式实际上很糟糕,因为 int 到 string 的转换。该号码作为 int 接收,对此我无能为力。对象参数必须包含一个字符串。我怎样才能让它更快?使用字符串格式会有帮助吗?
"MyObject" + objectNum
最好。 objectNum
自动有效地转换为 String
.
关注可读性,让Java担心连接它的最佳方式。
"MyObject" + Integer.toString(objectNum)
的性能问题在于它显式地从 int
创建了一个 String
,然后将其连接到前面的 String
。它往往被编译成类似的东西:
new StringBuilder("MyObject").append(Integer.toString(objectNum)).toString()
这是...一种可行的方法。
但是,StringBuilder
有 append(int)
,如果它知道参数是 int
,它可以更有效地做事。 "MyObject" + objectNum
仍然变成这样:
new StringBuilder("MyObject").append(objectNum).toString()
这只是避免为 objectNum
.
String
综上所述,JIT 可以很好地识别 "MyObject" + Integer.toString(objectNum)
模式,并像 "MyObject" + objectNum
一样有效地执行它(反之亦然,ofc,如果它确定效率更高),所以可能没有实际性能差异。
鉴于此,您应该使用更易于阅读的表单,并相信 JIT 会完成它的工作并尽可能快地执行代码。
从性能的角度来看,我认为您的代码很好。 “MyObject”字面量将被保留,然后重新使用,每次您分配“名称”时,您都会创建一个新字符串,所以我真的不知道如何才能更快地 运行 。 (也许将 objectNum 存储在对象中而不是名称中,然后仅在你想打印整个标识符时才连接?我想你会这样节省几飞秒...)
就我个人而言,我会使用这种方法(主要是为了可读性,而且它在执行方面并不是最快的): 字符串名称 = String.format("MyObject%d", objectNum);