我们delete()
已经StringBuffer
了。我们为什么需要deleteCharAt()
?
deleteCharAt(n)
和delete(n, n+1)
不会这样做吗?
答案 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