1, StringBuffer :翻译成 字符串缓冲区
1,特性
<1>:是线程安全的
<2>: 可变字符序列
<3>:StringBuffer 与String一样都实现了 接口 CharSequence
<4>:每个字符串缓冲区都有一定的容量,此容量会根据情况,自动的扩容。
2,本质:
StringBuffer 内部有一个char数组,默认初始值16;如果不够用了,
自动扩容规则: 数组的当前长度 *2 +2;
3,构造方法
public StringBuffer()
public StringBuffer(int capacity)
public StringBuffer(String str)
4,功能
<1>添加功能
public StringBuffer append(String str):按顺序附加
public StringBuffer insert(int offset,String str):插队
<2>删除功能
public StringBuffer deleteCharAt(int index)
public StringBuffer delete(int start,int end)
<3>替换功能
public StringBuffer replace(int start,int end,String str)
<4>反转功能
public StringBuffer reverse()
<5>截取功能
public String substring(int start)
public String substring(int start,int end)
截取功能和前面几个功能的不同
返回值类型是String类型,本身没有发生改变
++++++++StringBuffer的实例以及与String作为形式参数的区别++++++++++
public class StringBufferDemo {
public static void main(String[] args){
StringBuffer sb=new StringBuffer();
sb.append(“jerry”);
//length为5,表示真是存储的字符数量
System.out.println(sb.length());
//capacity 表示容量,内部数组的长度.初始值是16
System.out.println(sb.capacity());
System.out.println("");
//当我们使用字符串拼接的时候,字符串相加操作的时候,建议我们使用
//StringBuffer代替String
sb.append(“i”);
StringBuffer sb2=new StringBuffer();
StringBuffer sb3=new StringBuffer(2500);
//将String转化为StringBuffer
StringBuffer sb4=new StringBuffer(“jerry”);
System.out.println("");
System.out.println(“sb:”+sb+sb.hashCode());
sb.insert(5,“william”);
System.out.println(“sb:”+sb+sb.hashCode());
System.out.println("");
sb.deleteCharAt(5);
System.out.println(“sb:”+sb+sb.hashCode());
System.out.println("");
sb.delete(5,10);
System.out.println(“sb:”+sb+sb.hashCode());
System.out.println("==========================");
String subdtring=sb.substring(5);
System.out.println(“截取的子字符串:”+subdtring);
//由此看出,截取功能和前面几个功能不同,返回值类型为String类型,
// 本身没有发生改变
System.out.println(“sb:”+sb+sb.hashCode());
System.out.println("=========String与StringBuffer作为形式参数传递的不同表现=======================");
int i=10;
String str1="jerry";
String str2="susan";
System.out.println(i);
System.out.println("str1:"+str1+",str2:"+str2);
change(str1,str2);
System.out.println("str1:"+str1+",str2:"+str2);
System.out.println("============================");
StringBuffer sb5=new StringBuffer("hello");
StringBuffer sb6=new StringBuffer("world");
System.out.println("sb5:="+sb5+",sb6:"+sb6);
System.out.println("sb5的哈希值:"+sb5.hashCode());
System.out.println("sb6的哈希值:"+sb6.hashCode());
change(sb5,sb6);
System.out.println("sb5:="+sb5+",sb6:"+sb6);
System.out.println("sb5的哈希值:"+sb5.hashCode());
System.out.println("sb6的哈希值:"+sb6.hashCode());
}
/**
* 测试string作为形式参数传递的问题
* String是引用类型,但是是以一种特殊的引用类型,把Stringz作为形式参数传递的
* 时候,我们把String看做是"基本数据类型"来处理
* @param str1
* @param str2
*/
private static void change(String str1,String str2){
//改变形式参数的值
str1=str2;
str2=str1+str2;
}
/**
* 测试StringBuffer作为形式参数传递的问题
*
*/
private static void change(StringBuffer x,StringBuffer y){
//在方法内,重新定义了两个变量StringBuffer x=sb1;StringBuffer y=sb2;
//改变形式参数的值
x=y;//把y应用的地址值赋值给x,跟sb1没有任何关系,也没有sb1原有对象的值
/*
* 此时,x,y,sb2,三个变量指向了同一块内存空间
* sb1引用没有变,bs1所引用的内容也没有变化
* */
y.append(x);//此时将y应用所指的对象的具体内容改变了.(x,y指向的是同一对象)
/*
* y的引用没哟变,但是y的引用内容变了"susansusan"
* 整个方法执行完成以后,x,y消失.但是sb1,sb2还在
* sb1,sb2,x,y引用类型,作为形式参数传递的实际时地址值
* */
}
}