StringBuffer insert()和deleteCharAt()方法如何工作

时间:2012-09-23 11:20:01

标签: java string stringbuilder stringbuffer

在Java中,StringBuffer()StringBuilder()中的方法称为insert()deleteCharAt()我非常有兴趣了解这两种特定方法的工作原理。或者如何使用标准java String方法对其进行编程。我认为他们是非常简单的自己编写方法吗?

3 个答案:

答案 0 :(得分:4)

在Sun的实现中,两个方法都被委托给StringBuffer的父类AbstractStringBuilder

public synchronized StringBuffer insert(int index, char str[], int offset,
                                        int len) 
{
    super.insert(index, str, offset, len);
    return this;
}

public synchronized StringBuffer deleteCharAt(int index) {
    super.deleteCharAt(index);
    return this;
}

AbstractStringBuffer具有以下实现:

public AbstractStringBuilder insert(int index, char str[], int offset,
                                    int len)
{
    if ((index < 0) || (index > length()))
        throw new StringIndexOutOfBoundsException(index);
    if ((offset < 0) || (len < 0) || (offset > str.length - len))
        throw new StringIndexOutOfBoundsException(
            "offset " + offset + ", len " + len + ", str.length " 
            + str.length);
    int newCount = count + len;
    if (newCount > value.length)
        expandCapacity(newCount);
    System.arraycopy(value, index, value, index + len, count - index);
    System.arraycopy(str, offset, value, index, len);
    count = newCount;
    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;
}

所以,没什么特别的。

答案 1 :(得分:2)

StringBuilder和StringBuffer的insert(…)方法使用AbstractStringBuilder.insert(int, String)中实现的简单数组复制:

public AbstractStringBuilder insert(int offset, String str) {
    if ((offset < 0) || (offset > length()))
        throw new StringIndexOutOfBoundsException(offset);
    if (str == null)
        str = "null";
    int len = str.length();
    ensureCapacityInternal(count + len);
    System.arraycopy(value, offset, value, offset + len, count - offset);
    str.getChars(value, offset);
    count += len;
    return this;
}

首先,它确保内部char []数组足够大以存储结果,然后使用System.arraycopy(…)将插入点后的字符移动到右侧,并使用给定的内容覆盖从插入点开始的字符字符串。

同样,StringBuilder和StringBuffer的deleteCharAt(int)方法调用AbstractStringBuilder.deleteCharAt(int)

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;
}

通过反过来使用System.arraycopy(…)来删除字符:这次删除点之后的字符向左移动了一个字符。

答案 2 :(得分:0)

根据javadoc,两个班级对他们的方法说了同样的话。 Insert根据输入将字符串插入到字符串中。 CharArray基于CharArray添加字符串,依此类推。 DeleteCharAt删除字符串中某个部分的字符。

StringBuffer有点快,但StringBuilder更新。 2

标准的java String方法不包含deleteCharAt()或insert()(这就是为什么有StringBuilder / Buffer),但你可以找到一种方法来解决substring()。

是的,您可以自己编写方法。我将在JDK中查看StringBuilder或StringBuilder的源代码。