public class StringBufferTest {
/**
* String \ StringBuffer \StringBuilder三者异同
* String:不可变的字符序列:底层使用char[]存储
* StringBuffer:可变的字符序列:线程安全的,效率偏低;底层使用char[]存储
* StringBuilder:可变的字符序列:线程不安全的,效率高;底层使用char[]存储
* <p>
* <p>
* <p>
* 底层数据结构
* 源码分析
* String str=new String();//char [] value=new char[0]
* String str=new String("abc");//char [] value=new char[]{'a','b','c'};
* <p>
* StringBuffer sb1=new StringBuffer();//char [] value=new char[16];//底层创建了一个长度为16的数组
* sb1.append('a');//value[0]='a';
* sb1.append('b');//value[1]='b';
* <p>
* StringBuffer sb2=new StringBuffer("abc");//char []value=new char["abc".length+16]{'a','b','c'};
* <p>
* //问题一:System.out.println(sb2.length);//3
* <p>
* //问题二:数组扩容(扩容问题):如果添加的数据,底层数组盛不下了,那就需要扩容底层的数组
* 默认情况下,扩容为原来容量的2倍+2,同时将原来数组中的元素复制到新的数组中。
* <p>
* <p>
* 尽量避免扩容,开发中建议使用StringBuffer(int capacity) 或 StringBuilder(int capacity)
*/
@Test
public void test1() {
//可变
StringBuffer stringBuffer = new StringBuffer("abc");
stringBuffer.setCharAt(0, 'm');
System.out.println(stringBuffer);
}
/**
* StringBuffer常用方法
* StringBuffer append(xxx):提供了很多append()方法,用于进行字符串拼接
* StringBuffer delete(int start, int end):删除指定范围的内容【start,end)
* StringBuffer deleteCharAt(int index):删除指定位置的字符
* StringBuffer replace(int start, int end, String str):把【start,end)位置替换为str
* StringBuffer insert(int offset, XXX):在指定位置插入XXX
* StringBuffer reverse():把当前字符序列逆转
* public int indexOf(String str)
* public synchronized String substring(int start, int end):返回一个从start开始到end索引结束的左闭右开的子字符串
* public int length()
* public char charAt(int n)
* public void setCharAt(int n,char ch)
*
*
* 总结:
* 增:append(XXX)
* 删:delete(int start, int end)\deleteCharAt(int index)
* 改:replace(int start, int end, String str)\setCharAt(int n,char ch)
* 查:charAt(int n)
* 插入:insert(int offset, XXX)
* 长度:length()
* 遍历:
*
*
*
*/
@Test
public void test2()
{
// StringBuffer sb1=new StringBuffer(32);
// sb1.append(1);
// sb1.append("hello");
// System.out.println(sb1);
//
// sb1.delete(0,3);
// System.out.println(sb1);
//
// StringBuffer sb2=new StringBuffer("helloworld");
// sb2.deleteCharAt(1);
// System.out.println(sb2);
// StringBuffer sb3=new StringBuffer("helloworld");
// sb3.replace(1,4,"test");
// System.out.println(sb3);
//
// StringBuffer sb4=new StringBuffer("abcd");
// sb4.insert(1,"123");
// System.out.println(sb4);
//
// StringBuffer s5=new StringBuffer("abcd");
// s5.reverse();
// System.out.println(s5);
StringBuffer s6=new StringBuffer("abcdhello");
System.out.println(s6.indexOf("hello"));
System.out.println(s6.substring(2, 5));
}
}