我想知道为什么该方法String.valueOf(int i)存在?我正在使用此方法转换int为String并发现了该Integer.toString(int i)方法。
看完这些方法的实现后,我看到第一个正在调用第二个。结果,我所有的String.valueOf(int i)通话都比直接通话多了一个电话Integer.toString(int i)
我想知道为什么该方法String.valueOf(int i)存在?我正在使用此方法转换int为String并发现了该Integer.toString(int i)方法。
看完这些方法的实现后,我看到第一个正在调用第二个。结果,我所有的String.valueOf(int i)通话都比直接通话多了一个电话Integer.toString(int i)
Answers:
做同一件事的只是两种不同的方式。这可能是历史原因(不记得一个人在另一个人之前)。
在字符串类型中,我们有几种方法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)
等等
在我看来,这不是历史性的事情,但是对于开发人员而言,使用valueOfString类中的方法比使用正确类型中的方法更有用,因为它使我们进行的更改更少。
范例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相反,我们必须做两个更改。
在我的结论中,使用valueOfString类中的方法更灵活,这就是为什么可以在其中使用它的原因。
Integer.toString(int i, int radix),将转换到比10等碱基串
String.valueOf(int),您还可以使用String.format("%d",i);来了解更多信息,请访问此网站docs.oracle.com/javase/6/docs/api/java/util/Formatter.html
int i = new Integer("1");反之亦然。
一个巨大的区别是,如果您调用toString()一个null对象,则将得到一个NullPointerException反之,而使用则String.valueOf()可能不会检查null。
Integer i = null; i.toString(); // Null pointer exception!! String.valueOf(i); // No exception
String.valueOf(int i)方法,但是String.valueOf(Object obj)。无论如何,问题是关于原始int值,在这里没有的可能性null。
Integer.toString()而是Integer.toString(int i)。那是一个静态方法(docs.oracle.com/javase/7/docs/api/java/lang/…)。
String类为所有原始类型和Object类型提供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 j但从未使用过。底层编译器可能对此进行了优化。最好以不同的方法传递j对象并执行一些虚拟操作。
从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);
}
因此,它们给出的结果完全相同,而一个实际上称为另一个。如果以后可以更改类型,则String.valueOf更为灵活。
如果查看String该类的源代码,则实际上在调用Integer.toString()时会调用它valueOf()。
话虽如此,Integer.toString()如果未在编译时优化方法调用(可能是这样),则可能会更快一些。
String.valueOf()您所看到的实现是满足API中指定的约定的最简单方法:“表示形式就是由Integer.toString()一个参数的方法返回的表示形式。”
要回答OP的问题,它只是一个辅助包装程序,可以进行其他调用,并最终取决于样式选择。我认为这里存在很多错误信息,Java开发人员可以做的最好的事情就是查看每种方法的实现,在任何IDE中只需单击一两次即可。您将清楚地看到,这String.valueOf(int)只是在呼唤Integer.toString(int)您。
因此,绝对差为零,因为它们都创建了一个char缓冲区,遍历数字中的数字,然后将其复制到新的String中并返回它(因此每个都创建一个String对象)。唯一的区别是一个额外的调用,编译器还是将其消除为单个调用。
因此,除了代码一致性以外,与您所谓的无关紧要。至于有关null的注释,它需要一个原语,因此不能为null!如果不初始化要传递的int,则会收到编译时错误。因此,由于在这种情况下不存在null,因此如何处理null也没有区别。
您不必担心这种额外的通话会浪费您的效率问题。如果有任何成本,它将是最小的,并且从整体上看应该可以忽略不计。
两者之所以存在,可能是为了提高可读性。在将许多类型转换为的情况下,与的String各种调用相比,对的各种调用String.valueOf(SomeType)可能更具可读性SomeType.toString。
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);
}
等等..
使用String.valueOf()方法,您不必担心数据(它是否是int,long,char,char [],boolean,Object),您只需调用:
使用唯一语法String.valueOf()可以将您作为参数传递的任何内容转换为String并返回。
否则,如果使用Integer.toString(),Float.toString()等(即SomeType.toString()),则必须检查要转换为字符串的参数的数据类型。因此,最好使用String.valueOf()进行此类转换。
如果您有一个包含不同值(例如Integer,Char,Float等)的对象类数组,则可以使用String.valueOf()方法将此类数组的元素轻松转换为String形式。相反,如果要使用SomeType.toString(),则首先需要了解它们的数据类型类(可能使用“ instanceOf”运算符),然后才可以进行类型转换。
String.valueOf()方法在被调用时与传递的参数匹配(无论其Integer,Char,Float等),并通过使用方法重载来调用参数匹配的“ valueOf()”方法,然后在该方法内直接调用相应的“ toString()”方法。
因此,我们可以看到如何消除检查数据类型然后再调用相应的“ toString()”方法的开销。只需要调用String.valueOf()方法,而不必关心要转换为String的内容。
结论:String.valueOf()方法具有其重要性,只是需要再调用一次。
toString()
的价值()
处理基本类型以及对象类型。
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/