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。

posted @ 2019-03-18 23:15  吴永吉  阅读(228)  评论(0编辑  收藏  举报