我有一个名为Zebra的课程(不是她的实名)。 Zebra会覆盖toString方法,以提供自己的复杂模糊字符串化。
哪个字符串化Zebra实例效率更高?假设每次会话我必须做数百万次字符串化。
zebra.toString()
""+zebra
static String BLANK (singleton)
BLANK+zebra (multiple executions)
。斑马的价值不确定是相同的。
我猜想答案可能是 - 无关紧要:编译器使它们全部等效。如果这不是答案,请描述使它们不同的实例化过程。 (2)和(3)可以是相同的,因为编译器会将所有类似的字符串分组并将它们分配给单个引用。
通常,我会""+zebra
,因为我懒得输入zebra.toString()
。
ATTN :澄清一下。
我已经看到一些被批评的问题,例如“你为什么要这样做,这是不切实际的”如果每个程序员都没有提出问题,因为它没有实际价值,或者每个数学家都这样做 - 那将是结束人类。
如果我编写了一个迭代例程,差异可能太小了。我对实验结果不太感兴趣,而不是对流程的差异感兴趣:
例如,zebra.toString()只调用一个toString,而“+ zebra会调用额外的字符串实例化和额外的字符串concat。这会降低效率。或者是它。或者编译器会使。
如果您的答案集中在编写迭代例程,请不要回答,其结果不会解释编译器或机器进程。
优秀程序员的美德=懒惰编写代码而不是懒于思考。
答案 0 :(得分:2)
1号效率更高。
其他选项创建一个StringBuilder实例,向其追加一个空字符串,调用zebra.toString,将其结果附加到StringBuilder,然后将StringBuilder转换为String。这是很多不必要的开销。请自己调用toString。
顺便说一下,如果要将标准类型(如Integer)转换为String,也是如此。不要写
String s=""+n; // where "n" is an Integer
DO写
String s=n.toString();
或
String s=String.valueOf(n);
答案 1 :(得分:1)
作为一般规则,我永远不会使用+
运算符,除非它是非常小的最终/硬编码字符串。使用此运算符通常会导致在返回结果字符串之前在内存中创建多个额外对象(这很糟糕,特别是如果它发生“每个会话数百万次”)。
如果您确实需要连接字符串,例如动态构建唯一语句(例如,SQL或输出消息)。使用StringBuilder
!!!连接字符串效率要高得多。
如果是您的具体问题,请使用toString()
方法。如果您不喜欢打字,请使用IDE(如eclipse或netbeans),然后使用代码完成来保存击键。只需键入方法的第一个字母或2,然后点击“CTRL + SPACE”
答案 2 :(得分:1)
zebra.toString()
是最佳选择。请注意,zebra
可能为null,在这种情况下,您将获得NullPointerException
。所以你可能需要做类似
String s = zebra==null ? null : zebra.toString()
""+zebra
会导致创建一个StringBuilder,然后单独附加""
和zebra.String()
,因此效率较低。另一个很大的区别是,如果zebra
为null,则生成的字符串将为“null”。
答案 3 :(得分:0)
如果Zebra是Singleton类或者使用相同的zebra实例,那么你可以在Zebra中存储toString的结果,并将其重用于以后对toString的所有调用。
如果不是这种情况那么在toString缓存的实现中,每次在一个地方构造String时都不会改变的部分,这就是你每次都可以保存创建一些字符串实例。
否则我没有看到你遇到的任何问题:(
答案 4 :(得分:0)
选项1是最佳选项,因为每个选项都调用zebra的toString()方法,但选项2和3也执行其他(无值)工作。
你承认“我很懒,所以我做蠢事”。如果你不愿意停止懒惰,那么我建议你不要担心“哪个更好”,因为懒惰可能胜过知识。
答案 5 :(得分:0)
由于对象的toString
方法将在未明确调用的情况下被隐式调用,因此不存在更“有效”的方法 ,除非 “字符串化”发生在相同的对象上。在这种情况下,最好是缓存和重用,而不是创建数百万个String实例。
无论如何,这个问题似乎更侧重于美学/冗长而不是效率/表现。
答案 6 :(得分:-1)