/**
* StringBuffer 和 StringBiulder的区别
*
* 说明:String类是不可变类,任何对String的改变都会引发新的String对象的生成;
* 而StringBuffer则是可变类,任何对它所指代的字符串的改变都不会产生新的对象。
* 既然StringBuffer的性能要优于String,那我们为什么要引入StringBuilder呢??
*
* 那是因为:StringBuffer支持线程同步保证线程安全而导致性能下降。
* StringBuilder类不是线程安全的,但其在单线程中的性能比StringBuffer高。(可以用下面的例子验证)
*
* 类似的问题还有HashTable和HashMap:
* HashTable是线程安全的,很多方法都是synchronized方法,
* 而HashMap不是线程安全的,但其在单线程程序中的性能比HashTable要高。
*
* ①StringBuffer是线程安全的可变字符序列;而StringBiulder是不安全的;
* ②由于StringBiulder是线程不安全的,故其效率更快,速度更快
*
* ③StringBuffer常用的方法有两个:append方法始终将字符添加到缓冲区的末端;而 insert 方法则在指定的点添加字符
* ④StringBuilder也有常用的两个方法,和StringBuffer的两个方法用法一样;见下面
*
*/
//例子一
StringBuffer sb = new StringBuffer();
sb.append("a");
sb.append("b");
sb.append("c");
System.out.println(sb);
//例子二,我们给sb赋值的另一种方法
StringBuffer sb1 = new StringBuffer("begin");
sb1.append("-ok-");
sb1.append("-fu-");
System.out.println(sb1);
//例子三:insert()方法的使用
StringBuffer sb2 = new StringBuffer("begin");
sb2.insert(3,"-ok-");
System.out.println(sb2);
//例子四:测试一下二者的速度;你会发现StringBuilder明显要比StringBuffer的速度要快
long startTime = System.currentTimeMillis();
StringBuilder sbr = new StringBuilder();
for (int i = 0; i < 50000; i++) {
sbr.append("abc");
}
long endTime = System.currentTimeMillis();
System.out.println("StringBuilder耗时:"+(endTime-startTime));
long startTime1 = System.currentTimeMillis();
StringBuffer sbe = new StringBuffer();
for (int i = 0; i < 50000; i++) {
sbe.append("abc");
}
long endTime1 = System.currentTimeMillis();
System.out.println("StringBuffer耗时:"+(endTime1-startTime1));
/**
* :补充知识
*
多线程并发时,多个线程同时请求同一个资源,必然导致此资源的数据不安全,A线程修改了B线
程的处理的数据,而B线程又修改了A线程处理的数理。显然这是由于全局资源造成的,有时为了解
决此问题,优先考虑使用局部变量,退而求其次使用同步代码块,出于这样的安全考虑就必须牺牲
系统处理性能,加在多线程并发时资源挣夺最激烈的地方,这就实现了线程的同步机制
同步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为同步机制存在,A线程请求
不到,怎么办,A线程只能等待下去
异步:A线程要请求某个资源,但是此资源正在被B线程使用中,因为没有同步机制存在,A线程
仍然请求的到,A线程无需等待
简单一点解释:
1、同步就是说多个任务之间是有先后关系的,一个任务需要等待另一个任务执行完毕才能继续执行。
2、异步就是说多个任务之间没有先后关系,不需要相互等待各做各的事。
*/
本文转自韩立伟 51CTO博客,原文链接:http://blog.51cto.com/hanchaohan/920851,如需转载请自行联系原作者