String、StringBuffer、StringBuilder的区别

来源:互联网 发布:linux du命令排序 编辑:程序博客网 时间:2024/06/17 08:14

可变性

String:查看源码得知,String类的声明是:public final最终类,因此String类是不可变类,有如下代码:`String str = “a”; str += “b”;`其执行顺序为:首先定义一个String对象并进行初始化,指向一个地址,该地址的值为a,然后进行str+=”b”操作后等于将str的地址改变了,重新指向了另一个地址,该地址的值为”ab”,而原来的”a”并没有改变,仍然在那里,只是没有对象引用他了而已
StringBuffer、StringBuilder:他们都继承了AbstractStringBuffer,都是可变类,各自内部都提供了相关操作的方法

操作效率

String是不可变类,每次进行数据的相关操作将会是产生一个新的String的对象,而StringBuffer和StringBuilder只是一个字符数组的再扩容,所以String类的操作要远远慢于StringBuffer和StringBuilder

StringBuilder和StringBuffer的区别

两者都是可变类,可以直接通过其内部方法对自身引用的数据进行操作修改,不同点在于StringBuffer的方法前面都有synchronized关键字,从而可以知道StringBuffer是线程安全的,而StringBuilder是线程不安全的,而也正因为线程同步,也会导致StringBuffer的操作要慢于StringBuilder

各自适用场景

使用String类的场景:在字符串不经常变化的场景中可以使用String类,例如常量的声明,少量的变量运算等
使用StringBuffer类的场景:在频繁的进行字符串的运算并且运行在多线程的环境中需要保证线程安全的情况下考虑使用StringBuffer类,例如XML解析、HTTP参数解析和封装等
使用StringBuilder类的场景:在频繁的进行字符串的运算并且运行在单线程的环境中的情况下考虑使用StringBuilder类,如SQL语句的拼装、JSON封装等
原创粉丝点击