Java开发StringBuilder类

 

StringBuffer类和StringBuilder类功能基本类似。算是两个双胞胎。
下面主要说两点java

第一点 线程安全
StringBuffer 线程安全
StringBuilder 线程不安全编程

关于线程安全的知识,正在学习,刚接触,没有太深刻的了解,在这知识稍微的提一下。安全

线程安全——若是你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。若是每次
运行结果和单线程运行的结果是同样的,并且其余的变量的值也和预期的是同样的,就是线程安全的。多线程

StringBuffer类和StringBuilder类二者没有很大的区别,可是在线程安全方面,StringBuffer容许多线程进行字
符操做。这是由于在源代码中StringBuffer的不少方法都被关键字synchronized(这个关键字是为线程同步机制设定
的。) 修饰了,而StringBuilder没有。app

简单的说一说synchronized的含义:
每个类对象都对应一把锁,当某个Java技术线程A调用类对象O中的synchronized方法M时,必须得到对象O的锁才可以执行
M方法,不然线程A阻塞。一旦线程A开始执行M方法,将独占对象O的锁。使得其它须要调用O对象的M方法的线程阻
塞。只有线程A执行完毕,释放锁后。那些阻塞线程才有机会从新调用M方法。这就是解决线程同步问题的锁机制。学习

所以,多线程编程中StringBuffer比StringBuilder要安全的多。测试

有一点须要注意的是,有的人会问,String类是否是也不安全? 事实上不存在这个问题,String是不可变的。线
程对于堆中指定的一个String对象只能读取,没法修改。还有什么不安全的?ui

第二点 效率问题
通常状况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。
举个简单的例子:
[java] view plaincopy在CODE上查看代码片派生到个人代码片
public class TestCharacter{
final static int time=100; //循环次数

public TestCharacter(){

}

public void test(String s){
long begin = System.currentTimeMillis();
for(int i=0;i<time;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<time; i++){
s.append("add");
}
long over = System.currentTimeMillis();
System.out.println("操做"+s.getClass().getCanonicalName()+"类型使用的时间为:"+(over-begin)+"毫秒");

}

public void test(StringBuilder s){
long begin = System.currentTimeMillis();
for(int i=0; i<time; i++){
s.append("add");
}
long over = System.currentTimeMillis();
System.out.println("操做"+s.getClass().getName()+"类型使用的时间为:"+(over-begin)+"毫秒");
}

/*对 String 直接进行字符串拼接的测试*/
public void test2(){
String s2 = "abcd";
long begin = System.currentTimeMillis();
for(int i=0; i<time; 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<time; i++){
String s ="abcd" + "abcd" + "abcd";
}
long over = System.currentTimeMillis();
System.out.println("操做字符串相加使用的时间为:"+(over-begin)+"毫秒");
}

public static void main(String[] args){
String s1 = "abcd";
StringBuffer st1 = new StringBuffer("abcd");
StringBuilder st2 = new StringBuilder("abcd");
TestCharacter tc = new TestCharacter();
tc.test(s1);
tc.test(st1);
tc.test(st2);
tc.test2();
tc.test3();
}

} 线程

相关文章
相关标签/搜索