public class StrBuf {
public static void main(String[] args){
StringBuffer strBuf = new StringBuffer(4);
strBuf.setCharAt(0, 'c');
strBuf.setCharAt(1, 'c');
strBuf.setCharAt(2, 'c');
strBuf.setCharAt(3, 'c');
System.out.println(strBuf);
}
}
在编写java代码时,如果字符串的长度不确定,我们一般会使用StringBuilder或者StringBuffer来进行缓存,最后将StringBuffer或者StringBuilder转换成String,所以按常规思维来算,我们先new一个一定长度的StringBuffer,然后再利用setCharAt方法进行修改就可以了,但是运行如上代码,会提示 Exception in thread "main" java.lang.StringIndexOutOfBoundsException的错误,我刚开始觉得为什么会说明我越界,我程序里并没有越界啊。
进入源码分析:
//StringBuffer 的构造函数(StringBuffer继承了AbstractStringBuilder抽象类)
public StringBuffer(int capacity) {
super(capacity);
}
//AbstractStringBuilder的构造方法
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
AbstractStringBuilder类中用char[]和count来实现StringBuffer和StringBuilder。
abstract class AbstractStringBuilder implements Appendable, CharSequence {
/**
* The value is used for character storage.
*/
char[] value;
/**
* The count is the number of characters used.
*/
int count;
...
}
StringBuffer strBuf = new StringBuffer(3);
初始化一个StringBuffer, 源码里面显示,只是new了一个char数组,但是count值并没有改变,所以,当我们使用setCharAt方法时,就会出现超出边界的错误。看到这里,其实我们只需要改变count值,就可以了,恰好AbstractStringBuilder存在改变count的方法,即:setLength(int length)方法,所以,以上代码改正如下:
public class StrBuf {
public static void main(String[] args){
StringBuffer strBuf = new StringBuffer(3);
strBuf.setLength(3);
strBuf.setCharAt(0, 'c');
strBuf.setCharAt(1, 'c');
strBuf.setCharAt(2, 'c');
System.out.println(strBuf);
}
}
以上代码运行正常。
那么现在问题来了:如果setLength时,设置的count长度和初始化时的长度不同会怎么样。
(1)当setLength设置的长度,小于初始化时的长度时:
public class StrBuf {
public static void main(String[] args){
//StringBuffer strBuf = new StringBuffer(5);
StringBuffer strBuf = new StringBuffer("abcdef");
strBuf.setLength(3);
strBuf.setCharAt(0, 'c');
strBuf.setCharAt(1, 'c');
strBuf.setCharAt(2, 'c');
strBuf.setCharAt(3, 'c');
System.out.println(strBuf);
}
}
运行以上代码,会报越界的错误。
public class StrBuf {
public static void main(String[] args){
//StringBuffer strBuf = new StringBuffer(5);
StringBuffer strBuf = new StringBuffer("abcdef");
strBuf.setLength(3);
System.out.println(strBuf);
}
}
//输出结果为:
abc
(2)当setLength设置的长度,大于初始化时的长度时:
public class StrBuf {
public static void main(String[] args){
StringBuffer strBuf = new StringBuffer(5);
//StringBuffer strBuf = new StringBuffer("abcdef");
strBuf.setLength(20);
strBuf.setCharAt(0, 'c');
strBuf.setCharAt(1, 'c');
strBuf.setCharAt(2, 'c');
strBuf.setCharAt(10, 'c');
strBuf.setCharAt(19,'b');
System.out.println(strBuf);
}
}
//运行结果如下:
ccc c b