一、不可变String类型
字符串是计算机程序设计中的,最常见行为,Java的字符串操作最主要的类是String,并且String对象是不可变的(Immutable),即对象一旦创建在内存中,那么它的内容就不再改变。虽然String类中提供很多方法看起来像是可以修改String对象,比如trim()、subString()等等,但是实际上它们并没有改变原来的字符串对象,这些方法传递的只是引用的一个拷贝,所以重新创建了一个String类型的对象,并且有了新的引用。
例如下面一段代码可以说明String的不可变特性:
package date0804.demo2;
public class ImmutableString {
public static void main(String[] args){
String str=new String("xyz");
change(str);
System.out.println(str);
}
public static void change(String s) {
s="xml";
}
}
str=xyz
因此,我么可以看到每当把String对象作为方法的参数时,都会复制一份引用,而该引用所指的对象其实一直待在单一的物理位置上,从未改变过。
另外,String对象还支持+操作符,+操作符可以合并字符串,但是根据相关的研究发现,使用+操作符来连接字符串会使得效率下降,因而,涉及到字符串的更改时,优先使用下面的StringBuilder或StringBuffer,二者都提供了丰富的字符串处理命令。
二、StringBuilder类型
StringBuilder类型是一个可变的字符串类型,StringBuilder类型的API与StringBuffer类型的API基本一致,唯一的区别是StringBuilder的使用假设在单一线程中,换句话说,StringBuilder是线程不安全的。StringBuilder在实例化的时候,通常也会默认设定一个容量大小,一般为字符串参数的长度+16。StringBuilder是继承AbstractStringBuilder这个抽象类的,而这个抽象类的内部使用字符数组来实现的,数组可以进行动态扩展。StringBuilder类提供的常用的方法有append()、insert()、replace()、deleteCharAt()、indexOf()、reverse()、toString()等方法,可以实现字符串的增删改查等基本功能。
package date0812.demo1;
public class Test3 {
public static void main(String[] args) {
StringBuilder stringBuilder = new StringBuilder("Eclipse");
//添加
stringBuilder = stringBuilder.append(" software");
//容量
int C = stringBuilder.capacity();
//翻转
stringBuilder= stringBuilder.reverse();
System.out.println(C);
System.out.println(stringBuilder);
}
}
运行结果:
23
erawtfos espilcE
三、StringBuffer类型
StringBuffer是一个可变的、线程安全的处理字符串的类型。同样,StringBuffer也是继承AbstractStringBuilder抽象类的,因此内部也是使用字符数组来存储字符串的。与StringBuilder的区别是,StringBuffer类型的绝大多数方法的修饰符都加上了关键字synchronized,包括length()、capacity()、trimToSize()、append()、delete()、insert()等等,这一方面表明StringBuffer是线程安全的,可以用于多线程并发的场合,所有对StringBuffer的并发操作都要按照一定的顺序来执行,确保它们都能够正确的执行;另一方面,也表明StringBuffer的开销要比StringBuilder大一点。StringBuffer是要早于StringBuilder开发的,在单一线程中,可以使用StringBuilder来提高运行速度,如果遇到多线程需要同步时,则使用StringBuffer类型。其他的,在API的调用方面,基本上一模一样。