Java Long.toString(i)与i+&引用&引用;

Java Long.toString(i)与i+&引用&引用;,java,string,Java,String,我们经常会遇到这样一种情况,在这种情况下,我们需要传递一个原语的字符串表示形式,而我们通常不使用它 WrapperClass.toString() ; 有时我们通常会写信 i + ""; 如果我们检查任何包装类的toString实现,它会在每次调用它时创建一个新的String对象。原语+“”也是如此(因为运行时的连接将创建新的字符串对象) 它们之间有什么区别吗?或者它们只是将原语转换为字符串对象的替代方法 善意 写i+”,您可能要让代码的未来维护人员(很可能就是您)来确定输出将是什么

我们经常会遇到这样一种情况,在这种情况下,我们需要传递一个原语的字符串表示形式,而我们通常不使用它

  WrapperClass.toString() ;
有时我们通常会写信

  i + "";
如果我们检查任何包装类的toString实现,它会在每次调用它时创建一个新的String对象。原语+“”也是如此(因为运行时的连接将创建新的字符串对象)

它们之间有什么区别吗?或者它们只是将原语转换为字符串对象的替代方法

善意

i+”,您可能要让代码的未来维护人员(很可能就是您)来确定输出将是什么

WrapperClass.toString()
更明确,虽然更详细,但其意图更清晰。此外,这并不是您通常在Java中看到的,所以我建议您坚持编写惯用的Java代码

编译后,发出的字节码很可能是相同或相似的。在jitting之后和运行期间,您可以预期差异会被有效地消除


因此,最后,这是一个风格问题,尽管我建议使用更详细的代码版本。

从功能上讲,它们是相同的。区别在于,
i+”
基本上是使用副作用来归档其目的,这可能会使初学者更难理解。

我个人喜欢:

  • 您可以将其用于所有类型(即使是非原语)
  • 它是空安全的(假设您在转换空值时对字符串值“null”感到满意)
  • 它比
    “+i
    ”更好地表达了您的意图——该代码表示字符串连接,而这根本不是您想要的

性能是否有差异?就好像你在研究WrapperClass.toString()的实现一样,它做了大量的处理,即(创建一个char[],并在其上循环),而我认为primitive+“”在幕后做了新字符串()。@Dhirendra:这很可能不会成为你的性能瓶颈。如果它是一个性能瓶颈,那么它很可能是一个特定函数中使用的瓶颈(由探查器确定),您可以根据需要对其进行调整,并通过仔细的文档解释原因。