StringBuffer / StringBuilder
为了解决的问题:String是不可变的造成的内存浪费和String对象的使用效率比较低这两个问题
StringBuffer:线程安全的可变字符序列,通过某些方法调用可以改变该序列的长度和内容。
StringBuilder:不是线程安全的可变字符序列,通过某些方法调用可以改变该序列的长度和内容。此类提供一个与 StringBuffer 兼容的 API该类被设计用作 StringBuffer 的一个简易替换
线程安全/线程不安全
当两个线程共享一份数据的时候,为了保证数据的一致性,独占性;往往会在一个线程操作这份数据的时候,为当前数据加锁
常用方法
给字符串序列添加内容
主要使用 append 和 insert 方法:
(1)public StringBuilder append(String str):有其他重载,可把任意类型数据(有其他重载)添加进对象,并且也返回对象本身。
(2)public StringBuilder insert(int offset,String str):在指定位置把任意类型的数据(有其他重载)插入,并返回对象本身。
因此,可以链式编程:
sb.append(“hello”).append(true).append(12).append(34.56);
其他方法
(1)public StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回本身。
(2)public StringBuffer delete(int start, int end):从指定位置开始删除内容,到指定位置结束,并返回本身。注意Java中一般含左不含右。
清空对象的内容可用:sb.delete(0, sb.length());
(3)public StringBuffer replace(int start,int end,String str):从start开始到end用str替换
(4)StringBuffer的截取功能:注意返回值类型变为String了:
public String substring(int start)
public String substring(int start,int end)
(5)反转功能:public StringBuffer reverse(),就是将原有内容倒序再返回。
public class StringBufferDemo{
public static void main(String[] args){
//创建一个StringBuffer对象
StringBuffer sb = new StringBuffer();//创建了一个空的字符序列缓冲区,初始容量为16个字符
/*sb.append("hello");
sb.append(1);
sb.append(false);
sb.append(2.4);
char[] charArr = {'a' ,'b' , 'c'};
sb.append(charArr);
sb.append(charArr,1,2);*/
/*
像StringBuffer这样的方法,因为这些方法的返回值依然是本类的对象,
所以可以在方法执行结束之后,依然采用.的形式去调用该类的其他方法。
那么这种编程形式,就称为链式编程
*/
sb.append("hello").append(true).append(2.4).append(1);
String str = sb.toString();//将StringBuffer对象转换为String对象
System.out.println(str);
sb.insert(5,"world").insert(10,"java");
System.out.println(sb.toString());
sb.delete(5,9);
System.out.println(sb.toString());
sb.deleteCharAt(5);
System.out.println(sb.toString());
sb.replace(0,5,"world");
System.out.println(sb.toString());
System.out.println("----------------------------");
/*
有这样一个字符串:abcdefgh,将该字符串逆序输出
*/
String str1 = "abcdefgh";
char[] strChar = str1.toCharArray(); //char里的方法
char[] newStrChar = new char[strChar.length];
for(int i = strChar.length -1 ,j = 0 ; i > -1 && j < newStrChar.length ; i--,j++){
newStrChar[j] = strChar[i] ;
}
String newStr = new String(newStrChar);
System.out.println(newStr);
System.out.println("----------------------------");
StringBuffer sb2 = new StringBuffer("abcdefgh");
System.out.println(sb2.reverse());
}
}
StringBuffer和StringBuilder的区别:
1、StringBuffer是线程安全的,效率低
StringBuilder是线程不安全的,效率高
2、StringBuffer和StringBuilder使用场景:
如果多个线程同时访问一份数据,并且要保证数据的安全性和一致性,就是需要使用StringBuffer
如果数据是线程独享的,或者是在共享的时候,对数据的安全性和一致性没有严格要求,就可以使用StringBuilder
String和StringBuffer/StringBuilder的区别和联系:
联系:都是字符序列的字符串表示形式
区别:String 是不可变的(空间浪费,资源利用率低)
StringBuffer/StringBuilder 是可变的字符序列,可以通过方法改变字符序列的长度和内容