学习任务:

视频学习字符串缓冲区

动手测试StringBuffer与String的性能比较

动手测试StringBuffer的基本使用

理解StringBuffer和StringBuilder区别

理解StringBuffer的使用场景

在开发经常会出现循环处理字符串,比如下边的代码:

package com.pbteach.javase.pop.api.string;

/**
 * 字符串缓冲区测试
 * @author 攀博课堂
 * @version v1.0
 */
public class StringBufferTest {
	
	/**
	 * 
	 * 使用String循环拼接字符串
	 * @author 攀博课堂
	 * @version v1.0
	 */
	public static void test01(){
		
		String str = "";
		//开始执行时间
		long currentTimeMillis = System.currentTimeMillis();
		for(int i=0;i<10000;i++) {
			//字符串拼接
			str +=i;
		}
		//输出拼接后的字符串内容,由于内容太多所以屏蔽
//		System.out.println(str);
		//执行总时长
		System.out.println(System.currentTimeMillis()-currentTimeMillis);
		
	}
	...

运行程序,输出本程序的执行时间(毫秒):

128

注意:每次运行得到的结果是不一样的。

下边是另一种拼接字符串的方法:

package com.pbteach.javase.pop.api.string;

/**
 * 字符串缓冲区测试
 * @author 攀博课堂
 * @version v1.0
 */
public class StringBufferTest {
		
	/**
	 * 
	 * 使用StringBuffer拼接字符串
	 * @author 攀博课堂
	 * @version v1.0
	 */
	public static void test02(){
		
		StringBuffer stringBuffer = new StringBuffer();
		//开始执行时间
		long currentTimeMillis = System.currentTimeMillis();
		for(int i=0;i<10000;i++) {
			stringBuffer.append(i);
		}
		//输出拼接后的字符串内容,由于内容太多所以屏蔽
//		System.out.println(stringBuffer.toString());
		//执行总时长
		System.out.println(System.currentTimeMillis()-currentTimeMillis);
	}
	...

输出:

运行程序,输出本程序的执行时间(毫秒):

1

注意:每次运行得到的结果是不一样的。

通过测试发现两种方法的运行时长相差较大,使用StringBuffer拼接字符串速度较快。为什么呢?

下边的代码在次循环都会创建新的对象

for(int i=0;i<10000;i++) {
    //字符串拼接
    str +=i;
}

而下边的代码只是将字符串添加到容器中并不是创建新的对象

for(int i=0;i<10000;i++) {
	stringBuffer.append(i);
}

StringBuffer是一个字符串缓冲区,是一个容器。

1、StringBuffer容器中的内容是可变的,可以当作字符串变量。

2、StringBuffer提供很多对容器中数据的操作功能,比如:添加,删除,查找,修改。

3、StringBuffer中添加的所有的数据最终变成一个字符串。

测试代码如下:

package com.pbteach.javase.oop.api.string;

/**
 * String缓冲区测试
 * @author 攀博课堂
 * @version v1.0
 */
public class StringBufferTest {
	
	//StringBuffer测试
	public static void test1() {
		//创建字符串缓冲区对象
		StringBuffer sb = new StringBuffer();
		sb.append("www");
		sb.append(".pbteach");
		sb.append(".com");
		//转成字符串
		String str = sb.toString();
		System.out.println(str);
		//在字符串指定索引位置插入
		sb.insert(0, "攀博课堂");
		String str2 = sb.toString();
		System.out.println(str2);
		//删除指定索引位置的字符
		sb.delete(0, 4);
		String str3 = sb.toString();
		System.out.println(str3);
		
	}
	
	public static void main(String[] args)  {
		test1();
	}

}

输出:

www.pbteach.com
攀博课堂www.pbteach.com
www.pbteach.com

StringBuilder与StringBuffer一样都是字符串缓冲区,API方法也基本相同,但存在一定的区别:

1)StringBuffer是线程安全,StringBuilder是线程不安全的。

线程安全这个词用于多线程编程上,线程安全表示当多线程访问同一块数据时不会出现数据错误的问题,而线程不安全则会,暂时先这么理解线程安全。

2)处理速度不同

由于StringBuffer是线程安全的,所以在一些处理上会加锁控制,StringBuffer的速度没有StringBuilder快。

所以在不需要考虑多线程的程序处理上建议用StringBuilder。

并不是说使用String的地方就要用StringBuffer或StringBuilder替换,当有开篇那样的场景时用StringBuffer或StringBuilder去替代String,对于小数量的字符串常量拼接其速度是大于使用StringBuffer的,比如下边的代码:

String a="www";
String b=".compbteach";
String c=".com"
String d = a + b +c
提问-攀博课堂
我要提问 不会就问,有效沟通
关注公众号,加入微信群交流提问。 攀博课堂官方公众号
问答列表,查看本知识点所有问题