string 和bufferstring运用时原理区别

String类用来表示那些创建后就不会再改变的字符串,它是immutable的。
StringBuffer类用来表示内容可变的字符串,并提供了修改底层字符串的方法。
当我们进行字符拼接时,请使用StringBuffer类而非String类,因为前者将比后者快上百倍。
的确,在程序的太多场合我们都会进行字符串拼接工作,简单的代码示例如下:
String str="You are nice.";
str+="I love you so much.";
如果用StringBuffer类的话,代码如下:
StringBuffer str= new StringBuffer("You are nice.");
str.append("I love you so much.");
从表面看来String类只用一个加号(+)便完成了字符串的拼接,而StringBuffer类却要调用一个append()方法,是否实现起来更简洁,更单纯呢?其实不然,让我们了解一下程序运行内部发生了哪些事情:
经编译后程序的bytecode(字节码)展示出了实质: 在用String类对象直接拼接时,JVM会创建一个临时的StringBuffer类对象,并调用其append()方法完成字符串的拼接,这是因为 String类是不可变的,拼接操作不得不使用StringBuffer类(并且--JVM会将"You are nice."和"I love you so much."创建为两个新的String对象)。之后,再将这个临时StringBuffer对象转型为一个String,代价不菲!可见,在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String--它当然不是最初的str了搜索,这个引用的名称没变,但它指向了新的String对象。
而如果直接使用StringBuffer类,程序将只产生两个对象:最初的StringBuffer和拼接时的String("I love you so much."),也不再需要创建临时的StringBuffer类对象而后还得将其转换回String对象。
可以想象,当我们的字符串要被循环拼接若干段时,用String类直接操作会带来多少额外的系统开销,生成多少无用的临时StringBuffer对象,并处理多少次无谓的强制类型转换哪。
StringStringBufferStringBuilder都是用来处理字符串的类,它们具有相似的功能,但在性能和线程安全性方面有所不同。 1. String: - 不可变性:String对象是不可变的,一旦创建就不能被修改。每次对String进行修改,实际上是创建了一个新的String对象。这意味着每次对String进行修改都会产生额外的内存开销。 - 线程安全:String是线程安全的,因为它的值在创建后不能被改变。 2. StringBuffer: - 可变性:StringBuffer对象是可变的,可以通过方法调用来修改其内容。这样就避免了每次修改创建新的对象,提高了性能。 - 线程安全:StringBuffer是线程安全的,它的方法在内部使用了synchronized关键字来保证多线程环境下的安全性。但由于其同步机制会带来性能上的开销,因此在单线程环境下,建议使用StringBuilder而不是StringBuffer。 3. StringBuilder: - 可变性:StringBuilder对象也是可变的,类似于StringBuffer,可以通过方法调用来修改其内容。 - 非线程安全:StringBuilder没有采用同步机制,所以在多线程环境下使用StringBuilder可能会出现问题。但在单线程环境下,它比StringBuffer性能更好。 综上所述,如果在多线程环境下需要进行字符串的修改和拼接操作,应该使用StringBuffer;而在单线程环境下,建议使用StringBuilder以获得更好的性能。如果不需要修改字符串的内容,只是进行字符串的操作和处理,可以使用String类。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值