A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© che201311 中级黑马   /  2013-11-21 17:40  /  1200 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

代码如下:
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”无人接收呢?

3 个回复

倒序浏览
StringBuilder是字符串缓冲区,对于字符串的操作都是直接操作缓冲区,而不是另外开辟空间来完成修改,这一点和String 是不一样的
StringBuffer append(String str); 返回的依然是原来的缓冲区
StringBuffer sb = new StringBuffer("hello");
StringBuffer sb2 = sb.append("hi");
System.out.println(sb==sb2);
得到的结果是true
回复 使用道具 举报
这个问题你这样理解吧:看视频的时候对于字符串缓冲区毕老师讲过一个“面盆理论”,这个缓冲区就相当于这个 面盆,你往面盆里面加点水,再加点面,面盆还是那个面盆,新加入的面和水当然会存放在面盆里,不会无人接收的。
至于字符串为什么会“无人接收”,你知道字符串是一个常量,存放在常量池中。既然是常量,就不能更改。你把两个字符串相连接,要指定一个引用指向它,就不会“无人接收”了。
回复 使用道具 举报
你可能还没明白。StringBuilder是一个容器,其初始容量为 16 个字符。和String是不同的。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马