标签:string stringbuffer stringbuilder
上一篇文章新手学JAVA(二)----String类与StringBuffer类的区别中了解到,String的值是不可变的,这就导致
每次对String的操作都会生成新的String对象,不仅效率低下,而且大量浪费有限的内存空间,StringBuffer是可变
类,和线程安全的字符串操作类,任何对它指向的字符串的操作都不会产生新的对象。
StringBuffer类和StringBuilder类功能基本相似。算是两个双胞胎。
下面主要说两点
StringBuffer 线程安全
StringBuilder 线程不安全
关于线程安全的知识,正在学习,刚接触,没有太深入的了解,在这知识稍微的提一下。
线程安全——如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次
运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
StringBuffer类和StringBuilder类两者没有很大的区别,但是在线程安全方面,StringBuffer允许多线程进行字
符操作。这是因为在源代码中StringBuffer的很多方法都被关键字synchronized(这个关键字是为线程同步机制设定
的。) 修饰了,而StringBuilder没有。
简单的说一说synchronized的含义:
每一个类对象都对应一把锁,当某个线程A调用类对象O中的synchronized方法M时,必须获得对象O的锁才能够执行
M方法,否则线程A阻塞。一旦线程A开始执行M方法,将独占对象O的锁。使得其它需要调用O对象的M方法的线程阻
塞。只有线程A执行完毕,释放锁后。那些阻塞线程才有机会重新调用M方法。这就是解决线程同步问题的锁机制。
因此,多线程编程中StringBuffer比StringBuilder要安全的多。
有一点需要注意的是,有的人会问,String类是不是也不安全? 事实上不存在这个问题,String是不可变的。线
程对于堆中指定的一个String对象只能读取,无法修改。还有什么不安全的?
一般情况下,速度从快到慢:StringBuilder>StringBuffer>String,这种比较是相对的,不是绝对的。
举个简单的例子:
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(); } }
下面是循环50000次,10000次,1000次,100次的运行结果:
(1).如果要操作少量的数据用 = String
(2).单线程操作字符串缓冲区 下操作大量数据 = StringBuilder
(3).多线程操作字符串缓冲区 下操作大量数据 = StringBuffer
标签:string stringbuffer stringbuilder
原文地址:http://blog.csdn.net/zlts000/article/details/44751993