![](/img/trans.png)
[英]difference between String.valueOf(int) , `+` string operator and Integer.toString(int)
[英]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)
多一個調用
在 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 中看到的,與示例一相反,我們必須進行兩項更改。
在我的結論中,使用 String 類中的valueOf
方法更靈活,這就是它在那里可用的原因。
一個巨大的區別是,如果您在 null 對象中調用toString()
,您將得到NullPointerException
而使用String.valueOf()
您可能不會檢查 null。
只是做同一件事的兩種不同方式。 這可能是一個歷史原因(不記得一個是否在另一個之前)。
String 類為所有原始類型和 Object 類型提供了 valueOf 方法,因此我假設它們是可以通過一個類訪問的便捷方法。
NB 分析結果
平均 intToString = 5368 毫秒,平均 stringValueOf = 5689 毫秒(對於 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));
}
}
從 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()
valueOf()
。
話雖如此,如果方法調用在編譯時沒有優化(它們可能是),那么Integer.toString()
可能會快一點。
您看到的String.valueOf()
的實現是滿足 API 中指定的契約的最簡單方法:“表示正是由一個參數的Integer.toString()
方法返回的表示。”
要回答 OP 問題,它只是一個輔助包裝器來進行另一個調用,歸結為樣式選擇,僅此而已。 我認為這里有很多錯誤信息,Java 開發人員可以做的最好的事情就是查看每個方法的實現,在任何 IDE 中只需單擊一兩次即可。 您將清楚地看到String.valueOf(int)
只是為您調用Integer.toString(int)
。
因此,絕對零差異,因為它們都創建了一個字符緩沖區,遍歷數字中的數字,然后將其復制到一個新的 String 中並返回它(因此每個都創建一個 String 對象)。 唯一的區別是一個額外的調用,編譯器無論如何都將其消除為單個調用。
因此,除了代碼一致性之外,您調用哪個並不重要。 至於關於空值的注釋,它需要一個原語,因此它不能為空! 如果您不初始化正在傳遞的 int,您將收到編譯時錯誤。 所以它處理空值的方式沒有區別,因為在這種情況下它們不存在。
您不必擔心這個額外的通話會導致效率問題。 如果有任何成本,它將是最小的,並且在更大的事物中應該可以忽略不計。
也許兩者存在的原因是為了提供可讀性。 在許多類型被轉換為String
的上下文中,對String.valueOf(SomeType)
各種調用可能比各種SomeType.toString
調用更具可讀性。
我的 openion 是 valueof() 總是調用 tostring() 來表示,因此對於原始類型的 rpresentaion valueof 是通用的。默認情況下,java 不支持數據類型,但它定義了它與對象和類的工作,它在 cllas 中制作了所有東西並制作object .here Integer.toString(int i) 創建一個限制,只能轉換為整數。
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/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.