String、StringBuffer、StringBuilder的比较
看String类的定义:public final class String...{private final char value[];}
看AbstractStringBuilder类的定义:abstract class AbstractStringBuilder...{char[] value;}
PS:StringBuffer类和StringBuilder类都继承自AbstractStringBuilder类
我们不难发现:在String类中有一个char类型的数组变量value,用final修饰说明大小不可变,用来存放String类型数据,实际字符串底层就是用字符数组来存储的;而在AbstractStringBuilder类中也有一个char类型的数组变量value,但是没有任何修饰,表示大小可变。
直接上代码:
1 package com.bjwyj.method; 2 /** 3 * 测试String、StringBuffer、StringBuilder的区别和联系 4 * @author 吴永吉 5 * 6 */ 7 public class TestString { 8 public static void main(String[] args) { 9 testString(); 10 testStringBuffer(); 11 testStringBuilder(); 12 } 13 14 /** 15 * 测试String对象的追加 16 */ 17 public static void testString() { 18 String str = ""; 19 long startTime = System.currentTimeMillis(); 20 for(int i=0;i<10000;i++) { 21 str += i; 22 } 23 long endTime = System.currentTimeMillis(); 24 System.out.println(endTime-startTime); 25 } 26 27 /** 28 * 测试StringBuffer对象的追加 29 */ 30 public static void testStringBuffer() { 31 StringBuffer sbuf = new StringBuffer(); 32 long startTime = System.currentTimeMillis(); 33 for(int i=0;i<10000;i++) { 34 sbuf.append(i); 35 } 36 long endTime = System.currentTimeMillis(); 37 System.out.println(endTime-startTime); 38 } 39 40 /** 41 * 测试StringBuilder对象的追加 42 */ 43 public static void testStringBuilder() { 44 StringBuilder sbud = new StringBuilder(); 45 long startTime = System.currentTimeMillis(); 46 for(int i=0;i<10000;i++) { 47 sbud.append(i); 48 } 49 long endTime = System.currentTimeMillis(); 50 System.out.println(endTime-startTime); 51 } 52 }
测试结果:
422 15 0
从测试结果可以看出:同样是循环10000次的追加操作,结果却大不相同。String类每次追加字符串都会创建新的对象,消耗的时间最长,性能极差。而StringBuffer和StringBuilder每次追加字符串都是同一个对象,消耗的时间极短,性能良好。而StringBuffer比StringBuilder消耗的时间稍长一点点,原因是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以StringBuffer相比StringBuilder性能稍差一点点。
总结:
(1)String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序列是不可改变的,直至这个对象销毁。
(2)StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、reverse、setCharAt、setLength等方法改变其内容。一旦生成了最终的字符串,调用toString方法将其转变为String。
(3)JDK1.5新增了一个StringBuilder类,与StringBuffer相似,构造方法和方法基本相同。不同是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder。