我正在使用 Java StringBuilder 进行测试,尤其是在 AbstractStringBuilder 类中实现的 replace(int, int, String) 函数,如下所示:
public AbstractStringBuilder replace(int start, int end, String str) {
if (start < 0)
throw new StringIndexOutOfBoundsException(start);
if (start > count)
throw new StringIndexOutOfBoundsException("start > length()");
if (start > end)
throw new StringIndexOutOfBoundsException("start > end");
if (end > count)
end = count;
int len = str.length();
int newCount = count + len - (end - start);
if (newCount > value.length)
expandCapacity(newCount);
System.arraycopy(value, end, value, start + len, count - end);
str.getChars(value, start);
count = newCount;
return this;
}
Arraycopy 函数调用确实“移动”了值字符数组的内容,以便为以后注入(inject)的 str 内容 (str.getChars(value, start)) 腾出空间。从我的角度来看,如果 str 长度与字符数组中要覆盖的空间不匹配,则应该只执行此 arraycopy。
很明显,有人非常不顾一切地认为这是一个性能问题,尽管在 StringBuilder 替换类中使用更大的字符数组(>500k 个字符)和 arraycopy 进行测试导致可衡量的性能改进。
在 Windows 32 位平台上使用 java 6 对相同的 StringBuilder 实例进行了数百万次替换调用测试。
您认为这不重要,是一个错误还是我完全遗漏了什么?
最佳答案
我会将其作为增强请求传递。
有点像
if (end != start + len)
System.arraycopy(value, end, value, start + len, count - end);
进一步的改进是更改数组副本。
public static void arraycopy(Object src, int srcPos,
Object dest, int destPos,
int length) {
if (srcPos != destPos && length != 0)
arraycopy0(src, srcPos, dest, destPos, length);
private static native void arraycopy0(Object src, int srcPos,
Object dest, int destPos,
int length);
关于java - AbstractStringBuilder 可能的性能增强,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9618093/