Java 哪种toString技术更有效?
我有一个班叫Zebra(不是她的真名)。Zebra覆盖了toString方法,以提供她自己复杂的模糊字符串化 将Zebra的实例字符串化哪个更有效?假设我每次都要做数百万次这种严格化Java 哪种toString技术更有效?,java,Java,我有一个班叫Zebra(不是她的真名)。Zebra覆盖了toString方法,以提供她自己复杂的模糊字符串化 将Zebra的实例字符串化哪个更有效?假设我每次都要做数百万次这种严格化 zebra.toString() “”+斑马 静态字符串空白(单例) BLANK+zebra(多次执行) 斑马的价值不一定相同 我猜想答案可能是——不用担心:编译器使它们都等价。如果这不是答案,请描述使它们不同的实例化过程。(2) 和(3)可能是相同的,因为编译器会将所有相似的字符串分组并将它们分配给单个引用 通常
zebra.toString()
“”+斑马
静态字符串空白(单例)
BLANK+zebra(多次执行)
“”+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也做其他(无值)工作
你承认“我很懒,所以我做了傻事”。如果你不愿意停止懒惰,我建议你不要担心“哪个更好”,因为懒惰可能胜过知识。选项1是最好的选项,因为每个选项都调用zebra的toString()方法,但选项2和3也做其他(无值)工作
你承认“我很懒,所以我做了傻事”。如果你不愿意停止懒惰,那么我建议你不要担心“哪一个更好”,因为懒惰很可能胜过知识。因为对象的
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);