Java中int转换为String - Integer.toString(i)与new Integer(i).toString()的区别

442
有时候Java让我感到困惑。我需要初始化很多int类型的变量。
这两种方法有什么区别呢?
1. Integer.toString(i) 2. new Integer(i).toString()

20
我会使用 "" + 42,但这只是我的个人偏好。第二种形式将产生一个新的整数对象(对于大多数i的值)作为中间结果。它也需要更多的打字。 - user166390
16
如果中间对象让你有顾虑,那么 "" + 42 也不会更好,因为它需要一个中间的 StringBuilder,而这比一个 Integer 更重。 - Joachim Sauer
49
"+ 42"可能会起作用,但这是一个不好的主意。像我这样的人会来查看你的代码,试图弄清楚空字符串到底发生了什么。 - Mainguy
3
我不建议使用 "" + 42,因为在将整数字符串连接起来时,你可能会不经意地将它们相加而没有注意到。 - BoltzmannBrain
23
如果你不喜欢大量的打字,那么你可能不应该使用Java编程。 - Adam Pierce
显示剩余3条评论
11个回答

562

Integer.toString 调用了 Integer 类中的静态方法,不需要使用 Integer 实例。

如果你调用 new Integer(i),则会创建一个 Integer 类型的实例,它是一个完整的 Java 对象,封装了你的 int 值。然后你可以在这个实例上调用 toString 方法,让它返回一个代表自己的字符串表示。

如果你只想打印一个 int,那么使用第一种方式更轻量、更快,并且不会消耗额外的内存(除了返回的字符串)。

如果你需要一个表示整数值的对象,例如将其放入集合中,那么你应该使用第二种方式,因为它提供了一个完整的对象来执行各种你无法通过裸露的 int 值完成的操作。


97

new Integer(i).toString() 首先创建一个(冗余的)包装对象,围绕着i(它本身可能是一个包装对象 Integer)。

Integer.toString(i) 是首选的,因为它不会创建任何不必要的对象。


47

另一种选择是静态的String.valueOf方法。

String.valueOf(i)

对我来说,感觉Integer.toString(i)更加正确。当i的类型发生变化时,例如从intdouble,代码将保持正确。


2
是的。除非必须使用 RADIX(在这种情况下,您必须使用 Integer.toString) - marcolopes

14

我也强烈推荐使用

int integer = 42;
String string = integer + "";

简单而有效。


39
这绝对是不好的写法,因为它依赖于Java语言中相当微妙的部分,并且比使用Integer.toString(i)更低效。请查阅这篇Stack Overflow文章 - rickcnagy
这可能会效率低下。我建议使用一些常规选择,比如 Integer.toString 或 String.valueOf。在这里检查 http://javadevnotes.com/java-integer-to-string-examples - JavaDev
通常这种不直观的方式并不是个好主意。更明显的选择,例如 Integer.toString() 也许需要输入更多字符,但是更加清晰易懂,这在想要维护代码时至关重要。 - Calvin Li
这样做不会自动调用整数变量的 toString() 方法吗? - Ankit Deshpande

14
  1. new Integer(i).toString();

    这个语句创建了一个Integer对象,然后调用它的toString(i)方法返回Integer值的字符串表示形式

  2. Integer.toString(i);

    这个方法返回表示特定int(整数)的String对象,但是这里的toString(int)是一个静态方法。

简而言之,第一种情况返回对象的字符串表示形式,而第二种情况返回整数的字符串表示形式。


12

虽然我喜欢fhucho的建议

String.valueOf(i)

讽刺的是,这种方法实际上调用了

Integer.toString(i)

因此,如果你喜欢它的读音而且不需要进制,那么使用String.valueOf(i),但要知道这比Integer.toString(i)效率低。


4

在性能测量方面,如果您考虑时间性能,则 Integer.toString(i); 在调用少于一亿次时是昂贵的。而如果超过一亿次,则 new Integer(10).toString() 的性能更好。

以下是可以尝试测量性能的代码:

public static void main(String args[]) {
            int MAX_ITERATION = 10000000;
        long starttime = System.currentTimeMillis();
        for (int i = 0; i < MAX_ITERATION; ++i) {
            String s = Integer.toString(10);
        }
        long endtime = System.currentTimeMillis();
        System.out.println("diff1: " + (endtime-starttime));

        starttime = System.currentTimeMillis();
        for (int i = 0; i < MAX_ITERATION; ++i) {
            String s1 = new Integer(10).toString();
        }
        endtime = System.currentTimeMillis();
        System.out.println("diff2: " + (endtime-starttime));
    }

就内存而言,每次执行

new Integer(i).toString();

会占用更多的内存,因为它会每次创建对象,导致内存碎片化。


2
我把这段代码粘贴到了IntelliJ IDEA中,然后收到了一个警告:"new Integer(10).toString()可以简化为Integer.toString(10)"。 - oksayt
1
这段代码对我有效。使用Integer.toString(10)大约需要420毫秒,而使用new Integer(10).toString()则需要525毫秒。 - Jake Stevens-Haas
1
请参考 https://dev59.com/hHRB5IYBdhLWcg3wz6UK,了解如何编写正确的Java微基准测试。 - Petr Tuma
最好先热身一下,否则结果无效! - sixones
1
如果你在某种情况下说一个东西很贵,而在另一种情况下说另一个东西更好,那就意味着在所有情况下另一个东西都更好/更便宜。 - Sgene9

2

更好的方式:

Integer.valueOf(i).toString()

1
我认为这样更好,因为正如@Dhiraj所指出的那样,在内存方面,"new Integer(i).toString();"会占用更多的内存,因为它创建了一个新对象,而不是只获取整数值并将其转换为字符串。 - Patricia
4
@Lucy Integer.valueOf(i) 返回一个新的整数对象,因此没有区别。 - inigoD
你根本没有回答问题。问题是什么是blah和blah之间的区别,而不是什么是blah的更好替代品。 - ahitt6345

2

简单的方法就是将""与整数连接起来:

int i = 100;

String s = "" + i;

现在,s将会有一个字符串值为100


1

这里的Integer.toString调用了Integer类中的静态方法。它不需要对象来调用。

如果你调用new Integer(i),首先会创建一个类型为Integer的实例,它是一个完整的Java对象,封装了你的int i的值。然后你调用它的toString方法来请求它返回自己的字符串表示形式。


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