当需要将基元转换为String时,例如传递给需要String的方法时,基本上有两个选项。
以int
为例,给出:
int i;
我们可以做以下其中一项:
someStringMethod(Integer.toString(i));
someStringMethod(i + "");
第一个是“正式”方法,第二个方法似乎有些“黑客”。
这肯定是代码少得多,更容易阅读“hack”恕我直言 但使用“黑客”是否是“好”的编码风格?
答案 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);