问题描述
从我在网上看到的情况来看,人们似乎建议使用 toString() 方法,但是文档指出:
创建此对象的字符串表示形式。默认表示取决于平台。在 java 平台上,它是类名、“@”和十六进制对象的哈希码的串联。
所以看起来使用这种方法可能会导致一些问题?
还有 mkString 和 result()。后者似乎最有意义。但我不确定这 3 种方法之间的区别是什么,以及是否应该使用 result()。
解决方法
toString
实现目前只是重定向到 result
方法,因此这两个方法的行为方式相同。但是,它们表达的意图略有不同:
-
toString
请求StringBuilder
的当前状态 "concise but informative (and) that is easy for a person to read" 的文本表示。因此,从理论上讲,此方法的(模糊)规范不禁止缩写结果,或以任何其他方式增强简洁性和可读性。 -
result
请求实际构造的字符串。这里似乎没有不同的读数。
因此,如果您想获得结果字符串,请使用 result
尽可能清楚地表达您的意图。
这样,当字符串长度超过 9000 kB 时,代码的读者就不必怀疑 StringBuilder.toString
是否会为了“简洁”而缩短某些内容,或者类似的事情。
mkString
完全用于其他用途,它主要用于散布分隔符,如 "hello".mkString(",") == "h,e,l,o"
。
一些进一步的链接:
- 带有“十六进制哈希码”的段落描述了默认值。它只是 documentation inherited from
AnyRef
,因为StringBuilder
的创建者没有费心提供更详细的文档。 - 如果你look into code,you'll see that
toString
is actually just delegating toresult
。 -
documentation of
StringBuilder
在介绍性概述段落中还提到了result()
。
只需使用 result()
。
TL;博士;使用 docs 中所述的 result
。
toString
绝不能为了快速调试以外的其他目的而在任何情况下被调用。
mkString
继承自集合层次结构,它基本上会创建另一个 StringBuilder
,因此效率非常低。