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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

  1. public class Test2 {

  2. public static void main(String[] args) {

  3. String a = "A";
  4. StringBuffer b = new StringBuffer("B");
  5. StringBuffer c = new StringBuffer("C");
  6. change(a,b,c);

  7. System.out.println(a+","+b+","+c);
  8. }
  9. public static void change(String s,StringBuffer s1,StringBuffer s2){

  10. s= s+"1";
  11. s1.append("1");
  12. s2 = new StringBuffer("C1");

  13. }

  14. }
复制代码
为何出的不是A1 B1  C?
a在调用S=S+”1“在内存中到底是怎么加载的?

5 个回复

倒序浏览
S=S+"1";因为String是不可以变的类,所以在内存中是这样的,在字符串池中新建了一个“A1”对象,S指向“A1”,但原来的“A”对象还存在;又因为a变量是方法内部的局部变量,所以通过参数传递给其它方法,对其进行的操作并不会反映到原变量a上,a还是指向字符串“A”。
回复 使用道具 举报
字符串一被初始化,其值就不能再改变,a存在栈内存中,指向了"A"。运算完s=s+"1",确实能得到String s="A1",但是他没有将值返回给调用者,这里你需要将函数修改一下,将s返回给调用者即可
回复 使用道具 举报
这个程序出的 结果是  A B1 C 。
首先明确
String是不可变对象,一旦被创建就不能修改它的值。想改变它的值可以重新创建一个新对象,然后把值保存进去。
StringBuffer是一个可变对象,对它修改时不用重新建立对象。StringBuffer建立后就会在内存中给其分配一个空间初始保存空(null)
在主函数调用   chang的时候进行 S= S+“1”;是新开辟一片内存,只改变S指向,你在这句下面打印一下即可验证。
而执行s1.append("1");时在内存是将1与原字符串放在一起。
所以不会出现 A1 B1 C

至于 s2 = new StringBuffer("C1"); 这是另外的一个局部的对象。自然不会出现C1.        希望对你有帮助over.

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
为了使程序清晰,画一个内存图就一目了然了。

详细过程.png (37.89 KB, 下载次数: 16)

详细过程.png

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 赞一个!

查看全部评分

回复 使用道具 举报
额  我说的简单点   
1 String a = "A";  这个过程是在  字符串池中 找有"A"吗  没有  创建一个吧
2  a  在传参后  即为 s  和 a   都指向了字符串池中的“A”
3  s=s+"1";  这个过程是  因为s是引用型变量   所以要在堆中开辟空间   把 “A1”放进去  此时s指向了堆中的“A1”  a还是指向字符串池中的"A"

所以结果会是这样   StringBuffer  的部分你应该明白  要不你也不这么问了  OK
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马