解决方案 »

  1.   

    String与StringBuffer的区别在于,String中方法对字符串若有更改,返回新的字符串,没有的话,返回本身。而StringBuffer则是修改自身,对于sb2.append("CCC"),原来的AAA就直接在它的空间后面加了CCC,也就是原来的AAA没了,变成了AAACCC
      

  2.   

    原来的AAA不能没了吧?刚开始sb1,sb2指向的都是常量池里的同一个“AAA”。
      

  3.   

    如果AAA没了,那sb1输出的结果怎么还能是AAA呢?
      

  4.   

    另外我想知道StringBuilder sb2 = new StringBuilder("AAA");这个语句创建了多少个对象?我认为我上面的问题跟怎么看这个问题有关 
      

  5.   

    Hi,
    我个人觉得楼主的问题有些混淆概念。问题1:
    StringBuilder.append() 返回值为Object的引用,并且引用的内容发生了变化。
    String.concat(String arg) 返回一个String的引用,这个string的内容是object连接函数传入的参数。
    很明显两个函数的定义不同,所以对于object的影响也不同。对于函数的行为理解,我想参照API文档(http://docs.oracle.com/javase/6/docs/api/)定义就明白了,与String常量池的概念无关。前者是函数定义的行为,后者是实现函数定义的方式,这是两个不同的概念。使用函数请查看定义,想了解效率和实现,那就学习一下机制。问题2:
    每个版本的JAVA对于String都有些机制的不同,并且我自己也不是特别确定。我想应该有一个Stringbuilder的一个对象。在String池中有一个"AAA"的实例存储。这个回答还请其他人纠正。最后补充一点,我不明白你是怎么理解对象有还是没有的。这些内容和垃圾回收有关。总之如果是函数行为的问题,参考定义就是法则。
      

  6.   

    对,我说的不好,不是没了,因为sb1还是指向AAA的,sb2指向的是AAACCC,但是这里面的AAA是同一个东西