【问题标题】:Java int to String - Integer.toString(i) vs new Integer(i).toString()Java int to String - Integer.toString(i) vs new Integer(i).toString()
【发布时间】:2011-04-25 05:14:39
【问题描述】:

有时 java 让我感到困惑。
我有大量的 int 初始化要做。

真正的有什么区别?

  1. Integer.toString(i)
  2. new Integer(i).toString()

【问题讨论】:

  • 我只会使用"" + 42,但是嘿,这就是我。表格 #2 将产生一个新的整数对象(对于 i 的大多数值)作为中间值。它也需要更多的打字。
  • @pst:如果中间对象对您来说是个问题,那么"" + 42 也好不到哪里去,因为它需要一个中间对象StringBuilder,它比Integer 重得多.
  • "" + 42 可能有效,但不是一个好主意。像我这样的人会来看你的代码并试图弄清楚空字符串到底发生了什么。
  • 我不推荐"" + 42,因为在附加整数字符串的情况下,您最终可能会添加值而没有意识到这一点。
  • 如果您不喜欢大量打字,那么您可能不应该使用 Java 编程。

标签: java string int


【解决方案1】:

Integer.toString 调用类Integer 中的静态方法。它不需要Integer 的实例。

如果您调用new Integer(i),您将创建一个Integer 类型的实例,它是一个封装了您的int 值的完整Java 对象。然后调用它的toString 方法,要求它返回自身的字符串表示形式。

如果您只想打印int,您可以使用第一个,因为它更轻、更快并且不使用额外内存(除了返回的字符串)。

如果您想要一个表示整数值的对象(例如将其放入集合中),您会使用第二个,因为它为您提供了一个完整的对象来执行您无法执行的所有类型的事情一个裸露的int

【讨论】:

    【解决方案2】:

    简单的方法就是将""与整数连接起来:

    int i = 100;
    
    String s = "" + i;
    

    现在s 将有100 作为字符串值。

    【讨论】:

      【解决方案3】:

      虽然我喜欢fhucho的推荐

      String.valueOf(i)
      

      讽刺的是,这个方法实际上调用了

      Integer.toString(i)
      

      因此,如果您喜欢 String.valueOf(i) 的读取方式并且不需要基数,但也知道它的效率低于 Integer.toString(i),请使用它。

      【讨论】:

        【解决方案4】:

        我也强烈推荐使用

        int integer = 42;
        String string = integer + "";
        

        简单有效。

        【讨论】:

        • 这绝对是一种糟糕的形式,因为它既依赖于 Java 语言的一个相当微妙的部分,而且效率低于 Integer.toString(i)。见this SO post
        • 这可能效率低下。我建议使用一些常规选择,例如 Integer.toString 或 String.valueOf。在这里查看javadevnotes.com/java-integer-to-string-examples
        • 以这种不直观的方式做事通常是个坏主意。像Integer.toString() 这样更明显的选择可能会使用一些额外的击键,但更清晰,这在您想要维护代码时至关重要。
        • 这不会自动调用整数变量的toString()方法吗?
        【解决方案5】:
        1. new Integer(i).toString();

          此语句创建 Integer 的对象,然后调用其方法 toString(i)返回 Integer 值的 String 表示形式

        2. Integer.toString(i);

          返回代表特定int(整数)的String对象,但这里toString(int)static方法。

        摘要在第一种情况下它返回对象字符串表示,而在第二种情况下它返回整数的字符串表示形式。

        【讨论】:

          【解决方案6】:

          1.Integer.toString(i)

          Integer i = new Integer(8);
              // returns a string representation of the specified integer with radix 8
           String retval = i.toString(516, 8);
          System.out.println("Value = " + retval);
          

          2.new Integer(i).toString()

           int i = 506;
          
          String str = new Integer(i).toString();
          System.out.println(str + " : " + new Integer(i).toString().getClass());////506 : class java.lang.String
          

          【讨论】:

            【解决方案7】:

            另一种选择是静态String.valueOf 方法。

            String.valueOf(i)
            

            感觉对我来说比Integer.toString(i) 稍微正确。当 i 的类型发生变化时,例如从 int 变为 double,代码将保持正确。

            【讨论】:

            • 是的。除非你必须使用 RADIX(在这种情况下你必须使用 Integer.toString)
            【解决方案8】:

            这里 Integer.toString 调用 Integer 类中的静态方法。它不需要对象调用。

            如果您调用new Integer(i),您首先创建一个Integer 类型的实例,它是一个封装了您的int i 值的完整Java 对象。然后调用它的toString 方法,要求它返回一个自己的字符串表示形式。

            【讨论】:

              【解决方案9】:

              更好:

              Integer.valueOf(i).toString()
              

              【讨论】:

              • 我认为这更好,因为正如@Dhiraj 指出的那样,在内存方面,“new Integer(i).toString();”将占用更多内存,因为它会创建一个新对象,而不是仅仅获取 Integer 值并将其转换为字符串。
              • @Lucy Integer.valueOf(i) 返回一个新的Integer,所以没有区别
              • 您根本没有提供问题的答案。问题是 blah 和 blah 之间有什么区别,而不是什么是 blah 的更好替代品。
              【解决方案10】:

              new Integer(i).toString() 首先在i 周围创建一个(冗余)包装对象(它本身可能是一个包装对象Integer)。

              Integer.toString(i) 是首选,因为它不会创建任何不必要的对象。

              【讨论】:

                【解决方案11】:

                在性能测量方面,如果您考虑时间性能,那么如果您调用少于 1 亿次,则 Integer.toString(i); 会很昂贵。否则,如果调用次数超过 1 亿次,则 new Integer(10).toString() 会表现得更好。

                下面是通过你可以尝试衡量性能的代码,

                public static void main(String args[]) {
                            int MAX_ITERATION = 10000000;
                        long starttime = System.currentTimeMillis();
                        for (int i = 0; i < MAX_ITERATION; ++i) {
                            String s = Integer.toString(10);
                        }
                        long endtime = System.currentTimeMillis();
                        System.out.println("diff1: " + (endtime-starttime));
                
                        starttime = System.currentTimeMillis();
                        for (int i = 0; i < MAX_ITERATION; ++i) {
                            String s1 = new Integer(10).toString();
                        }
                        endtime = System.currentTimeMillis();
                        System.out.println("diff2: " + (endtime-starttime));
                    }
                

                在内存方面,

                新整数(i).toString();

                会占用更多内存,因为每次都会创建对象,所以会发生内存碎片。

                【讨论】:

                • 我将此代码粘贴到 IntelliJ IDEA 中并收到警告:“new Integer(10).toString() can be simplified to Integer.toString(10)
                • 这段代码对我有用。我得到大约 420 毫秒的 Integer.toString(10) 和 525 毫秒的 new Integer(10).toString()
                • 帮助先热身,否则结果无效!
                • 如果你说一种在一种情况下很贵,另一种在另一种情况下更好,这意味着另一种在所有情况下都更好/更便宜。
                猜你喜欢
                • 1970-01-01
                • 2018-07-24
                • 1970-01-01
                • 2012-01-16
                • 2010-12-21
                • 1970-01-01
                • 1970-01-01
                • 2015-05-09
                • 2011-10-15
                相关资源
                最近更新 更多