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)
多进行了一次调用。在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
方法,而不是从正确类型中使用,因为这样可以减少我们在想要改变操作类型时需要做出的更改。
示例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
方法更加灵活,这也是为什么它可用的原因。
Integer.toString(int i, int radix)
,它可以将数字转换为除十进制以外的其他进制字符串。 - Stephen PString.format(“%d”,i);
而不是使用String.valueOf(int)
。要了解更多信息,请访问此网站http://docs.oracle.com/javase/6/docs/api/java/util/Formatter.html。 - Damian Leszczyński - Vashint i = new Integer("1");
反之亦然。 - Damian Leszczyński - Vash一个巨大的区别在于,如果你在一个空对象中调用 toString()
方法,你会得到一个 NullPointerException
异常,而使用 String.valueOf()
方法时,你可能不需要检查是否为null。
Integer i = null;
i.toString(); // 空指针异常!
String.valueOf(i); // 没有异常
翻译:Integer i = null;
表示将一个空对象赋值给整型包装类Integer
类型的变量i
。
i.toString(); // 空指针异常!
表示试图将这个空对象转换成字符串,因为它是空对象,所以会出现空指针异常。
String.valueOf(i); // 没有异常
则是将i
转化为字符串,由于String.valueOf()
方法可以处理null
值,所以不会出现异常。 - Manish SinghString.valueOf(int i)
ж–№жі•пјҢиҖҢжҳҜи§ҰеҸ‘дәҶString.valueOf(Object obj)
ж–№жі•гҖӮж— и®әеҰӮдҪ•пјҢй—®йўҳж¶үеҸҠеҺҹе§Ӣзҡ„int
еҖјпјҢеңЁиҝҷз§Қжғ…еҶөдёӢдёҚеӯҳеңЁnull
зҡ„еҸҜиғҪжҖ§гҖӮ - hleinoneInteger.toString()
,而是 Integer.toString(int i)
。这是一个静态方法(http://docs.oracle.com/javase/7/docs/api/java/lang/Integer.html#toString(int))。 - LarsH这只是同一件事情的两种不同做法。可能是由于历史原因造成的(不能确定哪一个先出现)。
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对象传递到不同的方法中并执行一些虚拟操作。 - Rakesh来自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
类的源代码,实际上在调用valueOf()
时会调用Integer.toString()
。Integer.toString()
可能会略微更快些。String.valueOf()
的实现是满足 API 中指定的契约的最简单的方式: "表示形式与一个参数的 Integer.toString()
方法返回的形式完全相同。"你不必担心这个额外的调用会导致效率问题。如果有成本,它将是最小的,在大局中应该是可以忽略不计的。
也许两者都存在的原因是为了提供可读性。在将许多类型转换为 String
的上下文中,使用各种调用 String.valueOf(SomeType)
可能比使用各种 SomeType.toString
调用更容易阅读。
String.valueOf()
调用,而无需了解所有的toString()
方法。 - user207421