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