是使用(“”+ <int value =“”>)不良做法转换为String吗?</int>

时间:2009-10-15 14:27:15

标签: java string

使用

转换为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)呢?

8 个答案:

答案 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)。

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

  1. “”创建一个新的空字符串。
  2. “”+创建一个StringBuilder(Java 1.5-16)
  3. “”附加到StringBuilder,然后
  4. 换句话说,如果使用字符串添加,会发生很多开销。这就是为什么不建议在循环中的字符串上使用+运算符。通常,在可能的情况下,始终使用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

编译器可能会用常量替换字符串表达式。一个或另一个更容易识别为编译时常量吗?对于 ("" + ..) 构造来说,也许更容易?