Java总结之String Buffer

2017年7月5号面试的时候,在String和StringBuffer的区别问题上卡住了,虽然平常这两个类用的比较多,但是还没有认真研究过他们,所以借这个机会写一下二者的区别。

以及对StringBuffer进行一次系统的复习。

package cn.wen.basic.test;

import org.junit.Test;

/**
 * StringBuffer api解释为 线程安全,可变的字符序列。 字符串缓冲区就像一个String ,但可以修改。
 * 在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。 优点:
 * 在源码中看到StringBuffer中所有的方法都被synchronized修饰符修饰,这也意味着StringBuffer中的方法在操作过程中需要做到线程同步,来保证在不同的线程中
 * 所执行的线程中调用顺序一致的顺序发生。 替代类: StringBuilder 不同之处
 * :StringBuilder不支持同步。所以比StringBuffer更快 面试题String与StringBuffer的区别:
 * String所存储的字符串不能被修改,覆盖后是与覆盖前是两个不同的对象。 String中不支持线程同步
 * StringBuffer线程安全,在多线程中可以很好的执行,但是因为涉及到同步,可能程序的执行效率会慢一些。
 * StringBuffer是一种辅助类,可以预先在内存中预留指定长度的字符缓冲区,这样使用StringBuffer类的append方法比使用String+操作符添加字符到一个已经存在的
 * 字符串后面要更有效率,因为String在使用+操作符添加字符将一个字符串中时,字符串对象需要寻找一个更大的内存空间来存储数据,这非常耗时间。
 * 
 * @author V
 *
 */

public class testStringBuffer {

	@Test
	public void testStringBufferConstructor() {

		StringBuffer sb = new StringBuffer();// 构造一个没有字符的字符缓冲区,初始容量为16个字符,如果初始容量不够用,自动增加一倍
		String str1 = "12345678901234567890";
		sb.append(str1);
		System.out.println(sb);
		/*
		 * 测试中我发现,如果你指定了支付缓冲区的容量,但是你存储的时候字符多于设置值时,依然会自动增长一倍+2 发现源码中有这样一段代码 int
		 * newCapacity = (value.length << 1) + 2; if (newCapacity - minCapacity
		 * < 0) { newCapacity = minCapacity; }
		 * 意思就是说如果当前将要存储的字符串长度大于容量,先将容量的大小增加一倍并+2,如果还不够就将容量 设置为字符串的长度
		 * 如果增長后仍然不滿足其需要的容量,會將容量設置為字符串的字符長度。
		 */
		StringBuffer sb1 = new StringBuffer(20);// 构造一个没有字符指定容量为20个字符的字符缓冲区
		String str2 = "1234567890abcdefghijklmnopqrstuvwxyz";
		sb1.append(str2);
		System.out.println(sb1.capacity());
		System.out.println(sb1 + ";长度:" + sb1.length());
		StringBuffer sb2 = new StringBuffer(25);
		System.out.println(sb2.capacity());
		String str3 = "12345678900123456789asdfghjklqwertyuiopasdfghjklzxcvbnm";
		sb2.append(str3);
		System.out.println(sb2.capacity() + ";字符长度:" + sb2.length());

		// 如果在构造方法中传入一串字符时,缓冲区容量会默认为字符长度+16;
		StringBuffer sb3 = new StringBuffer("abcdefghijekeererad");
		System.out.println("字符串长度:" + sb3.length() + "; 字符缓冲区容量:" + sb3.capacity());
	}

	/**
	 * 测试StringBuffer的方法
	 */
	@Test
	public void testStringBufferMethod() {
		String str = "addfdfa";
		StringBuffer sb0 = new StringBuffer(str);
		System.out.println("-------末尾添加-------");
		sb0.append("d");// 在序列末尾加一个字符
		System.out.println(sb0.toString());
		char[] ch = { 's', 'o', 'f', 't' };
		/**
		 * 末尾添加数据的类型还有很多,包括boolean char String int double object等 不在一一列举
		 */
		sb0.append(ch);// 在序列末尾加一个字符(char)数组
		System.out.println(sb0.toString());
		sb0.append(ch, 1, 3);// 在序列末尾加一个字符数组并指定从数组的第1个位置向后长度为3
		System.out.println(sb0.toString());
		String str1 = "big";
		sb0.append(str1);// 在序列末尾加一串String的字符串
		System.out.println(sb0.toString());
		sb0.append(str1, 1, 2);// 在序列末尾加一串指定起始位置为1结束位置为2的字符串
		System.out.println(sb0.toString());
		int i = 0;
		sb0.append(i);// 在序列末尾加一个int类型的数据 插入后类型变为StringBuffer类型
		System.out.println(sb0);
		/*
		 * 查找方法使用
		 */
		System.out.println("-------查找方法-------");
		char a = sb0.charAt(0);
		System.out.println(a);
		String str2 = "add";
		int index = sb0.indexOf(str2);// 返回str2字符串第一次出现的索引值
		System.out.println(index);
		char[] ch1 = new char[100];
		sb0.getChars(0, 5, ch1, 8);//查找StringBuffer中的从0开始到5的并重新分配给一个char数组
		for (char c : ch1) {
			if (c != '') {
				System.out.print(c);
			}
		}
		System.out.println("----------插入-----------");
		char[] ch2={'w','a','r','e'};
		sb0.insert(0, ch2);
		System.out.println(sb0.toString());
		sb0.insert(0, ch2, 1, ch2.length-1);//在stringBuffer的0位置插入ch2并指定插入ch2的开始位置与长度
		System.out.println(sb0.toString());
		sb0.delete(1, 5);//删除1到5的字符 不包含5
		System.out.println(sb0.toString());

	}

}

  

原文地址:https://www.cnblogs.com/smallbrokenchildwen/p/7136918.html