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的比较不太准确,可以对照源代码自己试试,欢迎交流
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的比较不太准确,可以对照源代码自己试试,欢迎交流