【问题标题】:What is the better approach to convert primitive data type into String将原始数据类型转换为字符串的更好方法是什么
【发布时间】:2011-07-13 12:39:16
【问题描述】:

我可以使用将整数转换为字符串

String s = "" + 4; // correct, but poor style
or
String u = Integer.toString(4); // this is good

我可以使用将双精度数转换为字符串

String s = "" + 4.5; // correct, but poor style
or
String u = Double.toString(4.5); // this is good

我可以使用String s = "" + dataapproach 将int 或double 转换为String。如果我想使用 toString() 的其他方法,我必须使用每种数据类型的 Wrapper 类。那么为什么在some books 中提到第一种方法很差,而第二种方法更好。 哪种方法更好?为什么?

【问题讨论】:

    标签: java


    【解决方案1】:

    我会用

    String.valueOf(...)
    

    您可以对所有类型使用相同的代码,但没有可怕且毫无意义的字符串连接。

    请注意,它还准确地说明了您想要的 - 对应于给定原始值的字符串值。将其与"" + x 方法进行比较,即使您无意连接任何内容,您也正在应用字符串连接,并且空字符串与您无关。 (它可能更贵,但我更关心的是可读性而不是性能。)

    【讨论】:

      【解决方案2】:

      String.valueOf() 怎么样?它为所有原始类型覆盖重载,并为引用类型委托给toString()

      【讨论】:

      • 重载,未覆盖 :)
      • 如果是的话,是否比使用 "" + 4.5 更好?
      • @Deepakkk:是的,这更好,因为(正如其他人已经说过的那样)它让代码说出它的作用,而不是将预期的操作作为副作用。
      【解决方案3】:
      String s = "" + 4;
      

      编译成这段代码:

      StringBuffer _$_helper = new StringBuffer("");
      _$_helper.append(Integer.toString(4));
      String s = _$_helper.toString();
      

      显然这是相当浪费的。 请记住,如果您将 + 与 String's 结合使用,编译器始终在使用 StringBuffers

      【讨论】:

      • *实际上 String s = "" + 4; 编译为与String s = "4"; 完全相同的字节码。如果将4 替换为非编译时常量表达式(例如将i 定义为int i = 4;),那么它将更接近您的代码,但我的编译器(Java 6u26)使用@ 的append(int) 987654329@ 而不是调用Integer.toString()
      • 我没明白,现在是在使用 StringBuilder.append 还是在使用 String s = "4"?后者基本上等价于 String s = new String ("4");无论如何,您对编译时间常数的看法是正确的,我应该考虑一下;D
      • 你发布它的方式,它相当于"4"如果您将4替换为值为4的变量,那么它将使用StringBuilder.append()
      • 没错,我忘记了 const ("4") 将在类的常量池中。所以不需要“新字符串”。
      【解决方案4】:

      还有第三个 - String.valueOf(..)(它调用 Wrapper.toString(..)

      实际上编译器在这些地方添加了Wrapper.toString(..),所以在字节码方面是一样的。但是""+x 更丑。

      【讨论】:

        【解决方案5】:

        字符串连接方式创建了一个额外的对象(然后被 GC),这就是它被认为“更差”的原因之一。此外,它更棘手且可读性更低,正如 Jon Skeet 指出的那样,这通常是一个更大的考虑因素。

        【讨论】:

        • 这是一个的原因,但在我看来,它不如可读性原因重要——代码没有说明它试图实现的目标。
        • @little bunny foo foo:不,这里根本没有理由使用自动装箱。
        • @Jon,哦...我认为这就是 .valueOf(...) 方法所做的。也许我使用了错误的术语?
        • @little bunny foo foo:我怀疑是这样。当您调用String.valueOf(int)Integer.toString(int) 时,没有理由认为这会创建Integer 的实例。
        • 将字符串连接成一个字符串是 Java 中的一个习惯用法,不应被视为不好的风格
        【解决方案6】:

        我也会使用String.valueOf() 方法,它实际上使用原始类型的 Wrapper 对象并为您调用toString() 方法:

        例如,在String 类中:

        public static String valueOf(int i) {
                return Integer.toString(i, 10);
            }
        

        【讨论】:

          【解决方案7】:

          附加双引号是一种不好的做法,尤其是为了可读性。我会考虑使用一些 Apache 实用程序类进行转换或编写自己的实用程序方法来执行此类操作。

          【讨论】:

            【解决方案8】:

            知道要转换为字符串的参数类型并让编译器知道类型总是更好。这简化了操作和周期。当您遵循 append 方法时,您将类型决定留给编译器,并且还增加了编译器执行相同操作的代码行。

            【讨论】:

              【解决方案9】:

              我认为答案实际上取决于您要转换的内容和目的,但总的来说,我不太喜欢进行裸转换,因为在大多数情况下,转换为字符串是为了日志记录或其他人类可读性目的。

              MessageFormat.format("The value of XYZ object is {0}", object);
              

              这提供了良好的可读性,对输出格式的细粒度控制,重要的是,它可以通过用消息包引用替换字符串来实现国际化。

              需要我提一下,这也避免了调用 object.toString() 可能出现的 NPE 问题吗?

              【讨论】:

              • +1:即使是正整数的本地字符串表示也不相同:1000 或 1,000 或 1.000?在简单的调试代码中,这些差异并不重要,但对于“正确”的 UI 文本很重要。
              猜你喜欢
              • 1970-01-01
              • 2013-07-17
              • 1970-01-01
              • 2020-05-03
              • 1970-01-01
              • 1970-01-01
              • 2022-11-25
              • 2013-04-01
              • 1970-01-01
              相关资源
              最近更新 更多