Java平台提供了两种字符串类型:String和StringBuffer、StringBuilder用来操作字符串。其中String为字符串常量,StringBuffer、StringBuilder均为字符串变量。
1.String类
String类的对象为字符串常量,而字符串常量String对象创建后是不可以更改的,举个例子说明一下:
public static void main(String[] args){
String str = "cs";
str = str + "dn";
System.out.println(str);
}
结果:
csdn
首先第一行创建一个对象,并且把"cs"赋值给str,然后在第二行,虚拟机新建一个对象str并把之前str的值和"dn"加起来再赋值给新str,将原来的str删除,所以说String对象创建之后是不可以更改的。
2.StringBuffer类
StringBuffer是线程安全的可变字符序列,且实体容量会随着存放的字符串增加而自动增加。
创建一个新的StringBuffer对象必须使用new方法,不能像String对象一样直接引用字符串常量。
StringBuffer str1 = new StringBuffer(); //创建一个对象,无初始值
StringBuffer str2 = new StringBuffer("abc"); //创建一个对象,初始值为abc
StringBuffer str3 = new StringBuffer(32); //创建一个对象,初始容量为32个字符
StringBuffer创建的对象可以以下方法来更改,append,setCharAt,insert,reverse,delete,replace等方法来更改。下面看一个例子:
public static void main(String[] args){
StringBuffer str = new StringBuffer("123456");
str.append("789"); //追加字符串
System.out.println(str);
str.setCharAt(8,'H'); //将第8个字符改为字符H
System.out.println(str);
str.insert(6,"hh"); //在第六个字符后面插入字符串hh
System.out.println(str);
str.delete(6,8); //删除第六到第八之间的字符串
System.out.println(str);
str.reverse(); //字符串反序
System.out.println(str);
str.replace(8,9,"hbnb"); //字符串内容替换
System.out.println(str);
}
结果:
123456789
12345678H
123456hh78H
12345678H
H87654321
H8765432hbnb
3.StringBuilder类
StringBuilder与StringBuffer类具有兼容的API,两者使用的方法也相同。创建对象的方法以及改值方法使用方式都相同。
与StringBuffer的不同之处在于StringBuilder不保证线程的同步,属于线程不安全。
4. 三者之间的联系
String和StringBuffer、StringBuilder之间可以互相转换。
例如:
String str = "abc"
StringBuffer str1 = new StringBuffer(str); //String转为StringBuffer
StringBuilder str2 = new StringBuilder(str); //String转为StringBuilder
str = str1.toString(); //StringBuffer转为String
str = str2.toString(); //StringBuilder转为String
5. 三者之间的不同
String只能赋值一次,每一次改变内容都会重新在堆中创建新的对象,原有的对象会引用新的对象,而每一次在内存中创建新的对象会对系统性能产生影响,降低JVM的效率。
而StringBuffer及StringBuilder与String类不同,每次操作改变都是对自身对象进行操作,不会生成新的对象,其所占空间会随着内容的增加而自动扩充,在做大量的修改操作时,不会因为生成大量匿名对象而影响系统性能。
总结一下:
1)操作少,数据少的场景一般用String
2)单线程,操作多,数据多,用StringBuilder
3)多线程,操作多,数据多,用StringBuffer
public static void main(String[] args){
StringBuffer str = new StringBuffer("星城长沙");
System.out.println(str);
str.delete(0,2);
System.out.println(str.toString());
str.append("欢迎您");
System.out.println(str.toString());
str.replace(2,5,"等你来");
System.out.println(str.toString());
}
结果:
星城长沙
长沙
长沙欢迎您
长沙等你来