Java - 将整数转换为字符串

532

给定一个数字:

int number = 1234;
哪种方法是将此内容转换为字符串的“最佳”方式:
String stringNumber = "1234";

我已经尝试搜索(谷歌)答案,但是很多结果都不太可信。


@lokesh,我正在查看字符串类中valueOf实现的代码 - http://hg.openjdk.java.net/jdk8/jdk8/jdk/file/687fd7c7986d/src/share/classes/java/lang/String.java。在String.valueOf内部将调用toString方法,相当于代理。 - committedandroider
6个回答

1024

有多种方法:

  • String.valueOf(number)(我的首选)
  • "" + number(我不知道编译器如何处理它,也许和上面的一样有效)
  • Integer.toString(number)

4
@Trufa - 在这三个中我会使用valueOf()方法。 - CoolBeans
7
它们实际上是相同的(最后一个调用第一个,第二个被编译成第一个)。我更喜欢第一个。 - Bozho
25
@Bozho,你上一条评论的顺序是颠倒的。实际上,第一种方式调用了最后一种方式。(请参见JDK中字符串源代码:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/lang/String.java?av=f) - ingyhere
4
int oopsPitfall = 0700; String.valueOf(oopsPitfall); 把整数变量oopsPitfall赋值为八进制的0700,然后将其转换为字符串类型。 - JBA
3
如果在整数前面加零,它仍然被视为八进制。因此,String.valueof() 的结果实际上是正确的,而不是一个陷阱。 - posixKing
显示剩余10条评论

65

Integer类拥有静态方法toString() - 您可以使用它:

int i = 1234;
String str = Integer.toString(i);
返回表示指定整数的字符串对象。该参数被转换为带符号的十进制表示,并作为字符串返回,就像将该参数和基数10作为参数传递给toString(int, int)方法一样。

51

始终使用 String.valueOf(number)Integer.toString(number)

使用 "" + number 是一个额外的开销,会执行以下操作:

StringBuilder sb = new StringBuilder();
sb.append("");
sb.append(number);
return sb.toString();

1
字节码编译器不能优化掉这个吗?我本来期望优化器会移除 sb.append("")。但是我对 Java 中的编译器优化不是很了解。 - Gellweiler
可以。Java 11编译器会生成makeConcatWithConstants方法的调用。一些旧版本可能使用StringBuffer。 - Pavel Vlasov

46
这样做很好。相当可靠。: )
    ""+number;

仅为澄清,除非你在寻求微观优化,否则这是可行且可接受的使用方法。


6
非常感谢,这实际上有效,但我不喜欢它(并非由于技术原因)。我只是“感觉”它像是一个 hack 而不是真正的解决方案(可能不是真的)。 - Trufa
2
你的答案有很多额外的开销(它相当于 new StringBuilder().append("").append(number).toString())。 - Solomon Ucko
@SolomonUcko,能告诉我您得到这一信息的来源吗?如果是正确的,我想为答案增添内容。 - Nishant
例如:https://dev59.com/JnVD5IYBdhLWcg3wOo9h#47626 - Solomon Ucko

22

我知道将整数转换为字符串的方法是使用以下代码:

Integer.toString(int);
String.valueOf(int);
如果您有一个整数 i 和一个字符串 s,则以下内容适用:
int i;
String s = Integer.toString(i); or
String s = String.valueOf(i);

如果你想将字符串 "s" 转换成整数 "i",则以下方法可行:

i = Integer.valueOf(s).intValue();

1
Integer.toString(i)String.valueOf(i) 有什么区别? - Kiquenet

1
这是我用来将整数转换为字符串的方法。如果我做错了,请纠正我。
/**
 * @param a
 * @return
 */
private String convertToString(int a) {

    int c;
    char m;
    StringBuilder ans = new StringBuilder();
    // convert the String to int
    while (a > 0) {
        c = a % 10;
        a = a / 10;
        m = (char) ('0' + c);
        ans.append(m);
    }
    return ans.reverse().toString();
}

25
(1) 不支持负数 [你是喜欢无符号整数的C开发者吗?] (2) 依赖截断 [我们都知道assume的意思…] (3) 过于啰嗦 (4) 为什么?! - ingyhere
1
除了@ingyhere描述的问题之外,它还不能处理前导零。输入0123会变成83。 - Martin
1
完全没有理由去做这些。你试图从整数反向削减每个数字,手动将每个数字转换为字符,逐个将每个数字附加到字符串构建器中,然后将整个字符串翻转以恢复原始顺序。为什么? StringBuilder可以在一次调用append中接受整个整数!而且它适用于您的代码无法处理的所有特殊情况。您可以使用StringBuilder sb = new StringBuilder(); sb.append(intValue); return sb.toString();替换整个内容。 - user229044

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接