Integer.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)

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

在Stringtypes中,我们有几个方法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) 

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

像你这样的具体方法的每一个实现提出:所以我们有整数

 Integer.toString(int i) 

双倍

 Double.toString(double d) 

等等

在我看来,这不是一些历史的事情,但是对于开发人员来说,使用String类中的valueOf方法比正确的types更有用,因为它使得我们所做的更改更less。

样品1:

 public String doStuff(int num) { // Do something with num... return String.valueOf(num); } 

样品2:

 public String doStuff(int num) { // Do something with num... return Integer.toString(num); } 

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

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

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

String类为所有的基本types和Objecttypes提供了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)); } } 

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

也就是说,如果方法调用在编译时没有被优化(他们可能是这样), Integer.toString()可能会更快一点。

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

所以他们给出了完全相同的结果,实际上是另一个结果。 如果以后可能更改types,则String.valueOf更加灵活。

您看到的String.valueOf()的实现是满足API中指定的合同的最简单方法:“该表示forms正好是一个参数的Integer.toString()方法返回的表示forms。

为了回答OP的问题,它只是一个帮手包装,有另一个电话,并归结为风格的select,就是这样。 我认为这里有很多错误信息,Java开发人员可以做的最好的事情就是查看每个方法的实现,在任何IDE中只需一次或两次点击。 你会清楚地看到String.valueOf(int)只是为你调用Integer.toString(int)

因此,它们之间绝对是零差别,因为它们都创build一个char缓冲区,遍历数字中的数字,然后将其复制到一个新的String中并返回(因此每个都创build一个String对象)。 唯一不同的是一个额外的调用,无论如何,编译器会消除这个额外的调用。

所以,除了代码一致性之外,你所调用的并不重要。 至于关于空值的评论,它是一个原始的,因此它不能为空! 如果你不初始化传入的int,你会得到一个编译时错误。 所以在这种情况下,处理空值是没有区别的,因为它们不存在。

你不应该担心这个额外的通话会导致效率问题。 如果有什么代价的话,那将是微不足道的,而且在更大的事情上可以忽略不计。

也许两者都存在的原因是提供可读性。 在许多types转换为String的上下文中,对String.valueOf(SomeType)各种调用可能比各种SomeType.toString调用更具可读性。

使用方法String.valueOf()你不必担心数据(不pipe是int,long,char,char [],boolean,Object),你可以调用:

  • 静态stringvalueOf()

使用唯一的语法String.valueOf()可以不pipe你传递的参数转换为string,并返回..

否则,如果你使用Integer.toString(),Float.toString()等(即SomeType.toString()),那么你将不得不检查你想要转换成string的参数的数据types。 所以,最好使用String.valueOf()进行这种转换。

如果你有一个对象类的数组包含像Integer,Char,Float等不同的值,那么通过使用String.valueOf()方法,你可以很容易地把这个数组的元素转换成Stringforms。 相反,如果你想使用SomeType.toString(),那么首先你将需要知道他们的数据类的类(也许通过使用“instanceOf”运算符),然后只有你可以继续进行types转换。

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

因此,我们可以看到如何检查数据types,然后调用相应的“toString()”方法的开销。只需要调用String.valueOf()方法,而不关心我们要转换为String。

结论:String.valueOf()方法的重要性仅在于多一个调用的代价。

我的openion是valueof()总是被称为tostring()代表,所以对于初始typesvalueof的rpresentaion是generalized.java默认不支持数据types,但它定义它的工作与objaect和类它的所有事情在cllas和作出对象.here Integer.toString(int i)创build一个转换只限于整数的限制。

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

等等..

的toString()

  1. 存在于Object类中,通常在派生类中被覆盖
  2. 为了调用toString()方法,需要将types转换为相应的类。

的价值()

  1. 重载的String类中存在的静态方法。
  2. 处理原始types以及对象types。

     Integer a = null; System.out.println(Integer.toString()) ; NUll pointer exception System.out.println(String.valueOf() ; give NULL as value 

检查这个链接是非常好的。 http://code4reference.com/2013/06/which-one-is-better-valueof-or-tostring/