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



我正在学习一个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值不能自动转换为String'ed?

这是您可以采用的许多"安全编程"实践之一,以提高清晰度并防止您或代码的未来维护者可能引入的细微错误。举以下例子:

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

"哦,但无论如何,我永远不会那样做,"你说。"任何头脑正常的人都会把=作为另一个String的一部分。"但是,如果你正在实现一个基本计算器应用程序的一部分,并且你想输出表达式及其结果,该怎么办?如果你真的很小心,我想你会使用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

对于非字符串数据类型,是否有充分的理由使用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的需要。

在我的具体例子中,是否有任何int值不能自动转换为String'ed?

没有。所有基元值都可以是toString'ed。

我所知道的唯一例外是发出信号和安静的Not-A-Number值,因为Java并不关心这些事情。两者都显示为"NaN",并且无法区分toString(((或Java中的大多数函数(

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

在上面的打印中,"数字是"是字符串,因此string+(任何东西(仅为字符串。所以在这种情况下根本不需要调用toString((。因此,如果您只想打印k值,那么也不需要像S.O.P内部调用toString((那样调用toString。

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

使用第二个版本。对于像这样的字符串连接表达式

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

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

最新更新