黑马程序员技术交流社区

标题: new String("abc") 的内存分布是什么样的呢? [打印本页]

作者: 王洪波    时间: 2013-5-9 11:49
标题: new String("abc") 的内存分布是什么样的呢?
本帖最后由 王洪波 于 2013-5-9 21:06 编辑

程序在执行new String("abc")时,是怎样分配内存空间的,最好附图说明下?

作者: 刘学明       时间: 2013-5-9 12:01
先占搂  出现两个对象   都在堆内存中
作者: 王永贺    时间: 2013-5-9 12:29
每当执行一次new String("abc");时堆空间中会分配一块内存空间  里面存的是“abc”

Z1FL61JNB]4ESXN~`1%T~7B.jpg (7.85 KB, 下载次数: 1)

Z1FL61JNB]4ESXN~`1%T~7B.jpg

作者: fjl_fight    时间: 2013-5-9 12:36


作者: 王洪波    时间: 2013-5-9 14:55
fjl_fight 发表于 2013-5-9 12:36

若是这样的话,str == str1会是true, 对吗?它们都指向了常量池中的“abc"
作者: 金辉    时间: 2013-5-9 17:12
String str1 = new String("abc");
String str2 = "abc";
String str3 = "abc";
两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。所以str1==str2的值为false,str3==str2的值为true,因为当str3引用的“abc”已近在栈内存中。忘说了, 栈有一个很重要的特殊性,就是存在栈中的数据可以共享。
作者: 王洪波    时间: 2013-5-9 17:59
金辉 发表于 2013-5-9 17:12
String str1 = new String("abc");
String str2 = "abc";
String str3 = "abc";

常量值"abc"存放到了栈中吗?
作者: 金辉    时间: 2013-5-9 18:17
王洪波 发表于 2013-5-9 17:59
常量值"abc"存放到了栈中吗?

对,栈中只有一个“abc”,str2与str3引用同一个“abc”
作者: 黑马-雷钊    时间: 2013-5-9 19:05
你好,new String("abc")这句代码在内存中的执行其实不难。你不要把它想的太难了。
因为字符串在内存中会有专门的常量池来记住存储。所以,毫无疑问。先把“abc”作为字符串存起来。这个应该理解吧?
但是因为new String("abc")这是个匿名对象。而匿名对象是要在对内存中开辟空间的。所以它会在对内存中开辟空间。然后再次把“abc”存储起来。一共存两次、
一次作为字符串进常量池,一次作为对象进堆内存。希望你能理解




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