关于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)创建了几个对象?