String、StringBuilder、StringBuffer的区别

String、StringBuilder、StringBuffer的区别

String、StringBuilder、StringBuffer都可以用来操作字符串,但三者适用的范围、操作的速度均有所区别。

执行速度:
    StringBuilder > StringBuffer > String
    
    1、String对象拼接时,如String a = "a", b = "b", c = "c"; 拼接时a = a + b;重新新建对象a,然后将a的值加上b,并把值赋给a。因为涉及到新的对象创建和旧对象的回收,所以操作速度较慢;
    2、StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多;
    3、StringBuilder是线程不安全的,适合在单线程中操作,速度快,而StringBuffer是线程安全的(多个方法中有同步锁synchronized),适合多线程的并发,因此
    
String是字符串常量,当对String字符串进行操作时,会有新的对象的创建和旧对象的回收,
    即:String str = "123";
        Systom.out.println(str);
        
        str = str + "456";
        Systom.out.println(str);
        在以上操作中,两次的输出分别是“123”、“123456”,这其中并不是直接更改了str的值,
    
    具体的处理是:
        1、创建一个对象str,并赋值"123";
        2、在str = str + "456"中,JVM会在创建一个新的对象str,然后原来的str值"123"和"456"相加,得到”123456“;
        3、新值"123456",会赋给新的str,旧有的str对象则会被收回。
            
        在以上操作中,旧的str对象创建后就不可以再度更改了,看似是更改的str,其实是新的对象呗创建了
        
    注:
    1) String str1 = "123"; String str2 = "456";  String str = str1 + str2;这里的str中就会有对象的创建和回收了
    
    2) String str = "123" + "456";和String str = "123456";这两个操作一样,仅有一个对象的创建操作,不涉及对象的回收操作,速度和StringBuilder的append()的操作一样;
    
    所以,涉及到String对象的新建、回收时,必须有一个以上的String对象和字符串进行操作,并且String的操作是线程不安全的。

StringBuffer和StringBuilder是对象的操作,值的修改等操作是直接在变量上进行修改,所以这两者的操作速度相较String快些。

而StringBuffer中,方法append()、write()等方法中均有synchronized修饰,可以保证线程间的资源安全;而StringBuilder则并没有这种,因此StringBuilder速度比较StringBuffer快,

所以,StringBuilder最快,适合在单线程中大量字符串操作; StringBuffer次之,适合在多线程中大量字符串操作,线程安全; String最慢,适合少量字符串的操作。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值