是使用(“”+ )转换为String的不良做法?
是使用Java转换为String
"" +
不好的做法? 与String.valueOf(…)相比,它有任何缺点吗?
代码示例:
int i = 25; return "" + i;
VS:
int i = 25; return String.valueOf(i);
更新:(来自评论)
那么Integer.toString(int i)与String.valueOf(…)相比呢?
我总是喜欢String.valueOf
版本:主要是因为它显示了你想要做的事情。 目标不是字符串连接 – 它是转换为字符串,“ i
的字符串值”。
第一种forms也可能效率低下 – 取决于编译器是否发现了您正在做的事情。 如果没有,则可能是创建一个新的StringBuffer或StringBuilder并附加该值,然后将其转换为字符串。
有趣的是,我有一篇关于这个话题的文章 – 几年前写的; 我网站上的第一篇Java文章之一,IIRC。
还有Integer.toString(int i) ,它为您提供了将字符串作为hex值的选项(通过传递第二个参数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()
一个可读性参数,因为它允许您更改参数的类型(甚至处理空值!),并且性能差异可以忽略不计。
绝对使用String.valueOf(i)。
虽然我不确定编译器端的优化,但最坏的情况是使用“”+:
- “”创建一个新的空字符串。
- “”+创建一个StringBuilder(Java 1.5-16)
- 然后将“”附加到StringBuilder
换句话说,如果使用字符串添加,会发生很多开销。 这就是为什么不建议在循环中的字符串上使用+运算符。 通常,在可能的情况下,始终使用Boolean.valueOf,Integer.valueOf,String.valueOf …等。 你将节省内存和开销。
无论性能如何考虑,我认为第一个变体真的很难看。 恕我直言,令人遗憾的是,这种“动态铸造”在Java中甚至是可能的。
是的,这是恕我直言的一个坏习惯。
它需要内存分配(除非编译器和/或JIT优化它们)。 更重要的是,它将不那么明显,这些代码试图做什么。
我个人不喜欢"" + i
的风格,但这确实是一个偏好/编码标准的事情。 理想情况下,编译器会将它们优化为等效代码(尽管您必须进行反编译以查看它是否确实存在),但从技术上讲,没有优化, "" + i
效率更低,因为它创建了一个不需要的StringBuilder对象。
我可以想到的是,在第一个示例中,将创建比第二个示例更多的String对象(以及实际执行连接的附加StringBuilder)。
但是你实际上要做的是从int创建一个String对象而不是用String连接一个String,所以去:
String.valueOf(...);
选项,
所以是的,你的第一个选择是糟糕的做法