是使用(“”+ )转换为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)。

虽然我不确定编译器端的优化,但最坏的情况是使用“”+:

  1. “”创建一个新的空字符串。
  2. “”+创建一个StringBuilder(Java 1.5-16)
  3. 然后将“”附加到StringBuilder

换句话说,如果使用字符串添加,会发生很多开销。 这就是为什么不建议在循环中的字符串上使用+运算符。 通常,在可能的情况下,始终使用Boolean.valueOf,Integer.valueOf,String.valueOf …等。 你将节省内存和开销。

无论性能如何考虑,我认为第一个变体真的很难看。 恕我直言,令人遗憾的是,这种“动态铸造”在Java中甚至是可能的。

是的,这是恕我直言的一个坏习惯。

它需要内存分配(除非编译器和/或JIT优化它们)。 更重要的是,它将不那么明显,这些代码试图做什么。

我个人不喜欢"" + i的风格,但这确实是一个偏好/编码标准的事情。 理想情况下,编译器会将它们优化为等效代码(尽管您必须进行反编译以查看它是否确实存在),但从技术上讲,没有优化, "" + i效率更低,因为它创建了一个不需要的StringBuilder对象。

我可以想到的是,在第一个示例中,将创建比第二个示例更多的String对象(以及实际执行连接的附加StringBuilder)。

但是你实际上要做的是从int创建一个String对象而不是用String连接一个String,所以去:

 String.valueOf(...); 

选项,

所以是的,你的第一个选择是糟糕的做法