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()
- 存在于Object类中,通常在派生类中被覆盖
- 为了调用toString()方法,需要将types转换为相应的类。
的价值()
- 重载的String类中存在的静态方法。
-
处理原始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/