【问题标题】:Connecting two Strings连接两个字符串
【发布时间】:2013-11-05 15:27:49
【问题描述】:

我知道 StrinbBuilder 很好用,用于连接两个字符串对象。我想知道这样做时发生了什么:

"a" + i + "b";

哪个选项最快最安全:

1.

int i = 0;
String a = "a" + i + "b";

2.

int i = 0;
String a = "a".concat(String.valueOf(i)).concat("b");

3.

int i = 0;
String a = String.format("a%db", i);

【问题讨论】:

  • "[code] 是一个糟糕的举动,因为 StringBuilder 对象被创建了 10 次。"没有创建 StringBuilder 对象。 StringBuilders 是这里的必经之路。
  • 没有一个替代品能像原始代码那样做......
  • 对不起,你没有理解这个问题,这根本不是循环代码。我现在删除了它。
  • “最安全”是什么意思?所提供的任何选项均不存在风险。

标签: java string concat


【解决方案1】:

因为字符串在java中是不可变的,所以每次当你执行一个产生新字符串对象的字符串操作时,如果应该考虑内存,你不能使用带有“+”号的字符串连接,因为它会创建多个字符串对象并清理不能保证当垃圾收集器运行时你不知道,你还应该考虑操作应该是线程安全的,所以在使用 stringbuffer 和 stringbuilder 时要小心

【讨论】:

    【解决方案2】:

    它们都不是很好 - 你仍然在幕后创建 StringBuilder 并在之后立即丢弃它。以下是另外两个选项:

    • 显式创建StringBuilder 并循环。

      StringBuilder builder = new StringBuilder("a");
      for(int i = 0; i < 10; i++) {
          a.append("b");
      }
      String a = builder.toString();
      
    • 使用 Guava 的 Strings.repeat() 方法,并将结果连接到 StringBuilder

      String a = new StringBuilder("a").append(Strings.repeat("b", 9).toString();
      

    就性能而言,确实没有太多需要改进的地方 - 在某种程度上,您正在创建 n 字符串。我们唯一可以实际改进的是内存开销。

    【讨论】:

      【解决方案3】:

      它们都不是字符串连接的最佳选择。一定要使用 StringBuilder,但要正确使用,不要每次都丢弃:

      StringBuilder a = new StringBuilder("a");
      for(int i = 0;i<10;i++){
          a.append("b");
      }
      

      这将执行此操作,而无需每次都创建新的 String 对象。

      【讨论】:

      • 是的,我知道,但这不是问题所在。我只是在创建第一个字符串期间询问连接字符串。最快的方法是什么:String a = "a" + i + "b";
      • + 操作其实是一样的。所以 mb + 更可取,因为它更短。
      猜你喜欢
      • 2011-08-29
      • 2020-08-19
      • 1970-01-01
      • 2016-03-01
      • 2012-10-05
      • 2011-11-04
      相关资源
      最近更新 更多