java学习笔记7_StringBuffer, StringBuffer和String的区别

 一. 了解Java API 中StringBuffer类里面的方法和及其使用,请参考http://www.cnblogs.com/springcsc/archive/2009/12/03/1616330.html

二. 深入了解java StringBuffer 类 (来自:http://tieba.baidu.com/f?kz=907003375)

String与StringBuffer的区别

在java中有3个类来负责字符的操作。 

1.Character 是进行单个字符操作的, 

2.String 对一串字符进行操作。不可变类。 

3.StringBuffer 也是对一串字符进行操作,但是可变类。 

String: 

是对象不是原始类型. 

为不可变对象,一旦被创建,就不能修改它的值. 

对于已经存在的String对象的修改都是重新创建一个新的对象,然后把新的值保存进去. 

String 是final类,即不能被继承. 

StringBuffer: 

是一个可变对象,当对他进行修改的时候不会像String那样重新建立对象 

它只能通过构造函数来建立, 

StringBuffer sb = new StringBuffer(); // note:不能通过赋值符号对他进行赋值. 

sb = "welcome to here!";//error 

对象被建立以后,在内存中就会分配内存空间,并初始保存一个null.向StringBuffer 中赋值的时候可以通过它的append方法. 

sb.append("hello"); 

字符串连接操作中StringBuffer的效率要比String高: 

String str = new String("welcome to "); 

str += "here"; 

的处理步骤实际上是通过建立一个StringBuffer,然后调用append(),最后再将StringBuffer toSting(); 

这样的话String的连接操作就比StringBuffer多出了一些附加操作,当然效率上要打折扣. 
并且由于String 对象是不可变对象,每次操作Sting 都会重新建立新的对象来保存新的值. 
这样原来的对象就没用了,就要被垃圾回收.这也是要影响性能的
看看以下代码: 
将26个英文字母重复加了5000次, 
         String tempstr = "abcdefghijklmnopqrstuvwxyz"; 
         int times = 5000; 
         long lstart1 = System.currentTimeMillis(); 
         String str = ""; 
         for (int i = 0; i < times; i++) { 
             str += tempstr; 
         } 
         long lend1 = System.currentTimeMillis(); 
         long time = (lend1 - lstart1); 
         System.out.println(time); 
可惜我的计算机不是超级计算机,得到的结果每次不一定一样一般为 46687左右。 
也就是46秒。 
我们再看看以下代码 
         String tempstr = "abcdefghijklmnopqrstuvwxyz"; 
         int times = 5000; 
         long lstart2 = System.currentTimeMillis(); 
         StringBuffer sb = new StringBuffer(); 
         for (int i = 0; i < times; i++) { 
             sb.append(tempstr); 
         } 
         long lend2 = System.currentTimeMillis(); 
         long time2 = (lend2 - lstart2); 
         System.out.println(time2); 
得到的结果为 16 有时还是 0 

StringBuffer可变String不可变的真正原因 

String和StringBuffer都是finall类,他们生成的对象在堆中都是不可变的,在他们内部都是靠属性char数组实现的, 

那为什么StringBuffer可以在对象中追加字符串呢?呵呵,因为String中的char数组是finall的,也就是常量,是不可改变的,而StringBuffer继承自抽象类AbstractStringBuilder,他的内部实现靠他的父类完成,AbstractStringBuilder内的char数组是变量,可以用append追加

StringBuffer和StringBuilder都实现了AbstractStringBuilder抽象类,此抽象类实现Appendable接口因此可追加 

(在JDK 6.0 API中StringBuilder和Stringbuff写着都继承自Object 而且在他的API中找不到AbstractStringBuilder类) 

StringBuffer 支持多线程,也就是说StringBuffer是线程安全的

在连接字符串时直接用:Append("string")就行,它的容量比较大,可以包含整篇文章。 

String不支持线程,所以它不安全,虽然在连接字符串时可用"+",但需要注意的是每"+"一次的同时就会在内存(堆)中增加一个空间地址。相对而言,你加的多了,就会使JVM出现内存溢出等错误。 

你可能感兴趣的:(java学习笔记7_StringBuffer, StringBuffer和String的区别)