stringvalueOf与空string连接

我正在从事Java代码优化工作。 我不清楚String.valueOf+""符号之间的区别:

 int intVar = 1; String strVar = intVar + ""; String strVar = String.valueOf(intVar); 

第2行和第3行有什么不同?

 public void foo(){ int intVar = 5; String strVar = intVar+""; } 

这种方法使用StringBuilder来创build结果string

 public void foo(); Code: 0: iconst_5 1: istore_1 2: new #2; //class java/lang/StringBuilder 5: dup 6: invokespecial #3; //Method java/lang/StringBuilder."<init>":()V 9: iload_1 10: invokevirtual #4; //Method java/lang/StringBuilder.append:(I)Ljava/lan g/StringBuilder; 13: ldc #5; //String 15: invokevirtual #6; //Method java/lang/StringBuilder.append:(Ljava/lang/ String;)Ljava/lang/StringBuilder; 18: invokevirtual #7; //Method java/lang/StringBuilder.toString:()Ljava/la ng/String; 21: astore_2 22: return 

 public void bar(){ int intVar = 5; String strVar = String.valueOf(intVar); } 

这种方法简单地调用String的静态方法来获取int的String版本

 public void bar(); Code: 0: iconst_5 1: istore_1 2: iload_1 3: invokestatic #8; //Method java/lang/String.valueOf:(I)Ljava/lang/Stri ng; 6: astore_2 7: return 

然后调用Integer.toString()

问自己代码的目的。 是否:

  • 用一个值连接一个空string
  • 将值转换为string

这听起来更像是后者…这就是为什么我会使用String.valueOf 。 只要你能够像描述你想要实现的一样来读取你的代码,这是一件好事。

请注意,这适用于所有types,并且在传递null引用时将返回“null”,而不是抛出NullPointerException 。 如果你正在使用一个类(在这个例子中不是一个int ),你希望它抛出一个exception,如果它是空的(例如,因为这代表了一个错误),请改用引用toString

使用String.valueOf(int)或更好的方法, Integer.toString(int)对于机器来说相对更有效率。 但是,除非性能是至关重要的(在这种情况下,我不build议你使用)然后""+ x是更有效地利用你的时间。 恕我直言,这通常更重要。 有时候更重要。

换句话说, ""+浪费一个对象,但Integer.toString()创build几个。 要么你的时间更重要,要么避免不惜一切代价创造物体。 你不太可能会创build几个对象是好的,但创build一个不是。

我更喜欢valueOf() ,因为我认为它更可读和明确。

对性能的任何担忧都是微不足道的优化。 我不会担心他们,直到我可以做一个测量,并看到他们有所作为。

第一行相当于

 String strVal = String.valueOf(intVar) + ""; 

所以有一些额外的(无意义的)工作要做。 不知道编译器是否优化了与空string文字的连接。 如果没有(并且看@ Jigar的答案显然没有),这将会变成

 String strVal = new StringBuilder().append(String.valueOf(intVar)) .append("").toString(); 

所以你应该直接使用String.valueOf。

连接string和其他variables实际上使用下面的String.valueOf() (和StringBuilder ),所以编译器将有希望丢弃空string,并在这两种情况下产生相同的字节码。

从优化的angular度来说,我会一直比较喜欢两者之间的String.valueOf() 。 第一个只是一个黑客,试图欺骗intVar转换成一个String因为+运算符。

 String strVar1 = intVar+""; String strVar2 = String.valueOf(intVar); 

strVar1等价于strVar2,但是使用int + emptyString“”并不是一个很好的方法。

使用valueOf更有效。