使用
转换为Java中的String"" + <int value>
不好的做法?与 String.valueOf(...)?相比,它有任何缺点吗?
代码示例:
int i = 25;
return "" + i;
VS
int i = 25;
return String.valueOf(i);
更新:(来自评论)
与 String.valueOf(...)相比, Integer.toString(int i)呢?
答案 0 :(得分:33)
我总是更喜欢String.valueOf
版本:主要是因为它显示了您正在尝试做的事情。目标不是字符串连接 - 它是转换为字符串,“字符串值i
”。
第一种形式也可能效率低下 - 取决于编译器是否发现了您正在做的事情。如果没有,则可能是创建一个新的StringBuffer或StringBuilder并附加该值,然后将其转换为字符串。
有趣的是,我有一个article about this very topic - 多年前写的;我网站上的第一篇Java文章之一,IIRC。
答案 1 :(得分:11)
还有Integer.toString(int i),它允许你选择将字符串作为十六进制值(通过传递第二个参数16)。
编辑我刚检查了String类的来源:
public static String valueOf(int i) {
return Integer.toString(i, 10);
}
和整数类:
public static String toString(int i, int radix) {
if (radix < Character.MIN_RADIX || radix > Character.MAX_RADIX)
radix = 10;
/* Use the faster version */
if (radix == 10) {
return toString(i);
}
...
如果您致电String.valueOf(i)
,则会拨打Integer.toString(i, 10)
,然后拨打Integer.toString(i)
。
所以Integer.toString(i)
应该非常轻微比String.valueOf(i)
更快,因为你要删除两个函数调用。 (尽管编译器可以优化第一个函数调用。)
当然,仍然可以为String.valueOf()
创建一个可读性参数,因为它允许您更改参数的类型(甚至处理空值!),并且性能差异可以忽略不计。< /强>
答案 2 :(得分:9)
绝对使用String.valueOf(i)。
虽然我不确定编译器方面的优化,但最坏的情况是使用“”+:
换句话说,如果使用字符串添加,会发生很多开销。这就是为什么不建议在循环中的字符串上使用+运算符。通常,在可能的情况下,始终使用Boolean.valueOf,Integer.valueOf,String.valueOf ...等。你将节省内存和开销。
答案 3 :(得分:3)
无论性能如何考虑,我认为第一个变体真的很难看。恕我直言,令人遗憾的是,这种“动态铸造”在Java中甚至是可能的。
答案 4 :(得分:1)
是的,这是恕我直言,这是一种不好的做法。
它需要内存分配(除非编译器和/或JIT优化它们)。更重要的是,它会变得不那么明显,这段代码试图做什么。
答案 5 :(得分:0)
我个人不喜欢"" + i
的风格,但这确实是偏好/编码标准的事情。理想情况下,编译器会将这些优化为等效代码(尽管您必须进行反编译以查看它是否确实存在),但从技术上讲,如果没有优化,"" + i
效率会更低,因为它会创建一个不需要的StringBuilder对象。
答案 6 :(得分:0)
我可以想到的是,在你的第一个例子中,将创建比第二个示例更多的String对象(以及实际执行连接的附加StringBuilder)。
但是你实际上要做的是从int创建一个String对象而不是用String连接一个String,所以请转到:
String.valueOf(...);
选项,
所以是的,你的第一个选择是不好的做法!
答案 7 :(得分:0)
我想知道对于编译时常量有贡献的静态最终变量,什么是最好的:
span0
编译器可能会用常量替换字符串表达式。一个或另一个更容易识别为编译时常量吗?对于 ("" + ..) 构造来说,也许更容易?