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的比较不太准确,可以对照源代码自己试试,欢迎交流
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的比较不太准确,可以对照源代码自己试试,欢迎交流
相关文章推荐
- 欢迎进群大家以后一起交流 CSharp、.Net技术交流群 242497960
- StringBuffer内容清空效率比较
- StringBuffer内容清空效率比较
- StringBuffer内容清空效率比较
- StringBuffer内容清空效率比较
- 终于开通了CNBLOG 欢迎大家一起交流GIS C#技术
- StringBuffer内容清空效率比较
- StringBuffer内容清空效率比较
- 本人最近在看sqlite的源代码,欢迎大家一起交流
- StringBuffer内容清空效率比较
- StringBuffer内容清空效率比较
- StringBuffer内容清空效率比较
- StringBuffer内容清空效率比较
- 欢迎访问我的博客~大家一起交流~!~
- 欢迎进群大家以后一起交流 CSharp、.Net技术交流群 242497960
- 大家都很忙 java版解答.. 欢迎各种拍砖,求交流
- 嵌入式linux、QT、ARM、android研发学习交流,软考嵌入式系统设计师交流群,欢迎大家加入,群号95388240
- ios、Android界面适配,欢迎大家一起补充,探讨
- 大家好啊,我的博客开通了,欢迎大家来交流。
- AndroidMM,欢迎大家来拍砖和交流