1

Java にはいずれかStringBuffer()またはStringBuilder()呼び出されるメソッドがinsert()ありdeleteCharAt()、これら 2 つの特定のメソッドがどのように機能するかをもう少し理解することに非常に興味があります。または、標準の Java String メソッドを使用してプログラムする方法。自分で書くのはかなり簡単な方法だと思いますか?

4

3 に答える 3

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

だから、特別なことは何もありません。

于 2012-09-23T11:36:54.837 に答える
2

insert(…)StringBuilder と StringBuffer の両方のメソッドは、 に実装されている単純な配列のコピーを使用し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(…)し、指定された文字列で挿入ポイントから始まる文字を上書きします。

同様に、deleteCharAt(int)StringBuilder と StringBuffer の両方のメソッドは次のように呼び出します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(…)ます。今回は、削除ポイントの後の文字が 1 文字左にシフトされます。

于 2012-09-23T11:37:14.463 に答える
0

javadocによると、両方のクラスがメソッドについて同じことを言っています。Insert は、入力に基づいて文字列を文字列に挿入します。CharArray は、CharArray などに基づいて文字列を追加します。DeleteCharAt は、文字列の特定の部分の文字を削除します。

StringBuffer は少し高速ですが、StringBuilder の方が新しいです。2

標準の Java String メソッドには、deleteCharAt() または insert() が含まれていません (そのため、StringBuilder/Buffer が存在します) が、おそらく substring() によって回避する方法を見つけることができます。

はい、メソッドを自分で書くことができます。JDK の StringBuilder または StringBuilder のソースを調べます。

于 2012-09-23T11:38:06.957 に答える