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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 窦超 于 2011-12-22 18:38 编辑

string name="zhangsan" ,string  name=new string("zhangsan")"   ,stringBuffer sb=new stringBuffer();
三个各自内存存储问题?

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

3 个回复

倒序浏览
周胜 黑马帝 2011-12-22 18:25:01
沙发

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报

String name=“zhangsan”,这里只创建了一个对象,存放在内存中的堆里面。具体说来,首先"zhangsan“是一个字符串常量,放在内存的数据段(data segment)中 然后把它的内容传给引用类型中的变量name,而这里的name在栈内存中。

String name=new String("zhangsan"),这里创建了两个对象。一个是“zhangsan”这个字符串,另一个是通过new新建的String对象。具体说来,首先在栈内存中有一个变量name它是指向堆内存中的一个String对象的一个引用,而堆内存中的String对象是使用new方法创建的,其创建过程是调用String的一个构造方法,这里的构造方法需要的参数是一个字符串常量(即“zhangsan”),所以在栈内存中再开辟一块空间来放置这个方法的参数字符串引用,它的引用指向data segment中的字符串常量,然后在构造方法内部使用这个引用,从而在对内存中构造一个新的字符串,构造方法结束,栈内存中的构造方法用到的参数和局部变量消失。

StringBuffer构造对象的方法和String基本相同,只是StringBuffer的内容可以变,可String的内容不可变。

总体来说String name=“zhangsan”指向的是data segment中的字符串常量引用(地址)。后面两个指向的是堆内存中的对象的引用(地址),他们对象的创建过程就是构造方法的执行过程。同一般方法执行过程中的内存调用一样。

评分

参与人数 1技术分 +1 收起 理由
王德云 + 1

查看全部评分

回复 使用道具 举报
窦超 黑马帝 2011-12-22 18:37:57
板凳
于汝国 发表于 2011-12-22 18:35
String name=“zhangsan”,这里只创建了一个对象,存放在内存中的堆里面。具体说来,首先"zhangsan“是一 ...

谢谢解答
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马