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

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”无人接收呢?
Java??StringBuilder? String

------解决方案--------------------
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"的实例存储。这个回答还请其他人纠正。

最后补充一点,我不明白你是怎么理解对象有还是没有的。这些内容和垃圾回收有关。总之如果是函数行为的问题,参考定义就是法则。