实际开发过程当中,一直使用String,对于StringBuffer,StringBuilder了解甚少,偶尔遇到这个问题,上网找了找,这里作下记录。java
String是final类型,不能被继承,一旦建立了,就不能被修改,而咱们使用的时候,好比String a = 'abc'; a='efg';实际上又建立了一个对象,这个对象的值为'efg',而后将这个值保存到以前a的对象中,正式由于多了这个步骤,在进行频繁赋值操做的时候才致使相对于StringBuffer效率更低。小程序
StringBuffer不是final类型的,因此是可变对象,它的创建是经过new StringBuffer(),对象创建以后,就会在内存中申请一块空间,初始值为null,赋值方式是经过.append("xxx")来实现。安全
StringBuilder跟StringBuffer的方法和操做基本上相同,惟一不一样的是StringBuffer是线程安全的,而StringBuilder是不安全的。app
摘选了网上的一段小程序:测试
public class Test { public static void main(String args[]) { String str = "abc"; StringBuffer sb = new StringBuffer("abc"); Runtime runtime = Runtime.getRuntime(); long start = System.currentTimeMillis(); long startFreememory = runtime.freeMemory(); for (int i = 0; i < 10000; i++) { str += i; //测试StringBuffer时候把注释打开 //sb.append(i); } long endFreememory = runtime.freeMemory(); long end = System.currentTimeMillis(); System.out.println("操做耗时:" + (end - start) + "ms," + "内存消耗:" + (startFreememory - endFreememory)/1024 + "KB"); } }
测试结果:ui
使用String作10000次向一字符串后添加字符串spa
操做耗时:1666ms,内存消耗:1256KB.net
使用StringBuffer作10000次向一字符串后添加字符串线程
操做耗时:13ms,内存消耗:131KBcode
这个差异还真是挺大的。
关于这块内容,推荐下面的文章,讲的更为贴切