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

Java 为什么我应该使用Integer.toString()而不是只打印整数?,java,integer,tostring,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()方法是否有充分的理由?在我的具

我在学习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()方法

有些人认为这更清楚。特别是对于初学者来说,他们可能没有意识到他们基本上做了相同的事情

注意:在Java7Update9中,它不会首先创建字符串,因为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;
}
//来自AbstractStringBuilder
公共抽象字符串生成器附加(int i){
if(i==Integer.MIN_值){
追加(“-2147483648”);
归还这个;
}
int appendedLength=(i<0)?整数.stringSize(-i)+1
:整数。字符串大小(i);
int spaceNeeded=计数+追加长度;
确保重新产能内部(所需空间);
getChars(i,spaceNeeded,value);
计数=所需空间;
归还这个;
}
它将数字转换为StringBuilder,无需先创建字符串

在我的具体示例中,是否有不能自动转换字符串的int值

不可以。所有原语值都可以转换为字符串

我所知道的唯一例外是值,因为Java不关心这些东西。这两个函数都显示为“NaN”,无法区分它们与toString()的区别(或Java中的大多数函数)

在上面的print中,数字是“是string,因此string+(任何东西)只是string。因此,在这种情况下,根本不需要调用toString()。因此,如果只想打印k值,那么也不需要调用toString(),因为
S.O.p
内部调用toString()


最后,我们可以说,除非您特别想要将整数转换为字符串,否则不应该调用toString()方法。

它允许数字变成字符串数据类型,因此它是一个字符串。正如Mob所说,它甚至不是一个整数。您必须先将其解析为整数,然后才能将其变为整数。

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

"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());
这是许多“安全编程”实践中的一种,您可以采用这些实践来提高清晰度并防止您或未来的代码维护人员可能引入的细微错误。以以下为例:

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
中,而不是被串联。一种解决方案是将
=
变成
字符串。另一种解决方案是将
int
显式转换为
字符串

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

两者之间没有显著差异。本教程可能想强调的是,
toString
被称为“隐藏”,但对于日常编程来说,这只是额外的混乱。我之前已经发布了一个答案,但想向普通读者指出,在一些实际情况下,必须使用Integer.toString(int)和/或使用
+
运算符将元素连接成更长字符串时的其他保护措施。如果您不小心,使用
+
运算符连接字符串可能会产生意外结果。它不需要是整数,因为Integer.toString(int)不需要整数。println会自动执行此转换,我们不必这样做,但请注意,这些信号/NaN值仅由浮点原语使用,如
float
/
double
,而不是
int
114
2+3=5