Java int到String-Integer.toString(i)与新的Integer(i).toString()


428

有时,java使我感到困惑。
我要进行大量的int初始化。

什么是真正的差异?

  1. Integer.toString(i)
  2. new Integer(i).toString()

20
我只会用"" + 42,但嘿,就是我。形式#2将产生一个新的整数对象(对于i的大多数值)作为中间对象。它也更打字。

16
@pst:如果中间对象对您来说是个问题,那就"" + 42更好了,因为它需要一个StringBuilderInteger。重得多的中间对象。
约阿希姆·绍尔

47
“” + 42可能有效,但这不是一个好主意。像我这样的人会来看您的代码,并尝试弄清楚空字符串到底发生了什么。
Mainguy 2010年

3
我不建议这样做,"" + 42因为在附加整数字符串的情况下,您可能最终会添加值而无法实现。
BoltzmannBrain

20
如果您不喜欢很多类型的输入,那么您可能不应该使用Java进行编程。
亚当·皮尔斯

Answers:


548

Integer.toString在类中调用static方法Integer。它不需要的实例Integer

如果调用new Integer(i),则创建type的实例Integer,该实例是封装int值的完整Java对象。然后,toString在其上调用方法以要求它返回自身的字符串表示形式。

如果您只想打印int,则可以使用第一个,因为它更轻,更快并且不占用额外的内存(除了返回的字符串)。

如果您想要一个表示整数值的对象(例如,将其放入集合中),则可以使用第二个对象,因为它为您提供了一个成熟的对象,可以执行裸操作无法完成的所有事情int


96

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

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


43

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

String.valueOf(i)

对我来说,这感觉更合适Integer.toString(i)。当i的类型更改时,例如从intdouble,代码将保持正确。


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

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

    该语句创建Integer的对象,然后调用其方法toString(i)返回Integer的值的String表示形式

  2. Integer.toString(i);

    返回表示特定int(integer)的String对象,但这toString(int)是一个static方法。

Summary在第一种情况下返回对象的字符串表示形式,在第二种情况下,它返回整数的字符串表示形式。


13

我也强烈建议使用

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

简单有效。


38
这绝对是不好的形式,因为它都依赖于Java语言的相当细微的部分,并且效率不如Integer.toString(i)。看到这样的帖子
rickcnagy

这可能是低效的。我建议使用一些常规选择,例如Integer.toString或String.valueOf。在这里检查javadevnotes.com/java-integer-to-string-examples
JavaDev

以这种非直觉的方式做事通常是一个坏主意。诸如此类的更明显的选择Integer.toString()可能会使用一些额外的击键,但更为清晰,这对于维护代码非常重要。
Calvin Li

这不会自动调用整数变量的toString()方法吗?
Ankit Deshpande

11

虽然我喜欢fhucho的推荐

String.valueOf(i)

具有讽刺意味的是,该方法实际上调用了

Integer.toString(i)

因此,String.valueOf(i)如果您喜欢它的读取方式,并且不需要基数,也要知道它的效率不如,请使用Integer.toString(i)


4

在性能衡量方面,如果您考虑时间性能,则Integer.toString(i); 如果您拨打的电话少于1亿次,则价格昂贵。否则,如果调用次数超过1亿,则新的Integer(10).toString()的性能将更好。

以下是通过u可以尝试衡量性能的代码,

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

在记忆方面,

新的Integer(i).toString();

每次创建对象都会占用更多的内存,因此会发生内存碎片。


2
我将此代码粘贴到IntelliJ IDEA中,并得到警告:“ new Integer(10).toString() can be simplified to Integer.toString(10)
oksayt 2010年

该代码对我有用。对于Integer.toString(10),我得到大约420毫秒,对于新Integer(10).toString(),我得到525毫秒
Jake Stevens-Haas 2010年


请先帮忙进行预热,否则结果无效!
sixones 16/09/21

如果您说一种情况在一种情况下很昂贵,而另一种情况在另一种情况下更好,那意味着另一种情况下在所有情况下都更好/便宜。
Sgene9

2

更好:

Integer.valueOf(i).toString()

9
为什么这样更好?
2014年

1
我认为这样比较好,因为正如@Dhiraj指出的那样,就内存而言,“ new Integer(i).toString();” 这将占用更多内存,因为它创建了一个新对象,而不是仅获取Integer值并将其转换为字符串。
Patricia 2014年

4
@Lucy Integer.valueOf(i)返回一个新的Integer,所以没有区别
inigoD 2015年

您根本没有提供问题的答案。问题是blah和blah有什么区别,而不是更好的替代blah。
ahitt6345 '16


1

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

如果调用new Integer(i),则首先创建一个Integer类型的实例,它是一个完整的Java对象,封装了int i的值。然后,toString在其上调用方法以要求它返回自身的字符串表示形式。


0

1。Integer.toString(i)

Integer i = new Integer(8);
    // returns a string representation of the specified integer with radix 8
 String retval = i.toString(516, 8);
System.out.println("Value = " + retval);

2。new Integer(i).toString()

 int i = 506;

String str = new Integer(i).toString();
System.out.println(str + " : " + new Integer(i).toString().getClass());////506 : class java.lang.String
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.