deleteCharAt 或 setLength,哪种方法最好从 StringBuilder/StringBuffer 中删除最后一个字符

2022-09-03 06:29:18

在许多情况下,我们需要删除 StringBuilder/StringBuffer 的最后一个字符。例如,给定一个 ,以实现一个方法,用逗号分隔符联系每个元素。输出应为 ,没有尾随逗号。int[]{1,2,3}String toString(int[] a)1,2,3

我们可以很容易地写一个循环:

int[] nums = new int[]{1,2,3,4,5};
StringBuilder sb = new StringBuilder();
for (int i = 0; i < nums.length; i++) {
    sb.append(nums[i]);
    sb.append(",");
}
//here we need to remove the tailing ','

但总是我们需要删除尾矿。有两种方法可以实现它:','

sb.deleteCharAt(sb.length() - 1);

sb.setLength(sb.length() - 1);

推荐哪一个?为什么?

注意:我知道有什么作用。这只是描述我的问题的一个例子,也许不太合适。这不是关于字符串串联的讨论,而是StringBuffer/StringBuilder的最佳实践。Arrays.toString


答案 1

实际上,它几乎没有什么,可能取决于硬件和其他因素。

该方法只是更改计数,并用零字节覆盖数组中不需要的值。setLength()

在更改计数之前,在内部执行数组复制。这听起来很戏剧性,但正在复制的数组实际上是零长度的,因为您要删除最后一个字符。deleteCharAt()

我建议去,因为它打字更短,我认为可以更清楚地说明你在做什么。如果性能是一个问题,并且在测量时,你发现这是你的瓶颈,那么也许你可以考虑一种不需要改变大小的不同算法(根据JB Nizet的答案)。setLength()


答案 2

如何正确地做到这一点,是有条件地在逗号前面加上:

for (int i = 0; i < nums.length; i++) {
    if (i > 0)
        sb.append(',');
    sb.append(nums[i]);
}

然后,您不必担心删除最后一个字符,因为它已经是正确的。


推荐