编程爱好者联盟 2017-02-23
String,字符串常量
StringBuffer,字符串变量(线程安全)
StringBuilder,字符串变量(非线程安全)
String和StringBuffe的主要区别在于String是不可变对象,每次对String进行改变的时候其实 等于生成了一个新的String对象,因此经常改变内容的字符串不要使用String类型,因为每次形成新的对象都会对系统的性能产生影响,特别当内存中的无引用的对象多了之后,JVM的GC就会开始工作,那速度一定会相当慢的.
StringBuffer每次的操作都是针对自身来进行操作,而不是形成新的对象,再改变对象的引用,所以在一般情况下推荐使用StringBuffer,特别是字符串对象经常改变的情况下.而在某些特别的情况下,String对象的字符串拼接其实是被解释成了StringBuffer对象的拼接,所以这些时候String对象的速度并不比StringBuffer慢,而特别是以下字符串对象的形成过程中,String的效率是要比StringBuffer快的:
String s1 = 'This is only a' + 'simple' + 'test';
StringBuffer buffer = new StringBuffer('this is only a').append('simple').append('test');
因为在JVM眼中,String s1 = 'This is only a' + 'simple' + 'test' ,其实就是String s1 = 'This is only a simple test';
但如果是这样的话:String s2 = 'This is only a';
String s3 = 'simple';
String s4 = 'test';
String s1 = s2+s3+s4;
这个时候JVM就会按照原来的方式去做,
在大部分情况下:StringBuffer>String
java.lang.StringBuffer线程安全的可变字符序列,一个类似于String的字符串缓冲区,但不能修改.虽然在任意时间点上它都包含某种特定的字符序列,但通过某种方法调用可以改变该序列的长度和内容.
可将字符串缓冲区安全的用于多个线程.可以在必要的时候对这些方法进行同步,因此任意特定实例上的所有操作就好像是以串行顺序发生的,该顺序与调用该方法的线程的执行顺序一致.
StringBuffer上的主要操作时append和insert操作,可重载这些方法,以接受任意的数据类型,每个方法都能有效的将给定的数据转换为字符串,然后将该字符串追加或者插入到字符缓冲区中去
java.lang.StringBuilder线程非安全的可变字符串序列,是5.0新增的.此类提供一个与StringBuffer兼容的API,但不保证同步 .该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候,如果可能,简易优先采用该类,因为在大多数时候,StringBuilder要比StringBuffer要快,两者的方法基本相同.