私たちはすでに持っていdelete()
ますStringBuffer
。なぜ必要なのdeleteCharAt()
ですか?deleteCharAt(n)
同じことをしませんdelete(n, n+1)
か?
6 に答える
ソースを見ると、delete()はdeleteCharAt()を使用しておらず、その逆も同様です。小さな違いに気づきました。インデックスが範囲内にない場合、deleteCharAtは例外をスローしますが、2番目の引数が文字列の長さを渡すと、deleteはデフォルトで文字列の長さになります。
ただし、文字列バッファの内容への影響は同じです。
考えられる理由の1つは、単純さです。1つの文字を削除するために2つのパラメーターが必要なのはなぜですか?
もう1つの可能性はdelete()
、の観点から実装されているため、とにかく存在する必要があり、それ自体が有用であるため、単に公開されたと宣言されただけですdeleteCharAt()
。deleteCharAt()
しかし、ソースコードを見ると、ここではそうではないことがわかります。しかし、これは他の多くのJavaクラスで一般的なパターンです。
3番目の可能性は、メソッドが単一の文字を削除していると想定できるためdeleteCharAt()
、より一般的なよりも効率的な方法で実装できることdelete()
です。ただし、ここでもソースコードはこのオプションを除外しています。どちらのメソッドも、へのほぼ同じ呼び出しに解決されSystem.arraycopy()
ます。
それで、私は最初のオプションに投票します。これは、プログラマーが提供する必要のあるパラメーターの数を2から1に減らすことにより、単一の文字を削除するという比較的一般的なユースケースを単純化するためだけに行われました。
同じ結果が得られるかもしれませんが、実際には、ここにいくつかの効率の問題があります...
特定のインデックスで削除するには、このインデックスを1回チェックするだけで十分ですが、ある範囲のインデックスを削除する場合は、さらにいくつかチェックする必要があります。
自分で見て :
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;
}
したがって、1つの文字だけを削除する必要がある場合は、deleteCharAtを使用して、いくつかのチェックを保存することをお勧めします。ただし、複数の連続する文字を削除する場合は、deleteを使用して、arraycopyを1回だけ呼び出し、deleteCharAtを呼び出すたびにチェックが繰り返されないようにします:)
違いは関数の実装です。DeleteAt は、リストから削除するような単一のステートメントです。
メソッドは正確に 1文字deleteCharAt
を削除していることを認識しているため、の実装内で活用できる効率があります。
逆に、一連の文字を削除するにdelete(n, m)
は、より複雑な実行パスが必要になる場合があります。これは、「より多くのことを行う」ため、必然的にコストが高くなります。
delete(n, n+1)
と同じ効果がありますが、deleteCharAt(n)
deleteCharAt の方がおそらく高速です。(オプティマイザは一方を他方に変換する場合があります!)。それは確かに遅くなりません。
違いが 1 つあります* :がテキストの長さの
場合、StringIndexOutOfBoundsException がスローされますが、何も行われません。例外も削除もされません。
の値が大きい場合、両方とも例外をスローします。 n
buffer.length()
deleteCharAt(n)
delete(n, n+1)
n
IMOdeleteCharAt
はまさにあなたがやりたいことなので、使用する方が良いです。使い方delete
は少しわかりにくいです。
(そしてdelete
、追加のインデックスをさらにチェックします)
*ジャバ1.6