簡體   English   中英

Integer.toString(int i) vs String.valueOf(int i)

[英]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),您只需調用:

  • 靜態字符串 valueOf()

使用唯一的語法 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()

  1. 存在於 Object 類中,通常在派生類中被覆蓋
  2. 調用 toString() 方法需要將類型轉換為適當的類。

的價值()

  1. String 類中存在重載的靜態方法。
  2. 處理原始類型和對象類型。

     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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM