目录
六:String,StringBuffer,StringBuilder的区别
一:概述
StringBuffer是线程安全的可变字符序列,字符串缓冲区就像一个String ,但可以修改。
在任何时间点,它包含一些特定的字符序列,但可以通过某些方法调用来更改序列的长度和内容。
简单记忆:它就是一个线程安全的可变字符串
是Java.lang包下的不用导包
二:StringBuffer和String的区别?
1、StringBuffer的长度和内容都是可变的,String的都不可变
2、StringBuffer可以提前给出一个缓冲区,可以进行字符串的拼接,而不会重新开辟新的空间
String,每创建新的字符串都会开辟新的空间
3:StringBuffer是线程安全的。
三:StringBuffer的构造方法
StringBuffer() 构造一个没有字符的字符串缓冲区,初始容量为16个字符。重写了toString方法
StringBuffer(int capacity) 构造一个没有字符的字符串缓冲区和指定的初始容量。(有内容时等于没内容时容量加内容长度)
StringBuffer(String str) 构造一个初始化为指定字符串内容的字符串缓冲区。、
package protice4;
public class Test1{
public static void main(String[] args) {
//构造一个没有字符的字符串缓冲区,初始容量为16个字符
StringBuffer stringBuffer = new StringBuffer();
//构造一个没有字符的字符串缓冲区和指定的初始容量
StringBuffer stringBuffer1 = new StringBuffer(20);
//构造一个初始化为指定字符串内容的字符串缓冲区
StringBuffer stringBuffer2 = new StringBuffer("HelloWorld");
//求他们的容量用capacity方法
System.out.println(stringBuffer.capacity());
System.out.println(stringBuffer1.capacity());
System.out.println(stringBuffer2.capacity());
//求他们的长度用length方法
System.out.println(stringBuffer.length());
System.out.println(stringBuffer1.length());
System.out.println(stringBuffer2.length());
}
}
注意:public int capacity() 返回当前容量。
容量是新插入字符可用的存储量,超过此值将进行分配。(如果自定义容量那输出容量就是初始化容量加自定义容量)
public int length() 返回长度(字符数)。
四:StringBuffer类的成员方法
1:添加功能
(1)public StringBuffer append(String str)
可以把任意类型的数据添加到字符串缓冲区中
返回的是当前字符串缓冲区本身
(2)public StringBuffer insert(int offset,String str)
相当于public StringBuffer insert(int index,String str)
在指定的索引上,插入字符串
package protice4;
public class Test {
public static void main(String[] args) {
StringBuffer stringBuffer = new StringBuffer();
StringBuffer s1 = stringBuffer.append("HelloWorld");//添加一个字符串
System.out.println(s1); //输出
StringBuffer s2 = s1.append('!'); //添加一个字符
System.out.println(s2); //输出
StringBuffer s3 = s2.insert(5, ',');//在偏移量(索引)为5的位置插入一个字符
System.out.println(s3); //输出
StringBuffer s4 = s3.insert(6, "java");//在偏移量(索引)为6的位置插入一个字符串
System.out.println(s4); //输出
}
}
注意:append可以添加其他类型的数据。例如:int,float等
insert也可以在指定索引位置插入其他类型数据。
2:删除功能
(1)public StringBuffer deleteCharAt(int index)删除char在这个序列中的指定位置。
返回的内容是本身
(2)public StringBuffer delete(int start,int end)
删除此序列的子字符串中的字符。
子串开始于指定start并延伸到字符索引end - 1 ,
或如果没有这样的字符存在的序列的结束。 如果start等于end ,则不作任何更改
package protice4;
public class Test3 {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("Hello World!");//利用有参构造传入一个字符串
System.out.println(s);//输出s
StringBuffer s1 = s.deleteCharAt(5);//删除索引为5的字符
System.out.println(s1);//输出s1
StringBuffer s3 = s1.delete(5, 10);
System.out.println(s3);//输出
}
}
3:替换功能
(1)public StringBuffer replace(int start,int end,String str)
用指定的String中的字符替换此序列的子字符串中的String 。
子串开始于指定start并延伸到字符索引end - 1 ,
或如果没有这样的字符存在的序列的结束。
第一子串中的字符被去除,然后指定String被插入在start 。 (
如果需要,此序列将被延长以容纳指定的字符串。)
package protice4;
public class Test4 {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("HelloWorld");//利用有参构造创建一个StringBuffer对象
System.out.println(s);//输出
StringBuffer s1 = s.replace(5, 10, "java");//把索引5-9的字符串替换成java
System.out.println(s1);//输出
StringBuffer s3 = s1.replace(5, 7, "world");//把索引5-6的字符串替换成world
System.out.println(s3);//输出
}
}
4:反转功能
public StringBuffer reverse()导致该字符序列被序列的相反代替。
如果序列中包含任何替代对,则将它们视为单个字符进行反向操作。
package protice4;
public class Test5 {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("hello world");//利用有参构造创建一个StringBuffer
System.out.println(s);//输出反转前
StringBuffer s1 = s.reverse();//反转
System.out.println(s1);//输出反转后
}
}
5:截取功能
(1)String substring(int start)
返回一个新的 String ,其中包含此字符序列中当前包含的字符的子序列。
(2)String substring(int start, int end)
返回一个新的 String ,其中包含此序列中当前包含的字符的子序列。
package protice4;
public class Test6 {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("Hello java and spark");//利用有参构造创建一个StringBuffer对象
System.out.println(s);//输出
String s1 = s.substring(5);//截取索引5到最后
System.out.println(s1);//输出
String s2 = s.substring(5, 10);//截取索引5-9
System.out.println(s2);//输出
}
}
五: String和StringBuffer的相互转换
1:String到StringBuffer
String类型不能直接赋值给StringBuffer类型
方式一:通过构造方法转换
方式二:通过StringBuffer的append()方法
2:StringBuffer -- String
方式1:通过调用StringBuffer的toString()方法
方式2:通过String的构造方法,将StringBuffer作为参数传入
方式三:利用StringBuffer的subString()方法
package protice4;
public class Test7 {
public static void main(String[] args) {
//StringBuffer -- String
//1:通过StringBuffer 的substring方法
StringBuffer s = new StringBuffer("hello");
String s1 = s.substring(0);
System.out.println(s1);
System.out.println("========================");
//2:通过toString方法
String s2 = s.toString();
System.out.println(s2);
System.out.println("=========================");
//3:通过String的有参构造将StringBuffer 当作参数传入
String s3= new String(s);
System.out.println(s3);
System.out.println("==========================");
//String到StringBuffer
//1:通过StringBuffer有参构造将String当作参数传入
StringBuffer s4= new StringBuffer("你好");
System.out.println(s4);
System.out.println("==========================");
//2:通过StringBuffer的append方法
String s5="世界";
s4.append(s5);
System.out.println(s5);
}
}
六:String,StringBuffer,StringBuilder的区别
1、String的内容不可变,而StringBuffer和StringBuilder的内容是可变的
2、StringBuffer是同步线程安全的,数据安全,效率低
StringBuilder是不同步的,线程不安全,数据不安全,效率高
七:StringBuffer和数组的区别
它们两个都可以被看作是一个容器,装一些数据
但是呢,StringBuffer里面的数据都是字符串数据
数组可以存放不同数据类型的数据,但是同一个数组只允许存放同一类型的数据
八:注意
String作为参数传递
传递的是值,对外面本身变量的值没有任何影响。
StringBuffer作为参数传递
只有当谁有操作的时候,那个StringBuffer才会变化