我可以使用
将整数转换为字符串String s = "" + 4; // correct, but poor style
or
String u = Integer.toString(4); // this is good
我可以使用
将double转换为字符串String s = "" + 4.5; // correct, but poor style
or
String u = Double.toString(4.5); // this is good
我可以使用String s = "" + data
方法将int或double转换为String。如果我想使用toString()
的其他方法,我必须使用每种数据类型的Wrapper类。那么为什么在some books中提到第一种方法是差的,而第二种方法则更好。 哪种方法更好,为什么?
答案 0 :(得分:66)
我会用
String.valueOf(...)
您可以对所有类型使用相同的代码,但不会出现可怕且无意义的字符串连接。
请注意,它也会准确说出您想要的内容 - 与给定原始值对应的字符串值。将其与"" + x
方法进行比较,即使您无意连接任何内容,也应用字符串连接,并且空字符串与您无关。 (它可能更昂贵,但是我更关注的是可读性,而不是性能。)
答案 1 :(得分:31)
String.valueOf()
怎么样?对于所有原始类型,重写重写,并为toString()
委托参考类型。
答案 2 :(得分:10)
String s = "" + 4;
编译为此代码:
StringBuffer _$_helper = new StringBuffer("");
_$_helper.append(Integer.toString(4));
String s = _$_helper.toString();
显然这很浪费。 请记住,在场景后面,如果在String中使用+ in
,编译器总是使用StringBuffers答案 3 :(得分:9)
还有第三个 - String.valueOf(..)
(调用Wrapper.toString(..)
实际上编译器会在这些地方添加Wrapper.toString(..)
,所以它在字节码方面是相同的。但""+x
更加丑陋。
答案 4 :(得分:6)
字符串连接方式创建了一个额外的对象(然后获得GCed),这就是为什么它被认为是“更穷”的一个原因。此外,它更棘手,更不易读,正如Jon Skeet指出的那样,通常是一个更大的考虑因素。
答案 5 :(得分:4)
我还会使用String.valueOf()
方法,实际上,它使用原始类型的Wrapper对象并为您调用toString()
方法:
示例,在String
类中:
public static String valueOf(int i) {
return Integer.toString(i, 10);
}
答案 6 :(得分:2)
附加双引号是一种不好的方法,尤其是为了提高可读性。我会考虑使用一些Apache util类进行转换或编写自己的实用程序方法来执行此类操作。
答案 7 :(得分:1)
您最好知道要尝试转换为字符串的参数类型,并使编译器知道该类型。这简化了操作以及循环。当你遵循append方法时,你将类型决定留给编译器,并增加编译器的代码行来做同样的事情。
答案 8 :(得分:1)
我认为答案实际上取决于您要转换的内容以及出于何种目的,但总的来说,我不喜欢进行裸转换,因为在大多数情况下,转换为字符串是为了记录或其他人类可读性目的。
MessageFormat.format("The value of XYZ object is {0}", object);
这提供了良好的可读性,对输出格式的细粒度控制,更重要的是,它可以通过用消息包引用替换字符串来实现国际化。
我是否需要提及这也避免了调用object.toString()的可能的NPE问题?