日期:2014-05-20  浏览次数:20718 次

关于String和StringBuffer的问题(好难呀,高手救我)
现在我有个问题
String   s1= "hello   world ";//(1)创建了几个对象?
String   s2= "hello   world ";//(2)在这点上又创建了几个对象?
String   s3=new   String( "hello   world ");//(3)创建了几个对象?
String   s4=new   String( "hello   world ");//(4)在这点上又创建了几个对象?
StringBuffer   s5   =new   StringBuffer( "hello   world ");(5)创建了几个对象?
StringBuffer   s6   =new   StringBuffer( "hello   world ");(6)在这点上又创建了几个对象?
String   s7= "hello   world! ";//测试用的
大写字母都是我找的资料   ;小写字母是我自己理解的
A     equals   和   ==   都是比较对象的地址;但是如果类中重载了equals(当然也不能忘了hashcode),就比较对象的值  

B   JAVA对String字面量的创建做一些优化,为了避免相同的字符串字面量被重复创建,它使用了String   Pool,在String   Pool中,存储了已经创建的字符串,所以,一个字符串字面量始终只创建一次.  
C     String       s1       =       new       String( "abc ");          
    //创建二个对象,       一个是 "abc ",       一个是包裹 "abc "的String对象      
       
    String       s2       =       new       String( "abc ");          
    //创建一个对象,       因为 "abc "已经被创建了,       不再重新创建      

a:s1   与   s2   用   ==   和   equals   符号   得的结果都是   true   (String已经替我们重载了),也就是说   s1和s2在栈中创建了2个引用对象,但是在堆中只要是相同的内容就只创建一个 "hello   world ",也的确如此(a)
   
疑问:s1   =   s1   +   '! ';   在拿s1与s7用==和equals比较的的结果就是   false和true了
我理解是这样的   (+)   s1   =   s1   +   '! '   和   s1   =   (new   StringBuffer(s1)).append( "! ").toString();是等效的。在new   StringBuffer(s1)重新构造一个字符串缓冲区,所以导致了   符号(==)得的结果是false

c:   s5   与   s6   用   ==   和   equals   符号   得的结果都是   false   很明显堆中地址肯定不一样,equals也没有重载
    String   s1= "a ";
    StringBuffer   sb1=new   StringBuffer( "a ");
    StringBuffer   sb2=sb1;
    String   s2=s1;
    s1=s1+ '! ';
    sb1.append( "b ");    
    System.out.println(s1==s2);       flase
    System.out.println(sb1==sb2);   true
得到的结论是:而StringBuffer是可变长的字符串,不论怎么更动还是同一个字符串。

不好意思小弟刚学java还有很多不懂的地方,有理解不对的地方请原谅。哪位高手帮我看看   我总结的对不对   还有就是(1)--(6)分别创建了几个对象   ?   我对大写   C   的资料非常不理解。为什么说,s2那地方只创建了一个对象?


------解决方案--------------------
String s1= "hello world ";//(1)创建了几个对象?
// One String is created in the pool and One String Reference Variable is created.

String s2= "hello world ";//(2)在这点上又创建了几个对象?
// One String Reference Variable is created.
//No additional String is created in the pool.

String s3=new String( "hello world ");//(3)创建了几个对象?
// One String Reference Variable is created.
// One String Object is created on the heap. No String created in the pool.

String s4=new String( "hello world ");//(4)在这点上又创建了几个对象?
// One String Reference Variable is created.
// One String Object is created on the heap. No String created in the pool.

StringBuffer s5 =new StringBuffer( "hello world ");(5)创建了几个对象?