【问题标题】:Long String vs StringBuilder variations performance [closed]Long String vs StringBuilder 变体性能[关闭]
【发布时间】:2018-12-07 13:27:47
【问题描述】:

您好,我已经看到了几种创建字符串的方法,我想知道哪一种更快,即两者之间的性能更好

String a ="Hello sick sad world! 213763e83456382582463456";

String a =new String("Hello sick sad world! 213763e83456382582463456");

StringBuilder sb = new StringBuilder("Hello sick sad world! 213763e83456382582463456");
String a = sb.toString();

StringBuilder sb = new StringBuilder();
sb.append("Hello");
sb.append(" sick");
sb.append(" sad");
sb.append(" world!");
sb.append(" 213763e83456382582463456");
String a = sb.toString();

StringBuilder sb = new StringBuilder();
sb.append("Hello").append(" sick").append(" sad").append(" world!").append(" 213763e83456382582463456");
String a = sb.toString();

【问题讨论】:

  • StringBuilder 仅在您从编译时不知道的部分动态组合 String 时才有用。没有理由像你在这里建议的那样使用它..
  • 每个示例都有不同的作用。您要解决的真正问题是什么?
  • 删除最后一段代码中的多余空格,这违背了这个问题的想法:)

标签: java string optimization


【解决方案1】:

顺序是:

  • 1 - 最快
  • 2 - 第二快
  • 3 - 第三快
  • 4 & 5 - 最后相等

事实上,如果您忽略代码加载等开销,第一个示例将简化为单个指针分配。你无法改进。

其他例子都涉及到至少一个新对象的创建。

【讨论】:

  • 虽然这是真的,但我认为值得注意的是,除了最极端的工作负载之外,1、2 和 3 几乎是相同的(new String(String) 只是一个恒定时间操作),而 3 和 4 会明显变慢(它们需要将所有字符复制两次)。
  • 如果字符串还没有在池中,怎么1比2快?
  • @yshavit - N 字符串的指针分配是 O(1)。复制一个 N 个字符串 O(N).
  • @MickMnemonic - 无论字符串是否在字符串池中,指针赋值为 O(1),字符串复制为 O(N)。 (假设我们谈论的是当前一代的 Java String 实现。)
  • 让我澄清一下:如果程序只运行一次,第一个版本必须同时创建字符串和intern。怎么比只在第二个版本中创建字符串更快?
【解决方案2】:

String 是一种连线且很酷的东西是 Java。

  1. 使用"Hello sick sad world! 213763e83456382582463456"如果有的话重用现有的String对象。

  2. 分配新内存并添加值"Hello sick sad world! 213763e83456382582463456"

  3. 首先创建一个值为"Hello sick sad world! 213763e83456382582463456"StringBuilder 对象,然后在toString() 方法期间,它开始分配内存并在StringBuilder 实现中分配值。

4,5 是一样的东西,只是代码短的问题。

StringBuilder 和 String 在不同的情况下使用,StringBuilder 是为了使 String 操作高效。由于 String 的行为是不可变的,因此您可以从 String builder 实现可变行为。

您的问题的答案是 1 或 2。如果您在字符串对象池中命中,则 1 比 2 快,如果不是,则 2 比 1 快。

【讨论】:

  • 你能解释一下为什么你认为 2 更快,如果池中没有匹配的字符串? (顺便说一句,情况并非如此。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-27
  • 1970-01-01
  • 2014-06-12
  • 2017-08-20
相关资源
最近更新 更多