1.String
String是引用数据类型,在java.lang 包中提供了 String 类,该类中使用final关键字修饰用来保存字符串内容的(char或byte)数组,所以String是不可变的。
JDK8采用char数组:private final char value[ ]
JDK9采用byte数组: private final byte[ ] value
适用情景:适用于少量的字符串操作的情况
这就导致每次对String的修改都会生成新的String对象,不仅效率低下,而且浪费大量优先的内存空间。性能和内存开销都比较大。
但StringBuffer和StringBuilder就弥补了不足。StringBuffer 和 StringBuilder 类的对象能够被多次的修改,并且不产生新的未使用对象。
2.StringBuffer和StringBuilder
StringBuffer和StringBuilder都继承自AbstractStringBuilder父类,在AbstractStringBuilder中使用char[ ] value字符数组保存字符串,但是没有用final关键字修饰,所以StringBuffer 和 StringBuilder 都是可变的。
StringBuffer 和 StringBuilder 的操作是直接改变字符串对象本身,而不是生成新的字符串,所以性能开销比较小。
相同情况下,使用StringBuilder相比使用StringBuffer能获得10%-15%左右的性能提升,但需要承担多线程不安全的风险。
1>StringBuffer
StringBuffer在JDK1.0的时候已经存在,并且对操作方法加了synchronized同步锁,所以是线程安全的,但开销比较大,性能较低。
适用情景:多线程频繁修改字符串
StringBuffer sb = new StringBuffer("AA");
sb.append("BB"); //追加
sb.append("CC");
sb.append("DD");
System.out.println(sb);
2>StringBuilder
StringBuffer在JDK1.5的时候才有,没有对方法加同步锁,所以是线程不安全的,但开销比较小,性能较高。
适用情景:单线程频繁修改字符串
StringBuilder sbd = new StringBuilder("AA");
sbd.append("BB"); //追加
sbd.append("CC"); //追加
sbd.append("DD"); //追加
System.out.println(sbd);
3.StringBuilder和StringBuffer的方法
StringBuilder和StringBuffer的方法基本相同,在此以StringBuilder为例。
append()
功能:在一个字符串后面追加字符串
传入:追加的字符串str2
返回:追加后的字符串
//创建StringBuilder类对象sbd
StringBuilder sbd = new StringBuilder("ABC");
// 追加
sbd.append("just");
System.out.println(sbd);
insert( )
功能:对字符串进行插入操作
传入:
参数1:插入位置下标
参数2:插入字符串
返回:插入后的字符串
sbd.insert(0, "sos"); //插入位置为0,相当于添加至字符串的头部
sbd.insert(6, "H"); //插入位置为6
System.out.println(sbd);
deleteCharAt( )
功能:删除字符串指定位置字符
传入:删除的位置下标
返回:删除后的字符串
sbd.deleteCharAt(6); //删除下标位置为6的字符
System.out.println(sbd);
delete( )
功能:删除字符串某个区间字符
传入:开始位置和结束位置下标
返回:删除后的字符串
sbd.delete(0, 3); //删除0-3之间的所有字符
sbd.delete(3, 7); //删除3-7之间的所有字符
System.out.println(sbd);
toString( )
功能:将StringBuilder类型转换为String类型
传入:无
返回:String字符串
String str = sbd.toString();
System.out.println(str);
如有不足,请不吝指教。