面试时,问这两个有什么区别,倒...

解决方案 »

  1.   

    string和stringbuffer区别 
    这是好友面试的一道题,其实我知道使用的区别,StringBuffer必须new出来,StringBuffer的append的效率比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)//为什么是falseString s1 = new String("a");
    String s2 = new String("a");
    s1.equals(s2)//为什么是true
    StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
    而Object类中的equals方法是用来比较地址的,所以等于false.String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以会是
    true。
    对于这样能不能面试出真正的水平,感到怀疑。
      

  2.   

    面试标准答案:JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。
      

  3.   

    String是不可变的
    StringBuffer是可以变的
      

  4.   


    ==========================================
    如果要对字符串进行操作的话最好用StringBuffer.这样减少内存开销.
      

  5.   

    恩.我现在也几乎不用StringBuffer了.全部用StringBuilder.据说这个比StringBuffer的效率还高.
      

  6.   

    对阿,JDK5.0以后,StringBuilder已经逐渐取代StringBuffer了
      

  7.   

     string的长度是不可变的,stringBuffer的长度是可变的。如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer 的toString()方法。
      

  8.   

    JAVA技术技术交流群( 30700814 ),本群宗旨:至诚交流。不诚者勿入,谢谢合作
      

  9.   

    1楼的解释很透彻,说白了就是一个内存地址的问题。
    String类是final的,不可更改,看似更改了内容其实是重新new了一个对象指向了那个内存地址。
      

  10.   

    确实,因为StringBuilder不需要同步,所以效率上来说要比StringBuffer要高。