添加一个空字符串vs toString – 为什么它不好?
根据工具PMD,以下是一种不好的做法:
String s = "" + 123; // bad String t = Integer.toString(456); // ok This is an inefficient way to convert any type to a `String`.
为什么这样做是件坏事?
String s = "" + 123; // bad String t = Integer.toString(456);
将编译为:
String s = "123"; String t = Integer.toString(456);
所以:“”+ 123显然略胜一筹! 与JAD核实
public static void main(String args[]) { // 0 0:ldc1 #16 // 1 2:astore_1 // 2 3:sipush 456 // 3 6:invokestatic #18 // 4 9:astore_2 // 5 10:getstatic #24 // 6 13:new #30 // 7 16:dup // 8 17:aload_1 // 9 18:invokestatic #32 // 10 21:invokespecial #38 // 11 24:aload_2 // 12 25:invokevirtual #41 // 13 28:invokevirtual #45 // 14 31:invokevirtual #48 // 15 34:return }
编辑:
对于非常数值:
int i = 123; String s = (new StringBuilder()).append(i).toString(); String t = Integer.toString(i); System.out.println((new StringBuilder(String.valueOf(s))).append(t).toString()); public static void main(String args[]) { // 0 0:bipush 123 // 1 2:istore_1 // 2 3:new #16 // 3 6:dup // 4 7:invokespecial #18 // 5 10:iload_1 // 6 11:invokevirtual #19 // 7 14:invokevirtual #23 // 8 17:astore_2 // 9 18:iload_1 // 10 19:invokestatic #27 // 11 22:astore_3 // 12 23:getstatic #32 // 13 26:new #16 // 14 29:dup // 15 30:aload_2 // 16 31:invokestatic #38 // 17 34:invokespecial #44 // 18 37:aload_3 // 19 38:invokevirtual #47 // 20 41:invokevirtual #23 // 21 44:invokevirtual #50 // 22 47:return }
这是低效的,因为它涉及不需要的字符串连接,因此创建了一个或两个额外的String
对象 – 尽管我相信JIT可以优化它。
对我来说,更大的问题是代码不太清楚。 调用toString
是一个标准的习惯用法,每个Java开发人员都可以理解(希望如此:-),所以你应该更喜欢这个。
它扩展为“”+ String.valueOf(yourObject),从而执行不需要的连接。 连接涉及分配额外的字符串并执行字符串值的额外复制。
String s = "" + 123; // bad
上面的代码创建了一个临时字符串,用于组合“”和123