StringBuffer类,StringBuffer类和String的区别、String,StringBuffer,StringBuilder之间的区别
1、概述
StringBuffer是一个线程安全的可变序列。
2、StringBuffer与String区别
(1)StringBuffer的长度和内容都可以发生改变,String却不行
(2)String每创建一个新的字符串都会开辟一个新的常量池区域而StringBuffer会提前给出容量,可以进行字符串的拼接,而不会重新开辟空间
3、构造方法
(1)public StringBuffer() :构造一个没有字符的字符串缓冲区,初始容量为16个字符。
public int capacity() :返回当前容量,字符串长度为实际值,容量是新开辟的空间的长度,是理论值。
StringBuffer sb1 = new StringBuffer();
System.out.println("当前StringBuffer的容量为:" + sb1.capacity());//容量为16
(2)public StringBuffer(int capacity) : 构造一个没有字符的字符串缓冲区和指定的初始容量,可以指定容量
(3)public StringBuffer(String str) :构造一个初始化为指定字符串内容的字符串缓冲区。
StringBuffer sb2 = new StringBuffer("hello");
System.out.println("当前StringBuffer的容量为:" + sb3.capacity());//容量为默认容量16+字符串长度,16+5=21.
4、添加功能的方法
(1)public StringBuffer append(String str):无论什么数据类型都能通过此方法加到字符串里面。
StringBuffer s = new StringBuffer();
StringBuffer s2 = sb.append("hello");
s.append("hello");//返回的是增加过后的s。
System.out.println(sb == stringBuffer);//true,地址相同,增加后地址没有改变,s和s2都指向改地址。
sb.append(10).append('a').append(true).append(12.34);//链式编程增加。
(2)public StringBuffer insert(int index,String str):在指定位置index处,插入字符串str。
sb.insert(5, "null");//在字符串sb位置5处插入null字符串,其余字符串后移,插入后值返回sb中。
5、StringBuffer的删除功能
(1)public StringBuffer deleteCharAt(int index) :删除指定索引处的字符。该序列缩短了一个字符
(2)public StringBuffer delete(int start,int end):删除此序列的子字符串中的字符,子字符串开始于指定start并延伸到字符索引end - 1,start超出了总字符的长度,会报错,end超出没事。 如果start=end ,则不作任何更改
6、StringBuffer替换功能
(1)public StringBuffer replace(int start,int end,String str):从start开始到end-1的字符串被str替换。
StringBuffer sb = new StringBuffer("helloworld");
sb.replace(2,7,"DDDDD");//heDDDDDrld
7、StringBuffer的反转功能
(1)public StringBuffer reverse():导致该字符序列被序列的相反代替,操作的是同一个StringBuffer对象
StringBuffer sb = new StringBuffer();sb.append("我爱你中国");sb.reverse();System.out.println(sb);//国中你爱我
8、StringBuffer的截取功能
(1)public String substring(int start) :返回一个新的String ,其中包含此字符序列中当前包含的字符的子序列。
(2)public String substring(int start,int end) :返回一个新的String ,其中包含此序列中当前包含的字符的子序列。 子串起始于指定的start ,并扩展到索引号为end - 1 。
StringBuffer sb = new StringBuffer();
sb.append("javaljdfkljsflsld");
String s1 = sb.substring(4); //返回值是一个String类型的数据
System.out.println("截取的内容是:"+s1); //ljdfkljsflsld
System.out.println("StringBuffer的内容为:"+sb);//不会改变原来StringBuffer中的数据String s2 = sb.substring(9, 13);
System.out.println("截取的内容是:"+s2); //ljsf
System.out.println("StringBuffer的内容为:"+sb);//不会改变原来StringBuffer中的数据
9、String和StringBuffer的相互转化
//String --> StringBufferString s = "hello"; //方式1:通过构造方法转换StringBuffer sb1 = new StringBuffer(s);System.out.println(s);System.out.println(sb1);//方式2:通过append()StringBuffer sb2 = new StringBuffer();sb2.append(s);System.out.println(s);System.out.println(sb2);System.out.println("==============================================");
//StringBuffer --> StringStringBuffer sb3 = new StringBuffer("bigdata");//方式1:toString()方法String s1 = sb3.toString();System.out.println(sb3);System.out.println(s1);//方式2:subStringString s2 = sb3.substring(0);System.out.println(s2);System.out.println(sb3);//方式3:String类的构造方法//String(StringBuffer buffer)//分配一个新的字符串,其中包含当前包含在字符串缓冲区参数中的字符序列。String s3 = new String(sb3);System.out.println(s3);System.out.println(sb3);
10、String,StringBuffer,StringBuilder之间的区别
(1)StringBuffer是线程同步安全的,数据安全,效率低。StringBuilder不是线程同步安全的,数据不安全,效率高。
(2)String的内容是不可改变的,StringBuffer和StringBuilder是可变序列。
(3)StringBuffer中方法上有synchronized关键字。
11、StringBuffer和数组的区别?
它们都可以被看作是一个容器,装一些数据。但是,StringBuffer里面的数据都是一个一个字符
数组可以存放不同数据类型的数据,但是同一个数组只能存放同一种数据类型的数据。
12、案例说明
探究String作为参数传递与StringBuffer作为参数传递的区别。
public class StringBufferDemo8 {public static void main(String[] args) {String s1 = "hello";String s2 = "world";System.out.println("s1: " + s1 + ",s2: " + s2);//s1: hello,s2: worldchange(s1, s2); //s1: world,s2: worldworldSystem.out.println("s1: " + s1 + ",s2: " + s2);//s1: hello,s2: world;System.out.println("========================================");StringBuffer sb1 = new StringBuffer("hello");StringBuffer sb2 = new StringBuffer("world");System.out.println("sb1: " + sb1 + ",sb2: " + sb2); // hello worldchange(sb1, sb2); System.out.println("sb1: " + sb1 + ",sb2: " + sb2); // sb1: hello,sb2: worldworld。}public static void change(StringBuffer sb1, StringBuffer sb2) {sb1 = sb2;sb2.append(sb1);System.out.println("sb1: " + sb1 + ",sb2: " + sb2); //sb1: worldworld,sb2: worldworld}public static void change(String s1, String s2) {s1 = s2;//s2的地址给了s1s2 = s1 + s2; //变量相加,直接开辟新空间System.out.println("s1: " + s1 + ",s2: " + s2);//s1: world,s2: worldworld}
}
运行方法时,在栈中开辟了一块空间,第一句sb1的地址指向了sb2 的地址,第二句在常量池中开辟了一个新地址返回给了堆中的0x002,方法中sb1和sb2都指向改0x002,调用输出语句,方法结束后,输出语句调用的是main中地址,sb1地址指向的值没变,而sb2变了。
StringBuffer类,StringBuffer类和String的区别、String,StringBuffer,StringBuilder之间的区别
1、概述
StringBuffer是一个线程安全的可变序列。
2、StringBuffer与String区别
(1)StringBuffer的长度和内容都可以发生改变,String却不行
(2)String每创建一个新的字符串都会开辟一个新的常量池区域而StringBuffer会提前给出容量,可以进行字符串的拼接,而不会重新开辟空间
3、构造方法
(1)public StringBuffer() :构造一个没有字符的字符串缓冲区,初始容量为16个字符。
public int capacity() :返回当前容量,字符串长度为实际值,容量是新开辟的空间的长度,是理论值。
StringBuffer sb1 = new StringBuffer();
System.out.println("当前StringBuffer的容量为:" + sb1.capacity());//容量为16
(2)public StringBuffer(int capacity) : 构造一个没有字符的字符串缓冲区和指定的初始容量,可以指定容量
(3)public StringBuffer(String str) :构造一个初始化为指定字符串内容的字符串缓冲区。
StringBuffer sb2 = new StringBuffer("hello");
System.out.println("当前StringBuffer的容量为:" + sb3.capacity());//容量为默认容量16+字符串长度,16+5=21.
4、添加功能的方法
(1)public StringBuffer append(String str):无论什么数据类型都能通过此方法加到字符串里面。
StringBuffer s = new StringBuffer();
StringBuffer s2 = sb.append("hello");
s.append("hello");//返回的是增加过后的s。
System.out.println(sb == stringBuffer);//true,地址相同,增加后地址没有改变,s和s2都指向改地址。
sb.append(10).append('a').append(true).append(12.34);//链式编程增加。
(2)public StringBuffer insert(int index,String str):在指定位置index处,插入字符串str。
sb.insert(5, "null");//在字符串sb位置5处插入null字符串,其余字符串后移,插入后值返回sb中。
5、StringBuffer的删除功能
(1)public StringBuffer deleteCharAt(int index) :删除指定索引处的字符。该序列缩短了一个字符
(2)public StringBuffer delete(int start,int end):删除此序列的子字符串中的字符,子字符串开始于指定start并延伸到字符索引end - 1,start超出了总字符的长度,会报错,end超出没事。 如果start=end ,则不作任何更改
6、StringBuffer替换功能
(1)public StringBuffer replace(int start,int end,String str):从start开始到end-1的字符串被str替换。
StringBuffer sb = new StringBuffer("helloworld");
sb.replace(2,7,"DDDDD");//heDDDDDrld
7、StringBuffer的反转功能
(1)public StringBuffer reverse():导致该字符序列被序列的相反代替,操作的是同一个StringBuffer对象
StringBuffer sb = new StringBuffer();sb.append("我爱你中国");sb.reverse();System.out.println(sb);//国中你爱我
8、StringBuffer的截取功能
(1)public String substring(int start) :返回一个新的String ,其中包含此字符序列中当前包含的字符的子序列。
(2)public String substring(int start,int end) :返回一个新的String ,其中包含此序列中当前包含的字符的子序列。 子串起始于指定的start ,并扩展到索引号为end - 1 。
StringBuffer sb = new StringBuffer();
sb.append("javaljdfkljsflsld");
String s1 = sb.substring(4); //返回值是一个String类型的数据
System.out.println("截取的内容是:"+s1); //ljdfkljsflsld
System.out.println("StringBuffer的内容为:"+sb);//不会改变原来StringBuffer中的数据String s2 = sb.substring(9, 13);
System.out.println("截取的内容是:"+s2); //ljsf
System.out.println("StringBuffer的内容为:"+sb);//不会改变原来StringBuffer中的数据
9、String和StringBuffer的相互转化
//String --> StringBufferString s = "hello"; //方式1:通过构造方法转换StringBuffer sb1 = new StringBuffer(s);System.out.println(s);System.out.println(sb1);//方式2:通过append()StringBuffer sb2 = new StringBuffer();sb2.append(s);System.out.println(s);System.out.println(sb2);System.out.println("==============================================");
//StringBuffer --> StringStringBuffer sb3 = new StringBuffer("bigdata");//方式1:toString()方法String s1 = sb3.toString();System.out.println(sb3);System.out.println(s1);//方式2:subStringString s2 = sb3.substring(0);System.out.println(s2);System.out.println(sb3);//方式3:String类的构造方法//String(StringBuffer buffer)//分配一个新的字符串,其中包含当前包含在字符串缓冲区参数中的字符序列。String s3 = new String(sb3);System.out.println(s3);System.out.println(sb3);
10、String,StringBuffer,StringBuilder之间的区别
(1)StringBuffer是线程同步安全的,数据安全,效率低。StringBuilder不是线程同步安全的,数据不安全,效率高。
(2)String的内容是不可改变的,StringBuffer和StringBuilder是可变序列。
(3)StringBuffer中方法上有synchronized关键字。
11、StringBuffer和数组的区别?
它们都可以被看作是一个容器,装一些数据。但是,StringBuffer里面的数据都是一个一个字符
数组可以存放不同数据类型的数据,但是同一个数组只能存放同一种数据类型的数据。
12、案例说明
探究String作为参数传递与StringBuffer作为参数传递的区别。
public class StringBufferDemo8 {public static void main(String[] args) {String s1 = "hello";String s2 = "world";System.out.println("s1: " + s1 + ",s2: " + s2);//s1: hello,s2: worldchange(s1, s2); //s1: world,s2: worldworldSystem.out.println("s1: " + s1 + ",s2: " + s2);//s1: hello,s2: world;System.out.println("========================================");StringBuffer sb1 = new StringBuffer("hello");StringBuffer sb2 = new StringBuffer("world");System.out.println("sb1: " + sb1 + ",sb2: " + sb2); // hello worldchange(sb1, sb2); System.out.println("sb1: " + sb1 + ",sb2: " + sb2); // sb1: hello,sb2: worldworld。}public static void change(StringBuffer sb1, StringBuffer sb2) {sb1 = sb2;sb2.append(sb1);System.out.println("sb1: " + sb1 + ",sb2: " + sb2); //sb1: worldworld,sb2: worldworld}public static void change(String s1, String s2) {s1 = s2;//s2的地址给了s1s2 = s1 + s2; //变量相加,直接开辟新空间System.out.println("s1: " + s1 + ",s2: " + s2);//s1: world,s2: worldworld}
}
运行方法时,在栈中开辟了一块空间,第一句sb1的地址指向了sb2 的地址,第二句在常量池中开辟了一个新地址返回给了堆中的0x002,方法中sb1和sb2都指向改0x002,调用输出语句,方法结束后,输出语句调用的是main中地址,sb1地址指向的值没变,而sb2变了。