【问题标题】:Why should I use Integer.toString() instead of just printing the Integer?为什么我应该使用 Integer.toString() 而不是只打印 Integer?
【发布时间】:2013-01-02 17:55:28
【问题描述】:

我正在学习一个 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'ed?

【问题讨论】:

  • 两者没有显着差异。本教程可能想强调 toString 被称为“幕后”,但对于日常编程来说,它只是额外的混乱。
  • 我之前已经发布了一个答案,但想向普通读者指出,在某些实际情况下,您必须使用 Integer.toString(int) 和/或其他使用+ 运算符将元素连接成更长的字符串时的保护措施。如果您不小心,使用 + 运算符的字符串连接可能会产生意想不到的结果。

标签: java integer tostring


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    有些人认为它更清楚。尤其是对于可能没有意识到他们做基本相同的事情的初学者。

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

    它将数字海峡转换为 StringBuilder 避免需要先创建一个字符串。

    在我的具体示例中,是否有任何不能自动 toString 的 int 值?

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

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

    【讨论】:

    • 但请注意,这些信号/NaN 值仅由浮点原语使用,例如 float/double,而不是 int
    【解决方案3】:
    System.out.println("The number is " + Integer.toString(k));
    

    上面打印的"The number is "是字符串,所以String+(anything)只是String。所以在这种情况下没有根本需要调用 toString()。所以如果你只想打印 k 值,那么也不需要调用 toString(),因为 S.O.P internaqlly 调用 toString()。

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

    【讨论】:

      【解决方案4】:

      使用第二个版本。对于像

      这样的字符串连接表达式
      "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());
      

      【讨论】:

        【解决方案5】:

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

        【讨论】:

        • 它不需要是整数,因为 Integer.toString(int) 不需要整数。
        • println 自动执行此转换,我们不必这样做
        猜你喜欢
        • 2016-05-23
        • 2016-10-17
        • 2018-05-10
        • 2014-03-12
        • 2012-12-13
        • 2013-11-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多