StringBuffer清空 效率比较(欢迎大家一起交流)

StringBuffer 的清空有三种方法
  a. 重新创建一个新的StringBuffer对象让其重新指向
  b. 使用StringBuffer类提供的delete(int start, int end)方法:delete(0, sb.length())
  c. 使用StringBuffer类提供的setLength(int length)方法:setLength(0)

我在网上看到有人通过连续执行操作所需时间比较判断,但是由于StringBuffer是线程安全的,所以该方法必定不能得到客观的答案。
那么我们只有通过java底层的源代码来分析:
我们知道StringBuffer底层实际上是维护一个char数组
b方法底层使用System.arraycopy(Object src, int srcPos, Object dest, int destPos, int length)来对StringBuffer底层实际上是维护一个char数组重塑
c方法底层直接对StringBuffer底层维护的char数组做char[i]='\0'的操作

那么这两种方法究竟哪一种效率高呢,那么我们就可以写一个程序测试了,直接测试arraycopy方法和char[i]='\0'的操作
代码如下:
    static char[] tc;
    static char[] tm = new char[100000];
    static StringBuffer sb = new StringBuffer("");
    static int LENGTH;
    static int CAPACITY = 10;
    
    public static void main(String[] args) {
        // 首先初始化数组
        StringBufferTest.setValue();
        // 开始测试
        long t1 = System.currentTimeMillis();
        for(int i = 0; i < 500000; i ++) {
            StringBufferTest.copy();
        }
        System.out.println("delete方法:" + (System.currentTimeMillis() - t1));
        t1 = System.currentTimeMillis();
        for(int i = 0; i < 500000; i ++) {
            StringBufferTest.reset();
        }
        System.out.println("setLength方法:" + (System.currentTimeMillis() - t1));
        t1 = System.currentTimeMillis();
        for(int i = 0; i < 500000; i ++) {
            sb = new StringBuffer();
        }
        System.out.println("新创建:" + (System.currentTimeMillis() - t1));
    }
    
    public static void copy() {
        System.arraycopy(tc, 0, tc, 0, 0);
    }
    
    public static void reset() {
        if(0 > CAPACITY) {
            LENGTH = CAPACITY;
        }
        char[] copy = new char[CAPACITY];
        System.arraycopy(tc, 0, copy, 0, Math.min(tc.length, CAPACITY));
    }
    
    public static void  setValue() {
        tc = new char[10000];
        for(char i = 0; i < tc.length; i ++) {
            tc[i] = i;
        }
    }
输出结果可以自己测试,测试时间最短的是b,其次是c,最后是a,还有对c方式的模拟还不够客观,所以c和a的比较不太准确,可以对照源代码自己试试,欢迎交流

你可能感兴趣的:(java源码交流)