字符串如何清零 java_StringBuffer中delete与setLength清空字符串效率比较

问题:

StringBuffer中有delete、setLength两个方法可以快速清空字符数组。哪个效率高呢?

结论:从清空字符串角度看,两者效率都很高,比较来看,setLength效率更高。

分析如下:

这两个函数都是继承自AbstractStringBuilder类。函数原型如下:

public AbstractStringBuilder delete(int start, intend) ;public void setLength(int newLength) ;

delete(int start, int end)删除了start、end之间的字符,并返回新的字符串。

setLength(int newLength)重新设置了字符长度,如果newLength比原长度大,则新增的空间赋值为‘ ’。

两者用途不同,却都可以用于清空字符串。delete(0,AbstractStringBuilder.length) 与setLength(0)可以达到相同的效果。

比较其源代码之后,发现setLength(0)在清空代码时只是对长度做了 一次赋值,setLength除了对长度赋值外,还做了一次代码copy操作。多执行的代码如下:

System.arraycopy(value, start+len, value, start, count-end);

因为count = end;所以这个copy应该也不会执行。但是delete函数多做了一些判断,效率上回比setLength低一点。不过delete多出的条件判断对性能的影响是微乎其微的,通过代码测试没有明显的差异,两者在清空字符串时效率都非常高。

另外,这个两个函数虽然可以将字符串清空,但并没有将资源回收,也就是说并没有达到回收资源的效果,因为AbstractStringBuilder 的字符数组仍在内存中,只不过我们人为将数组的有效长度置位了0,数组所占的资源并没有及时释放,只能等java的垃圾回收进行释放。

Jdk1.8源代码如下(jdk1.6与之类似,以上结论不变)

public AbstractStringBuilder delete(int start, intend) {if (start < 0)throw newStringIndexOutOfBoundsException(start);if (end >count)

end=count;if (start >end)throw newStringIndexOutOfBoundsException();int len = end -start;if (len > 0) {

System.arraycopy(value, start+len, value, start, count-end);

count-=len;

}return this;

}public void setLength(intnewLength) {if (newLength < 0)throw newStringIndexOutOfBoundsException(newLength);

ensureCapacityInternal(newLength);if (count

Arrays.fill(value, count, newLength,' ');

}

count=newLength;

}

测试代码:

packagemyString;public classTestMain {public static voidmain(String[] args) {

testStringBufferclear();

}private static voidtestStringBufferclear() {

StringBuffer sbf= new StringBuffer("wwwwww");

StringBuffer sbi= new StringBuffer("wwwwww");int count = 1000000;longstart ;longend;

StringBuffer sbftest= newStringBuffer();for(int i = 0; i < 1000; i++)

{

sbftest.append("1234567890");

}

String str=sbftest.toString();

start=System.currentTimeMillis();for (int i = 0; i < count; i++) {

sbi.append(str);

sbi.setLength(0);

}

end=System.currentTimeMillis();

System.out.println("StringBuffer--setLength:" + (end -start));

start=System.currentTimeMillis();for (int i = 0; i < count; i++) {

sbf.append(str);

sbf.delete(0, sbf.length());

}

end=System.currentTimeMillis();

System.out.println("StringBuffer--delete:" + (end -start));

start=System.currentTimeMillis();for (int i = 0; i < count; i++) {

sbf.append(str);

sbf= new StringBuffer("123431431");

}

end=System.currentTimeMillis();

System.out.println("StringBuffer--new StringBuffer:" + (end -start));

}

}

测试结果:

StringBuffer--setLength:674StringBuffer--delete:689StringBuffer--new StringBuffer:4108

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java字符串是非常常用的数据类型,在Java提供了很多字符串相关的操作,比如字符串拼接、字符串分割、字符串替换、字符串比较等等。下面我们来逐一介绍这些操作。 1. 字符串拼接 字符串拼接是将两个或多个字符串连接在一起形成一个新的字符串Java有两种方式实现字符串拼接: - 使用“+”运算符 ``` String str1 = "Hello"; String str2 = "World"; String str3 = str1 + " " + str2; ``` - 使用StringBuffer和StringBuilder类 ``` StringBuffer sbf = new StringBuffer(); sbf.append("Hello"); sbf.append(" "); sbf.append("World"); String str = sbf.toString(); ``` 2. 字符串分割 字符串分割是将一个字符串按照指定的分隔符进行分割,Java提供了split()方法实现字符串分割,例如: ``` String str = "Hello,World,Java"; String[] arr = str.split(","); ``` 3. 字符串替换 字符串替换是将一个字符串的某些字符替换成其他字符,Java提供了replace()方法实现字符串替换,例如: ``` String str = "Hello World Java"; String newStr = str.replace(" ", ","); ``` 4. 字符串比较 字符串比较是判断两个字符串是否相等,Java提供了equals()方法实现字符串比较,例如: ``` String str1 = "Hello"; String str2 = "World"; boolean isEqual = str1.equals(str2); ``` 还有一个重要的方法是compareTo(),用于比较两个字符串的大小关系,例如: ``` String str1 = "Hello"; String str2 = "World"; int result = str1.compareTo(str2); // 如果result小于0,则str1小于str2 // 如果result等于0,则str1等于str2 // 如果result大于0,则str1大于str2 ``` 以上就是Java字符串相关操作的简单介绍。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值