Java中的StringBuffer类

StringBuffer的特点、定义、常用方法什么的就不说了,说些别的。

1、StringBuffer与String的本质区别:
先说说String。总所周知,String类的内容一旦声明就不可改变,即便通过连字符(+)进行追加内容改变的也只是其内存地址的指向。下面可以用实例证明下:
有一点需要先达成共识:拥有相同hashCode的两个对象,其内存地址必然相同。

public static void main(String[] args) {
	String str = "123";
	String str2=str;
	System.out.println(str.hashCode());//48690
	System.out.println(str2.hashCode());//48690
	str = str+"456";
	System.out.println(str.hashCode());//1450575459
	str = str+"789";
	System.out.println(str.hashCode());//-1867378635
}

实例当中的str与str2指向同一个地址:即str2指向str所在地址,所以他们有相同的hashCode。后面的代码在对str进行追加的时候,其hashCode随着追加的内容不断变化,说明str的内存地址也在不断的变化,也就是重新分配了内存地址,这个时候的str已经不是最开始声明的str了。

再说StringBuffer。StringBuffer是使用缓冲区的,本身是一个具体的操作类,所以它不能像String那样采用直接赋值的方式进行对象的实例化,必须通过构造方法来完成。它使用append方法追加内容,没追加一次其内容修改一次,但内容地址并不会发生变化。如下面的例子:

public static void main(String[] args) {
	StringBuffer strBuf = new StringBuffer("123");
	System.out.println(strBuf.hashCode());//12830537
	strBuf.append("456");
	System.out.println(strBuf.hashCode());//12830537
	strBuf.append("789");
	System.out.println(strBuf.hashCode());//12830537
	System.out.println(strBuf);//123456789
}

从结果可以看出,StringBuffer的内容被修改了但其内存地址一直没有发生过变化,也就证明了StringBuffer的append追加操作修改的是内容信息而不是内存地址。


总结:要是要操作的字符串内容是动态的可能会发生变化的,使用StringBuffer比较好,因为性能较String高。要是内容不更改那就使用String吧,毕竟String用起来更得心应手嘛!

2、StringBuffer的insert()方法:
StringBuffer的insert()用来插入数据,其重载方法有很多,这里就说往指定位置插入字符串。JDK上的说明如下:
public StringBuffer insert(int offset,String str):将字符串插入此字符序列中。


实例:该实例只往字符串的最前面和最后面添加内容:

public static void main(String[] args) {
	StringBuffer strBuf = new StringBuffer("123");
	System.out.println(strBuf);//123
	strBuf.insert(0,"456");//往最前面添加内容
	System.out.println(strBuf);//456123
	strBuf.insert(strBuf.length(),"789");//往最后面添加内容
	System.out.println(strBuf);//456123789
}

3、StringBuffer中的delete方法:
该方法用来删除StringBuffer中的指定内容。JDK中的说明为:
public StringBuffer delete(int start,int end) :移除此序列的子字符串中的字符。该子字符串从指定的 start 处开始,一直到索引 end - 1 处的字符,如果不存在这种字符,则一直到序列尾部。如果 start 等于 end,则不发生任何更改。
实例:

public static void main(String[] args) {
	StringBuffer strBuf = new StringBuffer("123456789");
	strBuf.delete(0,5);//移除下标从0-4的内容,也就是移除掉前5个
	System.out.println(strBuf);//6789
		
	StringBuffer strBuf2 = new StringBuffer("123456789");
	strBuf2.delete(2,5);//移除下标从2-4的内容,也就是移除掉3个
	System.out.println(strBuf2);//126789

	StringBuffer strBuf3 = new StringBuffer("123456789");
	strBuf3.delete(-1,5);//报错: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
	System.out.println(strBuf3);
}

由API和实例可以得出:
a、StringBuffer中的内容下标从0开始;
b、delete操作删除的最后一个字符串的下标为end-1,而不是end
c、delete操作删除的字符串个数为:end-start个。
d、若start与end输入负数,则直接报错:下标越界

猜你喜欢

转载自1017401036.iteye.com/blog/2285934