黑马程序员技术交流社区
标题:
求解:a在调用S=S+”1“在内存中到底是怎么加载的
[打印本页]
作者:
邹学良
时间:
2013-3-8 19:21
标题:
求解:a在调用S=S+”1“在内存中到底是怎么加载的
public class Test2 {
public static void main(String[] args) {
String a = "A";
StringBuffer b = new StringBuffer("B");
StringBuffer c = new StringBuffer("C");
change(a,b,c);
System.out.println(a+","+b+","+c);
}
public static void change(String s,StringBuffer s1,StringBuffer s2){
s= s+"1";
s1.append("1");
s2 = new StringBuffer("C1");
}
}
复制代码
为何出的不是A1 B1 C?
a在调用S=S+”1“在内存中到底是怎么加载的?
作者:
克零岚
时间:
2013-3-8 19:45
S=S+"1";因为String是不可以变的类,所以在内存中是这样的,在字符串池中新建了一个“A1”对象,S指向“A1”,但原来的“A”对象还存在;又因为a变量是方法内部的局部变量,所以通过参数传递给其它方法,对其进行的操作并不会反映到原变量a上,a还是指向字符串“A”。
作者:
熊冠银
时间:
2013-3-8 19:53
字符串一被初始化,其值就不能再改变,a存在栈内存中,指向了"A"。运算完s=s+"1",确实能得到String s="A1",但是他没有将值返回给调用者,这里你需要将函数修改一下,将s返回给调用者即可
作者:
TK13761
时间:
2013-3-8 20:02
这个程序出的 结果是 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.
作者:
杨剑
时间:
2013-3-8 21:09
为了使程序清晰,画一个内存图就一目了然了。
详细过程.png
(37.89 KB, 下载次数: 16)
下载附件
2013-3-8 21:09 上传
作者:
amen0205
时间:
2013-3-9 04:31
额 我说的简单点
1 String a = "A"; 这个过程是在 字符串池中 找有"A"吗 没有 创建一个吧
2 a 在传参后 即为 s 和 a 都指向了字符串池中的“A”
3 s=s+"1"; 这个过程是 因为s是引用型变量 所以要在堆中开辟空间 把 “A1”放进去 此时s指向了堆中的“A1” a还是指向字符串池中的"A"
所以结果会是这样 StringBuffer 的部分你应该明白 要不你也不这么问了 OK
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2