Java字符串的String、StringBuilder、StringBuffer三者特性详解

1、不可变String类型

字符串是计算机程序设计中的,最多见行为,Java的字符串操做最主要的类是String,而且String对象是不可变的(Immutable),即对象一旦建立在内存中,那么它的内容就再也不改变。虽然String类中提供不少方法看起来像是能够修改String对象,好比trim()、subString()等等,可是实际上它们并无改变原来的字符串对象,这些方法传递的只是引用的一个拷贝,因此从新建立了一个String类型的对象,而且有了新的引用。 java

例以下面一段代码能够说明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,两者都提供了丰富的字符串处理命令。 并发

2、StringBuilder类型

StringBuilder类型是一个可变的字符串类型,StringBuilder类型的API与StringBuffer类型的API基本一致,惟一的区别是StringBuilder的使用假设在单一线程中,换句话说,StringBuilder是线程不安全的。StringBuilder在实例化的时候,一般也会默认设定一个容量大小,通常为字符串参数的长度+16。StringBuilder是继承AbstractStringBuilder这个抽象类的,而这个抽象类的内部使用字符数组来实现的,数组能够进行动态扩展。StringBuilder类提供的经常使用的方法有append()、insert()、replace()、deleteCharAt()、indexOf()、reverse()、toString()等方法,能够实现字符串的增删改查等基本功能。 app


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



3、StringBuffer类型

StringBuffer是一个可变的、线程安全的处理字符串的类型。一样,StringBuffer也是继承AbstractStringBuilder抽象类的,所以内部也是使用字符数组来存储字符串的。与StringBuilder的区别是,StringBuffer类型的绝大多数方法的修饰符都加上了关键字synchronized,包括length()、capacity()、trimToSize()、append()、delete()、insert()等等,这一方面代表StringBuffer是线程安全的,能够用于多线程并发的场合,全部对StringBuffer的并发操做都要按照必定的顺序来执行,确保它们都可以正确的执行;另外一方面,也代表StringBuffer的开销要比StringBuilder大一点。StringBuffer是要早于StringBuilder开发的,在单一线程中,可使用StringBuilder来提升运行速度,若是遇到多线程须要同步时,则使用StringBuffer类型。其余的,在API的调用方面,基本上如出一辙。 ui

相关文章
相关标签/搜索