您的位置:首页 > Web前端

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

2013-07-22 08:03 357 查看
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的比较不太准确,可以对照源代码自己试试,欢迎交流
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: