一、String
String类不是一个原始类型,可以通过它的定义分析。
String类的定义:
private final char value[];
通过String类的定义我们可以看出一旦创建了这个对象,那它的值是不能改变的,对于已存在的String对象的修改实质上是创建一个新的对象,然后把新对象的值存进去。
二、StringBuffer
StringBuffer是一个可变对象,对它的值进行修改不会像String那样重新构造对象。
它只能用构造函数来创建 StringBuffer a = new StringBuffer();
再通过append给它赋值,a.append("Hello");
三、各自的应用场景
字符串连接操作中StringBuffer的效率要比String高: String str = new String("welcome to "); str += "here"; 的处理步骤实际上是通过建立一个StringBuffer,然后调用append(),最后 再将StringBuffer toSting(); 这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣.
我们通过一个列子可以看出这个区别;
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"); } }
运行结果:
使用String做10000次向一字符串后添加字符串
操作耗时:1872ms,内存消耗:1301KB
使用StringBuffer做10000次向一字符串后添加字符串
操作耗时:15ms,内存消耗:162KB