从字符串,整数和浮点数构建字符串的最高效方法是什么?目前我正在这样做,它使用了大量的cpu时间。
String frame = this.frameTime + ":" +
this.player.vertices[0].x + "," +
this.player.vertices[0].y + "," +
this.player.activeAnimId + "," +
(int)this.player.virtualSpeed + "," +
this.map.getCurrentTime() +
(this.player.frameSound == -1 ? "" : "," + this.player.frameSound) +
(this.player.frameDecal.equals("") ? "" : "," + this.player.frameDecal) +
";";
有没有办法更快地完成这项工作?
答案 0 :(得分:19)
这应该已经很快了 - 它会在内部使用StringBuilder
进行连接。可以明确地使用StringBuilder
可以消除空字符串的连接,但它不太可能产生很大的不同。
你有多少次这样做?它必须经常发生,因为它是一个瓶颈......你真的需要经常这样做吗?
编辑:对于那些说“使用StringBuilder,它会更快”的人 - 请考虑以下代码:
public class Test
{
public static void main(String[] args)
{
int x = 10;
int y = 20;
int z = 30;
String foo = x + "," + y + "," + z + ";";
System.out.println(foo);
}
}
编译它,然后使用javap -c
查看编译器生成的内容......
答案 1 :(得分:1)
您可以尝试使用StringBuilder
。
(但是,大多数值得盐的Java编译器会自动优化您列出的代码,以便在幕后使用StringBuilder
。)
答案 2 :(得分:1)
使用StringBuilder
。
String string = new StringBuilder("abcd").append(23).append(false).append("xyz").toString();
答案 3 :(得分:1)
如果你想要它的速度非常快,你可以尝试我的库,它允许你在微秒内记录消息,而不会产生任何垃圾。 https://github.com/peter-lawrey/Java-Chronicle
(正如我所说,它可能超出你想要的顶部)
答案 4 :(得分:-1)
concat3方法对我来说效果最快,concat1的性能依赖于jvm实现/优化,它可能在其他版本的JVM中表现更好但是在我的windows机器和我测试的远程linux red hat机器上显示concat3工作速度最快..
public class StringConcat {
public static void main(String[] args) {
int run = 100 * 1000 * 1000;
long startTime, total = 0;
final String a = "aafswerg";
final String b = "assdfsaf";
final String c = "aasfasfsaf";
final String d = "afafafdaa";
final String e = "afdassadf";
startTime = System.currentTimeMillis();
concat1(run, a, b, c, d, e);
total = System.currentTimeMillis() - startTime;
System.out.println(total);
startTime = System.currentTimeMillis();
concat2(run, a, b, c, d, e);
total = System.currentTimeMillis() - startTime;
System.out.println(total);
startTime = System.currentTimeMillis();
concat3(run, a, b, c, d, e);
total = System.currentTimeMillis() - startTime;
System.out.println(total);
}
private static void concat3(int run, String a, String b, String c, String d, String e) {
for (int i = 0; i < run; i++) {
String str = new StringBuilder(a.length() + b.length() + c.length() + d.length() + e.length()).append(a)
.append(b).append(c).append(d).append(e).toString();
}
}
private static void concat2(int run, String a, String b, String c, String d, String e) {
for (int i = 0; i < run; i++) {
String str = new StringBuilder(a).append(b).append(c).append(d).append(e).toString();
}
}
private static void concat1(int run, String a, String b, String c, String d, String e) {
for (int i = 0; i < run; i++) {
String str = a + b + c + d + e;
}
}
}