2013-01-02 51 views
6

我遵循的Java教程而且它是具有我這樣做:爲什麼我應該使用Integer.toString()而不是僅僅打印Integer?

int k = 5; 
System.out.println("The number is " + Integer.toString(k)); 

因此,像一個很好的運動我跟着一起,但我不禁納悶,爲什麼要用這種方法呢?好像很多額外的輸入來獲得相同的功能:

int k = 5; 
System.out.println("The number is " + k); 

是否有一個很好的理由使用非字符串數據類型toString()方法?在我的具體例子中,是否有任何int值不能自動toString'ed?

+6

還有就是兩者之間沒有顯著差異。本教程可能想強調'toString'被稱爲「隱藏」,但是,對於日常編程,它只是額外的混亂。 –

+1

我早些時候已經發布了一個答案,但是想要指出,對於偶然的讀者來說,有些實際情況下你必須使用Integer.toString(int)和/或其他安全措施, '操作員。如果您不小心,使用'+'運算符進行字符串串聯可能會產生意想不到的結果。 – rob

回答

15

這是許多「安全規劃」的實踐,你可以採用,以提高透明度,防止您或您的代碼的未來的維護者可能引入細微的錯誤之一。看看下面的例子:

private static void printMessage(int k) { 
    System.out.println("number" + '=' + k); 
} 

輸出:number=5

現在假設你想最後打印第一數和文字。我做的是交換的第一項和最後一項的字符串連接:

private static void printMessage2(int k) { 
    System.out.println(k + '=' + "number"); 
} 

輸出:66number

糟糕!將int值=添加到k而不是連接在一起。一種解決方案是使=成爲String。另一個解決方案是顯式轉換intString

private static void printMessage2Safe(int k) { 
    System.out.println(Integer.toString(k) + '=' + "number"); 
} 

輸出:5=number

「哦,但我從來沒有這樣做,反正,」你說。 「任何正確的想法都會讓=成爲其他字符串的一部分。」但是如果你正在實現一個基本的計算器應用程序的一部分,並且你想輸出表達式及其結果呢?如果你真的想要小心,我想你會用StringBuilder.append()連接表達式的各個部分。但是,如果不是,那麼我希望你不要寫下面第一個實現display方法。

public class Calculator { 

    public static void main(String[] args) { 
     display(2, '+', 3, 5); 
     displaySafe(2, '+', 3, 5); 
    } 

    public static void display(int num1, char operator, int num2, int result) { 
     System.out.println(num1 + operator + num2 + '=' + result); 
    } 

    public static void displaySafe(int num1, char operator, int num2, int result) { 
     System.out.println(Integer.toString(num1) + operator + Integer.toString(num2) + "=" + result); 
    } 

} 

輸出:

114 
2+3=5 
+3

非常好的使用toString原因的示例 – Mike

5

對非字符串數據類型使用toString()方法是否有很好的理由?

有些人認爲它更清晰。特別是對於可能沒有意識到他們做的事情基本相同的初學者。

注:在Java 7更新9,它不建立一個字符串首先作爲追加(INT)看起來像這樣

// from AbstractStringBuilder 
public AbstractStringBuilder append(int i) { 
    if (i == Integer.MIN_VALUE) { 
     append("-2147483648"); 
     return this; 
    } 
    int appendedLength = (i < 0) ? Integer.stringSize(-i) + 1 
           : Integer.stringSize(i); 
    int spaceNeeded = count + appendedLength; 
    ensureCapacityInternal(spaceNeeded); 
    Integer.getChars(i, spaceNeeded, value); 
    count = spaceNeeded; 
    return this; 
} 

它轉換避免了需要創建一個字符串海峽進入StringBuilder的數量第一。

在我的具體例子中,是否有任何int值不能自動toString'ed?

不是。所有的原始值都可以toString'ed。

我知道的唯一例外是signalling and quiet Not-A-Number值,因爲Java不關心這樣的事情。同時出現的「南」,有沒有辦法分辨了toString()(在Java或大部分功能)的差別

+0

但請注意,這些信號/ NaN值僅用於浮點基元,如'float' /'double',而不是'int'。 – matts

0
System.out.println("The number is " + Integer.toString(k)); 

在上述打印「的個數爲」是字符串,因此字符串+(任何東西)字符串 only.So在那種情況下根本不需要調用toString()。所以如果你想打印k值只有那麼也不需要調用toString()作爲S.O.P internaqlly調用toString() 。

因此最後,我們可以說,除非特別要將Integer轉換爲String,否則不應該調用toString()方法。

-6

它允許數字成爲一個字符串數據類型,因此它是一個字符串。但是Mob說,它甚至不是一個整數。在它變成一個之前,你必須把它解析成一個整數。

+0

它不需要是整數,因爲Integer.toString(int)不期望整數。 –

+0

就像你鸚鵡的答案一樣,這是不正確的。 –

+0

println會自動執行此轉換,我們不會這麼做 – nobalG

0

使用第二個版本。對於字符串表達式concatination像

"The number is " + k; 

javac的建立使用StringBuilder的實際代碼

new StringBuilder("The number is ")).append(Integer.toString(k)).toString()); 

這樣的System.out。的println簡單地打印生成的字符串,完整的代碼是

System.out.println((new StringBuilder("The number is ")).append(Integer.toString(k)).toString()); 
相關問題