String与StringBuffer的区别?

来源:互联网 发布:云计算概念股龙头老大 编辑:程序博客网 时间:2024/04/27 22:56

StringBuffer必须new出来,StringBuffer的append的效率比string的+=的效率高,

  1、String   类提供了许多字符串处理的功能,不过,一旦创建了String对象,则它的内容就永远不会改变,  
  2、StringBuffer类创建和动态操作字符串.每个StringBuffer对象都能够存储由其容量指定的字符,如果超出了对象的容量,则容量就会自动地扩大,以容纳多出来的字符.  
   
  3、String类对象是常量字符串,而StringBuffer对象是可修改的字符串.  
   
  4、如果程序频繁地执行字符串连接操作,或其他的字符串修改操作,则使用StringBuffer类来实现这些修改操作,可以提高效率.  
====================================================================
  如果该字符串不会变更,则总是使用String对象,将提高性能.
其实发现还有很大的区别,看了看以前scjp的考题
public class Test {
   public static void stringReplace (String text) {
   text = text.replace('j' , 'i');
   }
  
   public static void bufferReplace (StringBuffer text) {
   text = text.append("C");
   }
  
    public static void main (String args[]) {
    String textString = new String ("java");
    StringBuffer textBuffer = new StringBuffer ("java");
   
    stringReplace (textString);
    bufferReplace (textBuffer);
   
    System.out.println (textString + textBuffer);
    }
    }
答案是 javajavaC
这是String参数传递,是不可变的(immutable).

而题目中第七行text = text.append (“C”),append方法会改变text中的值
而这个text与main中的textBuffer是指向同一个对象,所以对应的输出是javac。
string的值永远不会改变!


String a = "a";//假设a指向地址0x0001,
a = "b";//重新负值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的。
从表面上看String类型的对象改变了值,但事实是他不能改变值,只能改变指向的地址


StringBuffer则不同,直接改变指向的地址中保留的值
还有
StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
s1.equals(s2)//为什么是false

String s1 = new String("a");
String s2 = new String("a");
s1.equals(s2)//为什么是true
StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
而Object类中的equals方法是用来比较地址的,所以等于false.

String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以会是
true。
====================================================================

结合这个看看吧!  
  public   class   Foo   {  
        public   static   void   main(String[]   args)     {  
              StringBuffer   a   =   new   StringBuffer("A");              
              StringBuffer   b   =   new   StringBuffer("B");  
              operate(a,b);  
              System.out.println(a   +   ","   +b);  
  }  
    static   void   operate(StringBuffer   x,   StringBuffer   y)     {  
              x.append(y);  
              y   =   x;  
    }  
    }  
  A.“AB,B” B.“A,B”       C.“AB,A” D.“AB,AB”//选A..
====================================================================

  String   str="You   are   nice.";  
  str+="I   love   you   so   much.";  
   
  如果用StringBuffer类的话,代码如下:  
   
  StringBuffer   str=   new   StringBuffer("You   are   nice.");  
  str.append("I   love   you   so   much.");  
   
                  从表面看来String类只用一个加号(+)便完成了字符串的拼接,而StringBuffer类却要调用一个append()方法,是否实现起来更简洁,更单纯呢?其实不然,让我们了解一下程序运行内部发生了哪些事情:  
   
                  经编译后程序的bytecode(字节码)展示出了实质:     在用String类对象直接拼接时,JVM会创建一个临时的StringBuffer类对象,并调用其append()方法完成字符串的拼接,这是因为String类是不可变的,拼接操作不得不使用StringBuffer类(并且--JVM会将"You   are   nice."和"I   love   you   so   much."创建为两个新的String对象)。之后,再将这个临时StringBuffer对象转型为一个String,代价不菲!可见,在这一个简单的一次拼接过程中,我们让程序创建了四个对象:两个待拼接的String,一个临时StringBuffer,和最后将StringBuffer转型成为的String--它当然不是最初的str了,这个引用的名称没变,但它指向了新的String对象。   
   

原创粉丝点击