String StringBuffer StringBuilder

public final class String{}

String s1 = "abc";

String是不可变的
StringBuffer是可变的且是线程安全的
StringBuilder是可变的且是非线程安全的 

在大部分情况下字符串的拼接速度为:
    StringBuilder>StringBuffer>String 

解释如下: 
因为String是不可变的(其属性大都为final类型),因此每次对其操作改变其变量值,其实是生成一个新的字符串,然后将变量引用指向新字符串对象;因此速度慢。
 
StringBuffer则不同,对其操作即直接操作对象指向的内容,无需产生新对象,速度快,但它是线程安全的,在维护多线程的同步等也会消耗一点性能。 

StringBuilder是jdk5之后新增的,其用法与StringBuffer完全一致,但它是线程不安全的,在单线程中最佳,因为其不需要维护线程的安全,因此是最快的。
 
举例1:
String a = "a";  //假设a指向地址0x0001
a = "b";//重新赋值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的。因此String的操作都是改变赋值地址而不是改变值操作

举例2:
String S1 = “This is” + “ my first ” + “java”;
StringBuffer Sb = new StringBuffer(“This is”)
            .append(“ my first ”)
            .append(“java”);
此时,String 效率是远比 StringBuffer 快,而StringBuffer居然速度上一点都不占优势。其实这时在 JVM 眼里,这个
 String S1 = “This is” + “ my first ” + “java”; 
 其实就是:
 String S1 = “This is my first java”; 因此当然不需要太多的时间了。
但大家这里要注意的是,如果这些拼接的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;

StringBuffer的主要操作:
append(str)--将字符串添加到原有字符串的末端
  例:StringBuffer str = new StringBuffer("hello");  
    str.append("java"); //str为“hello java”
insert(index,str)--在指定的点添加字符串
  例: str.insert(2,"java"); //为“hejavallo”

总结:
  对于经常改变内容的字符串最好不要用 String ,因为每次生成新的对象都会对系统性能产生影响,特别当内存中无外部引用的对象多了以后, JVM 的 GC 就会开始工作,会很大程度上影响系统的运行速度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值