文章目录
StringBuffer
1,StringBuffer类的概述,构造方法
StringBuffer类概述
我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。
而StringBuffer就可以解决这个问题
StringBuffer 线程安全的可变字符序列
StringBuffer的构造方法:
public StringBuffer(): 无参构造方法 初始容量为 16 个字符
public StringBuffer(int capacity): 指定容量的字符串缓冲区对象
public StringBuffer(String str): 指定字符串内容的字符串缓冲区对象
StringBuffer的方法:
public int capacity():返回当前容量。 理论值
public int length():返回长度(字符数)。 实际值
案例:构造方法和长度方法的使用
public class Test {
public static void main(String[] args) {
// 我们如果对字符串进行拼接操作,每次拼接,都会构建一个新的String对象,既耗时,又浪费空间。
//如果我们要进行拼串的操作,推荐使用StringBuffer
// StringBuffer 长度可变的字符序列,可以看作一个容器,不断地可以往里添加数据
//StringBuffer类的无参构造方法
//构造一个其中不带字符的字符串缓冲区,初始容量为 16 个字符。
StringBuffer stringBuffer = new StringBuffer();
//获取容量
int c=stringBuffer.capacity();
System.out.println(c);//16
//获取长度
int l=stringBuffer.length();
System.out.println(l);//0
//水杯:额定容量 500ML 空杯子 capacity()
//往水杯中装水 实际装了100ML length()
//往字符串缓冲区中添加内容 如果超过了默认的容量,会自动扩充
}
}
2,StringBuffer的功能
StringBuffer的添加功能-----
public StringBuffer append(String str): 可以把任意类型数据添加到字符串缓冲区里面,并返回字符串缓冲区本身
public StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入到字符串缓冲区里面,并返回字符串缓冲区本身
StringBuffer的删除功能--------
public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身
StringBuffer的替换功能---------
public StringBuffer replace(int start,int end,String str): 从start开始到end用str替换
StringBuffer的反转功能------
public StringBuffer reverse() 反转字符串
StringBuffer的查找功能--------
int indexOf (String str)
从头查找该字符串,在容器中第一次出现的索引,如果找不到就返回-1
int indexOf (String str,int fromIndex)
从指定索引处开始查找该字符串第一次出现的索引,如果找不到就返回-1
从后往前找
int lastIndexOf
StringBuffer的截取功能-------
public String substring(int start): 从指定位置截取到末尾
public String substring(int start,int end): 截取从指定位置开始到结束位置,包括开始位置,不包括结束位置
注意事项
注意:返回值类型不再是StringBuffer本身,截取后不影响容器本身
案例:StringBuffer功能的使用
public class Test2 {
public static void main(String[] args) {
//StringBuffer的添加功能
//public StringBuffer append(String str) 可以把任何类型的数据添加到字符串缓冲区里,并返回字符串缓冲区本身
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(3).append(3.5).append("hao").append('c');
System.out.println(stringBuffer.toString());
//public StringBuffer insert(int offset,String str) 在指定位置把任意类型的数据插入到字符串缓冲区里面
StringBuffer stringBuffer1 = new StringBuffer("肉蛋葱鸡");
stringBuffer1.insert(1,"好");//在指定索引的前面插入
System.out.println(stringBuffer1.toString());
//StringBuffer的删除功能
//public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身
stringBuffer1.deleteCharAt(1);
System.out.println(stringBuffer1);//肉蛋葱鸡
//public StringBuffer delete(int start,int end):删除从指定位置开始指定位置结束的内容,并返回本身
//含头不含尾
stringBuffer1.delete(1,3);//肉鸡
System.out.println(stringBuffer1.toString());
//StringBuffer的替换和反转功能
//public StringBuffer replace(int start,int end,String str) 根据起始索引和终止索引,替换一段内容
//含头不含尾
StringBuffer stringBuffer2 = new StringBuffer("aaabbbccc");
stringBuffer2.replace(0,6,"eee");
System.out.println(stringBuffer2);
//public StringBuffer reverse() 反转字符串缓冲区中的元素
stringBuffer2.reverse();
System.out.println(stringBuffer2);
//StringBuffer的截取功能
//public String substring(int start) 从指定位置开始截取到末尾,返回的是截取到的字符串
StringBuffer stringBuffer3 = new StringBuffer("AAABBBCCC");
String s=stringBuffer3.substring(1);
System.out.println(s);
//public String substring(int start,int end): 截取从指定位置开始到结束位置
String s1=stringBuffer3.substring(1,3);
System.out.println(s1);
//StringBuffer的查找功能
//int indexOf (String str) 从头查找该字符串,在容器中第一次出现的索引,如果找不到就返回-1
// int indexOf (String str,int fromIndex) 从指定索引处开始查找该字符串第一次出现的索引,如果找不到就返回-1
//int lastIndexOf 从后往前查找
StringBuffer stringBuffer4 = new StringBuffer("123456");
int n=stringBuffer4.indexOf("2");
System.out.println(n);
int n1=stringBuffer4.indexOf("4",2);
System.out.println(n1);
}
}
3,StringBuffer和String的相互转换
String -- StringBuffer
a:通过构造方法
b:通过append()方法
StringBuffer -- String
a: 使用substring方法
b:通过构造方法
c:通过toString()方法
案例:StringBuffer和String的相互转换
public class Test {
public static void main(String[] args) {
//StringBuffer类型和String类型的相互转换
StringBuffer stringBuffer = new StringBuffer("abcde");
// StringBuffer------>String
//方式一 toString()方法
String s=stringBuffer.toString();
System.out.println(s);
//方式二 substring方法
String s1=stringBuffer.substring(0);
System.out.println(s1);
//方式三 可以采用String类中的构造方法 String(StringBuffer buffer)
String ss=new String(stringBuffer);
System.out.println(ss);
//Stirng----->StringBuffer
//方式1:StringBuffer的构造方法
String r="abc";
StringBuffer stringBuffer1 = new StringBuffer(r);
//方式二 append() insert()方法
StringBuffer buffer = new StringBuffer();
buffer.append(r);
buffer.insert(2,r);
}
}
4,StringBuffer和StringBuilder的区别
StringBuilder的概述
通过查看API了解一下StringBuilder类
面试题
String,StringBuffer,StringBuilder的区别
//他们两个的API是相同的。
//区别是:线程安全方面的区别
//StringBuffer是线程安全的,效率低
//StringBuilder 线程不安全的,效率高。多线程环境下,可能会存在线程安全问题
StringBuilder 一个可变的字符序列。此类提供一个与 StringBuffer 兼容的 API,
但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,
用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,
建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。
5,String和StringBuffer分别作为参数传递
形式参数问题
String作为参数传递 String虽然是引用类型,但是它是一个常量,所以在做传递的时候,完全可以将其看成基本数据类型数据进行传递,String类型属于值传递
StringBuffer作为参数传递 形参的改变会影响实参;