/**

* 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、异步就是说多个任务之间没有先后关系,不需要相互等待各做各的事。

*/