黑马程序员技术交流社区
标题:
StringBuffer与StringBuilder有什么区别
[打印本页]
作者:
吴在兴
时间:
2013-1-25 20:23
标题:
StringBuffer与StringBuilder有什么区别
StringBuffer与StringBuilder有什么区别? 请具体举个例子把 {:soso_e100:}
作者:
唐晓
时间:
2013-1-25 20:29
StringBuffer字符串缓冲区多线程同步
特有方法:
StringBuffer append(int x);
StringBuffer delete(int start, int end );
StringBuffer insert(int index,String str);
StringBuffer reverse();
StringBuilder多线程不同步,但是效率快JDK1.5后出现
作者:
张敬培
时间:
2013-1-26 00:34
StringBuffer是线程安全的。StringBuffer的方法都是同步的
StringBuilder是线程不安全的。StringBuilder的方法是不同步的。
作者:
黑马张旭
时间:
2013-1-26 01:22
在大部分情况下 StringBuilder > StringBuffer
java.lang.StringBuilde
java.lang.StringBuilder一个可变的字符序列是5.0新增的。此类提供一个与 StringBuffer 兼容的 API,但不保证同步。该类被设计用作 StringBuffer 的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比 StringBuffer 要快。两者的方法基本相同。
作者:
廖成
时间:
2013-1-26 11:31
本帖最后由 廖成 于 2013-1-26 11:32 编辑
StringBuffer 线程安全
StringBuilder 线程不安全
为了达到线程安全的目的在一定程度上会降低程序的性能。所以在单线程中,StringBuilder的性能要比StringBuffer高。多线程为了线程安全需要采用StingBuffer。其实在线程不考虑的情况下,要是程序对性能的要求不高,太在意这两者的区别就没有什么意义。
一般情况下,速度从快到慢:StringBuilder>StringBuffer>String.当需要在循环中多次使用字符串拼接时,建议使用StringBuilder或StringBuffer.当数量级在百万级(这里可能不准确)时,StringBuilder的速度会体现出来.
实验代码:
final static int ttime = 30000;// 测试循环次数
public void test(String s) {
long begin = System.currentTimeMillis();
for (int i = 0; i < ttime; i++) {
s += "add";
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + s.getClass().getName() + " 类型使用的时间为: " + (over - begin) + " 毫秒 ");
}
public void test(StringBuffer s) {
long begin = System.currentTimeMillis();
for (int i = 0; i < ttime; i++) {
s.append("add");
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + s.getClass().getName() + " 类型使用的时间为: " + (over - begin) + " 毫秒 ");
}
public void test(StringBuilder s) {
long begin = System.currentTimeMillis();
for (int i = 0; i < ttime; i++) {
s.append("add");
}
long over = System.currentTimeMillis();
System.out.println(" 操作 " + s.getClass().getName() + " 类型使用的时间为: " + (over - begin) + " 毫秒 ");
}
// 对 String 直接进行字符串拼接的测试
public void test2() {
String s2 = "abadf";
long begin = System.currentTimeMillis();
for (int i = 0; i < ttime; i++) {
String s = s2 + s2 + s2;
}
long over = System.currentTimeMillis();
System.out.println(" 操作字符串对象引用相加类型使用的时间为: " + (over - begin) + " 毫秒 ");
}
public void test3() {
long begin = System.currentTimeMillis();
for (int i = 0; i < ttime; i++) {
String s = "abadf" + "abadf" + "abadf";
}
long over = System.currentTimeMillis();
System.out.println(" 操作字符串相加使用的时间为: " + (over - begin) + " 毫秒 ");
}
public static void main(String[] args) {
String s1 = "abc";
StringBuffer sb1 = new StringBuffer("abc");
StringBuilder sb2 = new StringBuilder("abc");
Test t = new Test();
t.test(s1);
t.test(sb1);
t.test(sb2);
t.test2();
t.test3();
}
复制代码
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2