原始+“”与Wrapper.toString(原始)

时间:2012-12-25 01:10:21

标签: java coding-style

当需要将基元转换为String时,例如传递给需要String的方法时,基本上有两个选项。

int为例,给出:

int i;

我们可以做以下其中一项:

someStringMethod(Integer.toString(i));
someStringMethod(i + "");

第一个是“正式”方法,第二个方法似乎有些“黑客”。

这肯定是代码少得多,更容易阅读“hack”恕我直言 但使用“黑客”是否是“好”的编码风格?

4 个答案:

答案 0 :(得分:4)

这不是一个好主意,但它不会是非常有害的。

在两个示例中,JVM都调用Integer.toString()(即使不是在第一种情况下直接调用)。

在第二个示例中,JVM可能构造两个字符串,然后生成连接的结果。根据优化情况,这可能会导致0,1或2个额外字符串进行垃圾收集。

从代码编写的角度来看,第三个更短,但也可能不太透明。

第二种可读性方法的问题如下:

int i = 1, j = 2;
someStringMethod(i + j + "" + i + j + "");

产地:

someStringMethod(312);

而不是

someStringMethod(33);

答案 1 :(得分:4)

将*转换为String的最佳方法是使用:

String.valueOf(x)

它适用于原始类型,包装类和实现toString()的对象。

其中x是任何类型的基元或对象。如果为null,则返回字符串'null'。

这是最好的原因,因为使用“+”操作数意味着字符串连接,加上“”意味着字符串实例化。如果您使用“”+反编译一个类,您将看到编译器将其转换为多个操作。

“”连接结果与String.valueOf()相同,但它更贵一点。 性能差异可能是微不足道的,但是当有更好的方法时,优秀的程序员不会写'“”+某些东西来将某些内容转换为String,这恰好是正确的方式:)。

对于数组,请查看Arrays.toString()和-better- Arrays.deepToString()

  

但使用“黑客”是否是“好”的编码风格?

有时语法黑客会使代码变得更好。但是上面的案例并不是真正的案例之一。 “”连接不被认为是好的代码。

一个有用的语法黑客的例子是双括号实例化:

List<String> list = new ArrayList<String>() {{
    add("foo");
    add("bar");
    add("baz");
}};

而不是

List<String> list = new ArrayList<String>();
list.add("foo");
list.add("bar");
list.add("baz");

“+”更像是一种代码气味而不是提高可读性的黑客;任何有经验的人都会想到一个缺乏API和语言知识的Java开发人员。

其他有趣的“黑客”是流畅的API(如Mockito),dsl或lambda4j之类的东西,这是一个非常黑客。

答案 2 :(得分:1)

当使用+符号形成字符串时,jvm将创建一个中间字符串/ stringbuffer对象来执行trasnformation,这不是最佳方式。 此外,+符号是左关联的,因此当在&#34;&#34; + 1 + 2 等表达式中使用时,将导致12而不是&#34; 3&#34;。因此& #39;最好使用String.toValue()或Type.toString()。

答案 3 :(得分:0)

java中的连接符号是+。 因此,您将(i + "")的结果转换为String,因为您将空字符串连接到示例代码中的数字 这两种方式都很好但我通常使用String.valueOf(x);