1

当需要将原语转换为字符串时,例如传递给需要字符串的方法,基本上有两种选择。

int个例子,给定:

int i;

我们可以做以下之一:

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

第一个是“正式”方法,第二个似乎有点“hack”。

当然,代码更少,更容易阅读“hack”恕我直言。
但是使用“hack”是“好”的编码风格吗?

4

4 回答 4

4

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

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

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

从代码编写的角度来看,第三个更短,但对于正在发生的事情也可能不太透明。

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

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

产生:

someStringMethod(312);

并不是

someStringMethod(33);
于 2012-12-25T01:19:21.227 回答
4

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

String.valueOf(x)

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

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

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

"" 连接结果相同,String.valueOf()但它有点贵。性能差异可能可以忽略不计,但是当有更好的方法时,优秀的程序员不会编写 '"" + something' 来将某些内容转换为字符串,而这恰好是正确的方法:)。

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

但是使用“hack”是“好”的编码风格吗?

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

一个有用的句法技巧的例子是双括号实例化:

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");

""+something 更像是一种代码味道,而不是提高可读性的 hack;任何有经验的人都会想到缺乏 API 和语言知识的 Java 开发人员。

其他有趣的“hacks”是流畅的 API(如 Mockito)、dsl 或 lambda4j 之类的东西,这是一个相当不错的 hack。

于 2012-12-25T01:27:50.617 回答
1

当使用 + 号形成字符串时,jvm 会创建一个中间字符串/字符串缓冲区对象来进行转换,这不是最佳方式。此外,+ 符号是左关联的,所以当用于像 “”+1+2这样的表达式时,将产生 12 而不是“3”。所以最好使用 String.toValue() 或 Type.toString()。

于 2012-12-25T01:45:10.167 回答
0

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

于 2017-01-08T23:54:52.733 回答