Integer.toString(int i)vs String.valueOf(int i)

Man*_*lva 175 java

我想知道为什么这个方法String.valueOf(int i)存在?我正在使用此方法转换intString刚刚发现的Integer.toString(int i)方法.

在查看了这些方法的实现后,我看到第一个调用第二个方法.因此,String.valueOf(int i)除了直接打电话,我所有的呼叫都要多打一次电话Integer.toString(int i)

Dam*_*ash 168

在String类型中,我们有几个方法valueOf

static String   valueOf(boolean b) 
static String   valueOf(char c) 
static String   valueOf(char[] data) 
static String   valueOf(char[] data, int offset, int count) 
static String   valueOf(double d) 
static String   valueOf(float f) 
static String   valueOf(int i) 
static String   valueOf(long l) 
static String   valueOf(Object obj) 
Run Code Online (Sandbox Code Playgroud)

我们可以看到这些方法能够解决所有类型的数字

像你所呈现的特定方法的每个实现:所以对于整数我们有

Integer.toString(int i)
Run Code Online (Sandbox Code Playgroud)

为了双倍

Double.toString(double d)
Run Code Online (Sandbox Code Playgroud)

等等

在我看来,这不是一些历史性的东西,但对于开发人员来说,使用valueOfString类中的方法比使用正确的类型更有用,因为它会导致我们做出更少的更改.

样本1:

public String doStuff(int num) {

  // Do something with num...

  return String.valueOf(num);

 }
Run Code Online (Sandbox Code Playgroud)

样品2:

public String doStuff(int num) {

 // Do something with num...

 return Integer.toString(num);

 }
Run Code Online (Sandbox Code Playgroud)

正如我们在样本2中看到的那样,我们必须做两个更改,与样本一相反.

在我的结论中,使用valueOfString类中的方法更灵活,这就是它在那里可用的原因.

  • 并且不要忘记将转换为10以外的基数字符串的`Integer.toString(int i,int radix)`. (18认同)

A C*_*sta 52

一个巨大的区别是,如果你toString()在一个null对象中调用,你会得到一个,NullPointerException而使用String.valueOf()你可能不会检查null.

  • 问题是关于[`Integer.toString(int i)`](http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#toString%28int%29), `static`方法.没有"null"对象可能. (44认同)
  • `Integer i = null;``i.toString(); //空指针异常!!``String.valueOf(i); //没有异常` (14认同)
  • @Manis Kumar:你的例子不会触发`String.valueOf(int i)`方法,而是`String.valueOf(Object obj)`.无论如何,问题是关于原始的`int`值,其中没有'null`的可能性. (10认同)
  • @manish_s:OP没有说'Integer.toString()`但是`Integer.toString(int i)`.这是一种静态方法(http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#toString(int)). (2认同)

mip*_*adi 43

只做两种不同的方式来做同样的事情.这可能是一个历史原因(不记得是否有一个来到另一个之前).

  • 是的,但是如果某些事情做同样的事情,并不意味着这是同一件事. (21认同)
  • String.valueOf(int)只是直接调用Integer.toString(i)。因此最好调用Integer.toString(int)。 (2认同)

Kin*_*ngo 13

String类为所有基本类型和对象类型提供了valueOf方法,因此我假设它们是方便的方法,可以通过一个类访问所有方法.

NB分析结果

平均intToString = 5368ms,平均stringValueOf = 5689ms(100,000,000次操作)

public class StringIntTest {


    public static long intToString () {
        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = Integer.toString(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static long stringValueOf () {

        long startTime = System.currentTimeMillis();
        for (int i = 0; i < 100000000; i++) {
            String j = String.valueOf(i);
        }
        long finishTime = System.currentTimeMillis();

        return finishTime - startTime;
    }

    public static void main(String[] args) {
        long intToStringElapsed = 0;
        long stringValueOfElapsed = 0;
        for (int i = 0; i < 10; i++) {
            intToStringElapsed += intToString();
            stringValueOfElapsed+= stringValueOf();
        }
        System.out.println("Average intToString = "+ (intToStringElapsed /10));
        System.out.println("Average stringValueOf = " +(stringValueOfElapsed / 10));
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 你的分析应该真的有一个"热身"时期,否则结果可能会因JIT修补事物而扭曲.也就是说,在10 ^ 8次操作中,300ms的差异非常小,完全可以忽略不计. (7认同)
  • 谢谢伙计,但我的回答是5年前!JMH仅在2013年发布:P (5认同)

Dav*_*vio 9

来自Java来源:

/**
 * Returns the string representation of the {@code int} argument.
 * <p>
 * The representation is exactly the one returned by the
 * {@code Integer.toString} method of one argument.
 *
 * @param   i   an {@code int}.
 * @return  a string representation of the {@code int} argument.
 * @see     java.lang.Integer#toString(int, int)
 */
public static String valueOf(int i) {
    return Integer.toString(i);
}
Run Code Online (Sandbox Code Playgroud)

所以他们给出了完全相同的结果,其中一个实际上是另一个.如果稍后可能更改类型,String.valueOf会更灵活.


tsk*_*zzy 8

如果您查看String该类的源代码,它实际上会Integer.toString()在您调用时调用valueOf().

话虽这么说,Integer.toString()如果方法调用没有在编译时优化(可能是它们),可能会更快一些.