2013-01-02 46 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()); 
相关问题