Java StringBuilder和String的内存分析的问题
代码如下:
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”无人接收呢?
------解决方案--------------------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"的实例存储。这个回答还请其他人纠正。
最后补充一点,我不明白你是怎么理解对象有还是没有的。这些内容和垃圾回收有关。总之如果是函数行为的问题,参考定义就是法则。