StringBuffer和StringBuilder编程遇到的问题

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


所以,setLength设置的长度如果小于初始化的长度时,char[]会被截断。只有小于count的范围内的char数组是有效的。


(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


所以当setLength设置的长度,大于初始化的长度时,程序不会出问题,没有设置的位置,会默认为空格。





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值