ToString (int i) vs String.valueOf (int i)

我想知道为什么存在 String.valueOf(int i)方法?我正在使用这个方法将 int转换成 String,并且刚刚发现了 Integer.toString(int i)方法。

在查看了这些方法的实现之后,我发现第一个方法正在调用第二个方法。因此,我对 String.valueOf(int i)的所有呼叫都比直接呼叫 Integer.toString(int i)多一个呼叫

132148 次浏览

你不必担心这个额外的电话会影响你的效率。如果有任何成本,那就是最小的,而且在更大的范围内应该是可以忽略不计的。

也许两者都存在的原因是为了提供可读性。在许多类型被转换为 String的情况下,那么对 String.valueOf(SomeType)的各种调用可能比各种 SomeType.toString调用更具可读性。

只是做同一件事的两种不同方式。这可能是一个历史原因(不记得是否一个先于另一个)。

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

NB 分析结果

Average intToString = 5368ms,Average 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));
}
}

您看到的 String.valueOf()的实现是满足 API 中指定的约定的最简单的方法: “表示就是一个参数的 Integer.toString()方法返回的那个。”

在 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)

正如我们所看到的,这些方法能够解决所有类型的数字

每一个特定方法的实现: 对于整数,我们有

Integer.toString(int i)

双倍价钱

Double.toString(double d)

诸如此类

在我看来,这不是什么历史问题,但是对于开发人员来说,使用 String 类中的方法 valueOf比使用正确的类型更有用,因为当我们想要更改正在操作的类型时,它会导致更少的更改。

样本一:

public String doStuff(int num) {


// Do something with num...


return String.valueOf(num);


}

样本二:

public String doStuff(int num) {
  

// Do something with num...
 

return Integer.toString(num);


}

正如我们在样本2中看到的,我们必须做两个改变,与样本1相反。

在我的结论中,使用 String 类中的 valueOf方法更加灵活,这就是为什么它可以在那里使用的原因。

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

也就是说,如果方法调用没有在编译时优化(它们可能已经优化了) ,那么 Integer.toString()可能会稍微快一点。

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

使用 String.valueOf ()方法,您不必担心数据(无论是 int、 long、 char、 char []、 boolean、 Object) ,只需调用:

  • Static String valueOf ()

使用 String.valueOf ()的唯一语法可以将任何作为参数传递的内容转换为 String 并返回。

否则,如果您使用 Integer.toString () ,Float.toString ()等(即 Some Type.toString ()) ,那么您将不得不检查要转换为 string 的参数的数据类型。 因此,对于这样的转换,最好使用 String.valueOf ()。

如果你有一个包含不同值的对象类数组,比如 Integer、 Char、 Float 等,那么通过使用 String.valueOf ()方法,你可以很容易地将这个数组的元素转换成 String 格式。相反,如果您想使用 Some Type.toString () ,那么首先您需要了解它们的数据类型类(可能通过使用“ instanceOf”操作符) ,然后只有您可以继续进行类型转换。

当被调用时,String.valueOf ()方法匹配被传递的参数(无论是 Integer,Char,Float 等) ,通过使用方法重载调用参数匹配的“ valueOf ()”方法,然后在该方法内部直接调用相应的“ toString ()”方法。.

因此,我们可以看到如何消除检查数据类型和调用相应的“ toString ()”方法的开销。我们只需要调用 String.valueOf ()方法,而不需要关心要转换成 String 的内容。

结论: String.valueOf ()方法有其重要性,只是代价是多调用一次。

我的 openion 是 valueof ()总是被称为 tostring ()来表示,因此对于原始类型 valueof 的表示是泛化的。 Java 默认不支持 Data 类型,但是它定义了它与 object 的工作,并且在 cllas 和 made object 中定义了它的 made 所有事物。在这里,Integer.toString (int i)创建了一个仅对整数进行转换的限制。

要回答 OPs 的问题,只需要一个助手包装器来调用另一个调用,最后就是样式选择了,就是这样。我认为这里有很多错误信息,Java 开发人员所能做的最好的事情就是查看每个方法的实现,在任何 IDE 中都只需要一两次单击。您将清楚地看到,String.valueOf(int)只是为您调用 Integer.toString(int)

因此,它们之间绝对没有区别,因为它们都创建了一个字符缓冲区,遍历数字中的数字,然后将其复制到一个新的 String 中并返回它(因此每个字符串都创建了一个 String 对象)。唯一的区别是一个额外的调用,编译器将其删除为一个调用。

所以你调用哪个并不重要,重要的是代码的一致性。至于关于 null 的注释,它采用一个基元,因此它不能为 null!如果不初始化传递的 int,就会得到编译时错误。因此它处理 null 的方式没有区别,因为在这种情况下它们是不存在的。

来源:

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

所以它们给出了完全相同的结果,一个实际上调用了另一个。如果以后可能更改类型,则 String.valueOf更灵活。

在 Integer.toString (5)和 String.valueOf (5)之间没有区别;

因为 String.valueOf 返回:

public static String valueOf(int i) {
return Integer.toString(i);
}
public static String valueOf(float f) {
return Float.toString(f);
}

等等。