Java StringBuilder insert()与append()性能对比?

Java StringBuilder insert()与append()性能对比?,java,stringbuilder,Java,Stringbuilder,在StringBuilder类中,insert()和append()的性能有什么不同吗?我将构建大量的短字符串作为文本标识符,并问自己这个问题。。。我应该用分隔符初始化SB并使用insert+append还是仅仅append?它们有不同的功能和复杂性 插入: (确保备份阵列的容量,必要时需要复制旧阵列) 在插入索引(偏移量)处推送项目前面的元素 其中追加: (确保备份阵列的容量,必要时需要复制旧阵列) 将新元素添加到数组的尾部 因此,如果您希望始终添加到尾部,那么性能将是相同的,因为insert

在StringBuilder类中,insert()和append()的性能有什么不同吗?我将构建大量的短字符串作为文本标识符,并问自己这个问题。。。我应该用分隔符初始化SB并使用insert+append还是仅仅append?

它们有不同的功能和复杂性

插入

  • (确保备份阵列的容量,必要时需要复制旧阵列)
  • 在插入索引(偏移量)处推送项目前面的元素
  • 其中
    追加

  • (确保备份阵列的容量,必要时需要复制旧阵列)
  • 将新元素添加到数组的尾部
  • 因此,如果您希望始终添加到尾部,那么性能将是相同的,因为
    insert
    不会推送任何元素


    因此,我将使用
    append
    ,它只是更干净。

    根据JavaAPI文档。如果使用“插入”,则必须提供偏移量

    StringBuilder.insert(5, "String");
    
    但是
    StringBuilder.append(“string”)
    没有。我假设append比insert有更好的性能。

    知道:

    • 在时间复杂度(O(n))方面,字符串表示形式末尾的
      insert
      相当于
      append
    • 使用
      append
      (因为它们有不同的用途)无法获得
      插入
      末尾以外的任何位置
    • 有关信息,一个
      插入
      最多可能涉及3个
      系统.arraycopy
      (本机)调用,而一个
      追加
      1
    你很容易得出结论:

    • 如果要在字符串表示的末尾插入,请使用
      append
    • 否则,请使用
      insert

    这样做,你会有最好的表现。但同样,这两种方法有两个不同的用途(除了在末尾插入),这里没有真正的问题。

    insert
    需要复制一个数组来推送元素,而
    append
    只是将其添加到末尾(因此可能更快)。但是您应该首先进行基准测试。@Tunaki所以用任何不是所需字符串开头的东西初始化SB是没有意义的?我不会这么做,但这也是为了代码的清晰性。但是在说哪一个速度更快之前,我们需要正确地进行基准测试。SB的初始化默认容量通常为16个字符。在您的情况下,使用更合适的容量进行初始化可能与使用insert vs append一样或更重要。在这种情况下,如果您的算法可以工作,那么它可能更有效。如果性能非常令人关注,并且只添加元素,那么您可能需要考虑使用Link KEdLIST。假设您将结果放入缓冲区或io流,它将避免复制所有字符串。首先,StringBuilder的
    insert()
    方法是非静态方法。其次,您需要解释为什么追加优于插入。为方法提供偏移量并不能保证比append更差的性能。