Java 哪种toString技术更有效?

Java 哪种toString技术更有效?,java,Java,我有一个班叫Zebra(不是她的真名)。Zebra覆盖了toString方法,以提供她自己复杂的模糊字符串化 将Zebra的实例字符串化哪个更有效?假设我每次都要做数百万次这种严格化 zebra.toString() “”+斑马 静态字符串空白(单例) BLANK+zebra(多次执行) 斑马的价值不一定相同 我猜想答案可能是——不用担心:编译器使它们都等价。如果这不是答案,请描述使它们不同的实例化过程。(2) 和(3)可能是相同的,因为编译器会将所有相似的字符串分组并将它们分配给单个引用 通常

我有一个班叫Zebra(不是她的真名)。Zebra覆盖了toString方法,以提供她自己复杂的模糊字符串化

将Zebra的实例字符串化哪个更有效?假设我每次都要做数百万次这种严格化

  • zebra.toString()
  • “”+斑马
  • 静态字符串空白(单例)

    BLANK+zebra(多次执行)
  • 斑马的价值不一定相同

    我猜想答案可能是——不用担心:编译器使它们都等价。如果这不是答案,请描述使它们不同的实例化过程。(2) 和(3)可能是相同的,因为编译器会将所有相似的字符串分组并将它们分配给单个引用

    通常,我会输入
    “”+zebra
    ,因为我懒得输入
    zebra.toString()

    附件:澄清

    我见过一些问题被批评,比如“你为什么要这样做,这是不切实际的”,如果每个程序员都因为没有实际价值而不提问题,或者每个数学家都这样做——那将是人类的末日

    如果我编写一个迭代例程,差异可能太小。我对实验结果的兴趣不如对过程中的差异感兴趣:

    例如,zebra.toString()将只调用一个toString,“+zebra将调用一个额外的字符串实例化和一个额外的字符串concat。这将降低它的效率。或者是这样。或者编译器将其置空

    如果你的答案集中在编写一个迭代例程上,那么请不要回答,因为它的结果不会解释编译器或机器过程


    优秀程序员的优点=懒于编写代码,但不懒于思考。

    如果Zebra是单例类或使用的是同一个Zebra实例,那么您可以将toString的结果存储在Zebra中,并将其重新用于将来对toString的所有调用

    如果不是这样的话,那么在toString缓存的实现中,每次在一个地方构造字符串时都会保持不变的部分,这就是您可以保存每次创建一些字符串实例


    否则,我看不到任何可以避免您遇到的问题的方法:(

    如果Zebra是单例类,或者使用的是同一个Zebra实例,那么您可以将toString的结果存储在Zebra中,并将其重新用于将来对toString的所有调用

    如果不是这样的话,那么在toString缓存的实现中,每次在一个地方构造字符串时都会保持不变的部分,这就是您可以保存每次创建一些字符串实例


    否则,我看不出有什么可以逃避您的问题:(

    选项1是最好的选项,因为每个选项都调用zebra的toString()方法,但选项2和3也做其他(无值)工作

  • zebra.toString()-注意,这将调用zebra的toString()方法
  • “”+zebra-这也调用zebra的toString()方法
  • 静态字符串BLANK;BLANK+zebra;-这也调用zebra的toString()方法

  • 你承认“我很懒,所以我做了傻事”。如果你不愿意停止懒惰,我建议你不要担心“哪个更好”,因为懒惰可能胜过知识。

    选项1是最好的选项,因为每个选项都调用zebra的toString()方法,但选项2和3也做其他(无值)工作

  • zebra.toString()-注意,这将调用zebra的toString()方法
  • “”+zebra-这也调用zebra的toString()方法
  • 静态字符串BLANK;BLANK+zebra;-这也调用zebra的toString()方法

  • 你承认“我很懒,所以我做了傻事”。如果你不愿意停止懒惰,那么我建议你不要担心“哪一个更好”,因为懒惰很可能胜过知识。

    因为对象的
    toString
    方法在没有显式调用的情况下会隐式调用,所以更“有效”“方式不存在,除非对同一对象进行了字符串化。在这种情况下,最好是缓存和重用,而不是创建数百万个字符串实例


    无论如何,这个问题似乎更注重美观/冗长,而不是效率/性能。

    由于对象的
    toString
    方法在未显式调用的情况下将被隐式调用,因此除非使用“字符串化”,否则不存在更“高效”的方法发生在同一个对象上。在这种情况下,最好缓存和重用,而不是创建数百万个字符串实例


    无论如何,这个问题似乎更注重美观/冗长,而不是效率/性能。

    如果你想知道这样的事情,你可以编写一些小示例例程,并使用实用程序查看生成的字节码

    我猜想答案可能是-不必担心:编译器会使它们都等效。[…]通常,我会使用
    “”+zebra
    ,因为我太懒了,无法键入
    zebra.toString()

    两件事:

    第一:这两个选项是不同的。想象一下
    zebra
    null


    第二:我懒得为你做这些事情。

    如果你想知道这样的事情,你可以编写一些小的示例例程,并使用实用程序查看生成的字节码

    我猜想答案可能是-不必担心:编译器会使它们都等效。[…]通常,我会使用
    “”+zebra
    ,因为我太懒了,无法键入
    zebra.toString()

    两件事:

    第一:这两个选项是不同的。想象一下
    zebra
    null

    第二:我懒得为你做这些事。

    作为一个g
    String s = zebra==null ? null : zebra.toString()
    
    String s=""+n; // where "n" is an Integer
    
    String s=n.toString();
    
    String s=String.valueOf(n);