String,StringBuffer,StringBuilder之间的区别

来源:互联网 发布:qq五笔输入法 linux 编辑:程序博客网 时间:2024/05/16 08:00

String 字符常量 是一种不可以变的字符串类

StringBuffer 相当于有一中Buffer的概念 是可以变的 且是 线程安全的

StringBuilder 用于创建字符串操作的类 没有线程同步的概念 


从功能上来说,这三个类基本上没有什么区别,String和StringBuffer的主要区别在与String是不可变的,我们通常改变String的

值其实是新建一个字符串,然后传入引用,如:

String s = "abc";

我们想要把s变成def,然后我们写语句:s = "def";其实这个操作在内部具体的运作如下:

在缓冲池里新建一个字符串 "def",然后将s的引用指向"def"这个字符串。

所以,经常需要转换的字符串尽量不要用String,不仅影响性能而且这样的程序还是不安全的。

当你强引用引用消失以后,GC就会开始回收你的垃圾,系统肯定会受影响的。


java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的长度和内容。不能赋值,主要append 和 insert 这些方法来操作字符串,可重载这些方法,也可以接受任意类型的数据。
同时,StringBuffer还是线程安全的,可安全地用于多个线程。可以在必要时对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与所涉及的每个线程进行的方法调用顺序一致。
运行速度上,在部分情况下是 StringBuffer > String 的,但也有特殊情况,如:
 String S1 = “This is only a” + “ simple” + “ test”; StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”); String S1 = “This is only a” + “ simple” + “ test”; StringBuffer Sb = new StringBuilder(“This is only a”).append(“ simple”).append(“ test”);
StringBuilfer类 
在运行速度上 StringBuilder >StringBuffer

当我们在字符串缓冲去被多个线程使用是,JVM不能保证StringBuilder的操作是安全的,虽然他的速度最快,但是可以保证StringBuffer是可以正确操作的。当然大多数情况下就是我们是在单线程下进行的操作,所以大多数情况下是建议用StringBuilder而不用StringBuffer的,就是速度的原因。

对于三者使用的总结: 1.如果要操作少量的数据用 = String

              2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder

              3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer

以上言论,仅仅是一个初学者学习之余的看法而已,如有不正之处,还望指正。


 

0 0
原创粉丝点击