我们都知道:
(1)如果要操作少量的数据用 String;
(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;
(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder。
String是不可变类型,导致它的效率要比StringBuffer、StringBuilder低,为什么操作少量数据的时候不直接用StringBuffer或者StringBuilder呢,我查了一些资料,整理如下,如有错误,还望指正:
(1)操作少量数据的时候,String不可变是优势,不会被更改
(2)初始化上的区别,String可以空赋值,后者不行,比如,StringBuffer stringBuffer = null;这种形式是直接把 null给对象不会,但是new StringBuffer(null)会报空指针。因为构造里面会取传入的参数的长度: public StringBuffer(String var1) { super(var1.length() + 16); this.append(var1); }
(3) 而在某些特别情况下, String 对象的字符串拼接其实是被 JVM 解释成了 StringBuffer 对象的拼接,所以这些时候 String 对象的速度并不会比 StringBuffer 对象慢,而特别是以下的字符串对象生成中, String 效率是远要比 StringBuffer 快的:
String S1 = "This is only a" + " simple" + " test";
StringBuffer Sb = new StringBuffer("This is only a").append(" simple").append(" test");
你会很惊讶的发现,生成 String S1 对象的速度简直太快了,而这个时候 StringBuffer 居然速度上根本一点都不占优势。其实这是 JVM 的一个把戏,在 JVM 眼里,这个
String S1 = “This is only a” + “ simple” + “test”; 其实就是:
String S1 = “This is only a simple test”;
所以当然不需要太多的时间了。但大家这里要注意的是,如果你的字符串是来自另外的 String 对象的话,速度就没那么快了,譬如:
String S2 = “This is only a”;
String S3 = “ simple”;
String S4 = “ test”;
String S1 = S2 +S3 + S4;
这时候 JVM 会规规矩矩的按照原来的方式去做




近期评论