添加一个空字符串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