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