为什么我应该使用Integer.toString()而不是只打印Integer?

时间:2013-01-02 17:55:28

标签: java integer tostring

我正在学习Java教程,它让我做了类似的事情:

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?

5 个答案:

答案 0 :(得分:19)

这是众多“安全编程”实践中的一种,您可以采用这些实践来提高清晰度并防止您或代码的未来维护者可能引入的细微错误。请看以下示例:

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。另一种解决方案是明确地将int转换为String

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

答案 1 :(得分:5)

  

是否有充分的理由对非字符串数据类型使用toString()方法?

有些人认为它更清楚。特别是初学者可能没有意识到他们做的基本相同。

注意:在Java 7更新9中,它不会首先创建String,因为append(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;
}

它将数字strait转换为StringBuilder,无需首先创建String。

  

在我的具体示例中,是否存在任何无法自动toString的int值?

没有。所有原始值都可以是toString。

我所知道的唯一例外是signalling and quiet Not-A-Number值,因为Java并不关心这些事情。两者都显示为“NaN”,并且没有办法区分toString()(或Java中的大多数函数)

答案 2 :(得分:0)

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

在上面打印“数字是”是字符串,所以字符串+(任何东西)字符串。所以在这种情况下没有需要完全调用toString()。如果你只想打印k值,那么也不需要调用toString()作为S.O.P internaqlly调用toString()。

所以最后,我们可以说除非特别想要将Integer转换为String,否则不应该调用toString()方法。

答案 3 :(得分:0)

使用第二个版本。对于字符串连接表达式,如

"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());

答案 4 :(得分:-6)

它允许数字成为String数据类型,因此它都是一个字符串。正如Mob所说,它甚至不是一个整数。在它成为一个整数之前,你必须将它解析为整数。