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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 游兴钟 中级黑马   /  2012-4-14 14:18  /  2518 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在论坛中看到以下(蓝字部分)的描述我迷糊了,“abc”不是该在常量池吗?怎么又进栈内存了?


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

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

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

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1 他说错了,引用在栈,abc在常量池.

查看全部评分

5 个回复

正序浏览
胡生蒙 发表于 2012-4-14 23:58
int a = 1;1会存放在栈里
String s1 = "thanks";thanks会存放在data segment里
String s2 = new String(" ...

常量池全部在栈里? 那你的意思是说常量池只是从栈内存中开辟出的空间?隶属于栈内存?
回复 使用道具 举报
这个楼上,常量池不是在占内存中吧,貌似在方法区中 与静态代码块 放在一组里面吧
回复 使用道具 举报
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";

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

回复 使用道具 举报
本帖最后由 achilles 于 2012-4-14 23:12 编辑

嗯 str进栈 abc进常量池   new String("abc")只是在创建对象前先判断一下常量池中是否有“abc”,完成创建后就和“abc”没有任何利害关系了  是吗?

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

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

而栈内存存放函数的参数值,局部变量的值,用到才会加载

评分

参与人数 1技术分 +1 收起 理由
贠(yun)靖 + 1

查看全部评分

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