经测试,append()char字符和两个有参构造函数比官方代码效率稍高,其他方法如append()String字符串,insert()等都比原方法的效率要稍低;capacity扩增的方式为capacity=(int)(capacity*1.5),注意,capacity乘的参数越大浪费的内存可能更大,但效率会有所回升,效率回升的原因我想有可能是value=new char[capacity]或System.arraycopy()执行的次数有所减少,代码如下:
public class MyStringBuffer{
int capacity = 16;
int length = 0;
char[] value;
public MyStringBuffer(){
value = new char[capacity];
}
public MyStringBuffer(char c) {
length=1;
value=new char[capacity];
value[0]=c;
}
//有参构造方法
public MyStringBuffer(String str) {
length=str.length();
while(capacity<=str.length()) {
capacity=(capacity+1)*2;
}
value=new char[capacity];
for(int i=0;i<str.length();i++) {
value[i]=str.charAt(i);
}
}
public void append(String str) {
int rl=length;
length=rl+str.length();
char[] rV=value;
if(capacity<=length){//如果容量小于连接后的长度,则扩容
capacity=(int) ((length)*1.5);
value=new char[capacity];
System.arraycopy(rV,0,value,0,rl);
}
for(int i=0;i<str.length();i++) {
value[rl+i]=str.charAt(i);
}
}
public void append(char c) {
char[] rV=value;
if(capacity<=length+1){//如果容量小于连接后的长度,则扩容
capacity=(int) ((length+1)*1.5);
value=new char[capacity];
System.arraycopy(rV,0,value,0,length);
}
value[length]=c;
length=length+1;
}
public void insert(int pos, char b) {
insert(pos,String.valueOf(b));
}
public void delete(int start) {
delete(start,length);
}
public void delete(int start, int end) {
//边界条件判断
if(start<0)
return;
if(start>length)
return;
if(end<0)
return;
if(end>length)
return;
if(start>=end)
return;
System.arraycopy(value, end, value, start, length- end);
length=length-end+start;
}
public void reverse() {
for (int i = 0; i < length/2; i++) {
char temp = value[i];
value[i] = value[length-i-1];
value[length-i-1] = temp;
}
}
public int capacity() {
return capacity;
}
public int length() {
return length;
}
public void insert(int pos, String b) {
//边界条件判断
if(pos<0)
return;
if(pos>length)
return;
if(null==b)
return;
while(length+b.length()>capacity){//扩容
capacity = (int) ((length+b.length())*1.5f);
char[] newValue = new char[capacity];
System.arraycopy(value, 0, newValue, 0, length);
value = newValue;
}
char[] cs = b.toCharArray();
System.arraycopy(value, pos, value,pos+ cs.length, length-pos);//先把已经存在的数据往后移
System.arraycopy(cs, 0, value, pos, cs.length);//把要插入的数据插入到指定位置
length = length+cs.length;
}
public String toString(){
return String.valueOf(value);
}
}