黑马程序员技术交流社区

标题: string,new string ,new stringbuffer各存放在内存哪? [打印本页]

作者: 窦超    时间: 2011-12-22 18:15
标题: string,new string ,new stringbuffer各存放在内存哪?
本帖最后由 窦超 于 2011-12-22 18:38 编辑

string name="zhangsan" ,string  name=new string("zhangsan")"   ,stringBuffer sb=new stringBuffer();
三个各自内存存储问题?
作者: 周胜    时间: 2011-12-22 18:25

作者: 于汝国    时间: 2011-12-22 18:35

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中的字符串常量引用(地址)。后面两个指向的是堆内存中的对象的引用(地址),他们对象的创建过程就是构造方法的执行过程。同一般方法执行过程中的内存调用一样。
作者: 窦超    时间: 2011-12-22 18:37
于汝国 发表于 2011-12-22 18:35
String name=“zhangsan”,这里只创建了一个对象,存放在内存中的堆里面。具体说来,首先"zhangsan“是一 ...

谢谢解答




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2