黑马程序员技术交流社区
标题:
关于StringBuffer的问题
[打印本页]
作者:
che201311
时间:
2013-11-21 17:40
标题:
关于StringBuffer的问题
代码如下:
public class stringBuilderDemo {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuilder sb1 = new StringBuilder("AAA");
StringBuilder sb2 = new StringBuilder("AAA");
String s1 = "111";
String s2 = "111";
System.out.println("---------------------------------");
System.out.println(sb1 + " " + sb2 + " " + s1 + " " + s2);
System.out.println("---------------------------------");
replace(sb1, sb2, s1, s2);
System.out.println("---------------------------------");
System.out.println(sb1 + " " + sb2 + " " + s1 + " " + s2);
}
public static void replace(StringBuilder sb1, StringBuilder sb2, String s1,
String s2) {
sb1 = new StringBuilder("BBB");
sb2.append("CCC");
s1 = new String("222");
s2.concat("333");
System.out.println(sb1 + " " + sb2 + " " + s1 + " " + s2);
}
}
我的问题是:
s2在replace方法中有这么一个操作s2.concat("333");,因此,在常量池中多了个"111333"的数据,但是这个数据没人接收,s2还是指向常量池中的数据“111”;这个我能理解
但sb2,在replace方法中有追加的操作sb2.append("CCC");追加后在常量池中应该也多了个“AAACCC”的数据,但是为什么sb2就指向了"AAACCC",而不是像s2一样,新生成的“AAACCC”无人接收呢?
作者:
何丛
时间:
2013-11-21 17:49
StringBuilder是字符串缓冲区,对于字符串的操作都是直接操作缓冲区,而不是另外开辟空间来完成修改,这一点和String 是不一样的
StringBuffer append(String str); 返回的依然是原来的缓冲区
StringBuffer sb = new StringBuffer("hello");
StringBuffer sb2 = sb.append("hi");
System.out.println(sb==sb2);
得到的结果是true
作者:
中关村阿旺
时间:
2013-11-21 18:01
这个问题你这样理解吧:看视频的时候对于字符串缓冲区毕老师讲过一个“面盆理论”,这个缓冲区就相当于这个 面盆,你往面盆里面加点水,再加点面,面盆还是那个面盆,新加入的面和水当然会存放在面盆里,不会无人接收的。
至于字符串为什么会“无人接收”,你知道字符串是一个常量,存放在常量池中。既然是常量,就不能更改。你把两个字符串相连接,要指定一个引用指向它,就不会“无人接收”了。
作者:
汪洋大海
时间:
2013-11-21 18:09
你可能还没明白。StringBuilder是一个容器,其初始容量为 16 个字符。和String是不同的。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2