黑马程序员技术交流社区

标题: 常量池==栈内存 [打印本页]

作者: 游兴钟    时间: 2012-4-14 14:18
标题: 常量池==栈内存
在论坛中看到以下(蓝字部分)的描述我迷糊了,“abc”不是该在常量池吗?怎么又进栈内存了?


String是一个特殊的包装类数据。可以用:

String str = new String("abc");
String str = "abc";

两种的形式来创建,第一种是用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。而第二种是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”。


作者: 马强    时间: 2012-4-14 16:04
常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符串常量
如String s = "java"这种申明方式;执行器产生的常量也会放入常量池,故认为常量池是JVM的一块特殊的内存空间。
所以是加载到了 就一定要有的东西

而栈内存存放函数的参数值,局部变量的值,用到才会加载
作者: 游兴钟    时间: 2012-4-14 23:09
本帖最后由 achilles 于 2012-4-14 23:12 编辑

嗯 str进栈 abc进常量池   new String("abc")只是在创建对象前先判断一下常量池中是否有“abc”,完成创建后就和“abc”没有任何利害关系了  是吗?
作者: 胡生蒙    时间: 2012-4-14 23:58
int a = 1;1会存放在栈里
String s1 = "thanks";thanks会存放在data segment里
String s2 = new String("thanks");thanks会存放在data segment里
String a ="th";String b = "anks";String c =a+b;c会存放在data segment里
字符串全部存放在data segment里
常量池全部在栈里。
如果你不new的话,比如你写String s = "thanks";这时s分配在栈里,s直接指向字符池里的"thanks";但如果你这样写,String s; s = new String("thanks");这时s指向堆里的一块内存,这个内存里的地址指向字符池里的"thanks";

作者: 魏明明    时间: 2012-4-15 01:11
这个楼上,常量池不是在占内存中吧,貌似在方法区中 与静态代码块 放在一组里面吧
作者: 游兴钟    时间: 2012-4-15 13:36
胡生蒙 发表于 2012-4-14 23:58
int a = 1;1会存放在栈里
String s1 = "thanks";thanks会存放在data segment里
String s2 = new String(" ...

常量池全部在栈里? 那你的意思是说常量池只是从栈内存中开辟出的空间?隶属于栈内存?




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