在Java中构建字符串是否有"最快的方法"?

Red*_*ite 16 java string

我通常用以下方式在Java中创建一个String:

String foo = "123456";

但是,我的讲师坚持要求我使用该format方法形成一个String ,如下所示:

String foo = String.format("%s", 123456);

要快得多.

此外,他说使用StringBuilder类更快.

StringBuilder sb = new StringBuilder();
String foo = sb.append(String.format("%s", 123456)).toString();



创建String的最快方法是哪一个,如果有的话

它们不可能100%准确,因为我可能不完全记得它们.

jas*_*onh 25

如果只有一个字符串,那么:

String foo = "123456";
Run Code Online (Sandbox Code Playgroud)

最快.你会注意到该String.format行已"%s%"在其中声明,所以我看不出讲师如何认为这更快.另外,你还有一个方法调用.

但是,如果您正在构建一个字符串,例如在for循环中,那么您将需要使用StringBuilder.如果您只是使用+=那么每次+=调用该行时都会构建一个全新的字符串.StringBuilder更快,因为它每次调用时都会保存一个缓冲区并附加到缓冲区append.

  • 另外,在紧凑的循环中,您可以创建大量的字符串,每个字符串比最后一个大一点.这在C#(井.Net)中也是如此.我也同意Eric Wendelin的评论,你应该写一个测试来看看.当你能向他展示他是对还是错的证明文件时,不要告诉你的教授关于interwebz的人的意见.我会做一些测试用例:通过每种方法创建一个字符串的速度,在循环中创建批次的速度等. (2认同)
  • @ jeffa00:我同意,仪器化测试是证明这一点的最好方法.但是,要注意教授(无论如何我的经验)不喜欢被挑战.*特别是*不要在课堂上这样做. (2认同)

ben*_*y23 14

稍微偏离主题,但我希望整个"必须不使用 - 加连接到串口的Java"神话会消失.虽然在Java的早期版本中可能确实存在StringBuffer更快且"+是邪恶的",但在现代JVM中处理大量优化的情况肯定不是这样.

例如,哪个更快?

String s = "abc" + "def";
Run Code Online (Sandbox Code Playgroud)

要么

    StringBuffer buf = new StringBuffer();
    buf.append("abc");
    buf.append("def");
    String s = buf.toString();
Run Code Online (Sandbox Code Playgroud)

答案是前者.JVM认识到这是一个字符串常量,实际上将"abcdef"放在字符串池中,而"优化的字符串缓冲"版本将导致构建一个额外的StringBuffer对象.

另一个JVM优化是

String s = onestring + " concat " + anotherstring;
Run Code Online (Sandbox Code Playgroud)

JVM将在哪里找出最好的连接方式.在JDK 5中,这意味着StringBuilder将在内部使用,并且比使用字符串缓冲区更快.

但正如其他答案所说,你问题中的"123456"常数肯定是最快的方式,你的讲师应该回到学生身上:-)

是的,我一直很伤心,通过查看Java字节码来验证这一点......


Mic*_*ael 11

整个讨论没有实际意义.请阅读Jeff撰写的这篇文章,即创建Stack Overflow的人.

微优化剧场的悲剧悲剧

请将您的导师转介到这篇文章,并要求他停止用无用的信息破坏他/她的学生的大脑.算法优化是代码生存或死亡的地方,而不是用于构造字符串的方法.在任何情况下,StringBuilder和String格式化程序都必须使用REAL MEMORY执行ACTUAL CODE,如果你只是构造一个字符串,它在编译期间被预留并准备好在你需要它时使用,实质上它有0运行 - 时间成本,而其他选项有实际成本,因为代码实际上需要执行.

  • 如果OP有一个太慢的程序,并试图通过查看琐碎的字符串连接来优化它,我可能会同意你,但这是一个问题,OP会想知道某些东西是如何工作的.对于试图了解他们的编程平台的人来说,"在你需要它之​​前不要优化"就像是说"在你的房子着火之前不要费心去购买保险".(至于你的其他帖子,我完全同意.) (4认同)
  • 让我们微观优化这篇文章吧!:) (2认同)

Ben*_*n S 8

String foo = "some string literal";
Run Code Online (Sandbox Code Playgroud)

肯定是制作String的最快方法.它嵌入在.class文件中,是一个简单的内存查找方式.

String.format当你没有任何真正的格式时使用看起来很难看,可能会导致初级开发人员哭泣.

如果要修改String,那么StringBuilder最好的Strings不可变的.

  • 当你没有真正的格式化时使用String.format也可能也会导致高级开发人员哭泣. (14认同)

mpo*_*ien 5

在第二个示例中,使用:

String foo = String.format("%s", 123456);
Run Code Online (Sandbox Code Playgroud)

什么都买不到; 123456已经是一个常数值,为什么不指定foo ="123456"?对于常量字符串,没有更好的方法.

如果您在运行时从多个部分创建一个字符串,请使用StringBuffer或StringBuilder(前者是线程安全的).