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

戏子无情 提交于 2019-12-30 11:22:04

【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>>

一、不可变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的调用方面,基本上一模一样。


易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!