Java StringBuffer中deleteCharAt()的用途是什么?

时间:2011-07-26 12:15:56

标签: java stringbuffer

我们delete()已经StringBuffer了。我们为什么需要deleteCharAt()deleteCharAt(n)delete(n, n+1)不会这样做吗?

6 个答案:

答案 0 :(得分:1)

查看源代码告诉delete()没有使用deleteCharAt(),反之亦然。我注意到一个小差异:如果index不在边界内,deleteCharAt将抛出异常,而当第二个参数传递字符串长度时,delete将默认为字符串的长度。

但是对字符串缓冲区内容的影响是相同的。

答案 1 :(得分:1)

一个可能的原因是简单。为什么要删除单个字符需要两个参数?

另一种可能性是delete()是按deleteCharAt()实现的,因此deleteCharAt()因此需要存在并且本身很有用,它只是被宣布为公共的。但是人们可以look at the source code并且看到这不是这种情况。但它是许多其他Java类中的常见模式。

第三种可能性是因为该方法能够假设它正在删除单个字符,deleteCharAt()可以以比更通用的delete()更有效的方式实现。但是,源代码再次规定了此选项。这两种方法都解决了对System.arraycopy()几乎完全相同的调用。

因此,我有第一个选项的投票。这样做只是为了简化相对常见的删除单个字符的用例,方法是减少程序员需要从2到1提供的参数数量。

答案 2 :(得分:0)

区别是函数的实现DeleteAt是一个单一的语句,比如从列表list中删除.remove(index)delete接受两个参数并使循环从起始索引开始,并调用remove函数直到第二个参数。

答案 3 :(得分:0)

deleteCharAt的实现中可以利用效率,因为该方法知道它正在删除正好一个字符。

相反,删除delete(n, m)中的系列字符可能需要更复杂的执行路径,这些路径必然更昂贵,因为它们“做得更多”。

虽然delete(n, n+1)deleteCharAt(n)具有相同的效果,但deleteCharAt可能会更快。 (优化器可以将一个转换为另一个!)。它肯定不会慢。

答案 4 :(得分:0)

您可能会获得相同的结果,但实际上,这里存在一些效率问题......

对于在给定索引处的删除,对此索引进行一次简单检查就足够了,而在删除一系列索引时需要更多一些。

亲眼看看:

public AbstractStringBuilder delete(int start, int end) 
{
    if (start <  0)
        throw new StringIndexOutOfBoundsException(start);
    if (end  > count)
        end = count;
    if (start  > end)
        throw new StringIndexOutOfBoundsException();
    int len = end - start;
    if (len  > 0) {
        System.arraycopy(value, start+len, value, start, count-end);
        count -= len;
    }
    return this;
}

与:相比:

public AbstractStringBuilder deleteCharAt(int index) 
{
    if ((index <  0) || (index  >= count))
        throw new StringIndexOutOfBoundsException(index);
    System.arraycopy(value, index+1, value, index, count-index-1);
    count--;
    return this;
}

因此,如果您只需删除一个字符,最好使用deleteCharAt并保存一些检查。然而,如果你想删除超过1个连续的char,更喜欢使用delete,这样只需要调用一次arraycopy,每次调用deleteCharAt时都不会重复检查:)

答案 5 :(得分:0)

有一个区别 *
如果n是文本的长度,即buffer.length(),则deleteCharAt(n)将抛出StringIndexOutOfBoundsException,而delete(n, n+1)将不执行任何操作 - 没有异常,没有删除任何内容。<登记/> 对于更大的n值,两者都将抛出异常。

IMO最好使用deleteCharAt,因为它正是您想要做的。使用delete有点难以理解。

delete会检查更多其他索引)

* Java 1.6