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更有效。